<?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>109916</bug_id>
          
          <creation_ts>2013-02-15 02:13:04 -0800</creation_ts>
          <short_desc>[Refactoring] Implement RuleCollector</short_desc>
          <delta_ts>2013-03-13 01:47:54 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</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>
          <dependson>111707</dependson>
    
    <dependson>111966</dependson>
          <blocked>89879</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Takashi Sakamoto">tasak</reporter>
          <assigned_to name="Takashi Sakamoto">tasak</assigned_to>
          <cc>allan.jensen</cc>
    
    <cc>buildbot</cc>
    
    <cc>dglazkov</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>koivisto</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>ojan.autocc</cc>
    
    <cc>ossy</cc>
    
    <cc>rakuco</cc>
    
    <cc>rego+ews</cc>
    
    <cc>rniwa</cc>
    
    <cc>webcomponents-bugzilla</cc>
    
    <cc>WebkitBugTracker</cc>
    
    <cc>webkit-ews</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>833815</commentid>
    <comment_count>0</comment_count>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-15 02:13:04 -0800</bug_when>
    <thetext>Move collectingRules and matchRules code from StyleResolver to another class.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833819</commentid>
    <comment_count>1</comment_count>
      <attachid>188518</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-15 02:19:35 -0800</bug_when>
    <thetext>Created attachment 188518
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833822</commentid>
    <comment_count>2</comment_count>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-15 02:22:45 -0800</bug_when>
    <thetext>Still working in progress. Because:

- I have to fix a style error caused by the following:
  //ASSERT((propertyWhitelistType != PropertyWhitelistRegion) || m_state.regionForStyling());

- Also need to remove &quot;StyleResolver*&quot; from ElementRuleCollector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833826</commentid>
    <comment_count>3</comment_count>
      <attachid>188518</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2013-02-15 02:25:32 -0800</bug_when>
    <thetext>Comment on attachment 188518
WIP

Attachment 188518 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/16590038</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833827</commentid>
    <comment_count>4</comment_count>
      <attachid>188518</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2013-02-15 02:26:38 -0800</bug_when>
    <thetext>Comment on attachment 188518
WIP

Attachment 188518 did not pass qt-wk2-ews (qt):
Output: http://queues.webkit.org/results/16580772</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833830</commentid>
    <comment_count>5</comment_count>
      <attachid>188518</attachid>
    <who name="EFL EWS Bot">eflews.bot</who>
    <bug_when>2013-02-15 02:33:33 -0800</bug_when>
    <thetext>Comment on attachment 188518
WIP

Attachment 188518 did not pass efl-ews (efl):
Output: http://queues.webkit.org/results/16598001</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833834</commentid>
    <comment_count>6</comment_count>
      <attachid>188518</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-02-15 02:47:35 -0800</bug_when>
    <thetext>Comment on attachment 188518
WIP

Attachment 188518 did not pass mac-wk2-ews (mac-wk2):
Output: http://queues.webkit.org/results/16584122</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834212</commentid>
    <comment_count>7</comment_count>
      <attachid>188518</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-02-15 11:30:02 -0800</bug_when>
    <thetext>Comment on attachment 188518
WIP

Attachment 188518 did not pass mac-ews (mac):
Output: http://queues.webkit.org/results/16586233</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834291</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-15 12:48:12 -0800</bug_when>
    <thetext>Attachment 188518 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/WebCore.gypi&apos;, u&apos;Source/WebCore/css/ElementRuleCollector.cpp&apos;, u&apos;Source/WebCore/css/ElementRuleCollector.h&apos;, u&apos;Source/WebCore/css/PageRuleCollector.cpp&apos;, u&apos;Source/WebCore/css/PageRuleCollector.h&apos;, u&apos;Source/WebCore/css/StyleResolver.cpp&apos;, u&apos;Source/WebCore/css/StyleResolver.h&apos;]&quot; exit_code: 1
Source/WebCore/css/StyleResolver.cpp:1686:  Should have a space between // and comment  [whitespace/comments] [4]
Total errors found: 1 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>834951</commentid>
    <comment_count>9</comment_count>
      <attachid>188518</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-02-17 00:46:10 -0800</bug_when>
    <thetext>Comment on attachment 188518
WIP

Attachment 188518 did not pass win-ews (win):
Output: http://queues.webkit.org/results/16603535</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>838196</commentid>
    <comment_count>10</comment_count>
      <attachid>189469</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-21 00:52:37 -0800</bug_when>
    <thetext>Created attachment 189469
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>838467</commentid>
    <comment_count>11</comment_count>
      <attachid>189469</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2013-02-21 08:50:46 -0800</bug_when>
    <thetext>Comment on attachment 189469
WIP

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

Neat. RuleCollector looks like a pretty straightforward builder.

&gt; Source/WebCore/css/ElementRuleCollector.h:93
&gt; +    StyleResolver::State&amp; m_state;

Sounds like this should be const, right? We&apos;re never affecting state from collector.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>839284</commentid>
    <comment_count>12</comment_count>
      <attachid>189694</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-21 23:21:18 -0800</bug_when>
    <thetext>Created attachment 189694
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>839298</commentid>
    <comment_count>13</comment_count>
      <attachid>189698</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-21 23:35:59 -0800</bug_when>
    <thetext>Created attachment 189698
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>839300</commentid>
    <comment_count>14</comment_count>
      <attachid>189469</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-02-21 23:38:21 -0800</bug_when>
    <thetext>Comment on attachment 189469
WIP

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

Thank you for reviewing.

&gt;&gt; Source/WebCore/css/ElementRuleCollector.h:93
&gt;&gt; +    StyleResolver::State&amp; m_state;
&gt; 
&gt; Sounds like this should be const, right? We&apos;re never affecting state from collector.

Yes, it&apos;s right. Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>839643</commentid>
    <comment_count>15</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2013-02-22 09:10:06 -0800</bug_when>
    <thetext>The EWSes are all purple..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>839692</commentid>
    <comment_count>16</comment_count>
      <attachid>189698</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-02-22 10:11:30 -0800</bug_when>
    <thetext>Comment on attachment 189698
Patch

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

Are you using svn copy? We don&apos;t want to lose the history. r=me if so.

&gt; Source/WebCore/GNUmakefile.list.am:2658
&gt; +	Source/WebCore/css/ElementRuleCollector.cpp \
&gt; +	Source/WebCore/css/ElementRuleCollector.h \

At some point StyleResolver and the related classes should be moved to a top level directory of their own.

&gt; Source/WebCore/css/ElementRuleCollector.h:42
&gt; +class ElementRuleCollector {

I don&apos;t much like these names (they imply something generic rather than an implementation detail of StyleResolver) though I don&apos;t have great suggestions. StyleResolverElementRuleCollector is rather long. Maybe we should move this stuff to its own namespace?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849853</commentid>
    <comment_count>17</comment_count>
      <attachid>191943</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-07 01:15:09 -0800</bug_when>
    <thetext>Created attachment 191943
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849875</commentid>
    <comment_count>18</comment_count>
      <attachid>191948</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-07 01:40:53 -0800</bug_when>
    <thetext>Created attachment 191948
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849903</commentid>
    <comment_count>19</comment_count>
      <attachid>189698</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-07 02:24:59 -0800</bug_when>
    <thetext>Comment on attachment 189698
Patch

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

Thank you for reviewing.

I recreated the patch by using svn copy and rebased. I also measured html5-full-render&apos;s performance. The result is:

https://docs.google.com/spreadsheet/ccc?key=0AtdkWCxGaEc2dHVJdEtFZl9qVDd3VmoxcjRESjN6MXc&amp;usp=sharing

Since my patch cannot be applied correctly, I would like to try manual check-in.

&gt;&gt; Source/WebCore/GNUmakefile.list.am:2658
&gt;&gt; +	Source/WebCore/css/ElementRuleCollector.h \
&gt; 
&gt; At some point StyleResolver and the related classes should be moved to a top level directory of their own.

I see.

&gt;&gt; Source/WebCore/css/ElementRuleCollector.h:42
&gt;&gt; +class ElementRuleCollector {
&gt; 
&gt; I don&apos;t much like these names (they imply something generic rather than an implementation detail of StyleResolver) though I don&apos;t have great suggestions. StyleResolverElementRuleCollector is rather long. Maybe we should move this stuff to its own namespace?

I see. I would like to do this in another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849907</commentid>
    <comment_count>20</comment_count>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-07 02:29:51 -0800</bug_when>
    <thetext>
&gt; Since my patch cannot be applied correctly, I would like to try manual check-in.
&gt; 

I mean, svn-apply seems not to work correctly when too large diff is given.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849934</commentid>
    <comment_count>21</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2013-03-07 03:35:46 -0800</bug_when>
    <thetext>It broke the Qt build:
http://build.webkit.org/builders/Qt%20Linux%20Release/builds/58233

Could you fix it as soon is possible?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849935</commentid>
    <comment_count>22</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2013-03-07 03:40:47 -0800</bug_when>
    <thetext>and the Apple Mac build: http://build.webkit.org/builders/Apple%20Lion%20Release%20%28Build%29/builds/10845</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849948</commentid>
    <comment_count>23</comment_count>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-07 04:05:29 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; and the Apple Mac build: http://build.webkit.org/builders/Apple%20Lion%20Release%20%28Build%29/builds/10845

Sure. I&apos;ve just reverted my patch. The revision is r145061.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>849985</commentid>
    <comment_count>24</comment_count>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-07 05:14:54 -0800</bug_when>
    <thetext>Since I broke webkit-build, I will fix the issue and try again tomorrow (JST).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>850970</commentid>
    <comment_count>25</comment_count>
      <attachid>192172</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-08 00:57:30 -0800</bug_when>
    <thetext>Created attachment 192172
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>851014</commentid>
    <comment_count>26</comment_count>
      <attachid>192185</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-08 02:21:07 -0800</bug_when>
    <thetext>Created attachment 192185
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>851280</commentid>
    <comment_count>27</comment_count>
      <attachid>192185</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-03-08 10:04:03 -0800</bug_when>
    <thetext>Comment on attachment 192185
Patch

Attachment 192185 did not pass mac-ews (mac):
Output: http://webkit-commit-queue.appspot.com/results/17113083

New failing tests:
editing/selection/selection-modify-crash.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>852034</commentid>
    <comment_count>28</comment_count>
      <attachid>192400</attachid>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-10 21:07:37 -0700</bug_when>
    <thetext>Created attachment 192400
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>852142</commentid>
    <comment_count>29</comment_count>
      <attachid>192400</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-11 02:52:51 -0700</bug_when>
    <thetext>Comment on attachment 192400
Patch

Clearing flags on attachment: 192400

Committed r145349: &lt;http://trac.webkit.org/changeset/145349&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>852143</commentid>
    <comment_count>30</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-11 02:52:57 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>852148</commentid>
    <comment_count>31</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-11 02:59:35 -0700</bug_when>
    <thetext>Re-opened since this is blocked by bug 111966</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>854129</commentid>
    <comment_count>32</comment_count>
    <who name="Takashi Sakamoto">tasak</who>
    <bug_when>2013-03-13 01:47:54 -0700</bug_when>
    <thetext>I manually submitted this patch (by using svn commit) and monitored whether the patch causes any bad things, e.g. build failure and so on.

So I think, the patch doesn&apos;t cause such bad things. I will mark this bug as &quot;resolved and fixed&quot;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188518</attachid>
            <date>2013-02-15 02:19:35 -0800</date>
            <delta_ts>2013-02-21 00:52:32 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>bug-109916-20130215191601.patch</filename>
            <type>text/plain</type>
            <size>82339</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQyOTQ0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNmNkYzRjYTIxNDA4MjY5
NmJiNzgxNWFmNDFjYzE3OTdhMWUxNDRlNi4uNDQ2ODU5ZDRjODAzYjFhMmI2MjE1ZDZkYWY3OTA2
OTEwY2I3ZDdkOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkwIEBACisyMDEzLTAyLTE1ICBUYWth
c2hpIFNha2Ftb3RvICA8dGFzYWtAZ29vZ2xlLmNvbT4KKworICAgICAgICBbUmVmYWN0b3Jpbmdd
IEltcGxlbWVudCBSdWxlQ29sbGVjdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMDk5MTYKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbXBsZW1lbnRlZCBydWxlIGNvbGxlY3RvciBmb3IgYW4gZWxlbWVu
dCBhbmQgY29sbGVjdG9yIGZvciBhIHBhZ2UuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBiZWNh
dXNlIGp1c3QgcmVmYWN0b3JpbmcuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAgICAg
ICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
KToKKyAgICAgICAgKFdlYkNvcmU6OmxlZnRUb1JpZ2h0RGVjbGFyYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6cmlnaHRUb0xlZnREZWNsYXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVs
ZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRjaGVkUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpF
bGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJNYXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29y
ZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmVuc3VyZVJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKToKKyAg
ICAgICAgKE1hdGNoaW5nVUFSdWxlc1Njb3BlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hdGNoaW5n
VUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSk6CisgICAgICAgIChXZWJDb3JlOjpN
YXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKToKKyAgICAgICAgKFdl
YkNvcmU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1
bGVzRm9yUmVnaW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1
bGVDb2xsZWN0b3I6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6
RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoSG9zdFJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6
OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhvclJ1bGVzKToKKyAgICAgICAgKFdlYkNv
cmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFVzZXJSdWxlcyk6CisgICAgICAgIChXZWJD
b3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVQVJ1bGVzKToKKyAgICAgICAgKFdlYkNv
cmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpydWxlTWF0Y2hlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OmNvbXBhcmVSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgICogY3NzL0Vs
ZW1lbnRSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChFbGVtZW50UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNv
bGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OnNldE1vZGUpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVD
b2xsZWN0b3I6OnNldFBzZXVkb1N0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxl
Q29sbGVjdG9yOjpzZXRTYW1lT3JpZ2luT25seSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6c2V0UmVnaW9uRm9yU3R5bGluZyk6CisgICAgICAgIChXZWJDb3JlOjpF
bGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TWVkaXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1l
bnRSdWxlQ29sbGVjdG9yOjpkb2N1bWVudCk6CisgICAgICAgICogY3NzL1BhZ2VSdWxlQ29sbGVj
dG9yLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNv
bXBhcmVQYWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6Omlz
TGVmdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6OmlzRmlyc3RQ
YWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjpwYWdlTmFtZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxQYWdlUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6Om1hdGNoUGFnZVJ1bGVzKToKKyAg
ICAgICAgKFdlYkNvcmU6OmNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyk6CisgICAgICAgIChX
ZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KToKKyAgICAg
ICAgKiBjc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToK
KyAgICAgICAgKFBhZ2VSdWxlQ29sbGVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxl
Q29sbGVjdG9yOjpQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNv
bGxlY3Rvcjo6aXNSaWdodFBhZ2UpOgorICAgICAgICAqIGNzcy9TdHlsZVJlc29sdmVyLmNwcDoK
KyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6U3Rh
dGU6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0
OjphZGRNYXRjaGVkUHJvcGVydGllcyk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVy
OjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZSk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJl
c29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldCk6CisgICAgICAgIChX
ZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6U3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JLZXlmcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpT
dHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVz
b2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0
eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcyk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2
ZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToK
KyAgICAgICAgKFN0eWxlUmVzb2x2ZXIpOgorICAgICAgICAoTWF0Y2hSZXN1bHQpOgorICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6U3RhdGU6OlN0YXRlKToKKyAgICAgICAgKFN0YXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgorICAgICAgICAoV2Vi
Q29yZSk6CisKIDIwMTMtMDItMTQgIERlYW4gSmFja3NvbiAgPGRpbm9AYXBwbGUuY29tPgogCiAg
ICAgICAgIEluc3BlY3RvciBkb2Vzbid0IHNob3cgcnVsZXMgZnJvbSBwbHVnaW5zU3R5bGVTaGVl
dApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCmluZGV4IGUzMzc3ZDMwMjRjNWNiYWZiNzQ2ZmE0Y2Y3MGFiMmZmZTU4
ZDU0ZDMuLjJlYzNmM2M0NjEyODljM2UwNTViNWE0ODA3YjRkYmU5ZmFmZmQ2OTIgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLmd5cGkKQEAgLTE1NDgsNiArMTU0OCw4IEBACiAgICAgICAgICAgICAnY3NzL0Rhc2hib2Fy
ZFJlZ2lvbi5oJywKICAgICAgICAgICAgICdjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAnLAogICAg
ICAgICAgICAgJ2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmgnLAorICAgICAgICAgICAgJ2Nzcy9FbGVt
ZW50UnVsZUNvbGxlY3Rvci5jcHAnLAorICAgICAgICAgICAgJ2Nzcy9FbGVtZW50UnVsZUNvbGxl
Y3Rvci5oJywKICAgICAgICAgICAgICdjc3MvRm9udEZlYXR1cmVWYWx1ZS5jcHAnLAogICAgICAg
ICAgICAgJ2Nzcy9Gb250RmVhdHVyZVZhbHVlLmgnLAogICAgICAgICAgICAgJ2Nzcy9Gb250VmFs
dWUuY3BwJywKQEAgLTE1NzEsNiArMTU3Myw4IEBACiAgICAgICAgICAgICAnY3NzL01lZGlhUXVl
cnlMaXN0TGlzdGVuZXIuaCcsCiAgICAgICAgICAgICAnY3NzL01lZGlhUXVlcnlNYXRjaGVyLmNw
cCcsCiAgICAgICAgICAgICAnY3NzL01lZGlhUXVlcnlNYXRjaGVyLmgnLAorICAgICAgICAgICAg
J2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAnLAorICAgICAgICAgICAgJ2Nzcy9QYWdlUnVsZUNv
bGxlY3Rvci5oJywKICAgICAgICAgICAgICdjc3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0
aW9uLmNwcCcsCiAgICAgICAgICAgICAnY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlv
bi5oJywKICAgICAgICAgICAgICdjc3MvUkdCQ29sb3IuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9j
c3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM0ODM4ZmFhYWRjOTgyMTNl
YzRmN2M0YTZjOThlNmUxNzY5OGI0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAg
ICAgKEMpIDIwMDQtMjAwNSBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gKGtkZUBjYXJld29sZi5jb20p
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgTmljaG9sYXMgU2hhbmtzICh3ZWJraXRAbmlj
a3NoYW5rcy5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIw
MDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFsZXhleSBQcm9za3VyeWFrb3YgPGFwQHdlYmtpdC5v
cmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0
Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJp
Z2h0IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMS4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRWxlbWVudFJ1bGVDb2xs
ZWN0b3IuaCIKKworI2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUg
IkNTU1J1bGUuaCIKKyNpbmNsdWRlICJDU1NSdWxlTGlzdC5oIgorI2luY2x1ZGUgIkNTU1NlbGVj
dG9yLmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3JMaXN0LmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVL
ZXl3b3Jkcy5oIgorI2luY2x1ZGUgIkhUTUxFbGVtZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyUmVn
aW9uLmgiCisjaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgorI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJz
YWxTdHJhdGVnaWVzLmgiCisjaW5jbHVkZSAiU3R5bGVkRWxlbWVudC5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3N0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0
aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0
PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBp
ZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCisgICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+
c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlTHRyKTsKKyAgICByZXR1
cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOworfQorCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCog
cmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQ
dHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6
OmNyZWF0ZSgpKSk7CisgICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQorICAgICAg
ICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NW
YWx1ZVJ0bCk7CisgICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQoKTsKK30KKworU3R5bGVS
ZXNvbHZlcjo6TWF0Y2hSZXN1bHQmIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUmVzdWx0
KCkKK3sKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5
bGUpOworICAgIHJldHVybiBtX3Jlc3VsdDsKK30KKworUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoZWRSdWxlTGlzdCgpCit7CisgICAgQVNTRVJUKG1f
bW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7CisgICAgcmV0dXJuIG1f
cnVsZUxpc3QucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rv
cjo6YWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpCit7CisgICAgaWYgKCFtX21h
dGNoZWRSdWxlcykKKyAgICAgICAgbV9tYXRjaGVkUnVsZXMgPSBhZG9wdFB0cihuZXcgVmVjdG9y
PGNvbnN0IFJ1bGVEYXRhKiwgMzI+KTsKKyAgICBtX21hdGNoZWRSdWxlcy0+YXBwZW5kKHJ1bGUp
OworfQorCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJNYXRjaGVkUnVs
ZXMoKQoreworICAgIGlmICghbV9tYXRjaGVkUnVsZXMpCisgICAgICAgIHJldHVybjsKKyAgICBt
X21hdGNoZWRSdWxlcy0+Y2xlYXIoKTsKK30KKworaW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBF
bGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5zdXJlUnVsZUxpc3QoKQoreworICAgIGlmICghbV9ydWxl
TGlzdCkKKyAgICAgICAgbV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsK
KyAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsKK30KKworaW5saW5lIHZvaWQgRWxlbWVudFJ1
bGVDb2xsZWN0b3I6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0
eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXNDYWNoZWFibGUpCit7CisgICAgaWYgKCFwcm9wZXJ0
eVNldCkKKyAgICAgICAgcmV0dXJuOworICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVs
ZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBpZiAobV9yZXN1bHQu
cmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9PSAtMSkKKyAgICAgICAgbV9yZXN1bHQucmFuZ2VzLmZp
cnN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZTsKKyAgICBtX3Jl
c3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhwcm9wZXJ0eVNldCk7CisgICAgaWYgKCFpc0NhY2hl
YWJsZSkKKyAgICAgICAgbV9yZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKK30KKworY2xhc3Mg
TWF0Y2hpbmdVQVJ1bGVzU2NvcGUgeworcHVibGljOgorICAgIE1hdGNoaW5nVUFSdWxlc1Njb3Bl
KCk7CisgICAgfk1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc01h
dGNoaW5nVUFSdWxlcygpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBib29sIG1fbWF0Y2hpbmdV
QVJ1bGVzOworfTsKKworTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxlc1Njb3Bl
KCkKK3sKKyAgICBBU1NFUlQoIW1fbWF0Y2hpbmdVQVJ1bGVzKTsKKyAgICBtX21hdGNoaW5nVUFS
dWxlcyA9IHRydWU7Cit9CisKK01hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hpbmdVQVJ1bGVz
U2NvcGUoKQoreworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7Cit9CisKK2lubGluZSBi
b29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCit7CisgICAgcmV0
dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOworfQorCitib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjpt
X21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOworCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpj
b2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgU3R5
bGVSZXNvbHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgQVNTRVJUKG1hdGNoUmVx
dWVzdC5ydWxlU2V0KTsKKyAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkpOworCisgICAgU3R5
bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBFbGVtZW50KiBlbGVtZW50
ID0gc3RhdGUuZWxlbWVudCgpOworICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1l
bnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1
ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7CisgICAgaWYgKCFwc2V1ZG9JZC5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOworICAgICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0Vs
ZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cisg
ICAgfQorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIGlmIChlbGVtZW50LT5pc1dlYlZU
VEVsZW1lbnQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
CisjZW5kaWYKKyAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBh
cHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgor
ICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCisgICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dz
IGF1dGhvciBydWxlcworICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0
eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCisgICAgVHJlZVNjb3BlKiB0cmVl
U2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKKyAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Nj
b3BlOjppc01hdGNoaW5nVUFSdWxlcygpCisgICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0
aG9yU3R5bGVzKCkKKyAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1
ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCisgICAgICAgICYmIG1hdGNoUmVx
dWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NC
b3VuZGFyeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRo
ZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1
ZmZlciBhbmQKKyAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KKyAgICBpZiAoZWxlbWVudC0+
aGFzSUQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgp
KSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0
eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVs
ZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCisgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1Bz
ZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChTZWxl
Y3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQorICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNl
dWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50
LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxS
dWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVD
b2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3sK
KyAgICBpZiAoIW1fcmVnaW9uRm9yU3R5bGluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgdW5z
aWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1
bGVTZXRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7
CisgICAgICAgIGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciA9IG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yOwor
ICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxlY3Rvciwgc3RhdGljX2Nh
c3Q8RWxlbWVudCo+KG1fcmVnaW9uRm9yU3R5bGluZy0+bm9kZSgpKSkpIHsKKyAgICAgICAgICAg
IFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2Vs
ZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKKyAgICAgICAgICAgIEFTU0VS
VChyZWdpb25SdWxlcyk7CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJl
cXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hS
ZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBF
bGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKFN0eWxlUmVz
b2x2ZXI6Ok1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgU3R5bGVSZXNvbHZlcjo6U3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGlmICghbV9tYXRjaGVkUnVsZXMgfHwgbV9tYXRjaGVk
UnVsZXMtPmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc29ydE1hdGNoZWRSdWxl
cygpOworCisgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSAq
bV9tYXRjaGVkUnVsZXM7CisgICAgaWYgKG1fbW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxl
Y3RpbmdSdWxlcykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1
bGVzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgZW5zdXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5h
cHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNyZWF0ZUNTU09NV3JhcHBlcigpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdyB0cmFuc2ZlciB0aGUgc2V0IG9mIG1h
dGNoZWQgcnVsZXMgb3ZlciB0byBvdXIgbGlzdCBvZiBkZWNsYXJhdGlvbnMuCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBp
ZiAoc3RhdGUuc3R5bGUoKSAmJiBtYXRjaGVkUnVsZXNbaV0tPmNvbnRhaW5zVW5jb21tb25BdHRy
aWJ1dGVTZWxlY3RvcigpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7
CisgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoZWRSdWxlc1tpXS0+
cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVs
ZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlz
dFR5cGUoKSk7CisgICAgfQorfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFNj
b3BlZEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNU
WUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgaWYgKCFtX3Njb3BlUmVzb2x2
ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIHNjb3BlZCBhdXRob3IgcnVsZXMg
YnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3RhY2sgKHJlYnVpbGQgaXQgaWYgaXQg
Z290IGluY29uc2lzdGVudCkuCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlci0+aGFzU2NvcGVkU3R5
bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFja0NvbnNpc3RlbmN5KG1fc3RhdGUu
ZWxlbWVudCgpKSkgeworICAgICAgICBib29sIGFwcGx5QXV0aG9yU3R5bGVzID0gbV9zdGF0ZS5l
bGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0eWxlcygpOworICAgICAgICBib29s
IGRvY3VtZW50U2NvcGUgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUgPSBtX3Nj
b3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgc2NvcGVTaXplOyArK2kpIHsKKyAgICAgICAgICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7Cisg
ICAgICAgICAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgICAgICAgICBjb25zdCBTdHlsZVNjb3Bl
UmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1l
QXQoaSk7CisgICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJh
bWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgICAgIGlmIChkb2N1bWVudFNj
b3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQorICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1
bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAgICAgICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5n
ZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgICAg
ICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
ICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVS
YW5nZSk7CisgICAgICAgICAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMobV9yZXN1bHQp
OworICAgICAgICB9CisgICAgfQorCisgICAgbWF0Y2hIb3N0UnVsZXMoaW5jbHVkZUVtcHR5UnVs
ZXMpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOworI2VuZGlm
Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoSG9zdFJ1bGVzKGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgQVNTRVJUKG1f
c2NvcGVSZXNvbHZlcik7CisKKyAgICBjbGVhck1hdGNoZWRSdWxlcygpOworICAgIG1fcmVzdWx0
LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDE7CisKKyAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNoZWRSdWxlczsKKyAgICBtX3Njb3Bl
UmVzb2x2ZXItPm1hdGNoSG9zdFJ1bGVzKG1fc3RhdGUuZWxlbWVudCgpLCBtYXRjaGVkUnVsZXMp
OworICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7Cisg
ICAgICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5n
ZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNo
UmVxdWVzdChtYXRjaGVkUnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUu
ZWxlbWVudCgpKSwgcnVsZVJhbmdlKTsKKyAgICB9CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hl
ZFJ1bGVzKG1fcmVzdWx0KTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1
bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhv
clJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMo
KTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KKyAgICBN
YXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVk
ZUVtcHR5UnVsZXMpOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBt
X3Jlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9y
UmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkK
KyAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOworICAgIG1fcnVsZVNldHMu
c2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0
eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNo
UmVxdWVzdHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNo
UmVxdWVzdHNbaV0sIHJ1bGVSYW5nZSk7CisjZW5kaWYKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRj
aGVkUnVsZXMobV9yZXN1bHQpOworCisgICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhpbmNsdWRl
RW1wdHlSdWxlcyk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVXNlclJ1
bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisgICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJT
dHlsZSgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsK
KworICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOworICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxl
U2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFN0eWxlUmVzb2x2ZXI6
OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOwor
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisK
KyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMobV9yZXN1bHQpOworfQorCit2b2lkIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFVBUnVsZXMoKQoreworICAgIE1hdGNoaW5nVUFSdWxl
c1Njb3BlIHNjb3BlOworCisgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNl
ciBhZ2VudCBzaGVldC4KKyAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZh
dWx0U3R5bGVTaGVldCkKKyAgICAgICAgbV9yZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAg
ICBSdWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9pc1ByaW50U3R5bGUKKyAgICAgICAg
PyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7CisgICAgbWF0Y2hVQVJ1bGVzKHVzZXJBZ2VudFN0eWxl
U2hlZXQpOworCisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhl
IHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01v
ZGUoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFF1aXJrc1N0eWxlKTsKKworICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5
bGVzIChpbiB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2Ug
bWF0Y2ggcnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCisgICAgaWYgKGRv
Y3VtZW50KCktPmlzVmlld1NvdXJjZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NTRGVmYXVs
dFN0eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVD
b2xsZWN0b3I6Om1hdGNoVUFSdWxlcyhSdWxlU2V0KiBydWxlcykKK3sKKyAgICBjbGVhck1hdGNo
ZWRSdWxlcygpOworICAgIAorICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gbV9yZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxl
UmFuZ2UgcnVsZVJhbmdlID0gbV9yZXN1bHQucmFuZ2VzLlVBUnVsZVJhbmdlKCk7CisgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJ1bGVzKSwgcnVsZVJhbmdlKTsKKworICAg
IHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhtX3Jlc3VsdCk7Cit9CisKK2lubGluZSBib29s
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURh
dGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywg
U2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQor
eworICAgIFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAo
cnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKKyAgICAgICAgLy8gV2Uga25v
dyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KKyAg
ICAgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9QU0VVRE8pCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBw
YXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUg
cnVsZSBoYXNoLgorICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdl
IGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KKyAgICAgICAgaWYgKHJ1bGVEYXRh
Lmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3Rh
dGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGlmICghcnVsZURh
dGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgfQorICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBD
U1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxl
bWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFTZWxlY3RvckNoZWNrZXI6OmZhc3RDaGVja1JpZ2h0
bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3Io
KSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIFNlbGVjdG9y
Q2hlY2tlcjo6ZmFzdENoZWNrKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7
CisgICAgfQorCisgICAgLy8gU2xvdyBwYXRoLgorICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3Rv
ckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9tb2RlKTsKKyAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVj
dG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxl
bWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOworICAgIGNvbnRl
eHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKKyAgICBjb250ZXh0LnNjb3BlID0gc2Nv
cGU7CisgICAgY29udGV4dC5wc2V1ZG9TdHlsZSA9IG1fcHNldWRvU3R5bGU7CisgICAgY29udGV4
dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7CisgICAgU2VsZWN0b3JD
aGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250ZXh0LCBkeW5h
bWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7CisgICAgaWYgKG1hdGNo
ICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9QU0VVRE8gJiYgbV9wc2V1ZG9TdHlsZSAh
PSBkeW5hbWljUHNldWRvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9y
TGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxlcywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBt
YXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAg
IGlmICghcnVsZXMpCisgICAgICAgIHJldHVybjsKKworICAgIFN0eWxlUmVzb2x2ZXI6OlN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVwIGxv
b2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgcmVj
dXJzaXZlIHRyZWUgcmVzb2x2ZS4KKyAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVyIGZpbHRlciB3
b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBmYXN0
IHBhdGguCisgICAgYm9vbCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRlci5wYXJl
bnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNoUmVxdWVzdC5i
ZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFy
eTsKKworICAgIHVuc2lnbmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVE
YXRhID0gcnVsZXMtPmF0KGkpOworICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3Nl
bGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZp
ZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkK
KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVE
YXRhLnJ1bGUoKTsKKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tp
ZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBy
dWxlLCBtX3N0eWxlUmVzb2x2ZXIpOworICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0g
Tk9QU0VVRE87CisgICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0
LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkg
eworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHks
IHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4KKyAgICAgICAgICAgIGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAg
ICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0
Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgeworICAgICAgICAgICAgICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUU6IEV4
cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMg
dGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgorICAgICAgICAgICAgaWYgKG1fc2FtZU9y
aWdpbk9ubHkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgeworICAg
ICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tp
ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8g
Yml0IGlmCisgICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVs
ZW1lbnQuCisgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBtX3Bz
ZXVkb1N0eWxlID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fbW9kZSA9PSBT
ZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICAgICAgICAgICAgICBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQpCisgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5bmFtaWNQ
c2V1ZG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUg
b3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFycmF5Lgor
ICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisgICAgICAgICAgICAg
ICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAg
ICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisK
KyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQg
cnVsZXMuCisgICAgICAgICAgICAgICAgYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKKyAgICAg
ICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUs
IHRydWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tp
ZSwgZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxlcyhj
b25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikKK3sKKyAgICB1bnNpZ25lZCBz
cGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKKyAgICB1bnNpZ25lZCBzcGVjaWZpY2l0
eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKKyAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVj
aWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5
MSA8IHNwZWNpZmljaXR5MjsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1h
dGNoZWRSdWxlcygpCit7CisgICAgQVNTRVJUKG1fbWF0Y2hlZFJ1bGVzKTsKKyAgICBzdGQ6OnNv
cnQobV9tYXRjaGVkUnVsZXMtPmJlZ2luKCksIG1fbWF0Y2hlZFJ1bGVzLT5lbmQoKSwgY29tcGFy
ZVJ1bGVzKTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyhi
b29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMp
Cit7CisgICAgbWF0Y2hVQVJ1bGVzKCk7CisKKyAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVl
dCBydWxlcy4KKyAgICBpZiAobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRj
aFVzZXJSdWxlcyhmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdp
bm5pbmcgZmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhU
TUwuCisgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7CisgICAgICAgIGFkZEVsZW1l
bnRTdHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0
dHJpYnV0ZVN0eWxlKCkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFsIG1h
cHBlZCBkZWNsYXJhdGlvbnMuCisgICAgICAgIC8vIFRhYmxlcyBhbmQgdGFibGUgY2VsbHMgc2hh
cmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3QgYmUgYXBwbGllZAorICAgICAg
ICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRlcGVu
ZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVzLgorICAgICAgICBhZGRFbGVt
ZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJl
c2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBdXRvOwor
ICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudCht
X3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmli
dXRlKGlzQXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRvKQorICAgICAgICAgICAgICAgIG1f
cmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHRleHREaXJlY3Rpb24gPT0gTFRSID8gbGVmdFRv
UmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cyBu
ZXh0LgorICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAgIG1hdGNoQXV0
aG9yUnVsZXMoZmFsc2UpOworCisgICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0
cmlidXRlLgorICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsK
KyAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlz
IG5vIENTU09NIHdyYXBwZXIuCisgICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250cm9sIHNoYWRv
dyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgorICAgICAgICBib29s
IGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGlu
ZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNJblNo
YWRvd1RyZWUoKTsKKyAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5LgorICAgICAgICBhZGRFbGVt
ZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgp
LCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoU1ZHKQorICAg
IC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHlsZS4KKyAgICBpZiAoaW5j
bHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50
KCkpCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoc3RhdGljX2Nhc3Q8U1ZHRWxl
bWVudCo+KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0
aWVzKCksIGZhbHNlIC8qIGlzQ2FjaGVhYmxlICovKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFN
KGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisjZW5kaWYKK30KKworYm9vbCBFbGVtZW50UnVsZUNv
bGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxlcyhSdWxlU2V0KiBydWxlU2V0KQoreworICAgIGNs
ZWFyTWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBtX21vZGUgPSBTZWxlY3RvckNoZWNrZXI6OlNoYXJp
bmdSdWxlczsKKyAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0x
OworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgs
IGxhc3RSdWxlSW5kZXgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChy
dWxlU2V0KSwgcnVsZVJhbmdlKTsKKworICAgIHJldHVybiBtX21hdGNoZWRSdWxlcyAmJiAhbV9t
YXRjaGVkUnVsZXMtPmlzRW1wdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43YzMxOTI5
NTgwOTE0ZjBiZGZlMTRkZjk0ZDdmNGMyMWFhYjIzMTZkCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgKQEAgLTAsMCArMSwxMTUgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAq
IENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwg
MjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgRWxlbWVudFJ1bGVDb2xsZWN0b3JfaAorCisj
aW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tl
ci5oIgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IENTU1J1bGVMaXN0OworY2xhc3MgRG9jdW1lbnRSdWxlU2V0czsKK2NsYXNzIFJlbmRlclJlZ2lv
bjsKK2NsYXNzIFJ1bGVEYXRhOworY2xhc3MgUnVsZVNldDsKK2NsYXNzIFNlbGVjdG9yRmlsdGVy
OworY2xhc3MgU3R5bGVTY29wZVJlc29sdmVyOworY2xhc3MgU3RhdGljQ1NTUnVsZUxpc3Q7CisK
K2NsYXNzIEVsZW1lbnRSdWxlQ29sbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBFbGVtZW50UnVsZUNv
bGxlY3RvcihTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBTdHlsZVJlc29sdmVyOjpTdGF0
ZSYgc3RhdGUpCisgICAgICAgIDogbV9zdHlsZVJlc29sdmVyKHN0eWxlUmVzb2x2ZXIpCisgICAg
ICAgICwgbV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgLCBtX3J1bGVTZXRzKHN0eWxlUmVzb2x2ZXIt
PnJ1bGVTZXRzKCkpCisgICAgICAgICwgbV9zZWxlY3RvckZpbHRlcihzdHlsZVJlc29sdmVyLT5z
ZWxlY3RvckZpbHRlcigpKQorICAgICAgICAsIG1fc2NvcGVSZXNvbHZlcihzdHlsZVJlc29sdmVy
LT5zY29wZVJlc29sdmVyKCkpCisgICAgICAgICwgbV9pc1ByaW50U3R5bGUoZmFsc2UpCisgICAg
ICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCisgICAgICAgICwgbV9wc2V1ZG9TdHlsZShOT1BT
RVVETykKKyAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQorICAgICAgICAsIG1fbW9k
ZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKSB7IH0KKworICAgIHZvaWQgbWF0Y2hB
bGxSdWxlcyhib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywgYm9vbCBpbmNsdWRlU01JTFBy
b3BlcnRpZXMpOworICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKCk7CisgICAgdm9pZCBtYXRjaFVBUnVs
ZXMoUnVsZVNldCopOworICAgIHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNlclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
OworICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVz
KTsKKyAgICB2b2lkIG1hdGNoSG9zdFJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworCisg
ICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1v
ZGU7IH0KKyAgICB2b2lkIHNldFBzZXVkb1N0eWxlKFBzZXVkb0lkIHBzZXVkb1N0eWxlKSB7IG1f
cHNldWRvU3R5bGUgPSBwc2V1ZG9TdHlsZTsgfQorICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHko
Ym9vbCBmKSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBmOyB9IAorICAgIHZvaWQgc2V0UmVnaW9uRm9y
U3R5bGluZyhSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpIHsgbV9yZWdpb25Gb3JTdHls
aW5nID0gcmVnaW9uRm9yU3R5bGluZzsgfQorICAgIHZvaWQgc2V0TWVkaXVtKGNvbnN0IE1lZGlh
UXVlcnlFdmFsdWF0b3IqIG1lZGl1bSkgeyBtX2lzUHJpbnRTdHlsZSA9IG1lZGl1bS0+bWVkaWFU
eXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKTsgfQorCisgICAgYm9vbCBoYXNBbnlNYXRjaGluZ1J1
bGVzKFJ1bGVTZXQqKTsKKworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVk
UmVzdWx0KCk7CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gbWF0Y2hlZFJ1bGVMaXN0KCk7
CisKK3ByaXZhdGU6CisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9zdGF0ZS5k
b2N1bWVudCgpOyB9CisgICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKGNvbnN0IFN0
eWxlUHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lkIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFN0eWxlUmVzb2x2ZXI6OlJ1
bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3Qg
TWF0Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7CisgICAgdm9pZCBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiosIGNvbnN0IE1h
dGNoUmVxdWVzdCYsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYpOworICAgIGJvb2wgcnVsZU1h
dGNoZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRv
SWQmLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tl
cjo6RG9lc05vdENyb3NzQm91bmRhcnkpOworCisgICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7
CisgICAgdm9pZCBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoU3R5bGVSZXNvbHZlcjo6TWF0
Y2hSZXN1bHQmKTsKKworICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqKTsK
KyAgICB2b2lkIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBTdGF0aWNDU1NSdWxlTGlzdCog
ZW5zdXJlUnVsZUxpc3QoKTsKKyAgICAgICAgCitwcml2YXRlOgorICAgIC8vIE5lZWQgc3R5bGVS
ZXNvbHZlciBmb3IgSW5zcGVjdG9yOjp3aWxsTWF0Y2hSdWxlLgorICAgIFN0eWxlUmVzb2x2ZXIq
IG1fc3R5bGVSZXNvbHZlcjsKKyAgICBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgbV9zdGF0ZTsKKyAg
ICBEb2N1bWVudFJ1bGVTZXRzJiBtX3J1bGVTZXRzOworICAgIFNlbGVjdG9yRmlsdGVyJiBtX3Nl
bGVjdG9yRmlsdGVyOworICAgIFN0eWxlU2NvcGVSZXNvbHZlciogbV9zY29wZVJlc29sdmVyOwor
CisgICAgYm9vbCBtX2lzUHJpbnRTdHlsZTsKKyAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9y
U3R5bGluZzsKKyAgICBQc2V1ZG9JZCBtX3BzZXVkb1N0eWxlOworICAgIGJvb2wgbV9zYW1lT3Jp
Z2luT25seTsKKyAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbV9tb2RlOworCisgICAgT3duUHRy
PFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiA+IG1fbWF0Y2hlZFJ1bGVzOworCisgICAgLy8g
T3V0cHV0LgorICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKyAgICBT
dHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIEVsZW1lbnRSdWxlQ29sbGVjdG9yX2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE4NTQyNjliMWMwYjQyM2Fj
MjFhYTc0NWI1OTM2NmQzNDVkY2ZmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAg
KEMpIDIwMDQtMjAwNSBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gKGtkZUBjYXJld29sZi5jb20pCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgTmljaG9sYXMgU2hhbmtzICh3ZWJraXRAbmlja3No
YW5rcy5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDks
IDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA3IEFsZXhleSBQcm9za3VyeWFrb3YgPGFwQHdlYmtpdC5vcmc+
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9y
Zz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJpZ2h0
IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xsZWN0b3Iu
aCIKKworI2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIlN0eWxl
UnVsZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21w
YXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBjb25zdCBTdHlsZVJ1bGVQYWdl
KiByMikKK3sKKyAgICByZXR1cm4gcjEtPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCkgPCByMi0+
c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKTsKK30KKworYm9vbCBQYWdlUnVsZUNvbGxlY3Rvcjo6
aXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIGJvb2wgaXNGaXJzdFBhZ2VM
ZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKS0+aXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICBpc0ZpcnN0UGFnZUxlZnQgPSB0cnVlOworCisg
ICAgcmV0dXJuIChwYWdlSW5kZXggKyAoaXNGaXJzdFBhZ2VMZWZ0ID8gMSA6IDApKSAlIDI7Cit9
CisKK2Jvb2wgUGFnZVJ1bGVDb2xsZWN0b3I6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNv
bnN0Cit7CisgICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwg
cGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgorICAgIHJldHVy
biAoIXBhZ2VJbmRleCk7Cit9CisKK1N0cmluZyBQYWdlUnVsZUNvbGxlY3Rvcjo6cGFnZU5hbWUo
aW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBh
Z2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCisgICAgcmV0dXJuICIiOworfQorCit2b2lk
IFBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFsbFBhZ2VSdWxlcyhpbnQgcGFnZUluZGV4KQorewor
ICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOworICAgIGNvbnN0
IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgU3RyaW5n
IHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOworICAgIAorICAgIG1hdGNoUGFnZVJ1bGVzKENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwg
cGFnZSk7CisgICAgbWF0Y2hQYWdlUnVsZXMobV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0
LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9y
IFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCisgICAgbWF0
Y2hQYWdlUnVsZXMobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBh
Z2UpOworfQorCit2b2lkIFBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlcyhSdWxlU2V0
KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcm
IHBhZ2VOYW1lKQoreworICAgIGlmICghcnVsZXMpCisgICAgICAgIHJldHVybjsKKworICAgIFZl
Y3RvcjxTdHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VSdWxlczsKKyAgICBtYXRjaFBhZ2VSdWxl
c0Zvckxpc3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMtPnBhZ2VSdWxlcygpLCBpc0xlZnRQYWdl
LCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpOworICAgIGlmIChtYXRjaGVkUGFnZVJ1bGVzLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RkOjpzdGFibGVfc29ydChtYXRjaGVkUGFn
ZVJ1bGVzLmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMuZW5kKCksIGNvbXBhcmVQYWdlUnVsZXMp
OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRQYWdlUnVsZXMuc2l6ZSgp
OyBpKyspCisgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoZWRQYWdl
UnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVj
dG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFn
ZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBmb3Ig
KGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21w
b25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAgICAgICBpZiAoY29tcG9uZW50
LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAgICAgICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOwor
ICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFn
ZU5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAg
ICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVudC0+cHNldWRv
VHlwZSgpOworICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0xl
ZnRQYWdlICYmICFpc0xlZnRQYWdlKQorICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NT
U2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQorICAgICAgICAgICAgfHwg
KHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAhaXNGaXJzdFBh
Z2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUGFnZVJ1bGVDb2xsZWN0b3I6Om1hdGNo
UGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNv
bnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wg
aXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0eWxlUnVsZVBhZ2Uq
IHJ1bGUgPSBydWxlc1tpXTsKKworICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9u
ZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUp
KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5v
IHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgorICAgICAgICBjb25zdCBTdHls
ZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOworICAgICAgICBp
ZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVk
IHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworICAgIH0KK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL1Bh
Z2VSdWxlQ29sbGVjdG9yLmggYi9Tb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3Iu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4wNzU4MDFkOTY4ZDg4ZTZjZTVmOWY4YjhhZGZiN2U4YzdjODM4OGNjCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgK
QEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChr
bm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAy
MDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgor
ICovCisKKyNpZm5kZWYgUGFnZVJ1bGVDb2xsZWN0b3JfaAorI2RlZmluZSBQYWdlUnVsZUNvbGxl
Y3Rvcl9oCisKKyNpbmNsdWRlICJEb2N1bWVudFJ1bGVTZXRzLmgiCisjaW5jbHVkZSAiU3R5bGVS
ZXNvbHZlci5oIgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgU3R5bGVSdWxlUGFnZTsKKworY2xh
c3MgUGFnZVJ1bGVDb2xsZWN0b3IgeworcHVibGljOgorICAgIFBhZ2VSdWxlQ29sbGVjdG9yKFN0
eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMpCisg
ICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgLCBtX3J1bGVTZXRzKHJ1bGVTZXRzKSB7
IH0KKworICAgIHZvaWQgbWF0Y2hBbGxQYWdlUnVsZXMoaW50IHBhZ2VJbmRleCk7CisgICAgU3R5
bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQmIG1hdGNoZWRSZXN1bHQoKSB7IHJldHVybiBtX3Jlc3Vs
dDsgfQorCitwcml2YXRlOgorICAgIGJvb2wgaXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25z
dDsKKyAgICBib29sIGlzUmlnaHRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0IHsgcmV0dXJuICFp
c0xlZnRQYWdlKHBhZ2VJbmRleCk7IH0KKyAgICBib29sIGlzRmlyc3RQYWdlKGludCBwYWdlSW5k
ZXgpIGNvbnN0OworICAgIFN0cmluZyBwYWdlTmFtZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKwor
ICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXMoUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgdm9pZCBtYXRj
aFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBj
b25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29s
IGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKworICAgIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlJiBtX3N0YXRlOworICAgIERvY3VtZW50UnVsZVNldHMmIG1fcnVsZVNldHM7CisK
KyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKK307CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFBhZ2VSdWxlQ29sbGVjdG9yX2gKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2Nzcy9TdHlsZVJlc29sdmVyLmNwcAppbmRleCBlZGY1MzNjZGM4YjcwNTZjMGZkMDdhOGM1ZWRj
NWNjODVmOTAwYjdiLi4xOWRkNTY3MmI5ZGUxOTkxYzczNzM2NWViYjhlMmM1YmI1NTAwYmU4IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCkBAIC01OSw2ICs1OSw3IEBACiAjaW5j
bHVkZSAiQ291bnRlckNvbnRlbnQuaCIKICNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCiAjaW5jbHVk
ZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkVsZW1lbnRSdWxl
Q29sbGVjdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5oIgogI2luY2x1ZGUgIkZvbnRG
ZWF0dXJlVmFsdWUuaCIKICNpbmNsdWRlICJGb250VmFsdWUuaCIKQEAgLTg2LDYgKzg3LDcgQEAK
ICNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKICNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29u
dGV4dC5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWdlUnVsZUNvbGxlY3Rvci5o
IgogI2luY2x1ZGUgIlBhaXIuaCIKICNpbmNsdWRlICJQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJh
dGlvbi5oIgogI2luY2x1ZGUgIlF1b3Rlc0RhdGEuaCIKQEAgLTIwNywzMCArMjA5LDYgQEAgaWYg
KGlzSW5pdGlhbCkgeyBcCiAKIFJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0eWxlTm90
WWV0QXZhaWxhYmxlOwogCi1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmlnaHREZWNs
YXJhdGlvbigpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0
eVNldD4sIGxlZnRUb1JpZ2h0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0g
ICAgaWYgKGxlZnRUb1JpZ2h0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICBsZWZ0VG9SaWdodERl
Y2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7Ci0gICAg
cmV0dXJuIGxlZnRUb1JpZ2h0RGVjbC5nZXQoKTsKLX0KLQotc3RhdGljIFN0eWxlUHJvcGVydHlT
ZXQqIHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwo
UmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVByb3BlcnR5
U2V0OjpjcmVhdGUoKSkpOwotICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHkoKSkKLSAg
ICAgICAgcmlnaHRUb0xlZnREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwg
Q1NTVmFsdWVSdGwpOwotICAgIHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Ci19Ci0KLQot
aW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVs
ZUxpc3QoKQotewotICAgIGlmICghbV9ydWxlTGlzdCkKLSAgICAgICAgbV9ydWxlTGlzdCA9IFN0
YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKLSAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsK
LX0KLQogaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFj
a2dyb3VuZCgpCiB7CiAgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJh
bmNlKCk7CkBAIC0yNDcsOSArMjI1LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3Rh
dGU6OmNsZWFyKCkKICAgICBtX3N0eWxlZEVsZW1lbnQgPSAwOwogICAgIG1fcGFyZW50U3R5bGUg
PSAwOwogICAgIG1fcGFyZW50Tm9kZSA9IDA7Ci0gICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gMDsK
LSAgICBtX3J1bGVMaXN0ID0gMDsKLSAgICBtX21hdGNoZWRSdWxlcy5jbGVhcigpOwogICAgIG1f
cGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwogI2lmIEVOQUJMRShDU1NfU0hBREVSUykK
ICAgICBtX2hhc1BlbmRpbmdTaGFkZXJzID0gZmFsc2U7CkBAIC0yNTksNiArMjM0LDE2IEBAIGlu
bGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigpCiAjZW5kaWYKIH0KIAordm9p
ZCBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdDo6YWRkTWF0Y2hlZFByb3BlcnRpZXMoY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBs
aW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBl
KQoreworICAgIG1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
ICsgMSk7CisgICAgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRp
ZXMgPSBtYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7CisgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0
aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7CisgICAgbmV3
UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKKyAgICBuZXdQcm9wZXJ0
aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7CisgICAgbWF0Y2hlZFJ1
bGVzLmFwcGVuZChydWxlKTsKK30KKwogU3R5bGVSZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1
bWVudCogZG9jdW1lbnQsIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQogICAgIDogbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAoMCkKICAgICAsIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3
ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSkKQEAgLTQwMiwxODIgKzM4Nyw2IEBAIHZvaWQgU3R5
bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2
ZXI+KikKICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2Vl
cCA9IDA7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0
Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVz
LCBTdHlsZVJ1bGUqIHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUsIFByb3BlcnR5V2hpdGVs
aXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCi17Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuZ3JvdyhtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgKyAx
KTsKLSAgICBNYXRjaGVkUHJvcGVydGllcyYgbmV3UHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKLSAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBj
b25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9wZXJ0aWVzKTsKLSAgICBuZXdQcm9wZXJ0
aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBlOwotICAgIG5ld1Byb3BlcnRpZXMud2hp
dGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlwZTsKLSAgICBtYXRjaFJlc3VsdC5tYXRj
aGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGNvbnN0IFN0eWxl
UHJvcGVydHlTZXQqIHByb3BlcnR5U2V0LCBib29sIGlzQ2FjaGVhYmxlKQotewotICAgIGlmICgh
cHJvcGVydHlTZXQpCi0gICAgICAgIHJldHVybjsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRo
b3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKLSAgICBpZiAocmVzdWx0
LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPT0gLTEpCi0gICAgICAgIHJlc3VsdC5yYW5nZXMuZmly
c3RBdXRob3JSdWxlID0gcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZTsKLSAgICBhZGRNYXRj
aGVkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnR5U2V0KTsKLSAgICBpZiAoIWlzQ2FjaGVhYmxl
KQotICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLX0KLQotY2xhc3MgTWF0Y2hp
bmdVQVJ1bGVzU2NvcGUgewotcHVibGljOgotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0g
ICAgfk1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBpc01hdGNoaW5n
VUFSdWxlcygpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBib29sIG1fbWF0Y2hpbmdVQVJ1bGVz
OwotfTsKLQotTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsK
LSAgICBBU1NFUlQoIW1fbWF0Y2hpbmdVQVJ1bGVzKTsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9
IHRydWU7Ci19Ci0KLU1hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUo
KQotewotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7Ci19Ci0KLWlubGluZSBib29sIE1h
dGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi17Ci0gICAgcmV0dXJuIG1f
bWF0Y2hpbmdVQVJ1bGVzOwotfQotCi1ib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjptX21hdGNo
aW5nVUFSdWxlcyA9IGZhbHNlOwotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGlu
Z1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVS
YW5nZSkKLXsKLSAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOwotICAgIEFTU0VSVCht
X3N0YXRlLmVsZW1lbnQoKSk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIEVs
ZW1lbnQqIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCk7Ci0gICAgY29uc3QgU3R5bGVkRWxlbWVu
dCogc3R5bGVkRWxlbWVudCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKTsKLSAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIHBzZXVkb0lkID0gZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKTsKLSAgICBpZiAo
IXBzZXVkb0lkLmlzRW1wdHkoKSkgewotICAgICAgICBBU1NFUlQoc3R5bGVkRWxlbWVudCk7Ci0g
ICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+
c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBzZXVkb0lkLmltcGwoKSksIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgaWYgKGVs
ZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
ckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmN1ZVBzZXVkb1J1bGVzKCksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKLSNlbmRpZgotICAgIC8vIENoZWNrIHdoZXRoZXIgb3RoZXIgdHlwZXMg
b2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4gdGhlIGN1cnJlbnQgdHJlZSBzY29wZS4gQ3JpdGVy
aWEgZm9yIHRoaXM6Ci0gICAgLy8gYSkgaXQncyBhIFVBIHJ1bGUKLSAgICAvLyBiKSB0aGUgdHJl
ZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVzCi0gICAgLy8gYykgdGhlIHJ1bGVzIGNvbWVzIGZy
b20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0aGluIHRoZSBzYW1lIHRyZWUgc2NvcGUKLSAgICBU
cmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1lbnQtPnRyZWVTY29wZSgpOwotICAgIGlmICghTWF0
Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKLSAgICAgICAgJiYgIXRyZWVT
Y29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQotICAgICAgICAmJiAoIW1hdGNoUmVxdWVzdC5zY29w
ZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29wZSkKLSAgICAg
ICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6
OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBuZWVk
IHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3MsIHRhZywgYW5kIGV2ZXJ5dGhpbmcg
ZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAotICAgIC8vIHRoZW4gc29ydCB0aGUgYnVmZmVyLgotICAg
IGlmIChlbGVtZW50LT5oYXNJRCgpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxp
c3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmlkUnVsZXMoZWxlbWVudC0+aWRGb3JTdHlsZVJlc29s
dXRpb24oKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgaWYgKHN0eWxl
ZEVsZW1lbnQgJiYgc3R5bGVkRWxlbWVudC0+aGFzQ2xhc3MoKSkgewotICAgICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMoKS5zaXplKCk7ICsraSkK
LSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVs
ZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKClbaV0uaW1wbCgpKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xp
bmsoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
Ci0gICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6bWF0Y2hlc0ZvY3VzUHNldWRvQ2xhc3MoZWxlbWVu
dCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVs
ZVNldC0+Zm9jdXNQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
LSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnRh
Z1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVT
ZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRj
aFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgaWYg
KCFtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdW5z
aWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1
bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7
Ci0gICAgICAgIGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciA9IG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yOwot
ICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxlY3Rvciwgc3RhdGljX2Nh
c3Q8RWxlbWVudCo+KG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpLT5ub2RlKCkpKSkgewotICAg
ICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpOwotICAgICAgICAg
ICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
KE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVz
LCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRjaFJl
c3VsdCYgcmVzdWx0KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgVmVjdG9y
PGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSBzdGF0ZS5tYXRjaGVkUnVsZXMo
KTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgc29ydE1hdGNoZWRSdWxlcygpOwotCi0gICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgKytpKQotICAgICAgICAgICAgc3RhdGUuZW5zdXJl
UnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNyZWF0
ZUNTU09NV3JhcHBlcigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vdyB0
cmFuc2ZlciB0aGUgc2V0IG9mIG1hdGNoZWQgcnVsZXMgb3ZlciB0byBvdXIgbGlzdCBvZiBkZWNs
YXJhdGlvbnMuCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXpl
KCk7IGkrKykgewotICAgICAgICBpZiAoc3RhdGUuc3R5bGUoKSAmJiBtYXRjaGVkUnVsZXNbaV0t
PmNvbnRhaW5zVW5jb21tb25BdHRyaWJ1dGVTZWxlY3RvcigpKQotICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0VW5pcXVlKCk7Ci0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3Vs
dCwgbWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPnByb3BlcnRpZXMoKSwgbWF0Y2hlZFJ1bGVzW2ld
LT5ydWxlKCksIG1hdGNoZWRSdWxlc1tpXS0+bGlua01hdGNoVHlwZSgpLCBtYXRjaGVkUnVsZXNb
aV0tPnByb3BlcnR5V2hpdGVsaXN0VHlwZSgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShT
SEFET1dfRE9NKQotICAgIGlmICghbV9zY29wZVJlc29sdmVyKQotICAgICAgICByZXR1cm47Ci0K
LSAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9yIHJ1bGVzIGJ5IHRyYXZlcnNpbmcgdGhlIHNjb3Bl
ZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0IGlmIGl0IGdvdCBpbmNvbnNpc3RlbnQpLgotICAg
IGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Njb3BlZFN0eWxlcygpICYmIG1fc2NvcGVSZXNvbHZl
ci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeShtX3N0YXRlLmVsZW1lbnQoKSkpIHsKLSAgICAgICAg
Ym9vbCBhcHBseUF1dGhvclN0eWxlcyA9IG1fc3RhdGUuZWxlbWVudCgpLT50cmVlU2NvcGUoKS0+
YXBwbHlBdXRob3JTdHlsZXMoKTsKLSAgICAgICAgYm9vbCBkb2N1bWVudFNjb3BlID0gdHJ1ZTsK
LSAgICAgICAgdW5zaWduZWQgc2NvcGVTaXplID0gbV9zY29wZVJlc29sdmVyLT5zdGFja1NpemUo
KTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNjb3BlU2l6ZTsgKytpKSB7Ci0g
ICAgICAgICAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgICAgICAgICBy
ZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKSAtIDE7Ci0KLSAgICAgICAgICAgIGNvbnN0IFN0eWxlU2NvcGVSZXNvbHZlcjo6U3RhY2tG
cmFtZSYgZnJhbWUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrRnJhbWVBdChpKTsKLSAgICAgICAg
ICAgIGRvY3VtZW50U2NvcGUgPSBkb2N1bWVudFNjb3BlICYmICFmcmFtZS5tX3Njb3BlLT5pc0lu
U2hhZG93VHJlZSgpOwotICAgICAgICAgICAgaWYgKGRvY3VtZW50U2NvcGUpIHsKLSAgICAgICAg
ICAgICAgICBpZiAoIWFwcGx5QXV0aG9yU3R5bGVzKQotICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtX3Njb3Bl
UmVzb2x2ZXItPm1hdGNoZXNTdHlsZUJvdW5kcyhmcmFtZSkpCi0gICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXRjaFJlcXVlc3QgbWF0
Y2hSZXF1ZXN0KGZyYW1lLm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVsZXMsIGZyYW1lLm1fc2Nv
cGUpOwotICAgICAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0
aG9yUnVsZVJhbmdlKCk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJl
Z2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgICAgICAgICBzb3J0QW5kVHJhbnNm
ZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1hdGNoSG9z
dFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFS
QU0ocmVzdWx0KTsKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOwotI2VuZGlm
Ci19Ci0KIGlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1h
dGNoZXNIb3N0UnVsZXMoKQogewogI2lmIEVOQUJMRShTSEFET1dfRE9NKQpAQCAtNTg3LDE5NyAr
Mzk2LDYgQEAgaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRl
TWF0Y2hlc0hvc3RSdWxlcygpCiAjZW5kaWYKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRj
aEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQot
ewotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2ZXIpOwot
Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQot
ICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOwotICAgIG1fc2NvcGVSZXNvbHZlci0+
bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxlcyk7Ci0gICAgaWYg
KG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZvciAodW5z
aWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgUnVs
ZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7Ci0gICAg
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChtYXRjaGVkUnVsZXMuYXQoaS0x
KSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgpKSwgcnVsZVJhbmdlKTsKLSAg
ICB9Ci0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0jZWxzZQotICAg
IFVOVVNFRF9QQVJBTShyZXN1bHQpOwotICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxl
cyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEF1dGhvclJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17Ci0gICAgbV9zdGF0
ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1
bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQotICAgIGlmICghbV9z
dGF0ZS5lbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIE1hdGNoIGdsb2JhbCBh
dXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLmF1
dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotI2lmIEVOQUJMRShTSEFET1dfRE9N
KQotICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0
cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVt
cHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0
Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0
Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKLSNlbmRpZgotCi0gICAgc29ydEFuZFRyYW5zZmVy
TWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0KLSAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKHJlc3Vs
dCwgaW5jbHVkZUVtcHR5UnVsZXMpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVXNl
clJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17Ci0g
ICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0g
ICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0gICAgcmVzdWx0LnJhbmdlcy5s
YXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBN
YXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy51c2Vy
UnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxl
UmFuZ2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOwot
fQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0
LCBSdWxlU2V0KiBydWxlcykKLXsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
Ci0gICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5n
ZXMuVUFSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3Qo
cnVsZXMpLCBydWxlUmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJl
c3VsdCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1h
dGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgaWYgKCFydWxlcykKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICAvLyBJbiBz
b21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9tIGVsZW1l
bnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZlLgotICAgIC8vIEFu
Y2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUgaW4gdGhhdCBjYXNl
IGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBib29sIGNhblVzZUZhc3RSZWpl
Y3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVu
dE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3RvckNo
ZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OwotCi0gICAgdW5zaWduZWQgc2l6ZSA9IHJ1bGVz
LT5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAg
ICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7Ci0gICAgICAgIGlm
IChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNlbGVjdG9y
PFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5kYW50U2Vs
ZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAg
ICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOwotICAgICAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOwotICAgICAgICBQc2V1ZG9JZCBk
eW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxlRGF0
YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVoYXZp
b3JBdEJvdW5kYXJ5KSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3Bl
cnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4KLSAg
ICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9w
ZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMtPmlz
RW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgewotICAgICAgICAg
ICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFs
c2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1bGVz
IEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgotICAgICAgICAg
ICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVsZURhdGEuaGFzRG9jdW1lbnRT
ZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBub3Jt
YWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKLSAgICAgICAgICAgIC8vIHdlIHJlYWxseSBq
dXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KLSAgICAgICAgICAgIGlmIChkeW5hbWljUHNl
dWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlKCkgPT0gTk9QU0VVRE8pIHsKLSAg
ICAgICAgICAgICAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVj
dGluZ1J1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1
ZG8gPCBGSVJTVF9JTlRFUk5BTF9QU0VVRE9JRCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0SGFzUHNldWRvU3R5bGUoZHluYW1pY1BzZXVkbyk7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGlu
ZGljZXMgaW4gdGhlIG1hdGNoZWQgcnVsZXMgYXJyYXkuCi0gICAgICAgICAgICAgICAgKytydWxl
UmFuZ2UubGFzdFJ1bGVJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0
UnVsZUluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxl
SW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKLQotICAgICAgICAgICAgICAgIC8vIEFk
ZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAgICAgICAgICAgICAg
ICBtX3N0YXRlLmFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7Ci0gICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCB0cnVlKTsKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAg
ICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29uc3QgUnVsZURhdGEq
IHIxLCBjb25zdCBSdWxlRGF0YSogcjIpCi17Ci0gICAgdW5zaWduZWQgc3BlY2lmaWNpdHkxID0g
cjEtPnNwZWNpZmljaXR5KCk7Ci0gICAgdW5zaWduZWQgc3BlY2lmaWNpdHkyID0gcjItPnNwZWNp
ZmljaXR5KCk7Ci0gICAgcmV0dXJuIChzcGVjaWZpY2l0eTEgPT0gc3BlY2lmaWNpdHkyKSA/IHIx
LT5wb3NpdGlvbigpIDwgcjItPnBvc2l0aW9uKCkgOiBzcGVjaWZpY2l0eTEgPCBzcGVjaWZpY2l0
eTI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydE1hdGNoZWRSdWxlcygpCi17Ci0gICAg
c3RkOjpzb3J0KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpt
YXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0
aWVzKQotewotICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQpOwotCi0gICAgLy8gTm93IHdlIGNoZWNr
IHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQot
ICAgICAgICBtYXRjaFVzZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVj
ayBhdXRob3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJp
YnV0ZXMgbWFwcGVkIGZyb20gSFRNTC4KLSAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkp
IHsKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICAv
LyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBtYXBwZWQgZGVjbGFyYXRpb25zLgotICAgICAgICAv
LyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUg
dGhhdCBtdXN0IGJlIGFwcGxpZWQKLSAgICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNp
bmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUg
YXR0cmlidXRlcy4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSk7Ci0KLSAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVt
ZW50KCkpIHsKLSAgICAgICAgICAgIGJvb2wgaXNBdXRvOwotICAgICAgICAgICAgVGV4dERpcmVj
dGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlzQXV0byk7Ci0gICAgICAg
ICAgICBpZiAoaXNBdXRvKQotICAgICAgICAgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJl
c3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiBy
aWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8v
IENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzIG5leHQuCi0gICAgaWYgKG1fbWF0Y2hB
dXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFs
c2UpOwotCi0gICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgotICAg
IGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgewotICAgICAgICAv
LyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00g
d3JhcHBlci4KLSAgICAgICAgLy8gRklYTUU6IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNl
ZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcuCi0gICAgICAgIGJvb2wgaXNJbmxpbmVT
dHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+
aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgp
OwotICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVBy
b3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwg
aXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFNWRykKLSAgICAv
LyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5bGUuCi0gICAgaWYgKGluY2x1
ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50
KCkpCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2Fz
dDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHls
ZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOwotI2Vsc2UKLSAgICBVTlVT
RURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSNlbmRpZgotfQotCiBib29sIFN0eWxl
UmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmlu
ZyYgY2xhc3NOYW1lcykgY29uc3QKIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2xh
c3NOYW1lcy5zaXplKCk7ICsraSkgewpAQCAtODA1LDExICs0MjMsOCBAQCBpbmxpbmUgdm9pZCBT
dHlsZVJlc29sdmVyOjppbml0RWxlbWVudChFbGVtZW50KiBlKQogICAgIH0KIH0KIAotaW5saW5l
IHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQq
IGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIFBzZXVkb0lk
IHBzZXVkb0lkLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCitpbmxpbmUgdm9pZCBT
dHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1l
bnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKIHsKLSAgICBtX3BzZXVk
b1N0eWxlID0gcHNldWRvSWQ7Ci0gICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5
bGluZzsKLQogICAgIGlmIChlKSB7CiAgICAgICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRl
eHQoZSk7CiAgICAgICAgIG1fcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRl
cmluZ0FuZFN0eWxlKCk7CkBAIC04MjksNyArNDQ0LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNv
bHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVt
ZW4KIAogICAgIG1fc3R5bGUgPSAwOwogICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVh
cigpOwotICAgIG1fcnVsZUxpc3QgPSAwOwogICAgIG1fZm9udERpcnR5ID0gZmFsc2U7CiB9CiAK
QEAgLTg5MywxNyArNTA3LDkgQEAgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5k
aWRhdGVNYXRjaGVzUnVsZVNldChSdWxlU2V0KiBydWxlU2V0KQogewogICAgIGlmICghcnVsZVNl
dCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xl
YXIoKTsKLQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxl
cyk7Ci0gICAgaW50IGZpcnN0UnVsZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsKLSAg
ICBSdWxlUmFuZ2UgcnVsZVJhbmdlKGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKLSAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7
Ci0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwot
ICAgIGlmIChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXR1cm4g
dHJ1ZTsKKworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBtX3N0YXRl
KTsKKyAgICByZXR1cm4gY29sbGVjdG9yLmhhc0FueU1hdGNoaW5nUnVsZXMocnVsZVNldCk7CiB9
CiAKIGJvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVs
ZW1lbnQqIGVsZW1lbnQpIGNvbnN0CkBAIC0xMTY5LDI2ICs3NzUsNiBAQCBSZW5kZXJTdHlsZSog
U3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hhcmVkU3R5bGUoKQogICAgIHJldHVybiBzaGFyZUVsZW1l
bnQtPnJlbmRlclN0eWxlKCk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVz
KE1hdGNoUmVzdWx0JiByZXN1bHQpCi17Ci0gICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7
Ci0KLSAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0
LgotICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0
KQotICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLSAgICBSdWxlU2V0KiB1c2Vy
QWdlbnRTdHlsZVNoZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3BlY2lmaWMoInByaW50
IikKLSAgICAgICAgPyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDog
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7Ci0gICAgbWF0Y2hVQVJ1bGVzKHJl
c3VsdCwgdXNlckFnZW50U3R5bGVTaGVldCk7Ci0KLSAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2Ug
bWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKGRv
Y3VtZW50KCktPmluUXVpcmtzTW9kZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBD
U1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7Ci0KLSAgICAvLyBJZiBk
b2N1bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBp
biB4bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291
cmNlIHN0eWxlIHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKLSAg
ICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjp2aWV3U291
cmNlU3R5bGUoKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2Rl
KFBhZ2luYXRpb246Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxlKiBzdHlsZSkKIHsK
ICAgICBpZiAocGFnaW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpCkBAIC0x
Mzg2LDcgKzk3Miw3IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0
eWxlRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCBSZW5kZXJTCiAKICAgICBTdGF0ZSYgc3Rh
dGUgPSBtX3N0YXRlOwogICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRG
b3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VV
RE8sIHJlZ2lvbkZvclN0eWxpbmcpOworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9j
dW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCk7CiAgICAgaWYgKHNoYXJpbmdCZWhhdmlv
ciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBv
aW50KCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVk
U3R5bGUoKTsKICAgICAgICAgaWYgKHNoYXJlZFN0eWxlKQpAQCAtMTQyOCwxMyArMTAxNCwxNiBA
QCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1lbnQo
RWxlbWVudCogZWxlbWVudCwgUmVuZGVyUwogICAgIGlmIChuZWVkc0NvbGxlY3Rpb24pCiAgICAg
ICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgp
LCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwogCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7
CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIG1fc3RhdGUpOworICAg
IGNvbGxlY3Rvci5zZXRSZWdpb25Gb3JTdHlsaW5nKHJlZ2lvbkZvclN0eWxpbmcpOworICAgIGNv
bGxlY3Rvci5zZXRNZWRpdW0obV9tZWRpdW0uZ2V0KCkpOworCiAgICAgaWYgKG1hdGNoaW5nQmVo
YXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyht
YXRjaFJlc3VsdCk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMoKTsKICAgICBlbHNl
Ci0gICAgICAgIG1hdGNoQWxsUnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5nQmVoYXZpb3IgIT0g
TWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hBbGxS
dWxlcyhtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRj
aEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7CiAKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1h
dGNoUmVzdWx0LCBlbGVtZW50KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbGxlY3Rv
ci5tYXRjaGVkUmVzdWx0KCksIGVsZW1lbnQpOwogCiAgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxl
IG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVw
cykuCiAgICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5
bGUoKSwgZWxlbWVudCk7CkBAIC0xNDUxLDcgKzEwNDAsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxlKiBl
bGVtZQogewogICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKICAgICBpZiAoa2V5ZnJhbWUtPnByb3Bl
cnRpZXMoKSkKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+
cHJvcGVydGllcygpKTsKKyAgICAgICAgcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGtleWZy
YW1lLT5wcm9wZXJ0aWVzKCkpOwogCiAgICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOwogCkBA
IC0xNTc1LDcgKzExNjQsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
Ojpwc2V1ZG9TdHlsZUZvckVsZW1lbnQoUHNldWRvSWQgcHNldWRvLCBFbAogCiAgICAgaW5pdEVs
ZW1lbnQoZSk7CiAKLSAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUs
IHBhcmVudFN0eWxlLCBwc2V1ZG8pOworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9j
dW1lbnQoKSwgZSwgcGFyZW50U3R5bGUpOwogICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxl
OjpjcmVhdGUoKSk7CiAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5wYXJl
bnRTdHlsZSgpKTsKIApAQCAtMTU4MywyMCArMTE3MiwyMiBAQCBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1lbnQoUHNldWRvSWQgcHNldWRv
LCBFbAogICAgIC8vIHRob3NlIHJ1bGVzLgogCiAgICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5kIGF1
dGhvciBydWxlcy4KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVBUnVs
ZXMobWF0Y2hSZXN1bHQpOworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxlY3Rvcih0aGlz
LCBtX3N0YXRlKTsKKyAgICBjb2xsZWN0b3Iuc2V0UHNldWRvU3R5bGUocHNldWRvKTsKKyAgICBj
b2xsZWN0b3Iuc2V0TWVkaXVtKG1fbWVkaXVtLmdldCgpKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hV
QVJ1bGVzKCk7CiAKICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKLSAgICAg
ICAgbWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgbWF0Y2hBdXRo
b3JSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVc2Vy
UnVsZXMoZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hBdXRob3JSdWxlcyhmYWxzZSk7
CiAgICAgfQogCi0gICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHko
KSkKKyAgICBpZiAoY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKS5tYXRjaGVkUHJvcGVydGllcy5p
c0VtcHR5KCkpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5
bGVUeXBlKHBzZXVkbyk7CiAKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0
LCBlKTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbGxlY3Rvci5tYXRjaGVkUmVzdWx0
KCksIGUpOwogCiAgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5k
IHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCiAgICAgYWRqdXN0UmVuZGVy
U3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKQEAgLTE2MTcs
MTcgKzEyMDgsMTIgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5
bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCiAgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHls
ZTo6Y3JlYXRlKCkpOwogICAgIG1fc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5y
b290RWxlbWVudFN0eWxlKCkpOwogCi0gICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdl
KHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUlu
ZGV4KTsKLSAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7Ci0gICAg
Ci0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBw
YWdlKTsKLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxlKCks
IGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFs
IGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgot
ICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xl
ZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIFBhZ2VSdWxlQ29sbGVjdG9yIGNvbGxlY3RvcihtX3N0
YXRlLCBtX3J1bGVTZXRzKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hBbGxQYWdlUnVsZXMocGFnZUlu
ZGV4KTsKICAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKICAgICBib29sIGluaGVy
aXRlZE9ubHkgPSBmYWxzZTsKKworICAgIE1hdGNoUmVzdWx0JiByZXN1bHQgPSBjb2xsZWN0b3Iu
bWF0Y2hlZFJlc3VsdCgpOwogI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQogICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwogI2VuZGlm
CkBAIC0yMDU0LDgzICsxNjQwLDMxIEBAIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVz
b2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzCiAgICAgaWYg
KCFlIHx8ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKICAgICAgICAg
cmV0dXJuIDA7CiAKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0
aW5nUnVsZXMpOwotCiAgICAgaW5pdEVsZW1lbnQoZSk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5
bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKyAgICBtX3N0YXRlLmluaXRG
b3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCk7CisKKyAgICBFbGVtZW50UnVsZUNvbGxl
Y3RvciBjb2xsZWN0b3IodGhpcywgbV9zdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldE1vZGUoU2Vs
ZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOworICAgIGNvbGxlY3Rvci5zZXRQc2V1ZG9T
dHlsZShwc2V1ZG9JZCk7CisgICAgY29sbGVjdG9yLnNldE1lZGl1bShtX21lZGl1bS5nZXQoKSk7
CiAKLSAgICBNYXRjaFJlc3VsdCBkdW1teTsKICAgICBpZiAocnVsZXNUb0luY2x1ZGUgJiBVQUFu
ZFVzZXJDU1NSdWxlcykgewogICAgICAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRo
ZSB1c2VyIGFnZW50IHNoZWV0LgotICAgICAgICBtYXRjaFVBUnVsZXMoZHVtbXkpOwotCisgICAg
ICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMoKTsKKyAgICAgICAgCiAgICAgICAgIC8vIE5vdyB3
ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgogICAgICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMpCi0gICAgICAgICAgICBtYXRjaFVzZXJSdWxlcyhkdW1teSwgcnVsZXNUb0luY2x1
ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKyAgICAgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVzZXJSdWxl
cyhydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwogICAgIH0KIAogICAgIGlmIChtX21h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNUb0luY2x1ZGUgJiBBdXRob3JDU1NSdWxl
cykpIHsKLSAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRl
ICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOworICAgICAgICBjb2xsZWN0b3Iuc2V0U2FtZU9yaWdp
bk9ubHkoIShydWxlc1RvSW5jbHVkZSAmIENyb3NzT3JpZ2luQ1NTUnVsZXMpKTsKIAogICAgICAg
ICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cy4KLSAgICAgICAgbWF0Y2hBdXRo
b3JSdWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKLQotICAgICAg
ICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KGZhbHNlKTsKKyAgICAgICAgY29sbGVjdG9yLm1h
dGNoQXV0aG9yUnVsZXMocnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKICAgICB9CiAK
LSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0K
LSAgICByZXR1cm4gbV9zdGF0ZS50YWtlUnVsZUxpc3QoKTsKLX0KLQotaW5saW5lIGJvb2wgU3R5
bGVSZXNvbHZlcjo6cnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBD
b250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hl
Y2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSkKLXsKLSAgICBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgaWYgKHJ1bGVEYXRhLmhhc0Zhc3RDaGVja2FibGVT
ZWxlY3RvcigpKSB7Ci0gICAgICAgIC8vIFdlIGtub3cgdGhpcyBzZWxlY3RvciBkb2VzIG5vdCBp
bmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVudHMuCi0gICAgICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHls
ZSgpICE9IE5PUFNFVURPKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBX
ZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRjaGVz
IHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KLSAgICAgICAg
Ly8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNr
IHRoZSBuYW1lc3BhY2UuCi0gICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxlY3Rv
ck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNIVE1M
RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNlbGVj
dG9yKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAmJiAh
U2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2Vs
ZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IGlmICghU2VsZWN0b3JDaGVja2VyOjpmYXN0Q2hlY2tSaWdodG1vc3RBdHRyaWJ1dGVTZWxlY3Rv
cihzdGF0ZS5lbGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCkpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiBTZWxlY3RvckNoZWNrZXI6OmZhc3RDaGVjayhy
dWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCkpOwotICAgIH0KLQotICAgIC8vIFNs
b3cgcGF0aC4KLSAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCks
IHN0YXRlLm1vZGUoKSk7Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29u
dGV4dCBjb250ZXh0KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0
b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1lbnRTdHls
ZSA9IHN0YXRlLnN0eWxlKCk7Ci0gICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAgIGNvbnRl
eHQucHNldWRvU3R5bGUgPSBzdGF0ZS5wc2V1ZG9TdHlsZSgpOwotICAgIGNvbnRleHQuYmVoYXZp
b3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6
TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwgZHluYW1pY1BzZXVk
bywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOwotICAgIGlmIChtYXRjaCAhPSBTZWxl
Y3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGlmIChzdGF0ZS5wc2V1ZG9TdHlsZSgpICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxl
KCkgIT0gZHluYW1pY1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0
cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3Qg
Q1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQotewot
ICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQo
KSwgbV9zdGF0ZS5tb2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdp
b25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkKLSAgICAgICAgaWYg
KHNlbGVjdG9yQ2hlY2tlci5tYXRjaGVzKHMsIHJlZ2lvbkVsZW1lbnQpKQotICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbGxlY3Rvci5t
YXRjaGVkUnVsZUxpc3QoKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpA
QCAtMjE0OSw3ICsxNjgzLDcgQEAgTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0
TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmUKIHRlbXBsYXRlIDxT
dHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgogdm9pZCBTdHlsZVJlc29s
dmVyOjphcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywg
U3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFBy
b3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCiB7Ci0gICAgQVNTRVJU
KChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24pIHx8IG1f
c3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsKKyAgICAvL0FTU0VSVCgocHJvcGVydHlXaGl0ZWxp
c3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uKSB8fCBtX3N0YXRlLnJlZ2lvbkZvclN0
eWxpbmcoKSk7CiAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nlc3NSdWxlKGRvY3VtZW50KCksIHJ1bGUs
IHRoaXMpOwogCiAgICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHByb3BlcnRpZXMtPnByb3Bl
cnR5Q291bnQoKTsKQEAgLTI0MDksODYgKzE5NDMsNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFw
cGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25z
dAogICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5w
YXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKIH0KIAotc3RhdGljIGlubGlu
ZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0
eWxlUnVsZVBhZ2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNp
dHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVz
LCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5h
bWUpCi17Ci0gICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPFN0
eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlz
dChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmly
c3RQYWdlLCBwYWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMu
YmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7Ci0KLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykK
LSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUGFnZVJ1bGVzW2ld
LT5wcm9wZXJ0aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBv
bmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wg
aXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yIChjb25zdCBD
U1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0g
Y29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRj
aCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcm
IGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5hbWUoKTsKLSAgICAgICAg
ICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENTU1Nl
bGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsK
LSAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAm
JiAhaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9y
OjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9U
eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKLSAg
ICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAg
IHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzRm9y
TGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJ1bGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVsZVBhZ2UqIHJ1bGUgPSBydWxl
c1tpXTsKLQotICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5z
ZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpKQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMg
dG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICBpZiAoIXByb3BlcnRp
ZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgotICAg
ICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0KLX0KLQotYm9vbCBTdHlsZVJl
c29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgYm9vbCBpc0Zp
cnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRy
dWU7Ci0KLSAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkp
ICUgMjsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4
KSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBh
Z2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KLSAgICBy
ZXR1cm4gKCFwYWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVSZXNvbHZlcjo6cGFnZU5hbWUo
aW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBh
Z2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0dXJuICIiOwotfQotCiB2b2lk
IFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENT
U1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQogewogICAgIGluaXRFbGVtZW50KDAp
OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaCBiL1NvdXJj
ZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgKaW5kZXggMmNkYWMxZWRhZTUxYjhlMzUwNDE1
OTQ4MWJiNjMzZjhkMTIxMGJjOS4uNGFmZWM1NzE2OTk5MzhjNDJhNGRlYWMxZDA5MWM0YzU3ZjVi
ZWIxNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCkBAIC0xOTIsNiArMTkyLDcgQEAg
cHVibGljOgogCiAgICAgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSB7IHJldHVybiBtX3J1
bGVTZXRzOyB9CiAgICAgY29uc3QgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSBjb25zdCB7
IHJldHVybiBtX3J1bGVTZXRzOyB9CisgICAgU2VsZWN0b3JGaWx0ZXImIHNlbGVjdG9yRmlsdGVy
KCkgeyByZXR1cm4gbV9zZWxlY3RvckZpbHRlcjsgfQogCiAjaWYgRU5BQkxFKFNUWUxFX1NDT1BF
RCkgfHwgRU5BQkxFKFNIQURPV19ET00pCiAgICAgU3R5bGVTY29wZVJlc29sdmVyKiBlbnN1cmVT
Y29wZVJlc29sdmVyKCkKQEAgLTMxMCwxNCArMzExLDYgQEAgcHVibGljOgogCiAgICAgdm9pZCBs
b2FkUGVuZGluZ1Jlc291cmNlcygpOwogCi1wcml2YXRlOgotICAgIC8vIFRoaXMgZnVuY3Rpb24g
Zml4ZXMgdXAgdGhlIGRlZmF1bHQgZm9udCBzaXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgY3Vy
cmVudCBnZW5lcmljIGZvbnQgZmFtaWx5IGhhcyBjaGFuZ2VkLiAtZHdoCi0gICAgdm9pZCBjaGVj
a0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVy
U3R5bGUqIHBhcmVudFN0eWxlKTsKLSAgICB2b2lkIGNoZWNrRm9yVGV4dFNpemVBZGp1c3QoKTsK
LQotICAgIHZvaWQgYWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3Qs
IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCopOwotCiAgICAgc3RydWN0IFJ1bGVS
YW5nZSB7CiAgICAgICAgIFJ1bGVSYW5nZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQmIGxhc3RS
dWxlSW5kZXgpOiBmaXJzdFJ1bGVJbmRleChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxlSW5kZXgo
bGFzdFJ1bGVJbmRleCkgeyB9CiAgICAgICAgIGludCYgZmlyc3RSdWxlSW5kZXg7CkBAIC0zNTgs
MjkgKzM1MSwyMCBAQCBwcml2YXRlOgogICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1h
dGNoZWRSdWxlczsKICAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwogICAgICAgICBib29sIGlz
Q2FjaGVhYmxlOwotICAgIH07CiAKLSAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGll
cyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxl
UnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRj
aEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKLSAg
ICB2b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHls
ZVByb3BlcnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworICAgICAgICB2b2lkIGFk
ZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0
eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpN
YXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsK
KyAgICB9OwogCi0gICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNs
dWRlU01JTFByb3BlcnRpZXMpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0Jik7
Ci0gICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7Ci0gICAgdm9p
ZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7
Ci0gICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1
bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBmdW5j
dGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRo
ZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKKyAgICB2b2lk
IGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSk7CisgICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqLCBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3JUZXh0U2l6ZUFkanVz
dCgpOwogCi0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNv
bnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBz
dHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKIAogICAg
IGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVEYXRhJikgY29uc3Q7Ci0gICAgdm9p
ZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7Ci0gICAgdm9pZCBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVs
ZXMoTWF0Y2hSZXN1bHQmKTsKIAotICAgIGJvb2wgcnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEm
LCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmLCBTZWxlY3RvckNoZWNrZXI6
OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRh
cnkpOwotICAgIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVn
aW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwogICAgIHZvaWQgYXBwbHlNYXRj
aGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGNvbnN0IEVsZW1lbnQqKTsKICAgICBl
bnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKICNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKQEAg
LTQyOSwxMyArNDEzLDkgQEAgcHVibGljOgogICAgICAgICAsIG1fcGFyZW50Tm9kZSgwKQogICAg
ICAgICAsIG1fcGFyZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkK
LSAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKLSAgICAgICAgLCBtX3NhbWVPcmlnaW5P
bmx5KGZhbHNlKQotICAgICAgICAsIG1fcHNldWRvU3R5bGUoTk9QU0VVRE8pCiAgICAgICAgICwg
bV9lbGVtZW50TGlua1N0YXRlKE5vdEluc2lkZUxpbmspCiAgICAgICAgICwgbV9kaXN0cmlidXRl
ZFRvSW5zZXJ0aW9uUG9pbnQoZmFsc2UpCiAgICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNs
YXNzUnVsZXMoZmFsc2UpCi0gICAgICAgICwgbV9tb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2
aW5nU3R5bGUpCiAgICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSkK
ICAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpCiAjaWYg
RU5BQkxFKENTU19TSEFERVJTKQpAQCAtNDQ4LDcgKzQyOCw3IEBAIHB1YmxpYzoKIAogICAgIHB1
YmxpYzoKICAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7Ci0gICAgICAgIHZvaWQg
aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUgPSAwLCBQc2V1ZG9JZCA9IE5PUFNFVURPLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZv
clN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50
KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDApOwogICAgICAgICB2b2lk
IGNsZWFyKCk7CiAKICAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4g
bV9lbGVtZW50LT5kb2N1bWVudCgpOyB9CkBAIC00NTgsMjUgKzQzOCwxNiBAQCBwdWJsaWM6CiAg
ICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7
IH0KICAgICAgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4g
bV9zdHlsZS5yZWxlYXNlKCk7IH0KIAotICAgICAgICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJl
UnVsZUxpc3QoKTsKLSAgICAgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0
KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7IH0KLQogICAgICAgICBjb25zdCBDb250
YWluZXJOb2RlKiBwYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnROb2RlOyB9CiAg
ICAgICAgIHZvaWQgc2V0UGFyZW50U3R5bGUoUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1f
cGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsgfQogICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudFN0eWxlOyB9CiAgICAgICAgIFJlbmRlclN0
eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxl
OyB9CiAKLSAgICAgICAgY29uc3QgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29u
c3QgeyByZXR1cm4gbV9yZWdpb25Gb3JTdHlsaW5nOyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9y
aWdpbk9ubHkoYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1Nh
bWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIGJvb2wgaXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsg
cmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgUHNldWRvSWQgcHNldWRvU3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3BzZXVkb1N0eWxlOyB9CiAgICAgICAgIEVJbnNpZGVMaW5rIGVs
ZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KICAg
ICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBt
X2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQogICAgICAgICB2b2lkIHNldEVsZW1lbnRB
ZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CiAgICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVk
QnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVs
ZXM7IH0KLSAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7
IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBj
b25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAgICAgICAgCisKICAgICAgICAgdm9pZCBzZXRBcHBs
eVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRv
UmVndWxhclN0eWxlID0gaXNBcHBseTsgfQogICAgICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRl
ZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0KICAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1
bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsg
fQpAQCAtNTEwLDkgKzQ4MSw2IEBAIHB1YmxpYzoKICAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9k
ZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRX
cml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KICAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRp
b24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0
eWxlLT5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQogCi0gICAgICAgIFZl
Y3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRj
aGVkUnVsZXM7IH0KLSAgICAgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSog
cnVsZSkgeyBtX21hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7IH0KLSAgICAgICAgCiAgICAgcHJp
dmF0ZToKICAgICAgICAgLy8gRklYTUUoYnVnIDEwODU2Myk6IHRvIG1ha2UgaXQgZWFzaWVyIHRv
IHJldmlldywgdGhlc2UgbWVtYmVyCiAgICAgICAgIC8vIHZhcmlhYmxlcyBhcmUgcHVibGljLiBI
b3dldmVyIHdlIHNob3VsZCBhZGQgbWV0aG9kcyB0byBhY2Nlc3MKQEAgLTUyNCwyMiArNDkyLDE0
IEBAIHB1YmxpYzoKICAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7CiAgICAgICAg
IFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7CiAgICAgICAgIAotICAgICAgICBSZW5k
ZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3NhbWVPcmlnaW5P
bmx5OwotICAgICAgICBQc2V1ZG9JZCBtX3BzZXVkb1N0eWxlOwotCiAgICAgICAgIEVJbnNpZGVM
aW5rIG1fZWxlbWVudExpbmtTdGF0ZTsKIAogICAgICAgICBib29sIG1fZGlzdHJpYnV0ZWRUb0lu
c2VydGlvblBvaW50OwogCiAgICAgICAgIGJvb2wgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVs
ZXM7CiAKLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKLQogICAgICAgICAv
LyBBIGJ1ZmZlciB1c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIGZvciBhbiBl
bGVtZW50LAogICAgICAgICAvLyBhbmQgYSB0ZW1wb3JhcnkgYnVmZmVyIHVzZWQgZm9yIG1lcmdl
IHNvcnRpbmcuCi0gICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiBtX21hdGNoZWRS
dWxlczsKLSAgICAgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OwogCiAg
ICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7CiAgICAgICAgIGJvb2wg
bV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOwpAQCAtNjc5LDYgKzYzOSwxOSBAQCBp
bmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0
cmluZyYgaWRWYWx1ZSkgY29uc3QKICAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlk
c0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwogfQogCitpbmxpbmUgYm9vbCBjaGVj
a1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVu
dCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICBpZiAoIXJlZ2lvblNlbGVjdG9yIHx8ICFyZWdpb25F
bGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTZWxlY3RvckNoZWNrZXIgc2Vs
ZWN0b3JDaGVja2VyKHJlZ2lvbkVsZW1lbnQtPmRvY3VtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6
UXVlcnlpbmdSdWxlcyk7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNl
bGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKQorICAgICAgICBpZiAoc2Vs
ZWN0b3JDaGVja2VyLm1hdGNoZXMocywgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQogCiAjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>189469</attachid>
            <date>2013-02-21 00:52:37 -0800</date>
            <delta_ts>2013-02-21 23:38:21 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>bug-109916-20130221174857.patch</filename>
            <type>text/plain</type>
            <size>99307</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQzNTU4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYzhlMTE2ZGNlN2YxMzQ5
YjVkYzA1MzBjNzFiYjMxZGFlNWMzYTZkOS4uNDVmZDQ1Y2Y3YWU3ZmNhNzIwYTVmZmE0Y2M1NTM2
YmY5NGFmMDU4MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyNCBAQAorMjAxMy0wMi0yMSAgVGFr
YXNoaSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5n
XSBJbXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1l
bnQgYW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4g
Y2xhc3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAg
YSBzdHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3Rvcmlu
Zy4KKworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxp
c3QuYW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6Cisg
ICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNz
cy9DU1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFu
ZCBQYWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6bGVmdFRv
UmlnaHREZWNsYXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpyaWdodFRvTGVmdERlY2xhcmF0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUmVz
dWx0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUnVs
ZUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFkZE1hdGNo
ZWRSdWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjbGVhck1h
dGNoZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5z
dXJlUnVsZUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMpOgorICAgICAgICAoTWF0Y2hpbmdVQVJ1bGVzU2NvcGUp
OgorICAgICAgICAoV2ViQ29yZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxl
c1Njb3BlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hp
bmdVQVJ1bGVzU2NvcGUpOgorICAgICAgICAoV2ViQ29yZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6
OmlzTWF0Y2hpbmdVQVJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVj
dG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVs
ZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyk6
CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29wZWRBdXRo
b3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hI
b3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNo
QXV0aG9yUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1h
dGNoVXNlclJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpt
YXRjaFVBUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnJ1
bGVNYXRjaGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZVJ1bGVz
KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0TWF0Y2hlZFJ1
bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEFsbFJ1
bGVzKToKKyAgICAgICAgTW92ZWQgdGhlc2UgbWV0aG9kcyBmcm9tIFN0eWxlUmVzb2x2ZXIgdG8g
dGhpcyBjbGFzcy4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpoYXNB
bnlNYXRjaGluZ1J1bGVzKToKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgY2hlY2tp
bmcgd2hldGhlciBhIGdpdmVuIGVsZW1lbnQgY2FuIHNoYXJlCisgICAgICAgIGEgY2FjaGUuCisg
ICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChFbGVtZW50UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBV
c2Ugc3R5bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFi
bGVzLCBpLmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NT
T01XcmFwcGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNldWRvU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNldFNhbWVPcmlnaW5Pbmx5KToKKyAgICAgICAgKFdl
YkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzZXRSZWdpb25Gb3JTdHlsaW5nKToKKyAgICAg
ICAgTW9kZSwgU2FtZU9yaWdpbk9ubHksIFJlZ2lvbkZvclN0eWxpbmcgYXJlIG9ubHkgdXNlZCB3
aGlsZSBjb2xsZWN0aW5nCisgICAgICAgIG1hdGNoZWQgcnVsZXMuCisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TWVkaXVtKToKKyAgICAgICAgTmVlZCB0byBrbm93
IHdoaWNoIGRlZmF1bHQgc3R5bGVzaGVldCBzaG91bGQgYmUgbG9va2VkIHVwLgorICAgICAgICAo
V2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmRvY3VtZW50KToKKyAgICAgICAgKiBjc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rv
cjo6UGFnZVJ1bGVDb2xsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0
b3I6Om1hdGNoZWRSZXN1bHQpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OmlzUmlnaHRQYWdlKToKKyAgICAgICAgKiBjc3MvU3R5bGVSZXNvbHZlci5jcHA6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVh
cik6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdDo6YWRkTWF0
Y2hlZFByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmluaXRGb3JTdHlsZVJlc29sdmUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6
c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNv
bHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yUGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpw
c2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIu
aDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAg
ICAgICAgQWRkZWQgdG8gb2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVj
dG9yJ3MgY29uc3RydWN0b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1h
dGNoUmVzdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0
ZSk6CisgICAgICAgIFRvIHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVy
dGllcywgbmVlZCB0byBrZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAg
KFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckNTU0FnZW50Ojp3aWxsTWF0Y2hSdWxlKToKKyAg
ICAgICAgUmVtb3ZlZCBTdHlsZVJlc29sdmVyIGZyb20gaXRzIHBhcmFtZXRlciBsaXN0LiBJbnN0
ZWFkLCBhZGRlZAorICAgICAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzIGFuZCBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2Vu
dC5oOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChJbnNwZWN0b3JDU1NBZ2VudCk6Cisg
ICAgICAgICogaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHA6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZUltcGwpOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZSk6CisKIDIwMTMtMDItMjAgIFRha2FzaGkgU2FrYW1vdG8gIDx0YXNha0Bn
b29nbGUuY29tPgogCiAgICAgICAgIFtSZWZhY3RvcmluZ10gTWFrZSBtX3N0YXRlIGFuIG9uLXN0
YWNrIG9iamVjdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQgYi9T
b3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAppbmRleCAzZjg5YTBlYzJlOTVjMzMxNGMwYjJi
ODUxYmVhY2ZlOGYwNTFmYTE0Li4xNmUyYzg3ZGY5ZjkwNGFlNWZiNDg4YjBkYWZkMmE1Yjg3ZWIx
Y2M2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dApAQCAtMTA2OCw2ICsxMDY4LDcgQEAgc2V0KFdlYkNv
cmVfU09VUkNFUwogICAgIGNzcy9DU1NWYWx1ZVBvb2wuY3BwCiAgICAgY3NzL0RPTVdpbmRvd0NT
Uy5jcHAKICAgICBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAKKyAgICBjc3MvRWxlbWVudFJ1bGVD
b2xsZWN0b3IuY3BwCiAgICAgY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwCiAgICAgY3NzL0ZvbnRW
YWx1ZS5jcHAKICAgICBjc3MvSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAKQEAgLTEwODAsNiAr
MTA4MSw3IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3MvTWVkaWFRdWVyeUxpc3QuY3Bw
CiAgICAgY3NzL01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuY3BwCiAgICAgY3NzL01lZGlhUXVlcnlN
YXRjaGVyLmNwcAorICAgIGNzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKICAgICBjc3MvUHJvcGVy
dHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcAogICAgIGNzcy9SR0JDb2xvci5jcHAKICAgICBj
c3MvUnVsZUZlYXR1cmUuaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUu
bGlzdC5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KaW5kZXggNjFmNDFi
YzQyMmUxOTRjOTFmOWQ1ZGY0OTA5MTk0YTZmZGVlNmQwYi4uN2M5Mjg3NjMzMzgxZTIxNDQxZjAx
NjlhNTE4MjU1NjY5NGRjYjg5YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZp
bGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCkBAIC0y
NjUyLDYgKzI2NTIsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJDb3JlL2Nz
cy9EYXNoYm9hcmRSZWdpb24uaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50UnVsZVNl
dHMuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oIFwKKwlTb3Vy
Y2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIFwKKwlTb3VyY2UvV2ViQ29y
ZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL0ZvbnRG
ZWF0dXJlVmFsdWUuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udEZlYXR1cmVWYWx1ZS5o
IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udFZhbHVlLmNwcCBcCkBAIC0yNjc2LDYgKzI2Nzgs
OCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5
TGlzdExpc3RlbmVyLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5j
cHAgXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5oIFwKKwlTb3VyY2Uv
V2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIFwKKwlTb3VyY2UvV2ViQ29yZS9jc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL1BhaXIuaCBcCiAJU291
cmNlL1dlYkNvcmUvY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgXAogCVNv
dXJjZS9XZWJDb3JlL2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uaCBcCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpIGIvU291cmNlL1dlYkNvcmUvVGFyZ2V0
LnByaQppbmRleCA5YTA5YTA0NjA0OGY3MjQ1M2M0MjVhYWYyM2RhMjRhMTg5NDU4N2UwLi4yZDJk
NGMwZDdiOGE3YjcyMWIwOWUzOGVjYjE0YWZkNTM4MjkxOGM2IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9UYXJnZXQucHJpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKQEAgLTMw
Nyw2ICszMDcsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBjc3MvQ1NTVmFsdWVQb29sLmNwcCBcCiAg
ICAgY3NzL0RPTVdpbmRvd0NTUy5jcHAgXAogICAgIGNzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCBc
CisgICAgY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCBcCiAgICAgY3NzL0ZvbnRGZWF0dXJl
VmFsdWUuY3BwIFwKICAgICBjc3MvRm9udFZhbHVlLmNwcCBcCiAgICAgY3NzL0luc3BlY3RvckNT
U09NV3JhcHBlcnMuY3BwIFwKQEAgLTMxOSw2ICszMjAsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBj
c3MvTWVkaWFRdWVyeUxpc3QuY3BwIFwKICAgICBjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5j
cHAgXAogICAgIGNzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5jcHAgXAorICAgIGNzcy9QYWdlUnVsZUNv
bGxlY3Rvci5jcHAgXAogICAgIGNzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3Bw
IFwKICAgICBjc3MvUkdCQ29sb3IuY3BwIFwKICAgICBjc3MvUnVsZUZlYXR1cmUuY3BwIFwKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUuZ3lwaQppbmRleCBmNzc0NDQ1NDVhYjFiMTI5ZDBkOTMwZTQzYTQyZjk1NTVmOWFhYzc2
Li5kMDQ5MTQ1NWY0YjgzN2QzZTIxZDUxNzFiMTM1YjI5MjViZWE3ZjVlIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5n
eXBpCkBAIC0xNTUzLDYgKzE1NTMsOCBAQAogICAgICAgICAgICAgJ2Nzcy9EYXNoYm9hcmRSZWdp
b24uaCcsCiAgICAgICAgICAgICAnY3NzL0RvY3VtZW50UnVsZVNldHMuY3BwJywKICAgICAgICAg
ICAgICdjc3MvRG9jdW1lbnRSdWxlU2V0cy5oJywKKyAgICAgICAgICAgICdjc3MvRWxlbWVudFJ1
bGVDb2xsZWN0b3IuY3BwJywKKyAgICAgICAgICAgICdjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
aCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwJywKICAgICAgICAgICAg
ICdjc3MvRm9udEZlYXR1cmVWYWx1ZS5oJywKICAgICAgICAgICAgICdjc3MvRm9udFZhbHVlLmNw
cCcsCkBAIC0xNTc2LDYgKzE1NzgsOCBAQAogICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TGlz
dExpc3RlbmVyLmgnLAogICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5jcHAnLAog
ICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5oJywKKyAgICAgICAgICAgICdjc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwJywKKyAgICAgICAgICAgICdjc3MvUGFnZVJ1bGVDb2xsZWN0
b3IuaCcsCiAgICAgICAgICAgICAnY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5j
cHAnLAogICAgICAgICAgICAgJ2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uaCcs
CiAgICAgICAgICAgICAnY3NzL1JHQkNvbG9yLmNwcCcsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggZmY3ZjQ5MTU1YjMwOWE5NzQ0
MzkzNGZjMTJiOTVmNThmNDcwNjIzNC4uOGNiZTM2Njk0ZTI5NjVjZGM0ZjUwYzMxNzRkMzQ1ZTkz
ODQxZWFhNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagpAQCAtNjUzMSw2ICs2NTMxLDEwIEBACiAJCUZCRDZBRjhCMTVFRjI1RTUwMDhC
NzExMCAvKiBDU1NCYXNpY1NoYXBlcy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGQkQ2QUY4NjE1RUYyMUQ0MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFw
ZXMuY3BwICovOyB9OwogCQlGQkQ2QUY4QzE1RUYyNjA0MDA4QjcxMTAgLyogQmFzaWNTaGFwZXMu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCRDZBRjgz
MTVFRjIxQTMwMDhCNzExMCAvKiBCYXNpY1NoYXBlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUZCRDZBRjhEMTVFRjI2MEEwMDhCNzExMCAvKiBC
YXNpY1NoYXBlcy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGQkQ2QUY4MjE1RUYyMUEzMDA4QjcxMTAgLyogQmFzaWNTaGFwZXMuY3BwICovOyB9Owor
CQlGQkRCNjE5QjE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJEQjYxOUExNkQ2
MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCAqLzsgfTsKKwkJRkJEQjYx
OUQxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MTlDMTZENjAzNDYwMEJCMzM5
NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgKi87IH07CisJCUZCREI2MTlGMTZENjAzNjUwMEJC
MzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRkJEQjYxOUUxNkQ2MDM2NTAwQkIzMzk0IC8qIEVsZW1lbnRS
dWxlQ29sbGVjdG9yLmggKi87IH07CisJCUZCREI2MUExMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdl
UnVsZUNvbGxlY3Rvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRkJEQjYxQTAxNkQ2MDM3RTAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggKi87
IH07CiAJCUZCRjg5MDQ1MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NHcm91cGluZ1J1bGUuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJGODkwNDQxNjlF
OUYxRjAwNTJEODZFIC8qIENTU0dyb3VwaW5nUnVsZS5jcHAgKi87IH07CiAJCUZDNTREMDU3MTZB
NzY3MzEwMDU3NUU0RCAvKiBDU1NTdXBwb3J0c1J1bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZDNjNCREIxMTY3QUFCQUMwMEY5MzgwRiAvKiBDU1NT
dXBwb3J0c1J1bGUuaCAqLzsgfTsKIAkJRkM1NEQwNTgxNkE3Njc2RTAwNTc1RTREIC8qIEpTQ1NT
U3VwcG9ydHNSdWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGQzg0ODAyRTE2N0FCNDQ0MDA4Q0QxMDAgLyogSlNDU1NTdXBwb3J0c1J1bGUuaCAqLzsg
fTsKQEAgLTE0MjU2LDYgKzE0MjYwLDEwIEBACiAJCUZCRDZBRjg1MTVFRjIxRDQwMDhCNzExMCAv
KiBCYXNpY1NoYXBlRnVuY3Rpb25zLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEJhc2ljU2hhcGVGdW5jdGlvbnMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkJE
NkFGODYxNUVGMjFENDAwOEI3MTEwIC8qIENTU0Jhc2ljU2hhcGVzLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU0Jhc2ljU2hhcGVzLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJRkJENkFGODcxNUVGMjFENDAwOEI3MTEwIC8qIENTU0Jhc2ljU2hh
cGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENTU0Jhc2ljU2hhcGVzLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZCREI2MTlBMTZENjAzMkEwMEJCMzM5NCAv
KiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUZCREI2MTlDMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQYWdlUnVsZUNvbGxlY3Rvci5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZCREI2MTlFMTZENjAzNjUwMEJCMzM5
NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBFbGVtZW50UnVsZUNvbGxlY3Rvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQlGQkRCNjFBMDE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUGFnZVJ1bGVDb2xsZWN0b3IuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkJGODkwNDQxNjlFOUYxRjAwNTJEODZFIC8qIENTU0dyb3Vw
aW5nUnVsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NHcm91
cGluZ1J1bGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQzYzQkRCMDE2N0FB
QkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IENTU1N1cHBvcnRzUnVsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCUZDNjNCREIxMTY3QUFCQUMwMEY5MzgwRiAvKiBDU1NTdXBwb3J0c1J1bGUuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ1NTU3VwcG9ydHNSdWxlLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yMjA1OSw2ICsyMjA2Nyw4IEBACiAJCQkJRkM5QTBG
NzExNjQwOTRDRjAwM0Q2QjhEIC8qIERPTVdpbmRvd0NTUy5jcHAgKi8sCiAJCQkJRkM5QTBGNzIx
NjQwOTRDRjAwM0Q2QjhEIC8qIERPTVdpbmRvd0NTUy5oICovLAogCQkJCUZDOUEwRjczMTY0MDk0
Q0YwMDNENkI4RCAvKiBET01XaW5kb3dDU1MuaWRsICovLAorCQkJCUZCREI2MTlFMTZENjAzNjUw
MEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oICovLAorCQkJCUZCREI2MTlBMTZENjAz
MkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgKi8sCiAJCQkJNEE2RTlGQzIx
M0MxN0QxRDAwNDZBN0Y4IC8qIEZvbnRGZWF0dXJlVmFsdWUuaCAqLywKIAkJCQlBODBFNkNDNzBB
MTk4OUNBMDA3RkI4QzUgLyogRm9udFZhbHVlLmNwcCAqLywKIAkJCQlBODBFNkNDMzBBMTk4OUNB
MDA3RkI4QzUgLyogRm9udFZhbHVlLmggKi8sCkBAIC0yMjA5NCw2ICsyMjEwNCw4IEBACiAJCQkJ
RDNBOTRBMzUxMjJEQUJBQzAwQTM3QkJDIC8qIE1lZGlhUXVlcnlMaXN0TGlzdGVuZXIuaWRsICov
LAogCQkJCUQzQUExMEYxMTIzQTk4QUEwMDkyMTUyQiAvKiBNZWRpYVF1ZXJ5TWF0Y2hlci5jcHAg
Ki8sCiAJCQkJRDNBQTEwRjIxMjNBOThBQTAwOTIxNTJCIC8qIE1lZGlhUXVlcnlNYXRjaGVyLmgg
Ki8sCisJCQkJRkJEQjYxQTAxNkQ2MDM3RTAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmgg
Ki8sCisJCQkJRkJEQjYxOUMxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNw
cCAqLywKIAkJCQlBODBFNkNEMTBBMTk4OUNBMDA3RkI4QzUgLyogUGFpci5oICovLAogCQkJCTMx
ODlFNkRCMTZCMjEwMzUwMDM4NkVBMyAvKiBwbHVnSW5zLmNzcyAqLywKIAkJCQlFNEJCRUQwQzE0
RjQwMjVEMDAzRjBCOTggLyogUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCAqLywK
QEAgLTI2NjA4LDYgKzI2NjIwLDggQEAKIAkJCQk5NzdFMkUwRjEyRjBGQzlDMDBDMTMzNzkgLyog
WFNTQXVkaXRvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTc3RTJFMEYxMkYwRkM5QzAwQzEzMzgw
IC8qIFhTU0F1ZGl0b3JEZWxlZ2F0ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRkQ1MzczNTMxMzdC
NjUxODAwMDA4RENFIC8qIFplcm9Qb2xlLmggaW4gSGVhZGVycyAqLywKKwkJCQlGQkRCNjE5RjE2
RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovLAor
CQkJCUZCREI2MUExMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oIGluIEhl
YWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9
IDA7CiAJCX07CkBAIC0yOTgwMyw2ICsyOTgxNyw4IEBACiAJCQkJOTc3RTJFMEUxMkYwRkM5QzAw
QzEzMzc5IC8qIFhTU0F1ZGl0b3IuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTc3RTJFMEUxMkYw
RkM5QzAwQzEzMzgwIC8qIFhTU0F1ZGl0b3JEZWxlZ2F0ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQlGRDUzNzM1MjEzN0I2NTE4MDAwMDhEQ0UgLyogWmVyb1BvbGUuY3BwIGluIFNvdXJjZXMgKi8s
CisJCQkJRkJEQjYxOUIxNkQ2MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVs
ZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95
bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L2Nzcy9DU1NBbGxJbk9uZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUuY3Bw
CmluZGV4IDA5YTU0M2IzZWU2NGY4MjgxNGEzNzVjOGU1ZTlmMTA3ZWUxOThmNmQuLjE3N2Y4NjEw
ODQ5OTM3YmI0MzMxYTllZWNiMWEwMWE5NWVhNzM4YzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2Nzcy9DU1NBbGxJbk9uZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU0FsbElu
T25lLmNwcApAQCAtNzEsNyArNzEsOSBAQAogI2luY2x1ZGUgIkNTU1ZhbHVlUG9vbC5jcHAiCiAj
aW5jbHVkZSAiRE9NV2luZG93Q1NTLmNwcCIKICNpbmNsdWRlICJEb2N1bWVudFJ1bGVTZXRzLmNw
cCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAiCiAjaW5jbHVkZSAiSW5zcGVj
dG9yQ1NTT01XcmFwcGVycy5jcHAiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIgog
I2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmNwcCIKICNpbmNsdWRlICJSdWxlU2V0LmNwcCIKICNpbmNs
dWRlICJTZWxlY3RvckZpbHRlci5jcHAiCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3Mv
RWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIGIvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxl
Q29sbGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lN2EyYjA2Y2ZlNDcxNzc3ZmRhMmVlOWVkMzcyMWYx
YThkMDI2MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRS
dWxlQ29sbGVjdG9yLmNwcApAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDA0LTIw
MDUgQWxsYW4gU2FuZGZlbGQgSmVuc2VuIChrZGVAY2FyZXdvbGYuY29tKQorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3IE5pY2hvbGFzIFNoYW5rcyAod2Via2l0QG5pY2tzaGFua3MuY29tKQor
ICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAwNyBBbGV4ZXkgUHJvc2t1cnlha292IDxhcEB3ZWJraXQub3JnPgorICogQ29weXJp
Z2h0IChDKSAyMDA3LCAyMDA4IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtpdC5vcmc+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMDgsIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4gKGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29tLykKKyAqIENvcHlyaWdodCAoYykgMjAxMSwg
Q29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkVsZW1lbnRSdWxlQ29sbGVjdG9yLmgiCisKKyNp
bmNsdWRlICJDU1NEZWZhdWx0U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJDU1NSdWxlLmgiCisj
aW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgorI2luY2x1
ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNp
bmNsdWRlICJIVE1MRWxlbWVudC5oIgorI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgorI2luY2x1
ZGUgIlNWR0VsZW1lbnQuaCIKKyNpbmNsdWRlICJTaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ2llcy5o
IgorI2luY2x1ZGUgIlN0eWxlZEVsZW1lbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitz
dGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpCit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIGxlZnRUb1JpZ2h0
RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7CisgICAgaWYgKGxlZnRUb1JpZ2h0
RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICBsZWZ0VG9SaWdodERlY2wtPnNldFByb3BlcnR5KENT
U1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7CisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0
RGVjbC5nZXQoKTsKK30KKworc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIHJpZ2h0VG9MZWZ0RGVj
bGFyYXRpb24oKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVy
dHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKSkpOwor
ICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHkoKSkKKyAgICAgICAgcmlnaHRUb0xlZnRE
ZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVSdGwpOworICAg
IHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Cit9CisKK1N0eWxlUmVzb2x2ZXI6Ok1hdGNo
UmVzdWx0JiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3VsdCgpCit7CisgICAgQVNT
RVJUKG1fbW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKyAgICByZXR1
cm4gbV9yZXN1bHQ7Cit9CisKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IEVsZW1lbnRSdWxlQ29s
bGVjdG9yOjptYXRjaGVkUnVsZUxpc3QoKQoreworICAgIEFTU0VSVChtX21vZGUgPT0gU2VsZWN0
b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOworICAgIHJldHVybiBtX3J1bGVMaXN0LnJlbGVh
c2UoKTsKK30KKworaW5saW5lIHZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFkZE1hdGNoZWRS
dWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKQoreworICAgIGlmICghbV9tYXRjaGVkUnVsZXMpCisg
ICAgICAgIG1fbWF0Y2hlZFJ1bGVzID0gYWRvcHRQdHIobmV3IFZlY3Rvcjxjb25zdCBSdWxlRGF0
YSosIDMyPik7CisgICAgbV9tYXRjaGVkUnVsZXMtPmFwcGVuZChydWxlKTsKK30KKworaW5saW5l
IHZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNsZWFyTWF0Y2hlZFJ1bGVzKCkKK3sKKyAgICBp
ZiAoIW1fbWF0Y2hlZFJ1bGVzKQorICAgICAgICByZXR1cm47CisgICAgbV9tYXRjaGVkUnVsZXMt
PmNsZWFyKCk7Cit9CisKK2lubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogRWxlbWVudFJ1bGVDb2xs
ZWN0b3I6OmVuc3VyZVJ1bGVMaXN0KCkKK3sKKyAgICBpZiAoIW1fcnVsZUxpc3QpCisgICAgICAg
IG1fcnVsZUxpc3QgPSBTdGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1f
cnVsZUxpc3QuZ2V0KCk7Cit9CisKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnR5
U2V0LCBib29sIGlzQ2FjaGVhYmxlKQoreworICAgIGlmICghcHJvcGVydHlTZXQpCisgICAgICAg
IHJldHVybjsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCk7CisgICAgaWYgKG1fcmVzdWx0LnJhbmdlcy5maXJzdEF1
dGhvclJ1bGUgPT0gLTEpCisgICAgICAgIG1fcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUg
PSBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7CisgICAgbV9yZXN1bHQuYWRkTWF0Y2hl
ZFByb3BlcnRpZXMocHJvcGVydHlTZXQpOworICAgIGlmICghaXNDYWNoZWFibGUpCisgICAgICAg
IG1fcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Cit9CisKK2NsYXNzIE1hdGNoaW5nVUFSdWxl
c1Njb3BlIHsKK3B1YmxpYzoKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOworICAgIH5NYXRj
aGluZ1VBUnVsZXNTY29wZSgpOworCisgICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMo
KTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKK307CisK
K01hdGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgQVNT
RVJUKCFtX21hdGNoaW5nVUFSdWxlcyk7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwor
fQorCitNYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKK3sKKyAg
ICBtX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBNYXRjaGluZ1VB
UnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQoreworICAgIHJldHVybiBtX21hdGNoaW5n
VUFSdWxlczsKK30KKworYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVs
ZXMgPSBmYWxzZTsKKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5n
UnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1
bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIEFTU0VSVChtYXRjaFJlcXVlc3QucnVsZVNldCk7
CisgICAgQVNTRVJUKG1fc3RhdGUuZWxlbWVudCgpKTsKKworICAgIFN0eWxlUmVzb2x2ZXI6OlN0
YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1l
bnQoKTsKKyAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5
bGVkRWxlbWVudCgpOworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50
LT5zaGFkb3dQc2V1ZG9JZCgpOworICAgIGlmICghcHNldWRvSWQuaXNFbXB0eSgpKSB7CisgICAg
ICAgIEFTU0VSVChzdHlsZWRFbGVtZW50KTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQc2V1ZG9FbGVtZW50UnVsZXMocHNl
dWRvSWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworI2lmIEVO
QUJMRShWSURFT19UUkFDSykKKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkpCisg
ICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+
Y3VlUHNldWRvUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2VuZGlmCisgICAg
Ly8gQ2hlY2sgd2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxlcyBhcmUgYXBwbGljYWJsZSBpbiB0
aGUgY3VycmVudCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3IgdGhpczoKKyAgICAvLyBhKSBpdCdz
IGEgVUEgcnVsZQorICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93cyBhdXRob3IgcnVsZXMK
KyAgICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBzdHlsZSBzaGVldCB3aXRo
aW4gdGhlIHNhbWUgdHJlZSBzY29wZQorICAgIFRyZWVTY29wZSogdHJlZVNjb3BlID0gZWxlbWVu
dC0+dHJlZVNjb3BlKCk7CisgICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGlu
Z1VBUnVsZXMoKQorICAgICAgICAmJiAhdHJlZVNjb3BlLT5hcHBseUF1dGhvclN0eWxlcygpCisg
ICAgICAgICYmICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1hdGNoUmVxdWVzdC5zY29wZS0+dHJl
ZVNjb3BlKCkgIT0gdHJlZVNjb3BlKQorICAgICAgICAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JB
dEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFdlIG5lZWQgdG8gY29sbGVjdCB0aGUgcnVsZXMgZm9yIGlk
LCBjbGFzcywgdGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGludG8gYSBidWZmZXIgYW5kCisgICAg
Ly8gdGhlbiBzb3J0IHRoZSBidWZmZXIuCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkpCisgICAg
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+aWRS
dWxlcyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKKyAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBzdHlsZWRFbGVtZW50LT5o
YXNDbGFzcygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3R5bGVkRWxlbWVu
dC0+Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQorICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1bGVzKHN0eWxlZEVsZW1l
bnQtPmNsYXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cisg
ICAgfQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQorICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmxpbmtQc2V1ZG9DbGFzc1J1bGVz
KCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjpt
YXRjaGVzRm9jdXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1BzZXVkb0NsYXNzUnVsZXMo
KSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9y
TGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVudC0+bG9jYWxOYW1lKCku
aW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1
bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2FsUnVsZXMoKSwgbWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVz
dCwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYgKCFtX3Jl
Z2lvbkZvclN0eWxpbmcpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIHNpemUgPSBt
YXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25z
dCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKKyAgICAgICAgaWYgKGNo
ZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPiht
X3JlZ2lvbkZvclN0eWxpbmctPm5vZGUoKSkpKSB7CisgICAgICAgICAgICBSdWxlU2V0KiByZWdp
b25SdWxlcyA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVT
ZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCk7CisgICAgICAgICAgICBBU1NFUlQocmVnaW9uUnVsZXMp
OworICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJlZ2lvblJ1
bGVzLCBtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdC5zY29wZSks
IHJ1bGVSYW5nZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xs
ZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcygpCit7CisgICAgU3R5bGVSZXNvbHZl
cjo6U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGlmICghbV9tYXRjaGVkUnVsZXMgfHwg
bV9tYXRjaGVkUnVsZXMtPmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc29ydE1h
dGNoZWRSdWxlcygpOworCisgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVk
UnVsZXMgPSAqbV9tYXRjaGVkUnVsZXM7CisgICAgaWYgKG1fbW9kZSA9PSBTZWxlY3RvckNoZWNr
ZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bWF0Y2hlZFJ1bGVzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgZW5zdXJlUnVsZUxpc3QoKS0+
cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNyZWF0ZUNTU09NV3JhcHBl
cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdyB0cmFuc2ZlciB0aGUg
c2V0IG9mIG1hdGNoZWQgcnVsZXMgb3ZlciB0byBvdXIgbGlzdCBvZiBkZWNsYXJhdGlvbnMuCisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkrKykgewor
ICAgICAgICBpZiAoc3RhdGUuc3R5bGUoKSAmJiBtYXRjaGVkUnVsZXNbaV0tPmNvbnRhaW5zVW5j
b21tb25BdHRyaWJ1dGVTZWxlY3RvcigpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VW5pcXVlKCk7CisgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoZWRS
dWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBt
YXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0
eVdoaXRlbGlzdFR5cGUoKSk7CisgICAgfQorfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYg
RU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgaWYgKCFtX3Nj
b3BlUmVzb2x2ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIHNjb3BlZCBhdXRo
b3IgcnVsZXMgYnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3RhY2sgKHJlYnVpbGQg
aXQgaWYgaXQgZ290IGluY29uc2lzdGVudCkuCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlci0+aGFz
U2NvcGVkU3R5bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFja0NvbnNpc3RlbmN5
KG1fc3RhdGUuZWxlbWVudCgpKSkgeworICAgICAgICBib29sIGFwcGx5QXV0aG9yU3R5bGVzID0g
bV9zdGF0ZS5lbGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0eWxlcygpOworICAg
ICAgICBib29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBzY29wZVNp
emUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgc2NvcGVTaXplOyArK2kpIHsKKyAgICAgICAgICAgIGNsZWFyTWF0Y2hlZFJ1
bGVzKCk7CisgICAgICAgICAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgICAgICAgICBjb25zdCBT
dHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5z
dGFja0ZyYW1lQXQoaSk7CisgICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29w
ZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgICAgIGlmIChk
b2N1bWVudFNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykK
KyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJh
bWUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1
ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAgICAgICAgIFN0eWxlUmVzb2x2ZXI6
OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7
CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7CisgICAgICAgICAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMo
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1hdGNoSG9zdFJ1bGVzKGluY2x1ZGVFbXB0eVJ1
bGVzKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRp
ZgorfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEhvc3RSdWxlcyhib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIEFTU0VSVCht
X3Njb3BlUmVzb2x2ZXIpOworCisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICBtX3Jlc3Vs
dC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXpl
KCkgLSAxOworCisgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7CisgICAgbV9zY29w
ZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVz
KTsKKyAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewor
ICAgICAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0gbV9yZXN1bHQucmFu
Z2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRj
aFJlcXVlc3QobWF0Y2hlZFJ1bGVzLmF0KGktMSksIGluY2x1ZGVFbXB0eVJ1bGVzLCBtX3N0YXRl
LmVsZW1lbnQoKSksIHJ1bGVSYW5nZSk7CisgICAgfQorICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcygpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOwor
I2VuZGlmCit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoQXV0aG9yUnVsZXMo
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBjbGVhck1hdGNoZWRSdWxlcygpOworICAg
IG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0
aWVzLnNpemUoKSAtIDE7CisKKyAgICBpZiAoIW1fc3RhdGUuZWxlbWVudCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBNYXRjaCBnbG9iYWwgYXV0aG9yIHJ1bGVzLgorICAgIE1hdGNoUmVx
dWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpbmNsdWRlRW1wdHlS
dWxlcyk7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0
LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRj
aFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24o
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIFZl
Y3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7CisgICAgbV9ydWxlU2V0cy5zaGFkb3dE
aXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMs
IG1hdGNoUmVxdWVzdHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0
cy5zaXplKCk7ICsraSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0
c1tpXSwgcnVsZVJhbmdlKTsKKyNlbmRpZgorICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cygpOworCisgICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcyk7Cit9
CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVXNlclJ1bGVzKGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpCit7CisgICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQorICAgICAg
ICByZXR1cm47CisgICAgCisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKworICAgIG1fcmVzdWx0
LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxOworICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5bGUo
KSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxl
UmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRj
aGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0QW5kVHJh
bnNmZXJNYXRjaGVkUnVsZXMoKTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0
Y2hVQVJ1bGVzKCkKK3sKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSBzY29wZTsKKworICAgIC8v
IEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYg
KENTU0RlZmF1bHRTdHlsZVNoZWV0czo6c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCisgICAgICAg
IG1fcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7CisgICAgUnVsZVNldCogdXNlckFnZW50U3R5
bGVTaGVldCA9IG1faXNQcmludFN0eWxlCisgICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxl
OworICAgIG1hdGNoVUFSdWxlcyh1c2VyQWdlbnRTdHlsZVNoZWV0KTsKKworICAgIC8vIEluIHF1
aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVl
dC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCisgICAgICAgIG1hdGNoVUFS
dWxlcyhDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7CisKKyAgICAv
LyBJZiBkb2N1bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9k
ZSBvciBpbiB4bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZp
ZXcgc291cmNlIHN0eWxlIHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2Uo
KSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJj
ZVN0eWxlKCkpOworfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFVBUnVsZXMo
UnVsZVNldCogcnVsZXMpCit7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICAKKyAgICBt
X3Jlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKSAtIDE7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVz
dWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNo
UmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMoKTsKK30KKworaW5saW5lIGJvb2wgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OnJ1bGVNYXRj
aGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUs
IFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3Vu
ZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCit7CisgICAgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0
YXRlID0gbV9zdGF0ZTsKKworICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0
b3IoKSkgeworICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVk
ZSBhbnkgcHNldWRvIGVsZW1lbnRzLgorICAgICAgICBpZiAobV9wc2V1ZG9TdHlsZSAhPSBOT1BT
RVVETykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gV2Uga25vdyBhIHN1
ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkgYmVj
YXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxlIGhhc2guCisgICAgICAgIC8vIFRoaXMgaXMg
bGltaXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFtZXNw
YWNlLgorICAgICAgICBpZiAocnVsZURhdGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGluZ0hU
TUxCYXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkg
eworICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQorICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChydWxlRGF0
YS5zZWxlY3RvcigpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9yQ2hl
Y2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCktPnRh
Z1FOYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIVNlbGVj
dG9yQ2hlY2tlcjo6ZmFzdENoZWNrUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3Ioc3RhdGUuZWxl
bWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICByZXR1cm4gU2VsZWN0b3JDaGVja2VyOjpmYXN0Q2hlY2socnVsZURhdGEuc2Vs
ZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKKyAgICB9CisKKyAgICAvLyBTbG93IHBhdGguCisg
ICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX21vZGUpOwor
ICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxl
RGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRl
ZE1hdGNoRW5hYmxlZCk7CisgICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgp
OworICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVkb1N0eWxlID0g
bV9wc2V1ZG9TdHlsZTsKKyAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2aW9y
QXRCb3VuZGFyeTsKKyAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JD
aGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxT
dHJhdGVneSgpKTsKKyAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1h
dGNoZXMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobV9wc2V1ZG9TdHlsZSAhPSBO
T1BTRVVETyAmJiBtX3BzZXVkb1N0eWxlICE9IGR5bmFtaWNQc2V1ZG8pCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rv
cjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1
bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgU3R5bGVSZXNvbHZlcjo6UnVs
ZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICAvLyBJbiBz
b21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9tIGVsZW1l
bnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZlLgorICAgIC8vIEFu
Y2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUgaW4gdGhhdCBjYXNl
IGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICBib29sIGNhblVzZUZhc3RSZWpl
Y3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVu
dE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3RvckNo
ZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OworCisgICAgdW5zaWduZWQgc2l6ZSA9IHJ1bGVz
LT5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAg
ICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7CisgICAgICAgIGlm
IChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNlbGVjdG9y
PFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5kYW50U2Vs
ZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOworICAgICAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVycywg
ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKSk7CisgICAgICAgIFBzZXVkb0lkIGR5
bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRh
LCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQc2V1ZG8sIG1hdGNoUmVxdWVzdC5iZWhhdmlv
ckF0Qm91bmRhcnkpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVy
dGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2RlLgorICAg
ICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3Bl
cnRpZXMoKTsKKyAgICAgICAgICAgIGlmICghcHJvcGVydGllcyB8fCAocHJvcGVydGllcy0+aXNF
bXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMpKSB7CisgICAgICAgICAg
ICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxz
ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAvLyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMg
QVBJIHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVkZWQuCisgICAgICAgICAg
ICBpZiAobV9zYW1lT3JpZ2luT25seSAmJiAhcnVsZURhdGEuaGFzRG9jdW1lbnRTZWN1cml0eU9y
aWdpbigpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRN
YXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBub3JtYWwgcnVsZXMs
IHNldCBhIHBzZXVkbyBiaXQgaWYKKyAgICAgICAgICAgIC8vIHdlIHJlYWxseSBqdXN0IG1hdGNo
ZWQgYSBwc2V1ZG8tZWxlbWVudC4KKyAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvICE9IE5P
UFNFVURPICYmIG1fcHNldWRvU3R5bGUgPT0gTk9QU0VVRE8pIHsKKyAgICAgICAgICAgICAgICBp
ZiAobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAg
ICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tp
ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJTVF9JTlRFUk5BTF9Q
U0VVRE9JRCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SGFzUHNldWRv
U3R5bGUoZHluYW1pY1BzZXVkbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4gdGhlIG1hdGNoZWQg
cnVsZXMgYXJyYXkuCisgICAgICAgICAgICAgICAgKytydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsK
KyAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID09IC0xKQorICAg
ICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBydWxlUmFuZ2UubGFz
dFJ1bGVJbmRleDsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxp
c3Qgb2YgbWF0Y2hlZCBydWxlcy4KKyAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUnVsZSgmcnVs
ZURhdGEpOworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0
Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRN
YXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wg
Y29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIyKQorewor
ICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOworICAgIHVuc2ln
bmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOworICAgIHJldHVybiAoc3BlY2lm
aWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigp
IDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOworfQorCit2b2lkIEVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKK3sKKyAgICBBU1NFUlQobV9tYXRjaGVkUnVsZXMp
OworICAgIHN0ZDo6c29ydChtX21hdGNoZWRSdWxlcy0+YmVnaW4oKSwgbV9tYXRjaGVkUnVsZXMt
PmVuZCgpLCBjb21wYXJlUnVsZXMpOworfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpt
YXRjaEFsbFJ1bGVzKGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzLCBib29sIGluY2x1ZGVT
TUlMUHJvcGVydGllcykKK3sKKyAgICBtYXRjaFVBUnVsZXMoKTsKKworICAgIC8vIE5vdyB3ZSBj
aGVjayB1c2VyIHNoZWV0IHJ1bGVzLgorICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMp
CisgICAgICAgIG1hdGNoVXNlclJ1bGVzKGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBhdXRo
b3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMg
bWFwcGVkIGZyb20gSFRNTC4KKyAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKKyAg
ICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+
cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNr
IGFkZGl0aW9uYWwgbWFwcGVkIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgLy8gVGFibGVzIGFuZCB0
YWJsZSBjZWxscyBzaGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBh
cHBsaWVkCisgICAgICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBw
ZWQgc3R5bGUgZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCisg
ICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKworICAgICAgICBpZiAo
bV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICAgICAg
Ym9vbCBpc0F1dG87CisgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0
b0hUTUxFbGVtZW50KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9uYWxpdHlJZmhh
c0RpckF1dG9BdHRyaWJ1dGUoaXNBdXRvKTsKKyAgICAgICAgICAgIGlmIChpc0F1dG8pCisgICAg
ICAgICAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXModGV4dERpcmVjdGlvbiA9
PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9u
KCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBh
dXRob3Igc2hlZXRzIG5leHQuCisgICAgaWYgKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAg
ICAgICAgbWF0Y2hBdXRob3JSdWxlcyhmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgb3VyIGlu
bGluZSBzdHlsZSBhdHRyaWJ1dGUuCisgICAgaWYgKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAm
JiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5s
aW5lU3R5bGUoKSkgeworICAgICAgICAvLyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxv
bmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KKyAgICAgICAgLy8gRklYTUU6IE1lZGlh
IGNvbnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcu
CisgICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pc0luU2hhZG93VHJlZSgpOworICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCisg
ICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOworICAgIH0KKworI2lmIEVO
QUJMRShTVkcpCisgICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92ZXJyaWRlIHN0eWxl
LgorICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pc1NWR0VsZW1lbnQoKSkKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhzdGF0
aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNN
SUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOworI2Vsc2UKKyAg
ICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKKyNlbmRpZgorfQorCitib29s
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpoYXNBbnlNYXRjaGluZ1J1bGVzKFJ1bGVTZXQqIHJ1bGVT
ZXQpCit7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKworICAgIG1fbW9kZSA9IFNlbGVjdG9y
Q2hlY2tlcjo6U2hhcmluZ1J1bGVzOworICAgIGludCBmaXJzdFJ1bGVJbmRleCA9IC0xLCBsYXN0
UnVsZUluZGV4ID0gLTE7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZShm
aXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMo
TWF0Y2hSZXF1ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOworCisgICAgcmV0dXJuIG1fbWF0Y2hl
ZFJ1bGVzICYmICFtX21hdGNoZWRSdWxlcy0+aXNFbXB0eSgpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xs
ZWN0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjVjYTBhNDM1OGYyZmQ3MDQ0OTM2NWFhN2RhZTllOWFlMWRhMjc1ZmEKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaApAQCAt
MCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9s
bEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3
LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICov
CisKKyNpZm5kZWYgRWxlbWVudFJ1bGVDb2xsZWN0b3JfaAorI2RlZmluZSBFbGVtZW50UnVsZUNv
bGxlY3Rvcl9oCisKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCisjaW5jbHVkZSAi
U2VsZWN0b3JDaGVja2VyLmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorI2luY2x1ZGUg
PHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFzcyBEb2N1bWVudFJ1bGVTZXRzOworY2xh
c3MgUmVuZGVyUmVnaW9uOworY2xhc3MgUnVsZURhdGE7CitjbGFzcyBSdWxlU2V0OworY2xhc3Mg
U2VsZWN0b3JGaWx0ZXI7CitjbGFzcyBTdHlsZVNjb3BlUmVzb2x2ZXI7CitjbGFzcyBTdGF0aWND
U1NSdWxlTGlzdDsKKworY2xhc3MgRWxlbWVudFJ1bGVDb2xsZWN0b3IgeworcHVibGljOgorICAg
IEVsZW1lbnRSdWxlQ29sbGVjdG9yKFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIFN0eWxl
UmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSkKKyAgICAgICAgOiBtX3N0YXRlKHN0YXRlKQorICAgICAg
ICAsIG1fcnVsZVNldHMoc3R5bGVSZXNvbHZlci0+cnVsZVNldHMoKSkKKyAgICAgICAgLCBtX3Nl
bGVjdG9yRmlsdGVyKHN0eWxlUmVzb2x2ZXItPnNlbGVjdG9yRmlsdGVyKCkpCisgICAgICAgICwg
bV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKHN0eWxlUmVzb2x2ZXItPmluc3BlY3RvckNTU09NV3Jh
cHBlcnMoKSkKKyAgICAgICAgLCBtX3Njb3BlUmVzb2x2ZXIoc3R5bGVSZXNvbHZlci0+c2NvcGVS
ZXNvbHZlcigpKQorICAgICAgICAsIG1faXNQcmludFN0eWxlKGZhbHNlKQorICAgICAgICAsIG1f
cmVnaW9uRm9yU3R5bGluZygwKQorICAgICAgICAsIG1fcHNldWRvU3R5bGUoTk9QU0VVRE8pCisg
ICAgICAgICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkKKyAgICAgICAgLCBtX21vZGUoU2VsZWN0
b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkgeyB9CisKKyAgICB2b2lkIG1hdGNoQWxsUnVsZXMo
Ym9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVz
KTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcygpOworICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKFJ1bGVT
ZXQqKTsKKyAgICB2b2lkIG1hdGNoQXV0aG9yUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7
CisgICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2
b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAg
dm9pZCBtYXRjaEhvc3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKworICAgIHZvaWQg
c2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9Cisg
ICAgdm9pZCBzZXRQc2V1ZG9TdHlsZShQc2V1ZG9JZCBwc2V1ZG9TdHlsZSkgeyBtX3BzZXVkb1N0
eWxlID0gcHNldWRvU3R5bGU7IH0KKyAgICB2b2lkIHNldFNhbWVPcmlnaW5Pbmx5KGJvb2wgZikg
eyBtX3NhbWVPcmlnaW5Pbmx5ID0gZjsgfSAKKyAgICB2b2lkIHNldFJlZ2lvbkZvclN0eWxpbmco
UmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKSB7IG1fcmVnaW9uRm9yU3R5bGluZyA9IHJl
Z2lvbkZvclN0eWxpbmc7IH0KKyAgICB2b2lkIHNldE1lZGl1bShjb25zdCBNZWRpYVF1ZXJ5RXZh
bHVhdG9yKiBtZWRpdW0pIHsgbV9pc1ByaW50U3R5bGUgPSBtZWRpdW0tPm1lZGlhVHlwZU1hdGNo
U3BlY2lmaWMoInByaW50Iik7IH0KKworICAgIGJvb2wgaGFzQW55TWF0Y2hpbmdSdWxlcyhSdWxl
U2V0Kik7CisKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCYgbWF0Y2hlZFJlc3VsdCgp
OworICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IG1hdGNoZWRSdWxlTGlzdCgpOworCitwcml2
YXRlOgorICAgIERvY3VtZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fc3RhdGUuZG9jdW1lbnQo
KTsgfQorICAgIHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3Bl
cnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworCisgICAgdm9pZCBjb2xsZWN0TWF0
Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2Um
KTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVx
dWVzdCYsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVl
c3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsKKyAgICBib29sIHJ1bGVNYXRjaGVzKGNv
bnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2Vs
ZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNO
b3RDcm9zc0JvdW5kYXJ5KTsKKworICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZv
aWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CisKKyAgICB2b2lkIGFkZE1hdGNoZWRS
dWxlKGNvbnN0IFJ1bGVEYXRhKik7CisgICAgdm9pZCBjbGVhck1hdGNoZWRSdWxlcygpOworCisg
ICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0KCk7CisgICAgICAgIAorcHJpdmF0
ZToKKyAgICBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgbV9zdGF0ZTsKKyAgICBEb2N1bWVudFJ1bGVT
ZXRzJiBtX3J1bGVTZXRzOworICAgIFNlbGVjdG9yRmlsdGVyJiBtX3NlbGVjdG9yRmlsdGVyOwor
ICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKKyAg
ICBTdHlsZVNjb3BlUmVzb2x2ZXIqIG1fc2NvcGVSZXNvbHZlcjsKKworICAgIGJvb2wgbV9pc1By
aW50U3R5bGU7CisgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7CisgICAgUHNl
dWRvSWQgbV9wc2V1ZG9TdHlsZTsKKyAgICBib29sIG1fc2FtZU9yaWdpbk9ubHk7CisgICAgU2Vs
ZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKworICAgIE93blB0cjxWZWN0b3I8Y29uc3QgUnVs
ZURhdGEqLCAzMj4gPiBtX21hdGNoZWRSdWxlczsKKworICAgIC8vIE91dHB1dC4KKyAgICBSZWZQ
dHI8U3RhdGljQ1NTUnVsZUxpc3Q+IG1fcnVsZUxpc3Q7CisgICAgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hSZXN1bHQgbV9yZXN1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBFbGVtZW50UnVsZUNvbGxlY3Rvcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9j
c3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIGIvU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29s
bGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hODU0MjY5YjFjMGI0MjNhYzIxYWE3NDViNTkzNjZkMzQ1
ZGNmZjQyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29s
bGVjdG9yLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBM
YXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDA0LTIwMDUgQWxs
YW4gU2FuZGZlbGQgSmVuc2VuIChrZGVAY2FyZXdvbGYuY29tKQorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3IE5pY2hvbGFzIFNoYW5rcyAod2Via2l0QG5pY2tzaGFua3MuY29tKQorICogQ29w
eXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEy
LCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNyBBbGV4ZXkgUHJvc2t1cnlha292IDxhcEB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChD
KSAyMDA3LCAyMDA4IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMDgsIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0
dHA6Ly93d3cudG9yY2htb2JpbGUuY29tLykKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgQ29kZSBB
dXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIFJlc2Vh
cmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmgiCisKKyNpbmNsdWRlICJD
U1NEZWZhdWx0U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJTdHlsZVJ1bGUuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25z
dCBTdHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCit7CisgICAgcmV0
dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNp
ZmljaXR5KCk7Cit9CisKK2Jvb2wgUGFnZVJ1bGVDb2xsZWN0b3I6OmlzTGVmdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3QKK3sKKyAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9IGZhbHNlOworICAg
IGlmICghbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSkKKyAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKKworICAgIHJldHVybiAocGFnZUlu
ZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOworfQorCitib29sIFBhZ2VSdWxl
Q29sbGVjdG9yOjppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIC8vIEZJ
WE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAo
bm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4gKCFwYWdlSW5kZXgpOwor
fQorCitTdHJpbmcgUGFnZVJ1bGVDb2xsZWN0b3I6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXgg
Ki8pIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBwYWdlIGluZGV4IHRvIHBhZ2Ug
bmFtZSBtYXBwaW5nLgorICAgIHJldHVybiAiIjsKK30KKwordm9pZCBQYWdlUnVsZUNvbGxlY3Rv
cjo6bWF0Y2hBbGxQYWdlUnVsZXMoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBjb25zdCBib29sIGlz
TGVmdCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBib29sIGlzRmlyc3QgPSBp
c0ZpcnN0UGFnZShwYWdlSW5kZXgpOworICAgIGNvbnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUo
cGFnZUluZGV4KTsKKyAgICAKKyAgICBtYXRjaFBhZ2VSdWxlcyhDU1NEZWZhdWx0U3R5bGVTaGVl
dHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIG1hdGNo
UGFnZVJ1bGVzKG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7
CisgICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFsIGF1dGhvciBSdWxlU2V0IGZvciBAcGFn
ZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgorICAgIG1hdGNoUGFnZVJ1bGVzKG1fcnVs
ZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKK30KKwordm9pZCBQ
YWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQYWdlUnVsZXMoUnVsZVNldCogcnVsZXMsIGJvb2wgaXNM
ZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAg
ICBpZiAoIXJ1bGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBWZWN0b3I8U3R5bGVSdWxlUGFn
ZSo+IG1hdGNoZWRQYWdlUnVsZXM7CisgICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQ
YWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBh
Z2VOYW1lKTsKKyAgICBpZiAobWF0Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIHN0ZDo6c3RhYmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBt
YXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJlUGFnZVJ1bGVzKTsKKworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICBt
X3Jlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0
aWVzKCkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29u
c3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBh
Z2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3Rv
ciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50
LT50YWdIaXN0b3J5KCkpIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NT
ZWxlY3Rvcjo6VGFnKSB7CisgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFt
ZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChs
b2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIENTU1NlbGVjdG9yOjpQ
c2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsKKyAgICAgICAg
aWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0
UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9S
aWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENT
U1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKKyAgICAgICAgewor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIFBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zvckxpc3Qo
VmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVS
dWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25z
dCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxl
cy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHlsZVJ1bGVQYWdlKiBydWxlID0gcnVsZXNbaV07
CisKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+c2VsZWN0
b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFw
cGx5LCB0aGVuIGlnbm9yZSBpdC4KKyAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJv
cGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8
IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAg
IC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KKyAgICAgICAg
bWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5o
IGIvU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDc1
ODAxZDk2OGQ4OGU2Y2U1ZjlmOGI4YWRmYjdlOGM3YzgzODhjYwotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oCkBAIC0wLDAgKzEsNjAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAq
IENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwg
MjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFBh
Z2VSdWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgUGFnZVJ1bGVDb2xsZWN0b3JfaAorCisjaW5jbHVk
ZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNs
dWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIFN0eWxlUnVsZVBhZ2U7CisKK2NsYXNzIFBhZ2VSdWxlQ29sbGVj
dG9yIHsKK3B1YmxpYzoKKyAgICBQYWdlUnVsZUNvbGxlY3RvcihTdHlsZVJlc29sdmVyOjpTdGF0
ZSYgc3RhdGUsIERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKQorICAgICAgICA6IG1fc3RhdGUo
c3RhdGUpCisgICAgICAgICwgbV9ydWxlU2V0cyhydWxlU2V0cykgeyB9CisKKyAgICB2b2lkIG1h
dGNoQWxsUGFnZVJ1bGVzKGludCBwYWdlSW5kZXgpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNo
UmVzdWx0JiBtYXRjaGVkUmVzdWx0KCkgeyByZXR1cm4gbV9yZXN1bHQ7IH0KKworcHJpdmF0ZToK
KyAgICBib29sIGlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBpc1Jp
Z2h0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5k
ZXgpOyB9CisgICAgYm9vbCBpc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBT
dHJpbmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisKKyAgICB2b2lkIG1hdGNoUGFn
ZVJ1bGVzKFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0
KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxl
UnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29u
c3QgU3RyaW5nJiBwYWdlTmFtZSk7CisKKyAgICBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgbV9zdGF0
ZTsKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBtX3J1bGVTZXRzOworCisgICAgU3R5bGVSZXNvbHZl
cjo6TWF0Y2hSZXN1bHQgbV9yZXN1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBQYWdlUnVsZUNvbGxlY3Rvcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZl
ci5jcHAKaW5kZXggZjIyMmJiMWUzNzM3MzY5NGU4YzM5MWJiMDljNjZlN2RmMWM1NDJkNi4uOWVk
NGRjMDA3NzJiZjAzOWYxOTUzNmI3MmI1NzdmNDBkODYxNGY3MiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9T
dHlsZVJlc29sdmVyLmNwcApAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgIkNvdW50ZXJDb250
ZW50LmgiCiAjaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgogI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5oIgogI2lu
Y2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKICNpbmNsdWRlICJGb250RmVhdHVyZVZhbHVlLmgiCiAj
aW5jbHVkZSAiRm9udFZhbHVlLmgiCkBAIC04Nyw2ICs4OCw3IEBACiAjaW5jbHVkZSAiTm9kZVJl
bmRlclN0eWxlLmgiCiAjaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQuaCIKICNpbmNsdWRl
ICJQYWdlLmgiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xsZWN0b3IuaCIKICNpbmNsdWRlICJQYWly
LmgiCiAjaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKICNpbmNsdWRl
ICJRdW90ZXNEYXRhLmgiCkBAIC0yMDgsMjkgKzIxMCw2IEBAIGlmIChpc0luaXRpYWwpIHsgXAog
CiBSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6c19zdHlsZU5vdFlldEF2YWlsYWJsZTsKIAot
c3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKQotewotICAg
IERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCBsZWZ0VG9SaWdo
dERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKSkpOwotICAgIGlmIChsZWZ0VG9SaWdo
dERlY2wtPmlzRW1wdHkoKSkKLSAgICAgICAgbGVmdFRvUmlnaHREZWNsLT5zZXRQcm9wZXJ0eShD
U1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVMdHIpOwotICAgIHJldHVybiBsZWZ0VG9SaWdo
dERlY2wuZ2V0KCk7Ci19Ci0KLXN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiByaWdodFRvTGVmdERl
Y2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3Bl
cnR5U2V0PiwgcmlnaHRUb0xlZnREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsK
LSAgICBpZiAocmlnaHRUb0xlZnREZWNsLT5pc0VtcHR5KCkpCi0gICAgICAgIHJpZ2h0VG9MZWZ0
RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlUnRsKTsKLSAg
ICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgpOwotfQotCi1pbmxpbmUgU3RhdGljQ1NTUnVs
ZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAgaWYg
KCFtX3J1bGVMaXN0KQotICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNy
ZWF0ZSgpOwotICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOwotfQotCiBpbmxpbmUgdm9pZCBT
dHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKIHsKICAgICBt
X2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKQEAgLTI0OCw4ICsy
MjcsNiBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQogICAgIG1f
cGFyZW50U3R5bGUgPSAwOwogICAgIG1fcGFyZW50Tm9kZSA9IDA7CiAgICAgbV9yZWdpb25Gb3JT
dHlsaW5nID0gMDsKLSAgICBtX3J1bGVMaXN0ID0gMDsKLSAgICBtX21hdGNoZWRSdWxlcy5jbGVh
cigpOwogICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwogI2lmIEVOQUJMRShD
U1NfU0hBREVSUykKICAgICBtX2hhc1BlbmRpbmdTaGFkZXJzID0gZmFsc2U7CkBAIC0yNTksNiAr
MjM2LDE2IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigpCiAjZW5k
aWYKIH0KIAordm9pZCBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdDo6YWRkTWF0Y2hlZFByb3Bl
cnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxl
LCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlX
aGl0ZWxpc3RUeXBlKQoreworICAgIG1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpICsgMSk7CisgICAgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IG5ld1Byb3BlcnRpZXMgPSBtYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7CisgICAgbmV3UHJvcGVy
dGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGll
cyk7CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKKyAg
ICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7Cisg
ICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKK30KKwogU3R5bGVSZXNvbHZlcjo6U3R5bGVS
ZXNvbHZlcihEb2N1bWVudCogZG9jdW1lbnQsIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
KQogICAgIDogbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAo
MCkKICAgICAsIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIodGhpcywgJlN0eWxl
UmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSkKQEAgLTQwMSwxODEgKzM4OCw2
IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVy
PFN0eWxlUmVzb2x2ZXI+KikKICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNT
aW5jZUxhc3RTd2VlcCA9IDA7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkTWF0Y2hlZFBy
b3BlcnRpZXMoTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUsIFBy
b3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCi17Ci0gICAgbWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCkgKyAxKTsKLSAgICBNYXRjaGVkUHJvcGVydGllcyYgbmV3UHJvcGVydGllcyA9IG1h
dGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKLSAgICBuZXdQcm9wZXJ0aWVzLnBy
b3BlcnRpZXMgPSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9wZXJ0aWVzKTsKLSAg
ICBuZXdQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBlOwotICAgIG5ld1By
b3BlcnRpZXMud2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlwZTsKLSAgICBtYXRj
aFJlc3VsdC5tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotfQotCi1pbmxpbmUgdm9pZCBTdHls
ZVJlc29sdmVyOjphZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiByZXN1bHQs
IGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnR5U2V0LCBib29sIGlzQ2FjaGVhYmxlKQot
ewotICAgIGlmICghcHJvcGVydHlTZXQpCi0gICAgICAgIHJldHVybjsKLSAgICByZXN1bHQucmFu
Z2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKLSAg
ICBpZiAocmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPT0gLTEpCi0gICAgICAgIHJlc3Vs
dC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZTsK
LSAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnR5U2V0KTsKLSAgICBpZiAo
IWlzQ2FjaGVhYmxlKQotICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLX0KLQot
Y2xhc3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgewotcHVibGljOgotICAgIE1hdGNoaW5nVUFSdWxl
c1Njb3BlKCk7Ci0gICAgfk1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0KLSAgICBzdGF0aWMgYm9v
bCBpc01hdGNoaW5nVUFSdWxlcygpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBib29sIG1fbWF0
Y2hpbmdVQVJ1bGVzOwotfTsKLQotTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxl
c1Njb3BlKCkKLXsKLSAgICBBU1NFUlQoIW1fbWF0Y2hpbmdVQVJ1bGVzKTsKLSAgICBtX21hdGNo
aW5nVUFSdWxlcyA9IHRydWU7Ci19Ci0KLU1hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hpbmdV
QVJ1bGVzU2NvcGUoKQotewotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7Ci19Ci0KLWlu
bGluZSBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi17Ci0g
ICAgcmV0dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfQotCi1ib29sIE1hdGNoaW5nVUFSdWxlc1Nj
b3BlOjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmNv
bGxlY3RNYXRjaGluZ1J1bGVzKFN0YXRlJiBzdGF0ZSwgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRj
aFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAgIEFTU0VSVChtYXRjaFJlcXVl
c3QucnVsZVNldCk7Ci0gICAgQVNTRVJUKHN0YXRlLmVsZW1lbnQoKSk7Ci0KLSAgICBFbGVtZW50
KiBlbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpOwotICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0
eWxlZEVsZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7Ci0gICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBwc2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7Ci0gICAgaWYgKCFwc2V1
ZG9JZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOwotICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qoc3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0
LT5zaGFkb3dQc2V1ZG9FbGVtZW50UnVsZXMocHNldWRvSWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOwotICAgIH0KLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICBpZiAo
ZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yTGlzdChzdGF0ZSwgbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmN1ZVBzZXVkb1J1bGVzKCksIG1h
dGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSNlbmRpZgotICAgIC8vIENoZWNrIHdoZXRoZXIgb3Ro
ZXIgdHlwZXMgb2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4gdGhlIGN1cnJlbnQgdHJlZSBzY29w
ZS4gQ3JpdGVyaWEgZm9yIHRoaXM6Ci0gICAgLy8gYSkgaXQncyBhIFVBIHJ1bGUKLSAgICAvLyBi
KSB0aGUgdHJlZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVzCi0gICAgLy8gYykgdGhlIHJ1bGVz
IGNvbWVzIGZyb20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0aGluIHRoZSBzYW1lIHRyZWUgc2Nv
cGUKLSAgICBUcmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1lbnQtPnRyZWVTY29wZSgpOwotICAg
IGlmICghTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKLSAgICAgICAg
JiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQotICAgICAgICAmJiAoIW1hdGNoUmVx
dWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29w
ZSkKLSAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAgICByZXR1cm47Ci0KLSAgICAv
LyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3MsIHRhZywgYW5kIGV2
ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAotICAgIC8vIHRoZW4gc29ydCB0aGUgYnVm
ZmVyLgotICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0Zvckxpc3Qoc3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQt
PmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OwotICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVz
KCkuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qo
c3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1bGVzKHN0eWxlZEVsZW1lbnQtPmNs
YXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgfQot
Ci0gICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
c0Zvckxpc3Qoc3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6
bWF0Y2hlc0ZvY3VzUHNldWRvQ2xhc3MoZWxlbWVudCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGlu
Z1J1bGVzRm9yTGlzdChzdGF0ZSwgbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRvQ2xh
c3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVu
dC0+bG9jYWxOYW1lKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChzdGF0ZSwgbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnVu
aXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihTdGF0ZSYgc3RhdGUsIGNv
bnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsK
LSAgICBpZiAoIXN0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgdW5zaWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsg
KytpKSB7Ci0gICAgICAgIGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciA9IG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVj
dG9yOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxlY3Rvciwgc3Rh
dGljX2Nhc3Q8RWxlbWVudCo+KHN0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsK
LSAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQt
Pm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKLSAgICAg
ICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlcyhzdGF0ZSwgTWF0Y2hSZXF1ZXN0KHJlZ2lvblJ1bGVzLCBtYXRjaFJlcXVlc3QuaW5jbHVk
ZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdC5zY29wZSksIHJ1bGVSYW5nZSk7Ci0gICAgICAgIH0K
LSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKFN0YXRlJiBzdGF0ZSwgTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBWZWN0b3I8Y29u
c3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOwot
ICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBz
b3J0TWF0Y2hlZFJ1bGVzKHN0YXRlKTsKLQotICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0
b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHN0YXRlLmVuc3Vy
ZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVh
dGVDU1NPTVdyYXBwZXIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cg
dHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVj
bGFyYXRpb25zLgotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6
ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ld
LT5jb250YWluc1VuY29tbW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1
bHQsIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tp
XS0+cnVsZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVz
W2ldLT5wcm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoU3RhdGUmIHN0YXRlLCBNYXRjaFJlc3VsdCYg
cmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVOQUJMRShTVFlMRV9TQ09Q
RUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQotICAgIGlmICghbV9zY29wZVJlc29sdmVyKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9yIHJ1bGVzIGJ5IHRyYXZl
cnNpbmcgdGhlIHNjb3BlZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0IGlmIGl0IGdvdCBpbmNv
bnNpc3RlbnQpLgotICAgIGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Njb3BlZFN0eWxlcygpICYm
IG1fc2NvcGVSZXNvbHZlci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeShzdGF0ZS5lbGVtZW50KCkp
KSB7Ci0gICAgICAgIGJvb2wgYXBwbHlBdXRob3JTdHlsZXMgPSBzdGF0ZS5lbGVtZW50KCktPnRy
ZWVTY29wZSgpLT5hcHBseUF1dGhvclN0eWxlcygpOwotICAgICAgICBib29sIGRvY3VtZW50U2Nv
cGUgPSB0cnVlOwotICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUgPSBtX3Njb3BlUmVzb2x2ZXIt
PnN0YWNrU2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2NvcGVTaXpl
OyArK2kpIHsKLSAgICAgICAgICAgIHN0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAg
ICAgICAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICAgICAgICAgIGNvbnN0IFN0eWxlU2NvcGVSZXNvbHZl
cjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrRnJhbWVBdChpKTsK
LSAgICAgICAgICAgIGRvY3VtZW50U2NvcGUgPSBkb2N1bWVudFNjb3BlICYmICFmcmFtZS5tX3Nj
b3BlLT5pc0luU2hhZG93VHJlZSgpOwotICAgICAgICAgICAgaWYgKGRvY3VtZW50U2NvcGUpIHsK
LSAgICAgICAgICAgICAgICBpZiAoIWFwcGx5QXV0aG9yU3R5bGVzKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYg
KCFtX3Njb3BlUmVzb2x2ZXItPm1hdGNoZXNTdHlsZUJvdW5kcyhmcmFtZSkpCi0gICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXRjaFJl
cXVlc3QgbWF0Y2hSZXF1ZXN0KGZyYW1lLm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVsZXMsIGZy
YW1lLm1fc2NvcGUpOwotICAgICAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5y
YW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
cyhzdGF0ZSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JSZWdpb24oc3RhdGUsIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAg
ICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhzdGF0ZSwgcmVzdWx0KTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIG1hdGNoSG9zdFJ1bGVzKHN0YXRlLCByZXN1bHQsIGluY2x1
ZGVFbXB0eVJ1bGVzKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHN0YXRlKTsKLSAgICBVTlVT
RURfUEFSQU0ocmVzdWx0KTsKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOwot
I2VuZGlmCi19Ci0KIGlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRp
ZGF0ZU1hdGNoZXNIb3N0UnVsZXMoU3RhdGUmIHN0YXRlKQogewogI2lmIEVOQUJMRShTSEFET1df
RE9NKQpAQCAtNTg2LDE5NyArMzk4LDYgQEAgaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyhTdGF0ZSYgc3RhdGUpCiAjZW5kaWYK
IH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEhvc3RSdWxlcyhTdGF0ZSYgc3RhdGUsIE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17Ci0jaWYgRU5BQkxF
KFNIQURPV19ET00pCi0gICAgQVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7Ci0KLSAgICBzdGF0ZS5t
YXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUg
PSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQotICAgIFZlY3RvcjxSdWxl
U2V0Kj4gbWF0Y2hlZFJ1bGVzOwotICAgIG1fc2NvcGVSZXNvbHZlci0+bWF0Y2hIb3N0UnVsZXMo
c3RhdGUuZWxlbWVudCgpLCBtYXRjaGVkUnVsZXMpOwotICAgIGlmIChtYXRjaGVkUnVsZXMuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBtYXRjaGVk
UnVsZXMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2Ug
PSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhzdGF0ZSwgTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRl
RW1wdHlSdWxlcywgc3RhdGUuZWxlbWVudCgpKSwgcnVsZVJhbmdlKTsKLSAgICB9Ci0gICAgc29y
dEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHN0YXRlLCByZXN1bHQpOwotI2Vsc2UKLSAgICBVTlVT
RURfUEFSQU0oc3RhdGUpOwotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwotICAgIFVOVVNFRF9Q
QVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
OjptYXRjaEF1dGhvclJ1bGVzKFN0YXRlJiBzdGF0ZSwgTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSAgICBzdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigp
OwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpIC0gMTsKLQotICAgIGlmICghc3RhdGUuZWxlbWVudCgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICAvLyBNYXRjaCBnbG9iYWwgYXV0aG9yIHJ1bGVzLgotICAgIE1hdGNoUmVx
dWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpbmNsdWRlRW1wdHlS
dWxlcyk7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVs
ZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihzdGF0ZSwgbWF0
Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3Rv
cjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0
cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1h
dGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5z
aXplKCk7ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIG1hdGNoUmVx
dWVzdHNbaV0sIHJ1bGVSYW5nZSk7Ci0jZW5kaWYKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcyhzdGF0ZSwgcmVzdWx0KTsKLQotICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoc3Rh
dGUsIHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoVXNlclJ1bGVzKFN0YXRlJiBzdGF0ZSwgTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBp
bmNsdWRlRW1wdHlSdWxlcykKLXsKLSAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkpCi0g
ICAgICAgIHJldHVybjsKLSAgICAKLSAgICBzdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwot
Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMTsKLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMu
dXNlclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gcmVzdWx0LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXMoc3RhdGUsIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0ZvclJlZ2lvbihzdGF0ZSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotCi0gICAgc29y
dEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHN0YXRlLCByZXN1bHQpOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhTdGF0ZSYgc3RhdGUsIE1hdGNoUmVzdWx0JiByZXN1bHQs
IFJ1bGVTZXQqIHJ1bGVzKQotewotICAgIHN0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0g
ICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0
aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMu
VUFSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhzdGF0ZSwgTWF0Y2hSZXF1
ZXN0KHJ1bGVzKSwgcnVsZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhzdGF0ZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hp
bmdSdWxlc0Zvckxpc3QoU3RhdGUmIHN0YXRlLCBjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxl
cywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdl
KQotewotICAgIGlmICghcnVsZXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEluIHNvbWUg
Y2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZvciByYW5kb20gZWxlbWVudHMg
aW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29sdmUuCi0gICAgLy8gQW5jZXN0
b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5k
IHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRoLgotICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9
IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQoc3RhdGUucGFyZW50Tm9k
ZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tl
cjo6RG9lc05vdENyb3NzQm91bmRhcnk7Ci0KLSAgICB1bnNpZ25lZCBzaXplID0gcnVsZXMtPnNp
emUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAg
IGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChpKTsKLSAgICAgICAgaWYgKGNh
blVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVs
ZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3Rv
cklkZW50aWZpZXJIYXNoZXMoKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBT
dHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxlKCk7Ci0gICAgICAgIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxN
YXRjaFJ1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0gICAgICAgIFBzZXVkb0lkIGR5bmFt
aWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHN0YXRlLCBydWxl
RGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVo
YXZpb3JBdEJvdW5kYXJ5KSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHBy
b3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4K
LSAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5w
cm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMt
PmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgewotICAgICAg
ICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwg
ZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1
bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgotICAgICAg
ICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVsZURhdGEuaGFzRG9jdW1l
bnRTZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBu
b3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKLSAgICAgICAgICAgIC8vIHdlIHJlYWxs
eSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KLSAgICAgICAgICAgIGlmIChkeW5hbWlj
UHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlKCkgPT0gTk9QU0VVRE8pIHsK
LSAgICAgICAgICAgICAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29s
bGVjdGluZ1J1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQ
c2V1ZG8gPCBGSVJTVF9JTlRFUk5BTF9QU0VVRE9JRCkKLSAgICAgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0SGFzUHNldWRvU3R5bGUoZHluYW1pY1BzZXVkbyk7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxl
IGluZGljZXMgaW4gdGhlIG1hdGNoZWQgcnVsZXMgYXJyYXkuCi0gICAgICAgICAgICAgICAgKyty
dWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZp
cnN0UnVsZUluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RS
dWxlSW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKLQotICAgICAgICAgICAgICAgIC8v
IEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAgICAgICAgICAg
ICAgICBzdGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEpOwotICAgICAgICAgICAgICAgIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7Ci0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAg
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0g
ICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRh
KiByMSwgY29uc3QgUnVsZURhdGEqIHIyKQotewotICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9
IHIxLT5zcGVjaWZpY2l0eSgpOwotICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVj
aWZpY2l0eSgpOwotICAgIHJldHVybiAoc3BlY2lmaWNpdHkxID09IHNwZWNpZmljaXR5MikgPyBy
MS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigpIDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNp
dHkyOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRNYXRjaGVkUnVsZXMoU3RhdGUmIHN0
YXRlKQotewotICAgIHN0ZDo6c29ydChzdGF0ZS5tYXRjaGVkUnVsZXMoKS5iZWdpbigpLCBzdGF0
ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaEFsbFJ1bGVzKFN0YXRlJiBzdGF0ZSwgTWF0Y2hSZXN1bHQmIHJlc3VsdCwg
Ym9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCi17Ci0gICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCBy
ZXN1bHQpOwotCi0gICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgaWYg
KG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBtYXRjaFVzZXJSdWxlcyhzdGF0
ZSwgcmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdp
bm5pbmcgZmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhU
TUwuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKSkgewotICAgICAgICBhZGRFbGVtZW50
U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRp
b25BdHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICAvLyBOb3cgd2UgY2hlY2sgYWRkaXRpb25h
bCBtYXBwZWQgZGVjbGFyYXRpb25zLgotICAgICAgICAvLyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxz
IHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFwcGxpZWQKLSAg
ICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBk
ZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KLSAgICAgICAgYWRk
RWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRk
aXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIGlmIChzdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgYm9vbCBp
c0F1dG87Ci0gICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0b0hUTUxF
bGVtZW50KHN0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRv
QXR0cmlidXRlKGlzQXV0byk7Ci0gICAgICAgICAgICBpZiAoaXNBdXRvKQotICAgICAgICAgICAg
ICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBs
ZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOwotICAg
ICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hl
ZXRzIG5leHQuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBt
YXRjaEF1dGhvclJ1bGVzKHN0YXRlLCByZXN1bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVj
ayBvdXIgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMgJiYgc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIHN0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aW5saW5lU3R5bGUoKSkgewotICAgICAgICAvLyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxl
IGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KLSAgICAgICAgLy8gRklYTUU6
IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNh
Y2hpbmcuCi0gICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9ICFzdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFzdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBDb25zdGlmeS4K
LSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7Ci0gICAgfQot
Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAvLyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJp
ZGUgc3R5bGUuCi0gICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcyAmJiBzdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGll
cyhyZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihzdGF0ZS5zdHlsZWRFbGVtZW50KCkp
LT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8p
OwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSNlbmRp
ZgotfQotCiBib29sIFN0eWxlUmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29u
c3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NOYW1lcykgY29uc3QKIHsKICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7ICsraSkgewpAQCAtODAyLDkgKzQyMyw4
IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KFN0YXRlJiBzdGF0ZSwg
RWxlbWVudCogZSkKICAgICB9CiB9CiAKLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRl
Ojppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyUmVnaW9uKiBy
ZWdpb25Gb3JTdHlsaW5nKQoraW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRG
b3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKIHsKLSAgICBt
X3BzZXVkb1N0eWxlID0gcHNldWRvSWQ7CiAgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9u
Rm9yU3R5bGluZzsKIAogICAgIGlmIChlKSB7CkBAIC04MjYsNyArNDQ2LDYgQEAgaW5saW5lIHZv
aWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRv
Y3VtZW50LCBFbGVtZW4KIAogICAgIG1fc3R5bGUgPSAwOwogICAgIG1fcGVuZGluZ0ltYWdlUHJv
cGVydGllcy5jbGVhcigpOwotICAgIG1fcnVsZUxpc3QgPSAwOwogICAgIG1fZm9udERpcnR5ID0g
ZmFsc2U7CiB9CiAKQEAgLTg5MywxMSArNTEyLDggQEAgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHls
ZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChFbGVtZW50KiBlLCBSdWxlU2V0KiBydWwK
IAogICAgIFN0YXRlIHN0YXRlKGRvY3VtZW50KCkpOwogICAgIHN0YXRlLmluaXRFbGVtZW50KGUp
OwotICAgIHN0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMpOwotICAg
IGludCBmaXJzdFJ1bGVJbmRleCA9IC0xLCBsYXN0UnVsZUluZGV4ID0gLTE7Ci0gICAgUnVsZVJh
bmdlIHJ1bGVSYW5nZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7Ci0gICAgY29sbGVj
dE1hdGNoaW5nUnVsZXMoc3RhdGUsIE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsK
LSAgICByZXR1cm4gIXN0YXRlLm1hdGNoZWRSdWxlcygpLmlzRW1wdHkoKTsKKyAgICBFbGVtZW50
UnVsZUNvbGxlY3RvciBjb2xsZWN0b3IodGhpcywgc3RhdGUpOworICAgIHJldHVybiBjb2xsZWN0
b3IuaGFzQW55TWF0Y2hpbmdSdWxlcyhydWxlU2V0KTsKIH0KIAogYm9vbCBTdHlsZVJlc29sdmVy
OjpjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woY29uc3QgU3RhdGUmIHN0YXRlLCBTdHlsZWRFbGVt
ZW50KiBlbGVtZW50KSBjb25zdApAQCAtMTE2MSwyNiArNzc3LDYgQEAgUmVuZGVyU3R5bGUqIFN0
eWxlUmVzb2x2ZXI6OmxvY2F0ZVNoYXJlZFN0eWxlKFN0YXRlJiBzdGF0ZSkKICAgICByZXR1cm4g
c2hhcmVFbGVtZW50LT5yZW5kZXJTdHlsZSgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoVUFSdWxlcyhTdGF0ZSYgc3RhdGUsIE1hdGNoUmVzdWx0JiByZXN1bHQpCi17Ci0gICAgTWF0
Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7Ci0KLSAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBm
cm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgotICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVldHM6
OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQotICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBm
YWxzZTsKLSAgICBSdWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9tZWRpdW0tPm1lZGlh
VHlwZU1hdGNoU3BlY2lmaWMoInByaW50IikKLSAgICAgICAgPyBDU1NEZWZhdWx0U3R5bGVTaGVl
dHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5
bGU7Ci0gICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCByZXN1bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQp
OwotCi0gICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJr
cyB1c2VyIGFnZW50IHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkK
LSAgICAgICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCByZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0
czo6ZGVmYXVsdFF1aXJrc1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBz
b3VyY2Ugc3R5bGVzIChpbiB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSks
IHRoZW4gd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0g
ICAgaWYgKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMo
c3RhdGUsIHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7
Ci19Ci0KIHN0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFBhZ2luYXRpb246
Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxlKiBzdHlsZSkKIHsKICAgICBpZiAocGFn
aW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpCkBAIC0xMzc4LDcgKzk3NCw3
IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVu
dChFbGVtZW50KiBlbGVtZW50LCBSZW5kZXJTCiAKICAgICBTdGF0ZSBzdGF0ZShkb2N1bWVudCgp
KTsKICAgICBpbml0RWxlbWVudChzdGF0ZSwgZWxlbWVudCk7Ci0gICAgc3RhdGUuaW5pdEZvclN0
eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywg
cmVnaW9uRm9yU3R5bGluZyk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVu
dCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCByZWdpb25Gb3JTdHlsaW5nKTsKICAgICBpZiAo
c2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFzdGF0ZS5kaXN0cmlidXRl
ZFRvSW5zZXJ0aW9uUG9pbnQoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogc2hhcmVkU3R5bGUg
PSBsb2NhdGVTaGFyZWRTdHlsZShzdGF0ZSk7CiAgICAgICAgIGlmIChzaGFyZWRTdHlsZSkKQEAg
LTE0MjMsMTMgKzEwMTksMTYgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZl
cjo6c3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIFJlbmRlclMKICAgICBpZiAobmVl
ZHNDb2xsZWN0aW9uKQogICAgICAgICBtX3J1bGVTZXRzLmNvbGxlY3RGZWF0dXJlcyhkb2N1bWVu
dCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29sdmVyLmdldCgpKTsKIAotICAgIE1hdGNo
UmVzdWx0IG1hdGNoUmVzdWx0OworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxlY3Rvcih0
aGlzLCBzdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldFJlZ2lvbkZvclN0eWxpbmcocmVnaW9uRm9y
U3R5bGluZyk7CisgICAgY29sbGVjdG9yLnNldE1lZGl1bShtX21lZGl1bS5nZXQoKSk7CisKICAg
ICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9PSBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcykKLSAgICAg
ICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCk7CisgICAgICAgIGNvbGxlY3Rvci5t
YXRjaFVBUnVsZXMoKTsKICAgICBlbHNlCi0gICAgICAgIG1hdGNoQWxsUnVsZXMoc3RhdGUsIG1h
dGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlM
KTsKKyAgICAgICAgY29sbGVjdG9yLm1hdGNoQWxsUnVsZXMobV9tYXRjaEF1dGhvckFuZFVzZXJT
dHlsZXMsIG1hdGNoaW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOwog
Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhzdGF0ZSwgbWF0Y2hSZXN1bHQsIGVsZW1lbnQp
OworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoc3RhdGUsIGNvbGxlY3Rvci5tYXRjaGVkUmVz
dWx0KCksIGVsZW1lbnQpOwogCiAgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRp
c3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCiAgICAgYWRq
dXN0UmVuZGVyU3R5bGUoc3RhdGUsIHN0eWxlLmdldCgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBl
bGVtZW50KTsKQEAgLTE0NDQsNyArMTA0Myw3IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0
eWxlUmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUoU3RhdGUmIHN0YXRlLCBjb25zdCBSZW5kCiB7
CiAgICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwogICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygp
KQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0
aWVzKCkpOworICAgICAgICByZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXMoa2V5ZnJhbWUtPnBy
b3BlcnRpZXMoKSk7CiAKICAgICAvLyBDcmVhdGUgdGhlIHN0eWxlCiAgICAgUmVmUHRyPFJlbmRl
clN0eWxlPiBzdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShlbGVtZW50U3R5bGUpOwpAQCAtMTU2
Myw3ICsxMTYyLDcgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNl
dWRvU3R5bGVGb3JFbGVtZW50KFBzZXVkb0lkIHBzZXVkbywgRWwKIAogICAgIFN0YXRlIHN0YXRl
KGRvY3VtZW50KCkpOwogICAgIGluaXRFbGVtZW50KHN0YXRlLCBlKTsKLSAgICBzdGF0ZS5pbml0
Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlLCBwc2V1ZG8pOworICAg
IHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUpOwog
ICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CiAgICAgc3RhdGUuc3R5
bGUoKS0+aW5oZXJpdEZyb20oc3RhdGUucGFyZW50U3R5bGUoKSk7CiAKQEAgLTE1NzEsMjAgKzEx
NzAsMjIgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5
bGVGb3JFbGVtZW50KFBzZXVkb0lkIHBzZXVkbywgRWwKICAgICAvLyB0aG9zZSBydWxlcy4KIAog
ICAgIC8vIENoZWNrIFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXN1bHQg
bWF0Y2hSZXN1bHQ7Ci0gICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCk7CisgICAg
RWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIHN0YXRlKTsKKyAgICBjb2xsZWN0
b3Iuc2V0UHNldWRvU3R5bGUocHNldWRvKTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVtKG1fbWVk
aXVtLmdldCgpKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAKICAgICBpZiAobV9t
YXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMoc3RhdGUs
IG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoc3RhdGUsIG1h
dGNoUmVzdWx0LCBmYWxzZSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVzZXJSdWxlcyhmYWxz
ZSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaEF1dGhvclJ1bGVzKGZhbHNlKTsKICAgICB9CiAK
LSAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgpKQorICAgIGlm
IChjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpLm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRTdHlsZVR5cGUocHNl
dWRvKTsKIAotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoc3RhdGUsIG1hdGNoUmVzdWx0LCBl
KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKHN0YXRlLCBjb2xsZWN0b3IubWF0Y2hlZFJl
c3VsdCgpLCBlKTsKIAogICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5
IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgogICAgIGFkanVzdFJl
bmRlclN0eWxlKHN0YXRlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsK
QEAgLTE2MDYsMTcgKzEyMDcsMTIgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCiAgICAgc3RhdGUuc2V0U3R5bGUoUmVu
ZGVyU3R5bGU6OmNyZWF0ZSgpKTsKICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShzdGF0
ZS5yb290RWxlbWVudFN0eWxlKCkpOwogCi0gICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQ
YWdlKHN0YXRlLCBwYWdlSW5kZXgpOwotICAgIGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQ
YWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgU3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5k
ZXgpOwotICAgIAotICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKLSAgICBtYXRjaFBhZ2VSdWxlcyhy
ZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVmdCwg
aXNGaXJzdCwgcGFnZSk7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVz
ZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIC8vIE9ubHkgY29uc2lkZXIg
dGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRN
TDUgc3BlYy4KLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5
bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBQYWdlUnVsZUNvbGxlY3RvciBjb2xs
ZWN0b3Ioc3RhdGUsIG1fcnVsZVNldHMpOworICAgIGNvbGxlY3Rvci5tYXRjaEFsbFBhZ2VSdWxl
cyhwYWdlSW5kZXgpOwogICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKICAgICBib29s
IGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKworICAgIE1hdGNoUmVzdWx0JiByZXN1bHQgPSBjb2xs
ZWN0b3IubWF0Y2hlZFJlc3VsdCgpOwogI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQogICAgIGFw
cGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4oc3RhdGUsIHJlc3VsdCwg
ZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRP
bmx5KTsKICNlbmRpZgpAQCAtMjA0NSw3NyArMTY0MSwzMSBAQCBQYXNzUmVmUHRyPENTU1J1bGVM
aXN0PiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBl
LCBQcwogICAgICAgICByZXR1cm4gMDsKIAogICAgIFN0YXRlIHN0YXRlKGRvY3VtZW50KCkpOwot
ICAgIHN0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOwotCiAg
ICAgaW5pdEVsZW1lbnQoc3RhdGUsIGUpOwotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUo
ZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29s
dmUoZG9jdW1lbnQoKSwgZSwgMCk7CisKKyAgICBFbGVtZW50UnVsZUNvbGxlY3RvciBjb2xsZWN0
b3IodGhpcywgc3RhdGUpOworICAgIGNvbGxlY3Rvci5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6
Q29sbGVjdGluZ1J1bGVzKTsKKyAgICBjb2xsZWN0b3Iuc2V0UHNldWRvU3R5bGUocHNldWRvSWQp
OworICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0obV9tZWRpdW0uZ2V0KCkpOwogCi0gICAgTWF0Y2hS
ZXN1bHQgZHVtbXk7CiAgICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMp
IHsKICAgICAgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBz
aGVldC4KLSAgICAgICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCBkdW1teSk7Ci0KKyAgICAgICAgY29s
bGVjdG9yLm1hdGNoVUFSdWxlcygpOworICAgICAgICAKICAgICAgICAgLy8gTm93IHdlIGNoZWNr
IHVzZXIgc2hlZXQgcnVsZXMuCiAgICAgICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxl
cykKLSAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKHN0YXRlLCBkdW1teSwgcnVsZXNUb0luY2x1
ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKyAgICAgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVzZXJSdWxl
cyhydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwogICAgIH0KIAogICAgIGlmIChtX21h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNUb0luY2x1ZGUgJiBBdXRob3JDU1NSdWxl
cykpIHsKLSAgICAgICAgc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoIShydWxlc1RvSW5jbHVkZSAm
IENyb3NzT3JpZ2luQ1NTUnVsZXMpKTsKKyAgICAgICAgY29sbGVjdG9yLnNldFNhbWVPcmlnaW5P
bmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CiAKICAgICAgICAg
Ly8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCi0gICAgICAgIG1hdGNoQXV0aG9y
UnVsZXMoc3RhdGUsIGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwotICAg
IH0KLQotICAgIHJldHVybiBzdGF0ZS50YWtlUnVsZUxpc3QoKTsKLX0KLQotaW5saW5lIGJvb2wg
U3R5bGVSZXNvbHZlcjo6cnVsZU1hdGNoZXMoU3RhdGUmIHN0YXRlLCBjb25zdCBSdWxlRGF0YSYg
cnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1Bz
ZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5k
YXJ5KQotewotICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgewot
ICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNl
dWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGUoKSAhPSBOT1BTRVVE
TykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy8gV2Uga25vdyBhIHN1ZmZp
Y2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkgYmVjYXVz
ZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxlIGhhc2guCi0gICAgICAgIC8vIFRoaXMgaXMgbGlt
aXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFtZXNwYWNl
LgotICAgICAgICBpZiAocnVsZURhdGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGluZ0hUTUxC
YXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewot
ICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChydWxlRGF0YS5z
ZWxlY3RvcigpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9yQ2hlY2tl
cjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCktPnRhZ1FO
YW1lKCkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIVNlbGVjdG9y
Q2hlY2tlcjo6ZmFzdENoZWNrUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3Ioc3RhdGUuZWxlbWVu
dCgpLCBydWxlRGF0YS5zZWxlY3RvcigpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgICAgICByZXR1cm4gU2VsZWN0b3JDaGVja2VyOjpmYXN0Q2hlY2socnVsZURhdGEuc2VsZWN0
b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKKyAgICAgICAgY29sbGVjdG9yLm1hdGNoQXV0aG9yUnVs
ZXMocnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKICAgICB9CiAKLSAgICAvLyBTbG93
IHBhdGguCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBz
dGF0ZS5tb2RlKCkpOwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRl
eHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9y
Q2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5lbGVtZW50U3R5bGUg
PSBzdGF0ZS5zdHlsZSgpOwotICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKLSAgICBjb250ZXh0
LnBzZXVkb1N0eWxlID0gc3RhdGUucHNldWRvU3R5bGUoKTsKLSAgICBjb250ZXh0LmJlaGF2aW9y
QXRCb3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxlY3RvckNoZWNrZXI6Ok1h
dGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8s
IERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKLSAgICBpZiAobWF0Y2ggIT0gU2VsZWN0
b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
ZiAoc3RhdGUucHNldWRvU3R5bGUoKSAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZSgp
ICE9IGR5bmFtaWNQc2V1ZG8pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1
ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENT
U1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCkKLXsKLSAg
ICBpZiAoIXJlZ2lvblNlbGVjdG9yIHx8ICFyZWdpb25FbGVtZW50KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCks
IFNlbGVjdG9yQ2hlY2tlcjo6UXVlcnlpbmdSdWxlcyk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxl
Y3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMp
KQotICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLm1hdGNoZXMocywgcmVnaW9uRWxlbWVudCkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gY29sbGVjdG9yLm1hdGNoZWRSdWxlTGlzdCgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCkBAIC0yMzkyLDg2ICsxOTQyLDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjph
cHBseU1hdGNoZWRQcm9wZXJ0aWVzKFN0YXRlJiBzdGF0ZSwgY29uc3QgTWF0Y2hSZXN1bHQmIG1h
dGMKICAgICBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cGFyZW50U3R5bGUoKSwgY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCk7CiB9CiAKLXN0YXRpYyBpbmxp
bmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBjb25zdCBT
dHlsZVJ1bGVQYWdlKiByMikKLXsKLSAgICByZXR1cm4gcjEtPnNlbGVjdG9yKCktPnNwZWNpZmlj
aXR5KCkgPCByMi0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxl
cywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VO
YW1lKQotewotICAgIGlmICghcnVsZXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VSdWxlczsKLSAgICBtYXRjaFBhZ2VSdWxlc0Zvckxp
c3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMtPnBhZ2VSdWxlcygpLCBpc0xlZnRQYWdlLCBpc0Zp
cnN0UGFnZSwgcGFnZU5hbWUpOwotICAgIGlmIChtYXRjaGVkUGFnZVJ1bGVzLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgc3RkOjpzdGFibGVfc29ydChtYXRjaGVkUGFnZVJ1bGVz
LmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMuZW5kKCksIGNvbXBhcmVQYWdlUnVsZXMpOwotCi0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRQYWdlUnVsZXMuc2l6ZSgpOyBpKysp
Ci0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgbWF0Y2hlZFBhZ2VSdWxlc1tp
XS0+cHJvcGVydGllcygpKTsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0b3JDb21w
b25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdlLCBib29s
IGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQotewotICAgIGZvciAoY29uc3Qg
Q1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVjdG9yOyBjb21wb25lbnQ7IGNvbXBvbmVudCA9
IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7Ci0gICAgICAgIGlmIChjb21wb25lbnQtPm1fbWF0
Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgewotICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FOYW1lKCkubG9jYWxOYW1lKCk7Ci0gICAgICAg
ICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIGxvY2FsTmFtZSAhPSBwYWdlTmFtZSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBDU1NT
ZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7
Ci0gICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2Ug
JiYgIWlzTGVmdFBhZ2UpCi0gICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rv
cjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCi0gICAgICAgICAgICB8fCAocHNldWRv
VHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCi0g
ICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8
U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdl
LCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBydWxlcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHlsZVJ1bGVQYWdlKiBydWxlID0gcnVs
ZXNbaV07Ci0KLSAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+
c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVz
IHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4KLSAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNl
dCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0
aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAg
ICAgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3R5bGVS
ZXNvbHZlcjo6aXNMZWZ0UGFnZShTdGF0ZSYgc3RhdGUsIGludCBwYWdlSW5kZXgpIGNvbnN0Ci17
Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIXN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAgICAgICBpc0ZpcnN0
UGFnZUxlZnQgPSB0cnVlOwotCi0gICAgcmV0dXJuIChwYWdlSW5kZXggKyAoaXNGaXJzdFBhZ2VM
ZWZ0ID8gMSA6IDApKSAlIDI7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6aXNGaXJzdFBhZ2Uo
aW50IHBhZ2VJbmRleCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSW4gY2FzZSBvZiBmb3JjZWQg
bGVmdC9yaWdodCBwYWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUgdGhlIGZpcnN0
IHBhZ2UuCi0gICAgcmV0dXJuICghcGFnZUluZGV4KTsKLX0KLQotU3RyaW5nIFN0eWxlUmVzb2x2
ZXI6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6
IEltcGxlbWVudCBwYWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBwaW5nLgotICAgIHJldHVybiAi
IjsKLX0KLQogdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5V2l0aE51bGxDaGVjayhT
dGF0ZSYgc3RhdGUsIENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSkKIHsKICAgICBp
ZiAoIXZhbHVlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIu
aCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgKaW5kZXggMjg1NmQ3MzU5ZDMy
NmNlODQ0Mzc1MDMzMDVjOTU5OGQ3NTk5ZDc0Zi4uYmE1MDQ2Y2ViNzBlOTViYTE5ZDRiYTg0M2I4
ODE5N2RlOGMxYzM3YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2
ZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCkBAIC0xODYsNiAr
MTg2LDcgQEAgcHVibGljOgogCiAgICAgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSB7IHJl
dHVybiBtX3J1bGVTZXRzOyB9CiAgICAgY29uc3QgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMo
KSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzOyB9CisgICAgU2VsZWN0b3JGaWx0ZXImIHNlbGVj
dG9yRmlsdGVyKCkgeyByZXR1cm4gbV9zZWxlY3RvckZpbHRlcjsgfQogCiAjaWYgRU5BQkxFKFNU
WUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCiAgICAgU3R5bGVTY29wZVJlc29sdmVy
KiBlbnN1cmVTY29wZVJlc29sdmVyKCkKQEAgLTMwMSwxNCArMzAyLDYgQEAgcHVibGljOgogCiAg
ICAgdm9pZCBsb2FkUGVuZGluZ1Jlc291cmNlcyhTdGF0ZSYpOwogCi1wcml2YXRlOgotICAgIC8v
IFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRlZmF1bHQgZm9udCBzaXplIGlmIGl0IGRldGVj
dHMgdGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZvbnQgZmFtaWx5IGhhcyBjaGFuZ2VkLiAtZHdo
Ci0gICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoU3RhdGUmLCBSZW5kZXJTdHls
ZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpvb21DaGFu
Z2UoU3RhdGUmLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0gICAg
dm9pZCBjaGVja0ZvclRleHRTaXplQWRqdXN0KFN0YXRlJik7Ci0KLSAgICB2b2lkIGFkanVzdFJl
bmRlclN0eWxlKFN0YXRlJiwgUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSwgRWxlbWVudCopOwotCiAgICAgc3RydWN0IFJ1bGVSYW5nZSB7CiAgICAg
ICAgIFJ1bGVSYW5nZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQmIGxhc3RSdWxlSW5kZXgpOiBm
aXJzdFJ1bGVJbmRleChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxlSW5kZXgobGFzdFJ1bGVJbmRl
eCkgeyB9CiAgICAgICAgIGludCYgZmlyc3RSdWxlSW5kZXg7CkBAIC0zNDksMjkgKzM0MiwyMCBA
QCBwcml2YXRlOgogICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1hdGNoZWRSdWxlczsK
ICAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwogICAgICAgICBib29sIGlzQ2FjaGVhYmxlOwot
ICAgIH07CiAKLSAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3Vs
dCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1
bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVy
dHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKLSAgICB2b2lkIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworICAgICAgICB2b2lkIGFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAw
LCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJv
cGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyAgICB9OwogCi0g
ICAgdm9pZCBtYXRjaEFsbFJ1bGVzKFN0YXRlJiwgTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVT
TUlMUHJvcGVydGllcyk7Ci0gICAgdm9pZCBtYXRjaFVBUnVsZXMoU3RhdGUmLCBNYXRjaFJlc3Vs
dCYpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKFN0YXRlJiwgTWF0Y2hSZXN1bHQmLCBSdWxlU2V0
Kik7Ci0gICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKFN0YXRlJiwgTWF0Y2hSZXN1bHQmLCBib29s
IGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoVXNlclJ1bGVzKFN0YXRlJiwgTWF0
Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoU2NvcGVk
QXV0aG9yUnVsZXMoU3RhdGUmLCBNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
OwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoU3RhdGUmLCBNYXRjaFJlc3VsdCYsIGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpOworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVw
IHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2Vu
ZXJpYyBmb250IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JHZW5l
cmljRmFtaWx5Q2hhbmdlKFN0YXRlJiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdlKFN0YXRlJiwgUmVuZGVyU3R5bGUq
LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3JUZXh0U2l6ZUFk
anVzdChTdGF0ZSYpOwogCi0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhTdGF0ZSYsIGNv
bnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JSZWdpb24oU3RhdGUmLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsK
LSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChTdGF0ZSYsIGNvbnN0IFZlY3Rv
cjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lk
IGFkanVzdFJlbmRlclN0eWxlKFN0YXRlJiwgUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJl
bmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCopOwogCiAgICAgYm9vbCBmYXN0UmVqZWN0
U2VsZWN0b3IoY29uc3QgUnVsZURhdGEmKSBjb25zdDsKLSAgICB2b2lkIHNvcnRNYXRjaGVkUnVs
ZXMoU3RhdGUmKTsKLSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhTdGF0ZSYs
IE1hdGNoUmVzdWx0Jik7CiAKLSAgICBib29sIHJ1bGVNYXRjaGVzKFN0YXRlJiwgY29uc3QgUnVs
ZURhdGEmLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmLCBTZWxlY3RvckNo
ZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3Nz
Qm91bmRhcnkpOwotICAgIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3Rv
ciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwogICAgIHZvaWQgYXBw
bHlNYXRjaGVkUHJvcGVydGllcyhTdGF0ZSYsIGNvbnN0IE1hdGNoUmVzdWx0JiwgY29uc3QgRWxl
bWVudCopOwogICAgIGVudW0gU3R5bGVBcHBsaWNhdGlvblBhc3MgewogI2lmIEVOQUJMRShDU1Nf
VkFSSUFCTEVTKQpAQCAtNDIyLDEyICs0MDYsOSBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9wYXJl
bnRTdHlsZSgwKQogICAgICAgICAsIG1fcm9vdEVsZW1lbnRTdHlsZSgwKQogICAgICAgICAsIG1f
cmVnaW9uRm9yU3R5bGluZygwKQotICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCi0g
ICAgICAgICwgbV9wc2V1ZG9TdHlsZShOT1BTRVVETykKICAgICAgICAgLCBtX2VsZW1lbnRMaW5r
U3RhdGUoTm90SW5zaWRlTGluaykKICAgICAgICAgLCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Q
b2ludChmYWxzZSkKICAgICAgICAgLCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxz
ZSkKLSAgICAgICAgLCBtX21vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKICAg
ICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKQogICAgICAgICAsIG1f
YXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSkKICNpZiBFTkFCTEUoQ1NTX1NI
QURFUlMpCkBAIC00NDAsNyArNDIxLDcgQEAgcHVibGljOgogCiAgICAgcHVibGljOgogICAgICAg
ICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVS
ZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAs
IFBzZXVkb0lkID0gTk9QU0VVRE8sIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDAp
OworICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVtZW50Kiwg
UmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHls
aW5nID0gMCk7CiAgICAgICAgIHZvaWQgY2xlYXIoKTsKIAogICAgICAgICBEb2N1bWVudCogZG9j
dW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2RvY3VtZW50OyB9CkBAIC00NTAsMjUgKzQzMSwxNyBA
QCBwdWJsaWM6CiAgICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c3R5bGUuZ2V0KCk7IH0KICAgICAgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gdGFrZVN0eWxl
KCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KIAotICAgICAgICBTdGF0aWNDU1NSdWxl
TGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
dGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7IH0KLQogICAgICAg
ICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJl
bnROb2RlOyB9CiAgICAgICAgIHZvaWQgc2V0UGFyZW50U3R5bGUoUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsgfQogICAgICAgICBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudFN0eWxlOyB9CiAgICAg
ICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9yb290
RWxlbWVudFN0eWxlOyB9CiAKICAgICAgICAgY29uc3QgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JT
dHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JTdHlsaW5nOyB9Ci0gICAgICAgIHZv
aWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KSB7IG1fc2FtZU9yaWdp
bk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIGJvb2wgaXNTYW1lT3JpZ2luT25s
eSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgUHNldWRvSWQg
cHNldWRvU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BzZXVkb1N0eWxlOyB9CiAgICAgICAgIEVJ
bnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5r
U3RhdGU7IH0KICAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25z
dCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQogICAgICAgICB2b2lk
IHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVt
ZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CiAgICAgICAgIGJvb2wgZWxl
bWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0
ZWRCeUNsYXNzUnVsZXM7IH0KLSAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpN
b2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAgICAgICAgCisKICAgICAgICAg
dm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBw
bHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsgfQogICAgICAgICB2b2lkIHNldEFw
cGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0KICAgICAgICAgYm9vbCBhcHBseVBy
b3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1Jl
Z3VsYXJTdHlsZTsgfQpAQCAtNTAyLDEwICs0NzUsOCBAQCBwdWJsaWM6CiAgICAgICAgIHZvaWQg
c2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9CiAgICAgICAgIHZvaWQgc2V0
VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250
RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0K
IAotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsg
cmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9Ci0gICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29u
c3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9CiAgICAg
ICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50ICYmIG1f
ZWxlbWVudC0+aXNTVkdFbGVtZW50KCk7IH0KLSAgICAgICAgCisKICAgICBwcml2YXRlOgogICAg
ICAgICBEb2N1bWVudCogbV9kb2N1bWVudDsKICAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OwpA
QCAtNTE0LDI0ICs0ODUsMTYgQEAgcHVibGljOgogICAgICAgICBDb250YWluZXJOb2RlKiBtX3Bh
cmVudE5vZGU7CiAgICAgICAgIFJlbmRlclN0eWxlKiBtX3BhcmVudFN0eWxlOwogICAgICAgICBS
ZW5kZXJTdHlsZSogbV9yb290RWxlbWVudFN0eWxlOwotICAgICAgICAKLSAgICAgICAgUmVuZGVy
UmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7Ci0gICAgICAgIGJvb2wgbV9zYW1lT3JpZ2luT25s
eTsKLSAgICAgICAgUHNldWRvSWQgbV9wc2V1ZG9TdHlsZTsKIAorICAgICAgICAvLyBSZXF1aXJl
ZCB0byBBU1NFUlQgaW4gYXBwbHlQcm9wZXJ0aWVzLgorICAgICAgICBSZW5kZXJSZWdpb24qIG1f
cmVnaW9uRm9yU3R5bGluZzsKKyAgICAgICAgCiAgICAgICAgIEVJbnNpZGVMaW5rIG1fZWxlbWVu
dExpbmtTdGF0ZTsKIAogICAgICAgICBib29sIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50
OwogCiAgICAgICAgIGJvb2wgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7CiAKLSAgICAg
ICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKLQotICAgICAgICAvLyBBIGJ1ZmZlciB1
c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIGZvciBhbiBlbGVtZW50LAotICAg
ICAgICAvLyBhbmQgYSB0ZW1wb3JhcnkgYnVmZmVyIHVzZWQgZm9yIG1lcmdlIHNvcnRpbmcuCi0g
ICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiBtX21hdGNoZWRSdWxlczsKLSAgICAg
ICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OwotCiAgICAgICAgIGJvb2wg
bV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7CiAgICAgICAgIGJvb2wgbV9hcHBseVByb3Bl
cnR5VG9WaXNpdGVkTGlua1N0eWxlOwogCkBAIC02NTYsNiArNjE5LDE5IEBAIGlubGluZSBib29s
IFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJiBpZFZh
bHVlKSBjb25zdAogICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5j
b250YWlucyhpZFZhbHVlLmltcGwoKSk7CiB9CiAKK2lubGluZSBib29sIGNoZWNrUmVnaW9uU2Vs
ZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25F
bGVtZW50KQoreworICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNr
ZXIocmVnaW9uRWxlbWVudC0+ZG9jdW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpRdWVyeWluZ1J1
bGVzKTsKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2VsZWN0b3I7IHM7
IHMgPSBDU1NTZWxlY3Rvckxpc3Q6Om5leHQocykpCisgICAgICAgIGlmIChzZWxlY3RvckNoZWNr
ZXIubWF0Y2hlcyhzLCByZWdpb25FbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRp
ZiAvLyBTdHlsZVJlc29sdmVyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9JbnNwZWN0b3JDU1NBZ2VudC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVj
dG9yQ1NTQWdlbnQuY3BwCmluZGV4IDZkNzA1YWUxZWRlZGVlZmFkYTlhMmQwMTMyZTZhZmY3Y2Vm
MTNjOWYuLjM2MTYyNjMwYjIzMTdlYzJhYjUwMmE2NDkwYmMzMTY2ODZjZDg1Y2YgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcApAQCAtOTU3LDEx
ICs5NTcsMTEgQEAgUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclByb2ZpbGU+
IEluc3BlY3RvckNTU0FnZW50OjpzdG9wU2VsZWN0b3JQcm8KICAgICByZXR1cm4gcmVzdWx0LnJl
bGVhc2UoKTsKIH0KIAotdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZShTdHls
ZVJ1bGUqIHJ1bGUsIFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIpCit2b2lkIEluc3BlY3Rv
ckNTU0FnZW50Ojp3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSogcnVsZSwgSW5zcGVjdG9yQ1NTT01X
cmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFwcGVycywgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24pCiB7CiAvLyAgICBwcmludGYoIkluc3BlY3RvckNT
U0FnZW50Ojp3aWxsTWF0Y2hSdWxlICVzXG4iLCBydWxlLT5zZWxlY3Rvckxpc3QoKS5zZWxlY3Rv
cnNUZXh0KCkudXRmOCgpLmRhdGEoKSk7CiAgICAgaWYgKG1fY3VycmVudFNlbGVjdG9yUHJvZmls
ZSkKLSAgICAgICAgbV9jdXJyZW50U2VsZWN0b3JQcm9maWxlLT5zdGFydFNlbGVjdG9yKHN0eWxl
UmVzb2x2ZXItPmluc3BlY3RvckNTU09NV3JhcHBlcnMoKS5nZXRXcmFwcGVyRm9yUnVsZUluU2hl
ZXRzKHJ1bGUsIHN0eWxlUmVzb2x2ZXItPmRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9u
KCkpKTsKKyAgICAgICAgbV9jdXJyZW50U2VsZWN0b3JQcm9maWxlLT5zdGFydFNlbGVjdG9yKGlu
c3BlY3RvckNTU09NV3JhcHBlcnMuZ2V0V3JhcHBlckZvclJ1bGVJblNoZWV0cyhydWxlLCBzdHls
ZVNoZWV0Q29sbGVjdGlvbikpOwogfQogCiB2b2lkIEluc3BlY3RvckNTU0FnZW50OjpkaWRNYXRj
aFJ1bGUoYm9vbCBtYXRjaGVkKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3RvckNTU0FnZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9y
Q1NTQWdlbnQuaAppbmRleCAxNDNlNDU0YWE5NmIwMTY4MTk4MDMxNTEwZmY1OTczOGFmMGZlZTE3
Li40MGY4ODIwZTJhMjc5YWI1ZTY4YWY5MGQ4MDY0NDZhMmJlNTg3ZGEyIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaApAQCAtNDcsNyArNDcsOSBAQCBj
bGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOwogY2xhc3MgQ1NTU3R5bGVSdWxlOwogY2xhc3MgQ1NT
U3R5bGVTaGVldDsKIGNsYXNzIERvY3VtZW50OworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbjsKIGNsYXNzIEVsZW1lbnQ7CitjbGFzcyBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwog
Y2xhc3MgSW5zcGVjdG9yRnJvbnRlbmQ7CiBjbGFzcyBJbnN0cnVtZW50aW5nQWdlbnRzOwogY2xh
c3MgTmFtZU5vZGVNYXA7CkBAIC0xMjUsNyArMTI3LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwg
dm9pZCBzdG9wU2VsZWN0b3JQcm9maWxlcihFcnJvclN0cmluZyosIFJlZlB0cjxUeXBlQnVpbGRl
cjo6Q1NTOjpTZWxlY3RvclByb2ZpbGU+Jik7CiAKICAgICBQYXNzUmVmUHRyPFR5cGVCdWlsZGVy
OjpDU1M6OlNlbGVjdG9yUHJvZmlsZT4gc3RvcFNlbGVjdG9yUHJvZmlsZXJJbXBsKEVycm9yU3Ry
aW5nKiwgYm9vbCBuZWVkUHJvZmlsZSk7Ci0gICAgdm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVs
ZSosIFN0eWxlUmVzb2x2ZXIqKTsKKyAgICB2b2lkIHdpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiwg
SW5zcGVjdG9yQ1NTT01XcmFwcGVycyYsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsK
ICAgICB2b2lkIGRpZE1hdGNoUnVsZShib29sKTsKICAgICB2b2lkIHdpbGxQcm9jZXNzUnVsZShT
dHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CiAgICAgdm9pZCBkaWRQcm9jZXNzUnVsZSgpOwpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRh
dGlvbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uLmNwcAppbmRleCA1YWFhYjE4YWM2N2M0MmEzODY2ODcwN2Q4Y2U1NGYyNGUxZTNjNTVjLi5m
MzAzZmU2NDE4NTQwOWM2ODBlMzUzODg0OGExY2RmYzc2ZWEzYTQyIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmNwcAorKysgYi9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmNwcApAQCAt
NTgyLDExICs1ODIsMTEgQEAgdm9pZCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFNjaGVk
dWxlU3R5bGVSZWNhbGN1bGF0aW9uSW1wbChJbnN0cnVtZW50aW5nQWcKICAgICAgICAgcmVzb3Vy
Y2VBZ2VudC0+ZGlkU2NoZWR1bGVTdHlsZVJlY2FsY3VsYXRpb24oZG9jdW1lbnQpOwogfQogCi1J
bnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsTWF0Y2hSdWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiBpbnN0cnVtZW50aW5nQWdlbnRz
LCBTdHlsZVJ1bGUqIHJ1bGUsIFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIpCitJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0
Y2hSdWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiBpbnN0cnVtZW50aW5nQWdlbnRzLCBTdHls
ZVJ1bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBl
cnMsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHNoZWV0Q29sbGVjdGlvbikKIHsKICAg
ICBJbnNwZWN0b3JDU1NBZ2VudCogY3NzQWdlbnQgPSBpbnN0cnVtZW50aW5nQWdlbnRzLT5pbnNw
ZWN0b3JDU1NBZ2VudCgpOwogICAgIGlmIChjc3NBZ2VudCkgewotICAgICAgICBjc3NBZ2VudC0+
d2lsbE1hdGNoUnVsZShydWxlLCBzdHlsZVJlc29sdmVyKTsKKyAgICAgICAgY3NzQWdlbnQtPndp
bGxNYXRjaFJ1bGUocnVsZSwgaW5zcGVjdG9yQ1NTT01XcmFwcGVycywgc2hlZXRDb2xsZWN0aW9u
KTsKICAgICAgICAgcmV0dXJuIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZShpbnN0cnVt
ZW50aW5nQWdlbnRzLCAxKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaAppbmRleCBmZjYzMDA1MTZlZjEwMzM0YjAw
MjIxMDljZmVkYjM2ZjNkNjEyZjNhLi44MTQ1NzAxZjEzYTMyNzFlOTJjMDg0Y2E3YmEzNGIzNjQy
ZWNmMjAwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvcklu
c3RydW1lbnRhdGlvbi5oCkBAIC01OSwxMCArNTksMTIgQEAgY2xhc3MgRG9jdW1lbnQ7CiBjbGFz
cyBFbGVtZW50OwogY2xhc3MgRXZlbnRDb250ZXh0OwogY2xhc3MgRG9jdW1lbnRMb2FkZXI7Citj
bGFzcyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOwogY2xhc3MgRGV2aWNlT3JpZW50YXRp
b25EYXRhOwogY2xhc3MgR2VvbG9jYXRpb25Qb3NpdGlvbjsKIGNsYXNzIEdyYXBoaWNzQ29udGV4
dDsKIGNsYXNzIEluc3BlY3RvckNTU0FnZW50OworY2xhc3MgSW5zcGVjdG9yQ1NTT01XcmFwcGVy
czsKIGNsYXNzIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjsKIGNsYXNzIEluc3BlY3RvclRpbWVs
aW5lQWdlbnQ7CiBjbGFzcyBJbnN0cnVtZW50aW5nQWdlbnRzOwpAQCAtMTcxLDcgKzE3Myw3IEBA
IHB1YmxpYzoKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxS
ZWNhbGN1bGF0ZVN0eWxlKERvY3VtZW50Kik7CiAgICAgc3RhdGljIHZvaWQgZGlkUmVjYWxjdWxh
dGVTdHlsZShjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmKTsKICAgICBzdGF0
aWMgdm9pZCBkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbihEb2N1bWVudCopOwotICAgIHN0
YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZShEb2N1bWVu
dCosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKKyAgICBzdGF0aWMgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uQ29va2llIHdpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzJiwgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiopOwog
ICAgIHN0YXRpYyB2b2lkIGRpZE1hdGNoUnVsZShjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUmLCBib29sIG1hdGNoZWQpOwogICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50
YXRpb25Db29raWUgd2lsbFByb2Nlc3NSdWxlKERvY3VtZW50KiwgU3R5bGVSdWxlKiwgU3R5bGVS
ZXNvbHZlciopOwogICAgIHN0YXRpYyB2b2lkIGRpZFByb2Nlc3NSdWxlKGNvbnN0IEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwpAQCAtMzcyLDcgKzM3NCw3IEBAIHByaXZhdGU6CiAg
ICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsUmVjYWxjdWxhdGVT
dHlsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIEZyYW1lKik7CiAgICAgc3RhdGljIHZvaWQg
ZGlkUmVjYWxjdWxhdGVTdHlsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llJik7CiAgICAgc3RhdGljIHZvaWQgZGlkU2NoZWR1bGVTdHlsZVJlY2FsY3VsYXRpb25JbXBs
KEluc3RydW1lbnRpbmdBZ2VudHMqLCBEb2N1bWVudCopOwotICAgIHN0YXRpYyBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50
cyosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKKyAgICBzdGF0aWMgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uQ29va2llIHdpbGxNYXRjaFJ1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMq
LCBTdHlsZVJ1bGUqLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiwgRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbiopOwogICAgIHN0YXRpYyB2b2lkIGRpZE1hdGNoUnVsZUltcGwoY29uc3QgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJiwgYm9vbCBtYXRjaGVkKTsKICAgICBzdGF0aWMg
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxQcm9jZXNzUnVsZUltcGwoSW5zdHJ1
bWVudGluZ0FnZW50cyosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKICAgICBzdGF0aWMg
dm9pZCBkaWRQcm9jZXNzUnVsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llJik7CkBAIC0xMTYyLDE2ICsxMTY0LDE3IEBAIGlubGluZSB2b2lkIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbjo6ZGlkU2NoZWR1bGVTdHlsZVJlY2FsY3VsYXRpb24oRG9jdW1lbnQqIGRvCiAj
ZW5kaWYKIH0KIAotaW5saW5lIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBTdHls
ZVJ1bGUqIHJ1bGUsIFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIpCitpbmxpbmUgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1h
dGNoUnVsZShEb2N1bWVudCogZG9jdW1lbnQsIFN0eWxlUnVsZSogcnVsZSwgSW5zcGVjdG9yQ1NT
T01XcmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFwcGVycywgRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24pCiB7CiAjaWYgRU5BQkxFKElOU1BFQ1RPUikK
ICAgICBGQVNUX1JFVFVSTl9JRl9OT19GUk9OVEVORFMoSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
Q29va2llKCkpOwogICAgIGlmIChJbnN0cnVtZW50aW5nQWdlbnRzKiBpbnN0cnVtZW50aW5nQWdl
bnRzID0gaW5zdHJ1bWVudGluZ0FnZW50c0ZvckRvY3VtZW50KGRvY3VtZW50KSkKLSAgICAgICAg
cmV0dXJuIHdpbGxNYXRjaFJ1bGVJbXBsKGluc3RydW1lbnRpbmdBZ2VudHMsIHJ1bGUsIHN0eWxl
UmVzb2x2ZXIpOworICAgICAgICByZXR1cm4gd2lsbE1hdGNoUnVsZUltcGwoaW5zdHJ1bWVudGlu
Z0FnZW50cywgcnVsZSwgaW5zcGVjdG9yQ1NTT01XcmFwcGVycywgc3R5bGVTaGVldENvbGxlY3Rp
b24pOwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0oZG9jdW1lbnQpOwogICAgIFVOVVNFRF9QQVJB
TShydWxlKTsKLSAgICBVTlVTRURfUEFSQU0oc3R5bGVSZXNvbHZlcik7CisgICAgVU5VU0VEX1BB
UkFNKGluc3BlY3RvckNTU09NV3JhcHBlcnMpOworICAgIFVOVVNFRF9QQVJBTShzdHlsZVNoZWV0
Q29sbGVjdGlvbik7CiAjZW5kaWYKICAgICByZXR1cm4gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
Q29va2llKCk7CiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>189694</attachid>
            <date>2013-02-21 23:21:18 -0800</date>
            <delta_ts>2013-02-21 23:35:51 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130222161738.patch</filename>
            <type>text/plain</type>
            <size>99344</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQzNjc0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNjM5Y2MxNzM1NzQ2YzNk
MTUzM2U5MWUzYmM1YTEzMDdjNTkyN2NkMC4uYmY2MDhmYzYzNTc4ZDkzY2IyMWIxZjg4NjMzYjky
ODlkMWJmYTI0OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyNCBAQAorMjAxMy0wMi0yMSAgVGFr
YXNoaSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5n
XSBJbXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1l
bnQgYW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4g
Y2xhc3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAg
YSBzdHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3Rvcmlu
Zy4KKworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxp
c3QuYW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6Cisg
ICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNz
cy9DU1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFu
ZCBQYWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6bGVmdFRv
UmlnaHREZWNsYXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpyaWdodFRvTGVmdERlY2xhcmF0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUmVz
dWx0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUnVs
ZUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFkZE1hdGNo
ZWRSdWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjbGVhck1h
dGNoZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5z
dXJlUnVsZUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMpOgorICAgICAgICAoTWF0Y2hpbmdVQVJ1bGVzU2NvcGUp
OgorICAgICAgICAoV2ViQ29yZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxl
c1Njb3BlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hp
bmdVQVJ1bGVzU2NvcGUpOgorICAgICAgICAoV2ViQ29yZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6
OmlzTWF0Y2hpbmdVQVJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVj
dG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVs
ZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyk6
CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29wZWRBdXRo
b3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hI
b3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNo
QXV0aG9yUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1h
dGNoVXNlclJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpt
YXRjaFVBUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnJ1
bGVNYXRjaGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZVJ1bGVz
KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0TWF0Y2hlZFJ1
bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEFsbFJ1
bGVzKToKKyAgICAgICAgTW92ZWQgdGhlc2UgbWV0aG9kcyBmcm9tIFN0eWxlUmVzb2x2ZXIgdG8g
dGhpcyBjbGFzcy4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpoYXNB
bnlNYXRjaGluZ1J1bGVzKToKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgY2hlY2tp
bmcgd2hldGhlciBhIGdpdmVuIGVsZW1lbnQgY2FuIHNoYXJlCisgICAgICAgIGEgY2FjaGUuCisg
ICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChFbGVtZW50UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBV
c2Ugc3R5bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFi
bGVzLCBpLmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NT
T01XcmFwcGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNldWRvU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNldFNhbWVPcmlnaW5Pbmx5KToKKyAgICAgICAgKFdl
YkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzZXRSZWdpb25Gb3JTdHlsaW5nKToKKyAgICAg
ICAgTW9kZSwgU2FtZU9yaWdpbk9ubHksIFJlZ2lvbkZvclN0eWxpbmcgYXJlIG9ubHkgdXNlZCB3
aGlsZSBjb2xsZWN0aW5nCisgICAgICAgIG1hdGNoZWQgcnVsZXMuCisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TWVkaXVtKToKKyAgICAgICAgTmVlZCB0byBrbm93
IHdoaWNoIGRlZmF1bHQgc3R5bGVzaGVldCBzaG91bGQgYmUgbG9va2VkIHVwLgorICAgICAgICAo
V2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmRvY3VtZW50KToKKyAgICAgICAgKiBjc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rv
cjo6UGFnZVJ1bGVDb2xsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0
b3I6Om1hdGNoZWRSZXN1bHQpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OmlzUmlnaHRQYWdlKToKKyAgICAgICAgKiBjc3MvU3R5bGVSZXNvbHZlci5jcHA6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVh
cik6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdDo6YWRkTWF0
Y2hlZFByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmluaXRGb3JTdHlsZVJlc29sdmUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6
c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNv
bHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yUGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpw
c2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIu
aDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAg
ICAgICAgQWRkZWQgdG8gb2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVj
dG9yJ3MgY29uc3RydWN0b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1h
dGNoUmVzdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0
ZSk6CisgICAgICAgIFRvIHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVy
dGllcywgbmVlZCB0byBrZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAg
KFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckNTU0FnZW50Ojp3aWxsTWF0Y2hSdWxlKToKKyAg
ICAgICAgUmVtb3ZlZCBTdHlsZVJlc29sdmVyIGZyb20gaXRzIHBhcmFtZXRlciBsaXN0LiBJbnN0
ZWFkLCBhZGRlZAorICAgICAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzIGFuZCBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2Vu
dC5oOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChJbnNwZWN0b3JDU1NBZ2VudCk6Cisg
ICAgICAgICogaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHA6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZUltcGwpOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZSk6CisKIDIwMTMtMDItMjEgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQu
b3JnPgogCiAgICAgICAgIHRhYmxlcy9tb3ppbGxhL2J1Z3MvYnVnODk1MC5odG1sIGZhaWxzIHdp
dGggdGhyZWFkZWQgcGFyc2VyIGR1ZSB0byBhdHRyaWJ1dGUgZHVwbGljYXRpb24KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKaW5kZXggNDUwMTdiNDVmMDdhZDYxZmVjNDkxZjg3YmZlZTAzNDQ0NTQwY2YyNS4u
MDYzYTE2N2ZjNTM2YWJmMmZmZmNiZmQ1MjM4N2RiNjVkNjZjY2YxMiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTEwNjgsNiArMTA2OCw3IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3Mv
Q1NTVmFsdWVQb29sLmNwcAogICAgIGNzcy9ET01XaW5kb3dDU1MuY3BwCiAgICAgY3NzL0RvY3Vt
ZW50UnVsZVNldHMuY3BwCisgICAgY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAogICAgIGNz
cy9Gb250RmVhdHVyZVZhbHVlLmNwcAogICAgIGNzcy9Gb250VmFsdWUuY3BwCiAgICAgY3NzL0lu
c3BlY3RvckNTU09NV3JhcHBlcnMuY3BwCkBAIC0xMDgwLDYgKzEwODEsNyBAQCBzZXQoV2ViQ29y
ZV9TT1VSQ0VTCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0LmNwcAogICAgIGNzcy9NZWRpYVF1ZXJ5
TGlzdExpc3RlbmVyLmNwcAogICAgIGNzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5jcHAKKyAgICBjc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwCiAgICAgY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJh
dGlvbi5jcHAKICAgICBjc3MvUkdCQ29sb3IuY3BwCiAgICAgY3NzL1J1bGVGZWF0dXJlLmgKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0gYi9Tb3VyY2UvV2Vi
Q29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IGZjYWMyMzg4MTFiZTA2MjAxNzQwYmFhYTEw
MWQzMmRkYzlhMDk5YTAuLmM3MDI1NDY2NDQzN2IxNjU4YWNkZDE1MTA1NDQ3OTI5OTgyYjljZjcg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KKysrIGIvU291
cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQpAQCAtMjY1NCw2ICsyNjU0LDggQEAgd2Vi
Y29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRGFzaGJvYXJkUmVnaW9uLmgg
XAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCBcCiAJU291cmNlL1dl
YkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuaCBcCisJU291cmNlL1dlYkNvcmUvY3NzL0VsZW1l
bnRSdWxlQ29sbGVjdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCBcCiAJ
U291cmNlL1dlYkNvcmUvY3NzL0ZvbnRGZWF0dXJlVmFsdWUuaCBcCiAJU291cmNlL1dlYkNvcmUv
Y3NzL0ZvbnRWYWx1ZS5jcHAgXApAQCAtMjY3OCw2ICsyNjgwLDggQEAgd2ViY29yZV9zb3VyY2Vz
ICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5oIFwKIAlT
b3VyY2UvV2ViQ29yZS9jc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwIFwKIAlTb3VyY2UvV2ViQ29y
ZS9jc3MvTWVkaWFRdWVyeU1hdGNoZXIuaCBcCisJU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxl
Q29sbGVjdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgg
XAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9QYWlyLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Qcm9w
ZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvUHJv
cGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmggXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvVGFyZ2V0LnByaSBiL1NvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKaW5kZXggZmY3ZmE3M2Fk
YzAzOTI1ODI1NDQyNTMyN2JjODJmMDAxOWNiZmM2Yi4uODk3ODA5ZTg0ZDAwNGUxOTNhYTAyZTYw
NTAwMzYzMTFlNzM5MDdjMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQor
KysgYi9Tb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCkBAIC0zMDcsNiArMzA3LDcgQEAgU09VUkNF
UyArPSBcCiAgICAgY3NzL0NTU1ZhbHVlUG9vbC5jcHAgXAogICAgIGNzcy9ET01XaW5kb3dDU1Mu
Y3BwIFwKICAgICBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAgXAorICAgIGNzcy9FbGVtZW50UnVs
ZUNvbGxlY3Rvci5jcHAgXAogICAgIGNzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCBcCiAgICAgY3Nz
L0ZvbnRWYWx1ZS5jcHAgXAogICAgIGNzcy9JbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmNwcCBcCkBA
IC0zMTksNiArMzIwLDcgQEAgU09VUkNFUyArPSBcCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0LmNw
cCBcCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuY3BwIFwKICAgICBjc3MvTWVkaWFR
dWVyeU1hdGNoZXIuY3BwIFwKKyAgICBjc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIFwKICAgICBj
c3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCBcCiAgICAgY3NzL1JHQkNvbG9y
LmNwcCBcCiAgICAgY3NzL1J1bGVGZWF0dXJlLmNwcCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggYmE1
NmJjYjJlMTI1M2ViMTRiNWFjMDRhNzhhOWMyNzk5ODhmZmY0My4uZmI2MjE2ZWVmOTMxMjE3Y2Qw
NDEyYTViNDU3OTQzZjI2Mjg4OWMxNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMTU1Myw2ICsxNTUz
LDggQEAKICAgICAgICAgICAgICdjc3MvRGFzaGJvYXJkUmVnaW9uLmgnLAogICAgICAgICAgICAg
J2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCcsCiAgICAgICAgICAgICAnY3NzL0RvY3VtZW50UnVs
ZVNldHMuaCcsCisgICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCcsCisg
ICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgnLAogICAgICAgICAgICAgJ2Nz
cy9Gb250RmVhdHVyZVZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRGZWF0dXJlVmFs
dWUuaCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRWYWx1ZS5jcHAnLApAQCAtMTU3Niw2ICsxNTc4
LDggQEAKICAgICAgICAgICAgICdjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5oJywKICAgICAg
ICAgICAgICdjc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwJywKICAgICAgICAgICAgICdjc3MvTWVk
aWFRdWVyeU1hdGNoZXIuaCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNw
cCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgnLAogICAgICAgICAgICAg
J2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwJywKICAgICAgICAgICAgICdj
c3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmgnLAogICAgICAgICAgICAgJ2Nzcy9S
R0JDb2xvci5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCmluZGV4IDBmZWU0YmMwODYyZjJmZjFmNzNiNTZkMmY2MTY0MGU3ZTI3NTFj
ZGQuLjY0OGRlNTQ0OTNiOTI2MzYwODAxZmU0MGYyZWZlNTBhMDhmMWU1ZmQgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTY1Mjks
NiArNjUyOSwxMCBAQAogCQlGQkQ2QUY4QjE1RUYyNUU1MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFw
ZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJE
NkFGODYxNUVGMjFENDAwOEI3MTEwIC8qIENTU0Jhc2ljU2hhcGVzLmNwcCAqLzsgfTsKIAkJRkJE
NkFGOEMxNUVGMjYwNDAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkQ2QUY4MzE1RUYyMUEzMDA4QjcxMTAgLyog
QmFzaWNTaGFwZXMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQlGQkQ2QUY4RDE1RUYyNjBBMDA4QjcxMTAgLyogQmFzaWNTaGFwZXMuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODIxNUVGMjFB
MzAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmNwcCAqLzsgfTsKKwkJRkJEQjYxOUIxNkQ2MDMyQTAw
QkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MTlBMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVt
ZW50UnVsZUNvbGxlY3Rvci5jcHAgKi87IH07CisJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAv
KiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0
b3IuY3BwICovOyB9OworCQlGQkRCNjE5RjE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZCREI2MTlFMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oICovOyB9
OworCQlGQkRCNjFBMTE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MUEwMTZENjAz
N0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovOyB9OwogCQlGQkY4OTA0NTE2OUU5
RjFGMDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdSdWxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCRjg5MDQ0MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NH
cm91cGluZ1J1bGUuY3BwICovOyB9OwogCQlGQzU0RDA1NzE2QTc2NzMxMDA1NzVFNEQgLyogQ1NT
U3VwcG9ydHNSdWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGQzYzQkRCMTE2N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmggKi87IH07
CiAJCUZDNTREMDU4MTZBNzY3NkUwMDU3NUU0RCAvKiBKU0NTU1N1cHBvcnRzUnVsZS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkM4NDgwMkUxNjdBQjQ0
NDAwOENEMTAwIC8qIEpTQ1NTU3VwcG9ydHNSdWxlLmggKi87IH07CkBAIC0xNDI1Miw2ICsxNDI1
NiwxMCBAQAogCQlGQkQ2QUY4NTE1RUYyMUQ0MDA4QjcxMTAgLyogQmFzaWNTaGFwZUZ1bmN0aW9u
cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBCYXNpY1NoYXBlRnVuY3Rpb25z
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRDZBRjg2MTVFRjIxRDQwMDhCNzEx
MCAvKiBDU1NCYXNpY1NoYXBlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBDU1NCYXNpY1NoYXBlcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZC
RDZBRjg3MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBDU1NCYXNpY1NoYXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQlGQkRCNjE5QTE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0
b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRWxlbWVudFJ1bGVD
b2xsZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQkRCNjE5QzE2RDYw
MzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gUGFnZVJ1bGVDb2xsZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xs
ZWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRWxlbWVudFJ1bGVDb2xs
ZWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxQTAxNkQ2MDM3RTAw
QkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFBhZ2VSdWxlQ29sbGVjdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUZCRjg5MDQ0MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NHcm91cGluZ1J1bGUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTR3JvdXBpbmdSdWxlLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkM2M0JEQjAxNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1
cHBvcnRzUnVsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NT
dXBwb3J0c1J1bGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQzYzQkRCMTE2
N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IENTU1N1cHBvcnRzUnVsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwpAQCAtMjIwNTMsNiArMjIwNjEsOCBAQAogCQkJCUZDOUEwRjcxMTY0MDk0Q0YwMDNENkI4RCAv
KiBET01XaW5kb3dDU1MuY3BwICovLAogCQkJCUZDOUEwRjcyMTY0MDk0Q0YwMDNENkI4RCAvKiBE
T01XaW5kb3dDU1MuaCAqLywKIAkJCQlGQzlBMEY3MzE2NDA5NENGMDAzRDZCOEQgLyogRE9NV2lu
ZG93Q1NTLmlkbCAqLywKKwkJCQlGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1
bGVDb2xsZWN0b3IuaCAqLywKKwkJCQlGQkRCNjE5QTE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVu
dFJ1bGVDb2xsZWN0b3IuY3BwICovLAogCQkJCTRBNkU5RkMyMTNDMTdEMUQwMDQ2QTdGOCAvKiBG
b250RmVhdHVyZVZhbHVlLmggKi8sCiAJCQkJQTgwRTZDQzcwQTE5ODlDQTAwN0ZCOEM1IC8qIEZv
bnRWYWx1ZS5jcHAgKi8sCiAJCQkJQTgwRTZDQzMwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1
ZS5oICovLApAQCAtMjIwODgsNiArMjIwOTgsOCBAQAogCQkJCUQzQTk0QTM1MTIyREFCQUMwMEEz
N0JCQyAvKiBNZWRpYVF1ZXJ5TGlzdExpc3RlbmVyLmlkbCAqLywKIAkJCQlEM0FBMTBGMTEyM0E5
OEFBMDA5MjE1MkIgLyogTWVkaWFRdWVyeU1hdGNoZXIuY3BwICovLAogCQkJCUQzQUExMEYyMTIz
QTk4QUEwMDkyMTUyQiAvKiBNZWRpYVF1ZXJ5TWF0Y2hlci5oICovLAorCQkJCUZCREI2MUEwMTZE
NjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovLAorCQkJCUZCREI2MTlDMTZE
NjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgKi8sCiAJCQkJQTgwRTZDRDEw
QTE5ODlDQTAwN0ZCOEM1IC8qIFBhaXIuaCAqLywKIAkJCQkzMTg5RTZEQjE2QjIxMDM1MDAzODZF
QTMgLyogcGx1Z0lucy5jc3MgKi8sCiAJCQkJRTRCQkVEMEMxNEY0MDI1RDAwM0YwQjk4IC8qIFBy
b3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgKi8sCkBAIC0yNjYwMSw2ICsyNjYxMyw4
IEBACiAJCQkJOTc3RTJFMEYxMkYwRkM5QzAwQzEzMzc5IC8qIFhTU0F1ZGl0b3IuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTk3N0UyRTBGMTJGMEZDOUMwMEMxMzM4MCAvKiBYU1NBdWRpdG9yRGVsZWdh
dGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUZENTM3MzUzMTM3QjY1MTgwMDAwOERDRSAvKiBaZXJv
UG9sZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRkJEQjYxOUYxNkQ2MDM2NTAwQkIzMzk0IC8qIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQlGQkRCNjFBMTE2RDYwMzdF
MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjk3OTUs
NiArMjk4MDksOCBAQAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM3OSAvKiBYU1NBdWRpdG9y
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM4MCAvKiBYU1NB
dWRpdG9yRGVsZWdhdGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJRkQ1MzczNTIxMzdCNjUxODAw
MDA4RENFIC8qIFplcm9Qb2xlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZCREI2MTlCMTZENjAz
MkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLywKKwkJ
CQlGQkRCNjE5RDE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9
IDA7CiAJCX07CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUuY3Bw
IGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU0FsbEluT25lLmNwcAppbmRleCAwOWE1NDNiM2VlNjRm
ODI4MTRhMzc1YzhlNWU5ZjEwN2VlMTk4ZjZkLi4xNzdmODYxMDg0OTkzN2JiNDMzMWE5ZWVjYjFh
MDFhOTVlYTczOGMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NBbGxJbk9uZS5jcHAKQEAgLTcxLDcgKzcx
LDkgQEAKICNpbmNsdWRlICJDU1NWYWx1ZVBvb2wuY3BwIgogI2luY2x1ZGUgIkRPTVdpbmRvd0NT
Uy5jcHAiCiAjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5jcHAiCisjaW5jbHVkZSAiRWxlbWVu
dFJ1bGVDb2xsZWN0b3IuY3BwIgogI2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuY3Bw
IgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmNwcCIKICNpbmNsdWRlICJSdWxlRmVhdHVy
ZS5jcHAiCiAjaW5jbHVkZSAiUnVsZVNldC5jcHAiCiAjaW5jbHVkZSAiU2VsZWN0b3JGaWx0ZXIu
Y3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9y
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZTdhMmIwNmNmZTQ3MTc3N2ZkYTJlZTllZDM3MjFmMWE4ZDAyNjAxNQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKQEAg
LTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25v
bGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRmZWxkIEpl
bnNlbiAoa2RlQGNhcmV3b2xmLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBOaWNo
b2xhcyBTaGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAw
NSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxleGV5IFBy
b3NrdXJ5YWtvdiA8YXBAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBF
cmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5
IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNo
bW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24g
TGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEy
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5oIgorCisjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiQ1NTUnVsZS5oIgorI2luY2x1ZGUgIkNTU1J1bGVMaXN0
LmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3Qu
aCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiSFRNTEVsZW1lbnQu
aCIKKyNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKKyNpbmNsdWRlICJTVkdFbGVtZW50LmgiCisj
aW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKKyNpbmNsdWRlICJTdHlsZWRF
bGVtZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIFN0eWxlUHJvcGVydHlT
ZXQqIGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwo
UmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCBsZWZ0VG9SaWdodERlY2wsIChTdHlsZVByb3BlcnR5
U2V0OjpjcmVhdGUoKSkpOworICAgIGlmIChsZWZ0VG9SaWdodERlY2wtPmlzRW1wdHkoKSkKKyAg
ICAgICAgbGVmdFRvUmlnaHREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwg
Q1NTVmFsdWVMdHIpOworICAgIHJldHVybiBsZWZ0VG9SaWdodERlY2wuZ2V0KCk7Cit9CisKK3N0
YXRpYyBTdHlsZVByb3BlcnR5U2V0KiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkKK3sKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgcmlnaHRUb0xlZnRE
ZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBpZiAocmlnaHRUb0xlZnRE
ZWNsLT5pc0VtcHR5KCkpCisgICAgICAgIHJpZ2h0VG9MZWZ0RGVjbC0+c2V0UHJvcGVydHkoQ1NT
UHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlUnRsKTsKKyAgICByZXR1cm4gcmlnaHRUb0xlZnRE
ZWNsLmdldCgpOworfQorCitTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCYgRWxlbWVudFJ1bGVD
b2xsZWN0b3I6Om1hdGNoZWRSZXN1bHQoKQoreworICAgIEFTU0VSVChtX21vZGUgPT0gU2VsZWN0
b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgcmV0dXJuIG1fcmVzdWx0OworfQorCitQ
YXNzUmVmUHRyPENTU1J1bGVMaXN0PiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1bGVM
aXN0KCkKK3sKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGlu
Z1J1bGVzKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2
b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSog
cnVsZSkKK3sKKyAgICBpZiAoIW1fbWF0Y2hlZFJ1bGVzKQorICAgICAgICBtX21hdGNoZWRSdWxl
cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4pOworICAgIG1fbWF0
Y2hlZFJ1bGVzLT5hcHBlbmQocnVsZSk7Cit9CisKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpjbGVhck1hdGNoZWRSdWxlcygpCit7CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykK
KyAgICAgICAgcmV0dXJuOworICAgIG1fbWF0Y2hlZFJ1bGVzLT5jbGVhcigpOworfQorCitpbmxp
bmUgU3RhdGljQ1NTUnVsZUxpc3QqIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjplbnN1cmVSdWxlTGlz
dCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0KQorICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGlj
Q1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOworfQor
CitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVy
dGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJs
ZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0KQorICAgICAgICByZXR1cm47CisgICAgbV9yZXN1
bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpOworICAgIGlmIChtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQorICAg
ICAgICBtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gbV9yZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlOworICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHByb3BlcnR5
U2V0KTsKKyAgICBpZiAoIWlzQ2FjaGVhYmxlKQorICAgICAgICBtX3Jlc3VsdC5pc0NhY2hlYWJs
ZSA9IGZhbHNlOworfQorCitjbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29wZSB7CitwdWJsaWM6Cisg
ICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKyAgICB+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsK
KworICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7CisKK3ByaXZhdGU6CisgICAg
c3RhdGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Cit9OworCitNYXRjaGluZ1VBUnVsZXNTY29w
ZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQoreworICAgIEFTU0VSVCghbV9tYXRjaGluZ1VBUnVs
ZXMpOworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKK30KKworTWF0Y2hpbmdVQVJ1bGVz
U2NvcGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMg
PSBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hp
bmdVQVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVsZXM7Cit9CisKK2Jvb2wg
TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7CisKK3ZvaWQg
RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVx
dWVzdCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkK
K3sKKyAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOworICAgIEFTU0VSVChtX3N0YXRl
LmVsZW1lbnQoKSk7CisKKyAgICBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCk7CisgICAgY29uc3QgU3R5
bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKTsKKyAgICBj
b25zdCBBdG9taWNTdHJpbmcmIHBzZXVkb0lkID0gZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKTsK
KyAgICBpZiAoIXBzZXVkb0lkLmlzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlQoc3R5bGVkRWxl
bWVudCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3Qu
cnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBzZXVkb0lkLmltcGwoKSksIG1hdGNo
UmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisg
ICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQorICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmN1ZVBzZXVkb1J1bGVzKCksIG1h
dGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyNlbmRpZgorICAgIC8vIENoZWNrIHdoZXRoZXIgb3Ro
ZXIgdHlwZXMgb2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4gdGhlIGN1cnJlbnQgdHJlZSBzY29w
ZS4gQ3JpdGVyaWEgZm9yIHRoaXM6CisgICAgLy8gYSkgaXQncyBhIFVBIHJ1bGUKKyAgICAvLyBi
KSB0aGUgdHJlZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVzCisgICAgLy8gYykgdGhlIHJ1bGVz
IGNvbWVzIGZyb20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0aGluIHRoZSBzYW1lIHRyZWUgc2Nv
cGUKKyAgICBUcmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1lbnQtPnRyZWVTY29wZSgpOworICAg
IGlmICghTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKKyAgICAgICAg
JiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQorICAgICAgICAmJiAoIW1hdGNoUmVx
dWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29w
ZSkKKyAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3MsIHRhZywgYW5kIGV2
ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAorICAgIC8vIHRoZW4gc29ydCB0aGUgYnVm
ZmVyLgorICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmlkUnVsZXMoZWxlbWVudC0+aWRGb3JT
dHlsZVJlc29sdXRpb24oKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
aWYgKHN0eWxlZEVsZW1lbnQgJiYgc3R5bGVkRWxlbWVudC0+aGFzQ2xhc3MoKSkgeworICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMoKS5zaXpl
KCk7ICsraSkKKyAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKClbaV0u
aW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworICAgIGlmIChlbGVt
ZW50LT5pc0xpbmsoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7CisgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6bWF0Y2hlc0ZvY3VzUHNldWRvQ2xh
c3MoZWxlbWVudCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+Zm9jdXNQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1
bGVTZXQtPnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1
ZXN0LnJ1bGVTZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
K30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JS
ZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1
bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghbV9yZWdpb25Gb3JTdHlsaW5nKQorICAg
ICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQt
Pm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lv
blNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVs
ZVNldHMuYXQoaSkuc2VsZWN0b3I7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKHJl
Z2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZWdpb25Gb3JTdHlsaW5nLT5u
b2RlKCkpKSkgeworICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMgPSBtYXRjaFJlcXVl
c3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0Lmdl
dCgpOworICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKKyAgICAgICAgICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1ZXN0Lmlu
Y2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOworICAgICAg
ICB9CisgICAgfQorfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0QW5kVHJhbnNm
ZXJNYXRjaGVkUnVsZXMoKQoreworICAgIFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7CisKKyAgICBpZiAoIW1fbWF0Y2hlZFJ1bGVzIHx8IG1fbWF0Y2hlZFJ1bGVzLT5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKKworICAg
IFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gKm1fbWF0Y2hlZFJ1
bGVzOworICAgIGlmIChtX21vZGUgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMp
IHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7
ICsraSkKKyAgICAgICAgICAgIGVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNo
ZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVz
IG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgorICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0YXRlLnN0
eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0cmlidXRlU2VsZWN0
b3IoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICBt
X3Jlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJv
cGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5r
TWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOwor
ICAgIH0KK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29wZWRBdXRob3JS
dWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQp
IHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIGlmICghbV9zY29wZVJlc29sdmVyKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9yIHJ1bGVzIGJ5IHRyYXZlcnNp
bmcgdGhlIHNjb3BlZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0IGlmIGl0IGdvdCBpbmNvbnNp
c3RlbnQpLgorICAgIGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Njb3BlZFN0eWxlcygpICYmIG1f
c2NvcGVSZXNvbHZlci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeShtX3N0YXRlLmVsZW1lbnQoKSkp
IHsKKyAgICAgICAgYm9vbCBhcHBseUF1dGhvclN0eWxlcyA9IG1fc3RhdGUuZWxlbWVudCgpLT50
cmVlU2NvcGUoKS0+YXBwbHlBdXRob3JTdHlsZXMoKTsKKyAgICAgICAgYm9vbCBkb2N1bWVudFNj
b3BlID0gdHJ1ZTsKKyAgICAgICAgdW5zaWduZWQgc2NvcGVTaXplID0gbV9zY29wZVJlc29sdmVy
LT5zdGFja1NpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNjb3BlU2l6
ZTsgKytpKSB7CisgICAgICAgICAgICBjbGVhck1hdGNoZWRSdWxlcygpOworICAgICAgICAgICAg
bV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMTsKKworICAgICAgICAgICAgY29uc3QgU3R5bGVTY29wZVJlc29sdmVyOjpT
dGFja0ZyYW1lJiBmcmFtZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tGcmFtZUF0KGkpOworICAg
ICAgICAgICAgZG9jdW1lbnRTY29wZSA9IGRvY3VtZW50U2NvcGUgJiYgIWZyYW1lLm1fc2NvcGUt
PmlzSW5TaGFkb3dUcmVlKCk7CisgICAgICAgICAgICBpZiAoZG9jdW1lbnRTY29wZSkgeworICAg
ICAgICAgICAgICAgIGlmICghYXBwbHlBdXRob3JTdHlsZXMpCisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1f
c2NvcGVSZXNvbHZlci0+bWF0Y2hlc1N0eWxlQm91bmRzKGZyYW1lKSkKKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoUmVxdWVz
dCBtYXRjaFJlcXVlc3QoZnJhbWUubV9ydWxlU2V0LCBpbmNsdWRlRW1wdHlSdWxlcywgZnJhbWUu
bV9zY29wZSk7CisgICAgICAgICAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gbV9yZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgICAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgICAgICAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAg
ICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBtYXRjaEhvc3RSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcyk7CisjZWxzZQorICAgIFVO
VVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKwordm9pZCBFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hIb3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sK
KyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBBU1NFUlQobV9zY29wZVJlc29sdmVyKTsKKwor
ICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JS
dWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgIFZlY3Rv
cjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOworICAgIG1fc2NvcGVSZXNvbHZlci0+bWF0Y2hIb3N0
UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxlcyk7CisgICAgaWYgKG1hdGNoZWRS
dWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAodW5zaWduZWQgaSA9
IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgU3R5bGVSZXNvbHZl
cjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2Uo
KTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxl
cy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFu
Z2UpOworICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKKyNlbHNlCisg
ICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCit7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisg
ICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0
Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1f
cnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFN0eWxlUmVz
b2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJh
bmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBt
YXRjaFJlcXVlc3RzOworICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNv
bGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgpOyArK2kpCisgICAg
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdHNbaV0sIHJ1bGVSYW5nZSk7Cisj
ZW5kaWYKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKKworICAgIG1hdGNoU2Nv
cGVkQXV0aG9yUnVsZXMoaW5jbHVkZUVtcHR5UnVsZXMpOworfQorCit2b2lkIEVsZW1lbnRSdWxl
Q29sbGVjdG9yOjptYXRjaFVzZXJSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQoreworICAg
IGlmICghbV9ydWxlU2V0cy51c2VyU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAg
IGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxl
ID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBNYXRjaFJlcXVl
c3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVz
KTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0gbV9yZXN1bHQucmFu
Z2VzLnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7
Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcygpCit7CisgICAg
TWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxl
cyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVl
dHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQorICAgICAgICBtX3Jlc3VsdC5pc0NhY2hlYWJs
ZSA9IGZhbHNlOworICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX2lzUHJpbnRT
dHlsZQorICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUg
OiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKKyAgICBtYXRjaFVBUnVsZXMo
dXNlckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgbWF0Y2gg
cnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYgKGRvY3VtZW50
KCktPmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NTRGVmYXVsdFN0eWxl
U2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2
aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBt
b2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVl
dC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAgICAgIG1hdGNoVUFS
dWxlcyhDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKK30KKwordm9p
ZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVQVJ1bGVzKFJ1bGVTZXQqIHJ1bGVzKQorewor
ICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisgICAgCisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgIFN0eWxl
UmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuVUFSdWxlUmFu
Z2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxl
UmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7Cit9CisKK2lubGlu
ZSBib29sIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYg
cnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1Bz
ZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5k
YXJ5KQoreworICAgIFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAg
ICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKKyAgICAgICAgLy8g
V2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50
cy4KKyAgICAgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9QU0VVRE8pCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNp
bmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJv
bSB0aGUgcnVsZSBoYXNoLgorICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5
IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KKyAgICAgICAgaWYgKHJ1
bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkg
JiYgc3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGlmICgh
cnVsZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRj
aCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3Rh
dGUuZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFTZWxlY3RvckNoZWNrZXI6OmZhc3RDaGVj
a1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2Vs
ZWN0b3IoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIFNl
bGVjdG9yQ2hlY2tlcjo6ZmFzdENoZWNrKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1l
bnQoKSk7CisgICAgfQorCisgICAgLy8gU2xvdyBwYXRoLgorICAgIFNlbGVjdG9yQ2hlY2tlciBz
ZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9tb2RlKTsKKyAgICBTZWxlY3RvckNoZWNrZXI6
OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3Rh
dGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOworICAg
IGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKKyAgICBjb250ZXh0LnNjb3Bl
ID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1ZG9TdHlsZSA9IG1fcHNldWRvU3R5bGU7CisgICAg
Y29udGV4dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7CisgICAgU2Vs
ZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250ZXh0
LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7CisgICAgaWYg
KG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9QU0VVRE8gJiYgbV9wc2V1ZG9T
dHlsZSAhPSBkeW5hbWljUHNldWRvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1
bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxlcywgY29uc3QgTWF0Y2hSZXF1
ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYgcnVsZVJhbmdlKQor
eworICAgIGlmICghcnVsZXMpCisgICAgICAgIHJldHVybjsKKworICAgIFN0eWxlUmVzb2x2ZXI6
OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5k
IHVwIGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxlIG9m
IGEgcmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KKyAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVyIGZp
bHRlciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRo
ZSBmYXN0IHBhdGguCisgICAgYm9vbCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRl
ci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNoUmVx
dWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NC
b3VuZGFyeTsKKworICAgIHVuc2lnbmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgUnVsZURhdGEm
IHJ1bGVEYXRhID0gcnVsZXMtPmF0KGkpOworICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAm
JiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlk
ZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hl
cygpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFN0eWxlUnVsZSogcnVsZSA9
IHJ1bGVEYXRhLnJ1bGUoKTsKKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2ll
IGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVu
dCgpLCBydWxlLCBtX2luc3BlY3RvckNTU09NV3JhcHBlcnMsIGRvY3VtZW50KCktPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCkpOworICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VV
RE87CisgICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3Bl
LCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgeworICAg
ICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4g
aWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4KKyAgICAgICAgICAgIGNvbnN0IFN0eWxl
UHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgICAg
ICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1
ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgeworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5n
IHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9u
bHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgorICAgICAgICAgICAgaWYgKG1fc2FtZU9yaWdpbk9u
bHkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgeworICAgICAgICAg
ICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFs
c2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlm
CisgICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQu
CisgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBtX3BzZXVkb1N0
eWxlID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fbW9kZSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICAgICAgICAgICAgICBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQpCisgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5bmFtaWNQc2V1ZG8p
OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgb3VyIGZp
cnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFycmF5LgorICAgICAg
ICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisgICAgICAgICAgICAgICAgaWYg
KHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgcnVs
ZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisKKyAgICAg
ICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMu
CisgICAgICAgICAgICAgICAgYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKKyAgICAgICAgICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIHRydWUp
OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFs
c2UpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxlcyhjb25zdCBS
dWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikKK3sKKyAgICB1bnNpZ25lZCBzcGVjaWZp
Y2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKKyAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSBy
Mi0+c3BlY2lmaWNpdHkoKTsKKyAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0
eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5MSA8IHNw
ZWNpZmljaXR5MjsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRS
dWxlcygpCit7CisgICAgQVNTRVJUKG1fbWF0Y2hlZFJ1bGVzKTsKKyAgICBzdGQ6OnNvcnQobV9t
YXRjaGVkUnVsZXMtPmJlZ2luKCksIG1fbWF0Y2hlZFJ1bGVzLT5lbmQoKSwgY29tcGFyZVJ1bGVz
KTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyhib29sIG1h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcywgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCit7Cisg
ICAgbWF0Y2hVQVJ1bGVzKCk7CisKKyAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxl
cy4KKyAgICBpZiAobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaFVzZXJS
dWxlcyhmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcg
Zmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwuCisg
ICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7CisgICAgICAgIGFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFsIG1hcHBlZCBk
ZWNsYXJhdGlvbnMuCisgICAgICAgIC8vIFRhYmxlcyBhbmQgdGFibGUgY2VsbHMgc2hhcmUgYW4g
YWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3QgYmUgYXBwbGllZAorICAgICAgICAvLyBh
ZnRlciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRlcGVuZHMgb24g
dGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVzLgorICAgICAgICBhZGRFbGVtZW50U3R5
bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0
aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBdXRvOworICAgICAg
ICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlz
QXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRvKQorICAgICAgICAgICAgICAgIG1fcmVzdWx0
LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHRleHREaXJlY3Rpb24gPT0gTFRSID8gbGVmdFRvUmlnaHRE
ZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKKyAgICAgICAgfQorICAg
IH0KKyAgICAKKyAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cyBuZXh0Lgor
ICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAgIG1hdGNoQXV0aG9yUnVs
ZXMoZmFsc2UpOworCisgICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRl
LgorICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsKKyAgICAg
ICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENT
U09NIHdyYXBwZXIuCisgICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVl
cyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgorICAgICAgICBib29sIGlzSW5s
aW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxl
KCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNJblNoYWRvd1Ry
ZWUoKTsKKyAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5LgorICAgICAgICBhZGRFbGVtZW50U3R5
bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lu
bGluZVN0eWxlQ2FjaGVhYmxlKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIC8vIE5v
dyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHlsZS4KKyAgICBpZiAoaW5jbHVkZVNN
SUxQcm9wZXJ0aWVzICYmIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCisg
ICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+
KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCks
IGZhbHNlIC8qIGlzQ2FjaGVhYmxlICovKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1
ZGVTTUlMUHJvcGVydGllcyk7CisjZW5kaWYKK30KKworYm9vbCBFbGVtZW50UnVsZUNvbGxlY3Rv
cjo6aGFzQW55TWF0Y2hpbmdSdWxlcyhSdWxlU2V0KiBydWxlU2V0KQoreworICAgIGNsZWFyTWF0
Y2hlZFJ1bGVzKCk7CisKKyAgICBtX21vZGUgPSBTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxl
czsKKyAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOworICAg
IFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RS
dWxlSW5kZXgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0
KSwgcnVsZVJhbmdlKTsKKworICAgIHJldHVybiBtX21hdGNoZWRSdWxlcyAmJiAhbV9tYXRjaGVk
UnVsZXMtPmlzRW1wdHkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmggYi9Tb3VyY2UvV2Vi
Q29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41Y2EwYTQzNThmMmZk
NzA0NDkzNjVhYTdkYWU5ZTlhZTFkYTI3NWZhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHly
aWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwg
MjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIEVsZW1lbnRS
dWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgRWxlbWVudFJ1bGVDb2xsZWN0b3JfaAorCisjaW5jbHVk
ZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgor
I2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENTU1J1
bGVMaXN0OworY2xhc3MgRG9jdW1lbnRSdWxlU2V0czsKK2NsYXNzIFJlbmRlclJlZ2lvbjsKK2Ns
YXNzIFJ1bGVEYXRhOworY2xhc3MgUnVsZVNldDsKK2NsYXNzIFNlbGVjdG9yRmlsdGVyOworY2xh
c3MgU3R5bGVTY29wZVJlc29sdmVyOworY2xhc3MgU3RhdGljQ1NTUnVsZUxpc3Q7CisKK2NsYXNz
IEVsZW1lbnRSdWxlQ29sbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBFbGVtZW50UnVsZUNvbGxlY3Rv
cihTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3Rh
dGUpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgLCBtX3J1bGVTZXRzKHN0eWxl
UmVzb2x2ZXItPnJ1bGVTZXRzKCkpCisgICAgICAgICwgbV9zZWxlY3RvckZpbHRlcihzdHlsZVJl
c29sdmVyLT5zZWxlY3RvckZpbHRlcigpKQorICAgICAgICAsIG1faW5zcGVjdG9yQ1NTT01XcmFw
cGVycyhzdHlsZVJlc29sdmVyLT5pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkpCisgICAgICAgICwg
bV9zY29wZVJlc29sdmVyKHN0eWxlUmVzb2x2ZXItPnNjb3BlUmVzb2x2ZXIoKSkKKyAgICAgICAg
LCBtX2lzUHJpbnRTdHlsZShmYWxzZSkKKyAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkK
KyAgICAgICAgLCBtX3BzZXVkb1N0eWxlKE5PUFNFVURPKQorICAgICAgICAsIG1fc2FtZU9yaWdp
bk9ubHkoZmFsc2UpCisgICAgICAgICwgbV9tb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5n
U3R5bGUpIHsgfQorCisgICAgdm9pZCBtYXRjaEFsbFJ1bGVzKGJvb2wgbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzLCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisgICAgdm9pZCBtYXRjaFVB
UnVsZXMoKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcyhSdWxlU2V0Kik7CisgICAgdm9pZCBtYXRj
aEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hVc2Vy
UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFNjb3BlZEF1dGhv
clJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMo
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisKKyAgICB2b2lkIHNldE1vZGUoU2VsZWN0b3JDaGVj
a2VyOjpNb2RlIG1vZGUpIHsgbV9tb2RlID0gbW9kZTsgfQorICAgIHZvaWQgc2V0UHNldWRvU3R5
bGUoUHNldWRvSWQgcHNldWRvU3R5bGUpIHsgbV9wc2V1ZG9TdHlsZSA9IHBzZXVkb1N0eWxlOyB9
CisgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGYpIHsgbV9zYW1lT3JpZ2luT25seSA9
IGY7IH0gCisgICAgdm9pZCBzZXRSZWdpb25Gb3JTdHlsaW5nKFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZykgeyBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOyB9Cisg
ICAgdm9pZCBzZXRNZWRpdW0oY29uc3QgTWVkaWFRdWVyeUV2YWx1YXRvciogbWVkaXVtKSB7IG1f
aXNQcmludFN0eWxlID0gbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpOyB9
CisKKyAgICBib29sIGhhc0FueU1hdGNoaW5nUnVsZXMoUnVsZVNldCopOworCisgICAgU3R5bGVS
ZXNvbHZlcjo6TWF0Y2hSZXN1bHQmIG1hdGNoZWRSZXN1bHQoKTsKKyAgICBQYXNzUmVmUHRyPENT
U1J1bGVMaXN0PiBtYXRjaGVkUnVsZUxpc3QoKTsKKworcHJpdmF0ZToKKyAgICBEb2N1bWVudCog
ZG9jdW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmRvY3VtZW50KCk7IH0KKyAgICB2b2lkIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNo
ZWFibGUgPSB0cnVlKTsKKworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0
Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7CisgICAgdm9pZCBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBTdHlsZVJlc29sdmVy
OjpSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25z
dCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6
UnVsZVJhbmdlJik7CisgICAgYm9vbCBydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0
IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZp
b3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSk7CisK
KyAgICB2b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKKyAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1h
dGNoZWRSdWxlcygpOworCisgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSop
OworICAgIHZvaWQgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKworICAgIFN0YXRpY0NTU1J1bGVMaXN0
KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICAKK3ByaXZhdGU6CisgICAgU3R5bGVSZXNvbHZl
cjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9jdW1lbnRSdWxlU2V0cyYgbV9ydWxlU2V0czsKKyAg
ICBTZWxlY3RvckZpbHRlciYgbV9zZWxlY3RvckZpbHRlcjsKKyAgICBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzJiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7CisgICAgU3R5bGVTY29wZVJlc29sdmVy
KiBtX3Njb3BlUmVzb2x2ZXI7CisKKyAgICBib29sIG1faXNQcmludFN0eWxlOworICAgIFJlbmRl
clJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgIFBzZXVkb0lkIG1fcHNldWRvU3R5bGU7
CisgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5OworICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBt
X21vZGU7CisKKyAgICBPd25QdHI8VmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+ID4gbV9tYXRj
aGVkUnVsZXM7CisKKyAgICAvLyBPdXRwdXQuCisgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0
PiBtX3J1bGVMaXN0OworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0IG1fcmVzdWx0Owor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRWxlbWVudFJ1bGVDb2xs
ZWN0b3JfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9y
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uYTg1NDI2OWIxYzBiNDIzYWMyMWFhNzQ1YjU5MzY2ZDM0NWRjZmY0MgotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKQEAgLTAsMCAr
MSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2Rl
Lm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRmZWxkIEplbnNlbiAo
a2RlQGNhcmV3b2xmLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBOaWNob2xhcyBT
aGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAw
NiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxleGV5IFByb3NrdXJ5
YWtvdiA8YXBAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBFcmljIFNl
aWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNo
IE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxl
LmNvbS8pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rvbiwg
TUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJQYWdlUnVsZUNvbGxlY3Rvci5oIgorCisjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
LmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3Rh
dGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEs
IGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQoreworICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+
c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOworfQorCitib29s
IFBhZ2VSdWxlQ29sbGVjdG9yOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Cit7Cisg
ICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKKyAgICBpZiAoIW1fc3RhdGUucm9vdEVs
ZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIGlzRmlyc3RQ
YWdlTGVmdCA9IHRydWU7CisKKyAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxl
ZnQgPyAxIDogMCkpICUgMjsKK30KKworYm9vbCBQYWdlUnVsZUNvbGxlY3Rvcjo6aXNGaXJzdFBh
Z2UoaW50IHBhZ2VJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogSW4gY2FzZSBvZiBmb3Jj
ZWQgbGVmdC9yaWdodCBwYWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUgdGhlIGZp
cnN0IHBhZ2UuCisgICAgcmV0dXJuICghcGFnZUluZGV4KTsKK30KKworU3RyaW5nIFBhZ2VSdWxl
Q29sbGVjdG9yOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAoreworICAgIC8v
IEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAgICBy
ZXR1cm4gIiI7Cit9CisKK3ZvaWQgUGFnZVJ1bGVDb2xsZWN0b3I6Om1hdGNoQWxsUGFnZVJ1bGVz
KGludCBwYWdlSW5kZXgpCit7CisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBh
Z2VJbmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4
KTsKKyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CisgICAgCisg
ICAgbWF0Y2hQYWdlUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHls
ZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lk
ZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUg
SFRNTDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCks
IGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Cit9CisKK3ZvaWQgUGFnZVJ1bGVDb2xsZWN0b3I6Om1h
dGNoUGFnZVJ1bGVzKFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJz
dFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVz
OworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFn
ZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1h
dGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzdGQ6OnN0
YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQo
KSwgY29tcGFyZVBhZ2VSdWxlcyk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0
Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFBy
b3BlcnRpZXMobWF0Y2hlZFBhZ2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsKK30KKworc3RhdGlj
IGJvb2wgY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxl
Y3RvciwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBh
Z2VOYW1lKQoreworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVj
dG9yOyBjb21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7Cisg
ICAgICAgIGlmIChjb21wb25lbnQtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgeworICAg
ICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FO
YW1lKCkubG9jYWxOYW1lKCk7CisgICAgICAgICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9t
ICYmIGxvY2FsTmFtZSAhPSBwYWdlTmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKworICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBl
ID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBD
U1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2UgJiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8
fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBh
Z2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmly
c3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQYWdl
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdl
Kj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJv
b2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkK
K3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOworCisgICAgICAgIGlmICghY2hl
Y2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlz
Rmlyc3RQYWdlLCBwYWdlTmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAv
LyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQu
CisgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9w
ZXJ0aWVzKCk7CisgICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5
KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRv
IG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCisgICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQo
cnVsZSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL2Nz
cy9QYWdlUnVsZUNvbGxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjA3NTgwMWQ5NjhkODhlNmNlNWY5Zjhi
OGFkZmI3ZThjN2M4Mzg4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9jc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMs
IDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQYWdlUnVsZUNvbGxlY3Rvcl9oCisj
ZGVmaW5lIFBhZ2VSdWxlQ29sbGVjdG9yX2gKKworI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMu
aCIKKyNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBT
dHlsZVJ1bGVQYWdlOworCitjbGFzcyBQYWdlUnVsZUNvbGxlY3RvciB7CitwdWJsaWM6CisgICAg
UGFnZVJ1bGVDb2xsZWN0b3IoU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBEb2N1bWVudFJ1
bGVTZXRzJiBydWxlU2V0cykKKyAgICAgICAgOiBtX3N0YXRlKHN0YXRlKQorICAgICAgICAsIG1f
cnVsZVNldHMocnVsZVNldHMpIHsgfQorCisgICAgdm9pZCBtYXRjaEFsbFBhZ2VSdWxlcyhpbnQg
cGFnZUluZGV4KTsKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCYgbWF0Y2hlZFJlc3Vs
dCgpIHsgcmV0dXJuIG1fcmVzdWx0OyB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc0xlZnRQYWdl
KGludCBwYWdlSW5kZXgpIGNvbnN0OworICAgIGJvb2wgaXNSaWdodFBhZ2UoaW50IHBhZ2VJbmRl
eCkgY29uc3QgeyByZXR1cm4gIWlzTGVmdFBhZ2UocGFnZUluZGV4KTsgfQorICAgIGJvb2wgaXNG
aXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisgICAgU3RyaW5nIHBhZ2VOYW1lKGludCBw
YWdlSW5kZXgpIGNvbnN0OworCisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxl
cywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VO
YW1lKTsKKyAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFn
ZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBi
b29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUp
OworCisgICAgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9jdW1lbnRSdWxl
U2V0cyYgbV9ydWxlU2V0czsKKworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0IG1fcmVz
dWx0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUGFnZVJ1bGVD
b2xsZWN0b3JfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIu
Y3BwIGIvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCmluZGV4IGYyMjJiYjFl
MzczNzM2OTRlOGMzOTFiYjA5YzY2ZTdkZjFjNTQyZDYuLjllZDRkYzAwNzcyYmYwMzlmMTk1MzZi
NzJiNTc3ZjQwZDg2MTRmNzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJl
c29sdmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAKQEAg
LTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlICJDb3VudGVyQ29udGVudC5oIgogI2luY2x1ZGUgIkN1
cnNvckxpc3QuaCIKICNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCisj
aW5jbHVkZSAiRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCIKICNpbmNsdWRlICJFbGVtZW50U2hhZG93
LmgiCiAjaW5jbHVkZSAiRm9udEZlYXR1cmVWYWx1ZS5oIgogI2luY2x1ZGUgIkZvbnRWYWx1ZS5o
IgpAQCAtODcsNiArODgsNyBAQAogI2luY2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgogI2luY2x1
ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0LmgiCiAjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUg
IlBhZ2VSdWxlQ29sbGVjdG9yLmgiCiAjaW5jbHVkZSAiUGFpci5oIgogI2luY2x1ZGUgIlBlcnNw
ZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCiAjaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgpAQCAt
MjA4LDI5ICsyMTAsNiBAQCBpZiAoaXNJbml0aWFsKSB7IFwKIAogUmVuZGVyU3R5bGUqIFN0eWxl
UmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CiAKLXN0YXRpYyBTdHlsZVByb3BlcnR5
U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0
eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCi0g
ICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24s
IENTU1ZhbHVlTHRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwotfQotCi1z
dGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCi17Ci0gICAg
REVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0
RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKHJpZ2h0VG9MZWZ0
RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENT
U1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0gICAgcmV0dXJuIHJpZ2h0VG9MZWZ0
RGVjbC5nZXQoKTsKLX0KLQotaW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVy
OjpTdGF0ZTo6ZW5zdXJlUnVsZUxpc3QoKQotewotICAgIGlmICghbV9ydWxlTGlzdCkKLSAgICAg
ICAgbV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKLSAgICByZXR1cm4g
bV9ydWxlTGlzdC5nZXQoKTsKLX0KLQogaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpCiB7CiAgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBt
X3N0eWxlLT5oYXNBcHBlYXJhbmNlKCk7CkBAIC0yNDgsOCArMjI3LDYgQEAgaW5saW5lIHZvaWQg
U3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKICAgICBtX3BhcmVudFN0eWxlID0gMDsKICAg
ICBtX3BhcmVudE5vZGUgPSAwOwogICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9y
dWxlTGlzdCA9IDA7Ci0gICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKICAgICBtX3BlbmRpbmdJ
bWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKICNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCiAgICAgbV9o
YXNQZW5kaW5nU2hhZGVycyA9IGZhbHNlOwpAQCAtMjU5LDYgKzIzNiwxNiBAQCBpbmxpbmUgdm9p
ZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQogI2VuZGlmCiB9CiAKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJv
cGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgdW5zaWduZWQgbGlua01hdGNo
VHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAg
ICBtYXRjaGVkUHJvcGVydGllcy5ncm93KG1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOwor
ICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0aWVzID0gbWF0
Y2hlZFByb3BlcnRpZXMubGFzdCgpOworICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNv
bnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRpZXMpOworICAgIG5ld1Byb3BlcnRp
ZXMubGlua01hdGNoVHlwZSA9IGxpbmtNYXRjaFR5cGU7CisgICAgbmV3UHJvcGVydGllcy53aGl0
ZWxpc3RUeXBlID0gcHJvcGVydHlXaGl0ZWxpc3RUeXBlOworICAgIG1hdGNoZWRSdWxlcy5hcHBl
bmQocnVsZSk7Cit9CisKIFN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRv
Y3VtZW50LCBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKICAgICA6IG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwKDApCiAgICAgLCBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUpCkBAIC00MDEsMTgxICszODgsNiBAQCB2b2lkIFN0eWxlUmVzb2x2
ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCiAg
ICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOwog
fQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0
JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVS
dWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUg
cHJvcGVydHlXaGl0ZWxpc3RUeXBlKQotewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0
aWVzLmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAg
TWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5sYXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2Fz
dDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5r
TWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5
cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVz
LmFwcGVuZChydWxlKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVu
dFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5
U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKLXsKLSAgICBpZiAoIXByb3BlcnR5
U2V0KQotICAgICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9
IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMu
Zmlyc3RBdXRob3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9y
UnVsZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3Bl
cnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hlYWJsZSkKLSAgICAg
ICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1hdGNoaW5nVUFSdWxl
c1Njb3BlIHsKLXB1YmxpYzoKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotICAgIH5NYXRj
aGluZ1VBUnVsZXNTY29wZSgpOwotCi0gICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMo
KTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKLX07Ci0K
LU1hdGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgQVNT
RVJUKCFtX21hdGNoaW5nVUFSdWxlcyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwot
fQotCi1NYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAg
ICBtX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotfQotCi1pbmxpbmUgYm9vbCBNYXRjaGluZ1VB
UnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotewotICAgIHJldHVybiBtX21hdGNoaW5n
VUFSdWxlczsKLX0KLQotYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVs
ZXMgPSBmYWxzZTsKLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhT
dGF0ZSYgc3RhdGUsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2Um
IHJ1bGVSYW5nZSkKLXsKLSAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOwotICAgIEFT
U0VSVChzdGF0ZS5lbGVtZW50KCkpOwotCi0gICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVs
ZW1lbnQoKTsKLSAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUu
c3R5bGVkRWxlbWVudCgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVt
ZW50LT5zaGFkb3dQc2V1ZG9JZCgpOwotICAgIGlmICghcHNldWRvSWQuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIEFTU0VSVChzdHlsZWRFbGVtZW50KTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KHN0YXRlLCBtYXRjaFJlcXVlc3QucnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVu
dFJ1bGVzKHBzZXVkb0lkLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICB9
Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxl
bWVudCgpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qoc3RhdGUsIG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7Ci0jZW5kaWYKLSAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFy
ZSBhcHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlz
OgotICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCi0gICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxs
b3dzIGF1dGhvciBydWxlcwotICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVk
IHN0eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCi0gICAgVHJlZVNjb3BlKiB0
cmVlU2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKLSAgICBpZiAoIU1hdGNoaW5nVUFSdWxl
c1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi0gICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5
QXV0aG9yU3R5bGVzKCkKLSAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hS
ZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNo
UmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jv
c3NCb3VuZGFyeSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0
IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBh
IGJ1ZmZlciBhbmQKLSAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZWxlbWVu
dC0+aGFzSUQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBt
YXRjaFJlcXVlc3QucnVsZVNldC0+aWRSdWxlcyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlv
bigpLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBpZiAoc3R5bGVkRWxl
bWVudCAmJiBzdHlsZWRFbGVtZW50LT5oYXNDbGFzcygpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQotICAg
ICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRjaFJlcXVlc3Qu
cnVsZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKClbaV0uaW1wbCgp
KSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5p
c0xpbmsoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRj
aFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBy
dWxlUmFuZ2UpOwotICAgIGlmIChTZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0Ns
YXNzKGVsZW1lbnQpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qoc3RhdGUs
IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChzdGF0ZSwg
bWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwo
KSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
ckxpc3Qoc3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRj
aFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JSZWdpb24oU3RhdGUmIHN0YXRlLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1h
dGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgaWYgKCFzdGF0ZS5yZWdp
b25Gb3JTdHlsaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBt
YXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25z
dCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGNo
ZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihz
dGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7Ci0gICAgICAgICAgICBSdWxlU2V0
KiByZWdpb25SdWxlcyA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0Fu
ZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCk7Ci0gICAgICAgICAgICBBU1NFUlQocmVnaW9u
UnVsZXMpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIE1hdGNoUmVx
dWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJl
cXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhTdGF0ZSYgc3RhdGUsIE1h
dGNoUmVzdWx0JiByZXN1bHQpCi17Ci0gICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBt
YXRjaGVkUnVsZXMgPSBzdGF0ZS5tYXRjaGVkUnVsZXMoKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVz
LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc29ydE1hdGNoZWRSdWxlcyhzdGF0
ZSk7Ci0KLSAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGlu
Z1J1bGVzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMu
c2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygp
LmFwcGVuZChtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm93IHRyYW5zZmVyIHRoZSBzZXQgb2Yg
bWF0Y2hlZCBydWxlcyBvdmVyIHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAg
IGlmIChzdGF0ZS5zdHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0
dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUo
KTsKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0t
PnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1
bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxp
c3RUeXBlKCkpOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1
dGhvclJ1bGVzKFN0YXRlJiBzdGF0ZSwgTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKLXsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9X
X0RPTSkKLSAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gTWF0Y2ggc2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxl
bWVudCBzdGFjayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KLSAgICBpZiAo
bV9zY29wZVJlc29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVu
c3VyZVN0YWNrQ29uc2lzdGVuY3koc3RhdGUuZWxlbWVudCgpKSkgewotICAgICAgICBib29sIGFw
cGx5QXV0aG9yU3R5bGVzID0gc3RhdGUuZWxlbWVudCgpLT50cmVlU2NvcGUoKS0+YXBwbHlBdXRo
b3JTdHlsZXMoKTsKLSAgICAgICAgYm9vbCBkb2N1bWVudFNjb3BlID0gdHJ1ZTsKLSAgICAgICAg
dW5zaWduZWQgc2NvcGVTaXplID0gbV9zY29wZVJlc29sdmVyLT5zdGFja1NpemUoKTsKLSAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNjb3BlU2l6ZTsgKytpKSB7Ci0gICAgICAgICAg
ICBzdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwot
Ci0gICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1l
ID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7Ci0gICAgICAgICAgICBkb2N1bWVu
dFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUo
KTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KCFhcHBseUF1dGhvclN0eWxlcykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5t
YXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChm
cmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAg
ICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5n
ZSgpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9u
KHN0YXRlLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgICAgICAgICBzb3J0QW5kVHJh
bnNmZXJNYXRjaGVkUnVsZXMoc3RhdGUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBtYXRjaEhvc3RSdWxlcyhzdGF0ZSwgcmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZWxz
ZQotICAgIFVOVVNFRF9QQVJBTShzdGF0ZSk7Ci0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0g
ICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCiBpbmxpbmUg
Ym9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVz
KFN0YXRlJiBzdGF0ZSkKIHsKICNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKQEAgLTU4NiwxOTcgKzM5
OCw2IEBAIGlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1h
dGNoZXNIb3N0UnVsZXMoU3RhdGUmIHN0YXRlKQogI2VuZGlmCiB9CiAKLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hIb3N0UnVsZXMoU3RhdGUmIHN0YXRlLCBNYXRjaFJlc3VsdCYgcmVzdWx0LCBi
b29sIGluY2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIEFT
U0VSVChtX3Njb3BlUmVzb2x2ZXIpOwotCi0gICAgc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIo
KTsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNoZWRSdWxlczsK
LSAgICBtX3Njb3BlUmVzb2x2ZXItPm1hdGNoSG9zdFJ1bGVzKHN0YXRlLmVsZW1lbnQoKSwgbWF0
Y2hlZFJ1bGVzKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7
IC0taSkgewotICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRo
b3JSdWxlUmFuZ2UoKTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIE1hdGNo
UmVxdWVzdChtYXRjaGVkUnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIHN0YXRlLmVs
ZW1lbnQoKSksIHJ1bGVSYW5nZSk7Ci0gICAgfQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyhzdGF0ZSwgcmVzdWx0KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHN0YXRlKTsKLSAg
ICBVTlVTRURfUEFSQU0ocmVzdWx0KTsKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVs
ZXMpOwotI2VuZGlmCi19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBdXRob3JSdWxlcyhT
dGF0ZSYgc3RhdGUsIE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
Ci17Ci0gICAgc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0K
LSAgICBpZiAoIXN0YXRlLmVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0
Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1f
cnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVSYW5n
ZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzKHN0YXRlLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oc3RhdGUsIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdl
KTsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRj
aFJlcXVlc3RzOwotICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxl
Y3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKLSAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgpOyArK2kpCi0gICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKHN0YXRlLCBtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2Up
OwotI2VuZGlmCi0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoc3RhdGUsIHJlc3Vs
dCk7Ci0KLSAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKHN0YXRlLCByZXN1bHQsIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVzZXJSdWxlcyhTdGF0
ZSYgc3RhdGUsIE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17
Ci0gICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLQotICAgIHJlc3VsdC5yYW5nZXMu
bGFzdFVzZXJSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpbmNsdWRl
RW1wdHlSdWxlcyk7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMudXNl
clJ1bGVSYW5nZSgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKHN0YXRlLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oc3RhdGUs
IG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyhzdGF0ZSwgcmVzdWx0KTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVs
ZXMoU3RhdGUmIHN0YXRlLCBNYXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKLXsK
LSAgICBzdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIAotICAgIHJlc3VsdC5yYW5n
ZXMubGFzdFVBUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLlVBUnVsZVJhbmdlKCk7Ci0gICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5n
ZSk7Ci0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoc3RhdGUsIHJlc3VsdCk7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KFN0YXRl
JiBzdGF0ZSwgY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBpZiAoIXJ1bGVz
KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAg
bG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSBy
ZWN1cnNpdmUgdHJlZSByZXNvbHZlLgotICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVy
IHdvbid0IGJlIHVwLXRvLWRhdGUgaW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZh
c3QgcGF0aC4KLSAgICBib29sIGNhblVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBh
cmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0
LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5k
YXJ5OwotCi0gICAgdW5zaWduZWQgc2l6ZSA9IHJ1bGVzLT5zaXplKCk7Ci0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVs
ZURhdGEgPSBydWxlcy0+YXQoaSk7Ci0gICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1f
c2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRp
ZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkp
KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVs
ZURhdGEucnVsZSgpOwotICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29v
a2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCks
IHJ1bGUsIHRoaXMpOwotICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87
Ci0gICAgICAgIGlmIChydWxlTWF0Y2hlcyhzdGF0ZSwgcnVsZURhdGEsIG1hdGNoUmVxdWVzdC5z
Y29wZSwgZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSkpIHsK
LSAgICAgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0
aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUuCi0gICAgICAgICAgICBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAg
ICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNo
UmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcykpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBv
c2luZyB0aGUgbm9uLXN0YW5kYXJkIGdldE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRo
ZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1Nh
bWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkg
ewotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBw
c2V1ZG8gYml0IGlmCi0gICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNl
dWRvLWVsZW1lbnQuCi0gICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAm
JiBzdGF0ZS5wc2V1ZG9TdHlsZSgpID09IE5PUFNFVURPKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KHN0YXRlLm1vZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAg
ICAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShj
b29raWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJO
QUxfUFNFVURPSUQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1Bz
ZXVkb1N0eWxlKGR5bmFtaWNQc2V1ZG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgICAgICAvLyBVcGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRj
aGVkIHJ1bGVzIGFycmF5LgotICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5k
ZXg7Ci0gICAgICAgICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkK
LSAgICAgICAgICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdl
Lmxhc3RSdWxlSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91
ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkTWF0Y2hl
ZFJ1bGUoJnJ1bGVEYXRhKTsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b246OmRpZE1hdGNoUnVsZShjb29raWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIGlu
bGluZSBib29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRh
KiByMikKLXsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsK
LSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKLSAgICByZXR1
cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+
cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKFN0YXRlJiBzdGF0ZSkKLXsKLSAgICBzdGQ6OnNv
cnQoc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5k
KCksIGNvbXBhcmVSdWxlcyk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxl
cyhTdGF0ZSYgc3RhdGUsIE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9w
ZXJ0aWVzKQotewotICAgIG1hdGNoVUFSdWxlcyhzdGF0ZSwgcmVzdWx0KTsKLQotICAgIC8vIE5v
dyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcykKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMoc3RhdGUsIHJlc3VsdCwgZmFsc2UpOwot
Ci0gICAgLy8gTm93IGNoZWNrIGF1dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGggcHJl
c2VudGF0aW9uYWwgYXR0cmlidXRlcyBtYXBwZWQgZnJvbSBIVE1MLgotICAgIGlmIChzdGF0ZS5z
dHlsZWRFbGVtZW50KCkpIHsKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1
bHQsIHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7
Ci0KLSAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwgbWFwcGVkIGRlY2xhcmF0aW9u
cy4KLSAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBzaGFyZSBhbiBhZGRpdGlvbmFs
IG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gICAgICAgIC8vIGFmdGVyIGFsbCBh
dHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVwZW5kcyBvbiB0aGUgdmFsdWVz
IG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRp
ZXMocmVzdWx0LCBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25B
dHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5p
c0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGJvb2wgaXNBdXRvOwotICAgICAgICAgICAg
VGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChzdGF0ZS5zdHlsZWRF
bGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFzRGlyQXV0b0F0dHJpYnV0ZShpc0F1dG8pOwot
ICAgICAgICAgICAgaWYgKGlzQXV0bykKLSAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUHJvcGVy
dGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0gTFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlv
bigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAK
LSAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cyBuZXh0LgotICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhzdGF0
ZSwgcmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBzdHlsZSBh
dHRyaWJ1dGUuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIHN0YXRlLnN0
eWxlZEVsZW1lbnQoKSAmJiBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsK
LSAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlz
IG5vIENTU09NIHdyYXBwZXIuCi0gICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250cm9sIHNoYWRv
dyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgotICAgICAgICBib29s
IGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVT
dHlsZSgpLT5pc011dGFibGUoKSAmJiAhc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93
VHJlZSgpOwotICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCi0gICAgICAgIGFkZEVsZW1lbnRT
dHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxl
KCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOwotICAgIH0KLQotI2lmIEVOQUJMRShTVkcpCi0g
ICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92ZXJyaWRlIHN0eWxlLgotICAgIGlmIChp
bmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgc3Rh
dGUuc3R5bGVkRWxlbWVudCgpICYmIHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50
KCkpCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2Fz
dDxTVkdFbGVtZW50Kj4oc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQ
cm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2FjaGVhYmxlICovKTsKLSNlbHNlCi0gICAgVU5VU0VE
X1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVydGllcyk7Ci0jZW5kaWYKLX0KLQogYm9vbCBTdHlsZVJl
c29sdmVyOjpjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcm
IGNsYXNzTmFtZXMpIGNvbnN0CiB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNz
TmFtZXMuc2l6ZSgpOyArK2kpIHsKQEAgLTgwMiw5ICs0MjMsOCBAQCBpbmxpbmUgdm9pZCBTdHls
ZVJlc29sdmVyOjppbml0RWxlbWVudChTdGF0ZSYgc3RhdGUsIEVsZW1lbnQqIGUpCiAgICAgfQog
fQogCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2
ZShEb2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSwgUHNldWRvSWQgcHNldWRvSWQsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKK2lu
bGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3Vt
ZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBSZW5k
ZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCiB7Ci0gICAgbV9wc2V1ZG9TdHlsZSA9IHBzZXVk
b0lkOwogICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IHJlZ2lvbkZvclN0eWxpbmc7CiAKICAgICBp
ZiAoZSkgewpAQCAtODI2LDcgKzQ0Niw2IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0
YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVuCiAKICAg
ICBtX3N0eWxlID0gMDsKICAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKLSAg
ICBtX3J1bGVMaXN0ID0gMDsKICAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwogfQogCkBAIC04OTMs
MTEgKzUxMiw4IEBAIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0
Y2hlc1J1bGVTZXQoRWxlbWVudCogZSwgUnVsZVNldCogcnVsCiAKICAgICBTdGF0ZSBzdGF0ZShk
b2N1bWVudCgpKTsKICAgICBzdGF0ZS5pbml0RWxlbWVudChlKTsKLSAgICBzdGF0ZS5zZXRNb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5kZXgg
PSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RS
dWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKHN0YXRl
LCBNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7Ci0gICAgcmV0dXJuICFzdGF0ZS5t
YXRjaGVkUnVsZXMoKS5pc0VtcHR5KCk7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVj
dG9yKHRoaXMsIHN0YXRlKTsKKyAgICByZXR1cm4gY29sbGVjdG9yLmhhc0FueU1hdGNoaW5nUnVs
ZXMocnVsZVNldCk7CiB9CiAKIGJvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhD
b250cm9sKGNvbnN0IFN0YXRlJiBzdGF0ZSwgU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QK
QEAgLTExNjEsMjYgKzc3Nyw2IEBAIFJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVT
aGFyZWRTdHlsZShTdGF0ZSYgc3RhdGUpCiAgICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVy
U3R5bGUoKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoU3RhdGUmIHN0
YXRlLCBNYXRjaFJlc3VsdCYgcmVzdWx0KQotewotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNj
b3BlOwotCi0gICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBz
aGVldC4KLSAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVT
aGVldCkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci0gICAgUnVsZVNldCog
dXNlckFnZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJw
cmludCIpCi0gICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHls
ZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOwotICAgIG1hdGNoVUFSdWxl
cyhzdGF0ZSwgcmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAgIC8vIEluIHF1aXJr
cyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVldC4K
LSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxl
cyhzdGF0ZSwgcmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHls
ZSk7Ci0KLSAgICAvLyBJZiBkb2N1bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmll
dyBzb3VyY2UgbW9kZSBvciBpbiB4bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVz
IGZyb20gdGhlIHZpZXcgc291cmNlIHN0eWxlIHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5p
c1ZpZXdTb3VyY2UoKSkKLSAgICAgICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCByZXN1bHQsIENTU0Rl
ZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOwotfQotCiBzdGF0aWMgdm9pZCBz
ZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2Rl
LCBSZW5kZXJTdHlsZSogc3R5bGUpCiB7CiAgICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2lu
YXRpb246OlVucGFnaW5hdGVkKQpAQCAtMTM3OCw3ICs5NzQsNyBAQCBQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwg
UmVuZGVyUwogCiAgICAgU3RhdGUgc3RhdGUoZG9jdW1lbnQoKSk7CiAgICAgaW5pdEVsZW1lbnQo
c3RhdGUsIGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQo
KSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOwor
ICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVs
dFBhcmVudCwgcmVnaW9uRm9yU3R5bGluZyk7CiAgICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBB
bGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkp
IHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUo
c3RhdGUpOwogICAgICAgICBpZiAoc2hhcmVkU3R5bGUpCkBAIC0xNDIzLDEzICsxMDE5LDE2IEBA
IFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVudChF
bGVtZW50KiBlbGVtZW50LCBSZW5kZXJTCiAgICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKICAgICAg
ICAgbV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCks
IG1fc2NvcGVSZXNvbHZlci5nZXQoKSk7CiAKLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsK
KyAgICBFbGVtZW50UnVsZUNvbGxlY3RvciBjb2xsZWN0b3IodGhpcywgc3RhdGUpOworICAgIGNv
bGxlY3Rvci5zZXRSZWdpb25Gb3JTdHlsaW5nKHJlZ2lvbkZvclN0eWxpbmcpOworICAgIGNvbGxl
Y3Rvci5zZXRNZWRpdW0obV9tZWRpdW0uZ2V0KCkpOworCiAgICAgaWYgKG1hdGNoaW5nQmVoYXZp
b3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhzdGF0
ZSwgbWF0Y2hSZXN1bHQpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAgICAg
ZWxzZQotICAgICAgICBtYXRjaEFsbFJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgbWF0Y2hpbmdC
ZWhhdmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7CisgICAgICAgIGNvbGxlY3Rv
ci5tYXRjaEFsbFJ1bGVzKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzLCBtYXRjaGluZ0JlaGF2
aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKIAotICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXMoc3RhdGUsIG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKKyAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzKHN0YXRlLCBjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpLCBlbGVtZW50KTsKIAog
ICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29y
YXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgogICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRl
LCBzdHlsZS5nZXQoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxlbWVudCk7CkBAIC0xNDQ0LDcg
KzEwNDMsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZv
cktleWZyYW1lKFN0YXRlJiBzdGF0ZSwgY29uc3QgUmVuZAogewogICAgIE1hdGNoUmVzdWx0IHJl
c3VsdDsKICAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYWRkTWF0Y2hl
ZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKyAgICAgICAgcmVz
dWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwogCiAgICAg
Ly8gQ3JlYXRlIHRoZSBzdHlsZQogICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBSZW5k
ZXJTdHlsZTo6Y2xvbmUoZWxlbWVudFN0eWxlKTsKQEAgLTE1NjMsNyArMTE2Miw3IEBAIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChQ
c2V1ZG9JZCBwc2V1ZG8sIEVsCiAKICAgICBTdGF0ZSBzdGF0ZShkb2N1bWVudCgpKTsKICAgICBp
bml0RWxlbWVudChzdGF0ZSwgZSk7Ci0gICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1
bWVudCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvKTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVS
ZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlKTsKICAgICBzdGF0ZS5zZXRTdHlsZShS
ZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwogICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKHN0
YXRlLnBhcmVudFN0eWxlKCkpOwogCkBAIC0xNTcxLDIwICsxMTcwLDIyIEBAIFBhc3NSZWZQdHI8
UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChQc2V1ZG9J
ZCBwc2V1ZG8sIEVsCiAgICAgLy8gdGhvc2UgcnVsZXMuCiAKICAgICAvLyBDaGVjayBVQSwgdXNl
ciBhbmQgYXV0aG9yIHJ1bGVzLgotICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OwotICAgIG1h
dGNoVUFSdWxlcyhzdGF0ZSwgbWF0Y2hSZXN1bHQpOworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9y
IGNvbGxlY3Rvcih0aGlzLCBzdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldFBzZXVkb1N0eWxlKHBz
ZXVkbyk7CisgICAgY29sbGVjdG9yLnNldE1lZGl1bShtX21lZGl1bS5nZXQoKSk7CisgICAgY29s
bGVjdG9yLm1hdGNoVUFSdWxlcygpOwogCiAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzKSB7Ci0gICAgICAgIG1hdGNoVXNlclJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgZmFsc2Up
OwotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgZmFsc2UpOwor
ICAgICAgICBjb2xsZWN0b3IubWF0Y2hVc2VyUnVsZXMoZmFsc2UpOworICAgICAgICBjb2xsZWN0
b3IubWF0Y2hBdXRob3JSdWxlcyhmYWxzZSk7CiAgICAgfQogCi0gICAgaWYgKG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICBpZiAoY29sbGVjdG9yLm1hdGNoZWRS
ZXN1bHQoKS5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiAwOwog
CiAgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVkbyk7CiAKLSAgICBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgZSk7CisgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllcyhzdGF0ZSwgY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKSwgZSk7CiAKICAgICAv
LyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9u
cyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KICAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZSwgc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgMCk7CkBAIC0xNjA2LDE3ICsxMjA3LDEy
IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yUGFnZShp
bnQgcGFnZUluZGV4KQogICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7
CiAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
KTsKIAotICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShzdGF0ZSwgcGFnZUluZGV4
KTsKLSAgICBjb25zdCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOwotICAg
IGNvbnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsKLSAgICAKLSAgICBNYXRj
aFJlc3VsdCByZXN1bHQ7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAg
IG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBp
c0ZpcnN0LCBwYWdlKTsKLSAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1
bGVTZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCi0gICAgbWF0Y2hQ
YWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJz
dCwgcGFnZSk7CisgICAgUGFnZVJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHN0YXRlLCBtX3J1bGVT
ZXRzKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hBbGxQYWdlUnVsZXMocGFnZUluZGV4KTsKICAgICBz
dGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CiAgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFs
c2U7CisKKyAgICBNYXRjaFJlc3VsdCYgcmVzdWx0ID0gY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQo
KTsKICNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
PFZhcmlhYmxlRGVmaW5pdGlvbnM+KHN0YXRlLCByZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CiAjZW5kaWYKQEAgLTIw
NDUsNzcgKzE2NDEsMzEgQEAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6
cHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgUHMKICAgICAgICAgcmV0dXJu
IDA7CiAKICAgICBTdGF0ZSBzdGF0ZShkb2N1bWVudCgpKTsKLSAgICBzdGF0ZS5zZXRNb2RlKFNl
bGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKLQogICAgIGluaXRFbGVtZW50KHN0YXRl
LCBlKTsKLSAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAsIHBz
ZXVkb0lkKTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAp
OworCisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIHN0YXRlKTsKKyAg
ICBjb2xsZWN0b3Iuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7Cisg
ICAgY29sbGVjdG9yLnNldFBzZXVkb1N0eWxlKHBzZXVkb0lkKTsKKyAgICBjb2xsZWN0b3Iuc2V0
TWVkaXVtKG1fbWVkaXVtLmdldCgpKTsKIAotICAgIE1hdGNoUmVzdWx0IGR1bW15OwogICAgIGlm
IChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVzKSB7CiAgICAgICAgIC8vIEZpcnN0
IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgICAgIG1hdGNo
VUFSdWxlcyhzdGF0ZSwgZHVtbXkpOwotCisgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMo
KTsKKyAgICAgICAgCiAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgog
ICAgICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgICAgICBtYXRj
aFVzZXJSdWxlcyhzdGF0ZSwgZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7
CisgICAgICAgICAgICBjb2xsZWN0b3IubWF0Y2hVc2VyUnVsZXMocnVsZXNUb0luY2x1ZGUgJiBF
bXB0eUNTU1J1bGVzKTsKICAgICB9CiAKICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMgJiYgKHJ1bGVzVG9JbmNsdWRlICYgQXV0aG9yQ1NTUnVsZXMpKSB7Ci0gICAgICAgIHN0YXRl
LnNldFNhbWVPcmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVz
KSk7CisgICAgICAgIGNvbGxlY3Rvci5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRl
ICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBp
biBhdXRob3Igc2hlZXRzLgotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHN0YXRlLCBkdW1teSwg
cnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3Rh
dGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1bGVN
YXRjaGVzKFN0YXRlJiBzdGF0ZSwgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBDb250
YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hlY2tl
cjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSkKLXsKLSAgICBpZiAocnVs
ZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25vdyB0
aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAgICAg
ICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlKCkgIT0gTk9QU0VVRE8pCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmds
ZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0
aGUgcnVsZSBoYXNoLgotICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNv
IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bGVE
YXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYg
c3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmICghcnVs
ZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9
PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUu
ZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFTZWxlY3RvckNoZWNrZXI6OmZhc3RDaGVja1Jp
Z2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0
b3IoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIFNlbGVj
dG9yQ2hlY2tlcjo6ZmFzdENoZWNrKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQo
KSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaEF1dGhvclJ1bGVzKHJ1bGVzVG9JbmNsdWRlICYg
RW1wdHlDU1NSdWxlcyk7CiAgICAgfQogCi0gICAgLy8gU2xvdyBwYXRoLgotICAgIFNlbGVjdG9y
Q2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgc3RhdGUubW9kZSgpKTsKLSAgICBT
ZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEu
c2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRj
aEVuYWJsZWQpOwotICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKLSAg
ICBjb250ZXh0LnNjb3BlID0gc2NvcGU7Ci0gICAgY29udGV4dC5wc2V1ZG9TdHlsZSA9IHN0YXRl
LnBzZXVkb1N0eWxlKCk7Ci0gICAgY29udGV4dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlv
ckF0Qm91bmRhcnk7Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9y
Q2hlY2tlci5tYXRjaChjb250ZXh0LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2Fs
U3RyYXRlZ3koKSk7Ci0gICAgaWYgKG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JN
YXRjaGVzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxl
KCkgIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGUoKSAhPSBkeW5hbWljUHNldWRvKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3R5bGVS
ZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2Vs
ZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCi17Ci0gICAgaWYgKCFyZWdpb25TZWxlY3Rv
ciB8fCAhcmVnaW9uRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU2VsZWN0
b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlF1
ZXJ5aW5nUnVsZXMpOwotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxl
Y3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkKLSAgICAgICAgaWYgKHNlbGVj
dG9yQ2hlY2tlci5tYXRjaGVzKHMsIHJlZ2lvbkVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbGxlY3Rvci5tYXRjaGVk
UnVsZUxpc3QoKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjM5
Miw4NiArMTk0Miw2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGll
cyhTdGF0ZSYgc3RhdGUsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjCiAgICAgYWRkVG9NYXRjaGVk
UHJvcGVydGllc0NhY2hlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hl
SGFzaCwgbWF0Y2hSZXN1bHQpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VS
dWxlcyhjb25zdCBTdHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCi17
Ci0gICAgcmV0dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9y
KCktPnNwZWNpZmljaXR5KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVs
ZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBpZiAoIXJ1
bGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNo
ZWRQYWdlUnVsZXM7Ci0gICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMs
IHJ1bGVzLT5wYWdlUnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsK
LSAgICBpZiAobWF0Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIHN0ZDo6c3RhYmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFn
ZVJ1bGVzLmVuZCgpLCBjb21wYXJlUGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRNYXRjaGVk
UHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Ci19
Ci0KLXN0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxl
Y3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3Qg
U3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25l
bnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3Rv
cnkoKSkgewotICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpU
YWcpIHsKLSAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9u
ZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAh
PSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUg
cHNldWRvVHlwZSA9IGNvbXBvbmVudC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAoKHBzZXVk
b1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQotICAg
ICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAm
JiBpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6
OlBzZXVkb0ZpcnN0UGFnZSAmJiAhaXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1
bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVs
ZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdl
TmFtZSkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAgICAgIGlm
ICghY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBh
Z2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25v
cmUgaXQuCi0gICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxl
LT5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5p
c0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBy
dWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRSdWxlcy5h
cHBlbmQocnVsZSk7Ci0gICAgfQotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2Uo
U3RhdGUmIHN0YXRlLCBpbnQgcGFnZUluZGV4KSBjb25zdAotewotICAgIGJvb2wgaXNGaXJzdFBh
Z2VMZWZ0ID0gZmFsc2U7Ci0gICAgaWYgKCFzdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQot
ICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwot
fQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0
Ci17Ci0gICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFn
ZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAo
IXBhZ2VJbmRleCk7Ci19Ci0KLVN0cmluZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyog
cGFnZUluZGV4ICovKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRl
eCB0byBwYWdlIG5hbWUgbWFwcGluZy4KLSAgICByZXR1cm4gIiI7Ci19Ci0KIHZvaWQgU3R5bGVS
ZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVdpdGhOdWxsQ2hlY2soU3RhdGUmIHN0YXRlLCBDU1NQcm9w
ZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCiB7CiAgICAgaWYgKCF2YWx1ZSkKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9j
c3MvU3R5bGVSZXNvbHZlci5oCmluZGV4IDI4NTZkNzM1OWQzMjZjZTg0NDM3NTAzMzA1Yzk1OThk
NzU5OWQ3NGYuLmJhNTA0NmNlYjcwZTk1YmExOWQ0YmE4NDNiODgxOTdkZThjMWMzN2MgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgKKysrIGIvU291cmNlL1dl
YkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaApAQCAtMTg2LDYgKzE4Niw3IEBAIHB1YmxpYzoKIAog
ICAgIERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQog
ICAgIGNvbnN0IERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9y
dWxlU2V0czsgfQorICAgIFNlbGVjdG9yRmlsdGVyJiBzZWxlY3RvckZpbHRlcigpIHsgcmV0dXJu
IG1fc2VsZWN0b3JGaWx0ZXI7IH0KIAogI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJM
RShTSEFET1dfRE9NKQogICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZl
cigpCkBAIC0zMDEsMTQgKzMwMiw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbG9hZFBlbmRpbmdS
ZXNvdXJjZXMoU3RhdGUmKTsKIAotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVz
IHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQg
Z2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JH
ZW5lcmljRmFtaWx5Q2hhbmdlKFN0YXRlJiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdlKFN0YXRlJiwgUmVuZGVyU3R5
bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3JUZXh0U2l6
ZUFkanVzdChTdGF0ZSYpOwotCi0gICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShTdGF0ZSYsIFJl
bmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1l
bnQqKTsKLQogICAgIHN0cnVjdCBSdWxlUmFuZ2UgewogICAgICAgICBSdWxlUmFuZ2UoaW50JiBm
aXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RS
dWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQogICAgICAgICBpbnQm
IGZpcnN0UnVsZUluZGV4OwpAQCAtMzQ5LDI5ICszNDIsMjAgQEAgcHJpdmF0ZToKICAgICAgICAg
VmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7CiAgICAgICAgIE1hdGNoUmFuZ2Vz
IHJhbmdlczsKICAgICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKLSAgICB9OwogCi0gICAgc3RhdGlj
IHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3Bl
cnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlw
ZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFBy
b3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVz
KE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUg
PSB0cnVlKTsKKyAgICAgICAgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhjb25zdCBTdHlsZVBy
b3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNo
VHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9
IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CisgICAgfTsKIAotICAgIHZvaWQgbWF0Y2hBbGxSdWxl
cyhTdGF0ZSYsIE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotICAg
IHZvaWQgbWF0Y2hVQVJ1bGVzKFN0YXRlJiwgTWF0Y2hSZXN1bHQmKTsKLSAgICB2b2lkIG1hdGNo
VUFSdWxlcyhTdGF0ZSYsIE1hdGNoUmVzdWx0JiwgUnVsZVNldCopOwotICAgIHZvaWQgbWF0Y2hB
dXRob3JSdWxlcyhTdGF0ZSYsIE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7
Ci0gICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhTdGF0ZSYsIE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNs
dWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKFN0YXRlJiwg
TWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9z
dFJ1bGVzKFN0YXRlJiwgTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKK3By
aXZhdGU6CisgICAgLy8gVGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNp
emUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFz
IGNoYW5nZWQuIC1kd2gKKyAgICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShTdGF0
ZSYsIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNo
ZWNrRm9yWm9vbUNoYW5nZShTdGF0ZSYsIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlKTsKKyAgICB2b2lkIGNoZWNrRm9yVGV4dFNpemVBZGp1c3QoU3RhdGUmKTsKIAotICAg
IHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoU3RhdGUmLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBS
dWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKFN0YXRl
JiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QoU3RhdGUmLCBjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3Qg
TWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShT
dGF0ZSYsIFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUsIEVsZW1lbnQqKTsKIAogICAgIGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVE
YXRhJikgY29uc3Q7Ci0gICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKFN0YXRlJik7Ci0gICAgdm9p
ZCBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoU3RhdGUmLCBNYXRjaFJlc3VsdCYpOwogCi0g
ICAgYm9vbCBydWxlTWF0Y2hlcyhTdGF0ZSYsIGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFp
bmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91
bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKLSAgICBib29s
IGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBF
bGVtZW50KiByZWdpb25FbGVtZW50KTsKICAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMo
U3RhdGUmLCBjb25zdCBNYXRjaFJlc3VsdCYsIGNvbnN0IEVsZW1lbnQqKTsKICAgICBlbnVtIFN0
eWxlQXBwbGljYXRpb25QYXNzIHsKICNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKQEAgLTQyMiwx
MiArNDA2LDkgQEAgcHVibGljOgogICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKICAgICAgICAg
LCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkK
LSAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQotICAgICAgICAsIG1fcHNldWRvU3R5
bGUoTk9QU0VVRE8pCiAgICAgICAgICwgbV9lbGVtZW50TGlua1N0YXRlKE5vdEluc2lkZUxpbmsp
CiAgICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoZmFsc2UpCiAgICAgICAg
ICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoZmFsc2UpCi0gICAgICAgICwgbV9tb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpCiAgICAgICAgICwgbV9hcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSkKICAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0
ZWRMaW5rU3R5bGUoZmFsc2UpCiAjaWYgRU5BQkxFKENTU19TSEFERVJTKQpAQCAtNDQwLDcgKzQy
MSw3IEBAIHB1YmxpYzoKIAogICAgIHB1YmxpYzoKICAgICAgICAgdm9pZCBpbml0RWxlbWVudChF
bGVtZW50Kik7Ci0gICAgICAgIHZvaWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVs
ZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBQc2V1ZG9JZCA9IE5PUFNFVURP
LCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBpbml0
Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSA9IDAsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOwogICAgICAgICB2
b2lkIGNsZWFyKCk7CiAKICAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1
cm4gbV9kb2N1bWVudDsgfQpAQCAtNDUwLDI1ICs0MzEsMTcgQEAgcHVibGljOgogICAgICAgICBS
ZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9CiAgICAg
ICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHRha2VTdHlsZSgpIHsgcmV0dXJuIG1fc3R5bGUu
cmVsZWFzZSgpOyB9CiAKLSAgICAgICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0
KCk7Ci0gICAgICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHRha2VSdWxlTGlzdCgpIHsgcmV0
dXJuIG1fcnVsZUxpc3QucmVsZWFzZSgpOyB9Ci0KICAgICAgICAgY29uc3QgQ29udGFpbmVyTm9k
ZSogcGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50Tm9kZTsgfQogICAgICAgICB2
b2lkIHNldFBhcmVudFN0eWxlKFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkgeyBtX3BhcmVudFN0
eWxlID0gcGFyZW50U3R5bGU7IH0KICAgICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkg
Y29uc3QgeyByZXR1cm4gbV9wYXJlbnRTdHlsZTsgfQogICAgICAgICBSZW5kZXJTdHlsZSogcm9v
dEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm9vdEVsZW1lbnRTdHlsZTsgfQogCiAg
ICAgICAgIGNvbnN0IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZygpIGNvbnN0IHsgcmV0
dXJuIG1fcmVnaW9uRm9yU3R5bGluZzsgfQotICAgICAgICB2b2lkIHNldFNhbWVPcmlnaW5Pbmx5
KGJvb2wgaXNTYW1lT3JpZ2luT25seSkgeyBtX3NhbWVPcmlnaW5Pbmx5ID0gaXNTYW1lT3JpZ2lu
T25seTsgfQotICAgICAgICBib29sIGlzU2FtZU9yaWdpbk9ubHkoKSBjb25zdCB7IHJldHVybiBt
X3NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIFBzZXVkb0lkIHBzZXVkb1N0eWxlKCkgY29uc3Qg
eyByZXR1cm4gbV9wc2V1ZG9TdHlsZTsgfQogICAgICAgICBFSW5zaWRlTGluayBlbGVtZW50TGlu
a1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRlOyB9CiAgICAgICAgIGJv
b2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9kaXN0cmli
dXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KICAgICAgICAgdm9pZCBzZXRFbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1
bGVzID0gaXNBZmZlY3RlZDsgfQogICAgICAgICBib29sIGVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NS
dWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOyB9Ci0g
ICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkgeyBtX21vZGUg
PSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKCkgY29uc3QgeyBy
ZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0
eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJT
dHlsZSA9IGlzQXBwbHk7IH0KICAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9WaXNpdGVk
TGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5
bGUgPSBpc0FwcGx5OyB9CiAgICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxl
KCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0KQEAgLTUw
MiwxMCArNDc1LDggQEAgcHVibGljOgogICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRp
bmdNb2RlIHdyaXRpbmdNb2RlKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdN
b2RlKHdyaXRpbmdNb2RlKTsgfQogICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0
T3JpZW50YXRpb24gdGV4dE9yaWVudGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNl
dFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9CiAKLSAgICAgICAgVmVjdG9yPGNv
bnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxl
czsgfQotICAgICAgICB2b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7
IG1fbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsgfQogICAgICAgICBib29sIHVzZVNWR1pvb21S
dWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudCAmJiBtX2VsZW1lbnQtPmlzU1ZHRWxlbWVu
dCgpOyB9Ci0gICAgICAgIAorCiAgICAgcHJpdmF0ZToKICAgICAgICAgRG9jdW1lbnQqIG1fZG9j
dW1lbnQ7CiAgICAgICAgIEVsZW1lbnQqIG1fZWxlbWVudDsKQEAgLTUxNCwyNCArNDg1LDE2IEBA
IHB1YmxpYzoKICAgICAgICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOwogICAgICAgICBS
ZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsKICAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVs
ZW1lbnRTdHlsZTsKLSAgICAgICAgCi0gICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JT
dHlsaW5nOwotICAgICAgICBib29sIG1fc2FtZU9yaWdpbk9ubHk7Ci0gICAgICAgIFBzZXVkb0lk
IG1fcHNldWRvU3R5bGU7CiAKKyAgICAgICAgLy8gUmVxdWlyZWQgdG8gQVNTRVJUIGluIGFwcGx5
UHJvcGVydGllcy4KKyAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7Cisg
ICAgICAgIAogICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3RhdGU7CiAKICAgICAg
ICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKIAogICAgICAgICBib29sIG1f
ZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOwogCi0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtX21vZGU7Ci0KLSAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQg
b2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9y
YXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3Qg
UnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NS
dWxlTGlzdD4gbV9ydWxlTGlzdDsKLQogICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlOwogICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHls
ZTsKIApAQCAtNjU2LDYgKzYxOSwxOSBAQCBpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNT
ZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKICAgICByZXR1
cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBs
KCkpOwogfQogCitpbmxpbmUgYm9vbCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVj
dG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICBpZiAo
IXJlZ2lvblNlbGVjdG9yIHx8ICFyZWdpb25FbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKHJlZ2lvbkVsZW1lbnQtPmRv
Y3VtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6UXVlcnlpbmdSdWxlcyk7CisgICAgZm9yIChjb25z
dCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0
OjpuZXh0KHMpKQorICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLm1hdGNoZXMocywgcmVnaW9u
RWxlbWVudCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsK
K30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9o
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQu
Y3BwIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAppbmRl
eCA2ZDcwNWFlMWVkZWRlZWZhZGE5YTJkMDEzMmU2YWZmN2NlZjEzYzlmLi4zNjE2MjYzMGIyMzE3
ZWMyYWI1MDJhNjQ5MGJjMzE2Njg2Y2Q4NWNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHAKQEAgLTk1NywxMSArOTU3LDExIEBAIFBhc3NSZWZQ
dHI8VHlwZUJ1aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9maWxlPiBJbnNwZWN0b3JDU1NBZ2VudDo6
c3RvcFNlbGVjdG9yUHJvCiAgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CiB9CiAKLXZvaWQg
SW5zcGVjdG9yQ1NTQWdlbnQ6OndpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJl
c29sdmVyKiBzdHlsZVJlc29sdmVyKQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNo
UnVsZShTdHlsZVJ1bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNT
U09NV3JhcHBlcnMsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xs
ZWN0aW9uKQogewogLy8gICAgcHJpbnRmKCJJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVs
ZSAlc1xuIiwgcnVsZS0+c2VsZWN0b3JMaXN0KCkuc2VsZWN0b3JzVGV4dCgpLnV0ZjgoKS5kYXRh
KCkpOwogICAgIGlmIChtX2N1cnJlbnRTZWxlY3RvclByb2ZpbGUpCi0gICAgICAgIG1fY3VycmVu
dFNlbGVjdG9yUHJvZmlsZS0+c3RhcnRTZWxlY3RvcihzdHlsZVJlc29sdmVyLT5pbnNwZWN0b3JD
U1NPTVdyYXBwZXJzKCkuZ2V0V3JhcHBlckZvclJ1bGVJblNoZWV0cyhydWxlLCBzdHlsZVJlc29s
dmVyLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKSk7CisgICAgICAgIG1fY3Vy
cmVudFNlbGVjdG9yUHJvZmlsZS0+c3RhcnRTZWxlY3RvcihpbnNwZWN0b3JDU1NPTVdyYXBwZXJz
LmdldFdyYXBwZXJGb3JSdWxlSW5TaGVldHMocnVsZSwgc3R5bGVTaGVldENvbGxlY3Rpb24pKTsK
IH0KIAogdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6ZGlkTWF0Y2hSdWxlKGJvb2wgbWF0Y2hlZCkK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5o
IGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmgKaW5kZXggMTQz
ZTQ1NGFhOTZiMDE2ODE5ODAzMTUxMGZmNTk3MzhhZjBmZWUxNy4uNDBmODgyMGUyYTI3OWFiNWU2
OGFmOTBkODA2NDQ2YTJiZTU4N2RhMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3RvckNTU0FnZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3RvckNTU0FnZW50LmgKQEAgLTQ3LDcgKzQ3LDkgQEAgY2xhc3MgQ1NTU3R5bGVEZWNsYXJh
dGlvbjsKIGNsYXNzIENTU1N0eWxlUnVsZTsKIGNsYXNzIENTU1N0eWxlU2hlZXQ7CiBjbGFzcyBE
b2N1bWVudDsKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBFbGVt
ZW50OworY2xhc3MgSW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKIGNsYXNzIEluc3BlY3RvckZyb250
ZW5kOwogY2xhc3MgSW5zdHJ1bWVudGluZ0FnZW50czsKIGNsYXNzIE5hbWVOb2RlTWFwOwpAQCAt
MTI1LDcgKzEyNyw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgc3RvcFNlbGVjdG9yUHJv
ZmlsZXIoRXJyb3JTdHJpbmcqLCBSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9m
aWxlPiYpOwogCiAgICAgUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclByb2Zp
bGU+IHN0b3BTZWxlY3RvclByb2ZpbGVySW1wbChFcnJvclN0cmluZyosIGJvb2wgbmVlZFByb2Zp
bGUpOwotICAgIHZvaWQgd2lsbE1hdGNoUnVsZShTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7
CisgICAgdm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSosIEluc3BlY3RvckNTU09NV3JhcHBl
cnMmLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKik7CiAgICAgdm9pZCBkaWRNYXRjaFJ1
bGUoYm9vbCk7CiAgICAgdm9pZCB3aWxsUHJvY2Vzc1J1bGUoU3R5bGVSdWxlKiwgU3R5bGVSZXNv
bHZlciopOwogICAgIHZvaWQgZGlkUHJvY2Vzc1J1bGUoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwIGIvU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAKaW5kZXggMzdhODY1
YTk0YmFmNDE1ZDU1NzZlZDc4NTIxYWVmNjNkMGNkN2Q1NS4uOGM3YjViOTVhODllNDhkNDRmMjZl
MmNmYzIzNzM3ZTM5ZjE4YjMxMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAKQEAgLTU4MiwxMSArNTgyLDExIEBAIHZv
aWQgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlv
bkltcGwoSW5zdHJ1bWVudGluZ0FnCiAgICAgICAgIHJlc291cmNlQWdlbnQtPmRpZFNjaGVkdWxl
U3R5bGVSZWNhbGN1bGF0aW9uKGRvY3VtZW50KTsKIH0KIAotSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5z
dHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBT
dHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQorSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVu
dGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0
b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uKiBzaGVldENvbGxlY3Rpb24pCiB7CiAgICAgSW5zcGVjdG9yQ1NTQWdlbnQq
IGNzc0FnZW50ID0gaW5zdHJ1bWVudGluZ0FnZW50cy0+aW5zcGVjdG9yQ1NTQWdlbnQoKTsKICAg
ICBpZiAoY3NzQWdlbnQpIHsKLSAgICAgICAgY3NzQWdlbnQtPndpbGxNYXRjaFJ1bGUocnVsZSwg
c3R5bGVSZXNvbHZlcik7CisgICAgICAgIGNzc0FnZW50LT53aWxsTWF0Y2hSdWxlKHJ1bGUsIGlu
c3BlY3RvckNTU09NV3JhcHBlcnMsIHNoZWV0Q29sbGVjdGlvbik7CiAgICAgICAgIHJldHVybiBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUoaW5zdHJ1bWVudGluZ0FnZW50cywgMSk7CiAg
ICAgfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uLmggYi9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uLmgKaW5kZXggOTkyZGIwYThmM2RmYzYzZGI2YWVlYjBlNDMyYTZiMjU2NGZkYWFi
OC4uZTI3ZjdhYmRiNmQ2NDVjMGFkYzYwMTQxZGE3NDNjYWIyYWE0MWYyNiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaApAQCAt
NTksMTAgKzU5LDEyIEBAIGNsYXNzIERvY3VtZW50OwogY2xhc3MgRWxlbWVudDsKIGNsYXNzIEV2
ZW50Q29udGV4dDsKIGNsYXNzIERvY3VtZW50TG9hZGVyOworY2xhc3MgRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbjsKIGNsYXNzIERldmljZU9yaWVudGF0aW9uRGF0YTsKIGNsYXNzIEdlb2xv
Y2F0aW9uUG9zaXRpb247CiBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CiBjbGFzcyBJbnNwZWN0b3JD
U1NBZ2VudDsKK2NsYXNzIEluc3BlY3RvckNTU09NV3JhcHBlcnM7CiBjbGFzcyBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb247CiBjbGFzcyBJbnNwZWN0b3JUaW1lbGluZUFnZW50OwogY2xhc3MgSW5z
dHJ1bWVudGluZ0FnZW50czsKQEAgLTE3MSw3ICsxNzMsNyBAQCBwdWJsaWM6CiAgICAgc3RhdGlj
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsUmVjYWxjdWxhdGVTdHlsZShEb2N1
bWVudCopOwogICAgIHN0YXRpYyB2b2lkIGRpZFJlY2FsY3VsYXRlU3R5bGUoY29uc3QgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJik7CiAgICAgc3RhdGljIHZvaWQgZGlkU2NoZWR1bGVT
dHlsZVJlY2FsY3VsYXRpb24oRG9jdW1lbnQqKTsKLSAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uQ29va2llIHdpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBTdHls
ZVJlc29sdmVyKik7CisgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3
aWxsTWF0Y2hSdWxlKERvY3VtZW50KiwgU3R5bGVSdWxlKiwgSW5zcGVjdG9yQ1NTT01XcmFwcGVy
cyYsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsKICAgICBzdGF0aWMgdm9pZCBkaWRN
YXRjaFJ1bGUoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJiwgYm9vbCBtYXRj
aGVkKTsKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxQcm9j
ZXNzUnVsZShEb2N1bWVudCosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKICAgICBzdGF0
aWMgdm9pZCBkaWRQcm9jZXNzUnVsZShjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29r
aWUmKTsKQEAgLTM3MSw3ICszNzMsNyBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgd2lsbFJlY2FsY3VsYXRlU3R5bGVJbXBsKEluc3RydW1lbnRp
bmdBZ2VudHMqLCBGcmFtZSopOwogICAgIHN0YXRpYyB2b2lkIGRpZFJlY2FsY3VsYXRlU3R5bGVJ
bXBsKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwogICAgIHN0YXRpYyB2
b2lkIGRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uSW1wbChJbnN0cnVtZW50aW5nQWdlbnRz
KiwgRG9jdW1lbnQqKTsKLSAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2ll
IHdpbGxNYXRjaFJ1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqLCBTdHlsZVJ1bGUqLCBTdHls
ZVJlc29sdmVyKik7CisgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3
aWxsTWF0Y2hSdWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiwgU3R5bGVSdWxlKiwgSW5zcGVj
dG9yQ1NTT01XcmFwcGVycyYsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsKICAgICBz
dGF0aWMgdm9pZCBkaWRNYXRjaFJ1bGVJbXBsKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bkNvb2tpZSYsIGJvb2wgbWF0Y2hlZCk7CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSB3aWxsUHJvY2Vzc1J1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqLCBTdHls
ZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CiAgICAgc3RhdGljIHZvaWQgZGlkUHJvY2Vzc1J1bGVJ
bXBsKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwpAQCAtMTE2MCwxNiAr
MTE2MiwxNyBAQCBpbmxpbmUgdm9pZCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFNjaGVk
dWxlU3R5bGVSZWNhbGN1bGF0aW9uKERvY3VtZW50KiBkbwogI2VuZGlmCiB9CiAKLWlubGluZSBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3
aWxsTWF0Y2hSdWxlKERvY3VtZW50KiBkb2N1bWVudCwgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJl
c29sdmVyKiBzdHlsZVJlc29sdmVyKQoraW5saW5lIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNv
b2tpZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqIGRv
Y3VtZW50LCBTdHlsZVJ1bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3Rv
ckNTU09NV3JhcHBlcnMsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRD
b2xsZWN0aW9uKQogewogI2lmIEVOQUJMRShJTlNQRUNUT1IpCiAgICAgRkFTVF9SRVRVUk5fSUZf
Tk9fRlJPTlRFTkRTKEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSgpKTsKICAgICBpZiAo
SW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cyA9IGluc3RydW1lbnRpbmdB
Z2VudHNGb3JEb2N1bWVudChkb2N1bWVudCkpCi0gICAgICAgIHJldHVybiB3aWxsTWF0Y2hSdWxl
SW1wbChpbnN0cnVtZW50aW5nQWdlbnRzLCBydWxlLCBzdHlsZVJlc29sdmVyKTsKKyAgICAgICAg
cmV0dXJuIHdpbGxNYXRjaFJ1bGVJbXBsKGluc3RydW1lbnRpbmdBZ2VudHMsIHJ1bGUsIGluc3Bl
Y3RvckNTU09NV3JhcHBlcnMsIHN0eWxlU2hlZXRDb2xsZWN0aW9uKTsKICNlbHNlCiAgICAgVU5V
U0VEX1BBUkFNKGRvY3VtZW50KTsKICAgICBVTlVTRURfUEFSQU0ocnVsZSk7Ci0gICAgVU5VU0VE
X1BBUkFNKHN0eWxlUmVzb2x2ZXIpOworICAgIFVOVVNFRF9QQVJBTShpbnNwZWN0b3JDU1NPTVdy
YXBwZXJzKTsKKyAgICBVTlVTRURfUEFSQU0oc3R5bGVTaGVldENvbGxlY3Rpb24pOwogI2VuZGlm
CiAgICAgcmV0dXJuIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>189698</attachid>
            <date>2013-02-21 23:35:59 -0800</date>
            <delta_ts>2013-03-07 02:24:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130222163218.patch</filename>
            <type>text/plain</type>
            <size>99380</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQzNjc0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNjM5Y2MxNzM1NzQ2YzNk
MTUzM2U5MWUzYmM1YTEzMDdjNTkyN2NkMC4uYmY2MDhmYzYzNTc4ZDkzY2IyMWIxZjg4NjMzYjky
ODlkMWJmYTI0OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEyNCBAQAorMjAxMy0wMi0yMSAgVGFr
YXNoaSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5n
XSBJbXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1l
bnQgYW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4g
Y2xhc3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAg
YSBzdHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3Rvcmlu
Zy4KKworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxp
c3QuYW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6Cisg
ICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNz
cy9DU1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFu
ZCBQYWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6bGVmdFRv
UmlnaHREZWNsYXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpyaWdodFRvTGVmdERlY2xhcmF0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUmVz
dWx0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUnVs
ZUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFkZE1hdGNo
ZWRSdWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjbGVhck1h
dGNoZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5z
dXJlUnVsZUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMpOgorICAgICAgICAoTWF0Y2hpbmdVQVJ1bGVzU2NvcGUp
OgorICAgICAgICAoV2ViQ29yZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxl
c1Njb3BlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hp
bmdVQVJ1bGVzU2NvcGUpOgorICAgICAgICAoV2ViQ29yZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6
OmlzTWF0Y2hpbmdVQVJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVj
dG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVs
ZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyk6
CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29wZWRBdXRo
b3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hI
b3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNo
QXV0aG9yUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1h
dGNoVXNlclJ1bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpt
YXRjaFVBUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnJ1
bGVNYXRjaGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6Y29tcGFyZVJ1bGVz
KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0TWF0Y2hlZFJ1
bGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEFsbFJ1
bGVzKToKKyAgICAgICAgTW92ZWQgdGhlc2UgbWV0aG9kcyBmcm9tIFN0eWxlUmVzb2x2ZXIgdG8g
dGhpcyBjbGFzcy4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpoYXNB
bnlNYXRjaGluZ1J1bGVzKToKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgY2hlY2tp
bmcgd2hldGhlciBhIGdpdmVuIGVsZW1lbnQgY2FuIHNoYXJlCisgICAgICAgIGEgY2FjaGUuCisg
ICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChFbGVtZW50UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBV
c2Ugc3R5bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFi
bGVzLCBpLmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NT
T01XcmFwcGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNldWRvU3R5bGUpOgorICAgICAgICAoV2ViQ29y
ZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNldFNhbWVPcmlnaW5Pbmx5KToKKyAgICAgICAgKFdl
YkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzZXRSZWdpb25Gb3JTdHlsaW5nKToKKyAgICAg
ICAgTW9kZSwgU2FtZU9yaWdpbk9ubHksIFJlZ2lvbkZvclN0eWxpbmcgYXJlIG9ubHkgdXNlZCB3
aGlsZSBjb2xsZWN0aW5nCisgICAgICAgIG1hdGNoZWQgcnVsZXMuCisgICAgICAgIChXZWJDb3Jl
OjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0TWVkaXVtKToKKyAgICAgICAgTmVlZCB0byBrbm93
IHdoaWNoIGRlZmF1bHQgc3R5bGVzaGVldCBzaG91bGQgYmUgbG9va2VkIHVwLgorICAgICAgICAo
V2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmRvY3VtZW50KToKKyAgICAgICAgKiBjc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rv
cjo6UGFnZVJ1bGVDb2xsZWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0
b3I6Om1hdGNoZWRSZXN1bHQpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OmlzUmlnaHRQYWdlKToKKyAgICAgICAgKiBjc3MvU3R5bGVSZXNvbHZlci5jcHA6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVh
cik6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdDo6YWRkTWF0
Y2hlZFByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmluaXRGb3JTdHlsZVJlc29sdmUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6
c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQpOgorICAgICAgICAoV2ViQ29yZTo6
U3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxl
UmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNv
bHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yUGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpw
c2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIu
aDoKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAg
ICAgICAgQWRkZWQgdG8gb2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVj
dG9yJ3MgY29uc3RydWN0b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1h
dGNoUmVzdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0
ZSk6CisgICAgICAgIFRvIHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVy
dGllcywgbmVlZCB0byBrZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAg
KFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckNTU0FnZW50Ojp3aWxsTWF0Y2hSdWxlKToKKyAg
ICAgICAgUmVtb3ZlZCBTdHlsZVJlc29sdmVyIGZyb20gaXRzIHBhcmFtZXRlciBsaXN0LiBJbnN0
ZWFkLCBhZGRlZAorICAgICAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzIGFuZCBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2Vu
dC5oOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChJbnNwZWN0b3JDU1NBZ2VudCk6Cisg
ICAgICAgICogaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHA6CisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZUltcGwpOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZSk6CisKIDIwMTMtMDItMjEgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQu
b3JnPgogCiAgICAgICAgIHRhYmxlcy9tb3ppbGxhL2J1Z3MvYnVnODk1MC5odG1sIGZhaWxzIHdp
dGggdGhyZWFkZWQgcGFyc2VyIGR1ZSB0byBhdHRyaWJ1dGUgZHVwbGljYXRpb24KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKaW5kZXggNDUwMTdiNDVmMDdhZDYxZmVjNDkxZjg3YmZlZTAzNDQ0NTQwY2YyNS4u
MDYzYTE2N2ZjNTM2YWJmMmZmZmNiZmQ1MjM4N2RiNjVkNjZjY2YxMiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTEwNjgsNiArMTA2OCw3IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3Mv
Q1NTVmFsdWVQb29sLmNwcAogICAgIGNzcy9ET01XaW5kb3dDU1MuY3BwCiAgICAgY3NzL0RvY3Vt
ZW50UnVsZVNldHMuY3BwCisgICAgY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAogICAgIGNz
cy9Gb250RmVhdHVyZVZhbHVlLmNwcAogICAgIGNzcy9Gb250VmFsdWUuY3BwCiAgICAgY3NzL0lu
c3BlY3RvckNTU09NV3JhcHBlcnMuY3BwCkBAIC0xMDgwLDYgKzEwODEsNyBAQCBzZXQoV2ViQ29y
ZV9TT1VSQ0VTCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0LmNwcAogICAgIGNzcy9NZWRpYVF1ZXJ5
TGlzdExpc3RlbmVyLmNwcAogICAgIGNzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5jcHAKKyAgICBjc3Mv
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwCiAgICAgY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJh
dGlvbi5jcHAKICAgICBjc3MvUkdCQ29sb3IuY3BwCiAgICAgY3NzL1J1bGVGZWF0dXJlLmgKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0gYi9Tb3VyY2UvV2Vi
Q29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IGZjYWMyMzg4MTFiZTA2MjAxNzQwYmFhYTEw
MWQzMmRkYzlhMDk5YTAuLmM3MDI1NDY2NDQzN2IxNjU4YWNkZDE1MTA1NDQ3OTI5OTgyYjljZjcg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KKysrIGIvU291
cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQpAQCAtMjY1NCw2ICsyNjU0LDggQEAgd2Vi
Y29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRGFzaGJvYXJkUmVnaW9uLmgg
XAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCBcCiAJU291cmNlL1dl
YkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuaCBcCisJU291cmNlL1dlYkNvcmUvY3NzL0VsZW1l
bnRSdWxlQ29sbGVjdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCBcCiAJ
U291cmNlL1dlYkNvcmUvY3NzL0ZvbnRGZWF0dXJlVmFsdWUuaCBcCiAJU291cmNlL1dlYkNvcmUv
Y3NzL0ZvbnRWYWx1ZS5jcHAgXApAQCAtMjY3OCw2ICsyNjgwLDggQEAgd2ViY29yZV9zb3VyY2Vz
ICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5oIFwKIAlT
b3VyY2UvV2ViQ29yZS9jc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwIFwKIAlTb3VyY2UvV2ViQ29y
ZS9jc3MvTWVkaWFRdWVyeU1hdGNoZXIuaCBcCisJU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxl
Q29sbGVjdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgg
XAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9QYWlyLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Qcm9w
ZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvUHJv
cGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmggXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvVGFyZ2V0LnByaSBiL1NvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKaW5kZXggZmY3ZmE3M2Fk
YzAzOTI1ODI1NDQyNTMyN2JjODJmMDAxOWNiZmM2Yi4uODk3ODA5ZTg0ZDAwNGUxOTNhYTAyZTYw
NTAwMzYzMTFlNzM5MDdjMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQor
KysgYi9Tb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCkBAIC0zMDcsNiArMzA3LDcgQEAgU09VUkNF
UyArPSBcCiAgICAgY3NzL0NTU1ZhbHVlUG9vbC5jcHAgXAogICAgIGNzcy9ET01XaW5kb3dDU1Mu
Y3BwIFwKICAgICBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAgXAorICAgIGNzcy9FbGVtZW50UnVs
ZUNvbGxlY3Rvci5jcHAgXAogICAgIGNzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCBcCiAgICAgY3Nz
L0ZvbnRWYWx1ZS5jcHAgXAogICAgIGNzcy9JbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmNwcCBcCkBA
IC0zMTksNiArMzIwLDcgQEAgU09VUkNFUyArPSBcCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0LmNw
cCBcCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuY3BwIFwKICAgICBjc3MvTWVkaWFR
dWVyeU1hdGNoZXIuY3BwIFwKKyAgICBjc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIFwKICAgICBj
c3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCBcCiAgICAgY3NzL1JHQkNvbG9y
LmNwcCBcCiAgICAgY3NzL1J1bGVGZWF0dXJlLmNwcCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggYmE1
NmJjYjJlMTI1M2ViMTRiNWFjMDRhNzhhOWMyNzk5ODhmZmY0My4uZmI2MjE2ZWVmOTMxMjE3Y2Qw
NDEyYTViNDU3OTQzZjI2Mjg4OWMxNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMTU1Myw2ICsxNTUz
LDggQEAKICAgICAgICAgICAgICdjc3MvRGFzaGJvYXJkUmVnaW9uLmgnLAogICAgICAgICAgICAg
J2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCcsCiAgICAgICAgICAgICAnY3NzL0RvY3VtZW50UnVs
ZVNldHMuaCcsCisgICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCcsCisg
ICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgnLAogICAgICAgICAgICAgJ2Nz
cy9Gb250RmVhdHVyZVZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRGZWF0dXJlVmFs
dWUuaCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRWYWx1ZS5jcHAnLApAQCAtMTU3Niw2ICsxNTc4
LDggQEAKICAgICAgICAgICAgICdjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5oJywKICAgICAg
ICAgICAgICdjc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwJywKICAgICAgICAgICAgICdjc3MvTWVk
aWFRdWVyeU1hdGNoZXIuaCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNw
cCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgnLAogICAgICAgICAgICAg
J2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwJywKICAgICAgICAgICAgICdj
c3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmgnLAogICAgICAgICAgICAgJ2Nzcy9S
R0JDb2xvci5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCmluZGV4IDBmZWU0YmMwODYyZjJmZjFmNzNiNTZkMmY2MTY0MGU3ZTI3NTFj
ZGQuLjY0OGRlNTQ0OTNiOTI2MzYwODAxZmU0MGYyZWZlNTBhMDhmMWU1ZmQgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTY1Mjks
NiArNjUyOSwxMCBAQAogCQlGQkQ2QUY4QjE1RUYyNUU1MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFw
ZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJE
NkFGODYxNUVGMjFENDAwOEI3MTEwIC8qIENTU0Jhc2ljU2hhcGVzLmNwcCAqLzsgfTsKIAkJRkJE
NkFGOEMxNUVGMjYwNDAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkQ2QUY4MzE1RUYyMUEzMDA4QjcxMTAgLyog
QmFzaWNTaGFwZXMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQlGQkQ2QUY4RDE1RUYyNjBBMDA4QjcxMTAgLyogQmFzaWNTaGFwZXMuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODIxNUVGMjFB
MzAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmNwcCAqLzsgfTsKKwkJRkJEQjYxOUIxNkQ2MDMyQTAw
QkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MTlBMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVt
ZW50UnVsZUNvbGxlY3Rvci5jcHAgKi87IH07CisJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAv
KiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0
b3IuY3BwICovOyB9OworCQlGQkRCNjE5RjE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZCREI2MTlFMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oICovOyB9
OworCQlGQkRCNjFBMTE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MUEwMTZENjAz
N0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovOyB9OwogCQlGQkY4OTA0NTE2OUU5
RjFGMDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdSdWxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCRjg5MDQ0MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NH
cm91cGluZ1J1bGUuY3BwICovOyB9OwogCQlGQzU0RDA1NzE2QTc2NzMxMDA1NzVFNEQgLyogQ1NT
U3VwcG9ydHNSdWxlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGQzYzQkRCMTE2N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmggKi87IH07
CiAJCUZDNTREMDU4MTZBNzY3NkUwMDU3NUU0RCAvKiBKU0NTU1N1cHBvcnRzUnVsZS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkM4NDgwMkUxNjdBQjQ0
NDAwOENEMTAwIC8qIEpTQ1NTU3VwcG9ydHNSdWxlLmggKi87IH07CkBAIC0xNDI1Miw2ICsxNDI1
NiwxMCBAQAogCQlGQkQ2QUY4NTE1RUYyMUQ0MDA4QjcxMTAgLyogQmFzaWNTaGFwZUZ1bmN0aW9u
cy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBCYXNpY1NoYXBlRnVuY3Rpb25z
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRDZBRjg2MTVFRjIxRDQwMDhCNzEx
MCAvKiBDU1NCYXNpY1NoYXBlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBDU1NCYXNpY1NoYXBlcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZC
RDZBRjg3MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBDU1NCYXNpY1NoYXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQlGQkRCNjE5QTE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0
b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRWxlbWVudFJ1bGVD
b2xsZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQkRCNjE5QzE2RDYw
MzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gUGFnZVJ1bGVDb2xsZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xs
ZWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRWxlbWVudFJ1bGVDb2xs
ZWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxQTAxNkQ2MDM3RTAw
QkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFBhZ2VSdWxlQ29sbGVjdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUZCRjg5MDQ0MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NHcm91cGluZ1J1bGUuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTR3JvdXBpbmdSdWxlLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkM2M0JEQjAxNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1
cHBvcnRzUnVsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NT
dXBwb3J0c1J1bGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQzYzQkRCMTE2
N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IENTU1N1cHBvcnRzUnVsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwpAQCAtMjIwNTMsNiArMjIwNjEsOCBAQAogCQkJCUZDOUEwRjcxMTY0MDk0Q0YwMDNENkI4RCAv
KiBET01XaW5kb3dDU1MuY3BwICovLAogCQkJCUZDOUEwRjcyMTY0MDk0Q0YwMDNENkI4RCAvKiBE
T01XaW5kb3dDU1MuaCAqLywKIAkJCQlGQzlBMEY3MzE2NDA5NENGMDAzRDZCOEQgLyogRE9NV2lu
ZG93Q1NTLmlkbCAqLywKKwkJCQlGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1
bGVDb2xsZWN0b3IuaCAqLywKKwkJCQlGQkRCNjE5QTE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVu
dFJ1bGVDb2xsZWN0b3IuY3BwICovLAogCQkJCTRBNkU5RkMyMTNDMTdEMUQwMDQ2QTdGOCAvKiBG
b250RmVhdHVyZVZhbHVlLmggKi8sCiAJCQkJQTgwRTZDQzcwQTE5ODlDQTAwN0ZCOEM1IC8qIEZv
bnRWYWx1ZS5jcHAgKi8sCiAJCQkJQTgwRTZDQzMwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1
ZS5oICovLApAQCAtMjIwODgsNiArMjIwOTgsOCBAQAogCQkJCUQzQTk0QTM1MTIyREFCQUMwMEEz
N0JCQyAvKiBNZWRpYVF1ZXJ5TGlzdExpc3RlbmVyLmlkbCAqLywKIAkJCQlEM0FBMTBGMTEyM0E5
OEFBMDA5MjE1MkIgLyogTWVkaWFRdWVyeU1hdGNoZXIuY3BwICovLAogCQkJCUQzQUExMEYyMTIz
QTk4QUEwMDkyMTUyQiAvKiBNZWRpYVF1ZXJ5TWF0Y2hlci5oICovLAorCQkJCUZCREI2MUEwMTZE
NjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovLAorCQkJCUZCREI2MTlDMTZE
NjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgKi8sCiAJCQkJQTgwRTZDRDEw
QTE5ODlDQTAwN0ZCOEM1IC8qIFBhaXIuaCAqLywKIAkJCQkzMTg5RTZEQjE2QjIxMDM1MDAzODZF
QTMgLyogcGx1Z0lucy5jc3MgKi8sCiAJCQkJRTRCQkVEMEMxNEY0MDI1RDAwM0YwQjk4IC8qIFBy
b3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgKi8sCkBAIC0yNjYwMSw2ICsyNjYxMyw4
IEBACiAJCQkJOTc3RTJFMEYxMkYwRkM5QzAwQzEzMzc5IC8qIFhTU0F1ZGl0b3IuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTk3N0UyRTBGMTJGMEZDOUMwMEMxMzM4MCAvKiBYU1NBdWRpdG9yRGVsZWdh
dGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUZENTM3MzUzMTM3QjY1MTgwMDAwOERDRSAvKiBaZXJv
UG9sZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRkJEQjYxOUYxNkQ2MDM2NTAwQkIzMzk0IC8qIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQlGQkRCNjFBMTE2RDYwMzdF
MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjk3OTUs
NiArMjk4MDksOCBAQAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM3OSAvKiBYU1NBdWRpdG9y
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTk3N0UyRTBFMTJGMEZDOUMwMEMxMzM4MCAvKiBYU1NB
dWRpdG9yRGVsZWdhdGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJRkQ1MzczNTIxMzdCNjUxODAw
MDA4RENFIC8qIFplcm9Qb2xlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZCREI2MTlCMTZENjAz
MkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLywKKwkJ
CQlGQkRCNjE5RDE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9
IDA7CiAJCX07CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUuY3Bw
IGIvU291cmNlL1dlYkNvcmUvY3NzL0NTU0FsbEluT25lLmNwcAppbmRleCAwOWE1NDNiM2VlNjRm
ODI4MTRhMzc1YzhlNWU5ZjEwN2VlMTk4ZjZkLi4xNzdmODYxMDg0OTkzN2JiNDMzMWE5ZWVjYjFh
MDFhOTVlYTczOGMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9DU1NBbGxJbk9uZS5jcHAKQEAgLTcxLDcgKzcx
LDkgQEAKICNpbmNsdWRlICJDU1NWYWx1ZVBvb2wuY3BwIgogI2luY2x1ZGUgIkRPTVdpbmRvd0NT
Uy5jcHAiCiAjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5jcHAiCisjaW5jbHVkZSAiRWxlbWVu
dFJ1bGVDb2xsZWN0b3IuY3BwIgogI2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuY3Bw
IgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmNwcCIKICNpbmNsdWRlICJSdWxlRmVhdHVy
ZS5jcHAiCiAjaW5jbHVkZSAiUnVsZVNldC5jcHAiCiAjaW5jbHVkZSAiU2VsZWN0b3JGaWx0ZXIu
Y3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9y
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uYTNhNmUyMzhmNDY3MjQ2MGYzOTI5YmVlZTkyNmU2MmU3NjdjZDBhOQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKQEAg
LTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25v
bGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRmZWxkIEpl
bnNlbiAoa2RlQGNhcmV3b2xmLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBOaWNo
b2xhcyBTaGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAw
NSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxleGV5IFBy
b3NrdXJ5YWtvdiA8YXBAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBF
cmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5
IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNo
bW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24g
TGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEy
IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5oIgorCisjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiQ1NTUnVsZS5oIgorI2luY2x1ZGUgIkNTU1J1bGVMaXN0
LmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3Qu
aCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiSFRNTEVsZW1lbnQu
aCIKKyNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKKyNpbmNsdWRlICJTVkdFbGVtZW50LmgiCisj
aW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKKyNpbmNsdWRlICJTdHlsZWRF
bGVtZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIFN0eWxlUHJvcGVydHlT
ZXQqIGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwo
UmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCBsZWZ0VG9SaWdodERlY2wsIChTdHlsZVByb3BlcnR5
U2V0OjpjcmVhdGUoKSkpOworICAgIGlmIChsZWZ0VG9SaWdodERlY2wtPmlzRW1wdHkoKSkKKyAg
ICAgICAgbGVmdFRvUmlnaHREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwg
Q1NTVmFsdWVMdHIpOworICAgIHJldHVybiBsZWZ0VG9SaWdodERlY2wuZ2V0KCk7Cit9CisKK3N0
YXRpYyBTdHlsZVByb3BlcnR5U2V0KiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkKK3sKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgcmlnaHRUb0xlZnRE
ZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBpZiAocmlnaHRUb0xlZnRE
ZWNsLT5pc0VtcHR5KCkpCisgICAgICAgIHJpZ2h0VG9MZWZ0RGVjbC0+c2V0UHJvcGVydHkoQ1NT
UHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlUnRsKTsKKyAgICByZXR1cm4gcmlnaHRUb0xlZnRE
ZWNsLmdldCgpOworfQorCitTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCYgRWxlbWVudFJ1bGVD
b2xsZWN0b3I6Om1hdGNoZWRSZXN1bHQoKQoreworICAgIEFTU0VSVChtX21vZGUgPT0gU2VsZWN0
b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgcmV0dXJuIG1fcmVzdWx0OworfQorCitQ
YXNzUmVmUHRyPENTU1J1bGVMaXN0PiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1bGVM
aXN0KCkKK3sKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGlu
Z1J1bGVzKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2
b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSog
cnVsZSkKK3sKKyAgICBpZiAoIW1fbWF0Y2hlZFJ1bGVzKQorICAgICAgICBtX21hdGNoZWRSdWxl
cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4pOworICAgIG1fbWF0
Y2hlZFJ1bGVzLT5hcHBlbmQocnVsZSk7Cit9CisKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpjbGVhck1hdGNoZWRSdWxlcygpCit7CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykK
KyAgICAgICAgcmV0dXJuOworICAgIG1fbWF0Y2hlZFJ1bGVzLT5jbGVhcigpOworfQorCitpbmxp
bmUgU3RhdGljQ1NTUnVsZUxpc3QqIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjplbnN1cmVSdWxlTGlz
dCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0KQorICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGlj
Q1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOworfQor
CitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVy
dGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJs
ZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0KQorICAgICAgICByZXR1cm47CisgICAgbV9yZXN1
bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpOworICAgIGlmIChtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQorICAg
ICAgICBtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gbV9yZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlOworICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHByb3BlcnR5
U2V0KTsKKyAgICBpZiAoIWlzQ2FjaGVhYmxlKQorICAgICAgICBtX3Jlc3VsdC5pc0NhY2hlYWJs
ZSA9IGZhbHNlOworfQorCitjbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29wZSB7CitwdWJsaWM6Cisg
ICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKyAgICB+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsK
KworICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7CisKK3ByaXZhdGU6CisgICAg
c3RhdGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Cit9OworCitNYXRjaGluZ1VBUnVsZXNTY29w
ZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQoreworICAgIEFTU0VSVCghbV9tYXRjaGluZ1VBUnVs
ZXMpOworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKK30KKworTWF0Y2hpbmdVQVJ1bGVz
U2NvcGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMg
PSBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hp
bmdVQVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVsZXM7Cit9CisKK2Jvb2wg
TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7CisKK3ZvaWQg
RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVx
dWVzdCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkK
K3sKKyAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOworICAgIEFTU0VSVChtX3N0YXRl
LmVsZW1lbnQoKSk7CisKKyAgICBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCk7CisgICAgY29u
c3QgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKTsK
KyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHBzZXVkb0lkID0gZWxlbWVudC0+c2hhZG93UHNldWRv
SWQoKTsKKyAgICBpZiAoIXBzZXVkb0lkLmlzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlQoc3R5
bGVkRWxlbWVudCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBzZXVkb0lkLmltcGwoKSks
IG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoVklERU9fVFJB
Q0spCisgICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQorICAgICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmN1ZVBzZXVkb1J1bGVz
KCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyNlbmRpZgorICAgIC8vIENoZWNrIHdoZXRo
ZXIgb3RoZXIgdHlwZXMgb2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4gdGhlIGN1cnJlbnQgdHJl
ZSBzY29wZS4gQ3JpdGVyaWEgZm9yIHRoaXM6CisgICAgLy8gYSkgaXQncyBhIFVBIHJ1bGUKKyAg
ICAvLyBiKSB0aGUgdHJlZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVzCisgICAgLy8gYykgdGhl
IHJ1bGVzIGNvbWVzIGZyb20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0aGluIHRoZSBzYW1lIHRy
ZWUgc2NvcGUKKyAgICBUcmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1lbnQtPnRyZWVTY29wZSgp
OworICAgIGlmICghTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKKyAg
ICAgICAgJiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQorICAgICAgICAmJiAoIW1h
dGNoUmVxdWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRy
ZWVTY29wZSkKKyAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBT
ZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3MsIHRhZywg
YW5kIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAorICAgIC8vIHRoZW4gc29ydCB0
aGUgYnVmZmVyLgorICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQorICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmlkUnVsZXMoZWxlbWVudC0+
aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
CisgICAgaWYgKHN0eWxlZEVsZW1lbnQgJiYgc3R5bGVkRWxlbWVudC0+aGFzQ2xhc3MoKSkgewor
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMo
KS5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCht
YXRjaFJlcXVlc3QucnVsZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVz
KClbaV0uaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworICAgIGlm
IChlbGVtZW50LT5pc0xpbmsoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0
KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7CisgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6bWF0Y2hlc0ZvY3VzUHNl
dWRvQ2xhc3MoZWxlbWVudCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCht
YXRjaFJlcXVlc3QucnVsZVNldC0+Zm9jdXNQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1
ZXN0LnJ1bGVTZXQtPnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSksIG1hdGNo
UmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0
Y2hSZXF1ZXN0LnJ1bGVTZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2
ZXI6OlJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghbV9yZWdpb25Gb3JTdHlsaW5n
KQorICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hSZXF1ZXN0LnJ1
bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ1NTU2VsZWN0b3Iq
IHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVj
dG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZWdpb25Gb3JTdHls
aW5nLT5ub2RlKCkpKSkgeworICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMgPSBtYXRj
aFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxl
U2V0LmdldCgpOworICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKKyAgICAgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1
ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOwor
ICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0QW5k
VHJhbnNmZXJNYXRjaGVkUnVsZXMoKQoreworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAoIW1fbWF0Y2hlZFJ1bGVzIHx8IG1fbWF0Y2hl
ZFJ1bGVzLT5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNvcnRNYXRjaGVkUnVs
ZXMoKTsKKworICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0g
Km1fbWF0Y2hlZFJ1bGVzOworICAgIGlmIChtX21vZGUgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xs
ZWN0aW5nUnVsZXMpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRS
dWxlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCku
YXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBvZiBt
YXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgorICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAg
aWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0
cmlidXRlU2VsZWN0b3IoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgp
OworICAgICAgICBtX3Jlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhtYXRjaGVkUnVsZXNbaV0t
PnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1
bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxp
c3RUeXBlKCkpOworICAgIH0KK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hT
Y29wZWRBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShT
VFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIGlmICghbV9zY29wZVJlc29s
dmVyKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9yIHJ1bGVz
IGJ5IHRyYXZlcnNpbmcgdGhlIHNjb3BlZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0IGlmIGl0
IGdvdCBpbmNvbnNpc3RlbnQpLgorICAgIGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Njb3BlZFN0
eWxlcygpICYmIG1fc2NvcGVSZXNvbHZlci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeShtX3N0YXRl
LmVsZW1lbnQoKSkpIHsKKyAgICAgICAgYm9vbCBhcHBseUF1dGhvclN0eWxlcyA9IG1fc3RhdGUu
ZWxlbWVudCgpLT50cmVlU2NvcGUoKS0+YXBwbHlBdXRob3JTdHlsZXMoKTsKKyAgICAgICAgYm9v
bCBkb2N1bWVudFNjb3BlID0gdHJ1ZTsKKyAgICAgICAgdW5zaWduZWQgc2NvcGVTaXplID0gbV9z
Y29wZVJlc29sdmVyLT5zdGFja1NpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHNjb3BlU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBjbGVhck1hdGNoZWRSdWxlcygpOwor
ICAgICAgICAgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgICAgICAgICAgY29uc3QgU3R5bGVTY29w
ZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBmcmFtZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tGcmFt
ZUF0KGkpOworICAgICAgICAgICAgZG9jdW1lbnRTY29wZSA9IGRvY3VtZW50U2NvcGUgJiYgIWZy
YW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dUcmVlKCk7CisgICAgICAgICAgICBpZiAoZG9jdW1lbnRT
Y29wZSkgeworICAgICAgICAgICAgICAgIGlmICghYXBwbHlBdXRob3JTdHlsZXMpCisgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlci0+bWF0Y2hlc1N0eWxlQm91bmRzKGZyYW1lKSkKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QoZnJhbWUubV9ydWxlU2V0LCBpbmNsdWRlRW1wdHlS
dWxlcywgZnJhbWUubV9zY29wZSk7CisgICAgICAgICAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFu
Z2UgcnVsZVJhbmdlID0gbV9yZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgICAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAg
ICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxl
UmFuZ2UpOworICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBtYXRjaEhvc3RSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcyk7Cisj
ZWxzZQorICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKwor
dm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hIb3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcykKK3sKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBBU1NFUlQobV9zY29wZVJl
c29sdmVyKTsKKworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisgICAgbV9yZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsK
KworICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOworICAgIG1fc2NvcGVSZXNvbHZl
ci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxlcyk7CisgICAg
aWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAo
dW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAg
U3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJhbmdlcy5hdXRo
b3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0
KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVtZW50
KCkpLCBydWxlUmFuZ2UpOworICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMo
KTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgor
fQorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhvclJ1bGVzKGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpCit7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICBtX3Jlc3Vs
dC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXpl
KCkgLSAxOworCisgICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlcXVlc3QgbWF0
Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwor
ICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMu
YXV0aG9yUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBWZWN0b3I8TWF0
Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOworICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0
ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJl
cXVlc3RzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgp
OyArK2kpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdHNbaV0sIHJ1
bGVSYW5nZSk7CisjZW5kaWYKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKKwor
ICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoaW5jbHVkZUVtcHR5UnVsZXMpOworfQorCit2b2lk
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFVzZXJSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1
bGVzKQoreworICAgIGlmICghbV9ydWxlU2V0cy51c2VyU3R5bGUoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIAorICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBtX3Jlc3VsdC5yYW5nZXMu
bGFzdFVzZXJSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAg
ICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1
ZGVFbXB0eVJ1bGVzKTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
bV9yZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
cyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JS
ZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0
Y2hlZFJ1bGVzKCk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxl
cygpCit7CisgICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3
ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQorICAgICAgICBtX3Jlc3Vs
dC5pc0NhY2hlYWJsZSA9IGZhbHNlOworICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQg
PSBtX2lzUHJpbnRTdHlsZQorICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKKyAgICBt
YXRjaFVBUnVsZXModXNlckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWlya3MgbW9k
ZSwgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCisgICAg
aWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9j
dW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4g
eG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJj
ZSBzdHlsZSBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAg
ICAgIG1hdGNoVUFSdWxlcyhDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgp
KTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVQVJ1bGVzKFJ1bGVTZXQq
IHJ1bGVzKQoreworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisgICAgCisgICAgbV9yZXN1bHQu
cmFuZ2VzLmxhc3RVQVJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAx
OworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5n
ZXMuVUFSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3Qo
cnVsZXMpLCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7
Cit9CisKK2lubGluZSBib29sIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpydWxlTWF0Y2hlcyhjb25z
dCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9J
ZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVo
YXZpb3JBdEJvdW5kYXJ5KQoreworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0
ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9y
KCkpIHsKKyAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUg
YW55IHBzZXVkbyBlbGVtZW50cy4KKyAgICAgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9QU0VV
RE8pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIFdlIGtub3cgYSBzdWZm
aWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1
c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgorICAgICAgICAvLyBUaGlzIGlzIGxp
bWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFj
ZS4KKyAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1M
QmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsK
KyAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVsZURhdGEu
c2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNr
ZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdR
TmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFTZWxlY3Rv
ckNoZWNrZXI6OmZhc3RDaGVja1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKHN0YXRlLmVsZW1l
bnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgcmV0dXJuIFNlbGVjdG9yQ2hlY2tlcjo6ZmFzdENoZWNrKHJ1bGVEYXRhLnNlbGVj
dG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAgfQorCisgICAgLy8gU2xvdyBwYXRoLgorICAg
IFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9tb2RlKTsKKyAg
ICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURh
dGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRN
YXRjaEVuYWJsZWQpOworICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsK
KyAgICBjb250ZXh0LnNjb3BlID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1ZG9TdHlsZSA9IG1f
cHNldWRvU3R5bGU7CisgICAgY29udGV4dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0
Qm91bmRhcnk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hl
Y2tlci5tYXRjaChjb250ZXh0LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3Ry
YXRlZ3koKSk7CisgICAgaWYgKG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRj
aGVzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1fcHNldWRvU3R5bGUgIT0gTk9Q
U0VVRE8gJiYgbV9wc2V1ZG9TdHlsZSAhPSBkeW5hbWljUHNldWRvKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxl
cywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVS
YW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghcnVsZXMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgLy8g
SW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBl
bGVtZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KKyAgICAv
LyBBbmNlc3RvciBpZGVudGlmaWVyIGZpbHRlciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQg
Y2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBmYXN0IHBhdGguCisgICAgYm9vbCBjYW5Vc2VGYXN0
UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5w
YXJlbnROb2RlKCkpICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0
b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeTsKKworICAgIHVuc2lnbmVkIHNpemUgPSBy
dWxlcy0+c2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsK
KyAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0KGkpOworICAgICAg
ICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxl
Y3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFu
dFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKKyAgICAgICAgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCBtX2luc3BlY3RvckNTU09NV3JhcHBl
cnMsIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCkpOworICAgICAgICBQc2V1ZG9J
ZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxl
RGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVo
YXZpb3JBdEJvdW5kYXJ5KSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHBy
b3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4K
KyAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5w
cm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMt
PmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgeworICAgICAg
ICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwg
ZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1
bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgorICAgICAg
ICAgICAgaWYgKG1fc2FtZU9yaWdpbk9ubHkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJp
dHlPcmlnaW4oKSkgeworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1
bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCisgICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBt
YXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCisgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAh
PSBOT1BTRVVETyAmJiBtX3BzZXVkb1N0eWxlID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAg
ICAgaWYgKG1fbW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAg
ICAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShj
b29raWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJO
QUxfUFNFVURPSUQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1Bz
ZXVkb1N0eWxlKGR5bmFtaWNQc2V1ZG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAvLyBVcGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRj
aGVkIHJ1bGVzIGFycmF5LgorICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5k
ZXg7CisgICAgICAgICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkK
KyAgICAgICAgICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdl
Lmxhc3RSdWxlSW5kZXg7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91
ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCisgICAgICAgICAgICAgICAgYWRkTWF0Y2hlZFJ1bGUo
JnJ1bGVEYXRhKTsKKyAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZE1hdGNoUnVsZShjb29raWUsIHRydWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBi
b29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikK
K3sKKyAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKKyAgICB1
bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKKyAgICByZXR1cm4gKHNw
ZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRp
b24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsKK30KKwordm9pZCBFbGVtZW50UnVs
ZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcygpCit7CisgICAgQVNTRVJUKG1fbWF0Y2hlZFJ1
bGVzKTsKKyAgICBzdGQ6OnNvcnQobV9tYXRjaGVkUnVsZXMtPmJlZ2luKCksIG1fbWF0Y2hlZFJ1
bGVzLT5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rv
cjo6bWF0Y2hBbGxSdWxlcyhib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywgYm9vbCBpbmNs
dWRlU01JTFByb3BlcnRpZXMpCit7CisgICAgbWF0Y2hVQVJ1bGVzKCk7CisKKyAgICAvLyBOb3cg
d2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KKyAgICBpZiAobWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzKQorICAgICAgICBtYXRjaFVzZXJSdWxlcyhmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sg
YXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1
dGVzIG1hcHBlZCBmcm9tIEhUTUwuCisgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7
CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworCisgICAgICAgIC8vIE5vdyB3ZSBj
aGVjayBhZGRpdGlvbmFsIG1hcHBlZCBkZWNsYXJhdGlvbnMuCisgICAgICAgIC8vIFRhYmxlcyBh
bmQgdGFibGUgY2VsbHMgc2hhcmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3Qg
YmUgYXBwbGllZAorICAgICAgICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIg
bWFwcGVkIHN0eWxlIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVz
LgorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAg
aWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAg
ICAgIGJvb2wgaXNBdXRvOworICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9u
ID0gdG9IVE1MRWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5
SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlzQXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRvKQor
ICAgICAgICAgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHRleHREaXJlY3Rp
b24gPT0gTFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJh
dGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBDaGVjayB0aGUgcnVsZXMg
aW4gYXV0aG9yIHNoZWV0cyBuZXh0LgorICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMp
CisgICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoZmFsc2UpOworCisgICAgLy8gTm93IGNoZWNrIG91
ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgorICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmlubGluZVN0eWxlKCkpIHsKKyAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBh
cyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCisgICAgICAgIC8vIEZJWE1FOiBN
ZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNo
aW5nLgorICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5
LgorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsKKyAgICB9CisKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgIC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBz
dHlsZS4KKyAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMo
c3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0
ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2FjaGVhYmxlICovKTsKKyNlbHNl
CisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisjZW5kaWYKK30KKwor
Ym9vbCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxlcyhSdWxlU2V0KiBy
dWxlU2V0KQoreworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBtX21vZGUgPSBTZWxl
Y3RvckNoZWNrZXI6OlNoYXJpbmdSdWxlczsKKyAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwg
bGFzdFJ1bGVJbmRleCA9IC0xOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFu
Z2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1
bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKKworICAgIHJldHVybiBtX21h
dGNoZWRSdWxlcyAmJiAhbV9tYXRjaGVkUnVsZXMtPmlzRW1wdHkoKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxl
Q29sbGVjdG9yLmggYi9Tb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi40MDk1NWQyMWU3ZDkxYjI5MTZiOTJhNGY0YzA2YjNkMDkxNTFjOWFlCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgK
QEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAo
a25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwg
MjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoK
KyAqLworCisjaWZuZGVmIEVsZW1lbnRSdWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgRWxlbWVudFJ1
bGVDb2xsZWN0b3JfaAorCisjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgorI2luY2x1
ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNs
dWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIENTU1J1bGVMaXN0OworY2xhc3MgRG9jdW1lbnRSdWxlU2V0czsK
K2NsYXNzIFJlbmRlclJlZ2lvbjsKK2NsYXNzIFJ1bGVEYXRhOworY2xhc3MgUnVsZVNldDsKK2Ns
YXNzIFNlbGVjdG9yRmlsdGVyOworY2xhc3MgU3R5bGVTY29wZVJlc29sdmVyOworY2xhc3MgU3Rh
dGljQ1NTUnVsZUxpc3Q7CisKK2NsYXNzIEVsZW1lbnRSdWxlQ29sbGVjdG9yIHsKK3B1YmxpYzoK
KyAgICBFbGVtZW50UnVsZUNvbGxlY3RvcihTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBT
dHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAg
ICAgICAgLCBtX3J1bGVTZXRzKHN0eWxlUmVzb2x2ZXItPnJ1bGVTZXRzKCkpCisgICAgICAgICwg
bV9zZWxlY3RvckZpbHRlcihzdHlsZVJlc29sdmVyLT5zZWxlY3RvckZpbHRlcigpKQorICAgICAg
ICAsIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVycyhzdHlsZVJlc29sdmVyLT5pbnNwZWN0b3JDU1NP
TVdyYXBwZXJzKCkpCisgICAgICAgICwgbV9zY29wZVJlc29sdmVyKHN0eWxlUmVzb2x2ZXItPnNj
b3BlUmVzb2x2ZXIoKSkKKyAgICAgICAgLCBtX2lzUHJpbnRTdHlsZShmYWxzZSkKKyAgICAgICAg
LCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKKyAgICAgICAgLCBtX3BzZXVkb1N0eWxlKE5PUFNFVURP
KQorICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCisgICAgICAgICwgbV9tb2RlKFNl
bGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpIHsgfQorCisgICAgdm9pZCBtYXRjaEFsbFJ1
bGVzKGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzLCBib29sIGluY2x1ZGVTTUlMUHJvcGVy
dGllcyk7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcyhS
dWxlU2V0Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpOworICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Cisg
ICAgdm9pZCBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwor
ICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisKKyAgICB2
b2lkIHNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUpIHsgbV9tb2RlID0gbW9kZTsg
fQorICAgIHZvaWQgc2V0UHNldWRvU3R5bGUoUHNldWRvSWQgcHNldWRvU3R5bGUpIHsgbV9wc2V1
ZG9TdHlsZSA9IHBzZXVkb1N0eWxlOyB9CisgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29s
IGYpIHsgbV9zYW1lT3JpZ2luT25seSA9IGY7IH0gCisgICAgdm9pZCBzZXRSZWdpb25Gb3JTdHls
aW5nKFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykgeyBtX3JlZ2lvbkZvclN0eWxpbmcg
PSByZWdpb25Gb3JTdHlsaW5nOyB9CisgICAgdm9pZCBzZXRNZWRpdW0oY29uc3QgTWVkaWFRdWVy
eUV2YWx1YXRvciogbWVkaXVtKSB7IG1faXNQcmludFN0eWxlID0gbWVkaXVtLT5tZWRpYVR5cGVN
YXRjaFNwZWNpZmljKCJwcmludCIpOyB9CisKKyAgICBib29sIGhhc0FueU1hdGNoaW5nUnVsZXMo
UnVsZVNldCopOworCisgICAgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQmIG1hdGNoZWRSZXN1
bHQoKTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBtYXRjaGVkUnVsZUxpc3QoKTsKKwor
cHJpdmF0ZToKKyAgICBEb2N1bWVudCogZG9jdW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmRvY3Vt
ZW50KCk7IH0KKyAgICB2b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoY29uc3QgU3R5bGVQ
cm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKKworICAgIHZvaWQgY29sbGVj
dE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJh
bmdlJik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRj
aFJlcXVlc3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RN
YXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hS
ZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7CisgICAgYm9vbCBydWxlTWF0Y2hl
cyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYs
IFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpE
b2VzTm90Q3Jvc3NCb3VuZGFyeSk7CisKKyAgICB2b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKKyAg
ICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcygpOworCisgICAgdm9pZCBhZGRNYXRj
aGVkUnVsZShjb25zdCBSdWxlRGF0YSopOworICAgIHZvaWQgY2xlYXJNYXRjaGVkUnVsZXMoKTsK
KworICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICAKK3By
aXZhdGU6CisgICAgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9j
dW1lbnRSdWxlU2V0cyYgbV9ydWxlU2V0czsKKyAgICBTZWxlY3RvckZpbHRlciYgbV9zZWxlY3Rv
ckZpbHRlcjsKKyAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBtX2luc3BlY3RvckNTU09NV3Jh
cHBlcnM7CisgICAgU3R5bGVTY29wZVJlc29sdmVyKiBtX3Njb3BlUmVzb2x2ZXI7CisKKyAgICBi
b29sIG1faXNQcmludFN0eWxlOworICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5n
OworICAgIFBzZXVkb0lkIG1fcHNldWRvU3R5bGU7CisgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5
OworICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7CisKKyAgICBPd25QdHI8VmVjdG9y
PGNvbnN0IFJ1bGVEYXRhKiwgMzI+ID4gbV9tYXRjaGVkUnVsZXM7CisKKyAgICAvLyBPdXRwdXQu
CisgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OworICAgIFN0eWxlUmVz
b2x2ZXI6Ok1hdGNoUmVzdWx0IG1fcmVzdWx0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gRWxlbWVudFJ1bGVDb2xsZWN0b3JfaApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9Q
YWdlUnVsZUNvbGxlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTg1NDI2OWIxYzBiNDIzYWMyMWFhNzQ1
YjU5MzY2ZDM0NWRjZmY0MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9Q
YWdlUnVsZUNvbGxlY3Rvci5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAw
NC0yMDA1IEFsbGFuIFNhbmRmZWxkIEplbnNlbiAoa2RlQGNhcmV3b2xmLmNvbSkKKyAqIENvcHly
aWdodCAoQykgMjAwNiwgMjAwNyBOaWNob2xhcyBTaGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNv
bSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwg
MjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAd2Via2l0Lm9yZz4KKyAqIENv
cHlyaWdodCAoQykgMjAwNywgMjAwOCBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICog
Q29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKGMpIDIw
MTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYWdlUnVsZUNvbGxlY3Rvci5oIgorCisj
aW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdl
UnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQor
eworICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3Rv
cigpLT5zcGVjaWZpY2l0eSgpOworfQorCitib29sIFBhZ2VSdWxlQ29sbGVjdG9yOjppc0xlZnRQ
YWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Cit7CisgICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBm
YWxzZTsKKyAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkpCisgICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7CisKKyAgICByZXR1
cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKK30KKworYm9v
bCBQYWdlUnVsZUNvbGxlY3Rvcjo6aXNGaXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKK3sK
KyAgICAvLyBGSVhNRTogSW4gY2FzZSBvZiBmb3JjZWQgbGVmdC9yaWdodCBwYWdlLCBwYWdlIGF0
IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUgdGhlIGZpcnN0IHBhZ2UuCisgICAgcmV0dXJuICghcGFn
ZUluZGV4KTsKK30KKworU3RyaW5nIFBhZ2VSdWxlQ29sbGVjdG9yOjpwYWdlTmFtZShpbnQgLyog
cGFnZUluZGV4ICovKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRl
eCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAgICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgUGFnZVJ1
bGVDb2xsZWN0b3I6Om1hdGNoQWxsUGFnZVJ1bGVzKGludCBwYWdlSW5kZXgpCit7CisgICAgY29u
c3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgYm9vbCBp
c0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBTdHJpbmcgcGFnZSA9
IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CisgICAgCisgICAgbWF0Y2hQYWdlUnVsZXMoQ1NTRGVmYXVs
dFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsK
KyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmly
c3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNl
dCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VS
dWxlcyhtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Cit9
CisKK3ZvaWQgUGFnZVJ1bGVDb2xsZWN0b3I6Om1hdGNoUGFnZVJ1bGVzKFJ1bGVTZXQqIHJ1bGVz
LCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5h
bWUpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPFN0
eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlz
dChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmly
c3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMu
YmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7CisKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykK
KyAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hlZFBhZ2VSdWxlc1tp
XS0+cHJvcGVydGllcygpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0b3JDb21w
b25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdlLCBib29s
IGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZvciAoY29uc3Qg
Q1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVjdG9yOyBjb21wb25lbnQ7IGNvbXBvbmVudCA9
IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7CisgICAgICAgIGlmIChjb21wb25lbnQtPm1fbWF0
Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgeworICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FOYW1lKCkubG9jYWxOYW1lKCk7CisgICAgICAg
ICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIGxvY2FsTmFtZSAhPSBwYWdlTmFtZSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBDU1NT
ZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7
CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2Ug
JiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rv
cjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRv
VHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQYWdlUnVs
ZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVj
dG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0
UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9
IHJ1bGVzW2ldOworCisgICAgICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1
bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVy
dGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCisgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVy
dHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmICghcHJv
cGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMu
CisgICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7CisgICAgfQorfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVD
b2xsZWN0b3IuaCBiL1NvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjhmNWMyOWE3ZDVlZjkzN2UxMDQ3MWM5ODU2NzZmMjE2MzEzMTkxOGUKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaApAQCAtMCww
ICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIw
MDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKwor
I2lmbmRlZiBQYWdlUnVsZUNvbGxlY3Rvcl9oCisjZGVmaW5lIFBhZ2VSdWxlQ29sbGVjdG9yX2gK
KworI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJTdHlsZVJlc29sdmVy
LmgiCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBTdHlsZVJ1bGVQYWdlOworCitjbGFzcyBQYWdl
UnVsZUNvbGxlY3RvciB7CitwdWJsaWM6CisgICAgUGFnZVJ1bGVDb2xsZWN0b3IoU3R5bGVSZXNv
bHZlcjo6U3RhdGUmIHN0YXRlLCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cykKKyAgICAgICAg
OiBtX3N0YXRlKHN0YXRlKQorICAgICAgICAsIG1fcnVsZVNldHMocnVsZVNldHMpIHsgfQorCisg
ICAgdm9pZCBtYXRjaEFsbFBhZ2VSdWxlcyhpbnQgcGFnZUluZGV4KTsKKyAgICBTdHlsZVJlc29s
dmVyOjpNYXRjaFJlc3VsdCYgbWF0Y2hlZFJlc3VsdCgpIHsgcmV0dXJuIG1fcmVzdWx0OyB9CisK
K3ByaXZhdGU6CisgICAgYm9vbCBpc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OworICAg
IGJvb2wgaXNSaWdodFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QgeyByZXR1cm4gIWlzTGVmdFBh
Z2UocGFnZUluZGV4KTsgfQorICAgIGJvb2wgaXNGaXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29u
c3Q7CisgICAgU3RyaW5nIHBhZ2VOYW1lKGludCBwYWdlSW5kZXgpIGNvbnN0OworCisgICAgdm9p
ZCBtYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlz
Rmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKyAgICB2b2lkIG1hdGNoUGFnZVJ1
bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZl
Y3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJz
dFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworCisgICAgY29uc3QgU3R5bGVSZXNvbHZl
cjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9jdW1lbnRSdWxlU2V0cyYgbV9ydWxlU2V0czsKKwor
ICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0IG1fcmVzdWx0OworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUGFnZVJ1bGVDb2xsZWN0b3JfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwIGIvU291cmNlL1dlYkNvcmUv
Y3NzL1N0eWxlUmVzb2x2ZXIuY3BwCmluZGV4IGYyMjJiYjFlMzczNzM2OTRlOGMzOTFiYjA5YzY2
ZTdkZjFjNTQyZDYuLjllZDRkYzAwNzcyYmYwMzlmMTk1MzZiNzJiNTc3ZjQwZDg2MTRmNzIgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNs
dWRlICJDb3VudGVyQ29udGVudC5oIgogI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKICNpbmNsdWRl
ICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaCIKICNpbmNsdWRlICJFbGVtZW50U2hhZG93LmgiCiAjaW5jbHVkZSAiRm9udEZl
YXR1cmVWYWx1ZS5oIgogI2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgpAQCAtODcsNiArODgsNyBAQAog
I2luY2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgogI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250
ZXh0LmgiCiAjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmgi
CiAjaW5jbHVkZSAiUGFpci5oIgogI2luY2x1ZGUgIlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0
aW9uLmgiCiAjaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgpAQCAtMjA4LDI5ICsyMTAsNiBAQCBpZiAo
aXNJbml0aWFsKSB7IFwKIAogUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZ
ZXRBdmFpbGFibGU7CiAKLXN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xh
cmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5
U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAg
ICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCi0gICAgICAgIGxlZnRUb1JpZ2h0RGVj
bC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlTHRyKTsKLSAgICBy
ZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwotfQotCi1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNl
dCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChS
ZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlT
ZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQotICAg
ICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBD
U1NWYWx1ZVJ0bCk7Ci0gICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQoKTsKLX0KLQotaW5s
aW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVsZUxp
c3QoKQotewotICAgIGlmICghbV9ydWxlTGlzdCkKLSAgICAgICAgbV9ydWxlTGlzdCA9IFN0YXRp
Y0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKLSAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsKLX0K
LQogaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFja2dy
b3VuZCgpCiB7CiAgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJhbmNl
KCk7CkBAIC0yNDgsOCArMjI3LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmNsZWFyKCkKICAgICBtX3BhcmVudFN0eWxlID0gMDsKICAgICBtX3BhcmVudE5vZGUgPSAwOwog
ICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0gICAgbV9t
YXRjaGVkUnVsZXMuY2xlYXIoKTsKICAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIo
KTsKICNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCiAgICAgbV9oYXNQZW5kaW5nU2hhZGVycyA9IGZh
bHNlOwpAQCAtMjU5LDYgKzIzNiwxNiBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0
ZTo6Y2xlYXIoKQogI2VuZGlmCiB9CiAKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6
OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMs
IFN0eWxlUnVsZSogcnVsZSwgdW5zaWduZWQgbGlua01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxp
c3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAgICBtYXRjaGVkUHJvcGVydGllcy5n
cm93KG1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0aWVzID0gbWF0Y2hlZFByb3BlcnRpZXMubGFzdCgp
OworICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0
eVNldCo+KHByb3BlcnRpZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNoVHlwZSA9IGxp
bmtNYXRjaFR5cGU7CisgICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0gcHJvcGVydHlX
aGl0ZWxpc3RUeXBlOworICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Cit9CisKIFN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcykKICAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9u
c1NpbmNlTGFzdFN3ZWVwKDApCiAgICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRp
bWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCkBA
IC00MDEsMTgxICszODgsNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCiAgICAgbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOwogfQogCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBs
aW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBl
KQotewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1bHQu
bWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXMmIG5l
d1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7Ci0gICAg
bmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4o
cHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNo
VHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlz
dFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKLX0KLQot
aW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRj
aFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9v
bCBpc0NhY2hlYWJsZSkKLXsKLSAgICBpZiAoIXByb3BlcnR5U2V0KQotICAgICAgICByZXR1cm47
Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0x
KQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0
eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hlYWJsZSkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxl
ID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsKLXB1YmxpYzoKLSAg
ICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotICAgIH5NYXRjaGluZ1VBUnVsZXNTY29wZSgpOwot
Ci0gICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKLQotcHJpdmF0ZToKLSAgICBz
dGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKLX07Ci0KLU1hdGNoaW5nVUFSdWxlc1Njb3Bl
OjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgQVNTRVJUKCFtX21hdGNoaW5nVUFSdWxl
cyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwotfQotCi1NYXRjaGluZ1VBUnVsZXNT
Y29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9
IGZhbHNlOwotfQotCi1pbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGlu
Z1VBUnVsZXMoKQotewotICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsKLX0KLQotYm9vbCBN
YXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKLQotdm9pZCBT
dHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhTdGF0ZSYgc3RhdGUsIGNvbnN0IE1h
dGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBB
U1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOwotICAgIEFTU0VSVChzdGF0ZS5lbGVtZW50KCkp
OwotCi0gICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKTsKLSAgICBjb25zdCBT
dHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpOwotICAg
IGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgp
OwotICAgIGlmICghcHNldWRvSWQuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChzdHlsZWRF
bGVtZW50KTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRj
aFJlcXVlc3QucnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBzZXVkb0lkLmltcGwo
KSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoVklERU9f
VFJBQ0spCi0gICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQotICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qoc3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jdWVQ
c2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0jZW5kaWYKLSAgICAvLyBD
aGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBsaWNhYmxlIGluIHRoZSBj
dXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgotICAgIC8vIGEpIGl0J3MgYSBV
QSBydWxlCi0gICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1dGhvciBydWxlcwotICAg
IC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxlIHNoZWV0IHdpdGhpbiB0
aGUgc2FtZSB0cmVlIHNjb3BlCi0gICAgVHJlZVNjb3BlKiB0cmVlU2NvcGUgPSBlbGVtZW50LT50
cmVlU2NvcGUoKTsKLSAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFS
dWxlcygpCi0gICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkKLSAgICAg
ICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50cmVlU2Nv
cGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91
bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNs
YXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKLSAgICAvLyB0
aGVuIHNvcnQgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSkKLSAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRjaFJlcXVlc3QucnVsZVNldC0+
aWRSdWxlcyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSksIG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKLSAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBzdHlsZWRFbGVtZW50
LT5oYXNDbGFzcygpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3R5bGVkRWxl
bWVudC0+Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQotICAgICAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRjaFJlcXVlc3QucnVsZVNldC0+Y2xhc3NSdWxlcyhz
dHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKClbaV0uaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxl
UmFuZ2UpOwotICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSkKLSAgICAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KHN0YXRlLCBtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlu
a1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChT
ZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQotICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qoc3RhdGUsIG1hdGNoUmVxdWVzdC5ydWxlU2V0
LT5mb2N1c1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChzdGF0ZSwgbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQt
PnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qoc3RhdGUsIG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24o
U3RhdGUmIHN0YXRlLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdl
JiBydWxlUmFuZ2UpCi17Ci0gICAgaWYgKCFzdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+
bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25zdCBDU1NTZWxlY3RvciogcmVnaW9u
U2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxl
U2V0cy5hdChpKS5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IocmVn
aW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihzdGF0ZS5yZWdpb25Gb3JTdHlsaW5n
KCktPm5vZGUoKSkpKSB7Ci0gICAgICAgICAgICBSdWxlU2V0KiByZWdpb25SdWxlcyA9IG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVT
ZXQuZ2V0KCk7Ci0gICAgICAgICAgICBBU1NFUlQocmVnaW9uUnVsZXMpOwotICAgICAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0
Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFu
Z2UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRBbmRU
cmFuc2Zlck1hdGNoZWRSdWxlcyhTdGF0ZSYgc3RhdGUsIE1hdGNoUmVzdWx0JiByZXN1bHQpCi17
Ci0gICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSBzdGF0ZS5t
YXRjaGVkUnVsZXMoKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgc29ydE1hdGNoZWRSdWxlcyhzdGF0ZSk7Ci0KLSAgICBpZiAoc3RhdGUu
bW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kpCi0gICAgICAg
ICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRjaGVkUnVsZXNb
aV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgLy8gTm93IHRyYW5zZmVyIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBvdmVyIHRv
IG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpICYm
IG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0g
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAgICAgYWRkTWF0Y2hl
ZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGllcygp
LCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hUeXBl
KCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOwotICAgIH0KLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKFN0YXRlJiBzdGF0
ZSwgTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSNpZiBF
TkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBpZiAoIW1fc2Nv
cGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2ggc2NvcGVkIGF1dGhv
ciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAocmVidWlsZCBp
dCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyLT5oYXNT
Y29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29uc2lzdGVuY3ko
c3RhdGUuZWxlbWVudCgpKSkgewotICAgICAgICBib29sIGFwcGx5QXV0aG9yU3R5bGVzID0gc3Rh
dGUuZWxlbWVudCgpLT50cmVlU2NvcGUoKS0+YXBwbHlBdXRob3JTdHlsZXMoKTsKLSAgICAgICAg
Ym9vbCBkb2N1bWVudFNjb3BlID0gdHJ1ZTsKLSAgICAgICAgdW5zaWduZWQgc2NvcGVTaXplID0g
bV9zY29wZVJlc29sdmVyLT5zdGFja1NpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHNjb3BlU2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBzdGF0ZS5tYXRjaGVkUnVsZXMo
KS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0gICAgICAgICAgICBjb25zdCBT
dHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5z
dGFja0ZyYW1lQXQoaSk7Ci0gICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29w
ZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgICAgIGlmIChk
b2N1bWVudFNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykK
LSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJh
bWUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1
ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAgICAgIFJ1bGVSYW5nZSBydWxl
UmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICAg
ICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKHN0YXRlLCBtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7Ci0gICAgICAgICAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoc3Rh
dGUsIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXRjaEhvc3RSdWxlcyhzdGF0
ZSwgcmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShz
dGF0ZSk7Ci0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1
ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCiBpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpz
dHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKFN0YXRlJiBzdGF0ZSkKIHsKICNp
ZiBFTkFCTEUoU0hBRE9XX0RPTSkKQEAgLTU4NiwxOTcgKzM5OCw2IEBAIGlubGluZSBib29sIFN0
eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoU3RhdGUm
IHN0YXRlKQogI2VuZGlmCiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hIb3N0UnVsZXMo
U3RhdGUmIHN0YXRlLCBNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVz
KQotewotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2ZXIp
OwotCi0gICAgc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0K
LSAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNoZWRSdWxlczsKLSAgICBtX3Njb3BlUmVzb2x2ZXIt
Pm1hdGNoSG9zdFJ1bGVzKHN0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKLSAgICBpZiAo
bWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAgICBSdWxl
UmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICAg
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoc3RhdGUsIE1hdGNoUmVxdWVzdChtYXRjaGVkUnVsZXMu
YXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIHN0YXRlLmVsZW1lbnQoKSksIHJ1bGVSYW5nZSk7
Ci0gICAgfQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhzdGF0ZSwgcmVzdWx0KTsK
LSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHN0YXRlKTsKLSAgICBVTlVTRURfUEFSQU0ocmVzdWx0
KTsKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOwotI2VuZGlmCi19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBdXRob3JSdWxlcyhTdGF0ZSYgc3RhdGUsIE1hdGNoUmVz
dWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17Ci0gICAgc3RhdGUubWF0Y2hl
ZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICBpZiAoIXN0YXRlLmVsZW1l
bnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxl
cy4KLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUo
KSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQu
cmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKHN0YXRl
LCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JS
ZWdpb24oc3RhdGUsIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSNpZiBFTkFCTEUoU0hBRE9X
X0RPTSkKLSAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOwotICAgIG1fcnVs
ZVNldHMuc2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1
ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG1hdGNoUmVxdWVzdHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
KHN0YXRlLCBtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOwotI2VuZGlmCi0KLSAgICBzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoc3RhdGUsIHJlc3VsdCk7Ci0KLSAgICBtYXRjaFNjb3Bl
ZEF1dGhvclJ1bGVzKHN0YXRlLCByZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjptYXRjaFVzZXJSdWxlcyhTdGF0ZSYgc3RhdGUsIE1hdGNoUmVzdWx0
JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17Ci0gICAgaWYgKCFtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgc3RhdGUubWF0Y2hlZFJ1
bGVzKCkuY2xlYXIoKTsKLQotICAgIHJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlID0gcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVx
dWVzdChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgUnVs
ZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKHN0YXRlLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oc3RhdGUsIG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhzdGF0ZSwgcmVzdWx0KTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoU3RhdGUmIHN0YXRlLCBNYXRj
aFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKLXsKLSAgICBzdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOwotICAgIAotICAgIHJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSA9IHJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2Ug
PSByZXN1bHQucmFuZ2VzLlVBUnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMo
c3RhdGUsIE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7Ci0KLSAgICBzb3J0QW5kVHJh
bnNmZXJNYXRjaGVkUnVsZXMoc3RhdGUsIHJlc3VsdCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KFN0YXRlJiBzdGF0ZSwgY29uc3QgVmVjdG9y
PFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxl
UmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBpZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47Ci0K
LSAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3Ig
cmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZl
LgotICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUg
aW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBib29sIGNh
blVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50
KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9
PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OwotCi0gICAgdW5zaWduZWQg
c2l6ZSA9IHJ1bGVzLT5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7
ICsraSkgewotICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7
Ci0gICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJl
amVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5k
ZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOwotICAgICAg
ICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOwotICAgICAg
ICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChydWxlTWF0
Y2hlcyhzdGF0ZSwgcnVsZURhdGEsIG1hdGNoUmVxdWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywg
bWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSkpIHsKLSAgICAgICAgICAgIC8vIElmIHRo
ZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdCBpbiB0aGUg
bm9uLWRlYnVnIG1vZGUuCi0gICAgICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVz
IHx8IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlS
dWxlcykpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1h
dGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5kYXJk
IGdldE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGlz
IG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYgIXJ1
bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgewotICAgICAgICAgICAgICAgIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYg
d2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCi0gICAgICAg
ICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCi0gICAgICAg
ICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZSgp
ID09IE5PUFNFVURPKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBTZWxl
Y3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQpCi0gICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5bmFtaWNQc2V1
ZG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgb3Vy
IGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFycmF5LgotICAg
ICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7Ci0gICAgICAgICAgICAgICAg
aWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAg
cnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVs
ZXMuCi0gICAgICAgICAgICAgICAgc3RhdGUuYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKLSAg
ICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29r
aWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNv
b2tpZSwgZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxl
cyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikKLXsKLSAgICB1bnNpZ25l
ZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKLSAgICB1bnNpZ25lZCBzcGVjaWZp
Y2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKLSAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBz
cGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmlj
aXR5MSA8IHNwZWNpZmljaXR5MjsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0Y2hl
ZFJ1bGVzKFN0YXRlJiBzdGF0ZSkKLXsKLSAgICBzdGQ6OnNvcnQoc3RhdGUubWF0Y2hlZFJ1bGVz
KCkuYmVnaW4oKSwgc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVSdWxlcyk7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhTdGF0ZSYgc3RhdGUsIE1hdGNo
UmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQotewotICAgIG1hdGNo
VUFSdWxlcyhzdGF0ZSwgcmVzdWx0KTsKLQotICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0
IHJ1bGVzLgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0
Y2hVc2VyUnVsZXMoc3RhdGUsIHJlc3VsdCwgZmFsc2UpOwotCi0gICAgLy8gTm93IGNoZWNrIGF1
dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGggcHJlc2VudGF0aW9uYWwgYXR0cmlidXRl
cyBtYXBwZWQgZnJvbSBIVE1MLgotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKLSAg
ICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7Ci0KLSAgICAgICAgLy8gTm93IHdl
IGNoZWNrIGFkZGl0aW9uYWwgbWFwcGVkIGRlY2xhcmF0aW9ucy4KLSAgICAgICAgLy8gVGFibGVz
IGFuZCB0YWJsZSBjZWxscyBzaGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVz
dCBiZSBhcHBsaWVkCi0gICAgICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVp
ciBtYXBwZWQgc3R5bGUgZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0
ZXMuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKLQot
ICAgICAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAg
ICAgICAgICAgIGJvb2wgaXNBdXRvOwotICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGly
ZWN0aW9uID0gdG9IVE1MRWxlbWVudChzdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25h
bGl0eUlmaGFzRGlyQXV0b0F0dHJpYnV0ZShpc0F1dG8pOwotICAgICAgICAgICAgaWYgKGlzQXV0
bykKLSAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJl
Y3Rpb24gPT0gTFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNs
YXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBDaGVjayB0aGUgcnVs
ZXMgaW4gYXV0aG9yIHNoZWV0cyBuZXh0LgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0
eWxlcykKLSAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhzdGF0ZSwgcmVzdWx0LCBmYWxzZSk7Ci0K
LSAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBzdHlsZSBhdHRyaWJ1dGUuCi0gICAgaWYgKG1f
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIHN0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBzdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsKLSAgICAgICAgLy8gSW5saW5lIHN0
eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCi0g
ICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUg
cHJvYmxlbXMgd2l0aCBjYWNoaW5nLgotICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFi
bGUgPSAhc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAm
JiAhc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgpOwotICAgICAgICAvLyBG
SVhNRTogQ29uc3RpZnkuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0
LCBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNo
ZWFibGUpOwotICAgIH0KLQotI2lmIEVOQUJMRShTVkcpCi0gICAgLy8gTm93IGNoZWNrIFNNSUwg
YW5pbWF0aW9uIG92ZXJyaWRlIHN0eWxlLgotICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMg
JiYgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgc3RhdGUuc3R5bGVkRWxlbWVudCgpICYm
IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCi0gICAgICAgIGFkZEVsZW1l
bnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oc3RhdGUu
c3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8q
IGlzQ2FjaGVhYmxlICovKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJv
cGVydGllcyk7Ci0jZW5kaWYKLX0KLQogYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZm
ZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0CiB7
CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsK
QEAgLTgwMiw5ICs0MjMsOCBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjppbml0RWxlbWVu
dChTdGF0ZSYgc3RhdGUsIEVsZW1lbnQqIGUpCiAgICAgfQogfQogCi1pbmxpbmUgdm9pZCBTdHls
ZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1lbnQs
IEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgUHNldWRvSWQgcHNldWRvSWQs
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVu
dCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0
eWxpbmcpCiB7Ci0gICAgbV9wc2V1ZG9TdHlsZSA9IHBzZXVkb0lkOwogICAgIG1fcmVnaW9uRm9y
U3R5bGluZyA9IHJlZ2lvbkZvclN0eWxpbmc7CiAKICAgICBpZiAoZSkgewpAQCAtODI2LDcgKzQ0
Niw2IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNv
bHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVuCiAKICAgICBtX3N0eWxlID0gMDsKICAgICBt
X3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKLSAgICBtX3J1bGVMaXN0ID0gMDsKICAg
ICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwogfQogCkBAIC04OTMsMTEgKzUxMiw4IEBAIGJvb2wgU3R5
bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQoRWxlbWVudCog
ZSwgUnVsZVNldCogcnVsCiAKICAgICBTdGF0ZSBzdGF0ZShkb2N1bWVudCgpKTsKICAgICBzdGF0
ZS5pbml0RWxlbWVudChlKTsKLSAgICBzdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hh
cmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9
IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5k
ZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKHN0YXRlLCBNYXRjaFJlcXVlc3QocnVsZVNl
dCksIHJ1bGVSYW5nZSk7Ci0gICAgcmV0dXJuICFzdGF0ZS5tYXRjaGVkUnVsZXMoKS5pc0VtcHR5
KCk7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIHN0YXRlKTsKKyAg
ICByZXR1cm4gY29sbGVjdG9yLmhhc0FueU1hdGNoaW5nUnVsZXMocnVsZVNldCk7CiB9CiAKIGJv
b2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKGNvbnN0IFN0YXRlJiBz
dGF0ZSwgU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKQEAgLTExNjEsMjYgKzc3Nyw2IEBA
IFJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWRTdHlsZShTdGF0ZSYgc3Rh
dGUpCiAgICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoU3RhdGUmIHN0YXRlLCBNYXRjaFJlc3VsdCYgcmVz
dWx0KQotewotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNjb3BlOwotCi0gICAgLy8gRmlyc3Qg
d2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVTaGVldCkKLSAgICAgICAgcmVzdWx0
LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci0gICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9
IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpCi0gICAgICAgID8gQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNo
ZWV0czo6ZGVmYXVsdFN0eWxlOwotICAgIG1hdGNoVUFSdWxlcyhzdGF0ZSwgcmVzdWx0LCB1c2Vy
QWdlbnRTdHlsZVNoZWV0KTsKLQotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxl
cyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+
aW5RdWlya3NNb2RlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhzdGF0ZSwgcmVzdWx0LCBDU1NE
ZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7Ci0KLSAgICAvLyBJZiBkb2N1
bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBpbiB4
bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291cmNl
IHN0eWxlIHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKLSAgICAg
ICAgbWF0Y2hVQVJ1bGVzKHN0YXRlLCByZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmll
d1NvdXJjZVN0eWxlKCkpOwotfQotCiBzdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9u
TW9kZShQYWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHlsZSogc3R5bGUp
CiB7CiAgICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKQpA
QCAtMTM3OCw3ICs5NzQsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpzdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVyUwogCiAgICAgU3RhdGUg
c3RhdGUoZG9jdW1lbnQoKSk7CiAgICAgaW5pdEVsZW1lbnQoc3RhdGUsIGVsZW1lbnQpOwotICAg
IHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBh
cmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOworICAgIHN0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgcmVnaW9uRm9yU3R5
bGluZyk7CiAgICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAh
c3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKICAgICAgICAgUmVuZGVyU3R5
bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoc3RhdGUpOwogICAgICAgICBpZiAo
c2hhcmVkU3R5bGUpCkBAIC0xNDIzLDEzICsxMDE5LDE2IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5
bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCBSZW5k
ZXJTCiAgICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKICAgICAgICAgbV9ydWxlU2V0cy5jb2xsZWN0
RmVhdHVyZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZlci5nZXQo
KSk7CiAKLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAgICBFbGVtZW50UnVsZUNvbGxl
Y3RvciBjb2xsZWN0b3IodGhpcywgc3RhdGUpOworICAgIGNvbGxlY3Rvci5zZXRSZWdpb25Gb3JT
dHlsaW5nKHJlZ2lvbkZvclN0eWxpbmcpOworICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0obV9tZWRp
dW0uZ2V0KCkpOworCiAgICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFn
ZW50UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhzdGF0ZSwgbWF0Y2hSZXN1bHQpOworICAg
ICAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAgICAgZWxzZQotICAgICAgICBtYXRjaEFs
bFJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRjaEFsbFJ1
bGVzRXhjbHVkaW5nU01JTCk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaEFsbFJ1bGVzKG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzLCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNF
eGNsdWRpbmdTTUlMKTsKIAotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoc3RhdGUsIG1hdGNo
UmVzdWx0LCBlbGVtZW50KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKHN0YXRlLCBjb2xs
ZWN0b3IubWF0Y2hlZFJlc3VsdCgpLCBlbGVtZW50KTsKIAogICAgIC8vIENsZWFuIHVwIG91ciBz
dHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBm
aXh1cHMpLgogICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLCBzdHlsZS5nZXQoKSwgc3RhdGUu
cGFyZW50U3R5bGUoKSwgZWxlbWVudCk7CkBAIC0xNDQ0LDcgKzEwNDMsNyBAQCBQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvcktleWZyYW1lKFN0YXRlJiBzdGF0
ZSwgY29uc3QgUmVuZAogewogICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKICAgICBpZiAoa2V5ZnJh
bWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBr
ZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKyAgICAgICAgcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0
aWVzKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwogCiAgICAgLy8gQ3JlYXRlIHRoZSBzdHlsZQog
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoZWxlbWVu
dFN0eWxlKTsKQEAgLTE1NjMsNyArMTE2Miw3IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0
eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChQc2V1ZG9JZCBwc2V1ZG8sIEVsCiAK
ICAgICBTdGF0ZSBzdGF0ZShkb2N1bWVudCgpKTsKICAgICBpbml0RWxlbWVudChzdGF0ZSwgZSk7
Ci0gICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHls
ZSwgcHNldWRvKTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUs
IHBhcmVudFN0eWxlKTsKICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkp
OwogICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKHN0YXRlLnBhcmVudFN0eWxlKCkpOwog
CkBAIC0xNTcxLDIwICsxMTcwLDIyIEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChQc2V1ZG9JZCBwc2V1ZG8sIEVsCiAgICAgLy8g
dGhvc2UgcnVsZXMuCiAKICAgICAvLyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVzLgot
ICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OwotICAgIG1hdGNoVUFSdWxlcyhzdGF0ZSwgbWF0
Y2hSZXN1bHQpOworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBzdGF0
ZSk7CisgICAgY29sbGVjdG9yLnNldFBzZXVkb1N0eWxlKHBzZXVkbyk7CisgICAgY29sbGVjdG9y
LnNldE1lZGl1bShtX21lZGl1bS5nZXQoKSk7CisgICAgY29sbGVjdG9yLm1hdGNoVUFSdWxlcygp
OwogCiAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSB7Ci0gICAgICAgIG1hdGNo
VXNlclJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgZmFsc2UpOwotICAgICAgICBtYXRjaEF1dGhv
clJ1bGVzKHN0YXRlLCBtYXRjaFJlc3VsdCwgZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0
Y2hVc2VyUnVsZXMoZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hBdXRob3JSdWxlcyhm
YWxzZSk7CiAgICAgfQogCi0gICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlz
RW1wdHkoKSkKKyAgICBpZiAoY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKS5tYXRjaGVkUHJvcGVy
dGllcy5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0U3R5bGVUeXBlKHBzZXVkbyk7CiAKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKHN0YXRl
LCBtYXRjaFJlc3VsdCwgZSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhzdGF0ZSwgY29s
bGVjdG9yLm1hdGNoZWRSZXN1bHQoKSwgZSk7CiAKICAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUg
b2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBz
KS4KICAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFy
ZW50U3R5bGUoKSwgMCk7CkBAIC0xNjA2LDE3ICsxMjA3LDEyIEBAIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQogICAgIHN0
YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CiAgICAgc3RhdGUuc3R5bGUoKS0+
aW5oZXJpdEZyb20oc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKIAotICAgIGNvbnN0IGJvb2wg
aXNMZWZ0ID0gaXNMZWZ0UGFnZShzdGF0ZSwgcGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlz
Rmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0g
cGFnZU5hbWUocGFnZUluZGV4KTsKLSAgICAKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAg
bWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmlu
dFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3Vs
dCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAv
LyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVz
LCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCi0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1
bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAgUGFnZVJ1
bGVDb2xsZWN0b3IgY29sbGVjdG9yKHN0YXRlLCBtX3J1bGVTZXRzKTsKKyAgICBjb2xsZWN0b3Iu
bWF0Y2hBbGxQYWdlUnVsZXMocGFnZUluZGV4KTsKICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFs
dWUoMCk7CiAgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisKKyAgICBNYXRjaFJlc3Vs
dCYgcmVzdWx0ID0gY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKTsKICNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+
KHN0YXRlLCByZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMSwgaW5oZXJpdGVkT25seSk7CiAjZW5kaWYKQEAgLTIwNDUsNzcgKzE2NDEsMzEgQEAgUGFz
c1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVSdWxlc0ZvckVs
ZW1lbnQoRWxlbWVudCogZSwgUHMKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBTdGF0ZSBzdGF0
ZShkb2N1bWVudCgpKTsKLSAgICBzdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVj
dGluZ1J1bGVzKTsKLQogICAgIGluaXRFbGVtZW50KHN0YXRlLCBlKTsKLSAgICBzdGF0ZS5pbml0
Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKyAgICBzdGF0ZS5p
bml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDApOworCisgICAgRWxlbWVudFJ1bGVD
b2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIHN0YXRlKTsKKyAgICBjb2xsZWN0b3Iuc2V0TW9kZShT
ZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7CisgICAgY29sbGVjdG9yLnNldFBzZXVk
b1N0eWxlKHBzZXVkb0lkKTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVtKG1fbWVkaXVtLmdldCgp
KTsKIAotICAgIE1hdGNoUmVzdWx0IGR1bW15OwogICAgIGlmIChydWxlc1RvSW5jbHVkZSAmIFVB
QW5kVXNlckNTU1J1bGVzKSB7CiAgICAgICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20g
dGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgICAgIG1hdGNoVUFSdWxlcyhzdGF0ZSwgZHVtbXkp
OwotCisgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMoKTsKKyAgICAgICAgCiAgICAgICAg
IC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgogICAgICAgICBpZiAobV9tYXRjaEF1
dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgICAgICBtYXRjaFVzZXJSdWxlcyhzdGF0ZSwgZHVt
bXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CisgICAgICAgICAgICBjb2xsZWN0
b3IubWF0Y2hVc2VyUnVsZXMocnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKICAgICB9
CiAKICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgKHJ1bGVzVG9JbmNsdWRl
ICYgQXV0aG9yQ1NTUnVsZXMpKSB7Ci0gICAgICAgIHN0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEo
cnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisgICAgICAgIGNvbGxlY3Rv
ci5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxl
cykpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgotICAg
ICAgICBtYXRjaEF1dGhvclJ1bGVzKHN0YXRlLCBkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0
eUNTU1J1bGVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19
Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1bGVNYXRjaGVzKFN0YXRlJiBzdGF0ZSwg
Y29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNl
dWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5
IGJlaGF2aW9yQXRCb3VuZGFyeSkKLXsKLSAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJs
ZVNlbGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90
IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0
eWxlKCkgIT0gTk9QU0VVRE8pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8v
IFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNo
ZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgotICAgICAg
ICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hl
Y2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVj
dG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hU
TUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2Vs
ZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYm
ICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5z
ZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgaWYgKCFTZWxlY3RvckNoZWNrZXI6OmZhc3RDaGVja1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVj
dG9yKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKSkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIFNlbGVjdG9yQ2hlY2tlcjo6ZmFzdENoZWNr
KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAgICAgIGNvbGxlY3Rv
ci5tYXRjaEF1dGhvclJ1bGVzKHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CiAgICAg
fQogCi0gICAgLy8gU2xvdyBwYXRoLgotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNr
ZXIoZG9jdW1lbnQoKSwgc3RhdGUubW9kZSgpKTsKLSAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVj
dG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxl
bWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOwotICAgIGNvbnRl
eHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKLSAgICBjb250ZXh0LnNjb3BlID0gc2Nv
cGU7Ci0gICAgY29udGV4dC5wc2V1ZG9TdHlsZSA9IHN0YXRlLnBzZXVkb1N0eWxlKCk7Ci0gICAg
Y29udGV4dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7Ci0gICAgU2Vs
ZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250ZXh0
LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7Ci0gICAgaWYg
KG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlKCkgIT0gTk9QU0VVRE8gJiYgc3Rh
dGUucHNldWRvU3R5bGUoKSAhPSBkeW5hbWljUHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25T
ZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lv
bkVsZW1lbnQpCi17Ci0gICAgaWYgKCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hl
Y2tlcihkb2N1bWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlF1ZXJ5aW5nUnVsZXMpOwotICAgIGZv
ciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVj
dG9yTGlzdDo6bmV4dChzKSkKLSAgICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaGVzKHMs
IHJlZ2lvbkVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4g
ZmFsc2U7CisgICAgcmV0dXJuIGNvbGxlY3Rvci5tYXRjaGVkUnVsZUxpc3QoKTsKIH0KIAogLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjM5Miw4NiArMTk0Miw2IEBAIHZvaWQg
U3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhTdGF0ZSYgc3RhdGUsIGNvbnN0
IE1hdGNoUmVzdWx0JiBtYXRjCiAgICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRl
LnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpOwog
fQogCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBTdHlsZVJ1bGVQ
YWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCi17Ci0gICAgcmV0dXJuIHIxLT5zZWxl
Y3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCk7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29u
c3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBpZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7Ci0gICAgbWF0
Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwg
aXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKLSAgICBpZiAobWF0Y2hlZFBhZ2VS
dWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN0ZDo6c3RhYmxlX3NvcnQo
bWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJl
UGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1
bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1h
dGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNr
UGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wg
aXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsK
LSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9u
ZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgewotICAgICAgICBpZiAo
Y29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKLSAgICAgICAgICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2Fs
TmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5h
bWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9
Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVu
dC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6
OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5
cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQotICAgICAg
ICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAh
aXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxl
cywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3R5bGVSdWxl
UGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAgICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JD
b21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdl
TmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBJZiB0aGUgcnVsZSBo
YXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCi0gICAgICAgIGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAg
ICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1h
dGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Ci0gICAgfQot
fQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2UoU3RhdGUmIHN0YXRlLCBpbnQgcGFn
ZUluZGV4KSBjb25zdAotewotICAgIGJvb2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7Ci0gICAg
aWYgKCFzdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkK
LSAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAgIHJldHVybiAocGFnZUluZGV4
ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQotCi1ib29sIFN0eWxlUmVzb2x2
ZXI6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IElu
IGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAxIChub3QgMCkg
Y2FuIGJlIHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBhZ2VJbmRleCk7Ci19Ci0KLVN0
cmluZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAot
ewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGlu
Zy4KLSAgICByZXR1cm4gIiI7Ci19Ci0KIHZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0
eVdpdGhOdWxsQ2hlY2soU3RhdGUmIHN0YXRlLCBDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSog
dmFsdWUpCiB7CiAgICAgaWYgKCF2YWx1ZSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2Nz
cy9TdHlsZVJlc29sdmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCmlu
ZGV4IDI4NTZkNzM1OWQzMjZjZTg0NDM3NTAzMzA1Yzk1OThkNzU5OWQ3NGYuLmJhNTA0NmNlYjcw
ZTk1YmExOWQ0YmE4NDNiODgxOTdkZThjMWMzN2MgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2Nzcy9TdHlsZVJlc29sdmVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2
ZXIuaApAQCAtMTg2LDYgKzE4Niw3IEBAIHB1YmxpYzoKIAogICAgIERvY3VtZW50UnVsZVNldHMm
IHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQogICAgIGNvbnN0IERvY3VtZW50UnVs
ZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsgfQorICAgIFNlbGVj
dG9yRmlsdGVyJiBzZWxlY3RvckZpbHRlcigpIHsgcmV0dXJuIG1fc2VsZWN0b3JGaWx0ZXI7IH0K
IAogI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQogICAgIFN0
eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCkBAIC0zMDEsMTQgKzMwMiw2
IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMoU3RhdGUmKTsKIAot
cHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQg
c2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZhbWlseSBo
YXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFN0
YXRlJiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotICAgIHZvaWQg
Y2hlY2tGb3Jab29tQ2hhbmdlKFN0YXRlJiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3JUZXh0U2l6ZUFkanVzdChTdGF0ZSYpOwotCi0g
ICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShTdGF0ZSYsIFJlbmRlclN0eWxlKiBzdHlsZVRvQWRq
dXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKLQogICAgIHN0cnVjdCBS
dWxlUmFuZ2UgewogICAgICAgICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBs
YXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUlu
ZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQogICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OwpAQCAt
MzQ5LDI5ICszNDIsMjAgQEAgcHJpdmF0ZToKICAgICAgICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0
PiBtYXRjaGVkUnVsZXM7CiAgICAgICAgIE1hdGNoUmFuZ2VzIHJhbmdlczsKICAgICAgICAgYm9v
bCBpc0NhY2hlYWJsZTsKLSAgICB9OwogCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0Y2hlZFByb3Bl
cnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBT
dHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6
TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7
Ci0gICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKKyAgICAgICAgdm9p
ZCBhZGRNYXRjaGVkUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVz
LCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tl
cjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9u
ZSk7CisgICAgfTsKIAotICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhTdGF0ZSYsIE1hdGNoUmVzdWx0
JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKFN0
YXRlJiwgTWF0Y2hSZXN1bHQmKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhTdGF0ZSYsIE1hdGNo
UmVzdWx0JiwgUnVsZVNldCopOwotICAgIHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhTdGF0ZSYsIE1h
dGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFVzZXJS
dWxlcyhTdGF0ZSYsIE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAg
dm9pZCBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKFN0YXRlJiwgTWF0Y2hSZXN1bHQmLCBib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9zdFJ1bGVzKFN0YXRlJiwgTWF0Y2hS
ZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKK3ByaXZhdGU6CisgICAgLy8gVGhpcyBm
dW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0
IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKKyAgICB2
b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShTdGF0ZSYsIFJlbmRlclN0eWxlKiwgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNoYW5nZShTdGF0
ZSYsIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNo
ZWNrRm9yVGV4dFNpemVBZGp1c3QoU3RhdGUmKTsKIAotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5n
UnVsZXMoU3RhdGUmLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lk
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKFN0YXRlJiwgY29uc3QgTWF0Y2hSZXF1ZXN0
JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoU3Rh
dGUmLCBjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJh
bmdlJik7CisgICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShTdGF0ZSYsIFJlbmRlclN0eWxlKiBz
dHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKIAogICAg
IGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVEYXRhJikgY29uc3Q7Ci0gICAgdm9p
ZCBzb3J0TWF0Y2hlZFJ1bGVzKFN0YXRlJik7Ci0gICAgdm9pZCBzb3J0QW5kVHJhbnNmZXJNYXRj
aGVkUnVsZXMoU3RhdGUmLCBNYXRjaFJlc3VsdCYpOwogCi0gICAgYm9vbCBydWxlTWF0Y2hlcyhT
dGF0ZSYsIGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVk
b0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNr
ZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3Io
Y29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50
KTsKICAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoU3RhdGUmLCBjb25zdCBNYXRjaFJl
c3VsdCYsIGNvbnN0IEVsZW1lbnQqKTsKICAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsK
ICNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKQEAgLTQyMiwxMiArNDA2LDkgQEAgcHVibGljOgog
ICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUo
MCkKICAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKLSAgICAgICAgLCBtX3NhbWVPcmln
aW5Pbmx5KGZhbHNlKQotICAgICAgICAsIG1fcHNldWRvU3R5bGUoTk9QU0VVRE8pCiAgICAgICAg
ICwgbV9lbGVtZW50TGlua1N0YXRlKE5vdEluc2lkZUxpbmspCiAgICAgICAgICwgbV9kaXN0cmli
dXRlZFRvSW5zZXJ0aW9uUG9pbnQoZmFsc2UpCiAgICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXMoZmFsc2UpCi0gICAgICAgICwgbV9tb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVz
b2x2aW5nU3R5bGUpCiAgICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1
ZSkKICAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpCiAj
aWYgRU5BQkxFKENTU19TSEFERVJTKQpAQCAtNDQwLDcgKzQyMSw3IEBAIHB1YmxpYzoKIAogICAg
IHB1YmxpYzoKICAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7Ci0gICAgICAgIHZv
aWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1lbnQqLCBSZW5kZXJTdHlsZSog
cGFyZW50U3R5bGUgPSAwLCBQc2V1ZG9JZCA9IE5PUFNFVURPLCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3Vt
ZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFJlbmRlclJlZ2lv
biogcmVnaW9uRm9yU3R5bGluZyA9IDApOwogICAgICAgICB2b2lkIGNsZWFyKCk7CiAKICAgICAg
ICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9kb2N1bWVudDsgfQpAQCAt
NDUwLDI1ICs0MzEsMTcgQEAgcHVibGljOgogICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBj
b25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9CiAgICAgICAgIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IHRha2VTdHlsZSgpIHsgcmV0dXJuIG1fc3R5bGUucmVsZWFzZSgpOyB9CiAKLSAgICAg
ICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0KCk7Ci0gICAgICAgIFBhc3NSZWZQ
dHI8Q1NTUnVsZUxpc3Q+IHRha2VSdWxlTGlzdCgpIHsgcmV0dXJuIG1fcnVsZUxpc3QucmVsZWFz
ZSgpOyB9Ci0KICAgICAgICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcGFyZW50Tm9kZTsgfQogICAgICAgICB2b2lkIHNldFBhcmVudFN0eWxlKFJl
bmRlclN0eWxlKiBwYXJlbnRTdHlsZSkgeyBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7IH0K
ICAgICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJl
bnRTdHlsZTsgfQogICAgICAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcm9vdEVsZW1lbnRTdHlsZTsgfQogCiAgICAgICAgIGNvbnN0IFJlbmRlclJl
Z2lvbiogcmVnaW9uRm9yU3R5bGluZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnaW9uRm9yU3R5bGlu
ZzsgfQotICAgICAgICB2b2lkIHNldFNhbWVPcmlnaW5Pbmx5KGJvb2wgaXNTYW1lT3JpZ2luT25s
eSkgeyBtX3NhbWVPcmlnaW5Pbmx5ID0gaXNTYW1lT3JpZ2luT25seTsgfQotICAgICAgICBib29s
IGlzU2FtZU9yaWdpbk9ubHkoKSBjb25zdCB7IHJldHVybiBtX3NhbWVPcmlnaW5Pbmx5OyB9Ci0g
ICAgICAgIFBzZXVkb0lkIHBzZXVkb1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9wc2V1ZG9TdHls
ZTsgfQogICAgICAgICBFSW5zaWRlTGluayBlbGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1
cm4gbV9lbGVtZW50TGlua1N0YXRlOyB9CiAgICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2Vy
dGlvblBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7
IH0KICAgICAgICAgdm9pZCBzZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0Fm
ZmVjdGVkKSB7IG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQog
ICAgICAgICBib29sIGVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJu
IG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShT
ZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNl
bGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAg
ICAgIAorCiAgICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wg
aXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KICAg
ICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBs
eSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9CiAgICAg
ICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9h
cHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0KQEAgLTUwMiwxMCArNDc1LDggQEAgcHVibGlj
OgogICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2RlKSB7
IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2RlKTsgfQog
ICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4dE9yaWVu
dGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRhdGlvbih0ZXh0
T3JpZW50YXRpb24pOyB9CiAKLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBt
YXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxlczsgfQotICAgICAgICB2b2lkIGFk
ZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1bGVzLmFwcGVu
ZChydWxlKTsgfQogICAgICAgICBib29sIHVzZVNWR1pvb21SdWxlcygpIGNvbnN0IHsgcmV0dXJu
IG1fZWxlbWVudCAmJiBtX2VsZW1lbnQtPmlzU1ZHRWxlbWVudCgpOyB9Ci0gICAgICAgIAorCiAg
ICAgcHJpdmF0ZToKICAgICAgICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7CiAgICAgICAgIEVsZW1l
bnQqIG1fZWxlbWVudDsKQEAgLTUxNCwyNCArNDg1LDE2IEBAIHB1YmxpYzoKICAgICAgICAgQ29u
dGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOwogICAgICAgICBSZW5kZXJTdHlsZSogbV9wYXJlbnRT
dHlsZTsKICAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHlsZTsKLSAgICAgICAg
Ci0gICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOwotICAgICAgICBib29s
IG1fc2FtZU9yaWdpbk9ubHk7Ci0gICAgICAgIFBzZXVkb0lkIG1fcHNldWRvU3R5bGU7CiAKKyAg
ICAgICAgLy8gUmVxdWlyZWQgdG8gQVNTRVJUIGluIGFwcGx5UHJvcGVydGllcy4KKyAgICAgICAg
UmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7CisgICAgICAgIAogICAgICAgICBFSW5z
aWRlTGluayBtX2VsZW1lbnRMaW5rU3RhdGU7CiAKICAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVk
VG9JbnNlcnRpb25Qb2ludDsKIAogICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFz
c1J1bGVzOwogCi0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7Ci0KLSAgICAg
ICAgLy8gQSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3Ig
YW4gZWxlbWVudCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBt
ZXJnZSBzb3J0aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRj
aGVkUnVsZXM7Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsK
LQogICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOwogICAgICAgICBi
b29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsKIApAQCAtNjU2LDYgKzYxOSwx
OSBAQCBpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0
b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKICAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJl
cygpLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwogfQogCitpbmxpbmUgYm9v
bCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3Rvciwg
RWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICBpZiAoIXJlZ2lvblNlbGVjdG9yIHx8ICFy
ZWdpb25FbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTZWxlY3RvckNoZWNr
ZXIgc2VsZWN0b3JDaGVja2VyKHJlZ2lvbkVsZW1lbnQtPmRvY3VtZW50KCksIFNlbGVjdG9yQ2hl
Y2tlcjo6UXVlcnlpbmdSdWxlcyk7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJl
Z2lvblNlbGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKQorICAgICAgICBp
ZiAoc2VsZWN0b3JDaGVja2VyLm1hdGNoZXMocywgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQogCiAjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwIGIvU291cmNlL1dlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAppbmRleCA2ZDcwNWFlMWVkZWRlZWZhZGE5
YTJkMDEzMmU2YWZmN2NlZjEzYzlmLi4zNjE2MjYzMGIyMzE3ZWMyYWI1MDJhNjQ5MGJjMzE2Njg2
Y2Q4NWNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NT
QWdlbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2Vu
dC5jcHAKQEAgLTk1NywxMSArOTU3LDExIEBAIFBhc3NSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6
U2VsZWN0b3JQcm9maWxlPiBJbnNwZWN0b3JDU1NBZ2VudDo6c3RvcFNlbGVjdG9yUHJvCiAgICAg
cmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CiB9CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6Ondp
bGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVy
KQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZShTdHlsZVJ1bGUqIHJ1bGUs
IEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIERvY3VtZW50
U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewogLy8gICAgcHJp
bnRmKCJJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSAlc1xuIiwgcnVsZS0+c2VsZWN0
b3JMaXN0KCkuc2VsZWN0b3JzVGV4dCgpLnV0ZjgoKS5kYXRhKCkpOwogICAgIGlmIChtX2N1cnJl
bnRTZWxlY3RvclByb2ZpbGUpCi0gICAgICAgIG1fY3VycmVudFNlbGVjdG9yUHJvZmlsZS0+c3Rh
cnRTZWxlY3RvcihzdHlsZVJlc29sdmVyLT5pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkuZ2V0V3Jh
cHBlckZvclJ1bGVJblNoZWV0cyhydWxlLCBzdHlsZVJlc29sdmVyLT5kb2N1bWVudCgpLT5zdHls
ZVNoZWV0Q29sbGVjdGlvbigpKSk7CisgICAgICAgIG1fY3VycmVudFNlbGVjdG9yUHJvZmlsZS0+
c3RhcnRTZWxlY3RvcihpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmdldFdyYXBwZXJGb3JSdWxlSW5T
aGVldHMocnVsZSwgc3R5bGVTaGVldENvbGxlY3Rpb24pKTsKIH0KIAogdm9pZCBJbnNwZWN0b3JD
U1NBZ2VudDo6ZGlkTWF0Y2hSdWxlKGJvb2wgbWF0Y2hlZCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5oIGIvU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmgKaW5kZXggMTQzZTQ1NGFhOTZiMDE2ODE5ODAzMTUx
MGZmNTk3MzhhZjBmZWUxNy4uNDBmODgyMGUyYTI3OWFiNWU2OGFmOTBkODA2NDQ2YTJiZTU4N2Rh
MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50
LmgKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmgKQEAg
LTQ3LDcgKzQ3LDkgQEAgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsKIGNsYXNzIENTU1N0eWxl
UnVsZTsKIGNsYXNzIENTU1N0eWxlU2hlZXQ7CiBjbGFzcyBEb2N1bWVudDsKK2NsYXNzIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBFbGVtZW50OworY2xhc3MgSW5zcGVjdG9y
Q1NTT01XcmFwcGVyczsKIGNsYXNzIEluc3BlY3RvckZyb250ZW5kOwogY2xhc3MgSW5zdHJ1bWVu
dGluZ0FnZW50czsKIGNsYXNzIE5hbWVOb2RlTWFwOwpAQCAtMTI1LDcgKzEyNyw3IEBAIHB1Ymxp
YzoKICAgICB2aXJ0dWFsIHZvaWQgc3RvcFNlbGVjdG9yUHJvZmlsZXIoRXJyb3JTdHJpbmcqLCBS
ZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9maWxlPiYpOwogCiAgICAgUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclByb2ZpbGU+IHN0b3BTZWxlY3RvclByb2Zp
bGVySW1wbChFcnJvclN0cmluZyosIGJvb2wgbmVlZFByb2ZpbGUpOwotICAgIHZvaWQgd2lsbE1h
dGNoUnVsZShTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CisgICAgdm9pZCB3aWxsTWF0Y2hS
dWxlKFN0eWxlUnVsZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxlU2hl
ZXRDb2xsZWN0aW9uKik7CiAgICAgdm9pZCBkaWRNYXRjaFJ1bGUoYm9vbCk7CiAgICAgdm9pZCB3
aWxsUHJvY2Vzc1J1bGUoU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAgIHZvaWQgZGlk
UHJvY2Vzc1J1bGUoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbi5jcHAKaW5kZXggMzdhODY1YTk0YmFmNDE1ZDU1NzZlZDc4NTIx
YWVmNjNkMGNkN2Q1NS4uOGM3YjViOTVhODllNDhkNDRmMjZlMmNmYzIzNzM3ZTM5ZjE4YjMxMyAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRh
dGlvbi5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1l
bnRhdGlvbi5jcHAKQEAgLTU4MiwxMSArNTgyLDExIEBAIHZvaWQgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uOjpkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbkltcGwoSW5zdHJ1bWVudGluZ0Fn
CiAgICAgICAgIHJlc291cmNlQWdlbnQtPmRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKGRv
Y3VtZW50KTsKIH0KIAotSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5z
dHJ1bWVudGluZ0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJl
c29sdmVyKQorSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1l
bnRhdGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVu
dGluZ0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzaGVldENv
bGxlY3Rpb24pCiB7CiAgICAgSW5zcGVjdG9yQ1NTQWdlbnQqIGNzc0FnZW50ID0gaW5zdHJ1bWVu
dGluZ0FnZW50cy0+aW5zcGVjdG9yQ1NTQWdlbnQoKTsKICAgICBpZiAoY3NzQWdlbnQpIHsKLSAg
ICAgICAgY3NzQWdlbnQtPndpbGxNYXRjaFJ1bGUocnVsZSwgc3R5bGVSZXNvbHZlcik7CisgICAg
ICAgIGNzc0FnZW50LT53aWxsTWF0Y2hSdWxlKHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBlcnMs
IHNoZWV0Q29sbGVjdGlvbik7CiAgICAgICAgIHJldHVybiBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUoaW5zdHJ1bWVudGluZ0FnZW50cywgMSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgKaW5kZXggOTky
ZGIwYThmM2RmYzYzZGI2YWVlYjBlNDMyYTZiMjU2NGZkYWFiOC4uZTI3ZjdhYmRiNmQ2NDVjMGFk
YzYwMTQxZGE3NDNjYWIyYWE0MWYyNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaApAQCAtNTksMTAgKzU5LDEyIEBAIGNsYXNz
IERvY3VtZW50OwogY2xhc3MgRWxlbWVudDsKIGNsYXNzIEV2ZW50Q29udGV4dDsKIGNsYXNzIERv
Y3VtZW50TG9hZGVyOworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjsKIGNsYXNz
IERldmljZU9yaWVudGF0aW9uRGF0YTsKIGNsYXNzIEdlb2xvY2F0aW9uUG9zaXRpb247CiBjbGFz
cyBHcmFwaGljc0NvbnRleHQ7CiBjbGFzcyBJbnNwZWN0b3JDU1NBZ2VudDsKK2NsYXNzIEluc3Bl
Y3RvckNTU09NV3JhcHBlcnM7CiBjbGFzcyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb247CiBjbGFz
cyBJbnNwZWN0b3JUaW1lbGluZUFnZW50OwogY2xhc3MgSW5zdHJ1bWVudGluZ0FnZW50czsKQEAg
LTE3MSw3ICsxNzMsNyBAQCBwdWJsaWM6CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSB3aWxsUmVjYWxjdWxhdGVTdHlsZShEb2N1bWVudCopOwogICAgIHN0YXRpYyB2
b2lkIGRpZFJlY2FsY3VsYXRlU3R5bGUoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llJik7CiAgICAgc3RhdGljIHZvaWQgZGlkU2NoZWR1bGVTdHlsZVJlY2FsY3VsYXRpb24oRG9j
dW1lbnQqKTsKLSAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxN
YXRjaFJ1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CisgICAgc3Rh
dGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlKERvY3VtZW50
KiwgU3R5bGVSdWxlKiwgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyYsIERvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb24qKTsKICAgICBzdGF0aWMgdm9pZCBkaWRNYXRjaFJ1bGUoY29uc3QgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJiwgYm9vbCBtYXRjaGVkKTsKICAgICBzdGF0aWMgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxQcm9jZXNzUnVsZShEb2N1bWVudCosIFN0
eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKICAgICBzdGF0aWMgdm9pZCBkaWRQcm9jZXNzUnVs
ZShjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmKTsKQEAgLTM3MSw3ICszNzMs
NyBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUg
d2lsbFJlY2FsY3VsYXRlU3R5bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqLCBGcmFtZSopOwog
ICAgIHN0YXRpYyB2b2lkIGRpZFJlY2FsY3VsYXRlU3R5bGVJbXBsKGNvbnN0IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbkNvb2tpZSYpOwogICAgIHN0YXRpYyB2b2lkIGRpZFNjaGVkdWxlU3R5bGVS
ZWNhbGN1bGF0aW9uSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiwgRG9jdW1lbnQqKTsKLSAgICBz
dGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxNYXRjaFJ1bGVJbXBsKElu
c3RydW1lbnRpbmdBZ2VudHMqLCBTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CisgICAgc3Rh
dGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlSW1wbChJbnN0
cnVtZW50aW5nQWdlbnRzKiwgU3R5bGVSdWxlKiwgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyYsIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsKICAgICBzdGF0aWMgdm9pZCBkaWRNYXRjaFJ1
bGVJbXBsKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYsIGJvb2wgbWF0Y2hl
ZCk7CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsUHJvY2Vz
c1J1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqLCBTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVy
Kik7CiAgICAgc3RhdGljIHZvaWQgZGlkUHJvY2Vzc1J1bGVJbXBsKGNvbnN0IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbkNvb2tpZSYpOwpAQCAtMTE2MCwxNiArMTE2MiwxNyBAQCBpbmxpbmUgdm9p
ZCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9u
KERvY3VtZW50KiBkbwogI2VuZGlmCiB9CiAKLWlubGluZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKERvY3VtZW50
KiBkb2N1bWVudCwgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVy
KQoraW5saW5lIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OndpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBTdHlsZVJ1bGUqIHJ1
bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIERvY3Vt
ZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewogI2lmIEVO
QUJMRShJTlNQRUNUT1IpCiAgICAgRkFTVF9SRVRVUk5fSUZfTk9fRlJPTlRFTkRTKEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbkNvb2tpZSgpKTsKICAgICBpZiAoSW5zdHJ1bWVudGluZ0FnZW50cyog
aW5zdHJ1bWVudGluZ0FnZW50cyA9IGluc3RydW1lbnRpbmdBZ2VudHNGb3JEb2N1bWVudChkb2N1
bWVudCkpCi0gICAgICAgIHJldHVybiB3aWxsTWF0Y2hSdWxlSW1wbChpbnN0cnVtZW50aW5nQWdl
bnRzLCBydWxlLCBzdHlsZVJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIHdpbGxNYXRjaFJ1bGVJ
bXBsKGluc3RydW1lbnRpbmdBZ2VudHMsIHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIHN0
eWxlU2hlZXRDb2xsZWN0aW9uKTsKICNlbHNlCiAgICAgVU5VU0VEX1BBUkFNKGRvY3VtZW50KTsK
ICAgICBVTlVTRURfUEFSQU0ocnVsZSk7Ci0gICAgVU5VU0VEX1BBUkFNKHN0eWxlUmVzb2x2ZXIp
OworICAgIFVOVVNFRF9QQVJBTShpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBVTlVTRURf
UEFSQU0oc3R5bGVTaGVldENvbGxlY3Rpb24pOwogI2VuZGlmCiAgICAgcmV0dXJuIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbkNvb2tpZSgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>191943</attachid>
            <date>2013-03-07 01:15:09 -0800</date>
            <delta_ts>2013-03-07 01:40:45 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130307181112.patch</filename>
            <type>text/plain</type>
            <size>1111364</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTA0OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBAQAorMjAxMy0wMy0wNyAgVGFrYXNo
aSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5nXSBJ
bXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQW50dGkgS29pdmlz
dG8uCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1lbnQg
YW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4gY2xh
c3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAgYSBz
dHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3RvcmluZy4K
KworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3Qu
YW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAg
ICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNzcy9D
U1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFuZCBQ
YWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1
ZXN0cyk6CisgICAgICAgIFNpbmNlIGJlaGF2aW9yQXRCb3VuZGFyeSBpcyBhIHN0YXRlIG93bmVk
IGJ5IEVsZW1lbnRSdWxlQ29sbGVjdG9yLAorICAgICAgICByZW1vdmVkIGZyb20gaGVyZS4KKyAg
ICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5oOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93
RGlzdHJpYnV0ZWRSdWxlczo6aXNFbXB0eSk6CisgICAgICAgIEFkZGVkIHRvIHF1aWNrbHkgY2hl
Y2sgd2hldGhlciB0aGVyZSBleGlzdCBhbnkgU2hhZG93RGlzdHJpYnV0ZWRSdWxlcworICAgICAg
ICBvciBub3QuCisgICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDogQ29waWVk
IGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJl
c3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1
bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRj
aGVkUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJN
YXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmVu
c3VyZVJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxl
Q29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29w
ZWRBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
bWF0Y2hIb3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoU2hhZG93RGlzdHJpYnV0ZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxl
bWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6cnVsZU1hdGNoZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyk6CisgICAgICAg
IE1vdmVkIHRoZXNlIG1ldGhvZHMgZnJvbSBTdHlsZVJlc29sdmVyIHRvIHRoaXMgY2xhc3MuCisg
ICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxl
cyk6CisgICAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBn
aXZlbiBlbGVtZW50IGNhbiBzaGFyZQorICAgICAgICBhIGNhY2hlLgorICAgICAgICAqIGNzcy9F
bGVtZW50UnVsZUNvbGxlY3Rvci5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5
bGVSZXNvbHZlci5oLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBVc2Ugc3R5
bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFibGVzLCBp
LmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NTT01XcmFw
cGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChFbGVtZW50
UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNl
dWRvU3R5bGVSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpzZXRTYW1lT3JpZ2luT25seSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxl
Y3Rvcjo6c2V0UmVnaW9uRm9yU3R5bGluZyk6CisgICAgICAgIE1vZGUsIFNhbWVPcmlnaW5Pbmx5
LCBSZWdpb25Gb3JTdHlsaW5nIGFyZSBvbmx5IHVzZWQgd2hpbGUgY29sbGVjdGluZworICAgICAg
ICBtYXRjaGVkIHJ1bGVzLgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnNldE1lZGl1bSk6CisgICAgICAgIE5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0IHN0eWxlc2hl
ZXQgc2hvdWxkIGJlIGxvb2tlZCB1cC4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpkb2N1bWVudCk6CisgICAgICAgICogY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcDog
Q29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHls
ZVJlc29sdmVyLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VS
dWxlQ29sbGVjdG9yOjpQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChQYWdlUnVsZUNvbGxl
Y3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3Vs
dCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5
bGVSZXNvbHZlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmlu
Z0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2
ZXI6OnN0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpz
dHlsZUZvcktleWZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnBzZXVk
b1N0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpzdHls
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6YXBwbHlN
YXRjaGVkUHJvcGVydGllcyk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGNoUmVxdWVzdDo6TWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgUmVtb3Zl
ZCBiZWhhdmlvckF0Qm91bmRhcnkuIEluc3RlYWQsIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGhhdmUg
dGhlCisgICAgICAgIHN0YXRlLgorICAgICAgICAoTWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAgICAgICAgQWRkZWQgdG8g
b2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVjdG9yJ3MgY29uc3RydWN0
b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1hdGNoUmVzdWx0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIFRv
IHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcywgbmVlZCB0byBr
ZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAgKFN0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpyZWdpb25Gb3JTdHlsaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjp1c2VTVkdab29tUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZCk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgor
ICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSk6CisgICAgICAgIFJlbW92ZWQg
U3R5bGVSZXNvbHZlciBmcm9tIGl0cyBwYXJhbWV0ZXIgbGlzdC4gSW5zdGVhZCwgYWRkZWQKKyAg
ICAgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBhbmQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaDoKKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9yQ1NTQWdlbnQpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwOgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJ
bXBsKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmg6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEluc3BlY3Rvckluc3RydW1lbnRhdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUp
OgorCiAyMDEzLTAzLTA3ICBWc2V2b2xvZCBWbGFzb3YgIDx2c2V2aWtAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IE5hdmlnYXRvclZpZXcgc2hvdWxkIHNob3cgKHByb2dy
YW0pIGZvciB1aVNvdXJjZUNvZGVzIHdpdGggZW1wdHkgbmFtZS4KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlz
dHMudHh0CShyZXZpc2lvbiAxNDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4
dAkod29ya2luZyBjb3B5KQpAQCAtMTA3MCw2ICsxMDcwLDcgQEAgc2V0KFdlYkNvcmVfU09VUkNF
UwogICAgIGNzcy9DU1NWYWx1ZVBvb2wuY3BwCiAgICAgY3NzL0RPTVdpbmRvd0NTUy5jcHAKICAg
ICBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAKKyAgICBjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
Y3BwCiAgICAgY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwCiAgICAgY3NzL0ZvbnRWYWx1ZS5jcHAK
ICAgICBjc3MvSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAKQEAgLTEwODIsNiArMTA4Myw3IEBA
IHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3MvTWVkaWFRdWVyeUxpc3QuY3BwCiAgICAgY3Nz
L01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuY3BwCiAgICAgY3NzL01lZGlhUXVlcnlNYXRjaGVyLmNw
cAorICAgIGNzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKICAgICBjc3MvUHJvcGVydHlTZXRDU1NT
dHlsZURlY2xhcmF0aW9uLmNwcAogICAgIGNzcy9SR0JDb2xvci5jcHAKICAgICBjc3MvUnVsZUZl
YXR1cmUuaApJbmRleDogU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxNDUw
MzApCisrKyBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkp
CkBAIC0yNjYwLDYgKzI2NjAsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJD
b3JlL2Nzcy9EYXNoYm9hcmRSZWdpb24uaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50
UnVsZVNldHMuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oIFwK
KwlTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIFwKKwlTb3VyY2Uv
V2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvY3Nz
L0ZvbnRGZWF0dXJlVmFsdWUuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udEZlYXR1cmVW
YWx1ZS5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udFZhbHVlLmNwcCBcCkBAIC0yNjg0LDYg
KzI2ODYsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRp
YVF1ZXJ5TGlzdExpc3RlbmVyLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5TWF0
Y2hlci5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5oIFwKKwlT
b3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIFwKKwlTb3VyY2UvV2ViQ29y
ZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL1BhaXIuaCBc
CiAJU291cmNlL1dlYkNvcmUvY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAg
XAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uaCBc
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL1RhcmdldC5wcmkJKHJldmlzaW9uIDE0NTAzMCkKKysrIFNvdXJjZS9XZWJDb3JlL1Rh
cmdldC5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTMwNSw2ICszMDUsNyBAQCBTT1VSQ0VTICs9IFwK
ICAgICBjc3MvQ1NTVmFsdWVQb29sLmNwcCBcCiAgICAgY3NzL0RPTVdpbmRvd0NTUy5jcHAgXAog
ICAgIGNzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCBcCisgICAgY3NzL0VsZW1lbnRSdWxlQ29sbGVj
dG9yLmNwcCBcCiAgICAgY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwIFwKICAgICBjc3MvRm9udFZh
bHVlLmNwcCBcCiAgICAgY3NzL0luc3BlY3RvckNTU09NV3JhcHBlcnMuY3BwIFwKQEAgLTMxNyw2
ICszMTgsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBjc3MvTWVkaWFRdWVyeUxpc3QuY3BwIFwKICAg
ICBjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5jcHAgXAogICAgIGNzcy9NZWRpYVF1ZXJ5TWF0
Y2hlci5jcHAgXAorICAgIGNzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAgXAogICAgIGNzcy9Qcm9w
ZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwIFwKICAgICBjc3MvUkdCQ29sb3IuY3BwIFwK
ICAgICBjc3MvUnVsZUZlYXR1cmUuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
Z3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9u
IDE0NTAzMCkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpA
QCAtMTY1MCw2ICsxNjUwLDggQEAKICAgICAgICAgICAgICdjc3MvRGFzaGJvYXJkUmVnaW9uLmgn
LAogICAgICAgICAgICAgJ2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCcsCiAgICAgICAgICAgICAn
Y3NzL0RvY3VtZW50UnVsZVNldHMuaCcsCisgICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmNwcCcsCisgICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgnLAog
ICAgICAgICAgICAgJ2Nzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnY3Nz
L0ZvbnRGZWF0dXJlVmFsdWUuaCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRWYWx1ZS5jcHAnLApA
QCAtMTY3Myw2ICsxNjc1LDggQEAKICAgICAgICAgICAgICdjc3MvTWVkaWFRdWVyeUxpc3RMaXN0
ZW5lci5oJywKICAgICAgICAgICAgICdjc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwJywKICAgICAg
ICAgICAgICdjc3MvTWVkaWFRdWVyeU1hdGNoZXIuaCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VS
dWxlQ29sbGVjdG9yLmNwcCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgn
LAogICAgICAgICAgICAgJ2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwJywK
ICAgICAgICAgICAgICdjc3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmgnLAogICAg
ICAgICAgICAgJ2Nzcy9SR0JDb2xvci5jcHAnLApJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTQ1MDMwKQorKysg
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5n
IGNvcHkpCkBAIC02NTQ4LDYgKzY1NDgsMTAgQEAKIAkJRkJENkFGOEIxNUVGMjVFNTAwOEI3MTEw
IC8qIENTU0Jhc2ljU2hhcGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEZCRDZBRjg2MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5j
cHAgKi87IH07CiAJCUZCRDZBRjhDMTVFRjI2MDQwMDhCNzExMCAvKiBCYXNpY1NoYXBlcy5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODMxNUVG
MjFBMzAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMg
PSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRkJENkFGOEQxNUVGMjYwQTAwOEI3MTEwIC8qIEJhc2lj
U2hhcGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZCRDZBRjgyMTVFRjIxQTMwMDhCNzExMCAvKiBCYXNpY1NoYXBlcy5jcHAgKi87IH07CisJCUZC
REI2MTlCMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkRCNjE5QTE2RDYwMzJB
MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwICovOyB9OworCQlGQkRCNjE5RDE2
RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJEQjYxOUMxNkQ2MDM0NjAwQkIzMzk0IC8q
IFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCAqLzsgfTsKKwkJRkJEQjYxOUYxNkQ2MDM2NTAwQkIzMzk0
IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaCAqLzsgfTsKKwkJRkJEQjYxQTExNkQ2MDM3RTAwQkIzMzk0IC8qIFBhZ2VSdWxl
Q29sbGVjdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGQkRCNjFBMDE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCAqLzsgfTsK
IAkJRkJGODkwNDUxNjlFOUYxRjAwNTJEODZFIC8qIENTU0dyb3VwaW5nUnVsZS5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkY4OTA0NDE2OUU5RjFG
MDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdSdWxlLmNwcCAqLzsgfTsKIAkJRkM1NEQwNTcxNkE3Njcz
MTAwNTc1RTREIC8qIENTU1N1cHBvcnRzUnVsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRkM2M0JEQjExNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1cHBv
cnRzUnVsZS5oICovOyB9OwogCQlGQzU0RDA1ODE2QTc2NzZFMDA1NzVFNEQgLyogSlNDU1NTdXBw
b3J0c1J1bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZDODQ4MDJFMTY3QUI0NDQwMDhDRDEwMCAvKiBKU0NTU1N1cHBvcnRzUnVsZS5oICovOyB9OwpA
QCAtMTQyOTYsNiArMTQzMDAsMTAgQEAKIAkJRkJENkFGODUxNUVGMjFENDAwOEI3MTEwIC8qIEJh
c2ljU2hhcGVGdW5jdGlvbnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmFz
aWNTaGFwZUZ1bmN0aW9ucy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQkQ2QUY4
NjE1RUYyMUQ0MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTQmFzaWNTaGFwZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlGQkQ2QUY4NzE1RUYyMUQ0MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ1NTQmFzaWNTaGFwZXMuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxOUExNkQ2MDMyQTAwQkIzMzk0IC8qIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJRkJEQjYxOUMxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhZ2VSdWxlQ29sbGVjdG9yLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxOUUxNkQ2MDM2NTAwQkIzMzk0IC8q
IEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEVsZW1lbnRSdWxlQ29sbGVjdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZC
REI2MUEwMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBQYWdlUnVsZUNvbGxlY3Rvci5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlGQkY4OTA0NDE2OUU5RjFGMDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdS
dWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU0dyb3VwaW5n
UnVsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZDNjNCREIwMTY3QUFCQUMw
MEY5MzgwRiAvKiBDU1NTdXBwb3J0c1J1bGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gQ1NTU3VwcG9ydHNSdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJRkM2M0JEQjExNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1cHBvcnRzUnVsZS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NTdXBwb3J0c1J1bGUuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIyMTIwLDYgKzIyMTI4LDggQEAKIAkJCQlGQzlBMEY3MTE2
NDA5NENGMDAzRDZCOEQgLyogRE9NV2luZG93Q1NTLmNwcCAqLywKIAkJCQlGQzlBMEY3MjE2NDA5
NENGMDAzRDZCOEQgLyogRE9NV2luZG93Q1NTLmggKi8sCiAJCQkJRkM5QTBGNzMxNjQwOTRDRjAw
M0Q2QjhEIC8qIERPTVdpbmRvd0NTUy5pZGwgKi8sCisJCQkJRkJEQjYxOUUxNkQ2MDM2NTAwQkIz
Mzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggKi8sCisJCQkJRkJEQjYxOUExNkQ2MDMyQTAw
QkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCAqLywKIAkJCQk0QTZFOUZDMjEzQzE3
RDFEMDA0NkE3RjggLyogRm9udEZlYXR1cmVWYWx1ZS5oICovLAogCQkJCUE4MEU2Q0M3MEExOTg5
Q0EwMDdGQjhDNSAvKiBGb250VmFsdWUuY3BwICovLAogCQkJCUE4MEU2Q0MzMEExOTg5Q0EwMDdG
QjhDNSAvKiBGb250VmFsdWUuaCAqLywKQEAgLTIyMTU1LDYgKzIyMTY1LDggQEAKIAkJCQlEM0E5
NEEzNTEyMkRBQkFDMDBBMzdCQkMgLyogTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5pZGwgKi8sCiAJ
CQkJRDNBQTEwRjExMjNBOThBQTAwOTIxNTJCIC8qIE1lZGlhUXVlcnlNYXRjaGVyLmNwcCAqLywK
IAkJCQlEM0FBMTBGMjEyM0E5OEFBMDA5MjE1MkIgLyogTWVkaWFRdWVyeU1hdGNoZXIuaCAqLywK
KwkJCQlGQkRCNjFBMDE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCAqLywK
KwkJCQlGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICov
LAogCQkJCUE4MEU2Q0QxMEExOTg5Q0EwMDdGQjhDNSAvKiBQYWlyLmggKi8sCiAJCQkJMzE4OUU2
REIxNkIyMTAzNTAwMzg2RUEzIC8qIHBsdWdJbnMuY3NzICovLAogCQkJCUU0QkJFRDBDMTRGNDAy
NUQwMDNGMEI5OCAvKiBQcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwICovLApAQCAt
MjY2ODUsNiArMjY2OTcsOCBAQAogCQkJCTdFNjZFMjM0MTZENkVCNkMwMEY3RTdGRiAvKiBXZWJH
TENvbXByZXNzZWRUZXh0dXJlQVRDLmggaW4gSGVhZGVycyAqLywKIAkJCQk3RUEzMEY2QTE2REZG
RTc1MDAyNTdEMEIgLyogSlNXZWJHTENvbXByZXNzZWRUZXh0dXJlQVRDLmggaW4gSGVhZGVycyAq
LywKICAJCQkJMkQ4Mjg3RjcxNkU0QTAzODAwODZCRDAwIC8qIEhpdFRlc3RMb2NhdGlvbi5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJRkJEQjYxOUYxNkQ2MDM2NTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxl
Q29sbGVjdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQlGQkRCNjFBMTE2RDYwMzdFMDBCQjMzOTQg
LyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlG
b3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjk4ODcsNiArMjk5MDEs
OCBAQAogCQkJCTdFNjZFMjMzMTZENkVCNkMwMEY3RTdGRiAvKiBXZWJHTENvbXByZXNzZWRUZXh0
dXJlQVRDLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTdFQTMwRjY5MTZERkZFNzUwMDI1N0QwQiAv
KiBKU1dlYkdMQ29tcHJlc3NlZFRleHR1cmVBVEMuY3BwIGluIFNvdXJjZXMgKi8sCiAgCQkJCTJE
ODI4N0Y2MTZFNEEwMzgwMDg2QkQwMCAvKiBIaXRUZXN0TG9jYXRpb24uY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJRkJEQjYxOUIxNkQ2MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9y
LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdl
UnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVw
bG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nz
cy9DU1NBbGxJbk9uZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU0Fs
bEluT25lLmNwcAkocmV2aXNpb24gMTQ1MDMwKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU0Fs
bEluT25lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzEsNyArNzEsOSBAQAogI2luY2x1ZGUgIkNT
U1ZhbHVlUG9vbC5jcHAiCiAjaW5jbHVkZSAiRE9NV2luZG93Q1NTLmNwcCIKICNpbmNsdWRlICJE
b2N1bWVudFJ1bGVTZXRzLmNwcCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAi
CiAjaW5jbHVkZSAiSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAiCisjaW5jbHVkZSAiUGFnZVJ1
bGVDb2xsZWN0b3IuY3BwIgogI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmNwcCIKICNpbmNsdWRlICJS
dWxlU2V0LmNwcCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5jcHAiCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuY3BwCShyZXZpc2lvbiAxNDUwMzAp
CisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUzLDcgKzUzLDcgQEAgdm9pZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjphZGRSdWxl
KFN0eQogdm9pZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1ZXN0cyhi
b29sIGluY2x1ZGVFbXB0eVJ1bGVzLCBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiYgbWF0Y2hSZXF1ZXN0
cykKIHsKICAgICBmb3IgKFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcDo6aXRlcmF0b3IgaXQg
PSBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5iZWdpbigpOyBpdCAhPSBtX3NoYWRvd0Rp
c3RyaWJ1dGVkUnVsZVNldE1hcC5lbmQoKTsgKytpdCkKLSAgICAgICAgbWF0Y2hSZXF1ZXN0cy5h
cHBlbmQoTWF0Y2hSZXF1ZXN0KGl0LT52YWx1ZS5nZXQoKSwgaW5jbHVkZUVtcHR5UnVsZXMsIGl0
LT5rZXksIFNlbGVjdG9yQ2hlY2tlcjo6Q3Jvc3Nlc0JvdW5kYXJ5KSk7CisgICAgICAgIG1hdGNo
UmVxdWVzdHMuYXBwZW5kKE1hdGNoUmVxdWVzdChpdC0+dmFsdWUuZ2V0KCksIGluY2x1ZGVFbXB0
eVJ1bGVzLCBpdC0+a2V5KSk7CiB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYkNvcmUvY3Nz
L0RvY3VtZW50UnVsZVNldHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvRG9j
dW1lbnRSdWxlU2V0cy5oCShyZXZpc2lvbiAxNDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3Mv
RG9jdW1lbnRSdWxlU2V0cy5oCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBAIHB1Ymxp
YzoKICAgICB2b2lkIGFkZFJ1bGUoU3R5bGVSdWxlKiwgc2l6ZV90IHNlbGVjdG9ySW5kZXgsIENv
bnRhaW5lck5vZGUqIHNjb3BlLCBBZGRSdWxlRmxhZ3MpOwogICAgIHZvaWQgY29sbGVjdE1hdGNo
UmVxdWVzdHMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcywgVmVjdG9yPE1hdGNoUmVxdWVzdD4mKTsK
ICAgICB2b2lkIGNsZWFyKCkgeyBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5jbGVhcigp
OyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9zaGFkb3dEaXN0cmlidXRl
ZFJ1bGVTZXRNYXAuaXNFbXB0eSgpOyB9CiBwcml2YXRlOgogICAgIHR5cGVkZWYgSGFzaE1hcDxj
b25zdCBDb250YWluZXJOb2RlKiwgT3duUHRyPFJ1bGVTZXQ+ID4gU2hhZG93RGlzdHJpYnV0ZWRS
dWxlU2V0TWFwOwogICAgIFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcCBtX3NoYWRvd0Rpc3Ry
aWJ1dGVkUnVsZVNldE1hcDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNv
bGxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxl
Q29sbGVjdG9yLmNwcAkocmV2aXNpb24gMTQ0ODkzKQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3Mv
U3R5bGVSZXNvbHZlci5jcHA6MTQ0ODkzKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRS
dWxlQ29sbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUyMDcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAg
ICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRmZWxkIEplbnNlbiAoa2RlQGNhcmV3b2xmLmNv
bSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBOaWNob2xhcyBTaGFua3MgKHdlYmtpdEBu
aWNrc2hhbmtzLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAd2Via2l0
Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJr
aXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5
cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdHlsZVJlc29sdmVy
LmgiCisKKyNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5o
IgorI2luY2x1ZGUgIkNTU0NhbGN1bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NDdXJzb3JJ
bWFnZVZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCisjaW5jbHVk
ZSAiQ1NTRm9udEZhY2VSdWxlLmgiCisjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCisjaW5j
bHVkZSAiQ1NTTGluZUJveENvbnRhaW5WYWx1ZS5oIgorI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgi
CisjaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCisjaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBw
aW5ncy5oIgorI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKKyNpbmNsdWRlICJDU1NSZWZs
ZWN0VmFsdWUuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU1NlbGVj
dG9yTGlzdC5oIgorI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1N1cHBv
cnRzUnVsZS5oIgorI2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKKyNpbmNsdWRl
ICJDU1NWYWx1ZUxpc3QuaCIKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyNpbmNsdWRlICJD
U1NWYXJpYWJsZVZhbHVlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2lu
Y2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDb250ZW50RGF0YS5oIgorI2lu
Y2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRl
ICJDb3VudGVyQ29udGVudC5oIgorI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKKyNpbmNsdWRlICJE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5o
IgorI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKKyNpbmNsdWRlICJGb250VmFsdWUuaCIK
KyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCisjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSFRN
TElGcmFtZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVk
ZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJIVE1MUHJvZ3Jlc3NFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgor
I2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJJbnNlcnRpb25Qb2lu
dC5oIgorI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIktl
eWZyYW1lTGlzdC5oIgorI2luY2x1ZGUgIkxpbmtIYXNoLmgiCisjaW5jbHVkZSAiTG9jYWxlVG9T
Y3JpcHRNYXBwaW5nLmgiCisjaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNYXRy
aXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9ybU9wZXJh
dGlvbi5oIgorI2luY2x1ZGUgIk1lZGlhTGlzdC5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFs
dWF0b3IuaCIKKyNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJOb2RlUmVu
ZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWlyLmgiCisj
aW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJRdW90
ZXNEYXRhLmgiCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgor
I2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhclRo
ZW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGVDb25zdGFudHMuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUaGVtZS5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJSdWxlU2V0LmgiCisjaW5jbHVkZSAiU1ZHRG9j
dW1lbnRFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50LmgiCisjaW5j
bHVkZSAiU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdp
bi5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLmgiCisjaW5jbHVkZSAiU2V0
dGluZ3MuaCIKKyNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCisjaW5jbHVkZSAiU2hhZG93Um9vdC5o
IgorI2luY2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCisjaW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0
cmF0ZWdpZXMuaCIKKyNpbmNsdWRlICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVk
ZSAiU3R5bGVCdWlsZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIlN0eWxlR2VuZXJhdGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZVBlbmRpbmdJbWFnZS5o
IgorI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTZXQuaCIKKyNpbmNsdWRlICJTdHlsZVByb3BlcnR5
U2hvcnRoYW5kLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxl
SW1wb3J0LmgiCisjaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCisjaW5jbHVkZSAiU3R5
bGVTaGVldExpc3QuaCIKKyNpbmNsdWRlICJUZXh0LmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRp
b25NYXRyaXguaCIKKyNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNp
bmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVS
ZXNvbHZlci5oIgorI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKKyNpbmNsdWRlICJXZWJD
b3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVS
dWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1ZGUgIldl
YktpdENTU1JlZ2lvblJ1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZS5o
IgorI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgorI2luY2x1ZGUgIlhNTE5hbWVz
LmgiCisjaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KKyNpbmNs
dWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9N
ZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQor
I2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0ZpbHRlclZh
bHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKKyNpbmNsdWRl
ICJEYXNoYm9hcmRSZWdpb24uaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRl
ICJDYWNoZWRTVkdEb2N1bWVudC5oIgorI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVmZXJl
bmNlLmgiCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJTVkdFbGVtZW50Lmgi
CisjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIKKyNp
bmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJM
RShDU1NfU0hBREVSUykKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5oIgor
I2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRl
ck51bWJlclBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5oIgor
I2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRl
clRyYW5zZm9ybVBhcmFtZXRlci5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgiCisj
aW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5k
aW5nU2hhZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKKyNpbmNsdWRlICJXZWJLaXRD
U1NNaXhGdW5jdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUuaCIK
KyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisjaW5jbHVkZSAiQ1NTSW1hZ2VT
ZXRWYWx1ZS5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKKyNlbmRpZgorCisj
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQorI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKKyNlbmRp
ZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGU8
PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2ViQ29y
ZTo6UnVsZURhdGEqPiB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lkIHJl
cG9ydE1lbW9yeVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5mbyYpIHsgfQorfTsKKworfQorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKyNkZWZp
bmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5oZXJpdCkgeyBcCisgICAg
bV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkp
OyBcCisgICAgcmV0dXJuOyBcCit9CisKKyNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJ
QUwocHJvcCwgUHJvcCkgXAorSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5p
dGlhbCkgeyBcCisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6Omlu
aXRpYWwjI1Byb3AoKSk7IFwKKyAgICByZXR1cm47IFwKK30KKworUmVuZGVyU3R5bGUqIFN0eWxl
UmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKK3N0YXRpYyBTdHlsZVByb3BlcnR5
U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0
eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCisg
ICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24s
IENTU1ZhbHVlTHRyKTsKKyAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOworfQorCitz
dGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0
RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7CisgICAgaWYgKHJpZ2h0VG9MZWZ0
RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENT
U1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7CisgICAgcmV0dXJuIHJpZ2h0VG9MZWZ0
RGVjbC5nZXQoKTsKK30KKworCitpbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0KQorICAg
ICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAgIHJldHVy
biBtX3J1bGVMaXN0LmdldCgpOworfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0
ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKK3sKKyAgICBtX2hhc1VBQXBwZWFyYW5jZSA9
IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKKyAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2UpIHsK
KyAgICAgICAgbV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9yZGVyKCk7CisgICAgICAgIG1fYmFj
a2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExheWVycygpOworICAgICAgICBtX2Jh
Y2tncm91bmRDb2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOworICAgIH0KK30KKwor
aW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKK3sKKyAgICBtX2VsZW1l
bnQgPSAwOworICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7CisgICAgbV9wYXJlbnRTdHlsZSA9IDA7
CisgICAgbV9wYXJlbnROb2RlID0gMDsKKyAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOworICAg
IG1fcnVsZUxpc3QgPSAwOworICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7CisgICAgbV9wZW5k
aW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAg
IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfRklM
VEVSUykgJiYgRU5BQkxFKFNWRykKKyAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIoKTsK
KyNlbmRpZgorfQorCitTdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1
bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgOiBtX21hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgwKQorICAgICwgbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVk
UHJvcGVydGllc0NhY2hlKQorICAgICwgbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAsIG1f
Zm9udFNlbGVjdG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNpZiBFTkFC
TEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIo
Vmlld3BvcnRTdHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1lbnQpKQorI2VuZGlmCisgICAgLCBt
X3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQorICAgICwg
bV9zdHlsZU1hcCh0aGlzKQoreworICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9jdW1l
bnRFbGVtZW50KCk7CisKKyAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0U3R5
bGUocm9vdCk7CisKKyAgICAvLyBjb25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRlZmF1
bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVkCisgICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmll
cyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQgKG1h
eC13aWR0aDogMTBlbSkiCisgICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3RydWN0
b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4sCisgICAgLy8gZG9jdW1lbnQgZG9l
c24ndCBoYXZlIGRvY3VtZW50RWxlbWVudAorICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0
IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKKyAgICAv
LyBpcyBhbHdheXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxlY3Rv
cgorICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52aWV3KCk7CisgICAgaWYgKHZpZXcp
CisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmll
dy0+bWVkaWFUeXBlKCkpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIo
bmV3IE1lZGlhUXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKKworICAgIGlmIChyb290KQorICAgICAg
ICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxsb3dT
dHlsZVNoYXJpbmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKTsKKworICAgIGlmIChtX3Jvb3RE
ZWZhdWx0U3R5bGUgJiYgdmlldykKKyAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVk
aWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9yb290
RGVmYXVsdFN0eWxlLmdldCgpKSk7CisKKyAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5bGUo
KTsKKworICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0
aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCk7CisgICAgbV9ydWxlU2V0cy5p
bml0VXNlclN0eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsKKwor
I2lmIEVOQUJMRShTVkdfRk9OVFMpCisgICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCkp
IHsKKyAgICAgICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9udEZh
Y2VFbGVtZW50cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxlbWVu
dHMoKTsKKyAgICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0
PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNlRWxl
bWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgZm9udFNlbGVjdG9y
KCktPmFkZEZvbnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VSdWxlKCkpOworICAgIH0KKyNlbmRp
ZgorCisgICAgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rpb24t
PmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRzKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFw
cGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVm
UHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQoreworICAgIG1fcnVsZVNldHMuYXBw
ZW5kQXV0aG9yU3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5nZXQo
KSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwg
dGhpcyk7CisgICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+cmVu
ZGVyZXIoKS0+c3R5bGUoKSkKKyAgICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUo
KS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX0RFVklD
RV9BREFQVEFUSU9OKQorICAgIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7Cisj
ZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVtZW50
KiBwYXJlbnQpCit7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9IHBh
cmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOworCisgICAgLy8gV2UgYXJlIG5vdCBh
bHdheXMgaW52b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0aW9u
IGNhbiBjYXVzZSB1cyB0byBlbnRlcgorICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlkZGxl
IG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hlcmUg
d2l0aGluIHRoZSB0cmVlLgorICAgIC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2UsIG9y
IGlmIHdlIHNlZSBhIG5ldyByb290IGVsZW1lbnQuCisgICAgLy8gT3RoZXJ3aXNlIGp1c3QgcHVz
aCB0aGUgbmV3IHBhcmVudC4KKyAgICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3RvckZp
bHRlci5wYXJlbnRTdGFja0lzRW1wdHkoKSkKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5zZXR1
cFBhcmVudFN0YWNrKHBhcmVudCk7CisgICAgZWxzZQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVy
LnB1c2hQYXJlbnQocGFyZW50KTsKKworICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBTaGFk
b3dSb290IG5vZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCisgICAgaWYgKG1fc2NvcGVSZXNvbHZl
cikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJlbnRP
clNoYWRvd0hvc3ROb2RlKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudEVs
ZW1lbnQoRWxlbWVudCogcGFyZW50KQoreworICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0IGlu
dm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVyaW5n
IHN0eWxlIHJlc29sdmUuCisgICAgLy8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGluIHRo
aXMgY2FzZS4KKyAgICBpZiAobV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVu
dChwYXJlbnQpKQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOworICAgIGlm
IChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVudCk7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hh
ZG93Um9vdCogc2hhZG93Um9vdCkKK3sKKyAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsK
KyAgICBpZiAobV9zY29wZVJlc29sdmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2go
c2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
Ojpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCit7Cisg
ICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikK
KyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7Cit9CisKKy8vIFRoaXMg
aXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0eWxl
cwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVS
dWxlS2V5ZnJhbWVzPiBydWxlKQoreworICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUoKSk7
CisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7Cit9CisKK1N0eWxl
UmVzb2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKK3sKKyAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xlYXJE
b2N1bWVudCgpOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBtX3Zp
ZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOworI2VuZGlmCit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVz
b2x2ZXI+KikKK3sKKyAgICAvLyBMb29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcgYSBz
dHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCisgICAg
Ly8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24gY2F1
c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxlKCkKKyAgICAvLyBvciBwcmVzZW50
YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUgd2l0
aCB0aGUgbGFzdCByZWYgb24gdGhlIG9sZCBvbmUuCisgICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4g
dG9SZW1vdmU7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hl
OjppdGVyYXRvciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7CisgICAgZm9y
ICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+
JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsraSkg
eworICAgICAgICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhhc09u
ZVJlZigpKSB7CisgICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCisgICAgICAgIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1vdmVbaV0pOworCisgICAgbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJl
c3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxl
LCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlX
aGl0ZWxpc3RUeXBlKQoreworICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3co
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7CisgICAgTWF0Y2hlZFBy
b3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5s
YXN0KCk7CisgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVBy
b3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBl
ID0gbGlua01hdGNoVHlwZTsKKyAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9w
ZXJ0eVdoaXRlbGlzdFR5cGU7CisgICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChy
dWxlKTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJv
cGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0KQorICAg
ICAgICByZXR1cm47CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCk7CisgICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRo
b3JSdWxlID09IC0xKQorICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJl
c3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7CisgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVz
dWx0LCBwcm9wZXJ0eVNldCk7CisgICAgaWYgKCFpc0NhY2hlYWJsZSkKKyAgICAgICAgcmVzdWx0
LmlzQ2FjaGVhYmxlID0gZmFsc2U7Cit9CisKK2NsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsK
K3B1YmxpYzoKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOworICAgIH5NYXRjaGluZ1VBUnVs
ZXNTY29wZSgpOworCisgICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKKworcHJp
dmF0ZToKKyAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKK307CisKK01hdGNoaW5n
VUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgQVNTRVJUKCFtX21h
dGNoaW5nVUFSdWxlcyk7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOworfQorCitNYXRj
aGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKK3sKKyAgICBtX21hdGNo
aW5nVUFSdWxlcyA9IGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29w
ZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQoreworICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsK
K30KKworYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxz
ZTsKKwordm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRj
aFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgQVNT
RVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKKyAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkp
OworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0g
c3RhdGUuZWxlbWVudCgpOworICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQg
PSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9J
ZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7CisgICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOworICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1l
bnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
fQorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVs
ZW1lbnQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cisj
ZW5kaWYKKyAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBs
aWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgorICAg
IC8vIGEpIGl0J3MgYSBVQSBydWxlCisgICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1
dGhvciBydWxlcworICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxl
IHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCisgICAgVHJlZVNjb3BlKiB0cmVlU2Nv
cGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKKyAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3Bl
Ojppc01hdGNoaW5nVUFSdWxlcygpCisgICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9y
U3R5bGVzKCkKKyAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0
LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCisgICAgICAgICYmIG1hdGNoUmVxdWVz
dC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3Vu
ZGFyeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBy
dWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZl
ciBhbmQKKyAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KKyAgICBpZiAoZWxlbWVudC0+aGFz
SUQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxl
ZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
dHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMo
c3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCisgICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVk
b0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChTZWxlY3Rv
ckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQorICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRv
Q2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5s
b2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJl
cXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghbV9zdGF0ZS5yZWdpb25G
b3JTdHlsaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIHNpemUgPSBtYXRj
aFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBD
U1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdp
b25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKKyAgICAgICAgaWYgKGNoZWNr
UmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0
YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKKyAgICAgICAgICAgIFJ1bGVTZXQq
IHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5k
UnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKKyAgICAgICAgICAgIEFTU0VSVChyZWdpb25S
dWxlcyk7CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVn
aW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNj
b3BlKSwgcnVsZVJhbmdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29s
dmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3sK
KyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSos
IDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7CisgICAgaWYgKG1hdGNo
ZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNvcnRNYXRjaGVkUnVs
ZXMoKTsKKworICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0
aW5nUnVsZXMpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxl
cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVz
KCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBv
ZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgorICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAg
ICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9u
QXR0cmlidXRlU2VsZWN0b3IoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1
ZSgpOworICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tp
XS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVk
UnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRl
bGlzdFR5cGUoKSk7CisgICAgfQorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVk
QXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykK
K3sKKyNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBp
ZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggc2Nv
cGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAo
cmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KKyAgICBpZiAobV9zY29wZVJlc29s
dmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29u
c2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7CisgICAgICAgIGJvb2wgYXBwbHlBdXRob3JT
dHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVz
KCk7CisgICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7CisgICAgICAgIHVuc2lnbmVk
IHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgeworICAgICAgICAgICAgbV9zdGF0
ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAg
ICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9z
Y29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7CisgICAgICAgICAgICBkb2N1bWVudFNjb3Bl
ID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKKyAg
ICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBs
eUF1dGhvclN0eWxlcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVz
U3R5bGVCb3VuZHMoZnJhbWUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5t
X3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAgICAgICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwor
ICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OworICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOworICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJl
c3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAg
VU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCitpbmxpbmUgYm9v
bCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkK
K3sKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYm
IG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyht
X3N0YXRlLmVsZW1lbnQoKSk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQs
IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAg
QVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7CisKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNs
ZWFyKCk7CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVs
ZXM7CisgICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQo
KSwgbWF0Y2hlZFJ1bGVzKTsKKyAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsg
aSA+IDA7IC0taSkgeworICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdl
cy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hS
ZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5l
bGVtZW50KCkpLCBydWxlUmFuZ2UpOworICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMocmVzdWx0KTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAgVU5V
U0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKK3sKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAg
cmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxOworCisgICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlcXVlc3Qg
bWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMp
OworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5n
ZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
KyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgVmVjdG9yPE1hdGNoUmVxdWVzdD4gbWF0
Y2hSZXF1ZXN0czsKKyAgICBtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5jb2xs
ZWN0TWF0Y2hSZXF1ZXN0cyhpbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQorICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOworI2Vu
ZGlmCisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKworICAgIG1h
dGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Cit9CisKK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkp
CisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFy
KCk7CisKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOworICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxl
U2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxl
UmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hV
QVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQoreworICAgIG1fc3Rh
dGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICAKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBSdWxlUmFu
Z2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
Ojpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVs
ZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5n
ZSkKK3sKKyAgICBpZiAoIXJ1bGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBTdGF0ZSYgc3Rh
dGUgPSBtX3N0YXRlOworICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5n
IHVwIHN0eWxlIGZvciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2
ZSB0cmVlIHJlc29sdmUuCisgICAgLy8gQW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3Qg
YmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRo
LgorICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3Rh
Y2tJc0NvbnNpc3RlbnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZp
b3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnk7CisK
KyAgICB1bnNpZ25lZCBzaXplID0gcnVsZXMtPnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9
IHJ1bGVzLT5hdChpKTsKKyAgICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3Rv
ckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291
bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5y
dWxlKCk7CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoZG9jdW1lbnQoKSwgcnVsZSwg
dGhpcyk7CisgICAgICAgIFBzZXVkb0lkIGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAg
ICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQ
c2V1ZG8sIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkpKSB7CisgICAgICAgICAgICAv
LyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQg
aW4gdGhlIG5vbi1kZWJ1ZyBtb2RlLgorICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNl
dCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmICghcHJv
cGVydGllcyB8fCAocHJvcGVydGllcy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVk
ZUVtcHR5UnVsZXMpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
OjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1z
dGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMgQVBJIHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24g
dGhpcyBpcyBuZWVkZWQuCisgICAgICAgICAgICBpZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgp
ICYmICFydWxlRGF0YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKKyAgICAgICAgICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNl
KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IC8vIElmIHdlJ3JlIG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgor
ICAgICAgICAgICAgLy8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50Lgor
ICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRv
U3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKKyAgICAgICAgICAgICAgICBp
ZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7Cisg
ICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJTVF9JTlRF
Uk5BTF9QU0VVRE9JRCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SGFz
UHNldWRvU3R5bGUoZHluYW1pY1BzZXVkbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4gdGhlIG1h
dGNoZWQgcnVsZXMgYXJyYXkuCisgICAgICAgICAgICAgICAgKytydWxlUmFuZ2UubGFzdFJ1bGVJ
bmRleDsKKyAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID09IC0x
KQorICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBydWxlUmFu
Z2UubGFzdFJ1bGVJbmRleDsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8g
b3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KKyAgICAgICAgICAgICAgICBtX3N0YXRlLmFkZE1h
dGNoZWRSdWxlKCZydWxlRGF0YSk7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29uc3QgUnVsZURhdGEqIHIxLCBjb25zdCBSdWxl
RGF0YSogcjIpCit7CisgICAgdW5zaWduZWQgc3BlY2lmaWNpdHkxID0gcjEtPnNwZWNpZmljaXR5
KCk7CisgICAgdW5zaWduZWQgc3BlY2lmaWNpdHkyID0gcjItPnNwZWNpZmljaXR5KCk7CisgICAg
cmV0dXJuIChzcGVjaWZpY2l0eTEgPT0gc3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlvbigpIDwg
cjItPnBvc2l0aW9uKCkgOiBzcGVjaWZpY2l0eTEgPCBzcGVjaWZpY2l0eTI7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6c29ydE1hdGNoZWRSdWxlcygpCit7CisgICAgc3RkOjpzb3J0KG1fc3Rh
dGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwg
Y29tcGFyZVJ1bGVzKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQoreworICAgIG1h
dGNoVUFSdWxlcyhyZXN1bHQpOworCisgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVs
ZXMuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaFVz
ZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBhdXRob3IgcnVsZXMs
IGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMgbWFwcGVkIGZy
b20gSFRNTC4KKyAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgYWRk
RWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5w
cmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKworICAgICAgICAvLyBOb3cgd2UgY2hlY2sg
YWRkaXRpb25hbCBtYXBwZWQgZGVjbGFyYXRpb25zLgorICAgICAgICAvLyBUYWJsZXMgYW5kIHRh
YmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFw
cGxpZWQKKyAgICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBl
ZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KKyAg
ICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAg
ICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAg
ICAgICAgIGJvb2wgaXNBdXRvOworICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0
aW9uID0gdG9IVE1MRWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFs
aXR5SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlzQXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRv
KQorICAgICAgICAgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVj
dGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xh
cmF0aW9uKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRoZSBydWxl
cyBpbiBhdXRob3Igc2hlZXRzIG5leHQuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzKQorICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworCisgICAgLy8g
Tm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgorICAgIGlmIChtX21hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgeworICAgICAgICAvLyBJbmxpbmUgc3R5bGUg
aXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KKyAgICAg
ICAgLy8gRklYTUU6IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9i
bGVtcyB3aXRoIGNhY2hpbmcuCisgICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9
ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxlKCkgJiYg
IW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgpOworICAgICAgICAvLyBG
SVhNRTogQ29uc3RpZnkuCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0
LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNh
Y2hlYWJsZSk7CisgICAgfQorCisjaWYgRU5BQkxFKFNWRykKKyAgICAvLyBOb3cgY2hlY2sgU01J
TCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5bGUuCisgICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGll
cyAmJiBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIGFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4o
bV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwg
ZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVk
ZVNNSUxQcm9wZXJ0aWVzKTsKKyNlbmRpZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNsYXNz
TmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NOYW1lcykg
Y29uc3QKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7
ICsraSkgeworICAgICAgICBpZiAobV9ydWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVz
LmNvbnRhaW5zKGNsYXNzTmFtZXNbaV0uaW1wbCgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQoreworICAgIG1fZWxlbWVudCA9IGU7
CisgICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRp
Y19jYXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7CisgICAgbV9lbGVtZW50TGlua1N0YXRlID0g
ZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRl
KGUpIDogTm90SW5zaWRlTGluazsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6aW5p
dEVsZW1lbnQoRWxlbWVudCogZSkKK3sKKyAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkg
eworICAgICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOworICAgICAgICBpZiAoZSAmJiBlID09
IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBlLT5kb2N1
bWVudCgpLT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAg
ICAgICBlLT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZh
bHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6
U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50KiBl
LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNl
dWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7CisgICAg
bV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJlcXVlc3Q7CisgICAgbV9yZWdpb25G
b3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKKworICAgIGlmIChlKSB7CisgICAgICAgIE5v
ZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQoZSk7CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IGNv
bnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CisgICAgICAgIG1fcGFyZW50
U3R5bGUgPSBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpID8gMCA6CisgICAgICAgICAg
ICBwYXJlbnRTdHlsZSA/IHBhcmVudFN0eWxlIDoKKyAgICAgICAgICAgIG1fcGFyZW50Tm9kZSA/
IG1fcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA6IDA7CisgICAgICAgIG1fZGlzdHJpYnV0ZWRU
b0luc2VydGlvblBvaW50ID0gY29udGV4dC5pbnNlcnRpb25Qb2ludCgpOworICAgIH0gZWxzZSB7
CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IDA7CisgICAgICAgIG1fcGFyZW50U3R5bGUgPSBwYXJl
bnRTdHlsZTsKKyAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBmYWxzZTsK
KyAgICB9CisKKyAgICBOb2RlKiBkb2NFbGVtZW50ID0gZSA/IGUtPmRvY3VtZW50KCktPmRvY3Vt
ZW50RWxlbWVudCgpIDogMDsKKyAgICBSZW5kZXJTdHlsZSogZG9jU3R5bGUgPSBkb2N1bWVudC0+
cmVuZGVyU3R5bGUoKTsKKyAgICBtX3Jvb3RFbGVtZW50U3R5bGUgPSBkb2NFbGVtZW50ICYmIGUg
IT0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlclN0eWxlKCkgOiBkb2NTdHlsZTsKKwor
ICAgIG1fc3R5bGUgPSAwOworICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwor
ICAgIG1fcnVsZUxpc3QgPSAwOworICAgIG1fZm9udERpcnR5ID0gZmFsc2U7Cit9CisKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgPSAxMDsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCA9IDEwOworCitzdGF0aWMgaW5s
aW5lIGJvb2wgcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhjb25zdCBFbGVtZW50KiBwYXJl
bnRFbGVtZW50KQoreworICAgIGlmICghcGFyZW50RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIHJldHVybiBwYXJlbnRFbGVtZW50LT5oYXNGbGFnc1NldER1cmluZ1N0eWxpbmdP
ZkNoaWxkcmVuKCk7Cit9CisKK05vZGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZUNvdXNpbkxpc3Qo
RWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3QKK3sKKyAg
ICBpZiAodmlzaXRlZE5vZGVDb3VudCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgKiBjU3R5bGVT
ZWFyY2hMZXZlbFRocmVzaG9sZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwYXJlbnQg
fHwgIXBhcmVudC0+aXNTdHlsZWRFbGVtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlm
IChwYXJlbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIFN0eWxlZEVsZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4ocGFyZW50
KTsKKyAgICBpZiAocC0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgRU5B
QkxFKFNWRykKKyAgICBpZiAocC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxl
bWVudCo+KHApLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisjZW5kaWYKKyAgICBpZiAocC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCku
aWRzSW5SdWxlcy5jb250YWlucyhwLT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gcC0+cmVu
ZGVyU3R5bGUoKTsKKyAgICB1bnNpZ25lZCBzdWJjb3VudCA9IDA7CisgICAgTm9kZSogdGhpc0Nv
dXNpbiA9IHA7CisgICAgTm9kZSogY3VycmVudE5vZGUgPSBwLT5wcmV2aW91c1NpYmxpbmcoKTsK
KworICAgIC8vIFJlc2VydmUgdGhlIHRyaWVzIGZvciB0aGlzIGxldmVsLiBUaGlzIGVmZmVjdGl2
ZWx5IG1ha2VzIHN1cmUgdGhhdCB0aGUgYWxnb3JpdGhtCisgICAgLy8gd2lsbCBuZXZlciBnbyBk
ZWVwZXIgdGhhbiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCBsZXZlbHMgaW50byByZWN1cnNp
b24uCisgICAgdmlzaXRlZE5vZGVDb3VudCArPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQ7CisgICAg
d2hpbGUgKHRoaXNDb3VzaW4pIHsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7CisgICAg
ICAgICAgICArK3N1YmNvdW50OworICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLT5yZW5kZXJT
dHlsZSgpID09IHBhcmVudFN0eWxlICYmIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKQorICAgICAg
ICAgICAgICAgICYmIGN1cnJlbnROb2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgIXBhcmVudEVsZW1l
bnRQcmV2ZW50c1NoYXJpbmcodG9FbGVtZW50KGN1cnJlbnROb2RlKSkKKyNpZiBFTkFCTEUoU0hB
RE9XX0RPTSkKKyAgICAgICAgICAgICAgICAmJiAhdG9FbGVtZW50KGN1cnJlbnROb2RlKS0+c2hh
ZG93KCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIC8vIEFk
anVzdCBmb3IgdW51c2VkIHJlc2VydmVkIHRyaWVzLgorICAgICAgICAgICAgICAgIHZpc2l0ZWRO
b2RlQ291bnQgLT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkIC0gc3ViY291bnQ7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChzdWJjb3VudCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2Rl
LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50Tm9kZSA9IGxv
Y2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNv
dW50KTsKKyAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnROb2RlOworICAgIH0KKworICAgIHJl
dHVybiAwOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1h
dGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCit7CisgICAgaWYgKCFydWxlU2V0KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwor
CisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKKyAg
ICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOworICAgIFJ1bGVS
YW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOworICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKKyAgICBt
X3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgaWYg
KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRF
bGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7CisgICAgSFRNTElucHV0RWxlbWVudCogdGhpc0lucHV0RWxlbWVudCA9IGVsZW1lbnQtPnRv
SW5wdXRFbGVtZW50KCk7CisgICAgSFRNTElucHV0RWxlbWVudCogb3RoZXJJbnB1dEVsZW1lbnQg
PSBzdGF0ZS5lbGVtZW50KCktPnRvSW5wdXRFbGVtZW50KCk7CisKKyAgICBpZiAoIXRoaXNJbnB1
dEVsZW1lbnQgfHwgIW90aGVySW5wdXRFbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSAhPSBvdGhlcklucHV0RWxl
bWVudC0+ZWxlbWVudERhdGEoKSkgeworICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFz
dEdldEF0dHJpYnV0ZSh0eXBlQXR0cikgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRy
aWJ1dGUodHlwZUF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAo
dGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0cikpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzQXV0
b2ZpbGxlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVj
a2VkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNoZWNrZWQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5h
dGUoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpICE9IG90
aGVySW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmIChlbGVtZW50LT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKGVsZW1lbnQtPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSAhPSBzdGF0ZS5lbGVtZW50KCkt
PmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKHN0YXRlLmRvY3VtZW50KCktPmNvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKCkpIHsKKyAg
ICAgICAgYm9vbCB3aWxsVmFsaWRhdGUgPSBlbGVtZW50LT53aWxsVmFsaWRhdGUoKTsKKworICAg
ICAgICBpZiAod2lsbFZhbGlkYXRlICE9IHN0YXRlLmVsZW1lbnQoKS0+d2lsbFZhbGlkYXRlKCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAm
JiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpZiAoZWxlbWVudC0+aXNJblJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgp
LT5pc0luUmFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAo
ZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2Uo
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworc3RhdGljIGlubGluZSBib29sIGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKEVsZW1lbnQq
IGVsZW1lbnQpCit7CisgICAgLy8gRklYTUU6IFRoaXMgbGluZSBpcyBzdXJwcmlzaW5nbHkgaG90
LCB3ZSBtYXkgd2lzaCB0byBpbmxpbmUgaGFzRGlyZWN0aW9uQXV0byBpbnRvIFN0eWxlUmVzb2x2
ZXIuCisgICAgcmV0dXJuIGVsZW1lbnQtPmlzSFRNTEVsZW1lbnQoKSAmJiB0b0hUTUxFbGVtZW50
KGVsZW1lbnQpLT5oYXNEaXJlY3Rpb25BdXRvKCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6
c2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHls
ZWRFbGVtZW50KiBzaGFyaW5nQ2FuZGlkYXRlKSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZWxlbWVudERhdGEoKSA9
PSBzaGFyaW5nQ2FuZGlkYXRlLT5lbGVtZW50RGF0YSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5n
QXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFu
Z0F0dHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+
ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0
dHJpYnV0ZShsYW5nQXR0cikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghc3Rh
dGUuZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkpIHsKKyAgICAgICAgaWYgKHNoYXJpbmdD
YW5kaWRhdGUtPmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzaGFyaW5n
Q2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0gZWxzZSBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSkgeworI2lmIEVOQUJMRShT
VkcpCisgICAgICAgIC8vIFNWRyBlbGVtZW50cyByZXF1aXJlIGEgKHNsb3chKSBnZXRBdHRyaWJ1
dGUgY29tcGFyaXNpb24gYmVjYXVzZSAiY2xhc3MiIGlzIGFuIGFuaW1hdGFibGUgYXR0cmlidXRl
IGZvciBTVkcuCisgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKSB7
CisgICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRy
KSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAg
ICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSAhPSBzaGFyaW5nQ2FuZGlkYXRl
LT5jbGFzc05hbWVzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworI2lmIEVOQUJM
RShTVkcpCisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1
dGVTdHlsZSgpICE9IHNoYXJpbmdDYW5kaWRhdGUtPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5U
KQorICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmhhc1RhZ05hbWUocHJvZ3Jlc3NUYWcpKSB7Cisg
ICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc3RhdGUuZWxlbWVu
dCgpKS0+aXNEZXRlcm1pbmF0ZSgpICE9IHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQq
PihzaGFyaW5nQ2FuZGlkYXRlKS0+aXNEZXRlcm1pbmF0ZSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5
bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqIGVsZW1l
bnQpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gZWxlbWVudC0+cmVuZGVyU3R5
bGUoKTsKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKCFzdHls
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPmhhc1VuaXF1ZVBzZXVkb1N0eWxlKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+dGFnUU5hbWUoKSAhPSBz
dGF0ZS5lbGVtZW50KCktPnRhZ1FOYW1lKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoZWxlbWVudC0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
IChlbGVtZW50LT5uZWVkc1N0eWxlUmVjYWxjKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgIGlmIChlbGVtZW50LT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNf
Y2FzdDxTVkdFbGVtZW50Kj4oZWxlbWVudCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5r
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT5ob3ZlcmVkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5ob3ZlcmVkKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+YWN0aXZlKCkgIT0gc3Rh
dGUuZWxlbWVudCgpLT5hY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChl
bGVtZW50LT5mb2N1c2VkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5mb2N1c2VkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPnNoYWRvd1BzZXVkb0lkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0
eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAh
PSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVT
dHlsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aGFzSUQo
KSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhlbGVtZW50LT5p
ZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoZWxlbWVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBzaGFyZSBzdHlsZSBmb3Igb3B0aW9u
IGFuZCBvcHRncm91cCB3aGVuZXZlciBwb3NzaWJsZS4KKyAgICAvLyBCZWZvcmUgZG9pbmcgc28s
IHdlIG5lZWQgdG8gcmVzb2x2ZSBpc3N1ZXMgaW4gSFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xp
c3RJdGVtcworICAgIC8vIGFuZCBSZW5kZXJNZW51TGlzdDo6c2V0VGV4dC4gU2VlIGFsc28gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg4NDA1CisgICAgaWYgKGVsZW1l
bnQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGdyb3Vw
VGFnKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBpc0NvbnRyb2wgPSBlbGVt
ZW50LT5pc0Zvcm1Db250cm9sRWxlbWVudCgpOworCisgICAgaWYgKGlzQ29udHJvbCAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzRm9ybUNvbnRyb2xFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChpc0NvbnRyb2wgJiYgIWNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChlbGVt
ZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0eWxlLT50cmFuc2l0aW9u
cygpIHx8IHN0eWxlLT5hbmltYXRpb25zKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBUdXJuIG9mZiBzdHlsZSBzaGFy
aW5nIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnYWluIGxheWVycyBmb3IgcmVhc29ucyBvdXRzaWRl
IG9mIHRoZSBzdHlsZSBzeXN0ZW0uCisgICAgLy8gU2VlIGNvbW1lbnRzIGluIFJlbmRlck9iamVj
dDo6c2V0U3R5bGUoKS4KKyAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVUYWcpIHx8
IGVsZW1lbnQtPmhhc1RhZ05hbWUoZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZW1i
ZWRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGFwcGxldFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShjYW52YXNUYWcpCisjaWYg
RU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8pCisgICAgICAgIC8vIFdpdGggcHJveHlpbmcs
IHRoZSBtZWRpYSBlbGVtZW50cyBhcmUgYmFja2VkIGJ5IGEgUmVuZGVyRW1iZWRkZWRPYmplY3Qu
CisgICAgICAgIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUodmlkZW9UYWcpIHx8IGVsZW1lbnQtPmhh
c1RhZ05hbWUoYXVkaW9UYWcpCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisjZW5kaWYKKworICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhlbGVtZW50KSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICYmIHN0
YXRlLmVsZW1lbnRMaW5rU3RhdGUoKSAhPSBzdHlsZS0+aW5zaWRlTGluaygpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgLy8gRGVueSBzaGFy
aW5nIHN0eWxlcyBiZXR3ZWVuIFdlYlZUVCBhbmQgbm9uLVdlYlZUVCBub2Rlcy4KKyAgICBpZiAo
ZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVs
ZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzV2Vi
VlRURWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkgJiYgdG9X
ZWJWVFRFbGVtZW50KGVsZW1lbnQpLT5pc1Bhc3ROb2RlKCkgIT0gdG9XZWJWVFRFbGVtZW50KHN0
YXRlLmVsZW1lbnQoKSktPmlzUGFzdE5vZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2Vu
ZGlmCisKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgaWYgKGVsZW1lbnQgPT0gZWxl
bWVudC0+ZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkgfHwgc3Rh
dGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVu
RWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworaW5saW5lIFN0eWxlZEVsZW1lbnQqIFN0eWxlUmVzb2x2ZXI6OmZpbmRTaWJsaW5n
Rm9yU3R5bGVTaGFyaW5nKE5vZGUqIG5vZGUsIHVuc2lnbmVkJiBjb3VudCkgY29uc3QKK3sKKyAg
ICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPnByZXZpb3VzU2libGluZygpKSB7CisgICAgICAg
IGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgaWYgKGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChzdGF0aWNfY2FzdDxTdHlsZWRFbGVt
ZW50Kj4obm9kZSkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjb3VudCsrID09
IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOworfQorCitSZW5kZXJT
dHlsZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hhcmVkU3R5bGUoKQoreworICAgIFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKCFzdGF0ZS5zdHlsZWRFbGVtZW50KCkgfHwgIXN0YXRl
LnBhcmVudFN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gSWYgdGhlIGVsZW1l
bnQgaGFzIGlubGluZSBzdHlsZSBpdCBpcyBwcm9iYWJseSB1bmlxdWUuCisgICAgaWYgKHN0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYg
RU5BQkxFKFNWRykKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQo
KSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5p
bWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisg
ICAgLy8gSWRzIHN0b3Agc3R5bGUgc2hhcmluZyBpZiB0aGV5IHNob3cgdXAgaW4gdGhlIHN0eWxl
c2hlZXRzLgorICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc0lEKCkgJiYgbV9ydWxl
U2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiAwOworICAg
IGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50
RWxlbWVudCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
aWYgKHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKHN0YXRlLmVs
ZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQ2FjaGUgd2hldGhlciBzdGF0
ZS5lbGVtZW50IGlzIGFmZmVjdGVkIGJ5IGFueSBrbm93biBjbGFzcyBzZWxlY3RvcnMuCisgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkbid0IGJlIGEgbWVtYmVyIHZhcmlhYmxlLiBUaGUgc3R5bGUg
c2hhcmluZyBjb2RlIGNvdWxkIGJlIGZhY3RvcmVkIG91dCBvZiBTdHlsZVJlc29sdmVyLgorICAg
IHN0YXRlLnNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhzdGF0ZS5lbGVtZW50KCkgJiYg
c3RhdGUuZWxlbWVudCgpLT5oYXNDbGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMo
c3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkpKTsKKworICAgIC8vIENoZWNrIHByZXZpb3Vz
IHNpYmxpbmdzIGFuZCB0aGVpciBjb3VzaW5zLgorICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAg
ICB1bnNpZ25lZCB2aXNpdGVkTm9kZUNvdW50ID0gMDsKKyAgICBTdHlsZWRFbGVtZW50KiBzaGFy
ZUVsZW1lbnQgPSAwOworICAgIE5vZGUqIGNvdXNpbkxpc3QgPSBzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPnByZXZpb3VzU2libGluZygpOworICAgIHdoaWxlIChjb3VzaW5MaXN0KSB7CisgICAgICAg
IHNoYXJlRWxlbWVudCA9IGZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKGNvdXNpbkxpc3QsIGNv
dW50KTsKKyAgICAgICAgaWYgKHNoYXJlRWxlbWVudCkKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjb3VzaW5MaXN0ID0gbG9jYXRlQ291c2luTGlzdChjb3VzaW5MaXN0LT5wYXJlbnRFbGVt
ZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZXho
YXVzdGVkIGFsbCBvdXIgYnVkZ2V0IG9yIG91ciBjb3VzaW5zLgorICAgIGlmICghc2hhcmVFbGVt
ZW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIENhbid0IHNoYXJlIGlmIHNpYmxpbmcg
cnVsZXMgYXBwbHkuIFRoaXMgaXMgY2hlY2tlZCBhdCB0aGUgZW5kIGFzIGl0IHNob3VsZCByYXJl
bHkgZmFpbC4KKyAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9y
dWxlU2V0cy5zaWJsaW5nKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBDYW4ndCBzaGFy
ZSBpZiBhdHRyaWJ1dGUgcnVsZXMgYXBwbHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0
ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMudW5jb21tb25BdHRyaWJ1dGUoKSkpCisgICAgICAg
IHJldHVybiAwOworICAgIC8vIENhbid0IHNoYXJlIGlmIEBob3N0IEAtcnVsZXMgYXBwbHkuCisg
ICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgLy8gVHJhY2tpbmcgY2hpbGQgaW5kZXggcmVxdWlyZXMgdW5pcXVlIHN0
eWxlIGZvciBlYWNoIG5vZGUuIFRoaXMgbWF5IGdldCBzZXQgYnkgdGhlIHNpYmxpbmcgcnVsZSBt
YXRjaCBhYm92ZS4KKyAgICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5l
bGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVy
biBzaGFyZUVsZW1lbnQtPnJlbmRlclN0eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgTWF0Y2hpbmdVQVJ1bGVz
U2NvcGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2Vy
IGFnZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1
bHRTdHlsZVNoZWV0KQorICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICBS
dWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3Bl
Y2lmaWMoInByaW50IikKKyAgICAgICAgPyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQ
cmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7CisgICAgbWF0
Y2hVQVJ1bGVzKHJlc3VsdCwgdXNlckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWly
a3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQu
CisgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVs
ZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7CisK
KyAgICAvLyBJZiBkb2N1bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3Vy
Y2UgbW9kZSBvciBpbiB4bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20g
dGhlIHZpZXcgc291cmNlIHN0eWxlIHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdT
b3VyY2UoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBh
Z2luYXRpb25Nb2RlKFBhZ2luYXRpb246Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxl
KiBzdHlsZSkKK3sKKyAgICBpZiAocGFnaW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdp
bmF0ZWQpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgc3dpdGNoIChwYWdpbmF0aW9u
TW9kZSkgeworICAgIGNhc2UgUGFnaW5hdGlvbjo6TGVmdFRvUmlnaHRQYWdpbmF0ZWQ6CisgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUt
PnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBO
b3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+
aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6
IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdp
bmF0aW9uOjpSaWdodFRvTGVmdFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4
aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24o
c3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lv
biA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
c3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5n
TW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Np
b24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlRvcFRvQm90dG9tUGFn
aW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMp
OworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dy
aXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9n
cmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9n
cmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFBhZ2luYXRpb246OkJvdHRvbVRvVG9wUGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+
c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJv
Z3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1u
UHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlVucGFn
aW5hdGVkOgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihjb25zdCBS
ZW5kZXJTdHlsZSogc3R5bGUsIEZvbnRPcmllbnRhdGlvbiYgZm9udE9yaWVudGF0aW9uLCBOb25D
SktHbHlwaE9yaWVudGF0aW9uJiBnbHlwaE9yaWVudGF0aW9uKQoreworICAgIGlmIChzdHlsZS0+
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgeworICAgICAgICBmb250T3JpZW50YXRpb24gPSBI
b3Jpem9udGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRh
dGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2gg
KHN0eWxlLT50ZXh0T3JpZW50YXRpb24oKSkgeworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVmVy
dGljYWxSaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAg
IGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsK
KyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVXByaWdodDoKKyAgICAg
ICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24g
PSBOb25DSktHbHlwaE9yaWVudGF0aW9uVXByaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXM6CisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01v
ZGUoKSA9PSBMZWZ0VG9SaWdodFdyaXRpbmdNb2RlKSB7CisgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyBzaG91bGQgbWFwIHRvIHNpZGV3YXlzLWxlZnQsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQg
eWV0LgorICAgICAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgICAg
ICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9udE9yaWVudGF0aW9u
ID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0T3Jp
ZW50YXRpb25TaWRld2F5c1JpZ2h0OgorICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9u
dGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZl
cnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsK
KyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNh
bFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiBkb2N1bWVudCwg
Q1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZG9j
dW1lbnQtPmZyYW1lKCk7CisKKyAgICAvLyBIVE1MNSBzdGF0ZXMgdGhhdCBzZWFtbGVzcyBpZnJh
bWVzIHNob3VsZCByZXBsYWNlIGRlZmF1bHQgQ1NTIHZhbHVlcworICAgIC8vIHdpdGggdmFsdWVz
IGluaGVyaXRlZCBmcm9tIHRoZSBjb250YWluaW5nIGlmcmFtZSBlbGVtZW50LiBIb3dldmVyLAor
ICAgIC8vIHNvbWUgdmFsdWVzIChzdWNoIGFzIHRoZSBjYXNlIG9mIGRlc2lnbk1vZGUgPSAib24i
KSBzdGlsbCBuZWVkIHRvCisgICAgLy8gYmUgc2V0IGJ5IHRoaXMgImRvY3VtZW50IHN0eWxlIi4K
KyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3Jl
YXRlKCk7CisgICAgYm9vbCBzZWFtbGVzc1dpdGhQYXJlbnQgPSBkb2N1bWVudC0+c2hvdWxkRGlz
cGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCk7CisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkg
eworICAgICAgICBSZW5kZXJTdHlsZSogaWZyYW1lU3R5bGUgPSBkb2N1bWVudC0+c2VhbWxlc3NQ
YXJlbnRJRnJhbWUoKS0+cmVuZGVyU3R5bGUoKTsKKyAgICAgICAgaWYgKGlmcmFtZVN0eWxlKQor
ICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+aW5oZXJpdEZyb20oaWZyYW1lU3R5bGUpOworICAg
IH0KKworICAgIC8vIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB3aGljaCB2YWx1ZXMgYmVsb3cgd2Ug
d2FudCB0byBvdmVycmlkZSBpbiB0aGUgc2VhbWxlc3MgY2FzZSEKKyAgICBkb2N1bWVudFN0eWxl
LT5zZXREaXNwbGF5KEJMT0NLKTsKKyAgICBpZiAoIXNlYW1sZXNzV2l0aFBhcmVudCkgeworICAg
ICAgICBkb2N1bWVudFN0eWxlLT5zZXRSVExPcmRlcmluZyhkb2N1bWVudC0+dmlzdWFsbHlPcmRl
cmVkKCkgPyBWaXN1YWxPcmRlciA6IExvZ2ljYWxPcmRlcik7CisgICAgICAgIGRvY3VtZW50U3R5
bGUtPnNldFpvb20oZnJhbWUgJiYgIWRvY3VtZW50LT5wcmludGluZygpID8gZnJhbWUtPnBhZ2Va
b29tRmFjdG9yKCkgOiAxKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UGFnZVNjYWxlVHJh
bnNmb3JtKGZyYW1lID8gZnJhbWUtPmZyYW1lU2NhbGVGYWN0b3IoKSA6IDEpOworICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRMb2NhbGUoZG9jdW1lbnQtPmNvbnRlbnRMYW5ndWFnZSgpKTsKKyAg
ICB9CisgICAgLy8gVGhpcyBvdmVycmlkZXMgYW55IC13ZWJraXQtdXNlci1tb2RpZnkgaW5oZXJp
dGVkIGZyb20gdGhlIHBhcmVudCBpZnJhbWUuCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0VXNlck1v
ZGlmeShkb2N1bWVudC0+aW5EZXNpZ25Nb2RlKCkgPyBSRUFEX1dSSVRFIDogUkVBRF9PTkxZKTsK
KworICAgIEVsZW1lbnQqIGRvY0VsZW1lbnQgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7
CisgICAgUmVuZGVyT2JqZWN0KiBkb2NFbGVtZW50UmVuZGVyZXIgPSBkb2NFbGVtZW50ID8gZG9j
RWxlbWVudC0+cmVuZGVyZXIoKSA6IDA7CisgICAgaWYgKGRvY0VsZW1lbnRSZW5kZXJlcikgewor
ICAgICAgICAvLyBVc2UgdGhlIGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIG9mIHRoZSBib2R5
IHRvIHNldCB0aGUKKyAgICAgICAgLy8gdmlld3BvcnQncyBkaXJlY3Rpb24gYW5kIHdyaXRpbmct
bW9kZSB1bmxlc3MgdGhlIHByb3BlcnR5IGlzIHNldCBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4K
KyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYm9keSwgdGhlbiB1c2UgdGhlIGRvY3VtZW50IGVs
ZW1lbnQuCisgICAgICAgIFJlbmRlck9iamVjdCogYm9keVJlbmRlcmVyID0gZG9jdW1lbnQtPmJv
ZHkoKSA/IGRvY3VtZW50LT5ib2R5KCktPnJlbmRlcmVyKCkgOiAwOworICAgICAgICBpZiAoYm9k
eVJlbmRlcmVyICYmICFkb2N1bWVudC0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgp
KQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoYm9keVJlbmRlcmVy
LT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9j
dW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT53
cml0aW5nTW9kZSgpKTsKKyAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPmRp
cmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgICAgICBkb2N1bWVudFN0eWxl
LT5zZXREaXJlY3Rpb24oYm9keVJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihkb2NFbGVt
ZW50UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKKyAgICB9CisKKyAgICBpZiAoZnJh
bWUpIHsKKyAgICAgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKSkg
eworICAgICAgICAgICAgY29uc3QgUGFnaW5hdGlvbiYgcGFnaW5hdGlvbiA9IGZyYW1lVmlldy0+
cGFnaW5hdGlvbigpOworICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24ubW9kZSAhPSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRp
b25Nb2RlKHBhZ2luYXRpb24ubW9kZSwgZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAgICAg
ICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Q29sdW1uR2FwKHBhZ2luYXRpb24uZ2FwKTsKKyAgICAg
ICAgICAgICAgICBpZiAoUmVuZGVyVmlldyogdmlldyA9IGRvY3VtZW50LT5yZW5kZXJWaWV3KCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXctPmhhc0NvbHVtbnMoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHZpZXctPnVwZGF0ZUNvbHVtbkluZm9Gcm9tU3R5bGUoZG9jdW1lbnRT
dHlsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorCisgICAgLy8gU2VhbWxlc3MgaWZyYW1lcyB3YW50IHRvIGluaGVyaXQgdGhlaXIg
Zm9udCBmcm9tIHRoZWlyIHBhcmVudCBpZnJhbWUsIHNvIGVhcmx5IHJldHVybiBiZWZvcmUgc2V0
dGluZyB0aGUgZm9udC4KKyAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50KQorICAgICAgICByZXR1
cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7CisKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERl
c2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRD
b2RlRm9yRm9udFNlbGVjdGlvbihkb2N1bWVudFN0eWxlLT5sb2NhbGUoKSkpOworICAgIGlmIChT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKSkgeworICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkgfHwgIXNl
dHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkp
OworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0YW5kYXJkRm9udCA9IHNldHRpbmdzLT5z
dGFuZGFyZEZvbnRGYW1pbHkoZm9udERlc2NyaXB0aW9uLnNjcmlwdCgpKTsKKyAgICAgICAgaWYg
KCFzdGFuZGFyZEZvbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsKKyAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZv
bnQpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFt
aWx5KDApOworICAgICAgICB9CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6
ZShDU1NWYWx1ZU1lZGl1bSAtIENTU1ZhbHVlWHhTbWFsbCArIDEpOworICAgICAgICBpbnQgc2l6
ZSA9IFN0eWxlUmVzb2x2ZXI6OmZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCwgQ1NTVmFsdWVN
ZWRpdW0sIGZhbHNlKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUo
c2l6ZSk7CisgICAgICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzID0gZG9jdW1lbnQtPmlzU1ZHRG9j
dW1lbnQoKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShTdHlsZVJl
c29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgZG9jdW1l
bnRTdHlsZS5nZXQoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVz
ZVNWR1pvb21SdWxlcykpOworICAgIH0gZWxzZQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkpOworCisgICAgRm9udE9yaWVudGF0
aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3Jp
ZW50YXRpb247CisgICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oZG9jdW1lbnRTdHlsZS5n
ZXQoKSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3Jp
cHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3JpcHRp
b24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKKworICAgIGRv
Y3VtZW50U3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIGRv
Y3VtZW50U3R5bGUtPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKTsKKworICAgIHJldHVybiBk
b2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQXRTaGFk
b3dCb3VuZGFyeShjb25zdCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmICghZWxlbWVudCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUgPSBl
bGVtZW50LT5wYXJlbnROb2RlKCk7CisgICAgcmV0dXJuIHBhcmVudE5vZGUgJiYgcGFyZW50Tm9k
ZS0+aXNTaGFkb3dSb290KCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCBSZW5kZXJTdHlsZSogZGVm
YXVsdFBhcmVudCwKKyAgICBTdHlsZVNoYXJpbmdCZWhhdmlvciBzaGFyaW5nQmVoYXZpb3IsIFJ1
bGVNYXRjaGluZ0JlaGF2aW9yIG1hdGNoaW5nQmVoYXZpb3IsIFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZykKK3sKKyAgICAvLyBPbmNlIGFuIGVsZW1lbnQgaGFzIGEgcmVuZGVyZXIsIHdl
IGRvbid0IHRyeSB0byBkZXN0cm95IGl0LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlbmRlcmVyCisg
ICAgLy8gd2lsbCB2YW5pc2ggaWYgYSBzdHlsZSByZWNhbGMgaGFwcGVucyBkdXJpbmcgbG9hZGlu
Zy4KKyAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFlbGVt
ZW50LT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiAhZWxlbWVudC0+cmVu
ZGVyZXIoKSkgeworICAgICAgICBpZiAoIXNfc3R5bGVOb3RZZXRBdmFpbGFibGUpIHsKKyAgICAg
ICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCkubGVh
a1JlZigpOworICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+c2V0RGlzcGxheShO
T05FKTsKKyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPmZvbnQoKS51cGRhdGUo
bV9mb250U2VsZWN0b3IpOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnQtPmRvY3VtZW50KCkt
PnNldEhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKTsKKyAgICAgICAgcmV0dXJuIHNfc3R5
bGVOb3RZZXRBdmFpbGFibGU7CisgICAgfQorCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
KyAgICBpbml0RWxlbWVudChlbGVtZW50KTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIGVsZW1lbnQsIGRlZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JT
dHlsaW5nKTsKKyAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYm
ICFzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBSZW5kZXJT
dHlsZSogc2hhcmVkU3R5bGUgPSBsb2NhdGVTaGFyZWRTdHlsZSgpOworICAgICAgICBpZiAoc2hh
cmVkU3R5bGUpCisgICAgICAgICAgICByZXR1cm4gc2hhcmVkU3R5bGU7CisgICAgfQorCisgICAg
UmVmUHRyPFJlbmRlclN0eWxlPiBjbG9uZUZvclBhcmVudDsKKworICAgIGlmIChzdGF0ZS5wYXJl
bnRTdHlsZSgpKSB7CisgICAgICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUo
KSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKHN0YXRlLnBhcmVudFN0eWxl
KCksIGlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSA/IFJlbmRlclN0eWxlOjpBdFNoYWRvd0Jv
dW5kYXJ5IDogUmVuZGVyU3R5bGU6Ok5vdEF0U2hhZG93Qm91bmRhcnkpOworICAgIH0gZWxzZSB7
CisgICAgICAgIHN0YXRlLnNldFN0eWxlKGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSk7CisgICAg
ICAgIGNsb25lRm9yUGFyZW50ID0gUmVuZGVyU3R5bGU6OmNsb25lKHN0YXRlLnN0eWxlKCkpOwor
ICAgICAgICBzdGF0ZS5zZXRQYXJlbnRTdHlsZShjbG9uZUZvclBhcmVudC5nZXQoKSk7CisgICAg
fQorICAgIC8vIGNvbnRlbnRlZGl0YWJsZSBhdHRyaWJ1dGUgKGltcGxlbWVudGVkIGJ5IC13ZWJr
aXQtdXNlci1tb2RpZnkpIHNob3VsZAorICAgIC8vIGJlIHByb3BhZ2F0ZWQgZnJvbSBzaGFkb3cg
aG9zdCB0byBkaXN0cmlidXRlZCBub2RlLgorICAgIGlmIChzdGF0ZS5kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBpZiAoRWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+
cGFyZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoUmVuZGVyU3R5bGUqIHN0eWxlT2ZT
aGFkb3dIb3N0ID0gcGFyZW50LT5yZW5kZXJTdHlsZSgpKQorICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFVzZXJNb2RpZnkoc3R5bGVPZlNoYWRvd0hvc3QtPnVzZXJNb2RpZnkoKSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpIHsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0SXNMaW5rKHRydWUpOworICAgICAgICBFSW5zaWRlTGluayBs
aW5rU3RhdGUgPSBzdGF0ZS5lbGVtZW50TGlua1N0YXRlKCk7CisgICAgICAgIGlmIChsaW5rU3Rh
dGUgIT0gTm90SW5zaWRlTGluaykgeworICAgICAgICAgICAgYm9vbCBmb3JjZVZpc2l0ZWQgPSBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmZvcmNlUHNldWRvU3RhdGUoZWxlbWVudCwgQ1NTU2Vs
ZWN0b3I6OlBzZXVkb1Zpc2l0ZWQpOworICAgICAgICAgICAgaWYgKGZvcmNlVmlzaXRlZCkKKyAg
ICAgICAgICAgICAgICBsaW5rU3RhdGUgPSBJbnNpZGVWaXNpdGVkTGluazsKKyAgICAgICAgfQor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0ZSk7CisgICAgfQor
CisgICAgYm9vbCBuZWVkc0NvbGxlY3Rpb24gPSBmYWxzZTsKKyAgICBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OmVuc3VyZURlZmF1bHRTdHlsZVNoZWV0c0ZvckVsZW1lbnQoZWxlbWVudCwgbmVlZHND
b2xsZWN0aW9uKTsKKyAgICBpZiAobmVlZHNDb2xsZWN0aW9uKQorICAgICAgICBtX3J1bGVTZXRz
LmNvbGxlY3RGZWF0dXJlcyhkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29s
dmVyLmdldCgpKTsKKworICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OworICAgIGlmIChtYXRj
aGluZ0JlaGF2aW9yID09IE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKQorICAgICAgICBtYXRjaFVB
UnVsZXMobWF0Y2hSZXN1bHQpOworICAgIGVsc2UKKyAgICAgICAgbWF0Y2hBbGxSdWxlcyhtYXRj
aFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7
CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKKwor
ICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29y
YXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgorICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRl
LnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGVsZW1lbnQpOworCisgICAgc3RhdGUuY2xl
YXIoKTsgLy8gQ2xlYXIgb3V0IGZvciB0aGUgbmV4dCByZXNvbHZlLgorCisgICAgZG9jdW1lbnQo
KS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5
bGUuCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxl
KiBlbGVtZW50U3R5bGUsIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lLCBLZXlmcmFtZVZh
bHVlJiBrZXlmcmFtZVZhbHVlKQoreworICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKKyAgICBpZiAo
a2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVz
dWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKworICAgIEFTU0VSVCghbV9zdGF0ZS5zdHls
ZSgpKTsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICAvLyBDcmVhdGUgdGhl
IHN0eWxlCisgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNsb25lKGVsZW1lbnRTdHls
ZSkpOworICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKworICAgIC8vIFdlIGRvbid0
IG5lZWQgdG8gYm90aGVyIHdpdGggIWltcG9ydGFudC4gU2luY2UgdGhlcmUgaXMgb25seSBldmVy
IG9uZQorICAgIC8vIGRlY2wsIHRoZXJlJ3Mgbm90aGluZyB0byBvdmVycmlkZS4gU28ganVzdCBh
ZGQgdGhlIGZpcnN0IHByb3BlcnRpZXMuCisgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7
CisgICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCisgICAgICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8g
SWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAg
IHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBz
dXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZQorICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0
YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKKworICAgIC8vIE5vdyBkbyByZXN0IG9mIHRoZSBwcm9w
ZXJ0aWVzLgorICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwg
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisg
ICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQgYnkgb25lIG9mIHRoZSBub24tZXNzZW50aWFs
IGZvbnQgcHJvcHMsCisgICAgLy8gZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBhIHNlY29uZCB0aW1l
LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJl
ZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAg
IAorICAgIC8vIEFkZCBhbGwgdGhlIGFuaW1hdGluZyBwcm9wZXJ0aWVzIHRvIHRoZSBrZXlmcmFt
ZS4KKyAgICBpZiAoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogc3R5bGVEZWNsYXJhdGlvbiA9IGtl
eWZyYW1lLT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9
IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5Q291bnQoKTsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHByb3BlcnR5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgQ1NTUHJvcGVy
dHlJRCBwcm9wZXJ0eSA9IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5QXQoaSkuaWQoKTsKKyAg
ICAgICAgICAgIC8vIFRpbWluZy1mdW5jdGlvbiB3aXRoaW4ga2V5ZnJhbWVzIGlzIHNwZWNpYWws
IGJlY2F1c2UgaXQgaXMgbm90IGFuaW1hdGVkOyBpdCBqdXN0CisgICAgICAgICAgICAvLyBkZXNj
cmliZXMgdGhlIHRpbWluZyBmdW5jdGlvbiBiZXR3ZWVuIHRoaXMga2V5ZnJhbWUgYW5kIHRoZSBu
ZXh0LgorICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0
aW9uVGltaW5nRnVuY3Rpb24pCisgICAgICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5hZGRQcm9w
ZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkb2N1bWVudCgpLT5kaWRB
Y2Nlc3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Cit9
CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6a2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVu
dCogZSwgY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgS2V5ZnJhbWVMaXN0JiBsaXN0
KQoreworICAgIGxpc3QuY2xlYXIoKTsKKworICAgIC8vIEdldCB0aGUga2V5ZnJhbWVzUnVsZSBm
b3IgdGhpcyBuYW1lCisgICAgaWYgKCFlIHx8IGxpc3QuYW5pbWF0aW9uTmFtZSgpLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLmNoZWNrQ29uc2lz
dGVuY3koKTsKKworICAgIEtleWZyYW1lc1J1bGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9rZXlmcmFt
ZXNSdWxlTWFwLmZpbmQobGlzdC5hbmltYXRpb25OYW1lKCkuaW1wbCgpKTsKKyAgICBpZiAoaXQg
PT0gbV9rZXlmcmFtZXNSdWxlTWFwLmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25z
dCBTdHlsZVJ1bGVLZXlmcmFtZXMqIGtleWZyYW1lc1J1bGUgPSBpdC0+dmFsdWUuZ2V0KCk7CisK
KyAgICAvLyBDb25zdHJ1Y3QgYW5kIHBvcHVsYXRlIHRoZSBzdHlsZSBmb3IgZWFjaCBrZXlmcmFt
ZQorICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVLZXlmcmFtZT4gPiYga2V5ZnJhbWVzID0g
a2V5ZnJhbWVzUnVsZS0+a2V5ZnJhbWVzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGtleWZyYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBBcHBseSB0aGUgZGVjbGFyYXRp
b24gdG8gdGhlIHN0eWxlLiBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBsb2dp
YyBpbiBzdHlsZUZvckVsZW1lbnQKKyAgICAgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgICAgIG1f
c3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlKTsKKworICAgICAgICBjb25z
dCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSA9IGtleWZyYW1lc1tpXS5nZXQoKTsKKworICAgICAg
ICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7CisgICAgICAgIGtleWZyYW1lVmFs
dWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIGtleWZyYW1lLCBrZXlm
cmFtZVZhbHVlKSk7CisKKyAgICAgICAgLy8gQWRkIHRoaXMga2V5ZnJhbWUgc3R5bGUgdG8gYWxs
IHRoZSBpbmRpY2F0ZWQga2V5IHRpbWVzCisgICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5czsKKyAg
ICAgICAga2V5ZnJhbWUtPmdldEtleXMoa2V5cyk7CisgICAgICAgIGZvciAoc2l6ZV90IGtleUlu
ZGV4ID0gMDsga2V5SW5kZXggPCBrZXlzLnNpemUoKTsgKytrZXlJbmRleCkgeworICAgICAgICAg
ICAga2V5ZnJhbWVWYWx1ZS5zZXRLZXkoa2V5c1trZXlJbmRleF0pOworICAgICAgICAgICAgbGlz
dC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0
aGUgMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBp
cyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCisgICAgaW50IGluaXRpYWxMaXN0U2l6ZSA9
IGxpc3Quc2l6ZSgpOworICAgIGlmIChpbml0aWFsTGlzdFNpemUgPiAwICYmIGxpc3RbMF0ua2V5
KCkpIHsKKyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIHplcm9QZXJjZW50S2V5ZnJhbWU7
CisgICAgICAgIGlmICghemVyb1BlcmNlbnRLZXlmcmFtZSkgeworICAgICAgICAgICAgemVyb1Bl
cmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAg
ICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUtPnNldEtleVRleHQoIjAlIik7CisgICAgICAgIH0K
KyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlm
cmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCB6ZXJvUGVy
Y2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZy
YW1lVmFsdWUpOworICAgIH0KKworICAgIC8vIElmIHRoZSAxMDAlIGtleWZyYW1lIGlzIG1pc3Np
bmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtl
eWZyYW1lKQorICAgIGlmIChpbml0aWFsTGlzdFNpemUgPiAwICYmIChsaXN0W2xpc3Quc2l6ZSgp
IC0gMV0ua2V5KCkgIT0gMSkpIHsKKyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIGh1bmRy
ZWRQZXJjZW50S2V5ZnJhbWU7CisgICAgICAgIGlmICghaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSkg
eworICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNy
ZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUtPnNl
dEtleVRleHQoIjEwMCUiKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZy
YW1lVmFsdWUoMSwgMCk7CisgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JL
ZXlmcmFtZShlbGVtZW50U3R5bGUsIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFs
dWUpKTsKKyAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgfQorfQorCitQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1l
bnQoRWxlbWVudCogZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVl
c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICBBU1NFUlQocGFyZW50U3R5bGUp
OworICAgIGlmICghZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOworCisgICAgaW5pdEVsZW1lbnQoZSk7CisKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVS
ZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlLCBwc2V1ZG9TdHlsZVJlcXVlc3QpOwor
ICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgc3RhdGUuc3R5
bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKKworICAgIC8vIFNpbmNl
IHdlIGRvbid0IHVzZSBwc2V1ZG8tZWxlbWVudHMgaW4gYW55IG9mIG91ciBxdWlyay9wcmludCB1
c2VyIGFnZW50IHJ1bGVzLCBkb24ndCB3YXN0ZSB0aW1lIHdhbGtpbmcKKyAgICAvLyB0aG9zZSBy
dWxlcy4KKworICAgIC8vIENoZWNrIFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCisgICAgTWF0
Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7CisgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKwor
ICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykgeworICAgICAgICBtYXRjaFVzZXJS
dWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOworICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKG1hdGNo
UmVzdWx0LCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRTdHlsZVR5cGUocHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkKTsKKworICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGUpOworCisgICAgLy8gQ2xlYW4gdXAgb3Vy
IHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVy
IGZpeHVwcykuCisgICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5w
YXJlbnRTdHlsZSgpLCAwKTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVy
ZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAg
ZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVy
biB0aGUgc3R5bGUuCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRl
eCkKK3sKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZG9jdW1l
bnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpOyAvLyBtX3Jvb3RFbGVtZW50U3R5bGUgd2lsbCBiZSBz
ZXQgdG8gdGhlIGRvY3VtZW50IHN0eWxlLgorCisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJT
dHlsZTo6Y3JlYXRlKCkpOworICAgIG1fc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0
ZS5yb290RWxlbWVudFN0eWxlKCkpOworCisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQ
YWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFn
ZUluZGV4KTsKKyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7Cisg
ICAgCisgICAgTWF0Y2hSZXN1bHQgcmVzdWx0OworICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwg
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0
LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxl
KCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xv
YmFsIGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVj
LgorICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBp
c0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDAp
OworICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOworI2lmIEVOQUJMRShDU1NfVkFSSUFC
TEVTKQorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVz
dWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVy
aXRlZE9ubHkpOworI2VuZGlmCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3Jp
dHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGly
dGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgpOworCisg
ICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0
aGUgZm9udC1zaXplLgorICAgIGlmIChtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgbV9zdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVy
dGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAt
IDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVm
ZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisKKyAg
ICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBOb3cgcmV0
dXJuIHRoZSBzdHlsZS4KKyAgICByZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6ZGVmYXVsdFN0eWxlRm9yRWxlbWVu
dCgpCit7CisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAg
IC8vIE1ha2Ugc3VyZSBvdXIgZm9udHMgYXJlIGluaXRpYWxpemVkIGlmIHdlIGRvbid0IGluaGVy
aXQgdGhlbSBmcm9tIG91ciBwYXJlbnQgc3R5bGUuCisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5n
cyA9IGRvY3VtZW50U2V0dGluZ3MoKSkgeworICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNl
dHRpbmdzKTsKKyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxl
Y3RvcigpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBk
YXRlKDApOworCisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yVGV4dChUZXh0KiB0ZXh0Tm9k
ZSkKK3sKKyAgICBBU1NFUlQodGV4dE5vZGUpOworCisgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQg
Y29udGV4dCh0ZXh0Tm9kZSk7CisgICAgTm9kZSogcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50
Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CisgICAgcmV0dXJuIGNvbnRleHQucmVzZXRTdHls
ZUluaGVyaXRhbmNlKCkgfHwgIXBhcmVudE5vZGUgPworICAgICAgICBkZWZhdWx0U3R5bGVGb3JF
bGVtZW50KCkgOiBwYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpOworfQorCitzdGF0aWMgdm9pZCBh
ZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICAvLyBJbnRyaW5z
aWMgbWFyZ2luIHZhbHVlLgorICAgIGNvbnN0IGludCBpbnRyaW5zaWNNYXJnaW4gPSAyICogc3R5
bGUtPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9oZWlnaHQg
YWxvbmUgYW5kIG5vdCBhbHNvIGRlYWxpbmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRoIGlzIGZs
YXdlZC4KKyAgICAvLyBGSVhNRTogVXNpbmcgInF1aXJrIiB0byBkZWNpZGUgdGhlIG1hcmdpbiB3
YXNuJ3Qgc2V0IGlzIGtpbmQgb2YgbGFtZS4KKyAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRy
aW5zaWNPckF1dG8oKSkgeworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygp
KQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpbkxlZnQoTGVuZ3RoKGludHJpbnNpY01hcmdp
biwgRml4ZWQpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luUmlnaHQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwg
Rml4ZWQpKTsKKyAgICB9CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7Cisg
ICAgICAgIGlmIChzdHlsZS0+bWFyZ2luVG9wKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5tYXJnaW5Cb3R0b20oKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dE1hcmdpbkJvdHRvbShMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgIH0KK30K
Kworc3RhdGljIEVEaXNwbGF5IGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoRURpc3BsYXkgZGlzcGxh
eSwgYm9vbCBpc0Zsb2F0aW5nLCBib29sIHN0cmljdFBhcnNpbmcpCit7CisgICAgc3dpdGNoIChk
aXNwbGF5KSB7CisgICAgY2FzZSBCTE9DSzoKKyAgICBjYXNlIFRBQkxFOgorICAgIGNhc2UgQk9Y
OgorICAgIGNhc2UgRkxFWDoKKyAgICBjYXNlIEdSSUQ6CisgICAgICAgIHJldHVybiBkaXNwbGF5
OworCisgICAgY2FzZSBMSVNUX0lURU06CisgICAgICAgIC8vIEl0IGlzIGEgV2luSUUgYnVnIHRo
YXQgZmxvYXRlZCBsaXN0IGl0ZW1zIGxvc2UgdGhlaXIgYnVsbGV0cywgc28gd2UnbGwgZW11bGF0
ZSB0aGUgcXVpcmssIGJ1dCBvbmx5IGluIHF1aXJrcyBtb2RlLgorICAgICAgICBpZiAoIXN0cmlj
dFBhcnNpbmcgJiYgaXNGbG9hdGluZykKKyAgICAgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICAg
ICAgcmV0dXJuIGRpc3BsYXk7CisgICAgY2FzZSBJTkxJTkVfVEFCTEU6CisgICAgICAgIHJldHVy
biBUQUJMRTsKKyAgICBjYXNlIElOTElORV9CT1g6CisgICAgICAgIHJldHVybiBCT1g7CisgICAg
Y2FzZSBJTkxJTkVfRkxFWDoKKyAgICAgICAgcmV0dXJuIEZMRVg7CisgICAgY2FzZSBJTkxJTkVf
R1JJRDoKKyAgICAgICAgcmV0dXJuIEdSSUQ7CisKKyAgICBjYXNlIElOTElORToKKyAgICBjYXNl
IFJVTl9JTjoKKyAgICBjYXNlIENPTVBBQ1Q6CisgICAgY2FzZSBJTkxJTkVfQkxPQ0s6CisgICAg
Y2FzZSBUQUJMRV9ST1dfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9IRUFERVJfR1JPVVA6CisgICAg
Y2FzZSBUQUJMRV9GT09URVJfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9ST1c6CisgICAgY2FzZSBU
QUJMRV9DT0xVTU5fR1JPVVA6CisgICAgY2FzZSBUQUJMRV9DT0xVTU46CisgICAgY2FzZSBUQUJM
RV9DRUxMOgorICAgIGNhc2UgVEFCTEVfQ0FQVElPTjoKKyAgICAgICAgcmV0dXJuIEJMT0NLOwor
ICAgIGNhc2UgTk9ORToKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJl
dHVybiBOT05FOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4g
QkxPQ0s7Cit9CisKKy8vIENTUyByZXF1aXJlcyB0ZXh0LWRlY29yYXRpb24gdG8gYmUgcmVzZXQg
YXQgZWFjaCBET00gZWxlbWVudCBmb3IgdGFibGVzLCAKKy8vIGlubGluZSBibG9ja3MsIGlubGlu
ZSB0YWJsZXMsIHJ1bi1pbnMsIHNoYWRvdyBET00gY3Jvc3NpbmdzLCBmbG9hdGluZyBlbGVtZW50
cywKKy8vIGFuZCBhYnNvbHV0ZSBvciByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMuCitz
dGF0aWMgYm9vbCBkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0aW9uKFJlbmRlclN0eWxlKiBzdHls
ZSwgRWxlbWVudCogZSkKK3sKKyAgICByZXR1cm4gc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8
fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09
IFJVTl9JTgorICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CTE9DSyB8fCBz
dHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1ggfHwgaXNBdFNoYWRvd0JvdW5kYXJ5KGUpCisg
ICAgICAgIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0
aW9uKCk7Cit9CisKK3N0YXRpYyBib29sIGlzRGlzcGxheUZsZXhpYmxlQm94KEVEaXNwbGF5IGRp
c3BsYXkpCit7CisgICAgcmV0dXJuIGRpc3BsYXkgPT0gRkxFWCB8fCBkaXNwbGF5ID09IElOTElO
RV9GTEVYOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkanVzdFJlbmRlclN0eWxlKFJlbmRl
clN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50ICplKQorewor
ICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7CisKKyAgICAvLyBDYWNoZSBvdXIgb3JpZ2luYWwgZGlz
cGxheS4KKyAgICBzdHlsZS0+c2V0T3JpZ2luYWxEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCkpOwor
CisgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORSkgeworICAgICAgICAvLyBJZiB3ZSBo
YXZlIGEgPHRkPiB0aGF0IHNwZWNpZmllcyBhIGZsb2F0IHByb3BlcnR5LCBpbiBxdWlya3MgbW9k
ZSB3ZSBqdXN0IGRyb3AgdGhlIGZsb2F0CisgICAgICAgIC8vIHByb3BlcnR5LgorICAgICAgICAv
LyBTaXRlcyBhbHNvIGNvbW1vbmx5IHVzZSBkaXNwbGF5OmlubGluZS9ibG9jayBvbiA8dGQ+cyBh
bmQgPHRhYmxlPnMuIEluIHF1aXJrcyBtb2RlIHdlIGZvcmNlCisgICAgICAgIC8vIHRoZXNlIHRh
Z3MgdG8gcmV0YWluIHRoZWlyIGRpc3BsYXkgdHlwZXMuCisgICAgICAgIGlmIChkb2N1bWVudCgp
LT5pblF1aXJrc01vZGUoKSAmJiBlKSB7CisgICAgICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZSh0
ZFRhZykpIHsKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsK
KyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAg
ICB9IGVsc2UgaWYgKGUtPmhhc1RhZ05hbWUodGFibGVUYWcpKQorICAgICAgICAgICAgICAgIHN0
eWxlLT5zZXREaXNwbGF5KHN0eWxlLT5pc0Rpc3BsYXlJbmxpbmVUeXBlKCkgPyBJTkxJTkVfVEFC
TEUgOiBUQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFt
ZSh0ZFRhZykgfHwgZS0+aGFzVGFnTmFtZSh0aFRhZykpKSB7CisgICAgICAgICAgICBpZiAoc3R5
bGUtPndoaXRlU3BhY2UoKSA9PSBLSFRNTF9OT1dSQVApIHsKKyAgICAgICAgICAgICAgICAvLyBG
aWd1cmUgb3V0IGlmIHdlIGFyZSByZWFsbHkgbm93cmFwcGluZyBvciBpZiB3ZSBzaG91bGQganVz
dAorICAgICAgICAgICAgICAgIC8vIHVzZSBub3JtYWwgaW5zdGVhZC4gSWYgdGhlIHdpZHRoIG9m
IHRoZSBjZWxsIGlzIGZpeGVkLCB0aGVuCisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0
dWFsbHkgdXNlIE5PV1JBUC4KKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNG
aXhlZCgpKQorICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwp
OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdo
aXRlU3BhY2UoTk9XUkFQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8v
IFRhYmxlcyBuZXZlciBzdXBwb3J0IHRoZSAtd2Via2l0LSogdmFsdWVzIGZvciB0ZXh0LWFsaWdu
IGFuZCB3aWxsIHJlc2V0IGJhY2sgdG8gdGhlIGRlZmF1bHQuCisgICAgICAgIGlmIChlICYmIGUt
Pmhhc1RhZ05hbWUodGFibGVUYWcpICYmIChzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0xF
RlQgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9DRU5URVIgfHwgc3R5bGUtPnRleHRB
bGlnbigpID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWdu
KFRBU1RBUlQpOworCisgICAgICAgIC8vIEZyYW1lcyBhbmQgZnJhbWVzZXRzIG5ldmVyIGhvbm9y
IHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOmFic29sdXRlLiBUaGlzIGlzIG5lY2Vzc2Fy
eSB0bworICAgICAgICAvLyBmaXggYSBjcmFzaCB3aGVyZSBhIHNpdGUgdHJpZXMgdG8gcG9zaXRp
b24gdGhlc2Ugb2JqZWN0cy4gVGhleSBhbHNvIG5ldmVyIGhvbm9yIGRpc3BsYXkuCisgICAgICAg
IGlmIChlICYmIChlLT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGZyYW1l
c2V0VGFnKSkpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlv
bik7CisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBSdWJ5IHRleHQgZG9lcyBub3Qgc3VwcG9ydCBmbG9hdCBvciBwb3NpdGlvbi4g
VGhpcyBtaWdodCBjaGFuZ2Ugd2l0aCBldm9sdXRpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uCisg
ICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUocnRUYWcpKSB7CisgICAgICAgICAgICBzdHls
ZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldEZs
b2F0aW5nKE5vRmxvYXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3Vs
ZG4ndCBiZSBvdmVycmlkaW5nIHN0YXJ0Ly13ZWJraXQtYXV0byBsaWtlIHRoaXMuIERvIGl0IGlu
IGh0bWwuY3NzIGluc3RlYWQuCisgICAgICAgIC8vIFRhYmxlIGhlYWRlcnMgd2l0aCBhIHRleHQt
YWxpZ24gb2YgLXdlYmtpdC1hdXRvIHdpbGwgY2hhbmdlIHRoZSB0ZXh0LWFsaWduIHRvIGNlbnRl
ci4KKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0aFRhZykgJiYgc3R5bGUtPnRleHRB
bGlnbigpID09IFRBU1RBUlQpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKENFTlRF
Uik7CisKKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQorICAgICAg
ICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworCisgICAgICAgIC8vIEFic29sdXRlL2Zp
eGVkIHBvc2l0aW9uZWQgZWxlbWVudHMsIGZsb2F0aW5nIGVsZW1lbnRzIGFuZCB0aGUgZG9jdW1l
bnQgZWxlbWVudCBuZWVkIGJsb2NrLWxpa2Ugb3V0c2lkZSBkaXNwbGF5LgorICAgICAgICBpZiAo
c3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCkgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCAo
ZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXko
KSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7CisK
KyAgICAgICAgLy8gRklYTUU6IERvbid0IHN1cHBvcnQgdGhpcyBtdXRhdGlvbiBmb3IgcHNldWRv
IHN0eWxlcyBsaWtlIGZpcnN0LWxldHRlciBvciBmaXJzdC1saW5lLCBzaW5jZSBpdCdzIG5vdCBj
b21wbGV0ZWx5CisgICAgICAgIC8vIGNsZWFyIGhvdyB0aGF0IHNob3VsZCB3b3JrLgorICAgICAg
ICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgJiYgc3R5bGUtPnN0eWxlVHlwZSgpID09
IE5PUFNFVURPICYmIHN0eWxlLT53cml0aW5nTW9kZSgpICE9IHBhcmVudFN0eWxlLT53cml0aW5n
TW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKwor
ICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRoZSBkaXNwbGF5IG11dGF0aW9uLCBjaGVjayB0
YWJsZSByb3dzLiBXZSBkbyBub3QgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246
c3RpY2t5IG9uCisgICAgICAgIC8vIHRhYmxlIHJvd3Mgb3IgY2VsbHMuIFRoaXMgaGFzIGJlZW4g
ZXN0YWJsaXNoZWQgZm9yIHBvc2l0aW9uOnJlbGF0aXZlIGluIENTUzIuMSAoYW5kIGNhdXNlZCBh
IGNyYXNoIGluIGNvbnRhaW5pbmdCbG9jaygpCisgICAgICAgIC8vIG9uIHNvbWUgc2l0ZXMpLgor
ICAgICAgICBpZiAoKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0
eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPVykKKyAgICAgICAgICAgICYmIHN0eWxlLT5oYXNJbkZsb3dQb3NpdGlvbigpKQorICAg
ICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKworICAgICAgICAv
LyB3cml0aW5nLW1vZGUgZG9lcyBub3QgYXBwbHkgdG8gdGFibGUgcm93IGdyb3VwcywgdGFibGUg
Y29sdW1uIGdyb3VwcywgdGFibGUgcm93cywgYW5kIHRhYmxlIGNvbHVtbnMuCisgICAgICAgIC8v
IEZJWE1FOiBUYWJsZSBjZWxscyBzaG91bGQgYmUgYWxsb3dlZCB0byBiZSBwZXJwZW5kaWN1bGFy
IG9yIGZsaXBwZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB0YWJsZSwgdGhvdWdoLgorICAgICAgICBp
ZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU4gfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9DT0xVTU5fR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJf
R1JPVVAKKyAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dS
T1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX0NFTEwpCisgICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUocGFyZW50U3R5bGUt
PndyaXRpbmdNb2RlKCkpOworCisgICAgICAgIC8vIEZJWE1FOiBTaW5jZSB3ZSBkb24ndCBzdXBw
b3J0IGJsb2NrLWZsb3cgb24gZmxleGlibGUgYm94ZXMgeWV0LCBkaXNhbGxvdyBzZXR0aW5nCisg
ICAgICAgIC8vIG9mIGJsb2NrLWZsb3cgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBUb3BUb0JvdHRv
bVdyaXRpbmdNb2RlLgorICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NDY0MTggLSBGbGV4aWJsZSBib3ggc3VwcG9ydC4KKyAgICAgICAgaWYgKHN0eWxl
LT53cml0aW5nTW9kZSgpICE9IFRvcFRvQm90dG9tV3JpdGluZ01vZGUgJiYgKHN0eWxlLT5kaXNw
bGF5KCkgPT0gQk9YIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCkpCisgICAgICAg
ICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUoVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSk7CisKKyAg
ICAgICAgaWYgKGlzRGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKSB7
CisgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAgICBz
dHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCks
IHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworICAg
ICAgICB9CisKKyNpZiBFTkFCTEUoRElBTE9HX0VMRU1FTlQpCisgICAgICAgIC8vIFBlciB0aGUg
c3BlYywgcG9zaXRpb24gJ3N0YXRpYycgYW5kICdyZWxhdGl2ZScgaW4gdGhlIHRvcCBsYXllciBj
b21wdXRlIHRvICdhYnNvbHV0ZScuCisgICAgICAgIGlmIChlICYmIGUtPmlzSW5Ub3BMYXllcigp
ICYmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiB8fCBzdHlsZS0+cG9zaXRp
b24oKSA9PSBSZWxhdGl2ZVBvc2l0aW9uKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0
aW9uKEFic29sdXRlUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxP
Q0spOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgb3VyIHot
aW5kZXggdmFsdWUgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBvYmplY3QgaXMgcG9zaXRpb25lZC4K
KyAgICBpZiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gJiYgIWlzRGlzcGxh
eUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKQorICAgICAgICBzdHlsZS0+c2V0
SGFzQXV0b1pJbmRleCgpOworCisgICAgLy8gQXV0byB6LWluZGV4IGJlY29tZXMgMCBmb3IgdGhl
IHJvb3QgZWxlbWVudCBhbmQgdHJhbnNwYXJlbnQgb2JqZWN0cy4gVGhpcyBwcmV2ZW50cworICAg
IC8vIGNhc2VzIHdoZXJlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgYmxlbmRlZCBhcyBhIHNpbmds
ZSB1bml0IGVuZCB1cCB3aXRoIGEgbm9uLXRyYW5zcGFyZW50CisgICAgLy8gb2JqZWN0IHdlZGdl
ZCBpbiBiZXR3ZWVuIHRoZW0uIEF1dG8gei1pbmRleCBhbHNvIGJlY29tZXMgMCBmb3Igb2JqZWN0
cyB0aGF0IHNwZWNpZnkgdHJhbnNmb3Jtcy9tYXNrcy9yZWZsZWN0aW9ucy4KKyAgICBpZiAoc3R5
bGUtPmhhc0F1dG9aSW5kZXgoKSAmJiAoKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVt
ZW50KCkgPT0gZSkKKyAgICAgICAgfHwgc3R5bGUtPm9wYWNpdHkoKSA8IDEuMGYKKyAgICAgICAg
fHwgc3R5bGUtPmhhc1RyYW5zZm9ybVJlbGF0ZWRQcm9wZXJ0eSgpCisgICAgICAgIHx8IHN0eWxl
LT5oYXNNYXNrKCkKKyAgICAgICAgfHwgc3R5bGUtPmNsaXBQYXRoKCkKKyAgICAgICAgfHwgc3R5
bGUtPmJveFJlZmxlY3QoKQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkKKyAgICAgICAg
fHwgc3R5bGUtPmhhc0JsZW5kTW9kZSgpCisgICAgICAgIHx8IHN0eWxlLT5wb3NpdGlvbigpID09
IFN0aWNreVBvc2l0aW9uCisgICAgICAgIHx8IChzdHlsZS0+cG9zaXRpb24oKSA9PSBGaXhlZFBv
c2l0aW9uICYmIGUgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpICYmIGUtPmRvY3VtZW50KCktPnBh
Z2UoKS0+c2V0dGluZ3MoKS0+Zml4ZWRQb3NpdGlvbkNyZWF0ZXNTdGFja2luZ0NvbnRleHQoKSkK
KyNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1dfU0NST0xMSU5HKQorICAgICAgICAvLyBU
b3VjaCBvdmVyZmxvdyBzY3JvbGxpbmcgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHQuCisgICAg
ICAgIHx8ICgoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURERU4gfHwgc3R5bGUtPm92ZXJmbG93
WSgpICE9IE9ISURERU4pICYmIHN0eWxlLT51c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKCkpCisj
ZW5kaWYKKyNpZiBFTkFCTEUoRElBTE9HX0VMRU1FTlQpCisgICAgICAgIHx8IChlICYmIGUtPmlz
SW5Ub3BMYXllcigpKQorI2VuZGlmCisgICAgICAgICkpCisgICAgICAgIHN0eWxlLT5zZXRaSW5k
ZXgoMCk7CisKKyAgICAvLyBUZXh0YXJlYSBjb25zaWRlcnMgb3ZlcmZsb3cgdmlzaWJsZSBhcyBh
dXRvLgorICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGV4dGFyZWFUYWcpKSB7CisgICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1goc3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFID8gT0FV
VE8gOiBzdHlsZS0+b3ZlcmZsb3dYKCkpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKHN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WSgp
KTsKKyAgICB9CisKKyAgICBpZiAoZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihzdHlsZSwg
ZSkpCisgICAgICAgIHN0eWxlLT5zZXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4
dERlY29yYXRpb24oKSk7CisgICAgZWxzZQorICAgICAgICBzdHlsZS0+YWRkVG9UZXh0RGVjb3Jh
dGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29yYXRpb24oKSk7CisKKyAgICAvLyBJZiBlaXRo
ZXIgb3ZlcmZsb3cgdmFsdWUgaXMgbm90IHZpc2libGUsIGNoYW5nZSB0byBhdXRvLgorICAgIGlm
IChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9
IE9NQVJRVUVFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9NQVJRVUVFKTsKKyAgICBl
bHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93
WCgpICE9IE9NQVJRVUVFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9NQVJRVUVFKTsK
KyAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92
ZXJmbG93WSgpICE9IE9WSVNJQkxFKSB7CisgICAgICAgIC8vIEZJWE1FOiBPbmNlIHdlIGltcGxl
bWVudCBwYWdpbmF0aW9uIGNvbnRyb2xzLCBvdmVyZmxvdy14IHNob3VsZCBkZWZhdWx0IHRvIGhp
ZGRlbgorICAgICAgICAvLyBpZiBvdmVyZmxvdy15IGlzIHNldCB0byAtd2Via2l0LXBhZ2VkLXgg
b3IgLXdlYmtpdC1wYWdlLXkuIEZvciBub3csIHdlJ2xsIGxldCBpdAorICAgICAgICAvLyBkZWZh
dWx0IHRvIGF1dG8gc28gd2UgY2FuIGF0IGxlYXN0IHNjcm9sbCB0aHJvdWdoIHRoZSBwYWdlcy4K
KyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPQVVUTyk7CisgICAgfSBlbHNlIGlmIChzdHls
ZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJ
QkxFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9BVVRPKTsKKworICAgIC8vIENhbGwg
c2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoKSBpZiBhIHBhZ2luYXRpb24gbW9kZSBpcyBzZXQg
Zm9yIGFueSBub24tcm9vdCBlbGVtZW50cy4gSWYgdGhlc2UKKyAgICAvLyBzdHlsZXMgYXJlIHNw
ZWNpZmllZCBvbiBhIHJvb3QgZWxlbWVudCwgdGhlbiB0aGV5IHdpbGwgYmUgaW5jb3Jwb3JhdGVk
IGluCisgICAgLy8gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVudCgpLgorICAgIGlmICgo
c3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFggfHwgc3R5bGUtPm92ZXJmbG93WSgpID09IE9Q
QUdFRFkpICYmICEoZSAmJiAoZS0+aGFzVGFnTmFtZShodG1sVGFnKSB8fCBlLT5oYXNUYWdOYW1l
KGJvZHlUYWcpKSkpCisgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFdlYkNvcmU6
OnBhZ2luYXRpb25Nb2RlRm9yUmVuZGVyU3R5bGUoc3R5bGUpLCBzdHlsZSk7CisKKyAgICAvLyBU
YWJsZSByb3dzLCBzZWN0aW9ucyBhbmQgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIHN1cHBvcnQgb3Zl
cmZsb3c6aGlkZGVuIGFuZCB3aWxsIGlnbm9yZSBzY3JvbGwvYXV0by4KKyAgICAvLyBGSVhNRTog
RXZlbnR1YWxseSB0YWJsZSBzZWN0aW9ucyB3aWxsIHN1cHBvcnQgYXV0byBhbmQgc2Nyb2xsLgor
ICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0g
SU5MSU5FX1RBQkxFCisgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dS
T1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKSB7CisgICAgICAgIGlmIChzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURE
RU4pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkg
IT0gT0hJRERFTikKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwor
ICAgIH0KKworICAgIC8vIE1lbnVsaXN0cyBzaG91bGQgaGF2ZSB2aXNpYmxlIG92ZXJmbG93Cisg
ICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KSB7CisgICAgICAgIHN0
eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZ
KE9WSVNJQkxFKTsKKyAgICB9CisKKyAgICAvLyBDdWxsIG91dCBhbnkgdXNlbGVzcyBsYXllcnMg
YW5kIGFsc28gcmVwZWF0IHBhdHRlcm5zIGludG8gYWRkaXRpb25hbCBsYXllcnMuCisgICAgc3R5
bGUtPmFkanVzdEJhY2tncm91bmRMYXllcnMoKTsKKyAgICBzdHlsZS0+YWRqdXN0TWFza0xheWVy
cygpOworCisgICAgLy8gRG8gdGhlIHNhbWUgZm9yIGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25z
LgorICAgIHN0eWxlLT5hZGp1c3RBbmltYXRpb25zKCk7CisgICAgc3R5bGUtPmFkanVzdFRyYW5z
aXRpb25zKCk7CisKKyAgICAvLyBJbXBvcnRhbnQ6IEludHJpbnNpYyBtYXJnaW5zIGdldCBhZGRl
ZCB0byBjb250cm9scyBiZWZvcmUgdGhlIHRoZW1lIGhhcyBhZGp1c3RlZCB0aGUgc3R5bGUsIHNp
bmNlIHRoZSB0aGVtZSB3aWxsCisgICAgLy8gYWx0ZXIgZm9udHMgYW5kIGhlaWdodHMvd2lkdGhz
LgorICAgIGlmIChlICYmIGUtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCkgJiYgc3R5bGUtPmZvbnRT
aXplKCkgPj0gMTEpIHsKKyAgICAgICAgLy8gRG9uJ3QgYXBwbHkgaW50cmluc2ljIG1hcmdpbnMg
dG8gaW1hZ2UgYnV0dG9ucy4gVGhlIGRlc2lnbmVyIGtub3dzIGhvdyBiaWcgdGhlIGltYWdlcyBh
cmUsCisgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gdHJlYXQgYWxsIGltYWdlIGJ1dHRvbnMgYXMg
dGhvdWdoIHRoZXkgd2VyZSBleHBsaWNpdGx5IHNpemVkLgorICAgICAgICBpZiAoIWUtPmhhc1Rh
Z05hbWUoaW5wdXRUYWcpIHx8ICFzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZSktPmlz
SW1hZ2VCdXR0b24oKSkKKyAgICAgICAgICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOwor
ICAgIH0KKworICAgIC8vIExldCB0aGUgdGhlbWUgYWxzbyBoYXZlIGEgY3JhY2sgYXQgYWRqdXN0
aW5nIHRoZSBzdHlsZS4KKyAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAgICAgICAg
UmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5hZGp1c3RTdHlsZSh0aGlzLCBzdHlsZSwgZSwg
bV9zdGF0ZS5oYXNVQUFwcGVhcmFuY2UoKSwgbV9zdGF0ZS5ib3JkZXJEYXRhKCksIG1fc3RhdGUu
YmFja2dyb3VuZERhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICAvLyBJ
ZiB3ZSBoYXZlIGZpcnN0LWxldHRlciBwc2V1ZG8gc3R5bGUsIGRvIG5vdCBzaGFyZSB0aGlzIHN0
eWxlLgorICAgIGlmIChzdHlsZS0+aGFzUHNldWRvU3R5bGUoRklSU1RfTEVUVEVSKSkKKyAgICAg
ICAgc3R5bGUtPnNldFVuaXF1ZSgpOworCisgICAgLy8gRklYTUU6IHdoZW4gZHJvcHBpbmcgdGhl
IC13ZWJraXQgcHJlZml4IG9uIHRyYW5zZm9ybS1zdHlsZSwgd2Ugc2hvdWxkIGFsc28gaGF2ZSBv
cGFjaXR5IDwgMSBjYXVzZSBmbGF0dGVuaW5nLgorICAgIGlmIChzdHlsZS0+cHJlc2VydmVzM0Qo
KSAmJiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFCisgICAgICAgIHx8IHN0eWxlLT5v
dmVyZmxvd1koKSAhPSBPVklTSUJMRQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkpKQor
ICAgICAgICBzdHlsZS0+c2V0VHJhbnNmb3JtU3R5bGUzRChUcmFuc2Zvcm1TdHlsZTNERmxhdCk7
CisKKyAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIGJlaGF2ZSBsaWtlIGJsb2Nrcy4gTWFwIHRoZWly
IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrIHdoZW4gbWFya2VkIGlubGluZS4KKyAgICBpZiAoZSAm
JiBlLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUg
JiYgc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQqPihlKS0+c2hvdWxkRGlzcGxheVNlYW1s
ZXNzbHkoKSkKKyAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKworI2lm
IEVOQUJMRShTVkcpCisgICAgaWYgKGUgJiYgZS0+aXNTVkdFbGVtZW50KCkpIHsKKyAgICAgICAg
Ly8gU3BlYzogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL21hc2tpbmcuaHRtbCNPdmVyZmxvd1By
b3BlcnR5CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1NDUk9MTCkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0hJRERFTik7CisgICAgICAgIGVsc2UgaWYgKHN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1koT1ZJU0lCTEUpOworCisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1NDUk9M
TCkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT0hJRERFTik7CisgICAgICAgIGVs
c2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4g
ZWxlbWVudCBpbiBhbiBTVkcgZG9jdW1lbnQgZnJhZ21lbnQgdHJlZSBob25vcnMgY3NzIHBvc2l0
aW9uCisgICAgICAgIGlmICghKGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZykgJiYgZS0+
cGFyZW50Tm9kZSgpICYmICFlLT5wYXJlbnROb2RlKCktPmlzU1ZHRWxlbWVudCgpKSkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihSZW5kZXJTdHlsZTo6aW5pdGlhbFBvc2l0aW9uKCkp
OworCisgICAgICAgIC8vIFJlbmRlclNWR1Jvb3QgaGFuZGxlcyB6b29taW5nIGZvciB0aGUgd2hv
bGUgU1ZHIHN1YnRyZWUsIHNvIGZvcmVpZ25PYmplY3QgY29udGVudCBzaG91bGQKKyAgICAgICAg
Ly8gbm90IGJlIHNjYWxlZCBhZ2Fpbi4KKyAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUoU1ZHTmFt
ZXM6OmZvcmVpZ25PYmplY3RUYWcpKQorICAgICAgICAgICAgc3R5bGUtPnNldEVmZmVjdGl2ZVpv
b20oUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkpOworICAgIH0KKyNlbmRpZgorfQorCitib29s
IFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU3R5bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCkK
K3sKKyAgICAvLyBGSVhNRSAoQlVHIDcyNDcyKTogV2UgZG9uJ3QgYWRkIEAtd2Via2l0LXJlZ2lv
biBydWxlcyBvZiBzY29wZWQgc3R5bGUgc2hlZXRzIGZvciB0aGUgbW9tZW50LAorICAgIC8vIHNv
IGFsbCByZWdpb24gcnVsZXMgYXJlIGdsb2JhbCBieSBkZWZhdWx0LiBWZXJpZnkgd2hldGhlciB0
aGF0IGNhbiBzdGFuZCBvciBuZWVkcyBjaGFuZ2luZy4KKworICAgIHVuc2lnbmVkIHJ1bGVzU2l6
ZSA9IG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0
cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7
CisgICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0
b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7CisgICAgICAgIGlmIChjaGVja1Jl
Z2lvblNlbGVjdG9yKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNB
bmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9ydWxlU2V0cy51c2VyU3R5bGUoKSkgewor
ICAgICAgICBydWxlc1NpemUgPSBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVj
dG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJ1bGVzU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy51c2VyU3R5
bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsK
KyAgICAgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMudXNlclN0eWxl
KCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVs
ZW1lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjaGVja0Zvck9yaWVudGF0aW9u
Q2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBGb250T3JpZW50YXRpb24gZm9udE9y
aWVudGF0aW9uOworICAgIE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsK
KyAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihzdHlsZSwgZm9udE9yaWVudGF0aW9uLCBn
bHlwaE9yaWVudGF0aW9uKTsKKworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2Ny
aXB0aW9uID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIGlmIChmb250RGVzY3JpcHRp
b24ub3JpZW50YXRpb24oKSA9PSBmb250T3JpZW50YXRpb24gJiYgZm9udERlc2NyaXB0aW9uLm5v
bkNKS0dseXBoT3JpZW50YXRpb24oKSA9PSBnbHlwaE9yaWVudGF0aW9uKQorICAgICAgICByZXR1
cm47CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24o
Z2x5cGhPcmllbnRhdGlvbik7CisgICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9u
KGZvbnRPcmllbnRhdGlvbik7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250
RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnVwZGF0ZUZvbnQoKQorewor
ICAgIGlmICghbV9zdGF0ZS5mb250RGlydHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2hl
Y2tGb3JUZXh0U2l6ZUFkanVzdCgpOworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fc3RhdGUu
c3R5bGUoKTsKKyAgICBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2Uoc3R5bGUsIG1fc3RhdGUu
cGFyZW50U3R5bGUoKSk7CisgICAgY2hlY2tGb3Jab29tQ2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBh
cmVudFN0eWxlKCkpOworICAgIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2Uoc3R5bGUpOworICAg
IHN0eWxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKKyAgICBtX3N0YXRlLnNldEZv
bnREaXJ0eShmYWxzZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2
ZXI6OnN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIHVuc2lnbmVkIHJ1bGVzVG9JbmNs
dWRlKQoreworICAgIHJldHVybiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChlLCBOT1BTRVVE
TywgcnVsZXNUb0luY2x1ZGUpOworfQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJl
c29sdmVyOjpwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCBQc2V1ZG9JZCBw
c2V1ZG9JZCwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCit7CisgICAgaWYgKCFlIHx8ICFlLT5k
b2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOwor
CisgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRv
Y3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKworICAgIE1hdGNoUmVzdWx0IGR1bW15OworICAg
IGlmIChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVzKSB7CisgICAgICAgIC8vIEZp
cnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgICAgIG1h
dGNoVUFSdWxlcyhkdW1teSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQg
cnVsZXMuCisgICAgICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAg
ICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMp
OworICAgIH0KKworICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNU
b0luY2x1ZGUgJiBBdXRob3JDU1NSdWxlcykpIHsKKyAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3Jp
Z2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOworCisgICAg
ICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgorICAgICAgICBtYXRjaEF1
dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworCisgICAg
ICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOworICAgIH0KKworICAgIG1fc3Rh
dGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKworICAgIHJldHVy
biBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
OjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5v
ZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhh
dmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQoreworICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7CisKKyAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkp
IHsKKyAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55
IHBzZXVkbyBlbGVtZW50cy4KKyAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgp
LnBzZXVkb0lkICE9IE5PUFNFVURPKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBt
YXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KKyAg
ICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRv
IGNoZWNrIHRoZSBuYW1lc3BhY2UuCisgICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RT
ZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+
aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFy
dFNlbGVjdG9yKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRh
ZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURh
dGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1
bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAgICAgIGlmICghc2VsZWN0
b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tl
ckZhc3RQYXRoLm1hdGNoZXMoKTsKKyAgICB9CisKKyAgICAvLyBTbG93IHBhdGguCisgICAgU2Vs
ZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwor
ICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxl
RGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRl
ZE1hdGNoRW5hYmxlZCk7CisgICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgp
OworICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVkb0lkID0gc3Rh
dGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7CisgICAgY29udGV4dC5zY3JvbGxiYXIg
PSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXI7CisgICAgY29udGV4dC5zY3Jv
bGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKKyAg
ICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBT
ZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRl
eHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKKyAgICBp
ZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQg
IT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHlu
YW1pY1BzZXVkbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQor
Citib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0
b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQoreworICAgIGlmICgh
cmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0
ZS5tb2RlKCkpOworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3Rv
cjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkgeworICAgICAgICBTZWxlY3RvckNo
ZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMs
IHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwor
ICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAg
IGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9y
ZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorLy8gdGhpcyBpcyBtb3N0bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBhcHBseSBhIGNl
cnRhaW4gcnVsZSB0byB0aGUgcmVuZGVyc3R5bGUuLi4KKworTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6
OmNvbnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJl
bmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxp
ZXIpCit7CisgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZl
cnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBD
YWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2Vu
dGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVu
ZGVmaW5lZCk7Cit9CisKK0xlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9GbG9hdExlbmd0
aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwg
UmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCit7CisgICAgcmV0dXJu
IHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEZs
b2F0Q29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24g
fCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHls
ZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOworfQorCit0ZW1w
bGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3Bl
cnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRP
bmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAg
IEFTU0VSVCgocHJvcGVydHlXaGl0ZWxpc3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9u
KSB8fCBtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSk7CisgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nl
c3NSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworCisgICAgdW5zaWduZWQgcHJvcGVydHlD
b3VudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5Q291bnQoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6
OlByb3BlcnR5UmVmZXJlbmNlIGN1cnJlbnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUF0KGkpOwor
ICAgICAgICBpZiAoaXNJbXBvcnRhbnQgIT0gY3VycmVudC5pc0ltcG9ydGFudCgpKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIGlmIChpbmhlcml0ZWRPbmx5ICYmICFjdXJyZW50Lmlz
SW5oZXJpdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBl
eHBsaWNpdGx5IGluaGVyaXRlZCwgd2UgbmVlZCB0byBhcHBseSBmdXJ0aGVyIG5vbi1pbmhlcml0
ZWQgcHJvcGVydGllcworICAgICAgICAgICAgLy8gYXMgdGhleSBtaWdodCBvdmVycmlkZSB0aGUg
dmFsdWUgaW5oZXJpdGVkIGhlcmUuIEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBhbGxvdyBkZWNs
YXJhdGlvbnMgd2l0aAorICAgICAgICAgICAgLy8gZXhwbGljaXRseSBpbmhlcml0ZWQgcHJvcGVy
dGllcyB0byBiZSBjYWNoZWQuCisgICAgICAgICAgICBBU1NFUlQoIWN1cnJlbnQudmFsdWUoKS0+
aXNJbmhlcml0ZWRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9Cisg
ICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBjdXJyZW50LmlkKCk7CisKKyAgICAgICAg
aWYgKHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbiAmJiAh
U3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkocHJvcGVydHkpKQorICAg
ICAgICAgICAgY29udGludWU7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgICAgICBpZiAo
cHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0Q3VlICYmICFTdHlsZVJl
c29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAgICAgICBj
b250aW51ZTsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKHBhc3MpIHsKKyNpZiBFTkFCTEUoQ1NT
X1ZBUklBQkxFUykKKyAgICAgICAgY2FzZSBWYXJpYWJsZURlZmluaXRpb25zOgorICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlWYXJpYWJsZSA8IGZpcnN0Q1NTUHJvcGVydHks
IENTU192YXJpYWJsZV9pc19iZWZvcmVfZmlyc3RfcHJvcGVydHkpOworICAgICAgICAgICAgaWYg
KHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAgYXBwbHlQ
cm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICBicmVh
azsKKyNlbmRpZgorICAgICAgICBjYXNlIEhpZ2hQcmlvcml0eVByb3BlcnRpZXM6CisgICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChmaXJzdENTU1Byb3BlcnR5ID09IENTU1Byb3BlcnR5Q29sb3Is
IENTU19jb2xvcl9pc19maXJzdF9wcm9wZXJ0eSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChDU1NQcm9wZXJ0eVpvb20gPT0gQ1NTUHJvcGVydHlDb2xvciArIDE4LCBDU1Nfem9vbV9pc19l
bmRfb2ZfZmlyc3RfcHJvcF9yYW5nZSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQgPT0gQ1NTUHJvcGVydHlab29tICsgMSwgQ1NTX2xpbmVfaGVpZ2h0
X2lzX2FmdGVyX3pvb20pOworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgICAgICAgICAg
aWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGdpdmUgc3BlY2lhbCBwcmlvcml0eSB0byBm
b250LXh4eCwgY29sb3IgcHJvcGVydGllcywgZXRjCisgICAgICAgICAgICBpZiAocHJvcGVydHkg
PCBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShj
dXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICAvLyB3ZSBhcHBseSBs
aW5lLWhlaWdodCBsYXRlcgorICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0gQ1NTUHJv
cGVydHlMaW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBM
b3dQcmlvcml0eVByb3BlcnRpZXM6CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPiBDU1NQcm9w
ZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50Lmlk
KCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjpkaWRQcm9jZXNzUnVsZShjb29raWUpOworfQorCit0ZW1wbGF0ZSA8U3R5
bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQs
IGJvb2wgaXNJbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5o
ZXJpdGVkT25seSkKK3sKKyAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAoc3RhdGUuc3R5bGUoKS0+
aW5zaWRlTGluaygpICE9IE5vdEluc2lkZUxpbmspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0
YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgeworICAgICAgICAgICAgY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXNbaV07CisgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gbWF0Y2hlZFBy
b3BlcnRpZXMubGlua01hdGNoVHlwZTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBi
ZSBuaWNlciB0byBwYXNzIHRoZXNlIGFzIGFyZ3VtZW50cyBidXQgdGhhdCByZXF1aXJlcyBjaGFu
Z2VzIGluIG1hbnkgcGxhY2VzLgorICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRv
UmVndWxhclN0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoTGluayk7
CisgICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGxp
bmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoVmlzaXRlZCk7CisKKyAgICAgICAg
ICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdl
dCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRP
bmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVz
LndoaXRlbGlzdFR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSk7CisgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZv
ciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKKyAgICAgICAgY29u
c3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXNbaV07CisgICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVk
UHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0s
IGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlz
dFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKKyAgICB9Cit9CisKK3Vu
c2lnbmVkIFN0eWxlUmVzb2x2ZXI6OmNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3Qg
TWF0Y2hlZFByb3BlcnRpZXMqIHByb3BlcnRpZXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgCisg
ICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6aGFzaE1lbW9yeShwcm9wZXJ0aWVzLCBzaXplb2YoTWF0
Y2hlZFByb3BlcnRpZXMpICogc2l6ZSk7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHls
ZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5n
ZXMmIGIpCit7CisgICAgcmV0dXJuIGEuZmlyc3RVQVJ1bGUgPT0gYi5maXJzdFVBUnVsZQorICAg
ICAgICAmJiBhLmxhc3RVQVJ1bGUgPT0gYi5sYXN0VUFSdWxlCisgICAgICAgICYmIGEuZmlyc3RB
dXRob3JSdWxlID09IGIuZmlyc3RBdXRob3JSdWxlCisgICAgICAgICYmIGEubGFzdEF1dGhvclJ1
bGUgPT0gYi5sYXN0QXV0aG9yUnVsZQorICAgICAgICAmJiBhLmZpcnN0VXNlclJ1bGUgPT0gYi5m
aXJzdFVzZXJSdWxlCisgICAgICAgICYmIGEubGFzdFVzZXJSdWxlID09IGIubGFzdFVzZXJSdWxl
OworfQorCitib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMm
IGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQoreworICAgIHJldHVybiAh
KGEgPT0gYik7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRj
aGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGIpCit7CisgICAgcmV0dXJuIGEucHJvcGVydGllcyA9PSBiLnByb3BlcnRpZXMgJiYgYS5saW5r
TWF0Y2hUeXBlID09IGIubGlua01hdGNoVHlwZTsKK30KKworYm9vbCBvcGVyYXRvciE9KGNvbnN0
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVy
OjpNYXRjaGVkUHJvcGVydGllcyYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOworfQorCitj
b25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogU3R5bGVSZXNv
bHZlcjo6ZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0
IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKK3sKKyAgICBBU1NFUlQoaGFzaCk7CisKKyAgICBN
YXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZS5maW5kKGhhc2gpOworICAgIGlmIChpdCA9PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUu
ZW5kKCkpCisgICAgICAgIHJldHVybiAwOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVt
JiBjYWNoZUl0ZW0gPSBpdC0+dmFsdWU7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBpZiAoc2l6ZSAhPSBjYWNoZUl0ZW0ubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXNbaV0gIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzW2ldKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjYWNoZUl0ZW0ucmFuZ2VzICE9IG1hdGNo
UmVzdWx0LnJhbmdlcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICZjYWNoZUl0ZW07
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNv
bnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1
bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCit7CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2Vl
blN3ZWVwcyA9IDEwMDsKKyAgICBpZiAoKyttX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlv
bnNTaW5jZUxhc3RTd2VlcCA+PSBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdl
ZW5Td2VlcHMKKyAgICAgICAgJiYgIW1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIu
aXNBY3RpdmUoKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xh
cmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMgPSA2MDsKKyAgICAgICAgbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lci5zdGFydE9uZVNob3QobWF0Y2hlZERlY2xhcmF0aW9uQ2Fj
aGVTd2VlcFRpbWVJblNlY29uZHMpOworICAgIH0KKworICAgIEFTU0VSVChoYXNoKTsKKyAgICBN
YXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSBjYWNoZUl0ZW07CisgICAgY2FjaGVJdGVtLm1hdGNo
ZWRQcm9wZXJ0aWVzLmFwcGVuZChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcyk7CisgICAg
Y2FjaGVJdGVtLnJhbmdlcyA9IG1hdGNoUmVzdWx0LnJhbmdlczsKKyAgICAvLyBOb3RlIHRoYXQg
d2UgZG9uJ3QgY2FjaGUgdGhlIG9yaWdpbmFsIFJlbmRlclN0eWxlIGluc3RhbmNlLiBJdCBtYXkg
YmUgZnVydGhlciBtb2RpZmllZC4KKyAgICAvLyBUaGUgUmVuZGVyU3R5bGUgaW4gdGhlIGNhY2hl
IGlzIHJlYWxseSBqdXN0IGEgaG9sZGVyIGZvciB0aGUgc3Vic3RydWN0dXJlcyBhbmQgbmV2ZXIg
dXNlZCBhcy1pcy4KKyAgICBjYWNoZUl0ZW0ucmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xv
bmUoc3R5bGUpOworICAgIGNhY2hlSXRlbS5wYXJlbnRSZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxl
OjpjbG9uZShwYXJlbnRTdHlsZSk7CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmFkZCho
YXNoLCBjYWNoZUl0ZW0pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmludmFsaWRhdGVNYXRj
aGVkUHJvcGVydGllc0NhY2hlKCkKK3sKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuY2xl
YXIoKTsKK30KKworc3RhdGljIGJvb2wgaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUoY29uc3QgRWxlbWVudCogZWxlbWVudCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25z
dCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgLy8gRklYTUU6IENTU1Byb3BlcnR5
V2Via2l0V3JpdGluZ01vZGUgbW9kaWZpZXMgc3RhdGUgd2hlbiBhcHBseWluZyB0byBkb2N1bWVu
dCBlbGVtZW50LiBXZSBjYW4ndCBza2lwIHRoZSBhcHBseWluZyBieSBjYWNoaW5nLgorICAgIGlm
IChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpICYmIGVs
ZW1lbnQtPmRvY3VtZW50KCktPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkgfHwgKHN0eWxlLT5z
dHlsZVR5cGUoKSAhPSBOT1BTRVVETyAmJiBwYXJlbnRTdHlsZS0+dW5pcXVlKCkpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnpvb20oKSAhPSBSZW5kZXJTdHlsZTo6aW5p
dGlhbFpvb20oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+d3JpdGlu
Z01vZGUoKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAvLyBUaGUgY2FjaGUgYXNzdW1lcyBzdGF0aWMga25vd2xlZGdlIGFi
b3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZC4KKyAgICBpZiAocGFyZW50U3R5bGUt
Pmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgRWxlbWVu
dCogZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKKyAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBtYXRjaFJlc3VsdC5pc0NhY2hlYWJs
ZSA/IGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2gobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuZGF0YSgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpIDogMDsK
KyAgICBib29sIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIGNvbnN0IE1hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVJdGVtKiBjYWNoZUl0ZW0gPSAwOworICAgIGlmIChjYWNoZUhhc2ggJiYg
KGNhY2hlSXRlbSA9IGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjYWNoZUhhc2gsIG1h
dGNoUmVzdWx0KSkpIHsKKyAgICAgICAgLy8gV2UgY2FuIGJ1aWxkIHVwIHRoZSBzdHlsZSBieSBj
b3B5aW5nIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tIGFuIGVhcmxpZXIgc3R5bGUgb2Jq
ZWN0IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGV4YWN0CisgICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0
aW9ucy4gV2UgdGhlbiBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVz
LCBpZiBhbnksIGFzIHRoZWlyIHZhbHVlcyBjYW4gZGVwZW5kIG9uIHRoZSAKKyAgICAgICAgLy8g
ZWxlbWVudCBjb250ZXh0LiBUaGlzIGlzIGZhc3QgYW5kIHNhdmVzIG1lbW9yeSBieSByZXVzaW5n
IHRoZSBzdHlsZSBkYXRhIHN0cnVjdHVyZXMuCisgICAgICAgIHN0YXRlLnN0eWxlKCktPmNvcHlO
b25Jbmhlcml0ZWRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworICAgICAgICBp
ZiAoc3RhdGUucGFyZW50U3R5bGUoKS0+aW5oZXJpdGVkRGF0YVNoYXJlZChjYWNoZUl0ZW0tPnBh
cmVudFJlbmRlclN0eWxlLmdldCgpKSAmJiAhaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpKSB7
CisgICAgICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdHVzID0gc3RhdGUuc3R5bGUoKS0+aW5z
aWRlTGluaygpOworICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGl0ZW0gcGFyZW50IHN0eWxl
IGhhcyBpZGVudGljYWwgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgcGFyZW50
IHN0eWxlIHRoZW4gdGhlCisgICAgICAgICAgICAvLyByZXN1bHRpbmcgc3R5bGUgd2lsbCBiZSBp
ZGVudGljYWwgdG9vLiBXZSBjb3B5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcyBvdmVyIGZyb20g
dGhlIGNhY2hlIGFuZCBhcmUgZG9uZS4KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVy
aXRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworCisgICAgICAgICAgICAvLyBV
bmZvcnR1bmF0ZWx5IHRoZSBsaW5rIHN0YXR1cyBpcyB0cmVhdGVkIGxpa2UgYW4gaW5oZXJpdGVk
IHByb3BlcnR5LiBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVzdG9yZSBpdC4KKyAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXR1cyk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gdHJ1ZTsgCisg
ICAgfQorCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgLy8gRmlyc3QgYXBwbHkgYWxs
IHZhcmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5IG1heSBiZSB1c2VkIGR1cmluZyBhcHBsaWNh
dGlvbiBvZiBsYXRlciBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFy
aWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUs
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5s
YXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9w
ZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxl
RGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RV
QVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkp
OworI2VuZGlmCisKKyAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgb2YgdGhlIG1hdGNoZWQgcnVsZXMg
aW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyLiBXYWxrIHRoZSBydWxlcyBhbmQgYXBwbHkKKyAgICAv
LyBoaWdoLXByaW9yaXR5IHByb3BlcnRpZXMgZmlyc3QsIGkuZS4sIHRob3NlIHByb3BlcnRpZXMg
dGhhdCBvdGhlciBwcm9wZXJ0aWVzIGRlcGVuZCBvbi4KKyAgICAvLyBUaGUgb3JkZXIgaXMgKDEp
IGhpZ2gtcHJpb3JpdHkgbm90IGltcG9ydGFudCwgKDIpIGhpZ2gtcHJpb3JpdHkgaW1wb3J0YW50
LCAoMykgbm9ybWFsIG5vdCBpbXBvcnRhbnQKKyAgICAvLyBhbmQgKDQpIG5vcm1hbCBpbXBvcnRh
bnQuCisgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBt
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9u
bHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4o
bWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAg
ICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVz
dWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQu
cmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFS
dWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworCisgICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0
ZW0tPnJlbmRlclN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0
aXZlWm9vbSgpKSB7CisgICAgICAgIHN0YXRlLnNldEZvbnREaXJ0eSh0cnVlKTsKKyAgICAgICAg
YXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgb3VyIGZvbnQg
Z290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQo
KTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lk
ZWQgb24gdGhlIGZvbnQtc2l6ZS4KKyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisg
ICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVp
Z2h0VmFsdWUoKSk7CisKKyAgICAvLyBNYW55IHByb3BlcnRpZXMgZGVwZW5kIG9uIHRoZSBmb250
LiBJZiBpdCBjaGFuZ2VzIHdlIGp1c3QgYXBwbHkgYWxsIHByb3BlcnRpZXMuCisgICAgaWYgKGNh
Y2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5mb250RGVzY3JpcHRpb24oKSAhPSBz
dGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKSkKKyAgICAgICAgYXBwbHlJbmhlcml0ZWRP
bmx5ID0gZmFsc2U7CisKKyAgICAvLyBOb3cgZG8gdGhlIG5vcm1hbCBwcmlvcml0eSBVQSBwcm9w
ZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgCisg
ICAgLy8gQ2FjaGUgb3VyIGJvcmRlciBhbmQgYmFja2dyb3VuZCBzbyB0aGF0IHdlIGNhbiBleGFt
aW5lIHRoZW0gbGF0ZXIuCisgICAgc3RhdGUuY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Cisg
ICAgCisgICAgLy8gTm93IGRvIHRoZSBhdXRob3IgYW5kIHVzZXIgbm9ybWFsIHByaW9yaXR5IHBy
b3BlcnRpZXMgYW5kIGFsbCB0aGUgIWltcG9ydGFudCBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2Us
IG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlICsgMSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0
LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBh
cHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3Jp
dHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0
VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5
KTsKKyAgIAorICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhp
cyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAgIAorICAgIEFTU0VSVCgh
c3RhdGUuZm9udERpcnR5KCkpOworICAgIAorICAgIGlmIChjYWNoZUl0ZW0gfHwgIWNhY2hlSGFz
aCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUoc3RhdGUuZWxlbWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHls
ZSgpKSkKKyAgICAgICAgcmV0dXJuOworICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0
KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVS
dWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQoreworICAgIHJldHVybiByMS0+
c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgp
OworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAgICAgcmV0
dXJuOworCisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOworICAg
IG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVz
KCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1hdGNoZWRQ
YWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzdGQ6OnN0YWJsZV9z
b3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29t
cGFyZVBhZ2VSdWxlcyk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBh
Z2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0
LCBtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOworfQorCitzdGF0aWMgYm9vbCBj
aGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBi
b29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUp
Cit7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNv
bXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKKyAgICAgICAg
aWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7CisgICAgICAgICAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5s
b2NhbE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9j
YWxOYW1lICE9IHBhZ2VOYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorCisgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21w
b25lbnQtPnBzZXVkb1R5cGUoKTsKKyAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVj
dG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1
ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKKyAg
ICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2Ug
JiYgIWlzRmlyc3RQYWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVk
UnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBh
Z2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0eWxl
UnVsZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKKworICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVj
dG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwg
cGFnZU5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgdGhlIHJ1
bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgorICAgICAgICBj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwor
ICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworICAg
IH0KK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNv
bnN0Cit7CisgICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKKyAgICBpZiAoIW1fc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAg
IGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7CisKKyAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0Zp
cnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjppc0Zp
cnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9m
IGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0
aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4gKCFwYWdlSW5kZXgpOworfQorCitTdHJpbmcgU3R5
bGVSZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKK3sKKyAgICAv
LyBGSVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCisgICAg
cmV0dXJuICIiOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxl
KENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQor
eworICAgIGluaXRFbGVtZW50KDApOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShk
b2N1bWVudCgpLCAwLCBzdHlsZSk7CisgICAgbV9zdGF0ZS5zZXRTdHlsZShzdHlsZSk7CisgICAg
YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKGlkLCB2YWx1ZSk7Cit9CisKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENT
U1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUpCisgICAgICAgIGFwcGx5UHJvcGVydHko
aWQsIHZhbHVlKTsKK30KKworaW5saW5lIGJvb2wgaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHko
Q1NTUHJvcGVydHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJUb3BDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29s
b3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRTdHJva2VDb2xvcjoKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGNhc2UgQ1NTUHJvcGVydHlGaWxs
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTdHJva2U6CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworfQorCisvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MzLXJlZ2lvbnMvI3RoZS1h
dC1yZWdpb24tc3R5bGUtcnVsZQorLy8gRklYTUU6IGFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZv
ciBvdGhlciByZWdpb24gc3R5bGluZyBwcm9wZXJ0aWVzLgoraW5saW5lIGJvb2wgU3R5bGVSZXNv
bHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sKKyAg
ICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1
bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lm
IEVOQUJMRShWSURFT19UUkFDSykKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRD
dWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkgewor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQXR0YWNobWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZEltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQ
b3NpdGlvblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlGb250RmFtaWx5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250
VmFyaWFudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKKyAgICBjYXNlIENTU1By
b3BlcnR5TGluZUhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAgICBjYXNl
IENTU1Byb3BlcnR5T3V0bGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRTaGFkb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworfQorI2VuZGlmCisvLyBTVkcgaGFuZGxlcyB6b29taW5nIGluIGEgZGlmZmVy
ZW50IHdheSBjb21wYXJlZCB0byBDU1MuIFRoZSB3aG9sZSBkb2N1bWVudCBpcyBzY2FsZWQgaW5z
dGVhZAorLy8gb2YgZWFjaCBpbmRpdmlkdWFsIGxlbmd0aCB2YWx1ZSBpbiB0aGUgcmVuZGVyIHN0
eWxlIC8gdHJlZS4gQ1NTUHJpbWl0aXZlVmFsdWU6OmNvbXB1dGVMZW5ndGgqKCkKKy8vIG11bHRp
cGxpZXMgZWFjaCByZXNvbHZlZCBsZW5ndGggd2l0aCB0aGUgem9vbSBtdWx0aXBsaWVyIC0gc28g
Zm9yIFNWRyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhhdC4KKy8vIFRob3VnaCBhbGwgQ1NTIHZhbHVl
cyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG91dGVybW9zdCA8c3ZnPiBlbGVtZW50cyAod2lkdGgv
aGVpZ2h0L2JvcmRlci9wYWRkaW5nLi4uKQorLy8gbmVlZCB0byByZXNwZWN0IHRoZSBzY2FsaW5n
LiBSZW5kZXJCb3ggKHRoZSBwYXJlbnQgY2xhc3Mgb2YgUmVuZGVyU1ZHUm9vdCkgZ3JhYnMgdmFs
dWVzIGxpa2UKKy8vIHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy8uLi4gZnJvbSB0aGUgUmVu
ZGVyU3R5bGUgLT4gZm9yIFNWRyB0aGVzZSB2YWx1ZXMgd291bGQgbmV2ZXIgc2NhbGUsCisvLyBp
ZiB3ZSdkIHBhc3MgYSAxLjAgem9vbSBmYWN0b3IgZXZlcnlod2VyZS4gU28gd2Ugb25seSBwYXNz
IGEgem9vbSBmYWN0b3Igb2YgMS4wIGZvciBzcGVjaWZpYworLy8gcHJvcGVydGllcyB0aGF0IGFy
ZSBOT1QgYWxsb3dlZCB0byBzY2FsZSB3aXRoaW4gYSB6b29tZWQgU1ZHIGRvY3VtZW50IChsZXR0
ZXIvd29yZC1zcGFjaW5nL2ZvbnQtc2l6ZSkuCitib29sIFN0eWxlUmVzb2x2ZXI6OnVzZVNWR1pv
b21SdWxlcygpCit7CisgICAgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpICYmIG1fc3RhdGUuZWxl
bWVudCgpLT5pc1NWR0VsZW1lbnQoKTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNr
QnJlYWR0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVz
b2x2ZXI6OlN0YXRlJiBzdGF0ZSwgTGVuZ3RoJiB3b3JraW5nTGVuZ3RoKQoreworICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1pbkNvbnRlbnQpIHsK
KyAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNaW5Db250ZW50KTsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09
IENTU1ZhbHVlV2Via2l0TWF4Q29udGVudCkgeworICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVu
Z3RoKE1heENvbnRlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3b3Jr
aW5nTGVuZ3RoID0gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJD
b252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJz
aW9uIHwgQXV0b0NvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5
bGUoKSwgc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICBpZiAod29ya2luZ0xl
bmd0aC5pc1VuZGVmaW5lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocHJp
bWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgIHdvcmtpbmdMZW5ndGguc2V0UXVpcmso
cHJpbWl0aXZlVmFsdWUtPmlzUXVpcmtWYWx1ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQor
CitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tNaW5NYXgoQ1NTUHJpbWl0aXZlVmFsdWUqIHBy
aW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIEdyaWRUcmFj
a1NpemUmIHRyYWNrU2l6ZSkKK3sKKyAgICBQYWlyKiBtaW5NYXhUcmFja0JyZWFkdGggPSBwcmlt
aXRpdmVWYWx1ZS0+Z2V0UGFpclZhbHVlKCk7CisgICAgaWYgKCFtaW5NYXhUcmFja0JyZWFkdGgp
IHsKKyAgICAgICAgTGVuZ3RoIHdvcmtpbmdMZW5ndGg7CisgICAgICAgIGlmICghY3JlYXRlR3Jp
ZFRyYWNrQnJlYWR0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUsIHdvcmtpbmdMZW5ndGgpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyYWNrU2l6ZS5zZXRMZW5ndGgod29y
a2luZ0xlbmd0aCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIExlbmd0aCBt
aW5UcmFja0JyZWFkdGg7CisgICAgTGVuZ3RoIG1heFRyYWNrQnJlYWR0aDsKKyAgICBpZiAoIWNy
ZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5maXJzdCgpLCBzdGF0ZSwg
bWluVHJhY2tCcmVhZHRoKSB8fCAhY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0Jy
ZWFkdGgtPnNlY29uZCgpLCBzdGF0ZSwgbWF4VHJhY2tCcmVhZHRoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgdHJhY2tTaXplLnNldE1pbk1heChtaW5UcmFja0JyZWFkdGgsIG1heFRy
YWNrQnJlYWR0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdy
aWRUcmFja0dyb3VwKENTU1ZhbHVlKiB2YWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUm
IHN0YXRlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMpCit7CisgICAgaWYgKCF2
YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChD
U1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkg
eworICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICBpZiAo
IWN1cnJWYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIEdyaWRUcmFja1NpemUgdHJhY2tTaXplOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRUcmFja01pbk1heChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGN1cnJWYWx1
ZSksIHN0YXRlLCB0cmFja1NpemUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIHRyYWNrU2l6ZXMuYXBwZW5kKHRyYWNrU2l6ZSk7CisgICAgfQorICAgIHJldHVybiB0cnVl
OworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tMaXN0KENTU1ZhbHVlKiB2YWx1ZSwg
VmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzLCBjb25zdCBTdHlsZVJlc29sdmVyOjpT
dGF0ZSYgc3RhdGUpCit7CisgICAgLy8gSGFuZGxlICdub25lJy4KKyAgICBpZiAodmFsdWUtPmlz
UHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZl
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
cmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZTsKKyAgICB9
CisKKyAgICByZXR1cm4gY3JlYXRlR3JpZFRyYWNrR3JvdXAodmFsdWUsIHN0YXRlLCB0cmFja1Np
emVzKTsKK30KKworCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkUG9zaXRpb24oQ1NTVmFsdWUqIHZh
bHVlLCBHcmlkUG9zaXRpb24mIHBvc2l0aW9uKQoreworICAgIC8vIEZvciBub3csIHdlIG9ubHkg
YWNjZXB0OiA8aW50ZWdlcj4gfCAnYXV0bycKKyAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwor
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04o
cHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpOworICAgIHBvc2l0aW9uLnNldEludGVnZXJQb3Np
dGlvbihwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKK3N0YXRpYyBib29sIGhhc1ZhcmlhYmxlUmVm
ZXJlbmNlKENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFs
dWUoKSkgeworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHByaW1p
dGl2ZVZhbHVlLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOworICAgIH0KKworICAgIGlmICh2YWx1
ZS0+aXNDYWxjdWxhdGlvblZhbHVlKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1ND
YWxjVmFsdWUqPih2YWx1ZSktPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7CisKKyAgICBpZiAodmFs
dWUtPmlzUmVmbGVjdFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7CisgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBkaXJlY3Rpb24gPSByZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpOwor
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogb2Zmc2V0ID0gcmVmbGVjdFZhbHVlLT5vZmZzZXQo
KTsKKyAgICAgICAgQ1NTVmFsdWUqIG1hc2sgPSByZWZsZWN0VmFsdWUtPm1hc2soKTsKKyAgICAg
ICAgcmV0dXJuIChkaXJlY3Rpb24gJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UoZGlyZWN0aW9uKSkg
fHwgKG9mZnNldCAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShvZmZzZXQpKSB8fCAobWFzayAmJiBo
YXNWYXJpYWJsZVJlZmVyZW5jZShtYXNrKSk7CisgICAgfQorCisgICAgZm9yIChDU1NWYWx1ZUxp
c3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAg
ICBpZiAoaGFzVmFyaWFibGVSZWZlcmVuY2UoaS52YWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTdHlsZVJlc29s
dmVyOjpyZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwg
VmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lv
bnMpCit7CisgICAgc3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gZXhwcmVzc2lvbihp
ZCwgdmFsdWUtPnNlcmlhbGl6ZVJlc29sdmluZ1ZhcmlhYmxlcygqbV9zdGF0ZS5zdHlsZSgpLT52
YXJpYWJsZXMoKSkpOworCisgICAgaWYgKGtub3duRXhwcmVzc2lvbnMuY29udGFpbnMoZXhwcmVz
c2lvbikpCisgICAgICAgIHJldHVybjsgLy8gY3ljbGUgZGV0ZWN0ZWQuCisKKyAgICBrbm93bkV4
cHJlc3Npb25zLmFwcGVuZChleHByZXNzaW9uKTsKKworICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBi
ZSBmYXN0ZXIgbm90IHRvIHJlLXBhcnNlIGZyb20gc3RyaW5ncywgYnV0IGZvciBub3cgQ1NTIHBy
b3BlcnR5IHZhbGlkYXRpb24gbGl2ZXMgaW5zaWRlIHRoZSBwYXJzZXIgc28gd2UgZG8gaXQgdGhl
cmUuCisgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHJlc3VsdFNldCA9IFN0eWxlUHJvcGVy
dHlTZXQ6OmNyZWF0ZSgpOworICAgIGlmICghQ1NTUGFyc2VyOjpwYXJzZVZhbHVlKHJlc3VsdFNl
dC5nZXQoKSwgaWQsIGV4cHJlc3Npb24uc2Vjb25kLCBmYWxzZSwgZG9jdW1lbnQoKSkpCisgICAg
ICAgIHJldHVybjsgLy8gZXhwcmVzc2lvbiBmYWlsZWQgdG8gcGFyc2UuCisKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcmVzdWx0U2V0LT5wcm9wZXJ0eUNvdW50KCk7IGkrKykgeworICAg
ICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVyZW5jZSBwcm9wZXJ0eSA9IHJlc3Vs
dFNldC0+cHJvcGVydHlBdChpKTsKKyAgICAgICAgaWYgKHByb3BlcnR5LmlkKCkgIT0gQ1NTUHJv
cGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShwcm9wZXJ0eS52YWx1ZSgpKSkK
KyAgICAgICAgICAgIHJlc29sdmVWYXJpYWJsZXMocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFs
dWUoKSwga25vd25FeHByZXNzaW9ucyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFwcGx5
UHJvcGVydHkocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSk7CisgICAgfQorfQorI2Vu
ZGlmCisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlk
LCBDU1NWYWx1ZSogdmFsdWUpCit7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgaWYg
KGlkICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UodmFsdWUp
KSB7CisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+IGtu
b3duRXhwcmVzc2lvbnM7CisgICAgICAgIHJlc29sdmVWYXJpYWJsZXMoaWQsIHZhbHVlLCBrbm93
bkV4cHJlc3Npb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLy8g
Q1NTIHZhcmlhYmxlcyBkb24ndCByZXNvbHZlIHNob3J0aGFuZHMgYXQgcGFyc2luZyB0aW1lLCBz
byB0aGlzIHNob3VsZCBiZSAqYWZ0ZXIqIGhhbmRsaW5nIHZhcmlhYmxlcy4KKyAgICBBU1NFUlRf
V0lUSF9NRVNTQUdFKCFpc0V4cGFuZGVkU2hvcnRoYW5kKGlkKSwgIlNob3J0aGFuZCBwcm9wZXJ0
eSBpZCA9ICVkIHdhc24ndCBleHBhbmRlZCBhdCBwYXJzaW5nIHRpbWUiLCBpZCk7CisKKyAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGJvb2wgaXNJbmhlcml0ID0gc3RhdGUucGFyZW50
Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCk7CisgICAgYm9vbCBpc0luaXRpYWwg
PSB2YWx1ZS0+aXNJbml0aWFsVmFsdWUoKSB8fCAoIXN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1
ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsKKworICAgIEFTU0VSVCghaXNJbmhlcml0IHx8ICFpc0lu
aXRpYWwpOyAvLyBpc0luaGVyaXQgLT4gIWlzSW5pdGlhbCAmJiBpc0luaXRpYWwgLT4gIWlzSW5o
ZXJpdAorICAgIEFTU0VSVCghaXNJbmhlcml0IHx8IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3Rh
dGUucGFyZW50U3R5bGUoKSkpOyAvLyBpc0luaGVyaXQgLT4gKHN0YXRlLnBhcmVudE5vZGUoKSAm
JiBzdGF0ZS5wYXJlbnRTdHlsZSgpKQorCisgICAgaWYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGUoKSAmJiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUo
KSB8fCAhaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoaWQpKSkgeworICAgICAgICAvLyBMaW1p
dCB0aGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG9ubHkgdGhlIG9uZXMgaG9u
b3JlZCBieSA6dmlzaXRlZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0lu
aGVyaXQgJiYgIXN0YXRlLnBhcmVudFN0eWxlKCktPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9w
ZXJ0aWVzKCkgJiYgIUNTU1Byb3BlcnR5Ojppc0luaGVyaXRlZFByb3BlcnR5KGlkKSkKKyAgICAg
ICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0SGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRp
ZXMoKTsKKworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGlmIChpZCA9PSBDU1NQcm9w
ZXJ0eVZhcmlhYmxlKSB7CisgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9O
KHZhbHVlLT5pc1ZhcmlhYmxlVmFsdWUoKSk7CisgICAgICAgIENTU1ZhcmlhYmxlVmFsdWUqIHZh
cmlhYmxlID0gc3RhdGljX2Nhc3Q8Q1NTVmFyaWFibGVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
QVNTRVJUKCF2YXJpYWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCghdmFy
aWFibGUtPnZhbHVlKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VmFy
aWFibGUodmFyaWFibGUtPm5hbWUoKSwgdmFyaWFibGUtPnZhbHVlKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBDaGVjayBsb29rdXAgdGFibGUgZm9yIGltcGxl
bWVudGF0aW9ucyBhbmQgdXNlIHdoZW4gYXZhaWxhYmxlLgorICAgIGNvbnN0IFByb3BlcnR5SGFu
ZGxlciYgaGFuZGxlciA9IG1fc3R5bGVCdWlsZGVyLnByb3BlcnR5SGFuZGxlcihpZCk7CisgICAg
aWYgKGhhbmRsZXIuaXNWYWxpZCgpKSB7CisgICAgICAgIGlmIChpc0luaGVyaXQpCisgICAgICAg
ICAgICBoYW5kbGVyLmFwcGx5SW5oZXJpdFZhbHVlKGlkLCB0aGlzKTsKKyAgICAgICAgZWxzZSBp
ZiAoaXNJbml0aWFsKQorICAgICAgICAgICAgaGFuZGxlci5hcHBseUluaXRpYWxWYWx1ZShpZCwg
dGhpcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlWYWx1ZShpZCwg
dGhpcywgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSA/IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpIDogMDsKKworICAgIGZsb2F0IHpvb21G
YWN0b3IgPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisKKyAgICAvLyBXaGF0IGZv
bGxvd3MgaXMgYSBsaXN0IHRoYXQgbWFwcyB0aGUgQ1NTIHByb3BlcnRpZXMgaW50byB0aGVpciBj
b3JyZXNwb25kaW5nIGZyb250LWVuZAorICAgIC8vIFJlbmRlclN0eWxlIHZhbHVlcy4KKyAgICBz
d2l0Y2ggKGlkKSB7CisgICAgLy8gbGlzdHMKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoK
KyAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQorICAgICAg
ICB7CisgICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0
byBpbmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlzCisgICAgICAgICAgICAv
LyBub3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBi
ZSBzdXBwb3J0ZWQuCisKKyAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBib29sIGRpZFNldCA9
IGZhbHNlOworICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBp
dGVtID0gaS52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJh
dG9yVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZh
bHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50
KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVl
Kj4oaXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0
KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGlj
X2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAg
ICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJv
bVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+
KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyNl
bmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0lt
YWdlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250
ZW50KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19j
YXN0PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAg
IGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KGl0ZW0pOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmco
KSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRl
bnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7CisgICAgICAgICAgICAg
ICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50
VmFsdWUtPmlzQXR0cigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBu
YW1lc3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/CisgICAgICAgICAgICAgICAg
ICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgp
LT5zZXRVbmlxdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51
bGxBdG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7
CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5l
bGVtZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmlt
cGwoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZh
bHVlIGFmZmVjdHMgdGhlIHN0eWxlCisgICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVh
dHVyZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRD
b3VudGVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0
eWxlVHlwZSA9IE5vbmVMaXN0U3R5bGU7CisgICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5
bGVJZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlz
dFN0eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOworICAgICAgICAgICAgICAgICAgICBPd25QdHI8
Q291bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291
bnRlclZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2Vw
YXJhdG9yKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVu
dChjb3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBz
d2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlT3BlblF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7
CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5R
dW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
Tk9fT1BFTl9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KKyAgICAgICAg
ICAgICAgICAgICAgICAgIHsgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkaWRTZXQpCisgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgorICAgICAgICBpZiAoaXNJ
bmhlcml0KSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFy
ZW50U3R5bGUoKS0+cXVvdGVzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1
b3RlcygwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFs
dWUtPmlzVmFsdWVMaXN0KCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0
YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKKyAgICAgICAgICAgIFJlZlB0cjxRdW90
ZXNEYXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikgeworICAgICAgICAgICAg
ICAgIENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Cisg
ICAgICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNv
IHRoaXMgaXMgc2FmZS4KKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+
aXRlbShpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIEFT
U0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgp
KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAg
IFN0cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25k
KS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3Rk
OjptYWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICAg
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKKyAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkp
OworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZh
bWlseTogeworICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlkcworICAgICAgICBpZiAo
aXNJbmhlcml0KSB7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2Ny
aXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAg
ICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9u
dERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0Zh
bWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFt
aWx5KCkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChw
YXJlbnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOworICAgICAgICAgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBGb250RGVz
Y3JpcHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3Jp
cHRpb24oKTsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFj
Y291bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKKyAgICAg
ICAgICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCisgICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0
aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUo
KSkKKyAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXpl
Rm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24u
a2V5d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOworICAgICAgICAg
ICAgaWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFt
aWx5KCkpOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5p
c1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGb250RGVzY3JpcHRp
b24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Cisg
ICAgICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFt
aWx5KCk7CisgICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAwOworCisgICAgICAgIC8v
IEJlZm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQg
cmVzZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgorICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhl
ZERlZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKKyAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpO
b0ZhbWlseSk7CisKKyAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0g
PSBpLnZhbHVlKCk7CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwor
ICAgICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7CisgICAgICAgICAgICBTZXR0aW5ncyogc2V0
dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICBpZiAoY29udGVudFZhbHVl
LT5pc1N0cmluZygpKQorICAgICAgICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0
cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncykgeworICAgICAgICAg
ICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBz
ZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKKyAgICAgICAgICAgICAgICAg
ICAgZmFjZSA9IHNlcmlmRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNT
ZXJpZjoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKKyAgICAg
ICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2Ny
aXB0aW9uOjpTYW5zU2VyaWZGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKKyAgICAgICAgICAgICAgICAgICAg
ZmFjZSA9IGN1cnNpdmVGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50
YXN5OgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKKyAgICAgICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpGYW50YXN5RmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKKyAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IG1vbm9zcGFjZUZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Vi
a2l0UGljdG9ncmFwaDoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1p
bHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5
KEZvbnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKCFmYWNlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkg
eworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCisg
ICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKKyAgICAgICAg
ICAgICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGlu
aGVyaXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgY3VyckZh
bWlseSA9ICZmaXJzdEZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldElzU3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZv
bnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFy
ZWRGb250RmFtaWx5OjpjcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5z
ZXRGYW1pbHkoZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZh
bWlseShuZXdGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFt
aWx5LmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFs
bCBuZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgICAgLy8gSWYgY3VyckZh
bWlseSBpcyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMg
ZGVzY3JpcHRpb24uCisgICAgICAgIGlmIChjdXJyRmFtaWx5KSB7CisgICAgICAgICAgICBpZiAo
Zm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVk
RGVmYXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKKyAgICAgICAg
ICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChk
b2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUo
KSAtIDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOworCisgICAgICAgICAgICBz
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIC8vIFNob3J0aGFuZCBwcm9wZXJ0aWVzLgorICAgIGNhc2UgQ1NT
UHJvcGVydHlGb250OgorICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAgICBGb250
RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KHN0
YXRlLnBhcmVudFN0eWxlKCktPnNwZWNpZmllZExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICBz
dGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRp
b24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0luaXRpYWwpIHsKKyAg
ICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAg
ICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRp
b24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhh
dmUgc2V0dGluZ3MKKyAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7CisgICAg
ICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworICAg
ICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworCisgICAgICAgICAgICBGb250
RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgICAgICAgICAgUmVuZGVyVGhlbWU6OmRl
ZmF1bHRUaGVtZSgpLT5zeXN0ZW1Gb250KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpLCBmb250
RGVzY3JpcHRpb24pOworCisgICAgICAgICAgICAvLyBEb3VibGUtY2hlY2sgYW5kIHNlZSBpZiB0
aGUgdGhlbWUgZGlkIGFueXRoaW5nLiBJZiBub3QsIGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUg
Zm9udC4KKyAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSkg
eworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHBy
aW50ZXIgZm9udCBzZXR0aW5ncyBhcmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBTZXR0aW5n
cyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgQVNTRVJU
KHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1
bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwor
ICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0
aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0
aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdz
LT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKworICAgICAgICAgICAgICAgIC8v
IEhhbmRsZSB0aGUgem9vbSBmYWN0b3IuCisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVu
dCgpLCBzdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgZm9u
dERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKKyAgICAg
ICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+aXNGb250VmFsdWUoKSkgeworICAgICAg
ICAgICAgRm9udFZhbHVlKiBmb250ID0gc3RhdGljX2Nhc3Q8Rm9udFZhbHVlKj4odmFsdWUpOwor
ICAgICAgICAgICAgaWYgKCFmb250LT5zdHlsZSB8fCAhZm9udC0+dmFyaWFudCB8fCAhZm9udC0+
d2VpZ2h0CisgICAgICAgICAgICAgICAgfHwgIWZvbnQtPnNpemUgfHwgIWZvbnQtPmxpbmVIZWln
aHQgfHwgIWZvbnQtPmZhbWlseSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFN0eWxlLCBmb250LT5zdHlsZS5nZXQoKSk7
CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFZhcmlhbnQsIGZvbnQt
PnZhcmlhbnQuZ2V0KCkpOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZv
bnRXZWlnaHQsIGZvbnQtPndlaWdodC5nZXQoKSk7CisgICAgICAgICAgICAvLyBUaGUgcHJldmlv
dXMgcHJvcGVydGllcyBjYW4gZGlydHkgb3VyIGZvbnQgYnV0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJl
YWQgdGhlIGZvbnQncworICAgICAgICAgICAgLy8gcHJvcGVydGllcyBiYWNrLCB3aGljaCBpcyBz
YWZlLiBIb3dldmVyIGlmIGZvbnQtc2l6ZSBpcyB1c2luZyB0aGUgJ2V4JyB1bml0LCBpdCB3aWxs
CisgICAgICAgICAgICAvLyBuZWVkIHF1ZXJ5IHRoZSBkaXJ0aWVkIGZvbnQncyB4LWhlaWdodCB0
byBnZXQgdGhlIGNvbXB1dGVkIHNpemUuIFRvIGJlIHNhZmUgaW4gdGhpcworICAgICAgICAgICAg
Ly8gY2FzZSwgbGV0J3MganVzdCB1cGRhdGUgdGhlIGZvbnQgbm93LgorICAgICAgICAgICAgdXBk
YXRlRm9udCgpOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTaXpl
LCBmb250LT5zaXplLmdldCgpKTsKKworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKGZvbnQtPmxpbmVIZWlnaHQuZ2V0KCkpOworCisgICAgICAgICAgICBhcHBseVByb3BlcnR5
KENTU1Byb3BlcnR5Rm9udEZhbWlseSwgZm9udC0+ZmFtaWx5LmdldCgpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXI6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclJpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5n
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyVG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJXaWR0aDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5TGlzdFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9u
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJC
ZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
RmxleDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEZsb3c6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRS
b3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkNvbGxhcHNlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJxdWVlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNr
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRF
bXBoYXNpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luOgorI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0V3JhcDoKKyNlbmRpZgorICAgICAgICBBU1NFUlQoaXNFeHBhbmRlZFNo
b3J0aGFuZChpZCkpOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJl
YWs7CisKKyAgICAvLyBDU1MzIFByb3BlcnRpZXMKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNo
YWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hTaGFkb3c6IHsKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAgICAgICAg
ICAgaWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAgICByZXR1
cm4gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0
U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+
dGV4dFNoYWRvdygpKSkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHls
ZSgpLT5zZXRCb3hTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkgPyBhZG9w
dFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkpKSA6
IG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luaXRpYWwgfHwgcHJpbWl0aXZl
VmFsdWUpIC8vIGluaXRpYWwgfCBub25lCisgICAgICAgICAgICByZXR1cm4gaWQgPT0gQ1NTUHJv
cGVydHlUZXh0U2hhZG93ID8gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhudWxscHRyKSA6
IHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhudWxscHRyKTsKKworICAgICAgICBpZiAoIXZh
bHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAo
Q1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAg
ICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFk
b3dWYWx1ZSo+KGN1cnJWYWx1ZSk7CisgICAgICAgICAgICBpbnQgeCA9IGl0ZW0tPngtPmNvbXB1
dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgaW50IHkgPSBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGlu
dD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsK
KyAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVM
ZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21G
YWN0b3IpIDogMDsKKyAgICAgICAgICAgIGludCBzcHJlYWQgPSBpdGVtLT5zcHJlYWQgPyBpdGVt
LT5zcHJlYWQtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxl
bWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIFNoYWRvd1N0eWxlIHNo
YWRvd1N0eWxlID0gaXRlbS0+c3R5bGUgJiYgaXRlbS0+c3R5bGUtPmdldElkZW50KCkgPT0gQ1NT
VmFsdWVJbnNldCA/IEluc2V0IDogTm9ybWFsOworICAgICAgICAgICAgQ29sb3IgY29sb3I7Cisg
ICAgICAgICAgICBpZiAoaXRlbS0+Y29sb3IpCisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7CisgICAgICAgICAgICBlbHNl
IGlmIChzdGF0ZS5zdHlsZSgpKQorICAgICAgICAgICAgICAgIGNvbG9yID0gc3RhdGUuc3R5bGUo
KS0+Y29sb3IoKTsKKworICAgICAgICAgICAgT3duUHRyPFNoYWRvd0RhdGE+IHNoYWRvd0RhdGEg
PSBhZG9wdFB0cihuZXcgU2hhZG93RGF0YShJbnRQb2ludCh4LCB5KSwgYmx1ciwgc3ByZWFkLCBz
aGFkb3dTdHlsZSwgaWQgPT0gQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csIGNvbG9yLmlzVmFs
aWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50KSk7CisgICAgICAgICAgICBpZiAoaWQg
PT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFRleHRTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0
byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc2hhZG93RGF0
YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5v
dCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZsZWN0OiB7CisgICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKGJveFJlZmxlY3QsIEJveFJlZmxlY3QpCisgICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChS
ZW5kZXJTdHlsZTo6aW5pdGlhbEJveFJlZmxlY3QoKSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOworICAgICAgICBSZWZQdHI8U3R5
bGVSZWZsZWN0aW9uPiByZWZsZWN0aW9uID0gU3R5bGVSZWZsZWN0aW9uOjpjcmVhdGUoKTsKKyAg
ICAgICAgcmVmbGVjdGlvbi0+c2V0RGlyZWN0aW9uKCpyZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigp
KTsKKyAgICAgICAgaWYgKHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCkpCisgICAgICAgICAgICByZWZs
ZWN0aW9uLT5zZXRPZmZzZXQocmVmbGVjdFZhbHVlLT5vZmZzZXQoKS0+Y29udmVydFRvTGVuZ3Ro
PEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRD
b252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21G
YWN0b3IpKTsKKyAgICAgICAgTmluZVBpZWNlSW1hZ2UgbWFzazsKKyAgICAgICAgbWFzay5zZXRN
YXNrRGVmYXVsdHMoKTsKKyAgICAgICAgbV9zdHlsZU1hcC5tYXBOaW5lUGllY2VJbWFnZShpZCwg
cmVmbGVjdFZhbHVlLT5tYXNrKCksIG1hc2spOworICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNr
KG1hc2spOworCisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QocmVmbGVjdGlv
bi5yZWxlYXNlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVy
dHlTcmM6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgorICAgICAgICByZXR1cm47
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVSYW5nZTogLy8gT25seSB1c2VkIGluIEBmb250
LWZhY2UgcnVsZXMuCisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFycXVlZVJlcGV0aXRpb246IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwo
bWFycXVlZUxvb3BDb3VudCwgTWFycXVlZUxvb3BDb3VudCkKKyAgICAgICAgaWYgKCFwcmltaXRp
dmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5maW5pdGUpCisgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KC0xKTsgLy8gLTEgbWVhbnMgcmVwZWF0IGZvcmV2ZXIu
CisgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKQorICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudChwcmltaXRpdmVWYWx1ZS0+Z2V0
SW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hcnF1ZWVTcGVlZDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElB
TChtYXJxdWVlU3BlZWQsIE1hcnF1ZWVTcGVlZCkKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1
ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGludCBpZGVudCA9IHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGlkZW50KSB7CisgICAg
ICAgICAgICBjYXNlIENTU1ZhbHVlU2xvdzoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRNYXJxdWVlU3BlZWQoNTAwKTsgLy8gNTAwIG1zZWMuCisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg4NSk7IC8vIDg1bXNlYy4gVGhlIFdpbklFIGRl
ZmF1bHQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVl
RmFzdDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoMTAp
OyAvLyAxMG1zZWMuIFN1cGVyIGZhc3QuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzVGltZSgpKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5j
b21wdXRlVGltZTxpbnQsIENTU1ByaW1pdGl2ZVZhbHVlOjpNaWxsaXNlY29uZHM+KCkpOworICAg
ICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgLy8gRm9yIHNjcm9sbGFt
b3VudCBzdXBwb3J0LgorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVk
KHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZUluY3JlbWVudDogeworICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlSW5jcmVtZW50LCBNYXJxdWVlSW5jcmVt
ZW50KQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIHN3
aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ1NT
VmFsdWVTbWFsbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5j
cmVtZW50KExlbmd0aCgxLCBGaXhlZCkpOyAvLyAxcHguCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDYsIEZpeGVkKSk7IC8vIDZweC4g
VGhlIFdpbklFIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlTGFyZ2U6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFy
cXVlZUluY3JlbWVudChMZW5ndGgoMzYsIEZpeGVkKSk7IC8vIDM2cHguCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBM
ZW5ndGggbWFycXVlZUxlbmd0aCA9IGNvbnZlcnRUb0ludExlbmd0aChwcmltaXRpdmVWYWx1ZSwg
c3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIGlm
ICghbWFycXVlZUxlbmd0aC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQobWFycXVlZUxlbmd0aCk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9jYWxlOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxvY2FsZSwgTG9jYWxlKTsKKyAg
ICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKKyAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShudWxsQXRvbSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShwcmltaXRpdmVWYWx1ZS0+Z2V0U3Ry
aW5nVmFsdWUoKSk7CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBz
dGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKHN0YXRlLnN0eWxl
KCktPmxvY2FsZSgpKSk7CisgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRp
b24pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0U2l6ZUFkanVzdDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0
U2l6ZUFkanVzdCwgVGV4dFNpemVBZGp1c3QpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUg
fHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICBzZXRUZXh0U2l6ZUFkanVzdChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZUF1dG8pOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmIEVOQUJMRShEQVNIQk9BUkRf
U1VQUE9SVCkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RGFzaGJvYXJkUmVnaW9uOgorICAg
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZGFzaGJvYXJkUmVnaW9ucywg
RGFzaGJvYXJkUmVnaW9ucykKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0g
Q1NTVmFsdWVOb25lKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRS
ZWdpb25zKFJlbmRlclN0eWxlOjpub25lRGFzaGJvYXJkUmVnaW9ucygpKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiogcmVnaW9uID0g
cHJpbWl0aXZlVmFsdWUtPmdldERhc2hib2FyZFJlZ2lvblZhbHVlKCk7CisgICAgICAgIGlmICgh
cmVnaW9uKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiog
Zmlyc3QgPSByZWdpb247CisgICAgICAgIHdoaWxlIChyZWdpb24pIHsKKyAgICAgICAgICAgIExl
bmd0aCB0b3AgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT50b3AoKSwgc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCByaWdodCA9
IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnJpZ2h0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggYm90dG9tID0gY29udmVy
dFRvSW50TGVuZ3RoKHJlZ2lvbi0+Ym90dG9tKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggbGVmdCA9IGNvbnZlcnRUb0ludExl
bmd0aChyZWdpb24tPmxlZnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpKTsKKworICAgICAgICAgICAgaWYgKHRvcC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAg
ICAgIHRvcCA9IExlbmd0aCgpOworICAgICAgICAgICAgaWYgKHJpZ2h0LmlzVW5kZWZpbmVkKCkp
CisgICAgICAgICAgICAgICAgcmlnaHQgPSBMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChib3R0
b20uaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBib3R0b20gPSBMZW5ndGgoKTsKKyAg
ICAgICAgICAgIGlmIChsZWZ0LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgbGVmdCA9
IExlbmd0aCgpOworCisgICAgICAgICAgICBpZiAocmVnaW9uLT5tX2lzQ2lyY2xlKQorICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2Fy
ZFJlZ2lvbjo6Q2lyY2xlLCByZWdpb24tPm1fbGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVm
dCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2UgOiB0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgaWYg
KHJlZ2lvbi0+bV9pc1JlY3RhbmdsZSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OlJlY3RhbmdsZSwgcmVnaW9u
LT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZh
bHNlIDogdHJ1ZSk7CisgICAgICAgICAgICByZWdpb24gPSByZWdpb24tPm1fbmV4dC5nZXQoKTsK
KyAgICAgICAgfQorCisgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJl
Z2lvbnModHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJM
RShEUkFHR0FCTEVfUkVHSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBSZWdpb246
IHsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSB8fCAhcHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERy
YWdnYWJsZVJlZ2lvbk1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVE
cmFnID8gRHJhZ2dhYmxlUmVnaW9uRHJhZyA6IERyYWdnYWJsZVJlZ2lvbk5vRHJhZyk7CisgICAg
ICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dFN0cm9rZVdpZHRoOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRT
dHJva2VXaWR0aCwgVGV4dFN0cm9rZVdpZHRoKQorICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Cisg
ICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVRoaW46CisgICAgICAgIGNhc2UgQ1NTVmFsdWVNZWRpdW06CisgICAgICAgIGNh
c2UgQ1NTVmFsdWVUaGljazogeworICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDEuMCAvIDQ4
OworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVl
TWVkaXVtKQorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAzOworICAgICAgICAgICAgZWxzZSBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUaGljaykKKyAgICAgICAg
ICAgICAgICByZXN1bHQgKj0gNTsKKyAgICAgICAgICAgIHdpZHRoID0gQ1NTUHJpbWl0aXZlVmFs
dWU6OmNyZWF0ZShyZXN1bHQsIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfRU1TKS0+Y29tcHV0ZUxl
bmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29t
RmFjdG9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6
CisgICAgICAgICAgICB3aWR0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VGV4dFN0cm9rZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHRyYW5zZm9ybSwgVHJhbnNmb3JtKTsKKyAgICAgICAgVHJhbnNmb3JtT3BlcmF0
aW9ucyBvcGVyYXRpb25zOworICAgICAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVl
LCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUcmFuc2Zvcm0ob3BlcmF0aW9ucyk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHBlcnNwZWN0aXZlLCBQZXJzcGVj
dGl2ZSkKKworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5v
bmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKDApOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVW
YWx1ZTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAg
ICAgcGVyc3BlY3RpdmVWYWx1ZSA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwor
ICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAg
ICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRyZWF0IHZhbHVlbGVzcyBudW1iZXJz
IGFzIHB4LgorICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVl
OjpjcmVhdGUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCksIENTU1ByaW1pdGl2ZVZh
bHVlOjpDU1NfUFgpLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBpZiAocGVyc3BlY3RpdmVWYWx1ZSA+PSAwLjBmKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVWYWx1ZSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I6IHsKKyAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwodGFwSGlnaGxpZ2h0Q29sb3IsIFRhcEhpZ2hsaWdodENvbG9y
KTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIENvbG9yIGNvbCA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKHByaW1pdGl2ZVZhbHVl
KTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGFwSGlnaGxpZ2h0Q29sb3IoY29sKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVS
RkxPV19TQ1JPTExJTkcpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE92ZXJmbG93U2Nyb2xs
aW5nOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHVzZVRvdWNoT3ZlcmZs
b3dTY3JvbGxpbmcsIFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcpOworICAgICAgICBpZiAoIXBy
aW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkg
PT0gQ1NTVmFsdWVUb3VjaCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBj
YXNlIENTU1Byb3BlcnR5SW52YWxpZDoKKyAgICAgICAgcmV0dXJuOworICAgIC8vIERpcmVjdGlv
bmFsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVkIGJ5IHJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3Bl
cnR5KCkgYmVmb3JlIHRoZSBzd2l0Y2guCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckVuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kV2lkdGg6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlclN0YXJ0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclN0YXJ0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0V2lk
dGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZUNvbG9yOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyQmVmb3JlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckFmdGVyQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyU3R5
bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkVuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFyZ2luU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXJnaW5Ub3BDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJD
b2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdFbmQ6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGlu
Z0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0FmdGVyOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExvZ2ljYWxIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbEhlaWdodDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0OgorICAgIHsKKyAgICAgICAgQ1NTUHJvcGVydHlJRCBu
ZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3Rh
dGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwor
ICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQpOworICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0
eShuZXdJZCwgdmFsdWUpOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5l
VGhyb3VnaDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRMaW5lVGhyb3VnaFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91
Z2hXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJs
aW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
VW5kZXJsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0VW5kZXJsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNpemVEZWx0YToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3Q6CisgICAgICAgIHJldHVybjsK
KworICAgIC8vIENTUyBUZXh0IExheW91dCBNb2R1bGUgTGV2ZWwgMzogVmVydGljYWwgd3JpdGlu
ZyBzdXBwb3J0CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdNb2RlOiB7CisgICAg
ICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHdyaXRpbmdNb2RlLCBXcml0aW5nTW9kZSk7
CisgICAgICAgIAorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBzZXRX
cml0aW5nTW9kZSgqcHJpbWl0aXZlVmFsdWUpOworCisgICAgICAgIC8vIEZJWE1FOiBJdCBpcyBu
b3Qgb2sgdG8gbW9kaWZ5IGRvY3VtZW50IHN0YXRlIHdoaWxlIGFwcGx5aW5nIHN0eWxlLgorICAg
ICAgICBpZiAoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgICAgIHN0YXRlLmRvY3VtZW50KCkt
PnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQodHJ1ZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dE9yaWVudGF0aW9uOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRPcmllbnRhdGlvbiwgVGV4
dE9yaWVudGF0aW9uKTsKKworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAg
ICBzZXRUZXh0T3JpZW50YXRpb24oKnByaW1pdGl2ZVZhbHVlKTsKKworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVCb3hDb250YWluOiB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxpbmVCb3hDb250YWluLCBMaW5lQm94
Q29udGFpbikKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TGluZUJveENvbnRhaW4oTGluZUJveENvbnRhaW5Ob25lKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzQ1NTTGluZUJveENvbnRhaW5W
YWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENTU0xpbmVCb3hDb250YWlu
VmFsdWUqIGxpbmVCb3hDb250YWluVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NMaW5lQm94Q29udGFp
blZhbHVlKj4odmFsdWUpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFp
bihsaW5lQm94Q29udGFpblZhbHVlLT52YWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIENTUyBGb250cyBNb2R1bGUgTGV2ZWwgMworICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRGb250RmVhdHVyZVNldHRpbmdzOiB7CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAm
JiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vcm1hbCkgeworICAgICAg
ICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigp
Lm1ha2VOb3JtYWxGZWF0dXJlU2V0dGluZ3MoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0
ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0
ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOworICAgICAgICBSZWZQdHI8Rm9u
dEZlYXR1cmVTZXR0aW5ncz4gc2V0dGluZ3MgPSBGb250RmVhdHVyZVNldHRpbmdzOjpjcmVhdGUo
KTsKKyAgICAgICAgaW50IGxlbiA9IGxpc3QtPmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGxpc3Qt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzRm9u
dEZlYXR1cmVWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
Rm9udEZlYXR1cmVWYWx1ZSogZmVhdHVyZSA9IHN0YXRpY19jYXN0PEZvbnRGZWF0dXJlVmFsdWUq
PihpdGVtKTsKKyAgICAgICAgICAgIHNldHRpbmdzLT5hcHBlbmQoRm9udEZlYXR1cmUoZmVhdHVy
ZS0+dGFnKCksIGZlYXR1cmUtPnZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0RmVhdHVyZVNldHRpbmdzKHNldHRpbmdzLnJlbGVhc2UoKSk7CisgICAgICAg
IHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRGaWx0ZXI6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZmlsdGVyLCBG
aWx0ZXIpOworICAgICAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgICAgIGlm
IChjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0RmlsdGVyKG9wZXJhdGlvbnMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW5zOiB7CisgICAgICAgIFZlY3RvcjxH
cmlkVHJhY2tTaXplPiB0cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xp
c3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZENvbHVtbnModHJhY2tTaXplcyk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3dzOiB7CisgICAg
ICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZFJvd3ModHJhY2tTaXplcyk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFN0
YXJ0OiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBzdGFydFBvc2l0aW9uOworICAgICAgICBpZiAo
IWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgc3RhcnRQb3NpdGlvbikpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtU3RhcnQoc3RhcnRQb3Np
dGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEdyaWRFbmQ6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIGVuZFBvc2l0aW9uOworICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUVuZChlbmRQb3NpdGlv
bik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
R3JpZEJlZm9yZTogeworICAgICAgICBHcmlkUG9zaXRpb24gYmVmb3JlUG9zaXRpb247CisgICAg
ICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3Jl
KGJlZm9yZVBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0
aW9uOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlv
bikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJ
dGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBh
cHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQgdmVyc2lvbi4KKyAgICBjYXNlIENT
U1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9u
RHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKKyAgICBj
YXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgorICAgICAgICByZXR1cm47
CisgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVp
bGRlciBsb29rdXAgdGFibGUuCisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2ht
ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1h
Z2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRQb3NpdGlvblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyQm90dG9tU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVySW1hZ2VPdXRzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlUmVwZWF0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJJbWFnZVNvdXJjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyUmlnaHRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmln
aHRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclRvcExlZnRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clRvcFJpZ2h0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJv
dHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5nOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlDYXB0aW9uU2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2xlYXI6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUNsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlDb3VudGVySW5jcmVtZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlF
bXB0eUNlbGxzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9hdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Rm9udFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFZhcmlhbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFU
SU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVudGF0aW9uOgorI2VuZGlmCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVyaW5nOgorI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVT
T0xVVElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZXNvbHV0aW9uOgorI2VuZGlmCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNp
bmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUxpc3RTdHlsZUltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVQb3NpdGlvbjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlVHlwZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
TWFyZ2luQm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5MZWZ0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXJnaW5SaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luVG9wOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5IZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU1pbldpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPcnBoYW5zOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVT
dHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPdmVyZmxvd1dyYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93WDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nQm90
dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nTGVmdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5UGFkZGluZ1JpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nVG9wOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJy
ZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtJbnNpZGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBvaW50ZXJFdmVudHM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBvc2l0aW9u
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlSZXNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVJpZ2h0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlTcGVhazoK
KyAgICBjYXNlIENTU1Byb3BlcnR5VGFiU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGFibGVM
YXlvdXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRBbGlnbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRJbmRlbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVyZmxvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFJl
bmRlcmluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFRyYW5zZm9ybToKKyAgICBjYXNlIENT
U1Byb3BlcnR5VG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlQmlkaToKKyNpZiBFTkFC
TEUoQ1NTX1ZBUklBQkxFUykKKyAgICBjYXNlIENTU1Byb3BlcnR5VmFyaWFibGU6CisjZW5kaWYK
KyAgICBjYXNlIENTU1Byb3BlcnR5VmVydGljYWxBbGlnbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGVsYXk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRpcmVjdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvbkZpbGxNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRp
b25JdGVyYXRpb25Db3VudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uTmFt
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uUGxheVN0YXRlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QXBwZWFyYW5jZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXNw
ZWN0UmF0aW86CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91
bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJGaXQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
VmVydGljYWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hBbGlnbjoKKyNp
ZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9OX0JSRUFLKQorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3hEZWNvcmF0aW9uQnJlYWs6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94RGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4R3JvdXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveExpbmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmRpbmFsR3Jv
dXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yaWVudDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm94UGFjazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sb3JDb3Jy
ZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5BeGlzOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRDb2x1bW5CcmVha0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1u
QnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5HYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblByb2dyZXNzaW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5S
dWxlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRDb2x1bW5TcGFuOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5X
aWR0aDoKKyNpZiBFTkFCTEUoQ1VSU09SX1ZJU0lCSUxJVFkpCisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEN1cnNvclZpc2liaWxpdHk6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QWxpZ25Db250ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnbkl0ZW1zOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnblNlbGY6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEZsZXhCYXNpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleERpcmVjdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEdyb3c6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZsZXhTaHJpbms6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhXcmFw
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRKdXN0aWZ5Q29udGVudDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0T3JkZXI6CisjaWYgRU5BQkxFKENTU19SRUdJT05TKQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRGbG93RnJvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxv
d0ludG86CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEtlcm5pbmc6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRTbW9vdGhpbmc6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZvbnRWYXJpYW50TGlnYXR1cmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRIaWdobGlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUNoYXJhY3Rl
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRBZnRlcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRCZWZvcmU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0TGluZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEh5cGhlbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVBbGlnbjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJyZWFrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRMaW5lQ2xhbXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVHcmlkOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lU25hcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFycXVlZURpcmVjdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2U6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZU91dHNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza0NsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza09yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza1Bvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9u
WToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdFg6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNr
U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TmJzcE1vZGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRQZXJzcGVjdGl2ZU9yaWdpblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0
aXZlT3JpZ2luWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UHJpbnRDb2xvckFkanVzdDoK
KyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lv
bkJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQmVmb3Jl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0luc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UmVnaW9uT3ZlcmZsb3c6CisjZW5kaWYKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UnRsT3JkZXJpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ1YnlQ
b3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dENvbWJpbmU6CisjaWYgRU5B
QkxFKENTUzNfVEVYVCkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25M
aW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvblN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0QWxpZ25MYXN0OgorI2VuZGlmIC8vIENTUzNfVEVY
VAorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1N0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U2VjdXJpdHk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3Jp
Z2luWjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1p
bmdGdW5jdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlckRyYWc6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2RpZnk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFVzZXJTZWxlY3Q6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENsaXBQYXRoOgorI2lmIEVO
QUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRTaGFwZVBhZGRpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBU
aHJvdWdoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRzaWRlOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdoaXRlU3BhY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V29yZFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Cisj
aWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5TWF4
Wm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3JpZW50YXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgorI2VuZGlmCisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCisgICAg
ICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKKyNlbmRpZgorICAgICAgICByZXR1cm47
CisgICAgfQorfQorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxl
SW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlm
ICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCisgICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdG
cm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwor
CisgICAgaWYgKHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgeworICAgICAgICBpZiAo
dmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9y
UGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+
KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpOworICAgICAg
ICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2Fz
dDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsKKyAgICB9CisKKyNpZiBFTkFCTEUo
Q1NTX0lNQUdFX1NFVCkKKyAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQorICAgICAg
ICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJ
bWFnZVNldFZhbHVlKj4odmFsdWUpKTsKKyNlbmRpZgorCisgICAgaWYgKHZhbHVlLT5pc0N1cnNv
ckltYWdlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShw
cm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisKKyAg
ICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpj
YWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VW
YWx1ZSogdmFsdWUpCit7CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNh
Y2hlZE9yUGVuZGluZ0ltYWdlKCk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJ
bWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJv
cGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCitQYXNzUmVm
UHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1
ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkK
K3sKKyAgICBpZiAodmFsdWUtPmlzUGVuZGluZygpKSB7CisgICAgICAgIG1fc3RhdGUucGVuZGlu
Z0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICByZXR1cm4g
U3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBTdHls
ZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFsdWUpOworfQorCisjaWYgRU5BQkxFKENTU19JTUFH
RV9TRVQpCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGlu
Z0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1
ZSkKK3sKKyAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5k
aW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRp
bmdJbWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQo
cHJvcGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorI2VuZGlm
CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5n
RnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZh
bHVlKQoreworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBl
bmRpbmdJbWFnZShkb2N1bWVudCgpKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGlu
Z0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChw
cm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JUZXh0U2l6ZUFkanVzdCgpCit7CisgICAgUmVuZGVyU3R5
bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOworCisgICAgaWYgKHN0eWxlLT50ZXh0U2l6ZUFk
anVzdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERl
c2NyaXB0aW9uKHN0eWxlLT5mb250RGVzY3JpcHRpb24oKSk7CisgICAgbmV3Rm9udERlc2NyaXB0
aW9uLnNldENvbXB1dGVkU2l6ZShuZXdGb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpKTsK
KyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHls
ZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZl
Wm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNj
cmlwdGlvbigpOworICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRG
b250KTsKKyAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxkRm9udC5zcGVj
aWZpZWRTaXplKCkpOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2Ny
aXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVyaWNGYW1pbHlD
aGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7Cisg
ICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0
aW9uKCk7CisKKyAgICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwgIXBhcmVudFN0
eWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVu
dEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgaWYgKGNoaWxkRm9u
dC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXpl
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZvciBub3csIGx1bXAgYWxsIGZhbWlsaWVz
IGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCisgICAgaWYgKGNoaWxkRm9udC5nZW5lcmljRmFtaWx5
KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKKyAgICAgICAgJiYgcGFyZW50
Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBpcyBtb25vc3Bh
Y2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAorICAgIC8vIHNpemUg
d2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUgYXMgYXBwcm9w
cmlhdGUuCisgICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSBy
ZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFuCisgICAgLy8gbXVsdGlwbHlpbmcgYnkg
b3VyIHNjYWxlIGZhY3Rvci4KKyAgICBmbG9hdCBzaXplOworICAgIGlmIChjaGlsZEZvbnQua2V5
d29yZFNpemUoKSkKKyAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgp
LCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEsIGNoaWxkRm9u
dC51c2VGaXhlZERlZmF1bHRTaXplKCkpOworICAgIGVsc2UgeworICAgICAgICBTZXR0aW5ncyog
c2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgIGZsb2F0IGZpeGVkU2NhbGVG
YWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYg
c2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQorICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxm
bG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1
bHRGb250U2l6ZSgpCisgICAgICAgICAgICA6IDE7CisgICAgICAgIHNpemUgPSBwYXJlbnRGb250
LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/CisgICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNp
ZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgorICAgICAgICAgICAgICAgIGNoaWxkRm9u
dC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOworICAgIH0KKworICAgIEZvbnRE
ZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKKyAgICBzZXRGb250U2l6
ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24obmV3Rm9udERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjppbml0aWFs
aXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykKK3sKKyAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRS
ZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICBmb250RGVz
Y3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0
dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOworICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygpLT5zdGFuZGFy
ZEZvbnRGYW1pbHkoKTsKKyAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0VtcHR5KCkpIHsK
KyAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJk
Rm9udEZhbWlseSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVu
ZEZhbWlseSgwKTsKKyAgICB9CisgICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENT
U1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7CisgICAgc2V0Rm9udFNpemUoZm9u
dERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRp
dW0sIGZhbHNlKSk7CisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0
eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1
ZSgwKTsKKyAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKK30KKwordm9p
ZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlw
dGlvbiwgZmxvYXQgc2l6ZSkKK3sKKyAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6
ZShzaXplKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVk
U2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUoKSwgZm9udERl
c2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcygpKSk7Cit9
CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlzQWJzb2x1dGVT
aXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykKK3sKKyAgICBm
bG9hdCB6b29tRmFjdG9yID0gMS4wZjsKKyAgICBpZiAoIXVzZVNWR1pvb21SdWxlcykgeworICAg
ICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICAgICAgaWYgKEZy
YW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQorICAgICAgICAgICAgem9vbUZhY3RvciAq
PSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3R5bGVSZXNv
bHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0
b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKK30KKworZmxvYXQgU3R5bGVSZXNv
bHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50
LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRT
aXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUp
Cit7CisgICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90IGJlIHZpc2li
bGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQorICAgIC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0g
Zm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAor
ICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBvdGhlciBicm93
c2VycyB0aGF0IGhhdmUgbWluaW11bQorICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBG
aXJlZm94KS4KKyAgICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGlt
aXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQorICAgICAgICByZXR1cm4gMC4wZjsKKworICAgIC8vIFdl
IHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmlyc3QgaXMgYSBo
YXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bworICAgIC8vIGFsbCBmb250cy4gVGhpcyBpcyAi
bWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFy
dCBtaW5pbXVtIgorICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdl
IGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4sCisgICAgLy8g
d2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJlc3NlcyB0aGUg
Zm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgorICAgIC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBm
b250IHNldHRpbmcuCisKKyAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3
YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIGtlZXAgZm9u
dHMgcmVhZGFibGUuCisgICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8g
c2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAorICAgIC8vIHNpbmNl
IHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNw
b3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCisKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICByZXR1cm4g
MS4wZjsKKworICAgIGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOwor
ICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXpl
KCk7CisgICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29tRmFjdG9yOwor
CisgICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBhcHBseSB0aGUg
aGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNtYWxsLgorICAg
IGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKKyAgICAgICAgem9vbWVkU2l6ZSA9IG1pblNpemU7
CisKKyAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlz
IGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAorICAgIC8vIGFmdGVy
IHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVz
ZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQorICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFj
Y2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVt
IHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCisgICAgLy8gZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0
aGUgbGF5b3V0LgorICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAmJiB6b29tZWRT
aXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9naWNhbFNpemUg
fHwgIWlzQWJzb2x1dGVTaXplKSkKKyAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXpl
OworCisgICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0byBwcmV2ZW50
IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlvdXMKKyAgICAv
LyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCisgICAgcmV0dXJuIG1p
bihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKK30KKworY29uc3QgaW50IGZv
bnRTaXplVGFibGVNYXggPSAxNjsKK2NvbnN0IGludCBmb250U2l6ZVRhYmxlTWluID0gOTsKK2Nv
bnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKKworLy8gV2luSUUvTmF2NCB0YWJsZSBmb3IgZm9u
dCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBpbmcgc3lzdGVt
IG9mIEhUTUwuCitzdGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVbZm9udFNpemVU
YWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Cit7CisgICAg
ICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjggfSwK
KyAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAz
MSB9LAorICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIs
ICAgIDM0IH0sCisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAg
ICAyNCwgICAgMzcgfSwKKyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNiwgICAg
MjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQorICAgICAgeyA5
LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCisgICAg
ICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwgICAgNDUgfSwK
KyAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0
OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQorfTsKKy8vIEhUTUwgICAgICAg
MSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNworLy8gQ1NTICB4eHMg
ICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCisvLyAgICAgICAgICAgICAg
ICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCisKKy8vIFN0
cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0aW5ncyBleGFj
dGx5Lgorc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVN
YXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQoreworICAgICAgeyA5
LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3IH0sCisgICAg
ICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzAgfSwK
KyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAz
MyB9LAorICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQs
ICAgIDM2IH0sCisgICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYsICAgIDIwLCAg
ICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKKyAgICAgIHsgOSwgICAx
MCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAorICAgICAgeyA5
LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCisgICAg
ICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAv
LyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKK307CisvLyBIVE1MICAgICAgIDEgICAg
ICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKKy8vIENTUyAgeHhzICAgeHMg
ICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAorLy8gICAgICAgICAgICAgICAgICAg
ICAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgorCisvLyBGb3IgdmFs
dWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQgRmFocm5lcidz
IHN1Z2dlc3RlZCBzY2FsZQorLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZhbHVlLgorc3Rh
dGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9IHsgMC42MGYs
IDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9OworCitmbG9hdCBT
dHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQg
a2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQoreworICAgIFNldHRpbmdz
KiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3MpCisg
ICAgICAgIHJldHVybiAxLjBmOworCisgICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmlu
UXVpcmtzTW9kZSgpOworICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0
U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1
bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYg
bWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7CisgICAgICAgIC8vIExvb2sgdXAgdGhl
IGVudHJ5IGluIHRoZSB0YWJsZS4KKyAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250
U2l6ZVRhYmxlTWluOworICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NWYWx1ZVh4U21h
bGwpOworICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93
XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07CisgICAgfQorCisgICAgLy8g
VmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0aGUgc2NhbGUg
ZmFjdG9yIGluc3RlYWQuCisgICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgoc2V0dGluZ3Mt
Pm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7CisgICAgcmV0dXJuIG1heChmb250U2l6ZUZh
Y3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWluTG9naWNhbFNp
emUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGludCBmaW5kTmVhcmVzdExl
Z2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwgaW50IG11bHRp
cGxpZXIpCit7CisgICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21hbGwgZG9lcyBu
b3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KKyAgICBmb3IgKGludCBpID0g
MTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKHBpeGVsRm9udFNp
emUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIpCisgICAgICAg
ICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsS2V5d29yZHMgLSAxOworfQor
CitpbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBp
bnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQoreworICAg
IFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0
dGluZ3MpCisgICAgICAgIHJldHVybiAxOworCisgICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1l
bnQtPmluUXVpcmtzTW9kZSgpOworICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWRE
ZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3Mt
PmRlZmF1bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVN
aW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7CisgICAgICAgIGludCByb3cg
PSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKKyAgICAgICAgcmV0dXJuIGZpbmROZWFy
ZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2RlID8gcXVpcmtz
Rm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAxKTsKKyAgICB9
CisKKyAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4ocGl4ZWxGb250
U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXplKTsKK30KKworc3RhdGljIENvbG9yIGNv
bG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCit7CisgICAgc3RydWN0IENvbG9yVmFsdWUg
eworICAgICAgICBpbnQgY3NzVmFsdWVJZDsKKyAgICAgICAgUkdCQTMyIGNvbG9yOworICAgIH07
CisKKyAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0geworICAgICAg
ICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAorICAgICAgICB7IENTU1ZhbHVlQmxhY2ss
IDB4RkYwMDAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAwRkYgfSwKKyAg
ICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1
ZUdyYXksIDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAw
ICB9LAorICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAorICAgICAgICB7IENT
U1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAorICAgICAgICB7IENTU1ZhbHVlTWFyb29uLCAweEZG
ODAwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0sCisgICAgICAg
IHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU9yYW5n
ZSwgMHhGRkZGQTUwMCB9LAorICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZGODAwMDgwIH0s
CisgICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1
ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAorICAgICAgICB7IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4
MCAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAwIH0sCisgICAg
ICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAorICAgICAgICB7IENTU1ZhbHVlWWVs
bG93LCAweEZGRkZGRjAwIH0sCisgICAgICAgIHsgMCwgMCB9CisgICAgfTsKKworICAgIGZvciAo
Y29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytj
b2wpIHsKKyAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlkKQorICAgICAg
ICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7CisgICAgfQorICAgIHJldHVybiBSZW5kZXJUaGVtZTo6
ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworfQorCitib29sIFN0eWxl
UmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NT
UHJpbWl0aXZlVmFsdWUqIHZhbHVlKQoreworICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVu
dCgpOworICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoK
KyAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0
aXZlbGluazoKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitD
b2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVW
YWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Cit7CisgICAgaWYgKHZhbHVl
LT5pc1JHQkNvbG9yKCkpCisgICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFs
dWUoKSk7CisKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGludCBpZGVu
dCA9IHZhbHVlLT5nZXRJZGVudCgpOworICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBjYXNlIDA6
CisgICAgICAgIHJldHVybiBDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0Ogor
ICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7CisgICAgY2FzZSBD
U1NWYWx1ZVdlYmtpdExpbms6CisgICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVudCgpLT5pc0xp
bmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNpdGVkTGlua0Nv
bG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVl
V2Via2l0QWN0aXZlbGluazoKKyAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPmFjdGl2
ZUxpbmtDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcjoKKyAg
ICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOworICAgIGNhc2UgQ1NT
VmFsdWVDdXJyZW50Y29sb3I6CisgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5jb2xvcigp
OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVlKGlkZW50KTsK
KyAgICB9Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBlbmRlbnRNZWRp
YVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVzdWx0KQorewor
ICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIo
bmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKK30KKworYm9vbCBTdHlsZVJl
c29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAoreworICAgIHVuc2lnbmVk
IHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgpOworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1fbWVkaXVtLT5l
dmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lv
bikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3N0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpTQ0FMRTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g7CisgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6U0NBTEVfWjsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2Fs
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8z
RDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsKKyAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKKyAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpUUkFOU0xBVEVfWjsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6
VFJBTlNMQVRFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOworICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlJPVEFURV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJP
VEFURV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfM0Q7CisgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6U0tFV19YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7CisgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246Ok1BVFJJWF8zRDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJz
cGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVS
U1BFQ1RJVkU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5z
Zm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKKyAgICB9Cisg
ICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKK30KKworYm9vbCBTdHlsZVJlc29s
dmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJT
dHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMm
IG91dE9wZXJhdGlvbnMpCit7CisgICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVl
TGlzdCgpKSB7CisgICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5l
ZmZlY3RpdmVab29tKCkgOiAxOworICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsK
KyAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsg
aS5hZHZhbmNlKCkpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsK
KworICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUq
IHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihp
LnZhbHVlKCkpOworICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0g
ZmFsc2U7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAg
ICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZh
bHVlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKworICAgICAgICBzd2l0Y2ggKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7
CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAg
ICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAg
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgICAgICAgICAgICAgc3kgPSBzeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVa
VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgc3ggPSAx
LjA7CisgICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3og
PSAxLjA7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9
PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uKQorICAg
ICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAg
ICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAg
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAg
ICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgeworICAgICAgICAg
ICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5
ID0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Bl
cmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVh
dGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+
b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0
aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJh
bnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGggdHggPSBM
ZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVk
KTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAg
ICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUs
IHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5
bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNm
b3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5
bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0
eS5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAg
ICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHkg
PSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZp
eGVkKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uKQor
ICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5
bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRv
RmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVu
Z3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMikpOworICAgICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0
aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0
aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNl
Y29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0
eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6
b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNV
bmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5z
bGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRyYW5zZm9ybU9w
ZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFuZ2xl
ID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSgwLCAw
LCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoK
KyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9w
ZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRy
YW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIHggPSAwOworICAgICAgICAg
ICAgZG91YmxlIHkgPSAwOworICAgICAgICAgICAgZG91YmxlIHogPSAwOworICAgICAgICAgICAg
ZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeCA9
IDE7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
ID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQor
ICAgICAgICAgICAgICAgIHkgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IHogPSAxOworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0
ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1P
cGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKHRyYW5z
Zm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsK
KyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygyKSk7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDMpKTsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZh
bHVlKCk7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURl
Z3JlZXMoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3Rh
dGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3Jt
T3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAg
ICBkb3VibGUgYW5nbGVYID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkgPSAwOworICAg
ICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICBhbmdsZVkgPSBhbmdsZTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFu
Z2xlWCA9IGFuZ2xlOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0
aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkg
PiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25k
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xl
WSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BlcmF0aW9u
cy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhbmds
ZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7
CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdl
dERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikp
LT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gem9vbUZhY3Rv
ciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91
YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4VHJhbnNm
b3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0
cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+bGVuZ3RoKCkgPCAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0RG91YmxlVmFs
dWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDYp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEwKSktPmdldERv
dWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVlKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsKKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJh
dGlvbjo6Y3JlYXRlKG1hdHJpeCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1P
cGVyYXRpb246IHsKKyAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAg
ICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAgICAgICAgIHAg
PSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29t
RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMg
YSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBhcmUgZmluYWxp
emVkLgorICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVW
YWx1ZSgpOworICAgICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChjbGFtcFRvUG9z
aXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRP
cGVyYXRpb25zID0gb3BlcmF0aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEVOQUJM
RShDU1NfRklMVEVSUykKK3N0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZmls
dGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9u
VHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6UkVGRVJFTkNFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okdy
YXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
R1JBWVNDQUxFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3Bl
cmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsKKyAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVy
T3BlcmF0aW9uOjpIVUVfUk9UQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Oklu
dmVydEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5W
RVJUOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRp
b246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7CisgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKKyAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6Q09OVFJBU1Q7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1
ckZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QkxVUjsK
KyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9u
OgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsKKyNpZiBFTkFC
TEUoQ1NTX1NIQURFUlMpCisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmls
dGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT007Cisj
ZW5kaWYKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0
aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOworICAgIH0KKyAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOworfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJT
KSAmJiBFTkFCTEUoU1ZHKQordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NWR0RvY3Vt
ZW50cygpCit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAoIXN0YXRlLnN0
eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRS
ZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7
CisgICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMg
PSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJh
dGlvbnMuYXQoaSk7CisgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5
cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgeworICAgICAgICAgICAgUmVmZXJl
bmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVu
Y2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOworCisgICAgICAgICAg
ICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1
bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICghdmFs
dWUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDYWNoZWRTVkdEb2N1
bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7
CisgICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50KQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhl
IHJlZmVyZW5jZSBmaWx0ZXIuCisgICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXItPnNldENhY2hl
ZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVy
ZW5jZShjYWNoZWREb2N1bWVudCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0ZS5wZW5k
aW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19T
SEFERVJTKQorU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVl
KiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFsdWUoKSkKKyAg
ICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKHN0YXRpY19j
YXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUpKTsKKyAgICByZXR1cm4gMDsKK30KKwor
U3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJv
bVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKK3sKKyAgICBTdHlsZVNoYWRlciog
c2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOworICAgIGlmIChzaGFkZXIg
JiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKKyAgICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5k
aW5nU2hhZGVycyh0cnVlKTsKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCit7CisgICAgaWYgKCFtX3N0YXRlLnN0eWxlKCkt
Pmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9
IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKworICAgIFZlY3Rv
cjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5z
dHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0
cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQo
aSk7CisgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBG
aWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgeworICAgICAgICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVyYXRpb24qPihm
aWx0ZXJPcGVyYXRpb24uZ2V0KCkpOworICAgICAgICAgICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+
cHJvZ3JhbSgpKTsKKyAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3Jh
bSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+
cHJvZ3JhbSgpKTsKKyAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBw
cm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKKyAgICAgICAgICAg
ICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHls
ZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVl
KCk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNoYWRlclZhbHVl
LT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dyYW0tPmZyYWdt
ZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7CisgICAgICAgICAgICAgICAgV2ViS2l0
Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hh
ZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7CisgICAg
ICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hl
ZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpOworfQorCitz
dGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0
ZXI+JiBiKQoreworICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4oYS0+bmFtZSgp
LCBiLT5uYW1lKCkpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5
bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcm
IG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJB
cnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
cjo6Y3JlYXRlKG5hbWUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVl
cy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBDU1NWYWx1ZSogdmFsdWUg
PSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgIGlmICghdmFsdWUt
PmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBl
KCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXRE
b3VibGVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGFycmF5UGFyYW1ldGVyLnJlbGVhc2Uo
KTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6
OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRyPEN1c3RvbUZpbHRlck51bWJlclBhcmFt
ZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVh
dGUobmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7
ICsraSkgeworICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soaSk7CisgICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZl
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6
OkNTU19OVU1CRVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbnVtYmVyUGFyYW1l
dGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7CisgICAgfQor
ICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFu
c2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykK
K3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1Q
YXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsK
KyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgY3JlYXRlVHJhbnNmb3Jt
T3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIG9wZXJhdGlvbnMpOworICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0T3BlcmF0aW9u
cyhvcGVyYXRpb25zKTsKKyAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsK
K30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBh
cnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBh
cmFtZXRlclZhbHVlKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVy
cyB0eXBlcyBwYXJzaW5nLgorICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKKyAgICAvLyB0ZXh0dXJlczogaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCisgICAgLy8gbWF0MiwgbWF0MywgbWF0NDog
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0CisgICAgLy8gTnVt
YmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwK
KyAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20gQ1NTVmFsdWVM
aXN0LgorICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1
ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7CisgICAgaWYgKCF2YWx1ZXMtPmxlbmd0aCgpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJh
eUZ1bmN0aW9uVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQ
YXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8vIElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0
aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwKKyAgICAvLyB0aGVuIHdlIGNvdWxkIHNh
ZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcworICAgIC8vIGFyZSB0cmFu
c2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxsCisgICAgLy8g
cmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KKyAgICBpZiAodmFsdWVz
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkp
CisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihuYW1l
LCB2YWx1ZXMpOworCisgICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2YgYm9vbGVhbnMg
b3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9z
ZSB0d28uCisgICAgLy8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFs
bCBudW1iZXJzKS4KKyAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+
aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQorICAgICAgICByZXR1
cm4gMDsKKyAgICAKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDApKTsKKyAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgp
ID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQorICAgICAgICByZXR1cm4gcGFyc2VD
dXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCisgICAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4CisKKyAgICByZXR1cm4g
MDsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxp
c3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYg
cGFyYW1ldGVyTGlzdCkKK3sKKyAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJhbWV0ZXJOYW1l
czsKKyAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJz
VmFsdWUpOworICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7IHBhcmFtZXRl
ckl0ZXJhdG9yLmFkdmFuY2UoKSkgeworICAgICAgICBpZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZh
bHVlKCktPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkp
OworICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZl
VmFsdWU6OkNTU19TVFJJTkcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAor
ICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwor
ICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KKyAgICAg
ICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5hbWUpOworICAg
ICAgICAKKyAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAKKyAgICAgICAgaWYg
KCFpdGVyYXRvci5oYXNNb3JlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IAorICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJz
ZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAg
aWYgKCFwYXJhbWV0ZXIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHBhcmFt
ZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOworICAgIH0KKyAgICAKKyAgICAv
LyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIGRv
d24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4KKyAgICBzdGQ6OnNvcnQocGFyYW1ldGVy
TGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNv
bXBhcmF0b3IpOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPEN1c3Rv
bUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVy
VmFsdWUpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0aW9uIGZvciB0
aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCisgICAgVU5VU0VEX1BB
UkFNKGZpbHRlclZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlv
bldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQorewor
ICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygwKTsKKyAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzaGFkZXJz
VmFsdWUtPmlzVmFsdWVMaXN0KCkpOworICAgIENTU1ZhbHVlTGlzdCogc2hhZGVyc0xpc3QgPSBz
dGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOworCisgICAgdW5zaWduZWQg
c2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7CisgICAgQVNTRVJUKHNo
YWRlcnNMaXN0TGVuZ3RoKTsKKworICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVydGV4U2hhZGVy
ID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOwor
ICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7CisgICAgQ3VzdG9tRmlsdGVy
UHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVY
VFVSRTsKKyAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0dGluZ3M7CisK
KyAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7CisgICAgICAgIENTU1ZhbHVlKiBmcmFn
bWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygxKTsKKworICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uLT5pc1dl
YktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgeworICAgICAgICAgICAgV2ViS2l0Q1NTTWl4RnVu
Y3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlv
blZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKKyAgICAgICAgICAgIENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKKworICAgICAgICAgICAgQVNT
RVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9
IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaXRlcmF0b3IuYWR2
YW5jZSgpOworCisgICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMp
OworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgeworICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKENT
U1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQorICAgICAg
ICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZlVmFsdWU7Cisg
ICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9wZXJhdG9yKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGlu
Z3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7CisgICAgICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19FTEVNRU5UX1RF
WFRVUkU7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50
U2hhZGVyT3JNaXhGdW5jdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdW5zaWdu
ZWQgbWVzaFJvd3MgPSAxOworICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsKKyAgICBDdXN0
b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7CisgICAgCisgICAg
Q1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7CisgICAgCisgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3Io
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAKKyAgICAg
ICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qg
b2YgcGFyYW1ldGVyczoKKyAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgb3Ig
YW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKKyAgICAgICAgLy8gdGhlIG1l
c2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVycyBsaXN0Lgor
CisgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVW
YWx1ZSgpKSB7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAg
ICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAg
ICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0
IGJvdGgKKyAgICAgICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMuCisgICAg
ICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJ
bnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhlciBudW1iZXIg
Zm9yIHRoZSByb3dzLgorICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYg
aXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzaFJvd3Mg
PSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGl0
ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAg
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgeworICAgICAgICAg
ICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKKyAgICAgICAgICAgICAgICBpdGVy
YXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAg
ICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgeworICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUg
d2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVzdCBhIHBhcmFt
ZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVwCisgICAgICAgICAgICAvLyBoYXZpbmcg
anVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFt
ZXRlcnMuCisgICAgICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDIpOwor
ICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKKyAgICAgICAgcGFyYW1ldGVyc1Zh
bHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7CisgICAgCisgICAg
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OworICAgIGlmIChwYXJhbWV0
ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFs
dWUsIHBhcmFtZXRlckxpc3QpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBSZWZQdHI8
U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9n
cmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFkZXIucmVsZWFz
ZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKKyAgICByZXR1cm4gQ3Vz
dG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBhcmFtZXRlckxp
c3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOworfQorCitQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3Bl
cmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICBBU1NFUlQo
ZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKKyAgICBib29sIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4
ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFs
dWUoKTsKKyAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVhdGVDdXN0b21G
aWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZhbHVlKSA6IGNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVyVmFsdWUpOwor
fQorCisjZW5kaWYKKworYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25z
KENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290
U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCit7CisgICAgQVNTRVJUKG91
dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKKyAgICAKKyAgICBpZiAoIWluVmFsdWUpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgp
KSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgCisgICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpIDogMTsKKyAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7Cisg
ICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGku
YWR2YW5jZSgpKSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Cisg
ICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFs
dWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUoKSk7CisgICAg
ICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gZmlsdGVy
T3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsKKworI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3Bl
cmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0
b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVy
U3R5bGUuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9w
ZXJhdGlvbjo6Q1VTVE9NKSB7CisgICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUp
OworICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5h
cHBlbmQob3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5k
aWYKKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVO
Q0UpIHsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ1NTVmFs
dWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7CisK
KyAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBXZWJLaXRDU1NTVkdE
b2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZH
RG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKKyAgICAgICAgICAgIEtVUkwgdXJsID0gbV9zdGF0
ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwoKSk7CisKKyAg
ICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IFJl
ZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1
cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOworICAgICAgICAgICAgaWYg
KFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVl
LT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgeworICAgICAgICAgICAgICAgIGlmICghc3Zn
RG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgICAgICBtX3N0
YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBzdmdEb2N1bWVu
dFZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZhbHVlLT5jYWNo
ZWRTVkdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24tPnNldENhY2hl
ZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVy
ZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlv
bik7CisjZW5kaWYKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0
aGUKKyAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhhcyBhIFNoYWRv
d1ZhbHVlIHBhcmFtZXRlci4KKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gRmlsdGVyT3Bl
cmF0aW9uOjpEUk9QX1NIQURPVykgeworICAgICAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZl
VmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBmaWx0
ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgICAgIGlmICghZmlsdGVyVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAg
ICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CisKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUg
PSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7CisgICAgICAgIHN3
aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgeworICAgICAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjogeworICAgICAg
ICAgICAgZG91YmxlIGFtb3VudCA9IDE7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxl
bmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXRE
b3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRh
Z2UoKSkKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JN
YXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFu
Z2xlID0gMDsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkKKyAg
ICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisKKyAg
ICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4
RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OkludmVydEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJs
ZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKKyAgICAgICAgICAg
IGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFtb3Vu
dCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZp
cnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQorICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0g
MTAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMo
KS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFt
b3VudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjogewor
ICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAg
ICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCisgICAgICAgICAgICAgICAg
c3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5k
ZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRl
KHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRl
ck9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAx
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgQ1NTVmFsdWUq
IGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7CisgICAg
ICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8
U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7CisgICAgICAgICAgICBJbnRQb2ludCBsb2NhdGlvbihp
dGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvciks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGlu
dD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikpOworICAgICAgICAgICAgaW50IGJsdXIg
PSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290
U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAg
ICAgICAgaWYgKGl0ZW0tPmNvbG9yKQorICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9t
UHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOworCisgICAgICAgICAgICBvcGVyYXRp
b25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRl
KGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3Bh
cmVudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRPcGVyYXRpb25zID0g
b3BlcmF0aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKK1Bhc3NSZWZQdHI8
U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJ
bWFnZSogcGVuZGluZ0ltYWdlKQoreworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRS
ZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIo
KTsKKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgeworICAgICAgICBD
U1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7
CisgICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxv
YWRlcik7CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JW
YWx1ZSgpKSB7CisgICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdlR2VuZXJhdG9y
VmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsKKyAgICAgICAg
aW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7
CisgICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0
b3JWYWx1ZSk7CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VW
YWx1ZSgpKSB7CisgICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvckltYWdlVmFsdWUg
PSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGN1
cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9
CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJ
bWFnZVNldFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1
ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gaW1h
Z2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0K
KyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBl
bmRpbmdJbWFnZXMoKQoreworICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5
TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3Bl
cnRpZXMoKS5lbmQoKS5rZXlzKCk7CisgICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6
Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIENTU1Byb3BlcnR5
SUQgY3VycmVudFByb3BlcnR5ID0gKml0OworCisgICAgICAgIHN3aXRjaCAoY3VycmVudFByb3Bl
cnR5KSB7CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6IHsKKyAgICAg
ICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCkt
PmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5
ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChiYWNr
Z3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgpLT5pc1BlbmRp
bmdJbWFnZSgpKQorICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXItPnNldEltYWdl
KGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3Jv
dW5kTGF5ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogeworICAgICAgICAg
ICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENvbnRlbnREYXRh
Kj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7IGNvbnRlbnRE
YXRhID0gY29udGVudERhdGEtPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZW50
RGF0YS0+aXNJbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0eWxlSW1hZ2UqIGltYWdl
ID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2Fk
UGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5z
ZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogeworICAgICAgICAgICAgaWYg
KEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNvcnMoKSkgewor
ICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVudEN1cnNvciA9
IGN1cnNvckxpc3QtPmF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoU3R5bGVJbWFnZSog
aW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5
bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogeworICAgICAgICAgICAg
aWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRlLnN0eWxlKCkt
Pmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9z
dGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19j
YXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgp
KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckltYWdlU291cmNlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgp
LT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3Vy
Y2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCkt
PnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQ
ZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkpKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94UmVmbGVjdDogeworICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlvbiogcmVmbGVj
dGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7CisgICAgICAgICAgICAgICAg
Y29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1hc2soKTsKKyAg
ICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdlLmltYWdlKCkt
PmlzUGVuZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1h
Z2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRp
bmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJlZmxl
Y3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNr
SW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdlLmJvcmRlclNs
aWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFsUnVsZSgpLCBt
YXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5z
dHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJ
bWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUu
c3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nh
c3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJj
ZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogeworICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIG1h
c2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBtYXNrTGF5ZXI7
IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1h
c2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkp
CisgICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFyKCk7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQoreworICAgIC8vIFN0
YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVu
ZGluZ0ltYWdlcygpOworCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIC8vIFN0YXJ0IGxv
YWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5k
aW5nU2hhZGVycygpOworI2VuZGlmCisgICAgCisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQorICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVudHMgcmVmZXJl
bmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7CisjZW5k
aWYKK30KKworaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVk
UHJvcGVydGllcygpCisgICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQoreworfQorCitpbmxp
bmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJvcGVydGllcygp
Cit7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7Cisg
ICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1l
bW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0
aWVzIik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0
ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8p
IGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhp
cywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQ
cm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihyYW5n
ZXMsICJyYW5nZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwgInJlbmRlclN0
eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5k
ZXJTdHlsZSIpOworfQorCit2b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdl
KE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5
Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVz
OjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJlc3Npb24iKTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJ
bmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZv
KG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBp
bmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKKyAgICBpbmZvLmFkZE1lbWJl
cihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7CisgICAgaW5mby5hZGRN
ZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIp
OworICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIs
ICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciIpOworCisgICAgaW5mby5hZGRNZW1i
ZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0
U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVu
dCwgImRvY3VtZW50Iik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxlY3RvciwgImZv
bnRTZWxlY3RvciIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBlbmRlbnRNZWRp
YVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMiKTsKKyAg
ICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3Njb3BlUmVz
b2x2ZXIsICJzY29wZVJlc29sdmVyIik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX3N0YXRlLCAi
c3RhdGUiKTsKKworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3
b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7CisgICAgaW5mby5hZGRN
ZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0
UXVpcmtzU3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6
OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOworICAgIGluZm8uYWRkTWVt
YmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1
bHRWaWV3U291cmNlU3R5bGUiKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
U291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCShyZXZpc2lvbiAx
NDQ4OTMpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNywxODggKzI3LDI2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNv
bGxlY3Rvci5oIgogCi0jaW5jbHVkZSAiQXR0cmlidXRlLmgiCi0jaW5jbHVkZSAiQ1NTQm9yZGVy
SW1hZ2UuaCIKLSNpbmNsdWRlICJDU1NDYWxjdWxhdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NT
Q3Vyc29ySW1hZ2VWYWx1ZS5oIgogI2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgot
I2luY2x1ZGUgIkNTU0ZvbnRGYWNlUnVsZS5oIgotI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5o
IgotI2luY2x1ZGUgIkNTU0xpbmVCb3hDb250YWluVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NQYWdl
UnVsZS5oIgotI2luY2x1ZGUgIkNTU1BhcnNlci5oIgotI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZh
bHVlTWFwcGluZ3MuaCIKLSNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0jaW5jbHVkZSAi
Q1NTUmVmbGVjdFZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTUnVsZS5oIgorI2luY2x1ZGUgIkNTU1J1
bGVMaXN0LmgiCiAjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKICNpbmNsdWRlICJDU1NTZWxlY3Rv
ckxpc3QuaCIKLSNpbmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NTdXBwb3J0
c1J1bGUuaCIKLSNpbmNsdWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAi
Q1NTVmFsdWVMaXN0LmgiCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0jaW5jbHVkZSAiQ1NT
VmFyaWFibGVWYWx1ZS5oIgotI2VuZGlmCi0jaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKLSNpbmNs
dWRlICJDYWxjdWxhdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ29udGVudERhdGEuaCIKLSNpbmNs
dWRlICJDb250ZXh0RmVhdHVyZXMuaCIKLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAi
Q291bnRlckNvbnRlbnQuaCIKLSNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCi0jaW5jbHVkZSAiRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIK
LSNpbmNsdWRlICJGb250RmVhdHVyZVZhbHVlLmgiCi0jaW5jbHVkZSAiRm9udFZhbHVlLmgiCi0j
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgotI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgotI2luY2x1ZGUgIkhUTUxJ
RnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxOYW1lcy5oIgotI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTFByb2dyZXNzRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKLSNp
bmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCi0jaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQu
aCIKLSNpbmNsdWRlICJJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJLZXlm
cmFtZUxpc3QuaCIKLSNpbmNsdWRlICJMaW5rSGFzaC5oIgotI2luY2x1ZGUgIkxvY2FsZVRvU2Ny
aXB0TWFwcGluZy5oIgotI2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCi0jaW5jbHVkZSAiTWF0cml4
M0RUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRp
b24uaCIKLSNpbmNsdWRlICJNZWRpYUxpc3QuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVh
dG9yLmgiCi0jaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiTm9kZVJlbmRl
cmluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGFpci5oIgotI2lu
Y2x1ZGUgIlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiUXVvdGVz
RGF0YS5oIgotI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgi
CisjaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKICNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKLSNp
bmNsdWRlICJSZW5kZXJTY3JvbGxiYXIuaCIKLSNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVt
ZS5oIgotI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiUmVuZGVy
VGhlbWUuaCIKLSNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiUm90YXRlVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlNWR0RvY3Vt
ZW50RXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgotI2luY2x1
ZGUgIlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4u
aCIKKyNpbmNsdWRlICJTVkdFbGVtZW50LmgiCiAjaW5jbHVkZSAiU2VsZWN0b3JDaGVja2VyRmFz
dFBhdGguaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1ZGUgIlNoYWRvd0RhdGEuaCIK
LSNpbmNsdWRlICJTaGFkb3dSb290LmgiCi0jaW5jbHVkZSAiU2hhZG93VmFsdWUuaCIKICNpbmNs
dWRlICJTaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ2llcy5oIgotI2luY2x1ZGUgIlNrZXdUcmFuc2Zv
cm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJTdHlsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJTdHls
ZUNhY2hlZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVHZW5lcmF0ZWRJbWFnZS5oIgotI2luY2x1
ZGUgIlN0eWxlUGVuZGluZ0ltYWdlLmgiCiAjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0eVNldC5oIgot
I2luY2x1ZGUgIlN0eWxlUnVsZS5oIgotI2luY2x1ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgotI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgotI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
Ci0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCi0j
aW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiVXNlckFn
ZW50U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKLSNp
bmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCi0jaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3Ry
dW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lUnVsZS5oIgotI2luY2x1
ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25S
dWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuaCIKLSNpbmNsdWRlICJX
ZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKLSNpbmNsdWRlICJYTUxOYW1lcy5oIgotI2luY2x1ZGUg
PHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL01lbW9y
eUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KLSNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVu
dGF0aW9uVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLSNpbmNsdWRlICJGaWx0
ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NGaWx0ZXJWYWx1ZS5oIgotI2VuZGlm
Ci0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0jaW5jbHVkZSAiRGFzaGJvYXJkUmVn
aW9uLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiQ2FjaGVkU1ZHRG9j
dW1lbnQuaCIKLSNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgotI2luY2x1
ZGUgIlNWR0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgotI2luY2x1ZGUgIlNW
R05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCi0jaW5jbHVkZSAiV2ViS2l0
Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
Ci0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0
b21GaWx0ZXJDb25zdGFudHMuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJDdXN0
b21GaWx0ZXJQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJh
bWV0ZXIuaCIKLSNpbmNsdWRlICJTdHlsZUNhY2hlZFNoYWRlci5oIgotI2luY2x1ZGUgIlN0eWxl
Q3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgotI2luY2x1ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgot
I2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1NoYWRlclZhbHVlLmgiCi0jZW5kaWYKLQotI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQotI2luY2x1ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKLSNp
bmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShWSURF
T19UUkFDSykKLSNpbmNsdWRlICJXZWJWVFRFbGVtZW50LmgiCi0jZW5kaWYKKyNpbmNsdWRlICJT
dHlsZWRFbGVtZW50LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBXVEYg
ewotCi10ZW1wbGF0ZTw+IHN0cnVjdCBTZXF1ZW5jZU1lbW9yeUluc3RydW1lbnRhdGlvblRyYWl0
czxjb25zdCBXZWJDb3JlOjpSdWxlRGF0YSo+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgST4g
c3RhdGljIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoSSwgSSwgTWVtb3J5Q2xhc3NJbmZvJikgeyB9
Ci19OwotCi19CisjaW5jbHVkZSA8d3RmL1RlbXBvcmFyeUNoYW5nZS5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLSNkZWZpbmUgSEFORExF
X0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5oZXJpdCkgeyBcCi0gICAgbV9zdGF0ZS5z
dHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCi0gICAg
cmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwg
UHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5pdGlhbCkgeyBc
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1By
b3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6
OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KIHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0
VG9SaWdodERlY2xhcmF0aW9uKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3Jl
YXRlKCkpKTsKQEAgLTIyNSwyNDIgKzYzLDU3IEBAIHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBy
aWdodFRvTGVmdERlY2wKICAgICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgpOwogfQogCi0K
LWlubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmVuc3VyZVJ1
bGVMaXN0KCkKLXsKLSAgICBpZiAoIW1fcnVsZUxpc3QpCi0gICAgICAgIG1fcnVsZUxpc3QgPSBT
dGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7
Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjYWNoZUJvcmRlckFuZEJh
Y2tncm91bmQoKQotewotICAgIG1faGFzVUFBcHBlYXJhbmNlID0gbV9zdHlsZS0+aGFzQXBwZWFy
YW5jZSgpOwotICAgIGlmIChtX2hhc1VBQXBwZWFyYW5jZSkgewotICAgICAgICBtX2JvcmRlckRh
dGEgPSBtX3N0eWxlLT5ib3JkZXIoKTsKLSAgICAgICAgbV9iYWNrZ3JvdW5kRGF0YSA9ICptX3N0
eWxlLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0gbV9z
dHlsZS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJl
c29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQotewotICAgIG1fZWxlbWVudCA9IDA7Ci0gICAgbV9zdHls
ZWRFbGVtZW50ID0gMDsKLSAgICBtX3BhcmVudFN0eWxlID0gMDsKLSAgICBtX3BhcmVudE5vZGUg
PSAwOwotICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0g
ICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKLSAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMu
Y2xlYXIoKTsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgbV9oYXNQZW5kaW5nU2hhZGVy
cyA9IGZhbHNlOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZH
KQotICAgIG1fcGVuZGluZ1NWR0RvY3VtZW50cy5jbGVhcigpOwotI2VuZGlmCi19Ci0KLVN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcykKLSAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9u
c1NpbmNlTGFzdFN3ZWVwKDApCi0gICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRp
bWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCi0g
ICAgLCBtX2RvY3VtZW50KGRvY3VtZW50KQotICAgICwgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICwgbV9mb250U2VsZWN0b3IoQ1NTRm9u
dFNlbGVjdG9yOjpjcmVhdGUoZG9jdW1lbnQpKQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBU
QVRJT04pCi0gICAgLCBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcihWaWV3cG9ydFN0eWxlUmVzb2x2
ZXI6OmNyZWF0ZShkb2N1bWVudCkpCi0jZW5kaWYKLSAgICAsIG1fc3R5bGVCdWlsZGVyKFN0eWxl
QnVpbGRlcjo6c2hhcmVkU3R5bGVCdWlsZGVyKCkpCi0gICAgLCBtX3N0eWxlTWFwKHRoaXMpCi17
Ci0gICAgRWxlbWVudCogcm9vdCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKLQotICAg
IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6aW5pdERlZmF1bHRTdHlsZShyb290KTsKLQotICAgIC8v
IGNvbnN0cnVjdCBkb2N1bWVudCByb290IGVsZW1lbnQgZGVmYXVsdCBzdHlsZS4gdGhpcyBpcyBu
ZWVkZWQKLSAgICAvLyB0byBldmFsdWF0ZSBtZWRpYSBxdWVyaWVzIHRoYXQgY29udGFpbiByZWxh
dGl2ZSBjb25zdHJhaW50cywgbGlrZSAic2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMGVtKSIKLSAg
ICAvLyBUaGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciwgYmVjYXVzZSB3aGVuIGNv
bnN0cnVjdG9yIGlzIHJ1biwKLSAgICAvLyBkb2N1bWVudCBkb2Vzbid0IGhhdmUgZG9jdW1lbnRF
bGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgZWxlbWVudCB0aGF0IGdldHMg
cGFzc2VkIHRvIHN0eWxlRm9yRWxlbWVudCAtY2FsbAotICAgIC8vIGlzIGFsd2F5cyBmcm9tIHRo
ZSBkb2N1bWVudCB0aGF0IG93bnMgdGhlIHN0eWxlIHNlbGVjdG9yCi0gICAgRnJhbWVWaWV3KiB2
aWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsKLSAgICBpZiAodmlldykKLSAgICAgICAgbV9tZWRpdW0g
PSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSkpOwot
ICAgIGVsc2UKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1
YXRvcigiYWxsIikpOwotCi0gICAgaWYgKHJvb3QpCi0gICAgICAgIG1fcm9vdERlZmF1bHRTdHls
ZSA9IHN0eWxlRm9yRWxlbWVudChyb290LCAwLCBEaXNhbGxvd1N0eWxlU2hhcmluZywgTWF0Y2hP
bmx5VXNlckFnZW50UnVsZXMpOwotCi0gICAgaWYgKG1fcm9vdERlZmF1bHRTdHlsZSAmJiB2aWV3
KQotICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZp
ZXctPm1lZGlhVHlwZSgpLCB2aWV3LT5mcmFtZSgpLCBtX3Jvb3REZWZhdWx0U3R5bGUuZ2V0KCkp
KTsKLQotICAgIG1fcnVsZVNldHMucmVzZXRBdXRob3JTdHlsZSgpOwotCi0gICAgRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKTsKLSAgICBtX3J1bGVTZXRzLmluaXRVc2VyU3R5bGUoc3R5bGVT
aGVldENvbGxlY3Rpb24sICptX21lZGl1bSwgKnRoaXMpOwotCi0jaWYgRU5BQkxFKFNWR19GT05U
UykKLSAgICBpZiAoZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKSkgewotICAgICAgICBjb25zdCBI
YXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+JiBzdmdGb250RmFjZUVsZW1lbnRzID0gZG9jdW1l
bnQtPnN2Z0V4dGVuc2lvbnMoKS0+c3ZnRm9udEZhY2VFbGVtZW50cygpOwotICAgICAgICBIYXNo
U2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBzdmdGb250RmFj
ZUVsZW1lbnRzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3ZnRm9udEZhY2VFbGVtZW50cy5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpCi0gICAgICAgICAgICBmb250U2VsZWN0b3IoKS0+YWRkRm9udEZhY2VSdWxl
KCgqaXQpLT5mb250RmFjZVJ1bGUoKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcHBlbmRBdXRo
b3JTdHlsZVNoZWV0cygwLCBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+YWN0aXZlQXV0aG9yU3R5bGVT
aGVldHMoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwZW5kQXV0aG9yU3R5bGVTaGVl
dHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
PiYgc3R5bGVTaGVldHMpCi17Ci0gICAgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0
cyhmaXJzdE5ldywgc3R5bGVTaGVldHMsIG1fbWVkaXVtLmdldCgpLCBtX2luc3BlY3RvckNTU09N
V3JhcHBlcnMsIGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCB0aGlzKTsKLSAgICBpZiAoZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSAmJiBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpKQot
ICAgICAgICBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZv
bnRTZWxlY3RvcigpKTsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAg
dmlld3BvcnRTdHlsZVJlc29sdmVyKCktPnJlc29sdmUoKTsKLSNlbmRpZgotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkKLXsKLSAgICBj
b25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRzUGFyZW50ID0gcGFyZW50LT5wYXJlbnRPclNoYWRv
d0hvc3RFbGVtZW50KCk7Ci0KLSAgICAvLyBXZSBhcmUgbm90IGFsd2F5cyBpbnZva2VkIGNvbnNp
c3RlbnRseS4gRm9yIGV4YW1wbGUsIHNjcmlwdCBleGVjdXRpb24gY2FuIGNhdXNlIHVzIHRvIGVu
dGVyCi0gICAgLy8gc3R5bGUgcmVjYWxjIGluIHRoZSBtaWRkbGUgb2YgdHJlZSBidWlsZGluZy4g
V2UgbWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHNvbWV3aGVyZSB3aXRoaW4gdGhlIHRyZWUuCi0g
ICAgLy8gUmVzZXQgdGhlIHN0YWNrIGluIHRoaXMgY2FzZSwgb3IgaWYgd2Ugc2VlIGEgbmV3IHJv
b3QgZWxlbWVudC4KLSAgICAvLyBPdGhlcndpc2UganVzdCBwdXNoIHRoZSBuZXcgcGFyZW50Lgot
ICAgIGlmICghcGFyZW50c1BhcmVudCB8fCBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNF
bXB0eSgpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnNldHVwUGFyZW50U3RhY2socGFyZW50
KTsKLSAgICBlbHNlCi0gICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucHVzaFBhcmVudChwYXJlbnQp
OwotCi0gICAgLy8gTm90ZTogV2UgbXVzdG4ndCBza2lwIFNoYWRvd1Jvb3Qgbm9kZXMgZm9yIHRo
ZSBzY29wZSBzdGFjay4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3Bl
UmVzb2x2ZXItPnB1c2gocGFyZW50LCBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9zdE5vZGUoKSk7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJl
bnQpCi17Ci0gICAgLy8gTm90ZSB0aGF0IHdlIG1heSBnZXQgaW52b2tlZCBmb3Igc29tZSByYW5k
b20gZWxlbWVudHMgaW4gc29tZSB3YWNreSBjYXNlcyBkdXJpbmcgc3R5bGUgcmVzb2x2ZS4KLSAg
ICAvLyBQYXVzZSBtYWludGFpbmluZyB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLgotICAgIGlmICht
X3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHBhcmVudCkpCi0gICAgICAg
IG1fc2VsZWN0b3JGaWx0ZXIucG9wUGFyZW50KCk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikK
LSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3AocGFyZW50KTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjpwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290
KQotewotICAgIEFTU0VSVChzaGFkb3dSb290LT5ob3N0KCkpOwotICAgIGlmIChtX3Njb3BlUmVz
b2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cHVzaChzaGFkb3dSb290LCBzaGFkb3dS
b290LT5ob3N0KCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudFNoYWRvd1Jv
b3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKK1N0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVz
dWx0JiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3VsdCgpCiB7Ci0gICAgQVNTRVJU
KHNoYWRvd1Jvb3QtPmhvc3QoKSk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAg
bV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7CisgICAgQVNTRVJUKG1fbW9kZSA9PSBT
ZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKyAgICByZXR1cm4gbV9yZXN1bHQ7CiB9
CiAKLS8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtl
eWZyYW1lIHN0eWxlcwotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NS
ZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQorUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoZWRSdWxlTGlzdCgpCiB7Ci0gICAgQXRvbWljU3Ry
aW5nIHMocnVsZS0+bmFtZSgpKTsKLSAgICBtX2tleWZyYW1lc1J1bGVNYXAuc2V0KHMuaW1wbCgp
LCBydWxlKTsKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGlu
Z1J1bGVzKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7CiB9CiAKLVN0eWxlUmVz
b2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjphZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSogcnVsZSkKIHsKLSAgICBtX2ZvbnRTZWxl
Y3Rvci0+Y2xlYXJEb2N1bWVudCgpOwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElP
TikKLSAgICBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOwotI2VuZGlm
CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAgICAgICAgbV9tYXRjaGVkUnVsZXMgPSBhZG9w
dFB0cihuZXcgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+KTsKKyAgICBtX21hdGNoZWRSdWxl
cy0+YXBwZW5kKHJ1bGUpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCitpbmxpbmUgdm9pZCBFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6Y2xlYXJNYXRjaGVkUnVsZXMoKQogewotICAgIC8vIExvb2sgZm9yIGNh
Y2hlIGVudHJpZXMgY29udGFpbmluZyBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggYSBzaW5nbGUg
cmVmIGFuZCByZW1vdmUgdGhlbS4KLSAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBhbiBlbGVt
ZW50IGF0dHJpYnV0ZSBtdXRhdGlvbiBjYXVzZXMgaXQgdG8gZ2VuZXJhdGUgYSBuZXcgaW5saW5l
U3R5bGUoKQotICAgIC8vIG9yIHByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCksIHBvdGVudGlh
bGx5IGxlYXZpbmcgdGhpcyBjYWNoZSB3aXRoIHRoZSBsYXN0IHJlZiBvbiB0aGUgb2xkIG9uZS4K
LSAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiB0b1JlbW92ZTsKLSAgICBNYXRjaGVkUHJvcGVydGll
c0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5iZWdpbigpOwot
ICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGVuZCA9IG1fbWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZS5lbmQoKTsKLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcz4mIG1hdGNoZWRQcm9wZXJ0aWVzID0gaXQtPnZhbHVl
Lm1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlZFByb3Bl
cnRpZXNbaV0ucHJvcGVydGllcy0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgICAgICB0b1Jl
bW92ZS5hcHBlbmQoaXQtPmtleSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b1JlbW92
ZS5zaXplKCk7ICsraSkKLSAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLnJlbW92ZSh0
b1JlbW92ZVtpXSk7Ci0KLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5j
ZUxhc3RTd2VlcCA9IDA7CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAgICAgICAgcmV0dXJu
OworICAgIG1fbWF0Y2hlZFJ1bGVzLT5jbGVhcigpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5
bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5r
TWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQor
aW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5zdXJlUnVs
ZUxpc3QoKQogewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRp
ZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7
Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5
U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlu
a01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdo
aXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsK
KyAgICBpZiAoIW1fcnVsZUxpc3QpCisgICAgICAgIG1fcnVsZUxpc3QgPSBTdGF0aWNDU1NSdWxl
TGlzdDo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7CiB9CiAKLWlubGlu
ZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXND
YWNoZWFibGUpCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6YWRkRWxlbWVudFN0
eWxlUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBp
c0NhY2hlYWJsZSkKIHsKICAgICBpZiAoIXByb3BlcnR5U2V0KQogICAgICAgICByZXR1cm47Ci0g
ICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQot
ICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNl
dCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JS
dWxlID09IC0xKQorICAgICAgICBtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gbV9y
ZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOworICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKHByb3BlcnR5U2V0KTsKICAgICBpZiAoIWlzQ2FjaGVhYmxlKQotICAgICAgICByZXN1
bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLX0KLQotY2xhc3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUg
ewotcHVibGljOgotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0gICAgfk1hdGNoaW5nVUFS
dWxlc1Njb3BlKCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBpc01hdGNoaW5nVUFSdWxlcygpOwotCi1w
cml2YXRlOgotICAgIHN0YXRpYyBib29sIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfTsKLQotTWF0Y2hp
bmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBBU1NFUlQoIW1f
bWF0Y2hpbmdVQVJ1bGVzKTsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9IHRydWU7CisgICAgICAg
IG1fcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7CiB9CiAKLU1hdGNoaW5nVUFSdWxlc1Njb3Bl
Ojp+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQotewotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFs
c2U7Ci19Ci0KLWlubGluZSBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFS
dWxlcygpCi17Ci0gICAgcmV0dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfQotCi1ib29sIE1hdGNo
aW5nVUFSdWxlc1Njb3BlOjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hS
ZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBT
dHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsKICAgICBBU1NFUlQobWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQpOwogICAgIEFTU0VSVChtX3N0YXRlLmVsZW1lbnQoKSk7CiAKLSAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CiAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKTsK
ICAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVkRWxl
bWVudCgpOwogICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5zaGFk
b3dQc2V1ZG9JZCgpOwpAQCAtNDc4LDEwICsxMzEsMTAgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpj
b2xsZWN0TWF0Y2hpbmdSdWxlcwogICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93cyBhdXRo
b3IgcnVsZXMKICAgICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBzdHlsZSBz
aGVldCB3aXRoaW4gdGhlIHNhbWUgdHJlZSBzY29wZQogICAgIFRyZWVTY29wZSogdHJlZVNjb3Bl
ID0gZWxlbWVudC0+dHJlZVNjb3BlKCk7Ci0gICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNTY29wZTo6
aXNNYXRjaGluZ1VBUnVsZXMoKQorICAgIGlmICghbV9tYXRjaGluZ1VBUnVsZXMKICAgICAgICAg
JiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQogICAgICAgICAmJiAoIW1hdGNoUmVx
dWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29w
ZSkKLSAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICAmJiBtX2JlaGF2aW9yQXRC
b3VuZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQogICAgICAg
ICByZXR1cm47CiAKICAgICAvLyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwg
Y2xhc3MsIHRhZywgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZApAQCAtNTAx
LDE1ICsxNTQsMTUgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcwog
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5p
dmVyc2FsUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogfQogCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVD
b2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsK
LSAgICBpZiAoIW1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKQorICAgIGlmICghbV9yZWdpb25G
b3JTdHlsaW5nKQogICAgICAgICByZXR1cm47CiAKICAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwogICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgY29uc3QgQ1NT
U2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7Ci0gICAgICAgIGlmIChjaGVja1Jl
Z2lvblNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9zdGF0
ZS5yZWdpb25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7CisgICAgICAgIGlmIChjaGVja1JlZ2lv
blNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZWdpb25G
b3JTdHlsaW5nLT5ub2RlKCkpKSkgewogICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMg
PSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChp
KS5ydWxlU2V0LmdldCgpOwogICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKICAgICAg
ICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0
Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFu
Z2UpOwpAQCAtNTE3LDE4ICsxNzAsMTkgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0
Y2hpbmdSdWxlcwogICAgIH0KIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNm
ZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xs
ZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcygpCiB7Ci0gICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLSAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxl
cyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOwotICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgp
KQorICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAg
ICBpZiAoIW1fbWF0Y2hlZFJ1bGVzIHx8IG1fbWF0Y2hlZFJ1bGVzLT5pc0VtcHR5KCkpCiAgICAg
ICAgIHJldHVybjsKIAogICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKIAotICAgIGlmIChzdGF0ZS5t
b2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICBWZWN0b3I8
Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9ICptX21hdGNoZWRSdWxlczsKKyAg
ICBpZiAobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CiAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kpCi0g
ICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRjaGVk
UnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOworICAgICAgICAgICAgZW5z
dXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNy
ZWF0ZUNTU09NV3JhcHBlcigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTM2LDEx
ICsxOTAsMTEgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaAogICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKICAg
ICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29t
bW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVu
aXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxl
c1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRj
aGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdo
aXRlbGlzdFR5cGUoKSk7CisgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKG1h
dGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVs
ZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5w
cm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7CiAgICAgfQogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoU2NvcGVkQXV0aG9y
UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICNpZiBFTkFCTEUoU1RZTEVfU0NPUEVE
KSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKQEAgLTU1
Miw4ICsyMDYsOCBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsCiAg
ICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7CiAgICAgICAgIHVuc2lnbmVkIHNjb3Bl
U2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7CiAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9zdGF0ZS5tYXRj
aGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9y
UnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgICAgICAgICAg
Y2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICAgICAgICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0
aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CiAKICAgICAg
ICAgICAgIGNvbnN0IFN0eWxlU2NvcGVSZXNvbHZlcjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Nj
b3BlUmVzb2x2ZXItPnN0YWNrRnJhbWVBdChpKTsKICAgICAgICAgICAgIGRvY3VtZW50U2NvcGUg
PSBkb2N1bWVudFNjb3BlICYmICFmcmFtZS5tX3Njb3BlLT5pc0luU2hhZG93VHJlZSgpOwpAQCAt
NTY2LDM2ICsyMjAsMjYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1
bAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0
KGZyYW1lLm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVsZXMsIGZyYW1lLm1fc2NvcGUpOwotICAg
ICAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJh
bmdlKCk7CisgICAgICAgICAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
bV9yZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwogICAgICAgICAgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogICAgICAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAg
ICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgICAgICAgICBz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1h
dGNoSG9zdFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIG1hdGNoSG9zdFJ1
bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKTsKICNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7
CiAgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKICNlbmRpZgogfQogCi1pbmxp
bmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1
bGVzKCkKLXsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICByZXR1cm4gbV9zY29wZVJlc29s
dmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RS
dWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRp
ZgotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjptYXRjaEhvc3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQogewogI2lmIEVOQUJMRShT
SEFET1dfRE9NKQogICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2ZXIpOwogCi0gICAgbV9zdGF0ZS5t
YXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUg
PSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBjbGVhck1hdGNoZWRS
dWxlcygpOworICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CiAKICAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNo
ZWRSdWxlczsKICAgICBtX3Njb3BlUmVzb2x2ZXItPm1hdGNoSG9zdFJ1bGVzKG1fc3RhdGUuZWxl
bWVudCgpLCBtYXRjaGVkUnVsZXMpOwpAQCAtNjAzLDg4ICsyNDcsMTU2IEBAIHZvaWQgU3R5bGVS
ZXNvbHZlcjo6bWF0Y2hIb3N0UnVsZXMoTWF0Y2gKICAgICAgICAgcmV0dXJuOwogCiAgICAgZm9y
ICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAg
ICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsK
KyAgICAgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJh
bmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0
Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0
ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwogICAgIH0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRj
aGVkUnVsZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKICNl
bHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CiAgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVF
bXB0eVJ1bGVzKTsKICNlbmRpZgogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9y
UnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKKyNpZiBF
TkFCTEUoU0hBRE9XX0RPTSkKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRj
aFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcywgU3R5bGVSZXNv
bHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYgKG1fcnVsZVNldHMuc2hhZG93
RGlzdHJpYnV0ZWRSdWxlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGVt
cG9yYXJ5Q2hhbmdlPGJvb2w+IGNhblVzZUZhc3RSZWplY3QobV9jYW5Vc2VGYXN0UmVqZWN0LCBm
YWxzZSk7CisgICAgVGVtcG9yYXJ5Q2hhbmdlPFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJv
dW5kYXJ5PiBiZWhhdmlvckF0Qm91bmRhcnkobV9iZWhhdmlvckF0Qm91bmRhcnksIFNlbGVjdG9y
Q2hlY2tlcjo6Q3Jvc3Nlc0JvdW5kYXJ5KTsKKworICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1h
dGNoUmVxdWVzdHM7CisgICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29s
bGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKKyAgICAg
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKK30K
KyNlbmRpZgorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhvclJ1bGVzKGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMpCiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVh
cigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBjbGVhck1hdGNoZWRSdWxlcygpOworICAgIG1fcmVz
dWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKSAtIDE7CiAKICAgICBpZiAoIW1fc3RhdGUuZWxlbWVudCgpKQogICAgICAgICByZXR1cm47
CiAKICAgICAvLyBNYXRjaCBnbG9iYWwgYXV0aG9yIHJ1bGVzLgogICAgIE1hdGNoUmVxdWVzdCBt
YXRjaFJlcXVlc3QobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7
Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdl
KCk7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJh
bmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7CiAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0
Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3Rv
cjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0
cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1h
dGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5z
aXplKCk7ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tp
XSwgcnVsZVJhbmdlKTsKKyAgICBtYXRjaFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoaW5jbHVkZUVt
cHR5UnVsZXMsIHJ1bGVSYW5nZSk7CiAjZW5kaWYKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMoKTsKIAotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOwotCi0g
ICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAg
ICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKTsKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVs
ZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0
eWxlKCkpCiAgICAgICAgIHJldHVybjsKICAgICAKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygp
LmNsZWFyKCk7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKIAotICAgIHJlc3VsdC5yYW5nZXMu
bGFzdFVzZXJSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAg
bV9yZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
LnNpemUoKSAtIDE7CiAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLnVz
ZXJTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9
IHJlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVS
YW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOwogICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CiAKLSAgICBz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJN
YXRjaGVkUnVsZXMoKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0
Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVj
dG9yOjptYXRjaFVBUnVsZXMoKQogewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIo
KTsKKyAgICBUZW1wb3JhcnlDaGFuZ2U8Ym9vbD4gc2NvcGUobV9tYXRjaGluZ1VBUnVsZXMsIHRy
dWUpOworCisgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBz
aGVldC4KKyAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVT
aGVldCkKKyAgICAgICAgbV9yZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICBSdWxlU2V0
KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9pc1ByaW50U3R5bGUKKyAgICAgICAgPyBDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0U3R5bGU7CisgICAgbWF0Y2hVQVJ1bGVzKHVzZXJBZ2VudFN0eWxlU2hlZXQpOwor
CisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1
c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkKKyAg
ICAgICAgbWF0Y2hVQVJ1bGVzKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0
eWxlKTsKKworICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChpbiB2
aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2ggcnVs
ZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCisgICAgaWYgKGRvY3VtZW50KCkt
PmlzVmlld1NvdXJjZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoVUFSdWxlcyhSdWxlU2V0KiBydWxlcykKK3sKKyAgICBjbGVhck1hdGNoZWRSdWxlcygp
OwogICAgIAotICAgIHJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFu
Z2VzLlVBUnVsZVJhbmdlKCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgPSBtX3Jl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1
bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwogCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKCk7Cit9CisKK2lubGluZSBib29sIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5v
ZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbykKK3sKKyAgICBjb25zdCBTdHlsZVJl
c29sdmVyOjpTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKHJ1bGVEYXRhLmhhc0Zh
c3RDaGVja2FibGVTZWxlY3RvcigpKSB7CisgICAgICAgIC8vIFdlIGtub3cgdGhpcyBzZWxlY3Rv
ciBkb2VzIG5vdCBpbmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVudHMuCisgICAgICAgIGlmIChtX3Bz
ZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCAhPSBOT1BTRVVETykKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgLy8gV2Uga25vdyBhIHN1ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xl
IHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkgYmVjYXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRo
ZSBydWxlIGhhc2guCisgICAgICAgIC8vIFRoaXMgaXMgbGltaXRlZCB0byBIVE1MIG9ubHkgc28g
d2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFtZXNwYWNlLgorICAgICAgICBpZiAocnVsZURh
dGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGluZ0hUTUxCYXNlZE9uUnVsZUhhc2goKSAmJiBz
dGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKCFydWxl
RGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisgICAgICAgIGlmIChydWxlRGF0YS5zZWxlY3RvcigpLT5tX21hdGNoID09
IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9yQ2hlY2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5l
bGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCktPnRhZ1FOYW1lKCkpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBTZWxlY3RvckNoZWNrZXJGYXN0UGF0aCBzZWxlY3RvckNo
ZWNrZXJGYXN0UGF0aChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCkpOworICAg
ICAgICBpZiAoIXNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXNSaWdodG1vc3RBdHRyaWJ1
dGVTZWxlY3RvcigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVy
biBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzKCk7CisgICAgfQorCisgICAgLy8gU2xv
dyBwYXRoLgorICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwg
bV9tb2RlKTsKKyAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNv
bnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNr
ZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOworICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3Rh
dGUuc3R5bGUoKTsKKyAgICBjb250ZXh0LnNjb3BlID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1
ZG9JZCA9IG1fcHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkOworICAgIGNvbnRleHQuc2Nyb2xs
YmFyID0gbV9wc2V1ZG9TdHlsZVJlcXVlc3Quc2Nyb2xsYmFyOworICAgIGNvbnRleHQuc2Nyb2xs
YmFyUGFydCA9IG1fcHNldWRvU3R5bGVSZXF1ZXN0LnNjcm9sbGJhclBhcnQ7CisgICAgY29udGV4
dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBtX2JlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBTZWxlY3Rv
ckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5
bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKKyAgICBpZiAobWF0
Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAobV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQgIT0gTk9QU0VVRE8g
JiYgbV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBy
dWxlcywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJh
bmdlKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1h
dGNoUmVxdWVzdCwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCiB7CiAgICAg
aWYgKCFydWxlcykKICAgICAgICAgcmV0dXJuOwogCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLSAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBm
b3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNv
bHZlLgotICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRh
dGUgaW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBib29s
IGNhblVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0
ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFy
eSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OworICAgIGNvbnN0IFN0
eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CiAKICAgICB1bnNpZ25lZCBzaXpl
ID0gcnVsZXMtPnNpemUoKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytp
KSB7CiAgICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChpKTsKLSAg
ICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0
U2VsZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2Nl
bmRhbnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCisgICAgICAgIGlmIChtX2NhblVzZUZh
c3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6
Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3RvcklkZW50
aWZpZXJIYXNoZXMoKSkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBTdHlsZVJ1
bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxlKCk7Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1
bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1
bGUoZG9jdW1lbnQoKSwgcnVsZSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgp
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKTsKICAgICAgICAgUHNldWRvSWQgZHluYW1pY1BzZXVk
byA9IE5PUFNFVURPOwotICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVx
dWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFy
eSkpIHsKKyAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2Nv
cGUsIGR5bmFtaWNQc2V1ZG8pKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8g
cHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2Rl
LgogICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUt
PnByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIGlmICghcHJvcGVydGllcyB8fCAocHJvcGVydGll
cy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMpKSB7CkBAIC02
OTIsMTQgKzQwNCwxNCBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVz
CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAv
LyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMgQVBJ
IHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVkZWQuCi0gICAgICAgICAgICBp
ZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgpICYmICFydWxlRGF0YS5oYXNEb2N1bWVudFNlY3Vy
aXR5T3JpZ2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtX3NhbWVPcmlnaW5Pbmx5ICYmICFydWxl
RGF0YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKICAgICAgICAgICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIHdl
J3JlIG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgogICAgICAgICAg
ICAgLy8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50LgotICAgICAgICAg
ICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1
ZXN0KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUu
bW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAgICAg
ICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBtX3BzZXVkb1N0eWxlUmVxdWVzdC5w
c2V1ZG9JZCA9PSBOT1BTRVVETykgeworICAgICAgICAgICAgICAgIGlmIChtX21vZGUgPT0gU2Vs
ZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CiAgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTcxMiw3ICs0
MjQsNyBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzCiAgICAgICAg
ICAgICAgICAgICAgIHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVs
ZUluZGV4OwogCiAgICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICAgICAgICAgIG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUo
JnJ1bGVEYXRhKTsKKyAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEpOwog
ICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNv
b2tpZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBA
IC03MjgsNDUxNSArNDQwLDY5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29u
c3QgUnUKICAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBv
c2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsK
IH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKK3ZvaWQgRWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OnNvcnRNYXRjaGVkUnVsZXMoKQogewotICAgIHN0ZDo6c29ydChtX3N0
YXRlLm1hdGNoZWRSdWxlcygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCks
IGNvbXBhcmVSdWxlcyk7CisgICAgQVNTRVJUKG1fbWF0Y2hlZFJ1bGVzKTsKKyAgICBzdGQ6OnNv
cnQobV9tYXRjaGVkUnVsZXMtPmJlZ2luKCksIG1fbWF0Y2hlZFJ1bGVzLT5lbmQoKSwgY29tcGFy
ZVJ1bGVzKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQordm9pZCBFbGVtZW50UnVs
ZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyhib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywg
Ym9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCiB7Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCk7
CisgICAgbWF0Y2hVQVJ1bGVzKCk7CiAKICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBy
dWxlcy4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNo
VXNlclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMpCisgICAgICAgIG1hdGNoVXNlclJ1bGVzKGZhbHNlKTsKIAogICAgIC8vIE5vdyBjaGVjayBh
dXRob3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0
ZXMgbWFwcGVkIGZyb20gSFRNTC4KICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsK
LSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKyAgICAgICAgYWRkRWxl
bWVudFN0eWxlUHJvcGVydGllcyhtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9u
QXR0cmlidXRlU3R5bGUoKSk7CiAKICAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwg
bWFwcGVkIGRlY2xhcmF0aW9ucy4KICAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBz
aGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCiAgICAg
ICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVw
ZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCi0gICAgICAgIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRk
aXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworICAgICAgICBhZGRFbGVtZW50
U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2Vu
dGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CiAKICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKICAgICAgICAgICAgIGJvb2wgaXNBdXRvOwogICAg
ICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0
YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRl
KGlzQXV0byk7CiAgICAgICAgICAgICBpZiAoaXNBdXRvKQotICAgICAgICAgICAgICAgIGFkZE1h
dGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdo
dERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAg
ICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHRleHREaXJlY3Rpb24gPT0gTFRSID8g
bGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKICAg
ICAgICAgfQogICAgIH0KICAgICAKICAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNo
ZWV0cyBuZXh0LgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAg
bWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKyAgICBpZiAobWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzKQorICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGZhbHNlKTsKIAogICAgIC8vIE5v
dyBjaGVjayBvdXIgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KLSAgICBpZiAobV9tYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsKKyAgICBpZiAobWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpKSB7CiAgICAgICAgIC8vIElubGluZSBzdHlsZSBpcyBpbW11dGFi
bGUgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVyLgogICAgICAgICAvLyBGSVhN
RTogTWVkaWEgY29udHJvbCBzaGFkb3cgdHJlZXMgc2VlbSB0byBoYXZlIHByb2JsZW1zIHdpdGgg
Y2FjaGluZy4KICAgICAgICAgYm9vbCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAmJiAhbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7CiAgICAgICAgIC8vIEZJWE1FOiBDb25z
dGlmeS4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsK
KyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7CiAgICAgfQogCiAjaWYg
RU5BQkxFKFNWRykKICAgICAvLyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5
bGUuCi0gICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aXNTVkdFbGVtZW50KCkpCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMo
cmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkp
LT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8p
OworICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pc1NWR0VsZW1lbnQoKSkKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhzdGF0
aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNN
SUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOwogI2Vsc2UKICAg
ICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKICNlbmRpZgogfQogCi1ib29s
IFN0eWxlUmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxp
dFN0cmluZyYgY2xhc3NOYW1lcykgY29uc3QKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgY2xhc3NOYW1lcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobV9ydWxlU2V0cy5mZWF0
dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzTmFtZXNbaV0uaW1wbCgpKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlu
bGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQot
ewotICAgIG1fZWxlbWVudCA9IGU7Ci0gICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0
eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7Ci0gICAg
bV9lbGVtZW50TGlua1N0YXRlID0gZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUo
KS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUpIDogTm90SW5zaWRlTGluazsKLX0KLQotaW5saW5lIHZv
aWQgU3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKLXsKLSAgICBpZiAobV9z
dGF0ZS5lbGVtZW50KCkgIT0gZSkgewotICAgICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOwot
ICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7
Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxl
bWVudChmYWxzZSk7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNl
dE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW5saW5l
IHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQq
IGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIGNvbnN0IFBz
ZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcpCi17Ci0gICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJl
cXVlc3Q7Ci0gICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKLQotICAg
IGlmIChlKSB7Ci0gICAgICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQoZSk7Ci0gICAg
ICAgIG1fcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxl
KCk7Ci0gICAgICAgIG1fcGFyZW50U3R5bGUgPSBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5j
ZSgpID8gMCA6Ci0gICAgICAgICAgICBwYXJlbnRTdHlsZSA/IHBhcmVudFN0eWxlIDoKLSAgICAg
ICAgICAgIG1fcGFyZW50Tm9kZSA/IG1fcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA6IDA7Ci0g
ICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gY29udGV4dC5pbnNlcnRpb25Q
b2ludCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcGFyZW50Tm9kZSA9IDA7Ci0gICAgICAg
IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsKLSAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBOb2RlKiBkb2NFbGVtZW50ID0gZSA/
IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpIDogMDsKLSAgICBSZW5kZXJTdHlsZSog
ZG9jU3R5bGUgPSBkb2N1bWVudC0+cmVuZGVyU3R5bGUoKTsKLSAgICBtX3Jvb3RFbGVtZW50U3R5
bGUgPSBkb2NFbGVtZW50ICYmIGUgIT0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlclN0
eWxlKCkgOiBkb2NTdHlsZTsKLQotICAgIG1fc3R5bGUgPSAwOwotICAgIG1fcGVuZGluZ0ltYWdl
UHJvcGVydGllcy5jbGVhcigpOwotICAgIG1fcnVsZUxpc3QgPSAwOwotICAgIG1fZm9udERpcnR5
ID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hUaHJlc2hv
bGQgPSAxMDsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9s
ZCA9IDEwOwotCi1zdGF0aWMgaW5saW5lIGJvb2wgcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmlu
Zyhjb25zdCBFbGVtZW50KiBwYXJlbnRFbGVtZW50KQotewotICAgIGlmICghcGFyZW50RWxlbWVu
dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBwYXJlbnRFbGVtZW50LT5oYXNG
bGFnc1NldER1cmluZ1N0eWxpbmdPZkNoaWxkcmVuKCk7Ci19Ci0KLU5vZGUqIFN0eWxlUmVzb2x2
ZXI6OmxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5v
ZGVDb3VudCkgY29uc3QKLXsKLSAgICBpZiAodmlzaXRlZE5vZGVDb3VudCA+PSBjU3R5bGVTZWFy
Y2hUaHJlc2hvbGQgKiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+aXNTdHlsZWRFbGVtZW50KCkpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIGlmIChwYXJlbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIFN0eWxlZEVsZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxT
dHlsZWRFbGVtZW50Kj4ocGFyZW50KTsKLSAgICBpZiAocC0+aW5saW5lU3R5bGUoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAocC0+aXNTVkdFbGVtZW50KCkg
JiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHApLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRp
ZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICBpZiAocC0+aGFzSUQoKSAmJiBt
X3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhwLT5pZEZvclN0eWxlUmVz
b2x1dGlvbigpLmltcGwoKSkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlID0gcC0+cmVuZGVyU3R5bGUoKTsKLSAgICB1bnNpZ25lZCBzdWJjb3VudCA9
IDA7Ci0gICAgTm9kZSogdGhpc0NvdXNpbiA9IHA7Ci0gICAgTm9kZSogY3VycmVudE5vZGUgPSBw
LT5wcmV2aW91c1NpYmxpbmcoKTsKLQotICAgIC8vIFJlc2VydmUgdGhlIHRyaWVzIGZvciB0aGlz
IGxldmVsLiBUaGlzIGVmZmVjdGl2ZWx5IG1ha2VzIHN1cmUgdGhhdCB0aGUgYWxnb3JpdGhtCi0g
ICAgLy8gd2lsbCBuZXZlciBnbyBkZWVwZXIgdGhhbiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9s
ZCBsZXZlbHMgaW50byByZWN1cnNpb24uCi0gICAgdmlzaXRlZE5vZGVDb3VudCArPSBjU3R5bGVT
ZWFyY2hUaHJlc2hvbGQ7Ci0gICAgd2hpbGUgKHRoaXNDb3VzaW4pIHsKLSAgICAgICAgd2hpbGUg
KGN1cnJlbnROb2RlKSB7Ci0gICAgICAgICAgICArK3N1YmNvdW50OwotICAgICAgICAgICAgaWYg
KGN1cnJlbnROb2RlLT5yZW5kZXJTdHlsZSgpID09IHBhcmVudFN0eWxlICYmIGN1cnJlbnROb2Rl
LT5sYXN0Q2hpbGQoKQotICAgICAgICAgICAgICAgICYmIGN1cnJlbnROb2RlLT5pc0VsZW1lbnRO
b2RlKCkgJiYgIXBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcodG9FbGVtZW50KGN1cnJlbnRO
b2RlKSkKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICAgICAgICAgICAgICAmJiAhdG9FbGVt
ZW50KGN1cnJlbnROb2RlKS0+c2hhZG93KCkKLSNlbmRpZgotICAgICAgICAgICAgICAgICkgewot
ICAgICAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdW51c2VkIHJlc2VydmVkIHRyaWVzLgotICAg
ICAgICAgICAgICAgIHZpc2l0ZWROb2RlQ291bnQgLT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkIC0g
c3ViY291bnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQo
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdWJjb3VudCA+PSBjU3R5bGVTZWFy
Y2hUaHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBjdXJy
ZW50Tm9kZSA9IGN1cnJlbnROb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgfQotICAg
ICAgICBjdXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxl
bWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnRO
b2RlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnN0
eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCitib29s
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpoYXNBbnlNYXRjaGluZ1J1bGVzKFJ1bGVTZXQqIHJ1bGVT
ZXQpCiB7Ci0gICAgaWYgKCFydWxlU2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9z
dGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CiAK
LSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMpOworICAg
IG1fbW9kZSA9IFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzOwogICAgIGludCBmaXJzdFJ1
bGVJbmRleCA9IC0xLCBsYXN0UnVsZUluZGV4ID0gLTE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5n
ZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVs
ZVJhbmdlIHJ1bGVSYW5nZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7CiAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOwotICAg
IG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLSAgICBp
ZiAobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxl
ZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiB0aGlzSW5wdXRFbGVtZW50ID0gZWxlbWVudC0+
dG9JbnB1dEVsZW1lbnQoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBvdGhlcklucHV0RWxlbWVu
dCA9IHN0YXRlLmVsZW1lbnQoKS0+dG9JbnB1dEVsZW1lbnQoKTsKLQotICAgIGlmICghdGhpc0lu
cHV0RWxlbWVudCB8fCAhb3RoZXJJbnB1dEVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5lbGVtZW50RGF0YSgpICE9IG90aGVySW5wdXRF
bGVtZW50LT5lbGVtZW50RGF0YSgpKSB7Ci0gICAgICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5m
YXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0
dHJpYnV0ZSh0eXBlQXR0cikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlm
ICh0aGlzSW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0cikgIT0gb3Ro
ZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNB
dXRvZmlsbGVkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzQXV0b2ZpbGxlZCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNo
ZWNrZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1p
bmF0ZSgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5hdGUoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkgIT0g
b3RoZXJJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgaWYgKGVsZW1lbnQtPmlzRW5hYmxlZEZvcm1Db250cm9sKCkgIT0gc3RhdGUuZWxlbWVu
dCgpLT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoZWxlbWVudC0+aXNEZWZhdWx0QnV0dG9uRm9yRm9ybSgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNEZWZhdWx0QnV0dG9uRm9yRm9ybSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoc3RhdGUuZG9jdW1lbnQoKS0+Y29udGFpbnNWYWxpZGl0eVN0eWxlUnVsZXMoKSkgewot
ICAgICAgICBib29sIHdpbGxWYWxpZGF0ZSA9IGVsZW1lbnQtPndpbGxWYWxpZGF0ZSgpOwotCi0g
ICAgICAgIGlmICh3aWxsVmFsaWRhdGUgIT0gc3RhdGUuZWxlbWVudCgpLT53aWxsVmFsaWRhdGUo
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAod2lsbFZhbGlkYXRl
ICYmIChlbGVtZW50LT5pc1ZhbGlkRm9ybUNvbnRyb2xFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVu
dCgpLT5pc1ZhbGlkRm9ybUNvbnRyb2xFbGVtZW50KCkpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgICAgIGlmIChlbGVtZW50LT5pc0luUmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50
KCktPmlzSW5SYW5nZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlm
IChlbGVtZW50LT5pc091dE9mUmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzT3V0T2ZSYW5n
ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVl
OwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oRWxlbWVu
dCogZWxlbWVudCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBsaW5lIGlzIHN1cnByaXNpbmdseSBo
b3QsIHdlIG1heSB3aXNoIHRvIGlubGluZSBoYXNEaXJlY3Rpb25BdXRvIGludG8gU3R5bGVSZXNv
bHZlci4KLSAgICByZXR1cm4gZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpICYmIHRvSFRNTEVsZW1l
bnQoZWxlbWVudCktPmhhc0RpcmVjdGlvbkF1dG8oKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVy
OjpzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0
eWxlZEVsZW1lbnQqIHNoYXJpbmdDYW5kaWRhdGUpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5lbGVtZW50RGF0YSgp
ID09IHNoYXJpbmdDYW5kaWRhdGUtPmVsZW1lbnREYXRhKCkpCi0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6Omxh
bmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjps
YW5nQXR0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgp
LT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0
QXR0cmlidXRlKGxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFz
dGF0ZS5lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSkgewotICAgICAgICBpZiAoc2hhcmlu
Z0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHNoYXJp
bmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfSBlbHNlIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpKSB7Ci0jaWYgRU5BQkxF
KFNWRykKLSAgICAgICAgLy8gU1ZHIGVsZW1lbnRzIHJlcXVpcmUgYSAoc2xvdyEpIGdldEF0dHJp
YnV0ZSBjb21wYXJpc2lvbiBiZWNhdXNlICJjbGFzcyIgaXMgYW4gYW5pbWF0YWJsZSBhdHRyaWJ1
dGUgZm9yIFNWRy4KLSAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkp
IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShjbGFzc0F0
dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSNlbmRpZgotICAgICAg
ICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygpICE9IHNoYXJpbmdDYW5kaWRh
dGUtPmNsYXNzTmFtZXMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0jaWYgRU5B
QkxFKFNWRykKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiBm
YWxzZTsKIAotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJp
YnV0ZVN0eWxlKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1F
TlQpCi0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aGFzVGFnTmFtZShwcm9ncmVzc1RhZykpIHsK
LSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihzdGF0ZS5lbGVt
ZW50KCkpLT5pc0RldGVybWluYXRlKCkgIT0gc3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVu
dCo+KHNoYXJpbmdDYW5kaWRhdGUpLT5pc0RldGVybWluYXRlKCkpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBT
dHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCogZWxl
bWVudCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBlbGVtZW50LT5yZW5kZXJT
dHlsZSgpOwotICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAoIXN0
eWxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlxdWUoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+aGFzVW5pcXVlUHNldWRvU3R5bGUo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT50YWdRTmFtZSgpICE9
IHN0YXRlLmVsZW1lbnQoKS0+dGFnUU5hbWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGlmIChlbGVtZW50LT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
I2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKGVsZW1lbnQtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRp
Y19jYXN0PFNWR0VsZW1lbnQqPihlbGVtZW50KS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVz
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIGlmIChlbGVtZW50LT5pc0xp
bmsoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKGVsZW1lbnQtPmhvdmVyZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmhvdmVyZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5hY3RpdmUoKSAhPSBz
dGF0ZS5lbGVtZW50KCktPmFjdGl2ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYg
KGVsZW1lbnQtPmZvY3VzZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmZvY3VzZWQoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpICE9IHN0
YXRlLmVsZW1lbnQoKS0+c2hhZG93UHNldWRvSWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2Fs
U3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKGVsZW1lbnQtPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgp
ICE9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5oYXNJ
RCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGVsZW1lbnQt
PmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChlbGVtZW50LT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHNoYXJlIHN0eWxlIGZvciBvcHRp
b24gYW5kIG9wdGdyb3VwIHdoZW5ldmVyIHBvc3NpYmxlLgotICAgIC8vIEJlZm9yZSBkb2luZyBz
bywgd2UgbmVlZCB0byByZXNvbHZlIGlzc3VlcyBpbiBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxj
TGlzdEl0ZW1zCi0gICAgLy8gYW5kIFJlbmRlck1lbnVMaXN0OjpzZXRUZXh0LiBTZWUgYWxzbyBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg0MDUKLSAgICBpZiAoZWxl
bWVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0Z3Jv
dXBUYWcpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGlzQ29udHJvbCA9IGVs
ZW1lbnQtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCk7Ci0KLSAgICBpZiAoaXNDb250cm9sICE9IHN0
YXRlLmVsZW1lbnQoKS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKGlzQ29udHJvbCAmJiAhY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKGVs
ZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoc3R5bGUtPnRyYW5zaXRp
b25zKCkgfHwgc3R5bGUtPmFuaW1hdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0j
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIC8vIFR1cm4gb2ZmIHN0eWxlIHNo
YXJpbmcgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdhaW4gbGF5ZXJzIGZvciByZWFzb25zIG91dHNp
ZGUgb2YgdGhlIHN0eWxlIHN5c3RlbS4KLSAgICAvLyBTZWUgY29tbWVudHMgaW4gUmVuZGVyT2Jq
ZWN0OjpzZXRTdHlsZSgpLgotICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKGlmcmFtZVRhZykg
fHwgZWxlbWVudC0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShl
bWJlZFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvYmplY3RUYWcpIHx8IGVsZW1lbnQtPmhh
c1RhZ05hbWUoYXBwbGV0VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGNhbnZhc1RhZykKLSNp
ZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAgICAgICAgLy8gV2l0aCBwcm94eWlu
ZywgdGhlIG1lZGlhIGVsZW1lbnRzIGFyZSBiYWNrZWQgYnkgYSBSZW5kZXJFbWJlZGRlZE9iamVj
dC4KLSAgICAgICAgfHwgZWxlbWVudC0+aGFzVGFnTmFtZSh2aWRlb1RhZykgfHwgZWxlbWVudC0+
aGFzVGFnTmFtZShhdWRpb1RhZykKLSNlbmRpZgotICAgICAgICApCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSNlbmRpZgotCi0gICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKGVsZW1lbnQp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgJiYg
c3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpICE9IHN0eWxlLT5pbnNpZGVMaW5rKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICAvLyBEZW55IHNo
YXJpbmcgc3R5bGVzIGJldHdlZW4gV2ViVlRUIGFuZCBub24tV2ViVlRUIG5vZGVzLgotICAgIGlm
IChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRU
RWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNX
ZWJWVFRFbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSAmJiB0
b1dlYlZUVEVsZW1lbnQoZWxlbWVudCktPmlzUGFzdE5vZGUoKSAhPSB0b1dlYlZUVEVsZW1lbnQo
c3RhdGUuZWxlbWVudCgpKS0+aXNQYXN0Tm9kZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0j
ZW5kaWYKLQotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKLSAgICBpZiAoZWxlbWVudCA9PSBl
bGVtZW50LT5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSB8fCBz
dGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3Jl
ZW5FbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIHJldHVybiB0
cnVlOwotfQotCi1pbmxpbmUgU3R5bGVkRWxlbWVudCogU3R5bGVSZXNvbHZlcjo6ZmluZFNpYmxp
bmdGb3JTdHlsZVNoYXJpbmcoTm9kZSogbm9kZSwgdW5zaWduZWQmIGNvdW50KSBjb25zdAotewot
ICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAg
ICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICBpZiAoY2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KHN0YXRpY19jYXN0PFN0eWxlZEVs
ZW1lbnQqPihub2RlKSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGNvdW50Kysg
PT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSk7Ci19Ci0KLVJlbmRl
clN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWRTdHlsZSgpCi17Ci0gICAgU3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlZEVsZW1lbnQoKSB8fCAhc3Rh
dGUucGFyZW50U3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJZiB0aGUgZWxl
bWVudCBoYXMgaW5saW5lIHN0eWxlIGl0IGlzIHByb2JhYmx5IHVuaXF1ZS4KLSAgICBpZiAoc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVu
dCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihzdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5h
bmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYK
LSAgICAvLyBJZHMgc3RvcCBzdHlsZSBzaGFyaW5nIGlmIHRoZXkgc2hvdyB1cCBpbiB0aGUgc3R5
bGVzaGVldHMuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzSUQoKSAmJiBtX3J1
bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJl
bnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBpZiAoc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oc3RhdGUu
ZWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDYWNoZSB3aGV0aGVyIHN0
YXRlLmVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkgYW55IGtub3duIGNsYXNzIHNlbGVjdG9ycy4KLSAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1iZXIgdmFyaWFibGUuIFRoZSBzdHls
ZSBzaGFyaW5nIGNvZGUgY291bGQgYmUgZmFjdG9yZWQgb3V0IG9mIFN0eWxlUmVzb2x2ZXIuCi0g
ICAgc3RhdGUuc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKHN0YXRlLmVsZW1lbnQoKSAm
JiBzdGF0ZS5lbGVtZW50KCktPmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxl
cyhzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSkpOwotCi0gICAgLy8gQ2hlY2sgcHJldmlv
dXMgc2libGluZ3MgYW5kIHRoZWlyIGNvdXNpbnMuCi0gICAgdW5zaWduZWQgY291bnQgPSAwOwot
ICAgIHVuc2lnbmVkIHZpc2l0ZWROb2RlQ291bnQgPSAwOwotICAgIFN0eWxlZEVsZW1lbnQqIHNo
YXJlRWxlbWVudCA9IDA7Ci0gICAgTm9kZSogY291c2luTGlzdCA9IHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKGNvdXNpbkxpc3QpIHsKLSAgICAg
ICAgc2hhcmVFbGVtZW50ID0gZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoY291c2luTGlzdCwg
Y291bnQpOwotICAgICAgICBpZiAoc2hhcmVFbGVtZW50KQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNvdXNpbkxpc3QgPSBsb2NhdGVDb3VzaW5MaXN0KGNvdXNpbkxpc3QtPnBhcmVudEVs
ZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgaGF2ZSBl
eGhhdXN0ZWQgYWxsIG91ciBidWRnZXQgb3Igb3VyIGNvdXNpbnMuCi0gICAgaWYgKCFzaGFyZUVs
ZW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgc2libGlu
ZyBydWxlcyBhcHBseS4gVGhpcyBpcyBjaGVja2VkIGF0IHRoZSBlbmQgYXMgaXQgc2hvdWxkIHJh
cmVseSBmYWlsLgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldCht
X3J1bGVTZXRzLnNpYmxpbmcoKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8vIENhbid0IHNo
YXJlIGlmIGF0dHJpYnV0ZSBydWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy51bmNvbW1vbkF0dHJpYnV0ZSgpKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgQGhvc3QgQC1ydWxlcyBhcHBseS4K
LSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAvLyBUcmFja2luZyBjaGlsZCBpbmRleCByZXF1aXJlcyB1bmlxdWUg
c3R5bGUgZm9yIGVhY2ggbm9kZS4gVGhpcyBtYXkgZ2V0IHNldCBieSB0aGUgc2libGluZyBydWxl
IG1hdGNoIGFib3ZlLgotICAgIGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRl
LmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0
dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
OjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBNYXRjaGluZ1VBUnVs
ZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVz
ZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6c2ltcGxlRGVm
YXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOwotICAg
IFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21lZGl1bS0+bWVkaWFUeXBlTWF0Y2hT
cGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKLSAgICBt
YXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAgIC8vIEluIHF1
aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVl
dC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAgIG1hdGNoVUFS
dWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlKTsK
LQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChpbiB2aWV3IHNv
dXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2ggcnVsZXMgZnJv
bSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50KCktPmlzVmll
d1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0U3R5bGVzRm9y
UGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdpbmF0aW9uTW9kZSwgUmVuZGVyU3R5
bGUqIHN0eWxlKQotewotICAgIGlmIChwYWdpbmF0aW9uTW9kZSA9PSBQYWdpbmF0aW9uOjpVbnBh
Z2luYXRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBzd2l0Y2ggKHBhZ2luYXRp
b25Nb2RlKSB7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpMZWZ0VG9SaWdodFBhZ2luYXRlZDoKLSAg
ICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOwotICAgICAg
ICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHls
ZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/
IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxl
LT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9u
IDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBh
Z2luYXRpb246OlJpZ2h0VG9MZWZ0UGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29sdW1u
QXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lv
bihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNz
aW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRp
bmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVz
c2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VG9wVG9Cb3R0b21Q
YWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhp
cyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tz
V3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblBy
b2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblBy
b2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Q
cm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgUGFnaW5hdGlvbjo6Qm90dG9tVG9Ub3BQYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxl
LT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Q
cm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENv
bHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VW5w
YWdpbmF0ZWQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsK
LSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGNvbnN0
IFJlbmRlclN0eWxlKiBzdHlsZSwgRm9udE9yaWVudGF0aW9uJiBmb250T3JpZW50YXRpb24sIE5v
bkNKS0dseXBoT3JpZW50YXRpb24mIGdseXBoT3JpZW50YXRpb24pCi17Ci0gICAgaWYgKHN0eWxl
LT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9
IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVu
dGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRj
aCAoc3R5bGUtPnRleHRPcmllbnRhdGlvbigpKSB7Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25W
ZXJ0aWNhbFJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAg
ICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0
OwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25VcHJpZ2h0OgotICAg
ICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlv
biA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25VcHJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAg
Y2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5czoKLSAgICAgICAgaWYgKHN0eWxlLT53cml0aW5n
TW9kZSgpID09IExlZnRUb1JpZ2h0V3JpdGluZ01vZGUpIHsKLSAgICAgICAgICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCBtYXAgdG8gc2lkZXdheXMtbGVmdCwgd2hpY2ggaXMgbm90IHN1cHBvcnRl
ZCB5ZXQuCi0gICAgICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAg
ICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdo
dDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb250T3JpZW50YXRp
b24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhP
cmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRleHRP
cmllbnRhdGlvblNpZGV3YXlzUmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6
b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9u
VmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFs
OwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRp
Y2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50
LCBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcikKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKTsKLQotICAgIC8vIEhUTUw1IHN0YXRlcyB0aGF0IHNlYW1sZXNzIGlm
cmFtZXMgc2hvdWxkIHJlcGxhY2UgZGVmYXVsdCBDU1MgdmFsdWVzCi0gICAgLy8gd2l0aCB2YWx1
ZXMgaW5oZXJpdGVkIGZyb20gdGhlIGNvbnRhaW5pbmcgaWZyYW1lIGVsZW1lbnQuIEhvd2V2ZXIs
Ci0gICAgLy8gc29tZSB2YWx1ZXMgKHN1Y2ggYXMgdGhlIGNhc2Ugb2YgZGVzaWduTW9kZSA9ICJv
biIpIHN0aWxsIG5lZWQgdG8KLSAgICAvLyBiZSBzZXQgYnkgdGhpcyAiZG9jdW1lbnQgc3R5bGUi
LgotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gZG9jdW1lbnRTdHlsZSA9IFJlbmRlclN0eWxlOjpj
cmVhdGUoKTsKLSAgICBib29sIHNlYW1sZXNzV2l0aFBhcmVudCA9IGRvY3VtZW50LT5zaG91bGRE
aXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKTsKLSAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50
KSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBpZnJhbWVTdHlsZSA9IGRvY3VtZW50LT5zZWFtbGVz
c1BhcmVudElGcmFtZSgpLT5yZW5kZXJTdHlsZSgpOwotICAgICAgICBpZiAoaWZyYW1lU3R5bGUp
Ci0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5pbmhlcml0RnJvbShpZnJhbWVTdHlsZSk7Ci0g
ICAgfQotCi0gICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHdoaWNoIHZhbHVlcyBiZWxvdyB3
ZSB3YW50IHRvIG92ZXJyaWRlIGluIHRoZSBzZWFtbGVzcyBjYXNlIQotICAgIGRvY3VtZW50U3R5
bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgIGlmICghc2VhbWxlc3NXaXRoUGFyZW50KSB7Ci0g
ICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFJUTE9yZGVyaW5nKGRvY3VtZW50LT52aXN1YWxseU9y
ZGVyZWQoKSA/IFZpc3VhbE9yZGVyIDogTG9naWNhbE9yZGVyKTsKLSAgICAgICAgZG9jdW1lbnRT
dHlsZS0+c2V0Wm9vbShmcmFtZSAmJiAhZG9jdW1lbnQtPnByaW50aW5nKCkgPyBmcmFtZS0+cGFn
ZVpvb21GYWN0b3IoKSA6IDEpOwotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRQYWdlU2NhbGVU
cmFuc2Zvcm0oZnJhbWUgPyBmcmFtZS0+ZnJhbWVTY2FsZUZhY3RvcigpIDogMSk7Ci0gICAgICAg
IGRvY3VtZW50U3R5bGUtPnNldExvY2FsZShkb2N1bWVudC0+Y29udGVudExhbmd1YWdlKCkpOwot
ICAgIH0KLSAgICAvLyBUaGlzIG92ZXJyaWRlcyBhbnkgLXdlYmtpdC11c2VyLW1vZGlmeSBpbmhl
cml0ZWQgZnJvbSB0aGUgcGFyZW50IGlmcmFtZS4KLSAgICBkb2N1bWVudFN0eWxlLT5zZXRVc2Vy
TW9kaWZ5KGRvY3VtZW50LT5pbkRlc2lnbk1vZGUoKSA/IFJFQURfV1JJVEUgOiBSRUFEX09OTFkp
OwotCi0gICAgRWxlbWVudCogZG9jRWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQo
KTsKLSAgICBSZW5kZXJPYmplY3QqIGRvY0VsZW1lbnRSZW5kZXJlciA9IGRvY0VsZW1lbnQgPyBk
b2NFbGVtZW50LT5yZW5kZXJlcigpIDogMDsKLSAgICBpZiAoZG9jRWxlbWVudFJlbmRlcmVyKSB7
Ci0gICAgICAgIC8vIFVzZSB0aGUgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgb2YgdGhlIGJv
ZHkgdG8gc2V0IHRoZQotICAgICAgICAvLyB2aWV3cG9ydCdzIGRpcmVjdGlvbiBhbmQgd3JpdGlu
Zy1tb2RlIHVubGVzcyB0aGUgcHJvcGVydHkgaXMgc2V0IG9uIHRoZSBkb2N1bWVudCBlbGVtZW50
LgotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBib2R5LCB0aGVuIHVzZSB0aGUgZG9jdW1lbnQg
ZWxlbWVudC4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBib2R5UmVuZGVyZXIgPSBkb2N1bWVudC0+
Ym9keSgpID8gZG9jdW1lbnQtPmJvZHkoKS0+cmVuZGVyZXIoKSA6IDA7Ci0gICAgICAgIGlmIChi
b2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50
KCkpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShib2R5UmVuZGVy
ZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCkt
PndyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+
ZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5
bGUtPnNldERpcmVjdGlvbihib2R5UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGRvY0Vs
ZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOwotICAgIH0KLQotICAgIGlmIChm
cmFtZSkgewotICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygp
KSB7Ci0gICAgICAgICAgICBjb25zdCBQYWdpbmF0aW9uJiBwYWdpbmF0aW9uID0gZnJhbWVWaWV3
LT5wYWdpbmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFnaW5hdGlvbi5tb2RlICE9IFBhZ2lu
YXRpb246OlVucGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5h
dGlvbk1vZGUocGFnaW5hdGlvbi5tb2RlLCBkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAgICAgICAg
ICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRDb2x1bW5HYXAocGFnaW5hdGlvbi5nYXApOwotICAg
ICAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3KiB2aWV3ID0gZG9jdW1lbnQtPnJlbmRlclZpZXco
KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmlldy0+aGFzQ29sdW1ucygpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgdmlldy0+dXBkYXRlQ29sdW1uSW5mb0Zyb21TdHlsZShkb2N1bWVu
dFN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIHdhbnQgdG8gaW5oZXJpdCB0aGVp
ciBmb250IGZyb20gdGhlaXIgcGFyZW50IGlmcmFtZSwgc28gZWFybHkgcmV0dXJuIGJlZm9yZSBz
ZXR0aW5nIHRoZSBmb250LgotICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpCi0gICAgICAgIHJl
dHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBmb250
RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1Njcmlw
dENvZGVGb3JGb250U2VsZWN0aW9uKGRvY3VtZW50U3R5bGUtPmxvY2FsZSgpKSk7Ci0gICAgaWYg
KFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpKSB7Ci0gICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSB8fCAh
c2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUo
KSk7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250ID0gc2V0dGluZ3Mt
PnN0YW5kYXJkRm9udEZhbWlseShmb250RGVzY3JpcHRpb24uc2NyaXB0KCkpOwotICAgICAgICBp
ZiAoIXN0YW5kYXJkRm9udC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwotICAg
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJk
Rm9udCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRG
YW1pbHkoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRT
aXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgICAgIGludCBz
aXplID0gU3R5bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50LCBDU1NWYWx1
ZU1lZGl1bSwgZmFsc2UpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6
ZShzaXplKTsKLSAgICAgICAgYm9vbCB1c2VTVkdab29tUnVsZXMgPSBkb2N1bWVudC0+aXNTVkdE
b2N1bWVudCgpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKFN0eWxl
UmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCBkb2N1
bWVudFN0eWxlLmdldCgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwg
dXNlU1ZHWm9vbVJ1bGVzKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSk7Ci0KLSAgICBGb250T3JpZW50
YXRpb24gZm9udE9yaWVudGF0aW9uOwotICAgIE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhP
cmllbnRhdGlvbjsKLSAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihkb2N1bWVudFN0eWxl
LmdldCgpLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOwotICAgIGZvbnREZXNjcmlw
dGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOwotCi0gICAg
ZG9jdW1lbnRTdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAg
ZG9jdW1lbnRTdHlsZS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IpOwotCi0gICAgcmV0dXJu
IGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdFNo
YWRvd0JvdW5kYXJ5KGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKCFlbGVtZW50
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSA9
IGVsZW1lbnQtPnBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSAmJiBwYXJlbnRO
b2RlLT5pc1NoYWRvd1Jvb3QoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVS
ZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIFJlbmRlclN0eWxlKiBk
ZWZhdWx0UGFyZW50LAotICAgIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHNoYXJpbmdCZWhhdmlvciwg
UnVsZU1hdGNoaW5nQmVoYXZpb3IgbWF0Y2hpbmdCZWhhdmlvciwgUmVuZGVyUmVnaW9uKiByZWdp
b25Gb3JTdHlsaW5nKQotewotICAgIC8vIE9uY2UgYW4gZWxlbWVudCBoYXMgYSByZW5kZXJlciwg
d2UgZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgaXQsIHNpbmNlIG90aGVyd2lzZSB0aGUgcmVuZGVyZXIK
LSAgICAvLyB3aWxsIHZhbmlzaCBpZiBhIHN0eWxlIHJlY2FsYyBoYXBwZW5zIGR1cmluZyBsb2Fk
aW5nLgotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIWVs
ZW1lbnQtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpICYmICFlbGVtZW50LT5y
ZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICghc19zdHlsZU5vdFlldEF2YWlsYWJsZSkgewotICAg
ICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKS5s
ZWFrUmVmKCk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5zZXREaXNwbGF5
KE5PTkUpOwotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+Zm9udCgpLnVwZGF0
ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC0+ZG9jdW1lbnQo
KS0+c2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgpOwotICAgICAgICByZXR1cm4gc19z
dHlsZU5vdFlldEF2YWlsYWJsZTsKLSAgICB9Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29s
dmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZv
clN0eWxpbmcpOwotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcg
JiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIFJlbmRl
clN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJlZFN0eWxlKCk7Ci0gICAgICAgIGlmIChz
aGFyZWRTdHlsZSkKLSAgICAgICAgICAgIHJldHVybiBzaGFyZWRTdHlsZTsKLSAgICB9Ci0KLSAg
ICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNsb25lRm9yUGFyZW50OwotCi0gICAgaWYgKHN0YXRlLnBh
cmVudFN0eWxlKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0
ZSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oc3RhdGUucGFyZW50U3R5
bGUoKSwgaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpID8gUmVuZGVyU3R5bGU6OkF0U2hhZG93
Qm91bmRhcnkgOiBSZW5kZXJTdHlsZTo6Tm90QXRTaGFkb3dCb3VuZGFyeSk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpKTsKLSAg
ICAgICAgY2xvbmVGb3JQYXJlbnQgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3RhdGUuc3R5bGUoKSk7
Ci0gICAgICAgIHN0YXRlLnNldFBhcmVudFN0eWxlKGNsb25lRm9yUGFyZW50LmdldCgpKTsKLSAg
ICB9Ci0gICAgLy8gY29udGVudGVkaXRhYmxlIGF0dHJpYnV0ZSAoaW1wbGVtZW50ZWQgYnkgLXdl
YmtpdC11c2VyLW1vZGlmeSkgc2hvdWxkCi0gICAgLy8gYmUgcHJvcGFnYXRlZCBmcm9tIHNoYWRv
dyBob3N0IHRvIGRpc3RyaWJ1dGVkIG5vZGUuCi0gICAgaWYgKHN0YXRlLmRpc3RyaWJ1dGVkVG9J
bnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIGlmIChFbGVtZW50KiBwYXJlbnQgPSBlbGVtZW50
LT5wYXJlbnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJTdHlsZSogc3R5bGVP
ZlNoYWRvd0hvc3QgPSBwYXJlbnQtPnJlbmRlclN0eWxlKCkpCi0gICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0VXNlck1vZGlmeShzdHlsZU9mU2hhZG93SG9zdC0+dXNlck1vZGlmeSgp
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSkgewotICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJc0xpbmsodHJ1ZSk7Ci0gICAgICAgIEVJbnNpZGVMaW5r
IGxpbmtTdGF0ZSA9IHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUoKTsKLSAgICAgICAgaWYgKGxpbmtT
dGF0ZSAhPSBOb3RJbnNpZGVMaW5rKSB7Ci0gICAgICAgICAgICBib29sIGZvcmNlVmlzaXRlZCA9
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6Zm9yY2VQc2V1ZG9TdGF0ZShlbGVtZW50LCBDU1NT
ZWxlY3Rvcjo6UHNldWRvVmlzaXRlZCk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VWaXNpdGVkKQot
ICAgICAgICAgICAgICAgIGxpbmtTdGF0ZSA9IEluc2lkZVZpc2l0ZWRMaW5rOwotICAgICAgICB9
Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXRlKTsKLSAgICB9
Ci0KLSAgICBib29sIG5lZWRzQ29sbGVjdGlvbiA9IGZhbHNlOwotICAgIENTU0RlZmF1bHRTdHls
ZVNoZWV0czo6ZW5zdXJlRGVmYXVsdFN0eWxlU2hlZXRzRm9yRWxlbWVudChlbGVtZW50LCBuZWVk
c0NvbGxlY3Rpb24pOwotICAgIGlmIChuZWVkc0NvbGxlY3Rpb24pCi0gICAgICAgIG1fcnVsZVNl
dHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCBtX3Njb3BlUmVz
b2x2ZXIuZ2V0KCkpOwotCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7Ci0gICAgaWYgKG1h
dGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1hdGNo
VUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0gICAgZWxzZQotICAgICAgICBtYXRjaEFsbFJ1bGVzKG1h
dGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlM
KTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGVsZW1lbnQpOwot
Ci0gICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVj
b3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCi0gICAgYWRqdXN0UmVuZGVyU3R5bGUoc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxlbWVudCk7Ci0KLSAgICBzdGF0ZS5j
bGVhcigpOyAvLyBDbGVhciBvdXQgZm9yIHRoZSBuZXh0IHJlc29sdmUuCi0KLSAgICBkb2N1bWVu
dCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBz
dHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5
bGUqIGVsZW1lbnRTdHlsZSwgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUsIEtleWZyYW1l
VmFsdWUmIGtleWZyYW1lVmFsdWUpCi17Ci0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwotICAgIGlm
IChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhy
ZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwotCi0gICAgQVNTRVJUKCFtX3N0YXRlLnN0
eWxlKCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIC8vIENyZWF0ZSB0
aGUgc3R5bGUKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y2xvbmUoZWxlbWVudFN0
eWxlKSk7Ci0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotCi0gICAgLy8gV2UgZG9u
J3QgbmVlZCB0byBib3RoZXIgd2l0aCAhaW1wb3J0YW50LiBTaW5jZSB0aGVyZSBpcyBvbmx5IGV2
ZXIgb25lCi0gICAgLy8gZGVjbCwgdGhlcmUncyBub3RoaW5nIHRvIG92ZXJyaWRlLiBTbyBqdXN0
IGFkZCB0aGUgZmlyc3QgcHJvcGVydGllcy4KLSAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxz
ZTsKLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAv
LyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCi0g
ICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJl
IHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplCi0gICAgaWYgKHN0YXRlLmxpbmVIZWln
aHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwg
c3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgLy8gTm93IGRvIHJlc3Qgb2YgdGhlIHBy
b3BlcnRpZXMuCi0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAgICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAw
LCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0K
LSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCBieSBvbmUgb2YgdGhlIG5vbi1lc3NlbnRp
YWwgZm9udCBwcm9wcywKLSAgICAvLyBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IGEgc2Vjb25kIHRp
bWUuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMg
cmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0g
ICAgCi0gICAgLy8gQWRkIGFsbCB0aGUgYW5pbWF0aW5nIHByb3BlcnRpZXMgdG8gdGhlIGtleWZy
YW1lLgotICAgIGlmIChjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBzdHlsZURlY2xhcmF0aW9uID0g
a2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkgewotICAgICAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50
ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlDb3VudCgpOwotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBDU1NQcm9w
ZXJ0eUlEIHByb3BlcnR5ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlBdChpKS5pZCgpOwot
ICAgICAgICAgICAgLy8gVGltaW5nLWZ1bmN0aW9uIHdpdGhpbiBrZXlmcmFtZXMgaXMgc3BlY2lh
bCwgYmVjYXVzZSBpdCBpcyBub3QgYW5pbWF0ZWQ7IGl0IGp1c3QKLSAgICAgICAgICAgIC8vIGRl
c2NyaWJlcyB0aGUgdGltaW5nIGZ1bmN0aW9uIGJldHdlZW4gdGhpcyBrZXlmcmFtZSBhbmQgdGhl
IG5leHQuCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gQ1NTUHJvcGVydHlXZWJraXRBbmlt
YXRpb25UaW1pbmdGdW5jdGlvbikKLSAgICAgICAgICAgICAgICBrZXlmcmFtZVZhbHVlLmFkZFBy
b3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRvY3VtZW50KCktPmRp
ZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjprZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVt
ZW50KiBlLCBjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBLZXlmcmFtZUxpc3QmIGxp
c3QpCi17Ci0gICAgbGlzdC5jbGVhcigpOwotCi0gICAgLy8gR2V0IHRoZSBrZXlmcmFtZXNSdWxl
IGZvciB0aGlzIG5hbWUKLSAgICBpZiAoIWUgfHwgbGlzdC5hbmltYXRpb25OYW1lKCkuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2tleWZyYW1lc1J1bGVNYXAuY2hlY2tDb25z
aXN0ZW5jeSgpOwotCi0gICAgS2V5ZnJhbWVzUnVsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2tleWZy
YW1lc1J1bGVNYXAuZmluZChsaXN0LmFuaW1hdGlvbk5hbWUoKS5pbXBsKCkpOwotICAgIGlmIChp
dCA9PSBtX2tleWZyYW1lc1J1bGVNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNv
bnN0IFN0eWxlUnVsZUtleWZyYW1lcyoga2V5ZnJhbWVzUnVsZSA9IGl0LT52YWx1ZS5nZXQoKTsK
LQotICAgIC8vIENvbnN0cnVjdCBhbmQgcG9wdWxhdGUgdGhlIHN0eWxlIGZvciBlYWNoIGtleWZy
YW1lCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZUtleWZyYW1lPiA+JiBrZXlmcmFtZXMg
PSBrZXlmcmFtZXNSdWxlLT5rZXlmcmFtZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwga2V5ZnJhbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIC8vIEFwcGx5IHRoZSBkZWNsYXJh
dGlvbiB0byB0aGUgc3R5bGUuIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGxv
Z2ljIGluIHN0eWxlRm9yRWxlbWVudAotICAgICAgICBpbml0RWxlbWVudChlKTsKLSAgICAgICAg
bV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUpOwotCi0gICAgICAgIGNv
bnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lID0ga2V5ZnJhbWVzW2ldLmdldCgpOwotCi0gICAg
ICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKLSAgICAgICAga2V5ZnJhbWVW
YWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwga2V5ZnJhbWUsIGtl
eWZyYW1lVmFsdWUpKTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBrZXlmcmFtZSBzdHlsZSB0byBh
bGwgdGhlIGluZGljYXRlZCBrZXkgdGltZXMKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBrZXlzOwot
ICAgICAgICBrZXlmcmFtZS0+Z2V0S2V5cyhrZXlzKTsKLSAgICAgICAgZm9yIChzaXplX3Qga2V5
SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMuc2l6ZSgpOyArK2tleUluZGV4KSB7Ci0gICAgICAg
ICAgICBrZXlmcmFtZVZhbHVlLnNldEtleShrZXlzW2tleUluZGV4XSk7Ci0gICAgICAgICAgICBs
aXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElm
IHRoZSAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJl
IGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKLSAgICBpbnQgaW5pdGlhbExpc3RTaXpl
ID0gbGlzdC5zaXplKCk7Ci0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgbGlzdFswXS5r
ZXkoKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogemVyb1BlcmNlbnRLZXlmcmFt
ZTsKLSAgICAgICAgaWYgKCF6ZXJvUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAgICAgICB6ZXJv
UGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAg
ICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMCUiKTsKLSAgICAgICAg
fQotICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7Ci0gICAgICAgIGtl
eWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIHplcm9Q
ZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLSAgICAgICAgbGlzdC5pbnNlcnQoa2V5
ZnJhbWVWYWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIDEwMCUga2V5ZnJhbWUgaXMgbWlz
c2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIg
a2V5ZnJhbWUpCi0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgKGxpc3RbbGlzdC5zaXpl
KCkgLSAxXS5rZXkoKSAhPSAxKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogaHVu
ZHJlZFBlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCFodW5kcmVkUGVyY2VudEtleWZyYW1l
KSB7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6
Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZS0+
c2V0S2V5VGV4dCgiMTAwJSIpOwotICAgICAgICB9Ci0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5
ZnJhbWVWYWx1ZSgxLCAwKTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZv
cktleWZyYW1lKGVsZW1lbnRTdHlsZSwgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVW
YWx1ZSkpOwotICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICB9Ci19Ci0K
LVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxl
bWVudChFbGVtZW50KiBlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVx
dWVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIEFTU0VSVChwYXJlbnRTdHls
ZSk7Ci0gICAgaWYgKCFlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLQotICAgIHN0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUsIHBzZXVkb1N0eWxlUmVxdWVzdCk7
Ci0gICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICBzdGF0ZS5z
dHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotCi0gICAgLy8gU2lu
Y2Ugd2UgZG9uJ3QgdXNlIHBzZXVkby1lbGVtZW50cyBpbiBhbnkgb2Ygb3VyIHF1aXJrL3ByaW50
IHVzZXIgYWdlbnQgcnVsZXMsIGRvbid0IHdhc3RlIHRpbWUgd2Fsa2luZwotICAgIC8vIHRob3Nl
IHJ1bGVzLgotCi0gICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5kIGF1dGhvciBydWxlcy4KLSAgICBN
YXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOwot
Ci0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSB7Ci0gICAgICAgIG1hdGNoVXNl
clJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMobWF0
Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN0YXRlLnN0eWxl
KCktPnNldFN0eWxlVHlwZShwc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQpOwotCi0gICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZSk7Ci0KLSAgICAvLyBDbGVhbiB1cCBv
dXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3Ro
ZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBtX3N0YXRl
LnBhcmVudFN0eWxlKCksIDApOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVm
ZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLSAg
ICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0
dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUlu
ZGV4KQotewotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBkb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSk7IC8vIG1fcm9vdEVsZW1lbnRTdHlsZSB3aWxsIGJl
IHNldCB0byB0aGUgZG9jdW1lbnQgc3R5bGUuCi0KLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRl
clN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICBjb25zdCBib29sIGlzTGVmdCA9IGlzTGVm
dFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShw
YWdlSW5kZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsK
LSAgICAKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0
LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmly
c3QsIHBhZ2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy51c2VyU3R5
bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBn
bG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNw
ZWMuCi0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCks
IGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
MCk7Ci0gICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0jaWYgRU5BQkxFKENTU19WQVJJ
QUJMRVMpCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihy
ZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5o
ZXJpdGVkT25seSk7Ci0jZW5kaWYKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlv
cml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIElmIG91ciBmb250IGdvdCBk
aXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1cGRhdGVGb250KCk7Ci0K
LSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9u
IHRoZSBmb250LXNpemUuCi0gICAgaWYgKG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBtX3N0YXRlLmxpbmVIZWln
aHRWYWx1ZSgpKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9w
ZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyBy
ZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLQot
ICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIE5vdyBy
ZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOwotfQotCi1Q
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpkZWZhdWx0U3R5bGVGb3JFbGVt
ZW50KCkKLXsKLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0g
ICAgLy8gTWFrZSBzdXJlIG91ciBmb250cyBhcmUgaW5pdGlhbGl6ZWQgaWYgd2UgZG9uJ3QgaW5o
ZXJpdCB0aGVtIGZyb20gb3VyIHBhcmVudCBzdHlsZS4KLSAgICBpZiAoU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnRTZXR0aW5ncygpKSB7Ci0gICAgICAgIGluaXRpYWxpemVGb250U3R5bGUo
c2V0dGluZ3MpOwotICAgICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9udFNl
bGVjdG9yKCkpOwotICAgIH0gZWxzZQotICAgICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51
cGRhdGUoMCk7Ci0KLSAgICByZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JUZXh0KFRleHQqIHRleHRO
b2RlKQotewotICAgIEFTU0VSVCh0ZXh0Tm9kZSk7Ci0KLSAgICBOb2RlUmVuZGVyaW5nQ29udGV4
dCBjb250ZXh0KHRleHROb2RlKTsKLSAgICBOb2RlKiBwYXJlbnROb2RlID0gY29udGV4dC5wYXJl
bnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICByZXR1cm4gY29udGV4dC5yZXNldFN0
eWxlSW5oZXJpdGFuY2UoKSB8fCAhcGFyZW50Tm9kZSA/Ci0gICAgICAgIGRlZmF1bHRTdHlsZUZv
ckVsZW1lbnQoKSA6IHBhcmVudE5vZGUtPnJlbmRlclN0eWxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lk
IGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIC8vIEludHJp
bnNpYyBtYXJnaW4gdmFsdWUuCi0gICAgY29uc3QgaW50IGludHJpbnNpY01hcmdpbiA9IDIgKiBz
dHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdo
dCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMg
Zmxhd2VkLgotICAgIC8vIEZJWE1FOiBVc2luZyAicXVpcmsiIHRvIGRlY2lkZSB0aGUgbWFyZ2lu
IHdhc24ndCBzZXQgaXMga2luZCBvZiBsYW1lLgotICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0lu
dHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luTGVmdCgpLnF1aXJr
KCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVmdChMZW5ndGgoaW50cmluc2ljTWFy
Z2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkK
LSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChMZW5ndGgoaW50cmluc2ljTWFyZ2lu
LCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpIHsK
LSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Ub3AoKS5xdWlyaygpKQotICAgICAgICAgICAgc3R5
bGUtPnNldE1hcmdpblRvcChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgICAg
ICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+
c2V0TWFyZ2luQm90dG9tKExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgfQot
fQotCi1zdGF0aWMgRURpc3BsYXkgZXF1aXZhbGVudEJsb2NrRGlzcGxheShFRGlzcGxheSBkaXNw
bGF5LCBib29sIGlzRmxvYXRpbmcsIGJvb2wgc3RyaWN0UGFyc2luZykKLXsKLSAgICBzd2l0Y2gg
KGRpc3BsYXkpIHsKLSAgICBjYXNlIEJMT0NLOgotICAgIGNhc2UgVEFCTEU6Ci0gICAgY2FzZSBC
T1g6Ci0gICAgY2FzZSBGTEVYOgotICAgIGNhc2UgR1JJRDoKLSAgICAgICAgcmV0dXJuIGRpc3Bs
YXk7Ci0KLSAgICBjYXNlIExJU1RfSVRFTToKLSAgICAgICAgLy8gSXQgaXMgYSBXaW5JRSBidWcg
dGhhdCBmbG9hdGVkIGxpc3QgaXRlbXMgbG9zZSB0aGVpciBidWxsZXRzLCBzbyB3ZSdsbCBlbXVs
YXRlIHRoZSBxdWlyaywgYnV0IG9ubHkgaW4gcXVpcmtzIG1vZGUuCi0gICAgICAgIGlmICghc3Ry
aWN0UGFyc2luZyAmJiBpc0Zsb2F0aW5nKQotICAgICAgICAgICAgcmV0dXJuIEJMT0NLOwotICAg
ICAgICByZXR1cm4gZGlzcGxheTsKLSAgICBjYXNlIElOTElORV9UQUJMRToKLSAgICAgICAgcmV0
dXJuIFRBQkxFOwotICAgIGNhc2UgSU5MSU5FX0JPWDoKLSAgICAgICAgcmV0dXJuIEJPWDsKLSAg
ICBjYXNlIElOTElORV9GTEVYOgotICAgICAgICByZXR1cm4gRkxFWDsKLSAgICBjYXNlIElOTElO
RV9HUklEOgotICAgICAgICByZXR1cm4gR1JJRDsKLQotICAgIGNhc2UgSU5MSU5FOgotICAgIGNh
c2UgUlVOX0lOOgotICAgIGNhc2UgQ09NUEFDVDoKLSAgICBjYXNlIElOTElORV9CTE9DSzoKLSAg
ICBjYXNlIFRBQkxFX1JPV19HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDoKLSAg
ICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX1JPVzoKLSAgICBjYXNl
IFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTjoKLSAgICBjYXNlIFRB
QkxFX0NFTEw6Ci0gICAgY2FzZSBUQUJMRV9DQVBUSU9OOgotICAgICAgICByZXR1cm4gQkxPQ0s7
Ci0gICAgY2FzZSBOT05FOgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAg
cmV0dXJuIE5PTkU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVy
biBCTE9DSzsKLX0KLQotLy8gQ1NTIHJlcXVpcmVzIHRleHQtZGVjb3JhdGlvbiB0byBiZSByZXNl
dCBhdCBlYWNoIERPTSBlbGVtZW50IGZvciB0YWJsZXMsIAotLy8gaW5saW5lIGJsb2NrcywgaW5s
aW5lIHRhYmxlcywgcnVuLWlucywgc2hhZG93IERPTSBjcm9zc2luZ3MsIGZsb2F0aW5nIGVsZW1l
bnRzLAotLy8gYW5kIGFic29sdXRlIG9yIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBlbGVtZW50cy4K
LXN0YXRpYyBib29sIGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKQotewotICAgIHJldHVybiBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxF
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gUlVOX0lOCi0gICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCB8fCBpc0F0U2hhZG93Qm91bmRhcnkoZSkK
LSAgICAgICAgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCBzdHlsZS0+aGFzT3V0T2ZGbG93UG9z
aXRpb24oKTsKLX0KLQotc3RhdGljIGJvb2wgaXNEaXNwbGF5RmxleGlibGVCb3goRURpc3BsYXkg
ZGlzcGxheSkKLXsKLSAgICByZXR1cm4gZGlzcGxheSA9PSBGTEVYIHx8IGRpc3BsYXkgPT0gSU5M
SU5FX0ZMRVg7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRqdXN0UmVuZGVyU3R5bGUoUmVu
ZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQgKmUpCi17
Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKLQotICAgIC8vIENhY2hlIG91ciBvcmlnaW5hbCBk
aXNwbGF5LgotICAgIHN0eWxlLT5zZXRPcmlnaW5hbERpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSk7
Ci0KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FKSB7Ci0gICAgICAgIC8vIElmIHdl
IGhhdmUgYSA8dGQ+IHRoYXQgc3BlY2lmaWVzIGEgZmxvYXQgcHJvcGVydHksIGluIHF1aXJrcyBt
b2RlIHdlIGp1c3QgZHJvcCB0aGUgZmxvYXQKLSAgICAgICAgLy8gcHJvcGVydHkuCi0gICAgICAg
IC8vIFNpdGVzIGFsc28gY29tbW9ubHkgdXNlIGRpc3BsYXk6aW5saW5lL2Jsb2NrIG9uIDx0ZD5z
IGFuZCA8dGFibGU+cy4gSW4gcXVpcmtzIG1vZGUgd2UgZm9yY2UKLSAgICAgICAgLy8gdGhlc2Ug
dGFncyB0byByZXRhaW4gdGhlaXIgZGlzcGxheSB0eXBlcy4KLSAgICAgICAgaWYgKGRvY3VtZW50
KCktPmluUXVpcmtzTW9kZSgpICYmIGUpIHsKLSAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1l
KHRkVGFnKSkgewotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX0NFTEwp
OwotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAg
ICAgIH0gZWxzZSBpZiAoZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykpCi0gICAgICAgICAgICAgICAg
c3R5bGUtPnNldERpc3BsYXkoc3R5bGUtPmlzRGlzcGxheUlubGluZVR5cGUoKSA/IElOTElORV9U
QUJMRSA6IFRBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdO
YW1lKHRkVGFnKSB8fCBlLT5oYXNUYWdOYW1lKHRoVGFnKSkpIHsKLSAgICAgICAgICAgIGlmIChz
dHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1MX05PV1JBUCkgewotICAgICAgICAgICAgICAgIC8v
IEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxseSBub3dyYXBwaW5nIG9yIGlmIHdlIHNob3VsZCBq
dXN0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIG5vcm1hbCBpbnN0ZWFkLiBJZiB0aGUgd2lkdGgg
b2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBh
Y3R1YWxseSB1c2UgTk9XUkFQLgotICAgICAgICAgICAgICAgIGlmIChzdHlsZS0+d2lkdGgoKS5p
c0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PUk1B
TCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0
V2hpdGVTcGFjZShOT1dSQVApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gVGFibGVzIG5ldmVyIHN1cHBvcnQgdGhlIC13ZWJraXQtKiB2YWx1ZXMgZm9yIHRleHQtYWxp
Z24gYW5kIHdpbGwgcmVzZXQgYmFjayB0byB0aGUgZGVmYXVsdC4KLSAgICAgICAgaWYgKGUgJiYg
ZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykgJiYgKHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRf
TEVGVCB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0NFTlRFUiB8fCBzdHlsZS0+dGV4
dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxp
Z24oVEFTVEFSVCk7Ci0KLSAgICAgICAgLy8gRnJhbWVzIGFuZCBmcmFtZXNldHMgbmV2ZXIgaG9u
b3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246YWJzb2x1dGUuIFRoaXMgaXMgbmVjZXNz
YXJ5IHRvCi0gICAgICAgIC8vIGZpeCBhIGNyYXNoIHdoZXJlIGEgc2l0ZSB0cmllcyB0byBwb3Np
dGlvbiB0aGVzZSBvYmplY3RzLiBUaGV5IGFsc28gbmV2ZXIgaG9ub3IgZGlzcGxheS4KLSAgICAg
ICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUoZnJhbWVUYWcpIHx8IGUtPmhhc1RhZ05hbWUoZnJh
bWVzZXRUYWcpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0
aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIFJ1YnkgdGV4dCBkb2VzIG5vdCBzdXBwb3J0IGZsb2F0IG9yIHBvc2l0aW9u
LiBUaGlzIG1pZ2h0IGNoYW5nZSB3aXRoIGV2b2x1dGlvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4K
LSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShydFRhZykpIHsKLSAgICAgICAgICAgIHN0
eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0
RmxvYXRpbmcoTm9GbG9hdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhNRTogV2Ugc2hv
dWxkbid0IGJlIG92ZXJyaWRpbmcgc3RhcnQvLXdlYmtpdC1hdXRvIGxpa2UgdGhpcy4gRG8gaXQg
aW4gaHRtbC5jc3MgaW5zdGVhZC4KLSAgICAgICAgLy8gVGFibGUgaGVhZGVycyB3aXRoIGEgdGV4
dC1hbGlnbiBvZiAtd2Via2l0LWF1dG8gd2lsbCBjaGFuZ2UgdGhlIHRleHQtYWxpZ24gdG8gY2Vu
dGVyLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRoVGFnKSAmJiBzdHlsZS0+dGV4
dEFsaWduKCkgPT0gVEFTVEFSVCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oQ0VO
VEVSKTsKLQotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgLy8gQWJzb2x1dGUv
Zml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywgZmxvYXRpbmcgZWxlbWVudHMgYW5kIHRoZSBkb2N1
bWVudCBlbGVtZW50IG5lZWQgYmxvY2stbGlrZSBvdXRzaWRlIGRpc3BsYXkuCi0gICAgICAgIGlm
IChzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8
IChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpKQotICAgICAgICAg
ICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxh
eSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsK
LQotICAgICAgICAvLyBGSVhNRTogRG9uJ3Qgc3VwcG9ydCB0aGlzIG11dGF0aW9uIGZvciBwc2V1
ZG8gc3R5bGVzIGxpa2UgZmlyc3QtbGV0dGVyIG9yIGZpcnN0LWxpbmUsIHNpbmNlIGl0J3Mgbm90
IGNvbXBsZXRlbHkKLSAgICAgICAgLy8gY2xlYXIgaG93IHRoYXQgc2hvdWxkIHdvcmsuCi0gICAg
ICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdHlsZS0+c3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE8gJiYgc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gcGFyZW50U3R5bGUtPndyaXRp
bmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOwot
Ci0gICAgICAgIC8vIEFmdGVyIHBlcmZvcm1pbmcgdGhlIGRpc3BsYXkgbXV0YXRpb24sIGNoZWNr
IHRhYmxlIHJvd3MuIFdlIGRvIG5vdCBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlv
bjpzdGlja3kgb24KLSAgICAgICAgLy8gdGFibGUgcm93cyBvciBjZWxscy4gVGhpcyBoYXMgYmVl
biBlc3RhYmxpc2hlZCBmb3IgcG9zaXRpb246cmVsYXRpdmUgaW4gQ1NTMi4xIChhbmQgY2F1c2Vk
IGEgY3Jhc2ggaW4gY29udGFpbmluZ0Jsb2NrKCkKLSAgICAgICAgLy8gb24gc29tZSBzaXRlcyku
Ci0gICAgICAgIGlmICgoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxl
LT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0g
VEFCTEVfUk9XKQotICAgICAgICAgICAgJiYgc3R5bGUtPmhhc0luRmxvd1Bvc2l0aW9uKCkpCi0g
ICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOwotCi0gICAgICAg
IC8vIHdyaXRpbmctbW9kZSBkb2VzIG5vdCBhcHBseSB0byB0YWJsZSByb3cgZ3JvdXBzLCB0YWJs
ZSBjb2x1bW4gZ3JvdXBzLCB0YWJsZSByb3dzLCBhbmQgdGFibGUgY29sdW1ucy4KLSAgICAgICAg
Ly8gRklYTUU6IFRhYmxlIGNlbGxzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGJlIHBlcnBlbmRpY3Vs
YXIgb3IgZmxpcHBlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHRhYmxlLCB0aG91Z2guCi0gICAgICAg
IGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTiB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX0NPTFVNTl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RF
Ul9HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJf
R1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cgfHwgc3R5bGUtPmRpc3BsYXko
KSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0g
VEFCTEVfQ0VMTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShwYXJlbnRTdHls
ZS0+d3JpdGluZ01vZGUoKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFNpbmNlIHdlIGRvbid0IHN1
cHBvcnQgYmxvY2stZmxvdyBvbiBmbGV4aWJsZSBib3hlcyB5ZXQsIGRpc2FsbG93IHNldHRpbmcK
LSAgICAgICAgLy8gb2YgYmxvY2stZmxvdyB0byBhbnl0aGluZyBvdGhlciB0aGFuIFRvcFRvQm90
dG9tV3JpdGluZ01vZGUuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00NjQxOCAtIEZsZXhpYmxlIGJveCBzdXBwb3J0LgotICAgICAgICBpZiAoc3R5
bGUtPndyaXRpbmdNb2RlKCkgIT0gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSAmJiAoc3R5bGUtPmRp
c3BsYXkoKSA9PSBCT1ggfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9YKSkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShUb3BUb0JvdHRvbVdyaXRpbmdNb2RlKTsKLQot
ICAgICAgICBpZiAoaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkp
IHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXko
KSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7Ci0g
ICAgICAgIH0KLQotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgLy8gUGVyIHRo
ZSBzcGVjLCBwb3NpdGlvbiAnc3RhdGljJyBhbmQgJ3JlbGF0aXZlJyBpbiB0aGUgdG9wIGxheWVy
IGNvbXB1dGUgdG8gJ2Fic29sdXRlJy4KLSAgICAgICAgaWYgKGUgJiYgZS0+aXNJblRvcExheWVy
KCkgJiYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uIHx8IHN0eWxlLT5wb3Np
dGlvbigpID09IFJlbGF0aXZlUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0UG9z
aXRpb24oQWJzb2x1dGVQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShC
TE9DSyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSBvdXIg
ei1pbmRleCB2YWx1ZSBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIG9iamVjdCBpcyBwb3NpdGlvbmVk
LgotICAgIGlmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiAmJiAhaXNEaXNw
bGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkpCi0gICAgICAgIHN0eWxlLT5z
ZXRIYXNBdXRvWkluZGV4KCk7Ci0KLSAgICAvLyBBdXRvIHotaW5kZXggYmVjb21lcyAwIGZvciB0
aGUgcm9vdCBlbGVtZW50IGFuZCB0cmFuc3BhcmVudCBvYmplY3RzLiBUaGlzIHByZXZlbnRzCi0g
ICAgLy8gY2FzZXMgd2hlcmUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBibGVuZGVkIGFzIGEgc2lu
Z2xlIHVuaXQgZW5kIHVwIHdpdGggYSBub24tdHJhbnNwYXJlbnQKLSAgICAvLyBvYmplY3Qgd2Vk
Z2VkIGluIGJldHdlZW4gdGhlbS4gQXV0byB6LWluZGV4IGFsc28gYmVjb21lcyAwIGZvciBvYmpl
Y3RzIHRoYXQgc3BlY2lmeSB0cmFuc2Zvcm1zL21hc2tzL3JlZmxlY3Rpb25zLgotICAgIGlmIChz
dHlsZS0+aGFzQXV0b1pJbmRleCgpICYmICgoZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVs
ZW1lbnQoKSA9PSBlKQotICAgICAgICB8fCBzdHlsZS0+b3BhY2l0eSgpIDwgMS4wZgotICAgICAg
ICB8fCBzdHlsZS0+aGFzVHJhbnNmb3JtUmVsYXRlZFByb3BlcnR5KCkKLSAgICAgICAgfHwgc3R5
bGUtPmhhc01hc2soKQotICAgICAgICB8fCBzdHlsZS0+Y2xpcFBhdGgoKQotICAgICAgICB8fCBz
dHlsZS0+Ym94UmVmbGVjdCgpCi0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKQotICAgICAg
ICB8fCBzdHlsZS0+aGFzQmxlbmRNb2RlKCkKLSAgICAgICAgfHwgc3R5bGUtPnBvc2l0aW9uKCkg
PT0gU3RpY2t5UG9zaXRpb24KLSAgICAgICAgfHwgKHN0eWxlLT5wb3NpdGlvbigpID09IEZpeGVk
UG9zaXRpb24gJiYgZSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCkgJiYgZS0+ZG9jdW1lbnQoKS0+
cGFnZSgpLT5zZXR0aW5ncygpLT5maXhlZFBvc2l0aW9uQ3JlYXRlc1N0YWNraW5nQ29udGV4dCgp
KQotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCi0gICAgICAgIC8v
IFRvdWNoIG92ZXJmbG93IHNjcm9sbGluZyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dC4KLSAg
ICAgICAgfHwgKChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTiB8fCBzdHlsZS0+b3ZlcmZs
b3dZKCkgIT0gT0hJRERFTikgJiYgc3R5bGUtPnVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcoKSkK
LSNlbmRpZgotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgfHwgKGUgJiYgZS0+
aXNJblRvcExheWVyKCkpCi0jZW5kaWYKLSAgICAgICAgKSkKLSAgICAgICAgc3R5bGUtPnNldFpJ
bmRleCgwKTsKLQotICAgIC8vIFRleHRhcmVhIGNvbnNpZGVycyBvdmVyZmxvdyB2aXNpYmxlIGFz
IGF1dG8uCi0gICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0ZXh0YXJlYVRhZykpIHsKLSAgICAg
ICAgc3R5bGUtPnNldE92ZXJmbG93WChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgPyBP
QVVUTyA6IHN0eWxlLT5vdmVyZmxvd1goKSk7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1ko
c3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dZ
KCkpOwotICAgIH0KLQotICAgIGlmIChkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0aW9uKHN0eWxl
LCBlKSkKLSAgICAgICAgc3R5bGUtPnNldFRleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50
ZXh0RGVjb3JhdGlvbigpKTsKLSAgICBlbHNlCi0gICAgICAgIHN0eWxlLT5hZGRUb1RleHREZWNv
cmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLQotICAgIC8vIElmIGVp
dGhlciBvdmVyZmxvdyB2YWx1ZSBpcyBub3QgdmlzaWJsZSwgY2hhbmdlIHRvIGF1dG8uCi0gICAg
aWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkg
IT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT01BUlFVRUUpOwotICAg
IGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZs
b3dYKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT01BUlFVRUUp
OwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+
b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUpIHsKLSAgICAgICAgLy8gRklYTUU6IE9uY2Ugd2UgaW1w
bGVtZW50IHBhZ2luYXRpb24gY29udHJvbHMsIG92ZXJmbG93LXggc2hvdWxkIGRlZmF1bHQgdG8g
aGlkZGVuCi0gICAgICAgIC8vIGlmIG92ZXJmbG93LXkgaXMgc2V0IHRvIC13ZWJraXQtcGFnZWQt
eCBvciAtd2Via2l0LXBhZ2UteS4gRm9yIG5vdywgd2UnbGwgbGV0IGl0Ci0gICAgICAgIC8vIGRl
ZmF1bHQgdG8gYXV0byBzbyB3ZSBjYW4gYXQgbGVhc3Qgc2Nyb2xsIHRocm91Z2ggdGhlIHBhZ2Vz
LgotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9BVVRPKTsKLSAgICB9IGVsc2UgaWYgKHN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJ
U0lCTEUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0FVVE8pOwotCi0gICAgLy8gQ2Fs
bCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZSgpIGlmIGEgcGFnaW5hdGlvbiBtb2RlIGlzIHNl
dCBmb3IgYW55IG5vbi1yb290IGVsZW1lbnRzLiBJZiB0aGVzZQotICAgIC8vIHN0eWxlcyBhcmUg
c3BlY2lmaWVkIG9uIGEgcm9vdCBlbGVtZW50LCB0aGVuIHRoZXkgd2lsbCBiZSBpbmNvcnBvcmF0
ZWQgaW4KLSAgICAvLyBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KCkuCi0gICAgaWYg
KChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWCB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgPT0g
T1BBR0VEWSkgJiYgIShlICYmIChlLT5oYXNUYWdOYW1lKGh0bWxUYWcpIHx8IGUtPmhhc1RhZ05h
bWUoYm9keVRhZykpKSkKLSAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoV2ViQ29y
ZTo6cGFnaW5hdGlvbk1vZGVGb3JSZW5kZXJTdHlsZShzdHlsZSksIHN0eWxlKTsKLQotICAgIC8v
IFRhYmxlIHJvd3MsIHNlY3Rpb25zIGFuZCB0aGUgdGFibGUgaXRzZWxmIHdpbGwgc3VwcG9ydCBv
dmVyZmxvdzpoaWRkZW4gYW5kIHdpbGwgaWdub3JlIHNjcm9sbC9hdXRvLgotICAgIC8vIEZJWE1F
OiBFdmVudHVhbGx5IHRhYmxlIHNlY3Rpb25zIHdpbGwgc3VwcG9ydCBhdXRvIGFuZCBzY3JvbGwu
Ci0gICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBJTkxJTkVfVEFCTEUKLSAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1df
R1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpIHsKLSAgICAgICAgaWYgKHN0
eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJ
RERFTikKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOwotICAgICAg
ICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1ko
KSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7
Ci0gICAgfQotCi0gICAgLy8gTWVudWxpc3RzIHNob3VsZCBoYXZlIHZpc2libGUgb3ZlcmZsb3cK
LSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpIHsKLSAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1koT1ZJU0lCTEUpOwotICAgIH0KLQotICAgIC8vIEN1bGwgb3V0IGFueSB1c2VsZXNzIGxheWVy
cyBhbmQgYWxzbyByZXBlYXQgcGF0dGVybnMgaW50byBhZGRpdGlvbmFsIGxheWVycy4KLSAgICBz
dHlsZS0+YWRqdXN0QmFja2dyb3VuZExheWVycygpOwotICAgIHN0eWxlLT5hZGp1c3RNYXNrTGF5
ZXJzKCk7Ci0KLSAgICAvLyBEbyB0aGUgc2FtZSBmb3IgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlv
bnMuCi0gICAgc3R5bGUtPmFkanVzdEFuaW1hdGlvbnMoKTsKLSAgICBzdHlsZS0+YWRqdXN0VHJh
bnNpdGlvbnMoKTsKLQotICAgIC8vIEltcG9ydGFudDogSW50cmluc2ljIG1hcmdpbnMgZ2V0IGFk
ZGVkIHRvIGNvbnRyb2xzIGJlZm9yZSB0aGUgdGhlbWUgaGFzIGFkanVzdGVkIHRoZSBzdHlsZSwg
c2luY2UgdGhlIHRoZW1lIHdpbGwKLSAgICAvLyBhbHRlciBmb250cyBhbmQgaGVpZ2h0cy93aWR0
aHMuCi0gICAgaWYgKGUgJiYgZS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSAmJiBzdHlsZS0+Zm9u
dFNpemUoKSA+PSAxMSkgewotICAgICAgICAvLyBEb24ndCBhcHBseSBpbnRyaW5zaWMgbWFyZ2lu
cyB0byBpbWFnZSBidXR0b25zLiBUaGUgZGVzaWduZXIga25vd3MgaG93IGJpZyB0aGUgaW1hZ2Vz
IGFyZSwKLSAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB0cmVhdCBhbGwgaW1hZ2UgYnV0dG9ucyBh
cyB0aG91Z2ggdGhleSB3ZXJlIGV4cGxpY2l0bHkgc2l6ZWQuCi0gICAgICAgIGlmICghZS0+aGFz
VGFnTmFtZShpbnB1dFRhZykgfHwgIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihlKS0+
aXNJbWFnZUJ1dHRvbigpKQotICAgICAgICAgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7
Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSB0aGVtZSBhbHNvIGhhdmUgYSBjcmFjayBhdCBhZGp1
c3RpbmcgdGhlIHN0eWxlLgotICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAg
ICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFkanVzdFN0eWxlKHRoaXMsIHN0eWxlLCBl
LCBtX3N0YXRlLmhhc1VBQXBwZWFyYW5jZSgpLCBtX3N0YXRlLmJvcmRlckRhdGEoKSwgbV9zdGF0
ZS5iYWNrZ3JvdW5kRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmRDb2xvcigpKTsKLQotICAgIC8v
IElmIHdlIGhhdmUgZmlyc3QtbGV0dGVyIHBzZXVkbyBzdHlsZSwgZG8gbm90IHNoYXJlIHRoaXMg
c3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNQc2V1ZG9TdHlsZShGSVJTVF9MRVRURVIpKQotICAg
ICAgICBzdHlsZS0+c2V0VW5pcXVlKCk7Ci0KLSAgICAvLyBGSVhNRTogd2hlbiBkcm9wcGluZyB0
aGUgLXdlYmtpdCBwcmVmaXggb24gdHJhbnNmb3JtLXN0eWxlLCB3ZSBzaG91bGQgYWxzbyBoYXZl
IG9wYWNpdHkgPCAxIGNhdXNlIGZsYXR0ZW5pbmcuCi0gICAgaWYgKHN0eWxlLT5wcmVzZXJ2ZXMz
RCgpICYmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUKLSAgICAgICAgfHwgc3R5bGUt
Pm92ZXJmbG93WSgpICE9IE9WSVNJQkxFCi0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKSkp
Ci0gICAgICAgIHN0eWxlLT5zZXRUcmFuc2Zvcm1TdHlsZTNEKFRyYW5zZm9ybVN0eWxlM0RGbGF0
KTsKLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgYmVoYXZlIGxpa2UgYmxvY2tzLiBNYXAgdGhl
aXIgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sgd2hlbiBtYXJrZWQgaW5saW5lLgotICAgIGlmIChl
ICYmIGUtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSAmJiBzdHlsZS0+ZGlzcGxheSgpID09IElOTElO
RSAmJiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+KGUpLT5zaG91bGREaXNwbGF5U2Vh
bWxlc3NseSgpKQotICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOwotCi0j
aWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZSAmJiBlLT5pc1NWR0VsZW1lbnQoKSkgewotICAgICAg
ICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvbWFza2luZy5odG1sI092ZXJmbG93
UHJvcGVydHkKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPU0NST0xMKQotICAg
ICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPSElEREVOKTsKLSAgICAgICAgZWxzZSBpZiAo
c3R5bGUtPm92ZXJmbG93WSgpID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJm
bG93WShPVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPU0NS
T0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPSElEREVOKTsKLSAgICAgICAg
ZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUt
PnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0KLSAgICAgICAgLy8gT25seSB0aGUgcm9vdCA8c3Zn
PiBlbGVtZW50IGluIGFuIFNWRyBkb2N1bWVudCBmcmFnbWVudCB0cmVlIGhvbm9ycyBjc3MgcG9z
aXRpb24KLSAgICAgICAgaWYgKCEoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3ZnVGFnKSAmJiBl
LT5wYXJlbnROb2RlKCkgJiYgIWUtPnBhcmVudE5vZGUoKS0+aXNTVkdFbGVtZW50KCkpKQotICAg
ICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFJlbmRlclN0eWxlOjppbml0aWFsUG9zaXRpb24o
KSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyU1ZHUm9vdCBoYW5kbGVzIHpvb21pbmcgZm9yIHRoZSB3
aG9sZSBTVkcgc3VidHJlZSwgc28gZm9yZWlnbk9iamVjdCBjb250ZW50IHNob3VsZAotICAgICAg
ICAvLyBub3QgYmUgc2NhbGVkIGFnYWluLgotICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZShTVkdO
YW1lczo6Zm9yZWlnbk9iamVjdFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RWZmZWN0aXZl
Wm9vbShSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLWJv
b2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50
KQotewotICAgIC8vIEZJWE1FIChCVUcgNzI0NzIpOiBXZSBkb24ndCBhZGQgQC13ZWJraXQtcmVn
aW9uIHJ1bGVzIG9mIHNjb3BlZCBzdHlsZSBzaGVldHMgZm9yIHRoZSBtb21lbnQsCi0gICAgLy8g
c28gYWxsIHJlZ2lvbiBydWxlcyBhcmUgZ2xvYmFsIGJ5IGRlZmF1bHQuIFZlcmlmeSB3aGV0aGVy
IHRoYXQgY2FuIHN0YW5kIG9yIG5lZWRzIGNoYW5naW5nLgotCi0gICAgdW5zaWduZWQgcnVsZXNT
aXplID0gbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVT
ZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kp
IHsKLSAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxl
Y3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsKLSAgICAgICAgaWYgKGNoZWNr
UmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKSB7
Ci0gICAgICAgIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2Vs
ZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLnVzZXJT
dHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkp
OwotICAgICAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy51c2VyU3R5
bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9u
RWxlbWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRm9yT3JpZW50YXRp
b25DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIEZvbnRPcmllbnRhdGlvbiBmb250
T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9u
OwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKHN0eWxlLCBmb250T3JpZW50YXRpb24s
IGdseXBoT3JpZW50YXRpb24pOwotCi0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
Y3JpcHRpb24gPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGZvbnREZXNjcmlw
dGlvbi5vcmllbnRhdGlvbigpID09IGZvbnRPcmllbnRhdGlvbiAmJiBmb250RGVzY3JpcHRpb24u
bm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09IGdseXBoT3JpZW50YXRpb24pCi0gICAgICAgIHJl
dHVybjsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oZm9udERlc2Ny
aXB0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlv
bihnbHlwaE9yaWVudGF0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRp
b24oZm9udE9yaWVudGF0aW9uKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0Zv
bnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6dXBkYXRlRm9udCgpCi17
Ci0gICAgaWYgKCFtX3N0YXRlLmZvbnREaXJ0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
aGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0
ZS5zdHlsZSgpOwotICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShzdHlsZSwgbV9zdGF0
ZS5wYXJlbnRTdHlsZSgpKTsKLSAgICBjaGVja0Zvclpvb21DaGFuZ2Uoc3R5bGUsIG1fc3RhdGUu
cGFyZW50U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShzdHlsZSk7Ci0g
ICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOwotICAgIG1fc3RhdGUuc2V0
Rm9udERpcnR5KGZhbHNlKTsKLX0KLQotUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgdW5zaWduZWQgcnVsZXNUb0lu
Y2x1ZGUpCi17Ci0gICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KGUsIE5PUFNF
VURPLCBydWxlc1RvSW5jbHVkZSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxl
UmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzZXVkb0lk
IHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKLXsKLSAgICBpZiAoIWUgfHwgIWUt
PmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7
Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUo
ZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOwotCi0gICAgTWF0Y2hSZXN1bHQgZHVtbXk7Ci0g
ICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMpIHsKLSAgICAgICAgLy8g
Rmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICAgICAg
bWF0Y2hVQVJ1bGVzKGR1bW15KTsKLQotICAgICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVl
dCBydWxlcy4KLSAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAg
ICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxl
cyk7Ci0gICAgfQotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxl
c1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAgICAgICBtX3N0YXRlLnNldFNhbWVP
cmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7Ci0KLSAg
ICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCi0gICAgICAgIG1hdGNo
QXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0KLSAg
ICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxzZSk7Ci0gICAgfQotCi0gICAgbV9z
dGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwotCi0gICAgcmV0
dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2
ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVy
Tm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJl
aGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCi17Ci0gICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLQotICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3Io
KSkgewotICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBh
bnkgcHNldWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9y
IG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgot
ICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQg
dG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9z
dFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgp
LT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlw
YXJ0U2VsZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6
VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxl
RGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgo
cnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFzZWxl
Y3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVj
a2VyRmFzdFBhdGgubWF0Y2hlcygpOwotICAgIH0KLQotICAgIC8vIFNsb3cgcGF0aC4KLSAgICBT
ZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUoKSk7
Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1
bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNp
dGVkTWF0Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxl
KCk7Ci0gICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAgIGNvbnRleHQucHNldWRvSWQgPSBz
dGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsKLSAgICBjb250ZXh0LnNjcm9sbGJh
ciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhcjsKLSAgICBjb250ZXh0LnNj
cm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0Owot
ICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OwotICAg
IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29u
dGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOwotICAg
IGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9J
ZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBk
eW5hbWljUHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxl
Y3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCi17Ci0gICAgaWYg
KCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX3N0
YXRlLm1vZGUoKSk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVj
dG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKSB7Ci0gICAgICAgIFNlbGVjdG9y
Q2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRleHQo
cywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxlZCk7
Ci0gICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAg
ICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwgaWdu
b3JlRHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNlbGVj
dG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0vLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1ZmYgb24gaG93IHRvIGFwcGx5IGEg
Y2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgotCi1MZW5ndGggU3R5bGVSZXNvbHZl
cjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlw
bGllcikKLXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29u
dmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8
IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJj
ZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgo
VW5kZWZpbmVkKTsKLX0KLQotTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0TGVu
Z3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKLXsKLSAgICByZXR1
cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVk
RmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lv
biB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0
eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Ci19Ci0KLXRl
bXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotdm9pZCBT
dHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJv
cGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRl
ZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCi17Ci0g
ICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdp
b24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsKLSAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUHJv
Y2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0KLSAgICB1bnNpZ25lZCBwcm9wZXJ0
eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNl
dDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5QXQoaSk7
Ci0gICAgICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50LmlzSW1wb3J0YW50KCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGluaGVyaXRlZE9ubHkgJiYgIWN1cnJlbnQu
aXNJbmhlcml0ZWQoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlz
IGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFwcGx5IGZ1cnRoZXIgbm9uLWluaGVy
aXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBhcyB0aGV5IG1pZ2h0IG92ZXJyaWRlIHRo
ZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvbid0IGFsbG93IGRl
Y2xhcmF0aW9ucyB3aXRoCi0gICAgICAgICAgICAvLyBleHBsaWNpdGx5IGluaGVyaXRlZCBwcm9w
ZXJ0aWVzIHRvIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIEFTU0VSVCghY3VycmVudC52YWx1ZSgp
LT5pc0luaGVyaXRlZFZhbHVlKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LSAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1cnJlbnQuaWQoKTsKLQotICAgICAg
ICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uICYm
ICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgICAgIGlm
IChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RDdWUgJiYgIVN0eWxl
UmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAocGFzcykgewotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgICAgICBjYXNlIFZhcmlhYmxlRGVmaW5pdGlvbnM6Ci0gICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlhYmxlIDwgZmlyc3RDU1NQcm9wZXJ0
eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9wZXJ0eSk7Ci0gICAgICAgICAgICBp
ZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKLSAgICAgICAgICAgICAgICBhcHBs
eVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgSGlnaFByaW9yaXR5UHJvcGVydGllczoKLSAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVydHkgPT0gQ1NTUHJvcGVydHlDb2xv
ciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKLSAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNvbG9yICsgMTgsIENTU196b29tX2lz
X2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENT
U1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpvb20gKyAxLCBDU1NfbGluZV9oZWln
aHRfaXNfYWZ0ZXJfem9vbSk7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAgICAg
ICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSNlbmRpZgotICAgICAgICAgICAgLy8gZ2l2ZSBzcGVjaWFsIHByaW9yaXR5IHRv
IGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0
eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5
KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIHdlIGFwcGx5
IGxpbmUtaGVpZ2h0IGxhdGVyCi0gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IExvd1ByaW9yaXR5UHJvcGVydGllczoKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA+IENTU1By
b3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQu
aWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tpZSk7Ci19Ci0KLXRlbXBsYXRlIDxT
dHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotdm9pZCBTdHlsZVJlc29s
dmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3Vs
dCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBp
bmhlcml0ZWRPbmx5KQotewotICAgIGlmIChzdGFydEluZGV4ID09IC0xKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmIChzdGF0ZS5zdHlsZSgp
LT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgewotICAgICAgICBmb3IgKGludCBpID0g
c3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBNYXRj
aGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllc1tpXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBtYXRjaGVk
UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOwotICAgICAgICAgICAgLy8gRklYTUU6IEl0IHdvdWxk
IGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRzIGJ1dCB0aGF0IHJlcXVpcmVzIGNo
YW5nZXMgaW4gbWFueSBwbGFjZXMuCi0gICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hMaW5r
KTsKLSAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUo
bGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hWaXNpdGVkKTsKLQotICAgICAg
ICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMu
Z2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRl
ZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRp
ZXMud2hpdGVsaXN0VHlwZSkpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnNldEFwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsKLSAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
Zm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgewotICAgICAgICBj
b25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5t
YXRjaGVkUHJvcGVydGllc1tpXTsKLSAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNo
ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tp
XSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVs
aXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOwotICAgIH0KLX0KLQot
dW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25z
dCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICAK
LSAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KHByb3BlcnRpZXMsIHNpemVvZihN
YXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0
eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJh
bmdlcyYgYikKLXsKLSAgICByZXR1cm4gYS5maXJzdFVBUnVsZSA9PSBiLmZpcnN0VUFSdWxlCi0g
ICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1bGUKLSAgICAgICAgJiYgYS5maXJz
dEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0QXV0aG9y
UnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCi0gICAgICAgICYmIGEuZmlyc3RVc2VyUnVsZSA9PSBi
LmZpcnN0VXNlclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VXNlclJ1bGUgPT0gYi5sYXN0VXNlclJ1
bGU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdl
cyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCi17Ci0gICAgcmV0dXJu
ICEoYSA9PSBiKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGll
cyYgYikKLXsKLSAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09IGIucHJvcGVydGllcyAmJiBhLmxp
bmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOwotfQotCi1ib29sIG9wZXJhdG9yIT0oY29u
c3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQotewotICAgIHJldHVybiAhKGEgPT0gYik7Ci19Ci0K
LWNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBTdHlsZVJl
c29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29u
c3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQotewotICAgIEFTU0VSVChoYXNoKTsKLQotICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlLmZpbmQoaGFzaCk7Ci0gICAgaWYgKGl0ID09IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZS5lbmQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0
ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsKLQotICAgIHNpemVfdCBzaXplID0gbWF0Y2hSZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlmIChzaXplICE9IGNhY2hlSXRlbS5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmIChtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXNbaV0pCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNhY2hlSXRlbS5yYW5nZXMgIT0gbWF0
Y2hSZXN1bHQucmFuZ2VzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gJmNhY2hlSXRl
bTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUo
Y29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUs
IHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKLXsKLSAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3
ZWVuU3dlZXBzID0gMTAwOwotICAgIGlmICgrK21fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0
aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0
d2VlblN3ZWVwcwotICAgICAgICAmJiAhbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVj
bGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYwOwotICAgICAgICBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hvdChtYXRjaGVkRGVjbGFyYXRpb25D
YWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7Ci0gICAgfQotCi0gICAgQVNTRVJUKGhhc2gpOwotICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRlbTsKLSAgICBjYWNoZUl0ZW0ubWF0
Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzKTsKLSAg
ICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFuZ2VzOwotICAgIC8vIE5vdGUgdGhh
dCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVyU3R5bGUgaW5zdGFuY2UuIEl0IG1h
eSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgotICAgIC8vIFRoZSBSZW5kZXJTdHlsZSBpbiB0aGUgY2Fj
aGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBzdWJzdHJ1Y3R1cmVzIGFuZCBuZXZl
ciB1c2VkIGFzLWlzLgotICAgIGNhY2hlSXRlbS5yZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpj
bG9uZShzdHlsZSk7Ci0gICAgY2FjaGVJdGVtLnBhcmVudFJlbmRlclN0eWxlID0gUmVuZGVyU3R5
bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYWRk
KGhhc2gsIGNhY2hlSXRlbSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6aW52YWxpZGF0ZU1h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQotewotICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5j
bGVhcigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXND
YWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNv
bnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAgICAvLyBGSVhNRTogQ1NTUHJvcGVy
dHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3aGVuIGFwcGx5aW5nIHRvIGRvY3Vt
ZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5aW5nIGJ5IGNhY2hpbmcuCi0gICAg
aWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgJiYg
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlxdWUoKSB8fCAoc3R5bGUt
PnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0eWxlLT51bmlxdWUoKSkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+em9vbSgpICE9IFJlbmRlclN0eWxlOjpp
bml0aWFsWm9vbSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT53cml0
aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIC8vIFRoZSBjYWNoZSBhc3N1bWVzIHN0YXRpYyBrbm93bGVkZ2Ug
YWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkLgotICAgIGlmIChwYXJlbnRTdHls
ZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBFbGVt
ZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOwotICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IG1hdGNoUmVzdWx0LmlzQ2FjaGVh
YmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkgOiAw
OwotICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0gICAgY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7Ci0gICAgaWYgKGNhY2hlSGFzaCAm
JiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNhY2hlSGFzaCwg
bWF0Y2hSZXN1bHQpKSkgewotICAgICAgICAvLyBXZSBjYW4gYnVpbGQgdXAgdGhlIHN0eWxlIGJ5
IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gYW4gZWFybGllciBzdHlsZSBv
YmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKLSAgICAgICAgLy8gc3R5bGUgZGVjbGFy
YXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0aGUgaW5oZXJpdGVkIHByb3BlcnRp
ZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBlbmQgb24gdGhlIAotICAgICAgICAv
LyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQgc2F2ZXMgbWVtb3J5IGJ5IHJldXNp
bmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y29w
eU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7Ci0gICAgICAg
IGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWREYXRhU2hhcmVkKGNhY2hlSXRlbS0+
cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkp
IHsKLSAgICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0dXMgPSBzdGF0ZS5zdHlsZSgpLT5p
bnNpZGVMaW5rKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgY2FjaGUgaXRlbSBwYXJlbnQgc3R5
bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwYXJl
bnQgc3R5bGUgdGhlbiB0aGUKLSAgICAgICAgICAgIC8vIHJlc3VsdGluZyBzdHlsZSB3aWxsIGJl
IGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG92ZXIgZnJv
bSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5o
ZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7Ci0KLSAgICAgICAgICAgIC8v
IFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmhlcml0
ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSByZXN0b3JlIGl0LgotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdHVzKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSB0cnVlOyAK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAvLyBGaXJzdCBhcHBseSBh
bGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5IGJlIHVzZWQgZHVyaW5nIGFwcGxp
Y2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxW
YXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVz
dWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxl
LCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFi
bGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25s
eSk7Ci0jZW5kaWYKLQotICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgbWF0Y2hlZCBydWxl
cyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhlIHJ1bGVzIGFuZCBhcHBseQotICAg
IC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwgaS5lLiwgdGhvc2UgcHJvcGVydGll
cyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgotICAgIC8vIFRoZSBvcmRlciBpcyAo
MSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikgaGlnaC1wcmlvcml0eSBpbXBvcnRh
bnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFudAotICAgIC8vIGFuZCAoNCkgbm9ybWFsIGltcG9y
dGFudC4KLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAs
IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVk
T25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hS
ZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUs
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0KLSAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hl
SXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSBzdGF0ZS5zdHlsZSgpLT5lZmZl
Y3RpdmVab29tKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0Rm9udERpcnR5KHRydWUpOwotICAgICAg
ICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiBvdXIgZm9u
dCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCi0gICAgdXBkYXRlRm9u
dCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVj
aWRlZCBvbiB0aGUgZm9udC1zaXplLgotICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkK
LSAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVI
ZWlnaHRWYWx1ZSgpKTsKLQotICAgIC8vIE1hbnkgcHJvcGVydGllcyBkZXBlbmQgb24gdGhlIGZv
bnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwgcHJvcGVydGllcy4KLSAgICBpZiAo
Y2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmZvbnREZXNjcmlwdGlvbigpICE9
IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQotICAgICAgICBhcHBseUluaGVyaXRl
ZE9ubHkgPSBmYWxzZTsKLQotICAgIC8vIE5vdyBkbyB0aGUgbm9ybWFsIHByaW9yaXR5IFVBIHBy
b3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRp
ZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBt
YXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICAK
LSAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3JvdW5kIHNvIHRoYXQgd2UgY2FuIGV4
YW1pbmUgdGhlbSBsYXRlci4KLSAgICBzdGF0ZS5jYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsK
LSAgICAKLSAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQgdXNlciBub3JtYWwgcHJpb3JpdHkg
cHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHByb3BlcnRpZXMuCi0gICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxz
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAxLCBtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1
bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlv
cml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmly
c3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9u
bHkpOwotICAgCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0
aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0gICAgCi0gICAgQVNTRVJU
KCFzdGF0ZS5mb250RGlydHkoKSk7Ci0gICAgCi0gICAgaWYgKGNhY2hlSXRlbSB8fCAhY2FjaGVI
YXNoKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0
eWxlKCkpKQotICAgICAgICByZXR1cm47Ci0gICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hl
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1
bHQpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBTdHls
ZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCi17Ci0gICAgcmV0dXJuIHIx
LT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5
KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFn
ZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBpZiAoIXJ1bGVzKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7Ci0g
ICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVs
ZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKLSAgICBpZiAobWF0Y2hl
ZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN0ZDo6c3RhYmxl
X3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBj
b21wYXJlUGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVk
UGFnZVJ1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1
bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Ci19Ci0KLXN0YXRpYyBib29s
IGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3Is
IGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFt
ZSkKLXsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3Rvcjsg
Y29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgewotICAgICAg
ICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKLSAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgp
LmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBs
b2NhbE5hbWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICB9Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNv
bXBvbmVudC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBz
ZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQot
ICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFn
ZSAmJiAhaXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNo
ZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3R5
bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAgICAgIGlmICghY2hlY2tQYWdlU2Vs
ZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdl
LCBwYWdlTmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBJZiB0aGUg
cnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCi0gICAgICAg
IGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7
Ci0gICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0
IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Ci0g
ICAgfQotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkg
Y29uc3QKLXsKLSAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9IGZhbHNlOwotICAgIGlmICghbV9z
dGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAg
ICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlz
Rmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6Omlz
Rmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IEluIGNhc2Ug
b2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJl
IHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBhZ2VJbmRleCk7Ci19Ci0KLVN0cmluZyBT
dHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAotewotICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KLSAg
ICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvU3R5
bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUp
Ci17Ci0gICAgaW5pdEVsZW1lbnQoMCk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIDAsIHN0eWxlKTsKLSAgICBtX3N0YXRlLnNldFN0eWxlKHN0eWxlKTsKLSAg
ICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZhbHVlKTsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwg
Q1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0
eShpZCwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29s
b3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclRvcENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21D
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91
dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dFN0cm9rZUNvbG9yOgotICAgIC8vIEFsc28gYWxsb3cgc2hvcnRoYW5kcyBzbyB0aGF0IGlu
aGVyaXQvaW5pdGlhbCBzdGlsbCB3b3JrLgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGU6Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBj
YXNlIENTU1Byb3BlcnR5RmlsbDoKLSAgICBjYXNlIENTU1Byb3BlcnR5U3Ryb2tlOgotI2VuZGlm
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAg
IH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cv
Y3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxlLXJ1bGUKLS8vIEZJWE1FOiBhZGQgaW5j
cmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9uIHN0eWxpbmcgcHJvcGVydGllcy4KLWlu
bGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1By
b3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi1pbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQotewot
ICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9u
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25YOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5Rm9udDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWln
aHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eU9wYWNpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZU9mZnNldDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJTdHlsZToKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotLy8gU1ZHIGhhbmRsZXMg
em9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFyZWQgdG8gQ1NTLiBUaGUgd2hvbGUgZG9j
dW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKLS8vIG9mIGVhY2ggaW5kaXZpZHVhbCBsZW5ndGggdmFs
dWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENTU1ByaW1pdGl2ZVZhbHVlOjpjb21wdXRl
TGVuZ3RoKigpCi0vLyBtdWx0aXBsaWVzIGVhY2ggcmVzb2x2ZWQgbGVuZ3RoIHdpdGggdGhlIHpv
b20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVlZCB0byBkaXNhYmxlIHRoYXQuCi0vLyBU
aG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvdXRlcm1vc3QgPHN2
Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy4uLikKLS8vIG5lZWQgdG8g
cmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0aGUgcGFyZW50IGNsYXNzIG9mIFJlbmRl
clNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCi0vLyB3aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRp
bmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZvciBTVkcgdGhlc2UgdmFsdWVzIHdvdWxk
IG5ldmVyIHNjYWxlLAotLy8gaWYgd2UnZCBwYXNzIGEgMS4wIHpvb20gZmFjdG9yIGV2ZXJ5aHdl
cmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9yIG9mIDEuMCBmb3Igc3BlY2lmaWMKLS8v
IHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQgdG8gc2NhbGUgd2l0aGluIGEgem9vbWVk
IFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2luZy9mb250LXNpemUpLgotYm9vbCBTdHls
ZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQotewotICAgIHJldHVybiBtX3N0YXRlLmVsZW1l
bnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCk7Ci19Ci0KLXN0YXRpYyBi
b29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZh
bHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIExlbmd0aCYgd29ya2luZ0xl
bmd0aCkKLXsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVX
ZWJraXRNaW5Db250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdMZW5ndGggPSBMZW5ndGgoTWluQ29u
dGVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1heENvbnRlbnQpIHsKLSAgICAgICAg
d29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgd29ya2luZ0xlbmd0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9M
ZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgVmlld3Bv
cnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBz
dGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7
Ci0gICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmluZWQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICB3b3Jr
aW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVlLT5pc1F1aXJrVmFsdWUoKSk7Ci0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTWluTWF4KENT
U1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3Rh
dGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1NpemUpCi17Ci0gICAgUGFpciogbWluTWF4
VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdldFBhaXJWYWx1ZSgpOwotICAgIGlmICgh
bWluTWF4VHJhY2tCcmVhZHRoKSB7Ci0gICAgICAgIExlbmd0aCB3b3JraW5nTGVuZ3RoOwotICAg
ICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLCB3
b3JraW5nTGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cmFj
a1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRoOwotICAgIExlbmd0aCBtYXhUcmFja0Jy
ZWFkdGg7Ci0gICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0
aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0aCkgfHwgIWNyZWF0ZUdyaWRUcmFja0Jy
ZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQoKSwgc3RhdGUsIG1heFRyYWNrQnJlYWR0
aCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRyYWNrU2l6ZS5zZXRNaW5NYXgobWlu
VHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1z
dGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChDU1NWYWx1ZSogdmFsdWUsIGNvbnN0IFN0
eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1Np
emVzKQotewotICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01v
cmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFs
dWUoKTsKLSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBHcmlkVHJhY2tTaXplIHRyYWNrU2l6ZTsK
LSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5NYXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJhY2tTaXplKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICB0cmFja1NpemVzLmFwcGVuZCh0cmFja1NpemUpOwotICAg
IH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTGlz
dChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcywgY29u
c3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQotewotICAgIC8vIEhhbmRsZSAnbm9uZScu
Ci0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZU5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0ZUdyaWRUcmFja0dyb3VwKHZh
bHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Ci19Ci0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFBv
c2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0aW9uJiBwb3NpdGlvbikKLXsKLSAgICAv
LyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVnZXI+IHwgJ2F1dG8nCi0gICAgaWYgKCF2
YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHZhbHVlKTsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0g
Q1NTVmFsdWVBdXRvKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEFTU0VSVF9XSVRIX1NF
Q1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKTsKLSAgICBwb3Np
dGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi1zdGF0aWMg
Ym9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZh
bHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHBy
aW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0g
ICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKLSAg
ICB9Ci0KLSAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRpb25WYWx1ZSgpKQotICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFsdWUpLT5oYXNWYXJpYWJsZVJlZmVyZW5j
ZSgpOwotCi0gICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1Jl
ZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4o
dmFsdWUpOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZGlyZWN0aW9uID0gcmVmbGVjdFZh
bHVlLT5kaXJlY3Rpb24oKTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIG9mZnNldCA9IHJl
ZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7Ci0gICAgICAgIENTU1ZhbHVlKiBtYXNrID0gcmVmbGVjdFZh
bHVlLT5tYXNrKCk7Ci0gICAgICAgIHJldHVybiAoZGlyZWN0aW9uICYmIGhhc1ZhcmlhYmxlUmVm
ZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uob2Zm
c2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UobWFzaykpOwotICAgIH0KLQot
ICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5h
ZHZhbmNlKCkpIHsKLSAgICAgICAgaWYgKGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGkudmFsdWUoKSkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0eUlEIGlk
LCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5n
PiA+JiBrbm93bkV4cHJlc3Npb25zKQotewotICAgIHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBT
dHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJpYWxpemVSZXNvbHZpbmdWYXJpYWJsZXMo
Km1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsKLQotICAgIGlmIChrbm93bkV4cHJlc3Np
b25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQotICAgICAgICByZXR1cm47IC8vIGN5Y2xlIGRldGVj
dGVkLgotCi0gICAga25vd25FeHByZXNzaW9ucy5hcHBlbmQoZXhwcmVzc2lvbik7Ci0KLSAgICAv
LyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0byByZS1wYXJzZSBmcm9tIHN0cmluZ3Ms
IGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0aW9uIGxpdmVzIGluc2lkZSB0aGUgcGFy
c2VyIHNvIHdlIGRvIGl0IHRoZXJlLgotICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiByZXN1
bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKTsKLSAgICBpZiAoIUNTU1BhcnNlcjo6
cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBleHByZXNzaW9uLnNlY29uZCwgZmFsc2Us
IGRvY3VtZW50KCkpKQotICAgICAgICByZXR1cm47IC8vIGV4cHJlc3Npb24gZmFpbGVkIHRvIHBh
cnNlLgotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNldC0+cHJvcGVydHlD
b3VudCgpOyBpKyspIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVu
Y2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5QXQoaSk7Ci0gICAgICAgIGlmIChwcm9w
ZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uo
cHJvcGVydHkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXNvbHZlVmFyaWFibGVzKHByb3BlcnR5
LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhwcmVzc2lvbnMpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVl
KCkpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVy
dHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQotewotI2lmIEVOQUJMRShDU1Nf
VkFSSUFCTEVTKQotICAgIGlmIChpZCAhPSBDU1NQcm9wZXJ0eVZhcmlhYmxlICYmIGhhc1Zhcmlh
YmxlUmVmZXJlbmNlKHZhbHVlKSkgewotICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3Bl
cnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25zOwotICAgICAgICByZXNvbHZlVmFyaWFi
bGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0jZW5kaWYKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgYm9vbCBpc0luaGVy
aXQgPSBzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUoKTsKLSAg
ICBib29sIGlzSW5pdGlhbCA9IHZhbHVlLT5pc0luaXRpYWxWYWx1ZSgpIHx8ICghc3RhdGUucGFy
ZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpOwotCi0gICAgQVNTRVJUKCFp
c0luaGVyaXQgfHwgIWlzSW5pdGlhbCk7IC8vIGlzSW5oZXJpdCAtPiAhaXNJbml0aWFsICYmIGlz
SW5pdGlhbCAtPiAhaXNJbmhlcml0Ci0gICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgKHN0YXRlLnBh
cmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKSk7IC8vIGlzSW5oZXJpdCAtPiAoc3Rh
dGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpCi0KLSAgICBpZiAoIXN0YXRl
LmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpICYmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRv
VmlzaXRlZExpbmtTdHlsZSgpIHx8ICFpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShpZCkpKSB7
Ci0gICAgICAgIC8vIExpbWl0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8g
b25seSB0aGUgb25lcyBob25vcmVkIGJ5IDp2aXNpdGVkLgotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKGlzSW5oZXJpdCAmJiAhc3RhdGUucGFyZW50U3R5bGUoKS0+aGFzRXhwbGlj
aXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSAmJiAhQ1NTUHJvcGVydHk6OmlzSW5oZXJpdGVkUHJv
cGVydHkoaWQpKQotICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRIYXNFeHBsaWNpdGx5
SW5oZXJpdGVkUHJvcGVydGllcygpOwotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAg
aWYgKGlkID09IENTU1Byb3BlcnR5VmFyaWFibGUpIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfU0VD
VVJJVFlfSU1QTElDQVRJT04odmFsdWUtPmlzVmFyaWFibGVWYWx1ZSgpKTsKLSAgICAgICAgQ1NT
VmFyaWFibGVWYWx1ZSogdmFyaWFibGUgPSBzdGF0aWNfY2FzdDxDU1NWYXJpYWJsZVZhbHVlKj4o
dmFsdWUpOwotICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsKLSAg
ICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+dmFsdWUoKS5pc0VtcHR5KCkpOwotICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRWYXJpYWJsZSh2YXJpYWJsZS0+bmFtZSgpLCB2YXJpYWJsZS0+dmFsdWUo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIENoZWNrIGxvb2t1
cCB0YWJsZSBmb3IgaW1wbGVtZW50YXRpb25zIGFuZCB1c2Ugd2hlbiBhdmFpbGFibGUuCi0gICAg
Y29uc3QgUHJvcGVydHlIYW5kbGVyJiBoYW5kbGVyID0gbV9zdHlsZUJ1aWxkZXIucHJvcGVydHlI
YW5kbGVyKGlkKTsKLSAgICBpZiAoaGFuZGxlci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgaWYgKGlz
SW5oZXJpdCkKLSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbmhlcml0VmFsdWUoaWQsIHRoaXMp
OwotICAgICAgICBlbHNlIGlmIChpc0luaXRpYWwpCi0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5
SW5pdGlhbFZhbHVlKGlkLCB0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGFuZGxl
ci5hcHBseVZhbHVlKGlkLCB0aGlzLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSB2YWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSkgOiAwOwot
Ci0gICAgZmxvYXQgem9vbUZhY3RvciA9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsK
LQotICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGxpc3QgdGhhdCBtYXBzIHRoZSBDU1MgcHJvcGVy
dGllcyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZnJvbnQtZW5kCi0gICAgLy8gUmVuZGVyU3R5
bGUgdmFsdWVzLiBTaG9ydGhhbmRzIChlLmcuIGJvcmRlciwgYmFja2dyb3VuZCkgb2NjdXIgaW4g
dGhpcyBsaXN0IGFzIHdlbGwgYW5kCi0gICAgLy8gYXJlIG9ubHkgaGl0IHdoZW4gbWFwcGluZyAi
aW5oZXJpdCIgb3IgImluaXRpYWwiIGludG8gZnJvbnQtZW5kIHZhbHVlcy4KLSAgICBzd2l0Y2gg
KGlkKSB7Ci0gICAgLy8gbGlzdHMKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoKLSAgICAg
ICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQotICAgICAgICB7Ci0g
ICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBpbmhl
cml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlzCi0gICAgICAgICAgICAvLyBub3Rl
IGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBiZSBzdXBw
b3J0ZWQuCi0KLSAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBib29sIGRpZFNldCA9IGZhbHNl
OwotICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFz
TW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0g
aS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJhdG9yVmFs
dWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZhbHVlKCkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxl
R2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4oaXRl
bSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0KTsKLSAg
ICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8
Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICAgICAg
ICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJvbVZhbHVl
KENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KGl0ZW0p
KSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNlbmRpZgot
ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlVmFs
dWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNh
Y2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENT
U0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNl
dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0
ZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkgewot
ICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRlbnRWYWx1
ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAg
IGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUt
PmlzQXR0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBuYW1lc3Bh
Y2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICAgICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRV
bmlxdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51bGxBdG9t
LCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5lbGVtZW50
KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmltcGwoKSwg
ZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGFm
ZmVjdHMgdGhlIHN0eWxlCi0gICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRDb3VudGVy
VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0eWxlVHlw
ZSA9IE5vbmVMaXN0U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5bGVJZGVu
dCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlzdFN0eWxl
SWRlbnQgLSBDU1NWYWx1ZURpc2MpOwotICAgICAgICAgICAgICAgICAgICBPd25QdHI8Q291bnRl
ckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291bnRlclZh
bHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2VwYXJhdG9y
KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb3Vu
dGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gg
KGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlT3BlblF1b3RlOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAg
ZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5RdW90ZToK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fT1BF
Tl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KLSAgICAgICAgICAgICAg
ICAgICAgICAgIHsgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaWRTZXQpCi0gICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgotICAgICAgICBpZiAoaXNJbmhlcml0
KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFyZW50U3R5
bGUoKS0+cXVvdGVzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAg
IGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3Rlcygw
KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUtPmlz
VmFsdWVMaXN0KCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19j
YXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKLSAgICAgICAgICAgIFJlZlB0cjxRdW90ZXNEYXRh
PiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIENT
U1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAg
ICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNvIHRoaXMg
aXMgc2FmZS4KLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+aXRlbShp
ICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQpCi0gICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FU
SU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9X
SVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKLSAg
ICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmlu
ZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0
U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3RkOjptYWtl
X3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseTog
ewotICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlkcwotICAgICAgICBpZiAoaXNJbmhl
cml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2NyaXB0aW9u
ID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBG
b250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2Ny
aXB0aW9uKCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShw
YXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKLSAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkp
OwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChwYXJlbnRG
b250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOwotICAgICAgICAgICAgc2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRp
b24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KTsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFjY291bnQg
Zm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKLSAgICAgICAgICAg
IC8vIHRvIG5vbi1tb25vc3BhY2UuCi0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtl
eXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKLSAg
ICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5
d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29y
ZFNpemUoKSAtIDEsIGZhbHNlKSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2Vu
ZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOwotICAgICAgICAgICAgaWYg
KCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkp
OwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVl
TGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9u
dERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAg
IEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCk7
Ci0gICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAwOwotCi0gICAgICAgIC8vIEJlZm9y
ZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQgcmVzZXQg
dGhlIGdlbmVyaWMgZmFtaWx5LgotICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhlZERlZmF1
bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKLSAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWls
eSk7Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFz
TW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBpLnZh
bHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250
ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotICAgICAg
ICAgICAgQXRvbWljU3RyaW5nIGZhY2U7Ci0gICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3Mg
PSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0
cmluZygpKQotICAgICAgICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0cmluZ1Zh
bHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncykgewotICAgICAgICAgICAgICAg
IHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVdlYmtpdEJvZHk6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXR0aW5n
cy0+c3RhbmRhcmRGb250RmFtaWx5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IHNlcmlmRmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNTZXJpZjoK
LSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKLSAgICAgICAgICAg
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9u
OjpTYW5zU2VyaWZGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9
IGN1cnNpdmVGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRH
ZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50YXN5Ogot
ICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKLSAgICAgICAgICAgICAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpG
YW50YXN5RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG1v
bm9zcGFjZUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdl
bmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0UGlj
dG9ncmFwaDoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1pbHk7Ci0g
ICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnRE
ZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFm
YWNlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkgewotICAg
ICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCi0gICAgICAg
ICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKLSAgICAgICAgICAgICAg
ICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGluaGVyaXRl
ZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9
ICZmaXJzdEZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElz
U3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZvbnREZXNj
cmlwdGlvbjo6Tm9GYW1pbHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFyZWRGb250
RmFtaWx5OjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5zZXRGYW1p
bHkoZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZhbWlseShu
ZXdGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFtaWx5Lmdl
dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFsbCBuZXcg
Zm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKLSAgICAgICAgLy8gSWYgY3VyckZhbWlseSBp
cyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMgZGVzY3Jp
cHRpb24uCi0gICAgICAgIGlmIChjdXJyRmFtaWx5KSB7Ci0gICAgICAgICAgICBpZiAoZm9udERl
c2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVs
dFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKLSAgICAgICAgICAgICAg
ICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVu
dCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEs
ICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOwotCi0gICAgICAgICAgICBzZXRGb250
RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47
Ci0gICAgfQotLy8gc2hvcnRoYW5kIHByb3BlcnRpZXMKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZDoKLSAgICAgICAgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+Y2xlYXJCYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNJbmhl
cml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0QmFja2dyb3VuZExheWVy
cygqc3RhdGUucGFyZW50U3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpKTsKLSAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldEJhY2tncm91bmRDb2xvcihzdGF0ZS5wYXJlbnRTdHlsZSgpLT5i
YWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrOgotICAgICAgICBpZiAoaXNJbml0aWFsKQotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJNYXNrTGF5ZXJzKCk7Ci0gICAgICAgIGVsc2UgaWYgKGlz
SW5oZXJpdCkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRNYXNrTGF5ZXJzKCpz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5tYXNrTGF5ZXJzKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnQ6Ci0gICAgICAgIGlmIChpc0luaGVyaXQpIHsKLSAgICAgICAg
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgp
LT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVI
ZWlnaHQoc3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lmaWVkTGluZUhlaWdodCgpKTsKLSAgICAg
ICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICAgICAgICAgIHNldEZvbnRE
ZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlh
bCkgewotICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygp
OwotICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUg
cmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5k
IHRodXMgaGF2ZSBzZXR0aW5ncwotICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdz
KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQo
KSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0KLSAgICAgICAg
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgICAgICAgICBSZW5kZXJU
aGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCksIGZvbnREZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIERvdWJsZS1jaGVjayBhbmQg
c2VlIGlmIHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElmIG5vdCwgZG9uJ3QgYm90aGVyIHVwZGF0
aW5nIHRoZSBmb250LgotICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRl
U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZW5kZXJpbmcgbW9k
ZSBhbmQgcHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1cGRhdGVkLgotICAgICAgICAgICAgICAg
IFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAg
ICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0
aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNl
dHRpbmdzCi0gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdN
b2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICAgICAgICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAh
c2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotCi0gICAgICAgICAg
ICAgICAgLy8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4KLSAgICAgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KGRvY3VtZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6
ZSgpLCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpLCB1c2VTVkdab29tUnVsZXMoKSkp
OwotICAgICAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5pc0ZvbnRWYWx1ZSgpKSB7
Ci0gICAgICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBzdGF0aWNfY2FzdDxGb250VmFsdWUqPih2
YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIWZvbnQtPnN0eWxlIHx8ICFmb250LT52YXJpYW50IHx8
ICFmb250LT53ZWlnaHQKLSAgICAgICAgICAgICAgICB8fCAhZm9udC0+c2l6ZSB8fCAhZm9udC0+
bGluZUhlaWdodCB8fCAhZm9udC0+ZmFtaWx5KQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U3R5bGUsIGZvbnQtPnN0eWxl
LmdldCgpKTsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250VmFyaWFu
dCwgZm9udC0+dmFyaWFudC5nZXQoKSk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1By
b3BlcnR5Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0LmdldCgpKTsKLSAgICAgICAgICAgIC8vIFRo
ZSBwcmV2aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIgZm9udCBidXQgdGhleSBkb24ndCB0
cnkgdG8gcmVhZCB0aGUgZm9udCdzCi0gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGJhY2ssIHdo
aWNoIGlzIHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXplIGlzIHVzaW5nIHRoZSAnZXgnIHVuaXQs
IGl0IHdpbGwKLSAgICAgICAgICAgIC8vIG5lZWQgcXVlcnkgdGhlIGRpcnRpZWQgZm9udCdzIHgt
aGVpZ2h0IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8gYmUgc2FmZSBpbiB0aGlzCi0gICAg
ICAgICAgICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0aGUgZm9udCBub3cuCi0gICAgICAg
ICAgICB1cGRhdGVGb250KCk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5
Rm9udFNpemUsIGZvbnQtPnNpemUuZ2V0KCkpOwotCi0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5l
SGVpZ2h0VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQoKSk7Ci0KLSAgICAgICAgICAgIGFwcGx5
UHJvcGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmb250LT5mYW1pbHkuZ2V0KCkpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIENTUzMgUHJvcGVydGllcwotICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaGFkb3c6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdzogewotICAgICAgICBpZiAoaXNJ
bmhlcml0KSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQot
ICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHN0YXRl
LnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpz
dGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkpKSA6IG51bGxwdHIpOwotICAgICAgICAg
ICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgp
LT5ib3hTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5ib3hTaGFkb3coKSkpIDogbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlz
SW5pdGlhbCB8fCBwcmltaXRpdmVWYWx1ZSkgLy8gaW5pdGlhbCB8IG5vbmUKLSAgICAgICAgICAg
IHJldHVybiBpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cgPyBzdGF0ZS5zdHlsZSgpLT5zZXRU
ZXh0U2hhZG93KG51bGxwdHIpIDogc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KG51bGxwdHIp
OwotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFz
TW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9
IGkudmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkp
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRl
bSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4oY3VyclZhbHVlKTsKLSAgICAgICAgICAgIGlu
dCB4ID0gaXRlbS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBpbnQgeSA9IGl0ZW0t
PnktPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8g
aXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAgICAgICAgICAgaW50IHNwcmVhZCA9
IGl0ZW0tPnNwcmVhZCA/IGl0ZW0tPnNwcmVhZC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAgICAg
ICAgICAgU2hhZG93U3R5bGUgc2hhZG93U3R5bGUgPSBpdGVtLT5zdHlsZSAmJiBpdGVtLT5zdHls
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluc2V0ID8gSW5zZXQgOiBOb3JtYWw7Ci0gICAgICAg
ICAgICBDb2xvciBjb2xvcjsKLSAgICAgICAgICAgIGlmIChpdGVtLT5jb2xvcikKLSAgICAgICAg
ICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgp
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLnN0eWxlKCkpCi0gICAgICAgICAgICAgICAg
Y29sb3IgPSBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotCi0gICAgICAgICAgICBPd25QdHI8U2hh
ZG93RGF0YT4gc2hhZG93RGF0YSA9IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKEludFBvaW50KHgs
IHkpLCBibHVyLCBzcHJlYWQsIHNoYWRvd1N0eWxlLCBpZCA9PSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eFNoYWRvdywgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQpKTsK
LSAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cpCi0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwg
aS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBl
bnRyeQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dEJveFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRo
ZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICB9Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoYm94UmVmbGVjdCwgQm94UmVmbGVj
dCkKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRCb3hSZWZsZWN0KFJlbmRlclN0eWxlOjppbml0aWFsQm94UmVmbGVjdCgpKTsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzUmVm
bGVjdFZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ1NTUmVmbGVjdFZh
bHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7
Ci0gICAgICAgIFJlZlB0cjxTdHlsZVJlZmxlY3Rpb24+IHJlZmxlY3Rpb24gPSBTdHlsZVJlZmxl
Y3Rpb246OmNyZWF0ZSgpOwotICAgICAgICByZWZsZWN0aW9uLT5zZXREaXJlY3Rpb24oKnJlZmxl
Y3RWYWx1ZS0+ZGlyZWN0aW9uKCkpOwotICAgICAgICBpZiAocmVmbGVjdFZhbHVlLT5vZmZzZXQo
KSkKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE9mZnNldChyZWZsZWN0VmFsdWUtPm9mZnNl
dCgpLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252
ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikpOwotICAgICAgICBOaW5lUGllY2VJbWFnZSBtYXNr
OwotICAgICAgICBtYXNrLnNldE1hc2tEZWZhdWx0cygpOwotICAgICAgICBtX3N0eWxlTWFwLm1h
cE5pbmVQaWVjZUltYWdlKGlkLCByZWZsZWN0VmFsdWUtPm1hc2soKSwgbWFzayk7Ci0gICAgICAg
IHJlZmxlY3Rpb24tPnNldE1hc2sobWFzayk7Ci0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
Qm94UmVmbGVjdChyZWZsZWN0aW9uLnJlbGVhc2UoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNyYzogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVs
ZXMuCi0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZVJhbmdlOiAv
LyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KLSAgICAgICAgcmV0dXJuOwotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgotICAgICAgICBpZiAoaXNJbmhlcml0KSB7
Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb2x1bW5SdWxlQ29sb3Ioc3RhdGUucGFy
ZW50U3R5bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkuaXNWYWxpZCgpID8gc3RhdGUucGFyZW50U3R5
bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkgOiBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5jb2xvcigpKTsK
LSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbHVtblJ1bGVTdHlsZShzdGF0ZS5wYXJl
bnRTdHlsZSgpLT5jb2x1bW5SdWxlU3R5bGUoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRDb2x1bW5SdWxlV2lkdGgoc3RhdGUucGFyZW50U3R5bGUoKS0+Y29sdW1uUnVsZVdpZHRo
KCkpOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnJlc2V0Q29sdW1uUnVsZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcnF1ZWU6Ci0gICAgICAgIGlmICghaXNJbmhlcml0KQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlRGlyZWN0aW9uKHN0
YXRlLnBhcmVudFN0eWxlKCktPm1hcnF1ZWVEaXJlY3Rpb24oKSk7Ci0gICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoc3RhdGUucGFyZW50U3R5bGUoKS0+bWFycXVlZUlu
Y3JlbWVudCgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHN0YXRl
LnBhcmVudFN0eWxlKCktPm1hcnF1ZWVTcGVlZCgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZUxvb3BDb3VudChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5tYXJxdWVlTG9vcENvdW50
KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlQmVoYXZpb3Ioc3RhdGUucGFy
ZW50U3R5bGUoKS0+bWFycXVlZUJlaGF2aW9yKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0aW9uOiB7Ci0gICAgICAgIEhBTkRMRV9J
TkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291bnQsIE1hcnF1ZWVMb29wQ291bnQpCi0g
ICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluZmluaXRlKQotICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudCgtMSk7IC8vIC0xIG1l
YW5zIHJlcGVhdCBmb3JldmVyLgotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNO
dW1iZXIoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQo
cHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3BlZWQ6IHsKLSAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVkLCBNYXJxdWVlU3BlZWQpCi0gICAgICAg
IGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChp
bnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgc3dp
dGNoIChpZGVudCkgewotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNsb3c6Ci0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDUwMCk7IC8vIDUwMCBtc2VjLgot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoK
LSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoODUpOyAvLyA4
NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBTdXBlciBmYXN0LgotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZh
bHVlLT5pc1RpbWUoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVl
ZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50LCBDU1NQcmltaXRpdmVWYWx1ZTo6TWls
bGlzZWNvbmRzPigpKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVy
KCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVJbmNy
ZW1lbnQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUluY3Jl
bWVudCwgTWFycXVlZUluY3JlbWVudCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0g
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMSwgRml4ZWQpKTsgLy8gMXB4LgotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKLSAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCg2
LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxhcmdlOgotICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDM2LCBGaXhlZCkpOyAvLyAz
NnB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVMZW5ndGggPSBjb252ZXJ0VG9JbnRMZW5n
dGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KSk7Ci0gICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5ndGguaXNVbmRlZmluZWQoKSkKLSAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KG1hcnF1ZWVMZW5n
dGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdExvY2FsZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChs
b2NhbGUsIExvY2FsZSk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZUF1dG8pCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUobnVsbEF0b20p
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUocHJp
bWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwotICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNl
bGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkpOwotICAgICAgICBzZXRGb250RGVzY3Jp
cHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dFNpemVBZGp1c3Q6IHsKLSAgICAgICAgSEFORExFX0lOSEVS
SVRfQU5EX0lOSVRJQUwodGV4dFNpemVBZGp1c3QsIFRleHRTaXplQWRqdXN0KQotICAgICAgICBp
ZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgc2V0VGV4dFNpemVBZGp1c3QocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNp
ZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdERh
c2hib2FyZFJlZ2lvbjoKLSAgICB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lvbnMpCi0gICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJTdHlsZTo6bm9uZURhc2hib2FyZFJlZ2lv
bnMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEYXNoYm9h
cmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVlLT5nZXREYXNoYm9hcmRSZWdpb25WYWx1
ZSgpOwotICAgICAgICBpZiAoIXJlZ2lvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9uOwotICAgICAgICB3aGlsZSAocmVnaW9u
KSB7Ci0gICAgICAgICAgICBMZW5ndGggdG9wID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+
dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAg
ICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5yaWdodCgpLCBz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVu
Z3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPmJvdHRvbSgpLCBzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVuZ3RoIGxl
ZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5sZWZ0KCksIHN0YXRlLnN0eWxlKCksIHN0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmICh0b3AuaXNVbmRlZmlu
ZWQoKSkKLSAgICAgICAgICAgICAgICB0b3AgPSBMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChy
aWdodC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJpZ2h0ID0gTGVuZ3RoKCk7Ci0g
ICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgYm90
dG9tID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVmdC5pc1VuZGVmaW5lZCgpKQotICAg
ICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKHJlZ2lvbi0+
bV9pc0NpcmNsZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRS
ZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3As
IHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7Ci0g
ICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNSZWN0YW5nbGUpCi0gICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9u
OjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBy
ZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwotICAgICAgICAgICAgcmVnaW9uID0gcmVn
aW9uLT5tX25leHQuZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5kb2N1bWVudCgp
LT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0jZW5kaWYKLSNpZiBFTkFCTEUoRFJBR0dBQkxFX1JFR0lPTikKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QXBwUmVnaW9uOiB7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUgfHwgIXBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25Nb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJ
ZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJsZVJlZ2lvbkRyYWcgOiBEcmFnZ2FibGVS
ZWdpb25Ob0RyYWcpOwotICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRS
ZWdpb25zKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDogewotICAgICAgICBIQU5ETEVfSU5IRVJJ
VF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRleHRTdHJva2VXaWR0aCkKLSAgICAgICAg
ZmxvYXQgd2lkdGggPSAwOwotICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpKSB7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGluOgotICAgICAgICBjYXNlIENTU1ZhbHVl
TWVkaXVtOgotICAgICAgICBjYXNlIENTU1ZhbHVlVGhpY2s6IHsKLSAgICAgICAgICAgIGRvdWJs
ZSByZXN1bHQgPSAxLjAgLyA0ODsKLSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0
SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKLSAgICAgICAgICAgICAgICByZXN1bHQgKj0gMzsK
LSAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlVGhpY2spCi0gICAgICAgICAgICAgICAgcmVzdWx0ICo9IDU7Ci0gICAgICAgICAgICB3aWR0
aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVzdWx0LCBDU1NQcmltaXRpdmVWYWx1ZTo6
Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
fQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgd2lkdGggPSBwcmltaXRpdmVWYWx1ZS0+
Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0aCh3aWR0aCk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybTogewotICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFuc2Zvcm0sIFRyYW5zZm9ybSk7Ci0gICAg
ICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgY3JlYXRlVHJhbnNm
b3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCBvcGVyYXRpb25zKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VHJhbnNmb3JtKG9w
ZXJhdGlvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRQZXJzcGVjdGl2ZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChw
ZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCi0KLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkK
LSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQ
ZXJzcGVjdGl2ZSgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAg
IGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNM
ZW5ndGgoKSkKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBwcmltaXRpdmVWYWx1ZS0+
Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVt
YmVyKCkpIHsKLSAgICAgICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVh
dCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUg
PSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBlcnNwZWN0aXZl
VmFsdWUgPj0gMC4wZikKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZl
KHBlcnNwZWN0aXZlVmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBbmltYXRpb246Ci0gICAgICAgIGlmIChpc0luaXRpYWwpCi0gICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckFuaW1hdGlvbnMoKTsKLSAgICAgICAgZWxzZSBpZiAo
aXNJbmhlcml0KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEFuaW1hdGlvbnMo
c3RhdGUucGFyZW50U3R5bGUoKS0+YW5pbWF0aW9ucygpKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgotICAgICAgICBpZiAoaXNJbml0aWFs
KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJUcmFuc2l0aW9ucygpOwotICAgICAg
ICBlbHNlIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0
VHJhbnNpdGlvbnMoc3RhdGUucGFyZW50U3R5bGUoKS0+dHJhbnNpdGlvbnMoKSk7Ci0gICAgICAg
IHJldHVybjsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUYXBIaWdobGlnaHRDb2xvcjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0Q29sb3IpOwotICAgICAgICBpZiAo
IXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgQ29sb3IgY29s
ID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZlVmFsdWUpOwotICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotI2VuZGlmCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6IHsKLSAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZywgVXNl
VG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlVG91Y2hPdmVy
Zmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVRvdWNo
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlJ
bnZhbGlkOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gRGlyZWN0aW9uYWwgcHJvcGVydGllcyBh
cmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoKSBiZWZvcmUgdGhl
IHN3aXRjaC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyRW5kU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFdp
ZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyU3RhcnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3Rh
cnRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckJlZm9yZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJDb2xvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luRW5k
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5TdGFydDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJn
aW5BZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQ29sbGFwc2U6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2lu
Qm90dG9tQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdFbmQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UGFkZGluZ0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGlu
Z0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsV2lkdGg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNh
bEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0OgotICAgIHsKLSAgICAgICAg
Q1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQ
cm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxlKCktPndy
aXRpbmdNb2RlKCkpOwotICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQpOwotICAgICAgICByZXR1
cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3Bl
cnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJv
dWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0TGluZVRocm91Z2hXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5l
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5l
U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdpZHRoOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJs
aW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHRVbmRlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNpemVEZWx0
YToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3Q6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRleHRFbXBoYXNpczoKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gQ1NTIFRleHQg
TGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0aW5nIHN1cHBvcnQKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2RlKTsKLSAgICAgICAgCi0gICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNldFdyaXRpbmdNb2RlKCpwcmltaXRp
dmVWYWx1ZSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IEl0IGlzIG5vdCBvayB0byBtb2RpZnkgZG9j
dW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCi0gICAgICAgIGlmIChzdGF0ZS5lbGVt
ZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmRvY3VtZW50RWxl
bWVudCgpKQotICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0V3JpdGluZ01vZGVTZXRP
bkRvY3VtZW50RWxlbWVudCh0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246IHsKLSAgICAgICAgSEFORExFX0lO
SEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBUZXh0T3JpZW50YXRpb24pOwotCi0g
ICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNldFRleHRPcmllbnRhdGlv
bigqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsKLSAgICAgICAgSEFORExFX0lOSEVS
SVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVCb3hDb250YWluKQotICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFpbihM
aW5lQm94Q29udGFpbk5vbmUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFpblZhbHVlKCkpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgQ1NTTGluZUJveENvbnRhaW5WYWx1ZSogbGluZUJveENvbnRh
aW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250YWluVmFsdWUqPih2YWx1ZSk7Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250YWluKGxpbmVCb3hDb250YWluVmFs
dWUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ1NTIEZvbnRz
IE1vZHVsZSBMZXZlbCAzCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRGZWF0dXJlU2V0
dGluZ3M6IHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7Ci0gICAgICAgICAgICBzZXRGb250RGVzY3Jp
cHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkubWFrZU5vcm1hbEZlYXR1cmVT
ZXR0aW5ncygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAg
Rm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNj
cmlwdGlvbigpOwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NW
YWx1ZUxpc3QqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxGb250RmVhdHVyZVNldHRpbmdzPiBz
ZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0ZSgpOwotICAgICAgICBpbnQgbGVu
ID0gbGlzdC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kp
IHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlzdC0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjayhpKTsKLSAgICAgICAgICAgIGlmICghaXRlbS0+aXNGb250RmVhdHVyZVZhbHVlKCkpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBGb250RmVhdHVyZVZhbHVlKiBm
ZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1ZSo+KGl0ZW0pOwotICAgICAgICAg
ICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0dXJlLT50YWcoKSwgZmVhdHVyZS0+
dmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGZWF0dXJl
U2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKLSAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9u
KGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiBFTkFCTEUo
Q1NTX0ZJTFRFUlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZpbHRlcjogewotICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIsIEZpbHRlcik7Ci0gICAgICAgIEZp
bHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgaWYgKGNyZWF0ZUZpbHRlck9wZXJh
dGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3Bl
cmF0aW9ucykpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRGaWx0ZXIob3BlcmF0aW9u
cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0R3JpZENvbHVtbnM6IHsKLSAgICAgICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNr
U2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXpl
cywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKLSAgICAgICAgVmVjdG9yPEdyaWRUcmFj
a1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1
ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkU3RhcnQ6Ci0gICAgLy8gRklYTUU6
IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhIHNob3J0aGFuZC4KLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjogewotICAgICAgICBHcmlkUG9zaXRp
b24gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUs
IHN0YXJ0UG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkRW5kOiB7Ci0gICAgICAgIEdyaWRQ
b3NpdGlvbiBlbmRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFs
dWUsIGVuZFBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRCZWZvcmU6Ci0gICAgLy8gRklYTUU6
IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhIHNob3J0aGFuZC4KLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvdzogewotICAgICAgICBHcmlkUG9zaXRpb24g
YmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBi
ZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9uKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7Ci0gICAgICAgIEdy
aWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlv
bih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBT
dHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQg
dmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0
aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVt
ZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFibGUuCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRP
cmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZFBvc2l0aW9uWToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRSZXBlYXRZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90
dG9tU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJJbWFnZU91dHNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VS
ZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU2xpY2U6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJ
bWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRT
dHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRoOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJSaWdodFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRo
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
TGVmdFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wUmlnaHRSYWRpdXM6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJUb3BXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5nOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Q2xlYXI6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlDb3VudGVyUmVzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9hdDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHls
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoKLSNpZiBFTkFCTEUoQ1NT
X0lNQUdFX09SSUVOVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVudGF0aW9u
OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVyaW5nOgotI2lmIEVOQUJM
RShDU1NfSU1BR0VfUkVTT0xVVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZXNvbHV0
aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxl
SW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVBvc2l0aW9uOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFy
Z2luTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luUmlnaHQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eU1hcmdpblRvcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4SGVpZ2h0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluSGVpZ2h0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0
eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0
bGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlPdXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3Zl
cmZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93V3JhcDoKLSAgICBjYXNlIENTU1By
b3BlcnR5T3ZlcmZsb3dYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1k6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0b206
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQ
YWRkaW5nUmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdUb3A6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtC
ZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0luc2lkZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5UG9pbnRlckV2ZW50czoKLSAgICBjYXNlIENTU1Byb3BlcnR5UG9zaXRpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5UmlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNwZWFrOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJsZUxheW91
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0RGVjb3JhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEluZGVudDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dE92ZXJmbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0UmVuZGVy
aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNmb3JtOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpOgotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlWYXJpYWJsZToKLSNlbmRpZgotICAg
IGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlWaXNp
YmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EZWxheToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QW5pbWF0aW9uRmlsbE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkl0
ZXJhdGlvbkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25OYW1lOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25QbGF5U3RhdGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBcHBlYXJhbmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBc3BlY3RS
YXRpbzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZFNp
emU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckZpdDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJSYWRp
dXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2luZzoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246Ci0jaWYgRU5BQkxFKENTU19CT1hfREVD
T1JBVElPTl9CUkVBSykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGVjb3JhdGlvbkJy
ZWFrOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERpcmVjdGlvbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94RmxleEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hMaW5lczoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdyb3VwOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3hPcmllbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFBhY2s6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29ycmVjdGlvbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uQnJlYWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtCZWZv
cmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrSW5zaWRlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uR2FwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Qcm9ncmVzc2lv
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblJ1bGVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uU3BhbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduQ29u
dGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVtczoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QWxpZ25TZWxmOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFzaXM6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhG
bG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4R3JvdzoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0RmxleFNocmluazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFdy
YXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3RpZnlDb250ZW50OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRPcmRlcjoKLSNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRG
bG93SW50bzoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250S2VybmluZzoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNtb290aGluZzoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEhpZ2hsaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlQ2hhcmFj
dGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEFmdGVyOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEJlZm9yZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5lczoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0SHlwaGVuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUFsaWduOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExpbmVDbGFtcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUdyaWQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXJxdWVlRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3R5
bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXNrQm94SW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZVNsaWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTb3Vy
Y2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVdpZHRoOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFza0NvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0ltYWdlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlv
blg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblk6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE5ic3BNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW5YOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6Ci0jaWYgRU5BQkxFKENTU19SRUdJT05TKQotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVn
aW9uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbk92ZXJmbG93
OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ0bE9yZGVyaW5nOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRleHRDb21iaW5lOgotI2lmIEVOQUJMRShDU1MzX1RFWFQpCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dERlY29yYXRpb25TdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEFsaWdu
TGFzdDoKLSNlbmRpZiAvLyBDU1MzX1RFWFQKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1Bv
c2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNTdHlsZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dFNlY3VyaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ry
b2tlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luWjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtU3R5
bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRy
YW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlckRy
YWc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2RpZnk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENsaXBQ
YXRoOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRT
aGFwZVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBUaHJvdWdoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0U2hhcGVPdXRzaWRlOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3Bh
Y2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2lk
dGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V29yZFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlaSW5kZXg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Ci0jaWYgRU5BQkxFKENT
U19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4Wm9vbToKLSAgICBj
YXNlIENTU1Byb3BlcnR5TWluWm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JpZW50YXRpb246
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgotI2VuZGlmCi0gICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSNpZiBFTkFCTEUo
U1ZHKQotICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCi0gICAgICAgIGFwcGx5U1ZH
UHJvcGVydHkoaWQsIHZhbHVlKTsKLSNlbmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQotfQot
Ci1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJv
cGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS0+aXNJ
bWFnZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUocHJv
cGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwotCi0gICAgaWYgKHZh
bHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICBpZiAodmFsdWUtPmlzR3Jh
ZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21W
YWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KHZhbHVlKS0+Z3Jh
ZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpOwotICAgICAgICByZXR1cm4gZ2Vu
ZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZUdl
bmVyYXRvclZhbHVlKj4odmFsdWUpKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NF
VCkKLSAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQotICAgICAgICByZXR1cm4gc2V0
T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVl
Kj4odmFsdWUpKTsKLSNlbmRpZgotCi0gICAgaWYgKHZhbHVlLT5pc0N1cnNvckltYWdlVmFsdWUo
KSkKLSAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3Rh
dGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7Ci0KLSAgICByZXR1cm4gMDsK
LX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VWYWx1ZSogdmFsdWUp
Ci17Ci0gICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGlu
Z0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAg
ICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVl
KTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0
eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAo
dmFsdWUtPmlzUGVuZGluZygpKSB7Ci0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVy
dGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gU3R5bGVQZW5kaW5n
SW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZElt
YWdlOjpjcmVhdGUodmFsdWUpOwotfQotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi1QYXNz
UmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1ZSkKLXsKLSAgICBS
ZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2VTZXQo
ZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZh
bHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotI2VuZGlmCi0KLVBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENT
U1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZhbHVlKQotewotICAg
IFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZShk
b2N1bWVudCgpKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0g
ICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFs
dWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y2hlY2tGb3JUZXh0U2l6ZUFkanVzdCgpCi17Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0g
bV9zdGF0ZS5zdHlsZSgpOwotCi0gICAgaWYgKHN0eWxlLT50ZXh0U2l6ZUFkanVzdCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKHN0
eWxlLT5mb250RGVzY3JpcHRpb24oKSk7Ci0gICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldENvbXB1
dGVkU2l6ZShuZXdGb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpKTsKLSAgICBzdHlsZS0+
c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5
bGUqIHBhcmVudFN0eWxlKQotewotICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpID09IHBh
cmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwot
ICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBz
ZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkp
OwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVy
U3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0KLSAg
ICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwgIXBhcmVudFN0eWxlKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnQgPSBwYXJl
bnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGNoaWxkRm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIC8vIEZvciBub3csIGx1bXAgYWxsIGZhbWlsaWVzIGJ1dCBtb25vc3Bh
Y2UgdG9nZXRoZXIuCi0gICAgaWYgKGNoaWxkRm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERl
c2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKLSAgICAgICAgJiYgcGFyZW50Rm9udC5nZW5lcmlj
RmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBpcyBtb25vc3BhY2Ugb3IgdGhlIGNo
aWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAotICAgIC8vIHNpemUgd2FzIHVuc3BlY2lm
aWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUgYXMgYXBwcm9wcmlhdGUuCi0gICAg
Ly8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSByZWZldGNoIGZyb20g
dGhlIHRhYmxlIHJhdGhlciB0aGFuCi0gICAgLy8gbXVsdGlwbHlpbmcgYnkgb3VyIHNjYWxlIGZh
Y3Rvci4KLSAgICBmbG9hdCBzaXplOwotICAgIGlmIChjaGlsZEZvbnQua2V5d29yZFNpemUoKSkK
LSAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4
U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEsIGNoaWxkRm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkpOwotICAgIGVsc2UgewotICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgIGZsb2F0IGZpeGVkU2NhbGVGYWN0b3IgPSAoc2V0
dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYgc2V0dGluZ3MtPmRl
ZmF1bHRGb250U2l6ZSgpKQotICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxmbG9hdD4oc2V0dGlu
Z3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgp
Ci0gICAgICAgICAgICA6IDE7Ci0gICAgICAgIHNpemUgPSBwYXJlbnRGb250LnVzZUZpeGVkRGVm
YXVsdFNpemUoKSA/Ci0gICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAv
IGZpeGVkU2NhbGVGYWN0b3IgOgotICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRT
aXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOwotICAgIH0KLQotICAgIEZvbnREZXNjcmlwdGlvbiBu
ZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVz
Y3JpcHRpb24sIHNpemUpOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERl
c2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjppbml0aWFsaXplRm9udFN0eWxl
KFNldHRpbmdzKiBzZXR0aW5ncykKLXsKLSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0
aW9uOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlv
bjo6U3RhbmRhcmRGYW1pbHkpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2Rl
KHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0
VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVl
bkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3Rh
bmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygpLT5zdGFuZGFyZEZvbnRGYW1pbHko
KTsKLSAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9u
dERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udEZhbWlseSk7
Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsK
LSAgICB9Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVt
IC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9u
LCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKSk7
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFs
TGluZUhlaWdodCgpKTsKLSAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBz
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgZmxvYXQg
c2l6ZSkKLXsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAg
ICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVj
aWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlz
QWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcygpKSk7Ci19Ci0KLWZsb2F0IFN0
eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBk
b2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBz
cGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykKLXsKLSAgICBmbG9hdCB6b29tRmFj
dG9yID0gMS4wZjsKLSAgICBpZiAoIXVzZVNWR1pvb21SdWxlcykgewotICAgICAgICB6b29tRmFj
dG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9
IGRvY3VtZW50LT5mcmFtZSgpKQotICAgICAgICAgICAgem9vbUZhY3RvciAqPSBmcmFtZS0+dGV4
dFpvb21GYWN0b3IoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3R5bGVSZXNvbHZlcjo6Z2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0b3IsIGlzQWJzb2x1
dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKLX0KLQotZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBmbG9hdCB6b29t
RmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRN
aW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUpCi17Ci0gICAgLy8g
VGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90IGJlIHZpc2libGUgYW5kIHRoZXJl
Zm9yZSBuZWVkcyB0byBiZQotICAgIC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0gZm9udCBzaXplIHJ1
bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAotICAgIC8vIHJlbmRl
cmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBvdGhlciBicm93c2VycyB0aGF0IGhh
dmUgbWluaW11bQotICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBGaXJlZm94KS4KLSAg
ICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6
ZXBzaWxvbigpKQotICAgICAgICByZXR1cm4gMC4wZjsKLQotICAgIC8vIFdlIHN1cHBvcnQgdHdv
IHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmlyc3QgaXMgYSBoYXJkIG92ZXJyaWRl
IHRoYXQgYXBwbGllcyB0bwotICAgIC8vIGFsbCBmb250cy4gVGhpcyBpcyAibWluU2l6ZS4iIFRo
ZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFydCBtaW5pbXVtIgot
ICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdlIGNhbid0IGtub3cg
d2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4sCi0gICAgLy8gd2hlbiBpdCB1c2Vz
IGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJlc3NlcyB0aGUgZm9udC1zaXplIGFz
IGEgcGVyY2VudGFnZSBvZgotICAgIC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBmb250IHNldHRpbmcu
Ci0KLSAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3YW50IHRvIGdldCBz
bWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIGtlZXAgZm9udHMgcmVhZGFibGUu
Ci0gICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8gc2V0IGFuIGV4cGxp
Y2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAotICAgIC8vIHNpbmNlIHNpdGVzIHdpbGwg
bWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNwb3QuY29tIHdpdGgg
YSA5cHggbWluaW11bSkuCi0KLSAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0
dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICByZXR1cm4gMS4wZjsKLQotICAg
IGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOwotICAgIGludCBtaW5M
b2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7Ci0gICAgZmxv
YXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29tRmFjdG9yOwotCi0gICAgLy8gQXBw
bHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBhcHBseSB0aGUgaGFyZCBtaW5pbXVt
IGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNtYWxsLgotICAgIGlmICh6b29tZWRT
aXplIDwgbWluU2l6ZSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pblNpemU7Ci0KLSAgICAvLyBO
b3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlzIGFsc28gb25seSBh
cHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAotICAgIC8vIGFmdGVyIHpvb21pbmcuIFRo
ZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIgZGVmYXVsdCBv
ciB0aGUgb3JpZ2luYWwgc2l6ZQotICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGFibGUuIElu
IG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVtIHdoZW5ldmVyIHdl
J3JlIHBvc2l0aXZlCi0gICAgLy8gZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0aGUgbGF5b3V0Lgot
ICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAmJiB6b29tZWRTaXplIDwgbWluTG9n
aWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9naWNhbFNpemUgfHwgIWlzQWJzb2x1
dGVTaXplKSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXplOwotCi0gICAgLy8g
QWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0byBwcmV2ZW50IGluc2FuZSBmb250
IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlvdXMKLSAgICAvLyBwbGF0Zm9ybXMg
KEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCi0gICAgcmV0dXJuIG1pbihtYXhpbXVtQWxs
b3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKLX0KLQotY29uc3QgaW50IGZvbnRTaXplVGFibGVN
YXggPSAxNjsKLWNvbnN0IGludCBmb250U2l6ZVRhYmxlTWluID0gOTsKLWNvbnN0IGludCB0b3Rh
bEtleXdvcmRzID0gODsKLQotLy8gV2luSUUvTmF2NCB0YWJsZSBmb3IgZm9udCBzaXplcy4gRGVz
aWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBpbmcgc3lzdGVtIG9mIEhUTUwuCi1z
dGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZv
bnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Ci17Ci0gICAgICB7IDksICAgIDks
ICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjggfSwKLSAgICAgIHsgOSwg
ICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMSB9LAotICAgICAg
eyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDM0IH0sCi0g
ICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzcg
fSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAg
ICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQotICAgICAgeyA5LCAgICA5LCAgICAx
MSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCi0gICAgICB7IDksICAgMTAs
ICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKLSAgICAgIHsgOSwg
ICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3Bv
cnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQotfTsKLS8vIEhUTUwgICAgICAgMSAgICAgIDIgICAg
ICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNwotLy8gQ1NTICB4eHMgICB4cyAgICAgcyAg
ICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAg
fAotLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCi0KLS8vIFN0cmljdCBtb2RlIHRh
YmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0aW5ncyBleGFjdGx5Lgotc3RhdGlj
IGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6
ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQotewotICAgICAgeyA5LCAgICA5LCAgICAg
OSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3IH0sCi0gICAgICB7IDksICAgIDks
ICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzAgfSwKLSAgICAgIHsgOSwg
ICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzMyB9LAotICAgICAg
eyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM2IH0sCi0g
ICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAgMzkg
fSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKLSAgICAgIHsgOSwgICAxMCwgICAgMTIsICAg
IDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAx
MywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCi0gICAgICB7IDksICAgMTAs
ICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9u
YWwgZm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBIVE1MICAgICAgIDEgICAgICAyICAgICAgMyAg
ICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8vIENTUyAgeHhzICAgeHMgICAgIHMgICAgICBt
ICAgICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8v
ICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgotCi0vLyBGb3IgdmFsdWVzIG91dHNpZGUg
dGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQgRmFocm5lcidzIHN1Z2dlc3RlZCBz
Y2FsZQotLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZhbHVlLgotc3RhdGljIGNvbnN0IGZs
b2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9IHsgMC42MGYsIDAuNzVmLCAwLjg5
ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9OwotCi1mbG9hdCBTdHlsZVJlc29sdmVy
Ojpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQga2V5d29yZCwgYm9v
bCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9
IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVy
biAxLjBmOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgp
OwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRp
bmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgp
OwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8
PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIC8vIExvb2sgdXAgdGhlIGVudHJ5IGluIHRo
ZSB0YWJsZS4KLSAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWlu
OwotICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGwpOwotICAgICAg
ICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XVtjb2xdIDogc3Ry
aWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07Ci0gICAgfQotCi0gICAgLy8gVmFsdWUgaXMgb3V0
c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0aGUgc2NhbGUgZmFjdG9yIGluc3Rl
YWQuCi0gICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgoc2V0dGluZ3MtPm1pbmltdW1Mb2dp
Y2FsRm9udFNpemUoKSwgMSk7Ci0gICAgcmV0dXJuIG1heChmb250U2l6ZUZhY3RvcnNba2V5d29y
ZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWluTG9naWNhbFNpemUpOwotfQotCi10
ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGludCBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXpl
KGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwgaW50IG11bHRpcGxpZXIpCi17Ci0g
ICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21hbGwgZG9lcyBub3QgY29ycmVzcG9u
ZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IHRvdGFs
S2V5d29yZHMgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKHBpeGVsRm9udFNpemUgKiAyIDwgKHRh
YmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIpCi0gICAgICAgICAgICByZXR1cm4g
aTsKLSAgICB9Ci0gICAgcmV0dXJuIHRvdGFsS2V5d29yZHMgLSAxOwotfQotCi1pbnQgU3R5bGVS
ZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQgcGl4ZWxGb250
U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAg
ICAgIHJldHVybiAxOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtz
TW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/
IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250
U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVt
U2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIGludCByb3cgPSBtZWRpdW1TaXpl
IC0gZm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9u
dFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJs
ZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4ocGl4ZWxGb250U2l6ZSwgZm9udFNp
emVGYWN0b3JzLCBtZWRpdW1TaXplKTsKLX0KLQotc3RhdGljIENvbG9yIGNvbG9yRm9yQ1NTVmFs
dWUoaW50IGNzc1ZhbHVlSWQpCi17Ci0gICAgc3RydWN0IENvbG9yVmFsdWUgewotICAgICAgICBp
bnQgY3NzVmFsdWVJZDsKLSAgICAgICAgUkdCQTMyIGNvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0
aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0gewotICAgICAgICB7IENTU1ZhbHVl
QXF1YSwgMHhGRjAwRkZGRiB9LAotICAgICAgICB7IENTU1ZhbHVlQmxhY2ssIDB4RkYwMDAwMDAg
fSwKLSAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAwRkYgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyYXksIDB4RkY4
MDgwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAwICB9LAotICAgICAg
ICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAotICAgICAgICB7IENTU1ZhbHVlTGltZSwg
MHhGRjAwRkYwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTWFyb29uLCAweEZGODAwMDAwIH0sCi0g
ICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVP
bGl2ZSwgMHhGRjgwODAwMCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZU9yYW5nZSwgMHhGRkZGQTUw
MCB9LAotICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZGODAwMDgwIH0sCi0gICAgICAgIHsg
Q1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVNpbHZlciwgMHhG
RkMwQzBDMCB9LAotICAgICAgICB7IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4MCAgfSwKLSAgICAg
ICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFs
dWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAotICAgICAgICB7IENTU1ZhbHVlWWVsbG93LCAweEZGRkZG
RjAwIH0sCi0gICAgICAgIHsgMCwgMCB9Ci0gICAgfTsKLQotICAgIGZvciAoY29uc3QgQ29sb3JW
YWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytjb2wpIHsKLSAgICAg
ICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlkKQotICAgICAgICAgICAgcmV0dXJu
IGNvbC0+Y29sb3I7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1l
KCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNv
bG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFs
dWUqIHZhbHVlKQotewotICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3
aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKLSAgICBjYXNlIENT
U1ZhbHVlV2Via2l0TGluazoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAg
ICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBk
ZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1Db2xvciBTdHlsZVJl
c29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUs
IGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Ci17Ci0gICAgaWYgKHZhbHVlLT5pc1JHQkNvbG9y
KCkpCi0gICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7Ci0KLSAg
ICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGludCBpZGVudCA9IHZhbHVlLT5n
ZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJl
dHVybiBDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgotICAgICAgICByZXR1
cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dExpbms6Ci0gICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSAmJiBmb3JW
aXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNpdGVkTGlua0NvbG9yKCkgOiBzdGF0
ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZl
bGluazoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPmFjdGl2ZUxpbmtDb2xvcigp
OwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcjoKLSAgICAgICAgcmV0dXJu
IFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50
Y29sb3I6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotICAgIGRlZmF1
bHQ6Ci0gICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVlKGlkZW50KTsKLSAgICB9Ci19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0
KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVzdWx0KQotewotICAgIG1fdmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIobmV3IE1lZGlhUXVl
cnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjphZmZl
Y3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAotewotICAgIHVuc2lnbmVkIHMgPSBtX3ZpZXdw
b3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzOyBpKyspIHsKLSAgICAgICAgaWYgKG1fbWVkaXVtLT5ldmFsKCZtX3ZpZXdw
b3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lvbikgIT0gbV92aWV3
cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBUcmFu
c2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZShX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSB0eXBlKQotewot
ICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNj
YWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRTsK
LSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g7Ci0gICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NB
TEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3Jt
T3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8zRDsKLSAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJl
dHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpUUkFOU0xBVEVfWTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFO
U0xBVEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRy
YW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFXzNE
OwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOwotICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
OlJPVEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9aOwotICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfM0Q7Ci0gICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6U0tFVzsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3
WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19YOwot
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpNQVRSSVg7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0
cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJ
WF8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5z
Zm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVSU1BFQ1RJVkU7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVU
cmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUs
IFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlv
bnMpCi17Ci0gICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7Ci0g
ICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29t
KCkgOiAxOwotICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICBmb3IgKENT
U1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLQotICAgICAgICBp
ZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqIHRyYW5zZm9ybVZh
bHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihpLnZhbHVlKCkpOwot
ICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCk7ICsr
aikgewotICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaGF2ZU5vblBy
aW1pdGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAg
ICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDApKTsKLQotICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybVZhbHVlLT5v
cGVyYXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBk
b3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN5ID0g
Zmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEp
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZh
bHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAg
ICAgc3kgPSBzeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246
OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3Bl
cmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJh
bnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAg
ICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3ogPSAxLjA7Ci0gICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYg
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzeSA9IGZpcnN0
VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3Jt
VmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCBz
eiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0
aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJh
bnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4
ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwg
em9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNv
bnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
ICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9u
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29u
dmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5l
ZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0
aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3Jl
YXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRl
WlRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCB0
eCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwg
Rml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAg
ICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHls
ZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNm
b3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgo
Zmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFs
dWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aCh0aGlyZFZhbHVl
LCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRU
b0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSB8
fCB0ei5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9y
bU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1
ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCAxLCBhbmdsZSwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJh
dGlvbjogewotICAgICAgICAgICAgZG91YmxlIHggPSAwOwotICAgICAgICAgICAgZG91YmxlIHkg
PSAwOwotICAgICAgICAgICAgZG91YmxlIHogPSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xl
ID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLQotICAgICAgICAgICAgaWYgKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAg
ICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAg
ICAgIHkgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHogPSAxOwotICAg
ICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUz
RFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5s
ZW5ndGgoKSA8IDQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMp
KTsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0g
ICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAg
ICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAg
ICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1P
cGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1Ry
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5n
bGVYID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkgPSAwOwotICAgICAgICAgICAgZG91
YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBhbmdsZVkgPSBh
bmdsZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFuZ2xlWCA9IGFuZ2xl
OwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlWSA9IHNlY29uZFZh
bHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhbmdsZVgsIGFuZ2xlWSwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVW
YWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91
YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gem9vbUZhY3RvciAqIHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGYgPSB6b29t
RmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9u
OjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zv
cm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkg
PCAxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9u
TWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFs
dWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDYpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDcp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEwKSktPmdldERvdWJsZVZhbHVlKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMSkpLT5nZXRE
b3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3Ig
KiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE0
KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlv
bnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRl
KG1hdHJpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHsK
LSAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlm
IChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAgICAgICAgIHAgPSBjb252ZXJ0VG9G
bG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAg
ICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdWlyayB0aGF0
IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBhcmUgZmluYWxpemVkLgotICAgICAg
ICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAg
ICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChjbGFtcFRvUG9zaXRpdmVJbnRlZ2Vy
KHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFBlcnNwZWN0
aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRy
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0g
b3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVS
UykKLXN0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZmlsdGVyT3BlcmF0aW9u
Rm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9uVHlwZSB0eXBlKQot
ewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlJl
ZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
UkVGRVJFTkNFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRl
ck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOwot
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAg
ICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsKLSAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6U0FUVVJBVEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVl
Um90YXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpI
VUVfUk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9w
ZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOwotICAgIGNh
c2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAg
IHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpD
b250cmFzdEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
Q09OVFJBU1Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJh
dGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QkxVUjsKLSAgICBjYXNlIFdl
YktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsKLSNpZiBFTkFCTEUoQ1NTX1NIQURF
UlMpCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT007Ci0jZW5kaWYKLSAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgotICAgICAg
ICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotICAgIH0KLSAgICByZXR1cm4gRmlsdGVy
T3BlcmF0aW9uOjpOT05FOwotfQotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUo
U1ZHKQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpCi17Ci0g
ICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlKCktPmhhc0Zp
bHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRl
ciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7Ci0gICAgVmVjdG9y
PFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBzdGF0ZS5zdHls
ZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxG
aWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7
Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0
ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewotICAgICAgICAgICAgUmVmZXJlbmNlRmlsdGVyT3Bl
cmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVuY2VGaWx0ZXJPcGVy
YXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NT
VkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5nZXQo
cmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKLSAgICAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDYWNoZWRTVkdEb2N1bWVudCogY2FjaGVk
RG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgICAg
ICBpZiAoIWNhY2hlZERvY3VtZW50KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhlIHJlZmVyZW5jZSBm
aWx0ZXIuCi0gICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXItPnNldENhY2hlZFNWR0RvY3VtZW50
UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShjYWNoZWRE
b2N1bWVudCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1l
bnRzKCkuY2xlYXIoKTsKLX0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotU3R5
bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVlKiB2YWx1ZSkKLXsK
LSAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFsdWUoKSkKLSAgICAgICAgcmV0dXJu
IGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKHN0YXRpY19jYXN0PFdlYktpdENT
U1NoYWRlclZhbHVlKj4odmFsdWUpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotU3R5bGVTaGFkZXIq
IFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktp
dENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBTdHlsZVNoYWRlciogc2hhZGVyID0gdmFs
dWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOwotICAgIGlmIChzaGFkZXIgJiYgc2hhZGVyLT5p
c1BlbmRpbmdTaGFkZXIoKSkKLSAgICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyh0
cnVlKTsKLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQ
ZW5kaW5nU2hhZGVycygpCi17Ci0gICAgaWYgKCFtX3N0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigp
IHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9j
dW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIFZlY3RvcjxSZWZQdHI8Rmls
dGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5zdHlsZSgpLT5tdXRh
YmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBm
aWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVy
YXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAg
IGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRp
b246OkNVU1RPTSkgewotICAgICAgICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKiBjdXN0b21G
aWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRp
b24uZ2V0KCkpOwotICAgICAgICAgICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsK
LSAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3JhbSA9IHN0YXRpY19j
YXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsK
LSAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBwcm9ncmFtLT52ZXJ0
ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBXZWJLaXRD
U1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFk
ZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAg
ICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFk
ZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
IChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkt
PmlzUGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFs
dWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3Jh
bS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAg
cHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNo
ZWRSZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAg
IG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBz
b3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBiKQotewot
ICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4oYS0+bmFtZSgpLCBiLT5uYW1lKCkp
OwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6
cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1Zh
bHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
cj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcjo6Y3JlYXRlKG5h
bWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlcy0+bGVuZ3RoKCk7
IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZl
VmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVl
KTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJp
bWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAg
YXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5UGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFz
c1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9t
RmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2
YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcj4gbnVtYmVy
UGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7ICsraSkgewotICAg
ICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7
Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJl
dHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIp
Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbnVtYmVyUGFyYW1ldGVyLT5hZGRWYWx1
ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBu
dW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0
ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKLXsKLSAgICBSZWZQ
dHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1QYXJhbWV0ZXIgPSBD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKLSAgICBUcmFuc2Zv
cm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2
YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJh
dGlvbnMpOwotICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0T3BlcmF0aW9ucyhvcGVyYXRpb25z
KTsKLSAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmls
dGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBhcmFtZXRlclZhbHVl
KQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVycyB0eXBlcyBwYXJz
aW5nLgotICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzY0MzgKLSAgICAvLyB0ZXh0dXJlczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTcxNDQyCi0gICAgLy8gbWF0MiwgbWF0MywgbWF0NDogaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0Ci0gICAgLy8gTnVtYmVyIHBhcmFtZXRl
cnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwKLSAgICAvLyB0aGUg
b3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20gQ1NTVmFsdWVMaXN0LgotICAgIGlm
ICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihwYXJh
bWV0ZXJWYWx1ZSk7Ci0gICAgaWYgKCF2YWx1ZXMtPmxlbmd0aCgpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJheUZ1bmN0aW9uVmFs
dWUoKSkKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIobmFt
ZSwgdmFsdWVzKTsKLQotICAgIC8vIElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbGlzdCBpcyBh
IHRyYW5zZm9ybSBmdW5jdGlvbiwKLSAgICAvLyB0aGVuIHdlIGNvdWxkIHNhZmVseSBhc3N1bWUg
dGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcwotICAgIC8vIGFyZSB0cmFuc2Zvcm1zLiBwYXJz
ZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxsCi0gICAgLy8gcmV0dXJuIDAgaWYg
dGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KLSAgICBpZiAodmFsdWVzLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCi0gICAgICAgIHJl
dHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOwot
Ci0gICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2YgYm9vbGVhbnMgb3IgbnVtYmVycywg
c28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9zZSB0d28uCi0gICAg
Ly8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFsbCBudW1iZXJzKS4K
LSAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVW
YWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQotICAgICAgICByZXR1cm4gMDsKLSAgICAK
LSAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsK
LSAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJO
dW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQg
dGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9v
bCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUq
IHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYgcGFyYW1ldGVyTGlz
dCkKLXsKLSAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJhbWV0ZXJOYW1lczsKLSAgICBDU1NW
YWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJzVmFsdWUpOwotICAg
IGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7IHBhcmFtZXRlckl0ZXJhdG9yLmFk
dmFuY2UoKSkgewotICAgICAgICBpZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCktPmlzVmFs
dWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIENTU1ZhbHVlTGlz
dEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBp
ZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19T
VFJJTkcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBTdHJp
bmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAvLyBE
byBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KLSAgICAgICAgaWYgKGtub3du
UGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAKLSAgICAg
ICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFpdGVyYXRvci5o
YXNNb3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJzZUN1c3RvbUZpbHRl
clBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0
ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHBhcmFtZXRlckxpc3QuYXBw
ZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBNYWtlIHN1cmUg
d2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIGRvd24gdG8gdGhlIEN1
c3RvbUZpbHRlck9wZXJhdGlvbi4KLSAgICBzdGQ6OnNvcnQocGFyYW1ldGVyTGlzdC5iZWdpbigp
LCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IpOwot
ICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJh
dGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVs
ZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0g
ICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0aW9uIGZvciB0aGUgY3VzdG9tIGZp
bHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCi0gICAgVU5VU0VEX1BBUkFNKGZpbHRlclZh
bHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRp
b24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVT
eW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQotewotICAgIENTU1ZhbHVl
KiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsK
LSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzaGFkZXJzVmFsdWUtPmlzVmFs
dWVMaXN0KCkpOwotICAgIENTU1ZhbHVlTGlzdCogc2hhZGVyc0xpc3QgPSBzdGF0aWNfY2FzdDxD
U1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOwotCi0gICAgdW5zaWduZWQgc2hhZGVyc0xpc3RM
ZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7Ci0gICAgQVNTRVJUKHNoYWRlcnNMaXN0TGVu
Z3RoKTsKLQotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVydGV4U2hhZGVyID0gc3R5bGVTaGFk
ZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOwotICAgIFJlZlB0cjxT
dHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7Ci0gICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbVR5cGUg
cHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVYVFVSRTsKLSAgICBD
dXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0dGluZ3M7Ci0KLSAgICBpZiAoc2hh
ZGVyc0xpc3RMZW5ndGggPiAxKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBmcmFnbWVudFNoYWRlck9y
TWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKLQot
ICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uLT5pc1dlYktpdENTU01peEZ1
bmN0aW9uVmFsdWUoKSkgewotICAgICAgICAgICAgV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSog
bWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKj4oZnJh
Z21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJh
dG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKLQotICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0
aW9uLT5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVy
KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotCi0g
ICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMpOwotICAgICAgICAg
ICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgewotICAgICAgICAgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKENTU1BhcnNlcjo6aXNC
bGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQotICAgICAgICAgICAgICAgICAg
ICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAg
ICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9wZXJhdG9yKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuY29tcG9zaXRl
T3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgICAgICBpdGVy
YXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19FTEVNRU5UX1RFWFRVUkU7Ci0gICAg
ICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyT3JNaXhG
dW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdW5zaWduZWQgbWVzaFJvd3Mg
PSAxOwotICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsKLSAgICBDdXN0b21GaWx0ZXJNZXNo
VHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7Ci0gICAgCi0gICAgQ1NTVmFsdWUqIHBh
cmFtZXRlcnNWYWx1ZSA9IDA7Ci0gICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+
IDEpIHsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IoZmlsdGVyVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHNl
Y29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qgb2YgcGFyYW1ldGVy
czoKLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgb3IgYW55IG9mIHRoZSBt
ZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKLSAgICAgICAgLy8gdGhlIG1lc2gtYm94IGxpc3Qs
IGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVycyBsaXN0LgotCi0gICAgICAgIGlm
IChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0g
ICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgb25s
eSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0IGJvdGgKLSAgICAg
ICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMuCi0gICAgICAgICAgICAgICAg
bWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOwot
ICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAKLSAg
ICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhlciBudW1iZXIgZm9yIHRoZSByb3dz
LgotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQ
cmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0
b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNO
dW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVzaFJvd3MgPSBwcmltaXRpdmVW
YWx1ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFk
dmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01v
cmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgewotICAgICAgICAgICAgICAgIG1lc2hU
eXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNl
KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXRl
cmF0b3IuaW5kZXgoKSkgewotICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUgd2FzIGNvbnN1bWVk
IGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVzdCBhIHBhcmFtZXRlciBsaXN0LCBt
ZWFuaW5nIHRoYXQgd2UgZW5kIHVwCi0gICAgICAgICAgICAvLyBoYXZpbmcganVzdCB0d28gQ1NT
TGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gICAg
ICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDIpOwotICAgICAgICAgICAg
cGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+
IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKLSAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVy
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7Ci0gICAgCi0gICAgQ3VzdG9tRmlsdGVy
UGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OwotICAgIGlmIChwYXJhbWV0ZXJzVmFsdWUgJiYg
IXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFsdWUsIHBhcmFtZXRl
ckxpc3QpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZWZQdHI8U3R5bGVDdXN0b21G
aWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtOjpjcmVhdGUo
dmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFkZXIucmVsZWFzZSgpLCBwcm9ncmFt
VHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKLSAgICByZXR1cm4gQ3VzdG9tRmlsdGVyT3Bl
cmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBhcmFtZXRlckxpc3QsIG1lc2hSb3dz
LCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9w
ZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktp
dENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAgICBBU1NFUlQoZmlsdGVyVmFsdWUt
Pmxlbmd0aCgpKTsKLSAgICBib29sIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID0gZmlsdGVyVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKTsKLSAgICBy
ZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRp
b25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZhbHVlKSA6IGNyZWF0ZUN1c3RvbUZp
bHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVyVmFsdWUpOwotfQotCi0jZW5kaWYK
LQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBp
blZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRl
ck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgQVNTRVJUKG91dE9wZXJhdGlvbnMu
aXNFbXB0eSgpKTsKLSAgICAKLSAgICBpZiAoIWluVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAKLSAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4oaW5WYWx1ZSk7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgCi0gICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpIDogMTsKLSAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7
Ci0gICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgIGlmICgh
Y3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkpCi0gICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUgPSBzdGF0aWNf
Y2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUoKSk7Ci0gICAgICAgIEZpbHRlck9w
ZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gZmlsdGVyT3BlcmF0aW9uRm9y
VHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsKLQotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpWQUxJ
REFURURfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0b21GaWx0ZXJPcGVy
YXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVyU3R5bGUuCi0gICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6Q1VT
VE9NKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRp
b24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUpOwotICAgICAgICAg
ICAgaWYgKCFvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0
aW9uKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAg
aWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKLSNpZiBF
TkFCTEUoU1ZHKQotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQot
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ1NTVmFsdWUqIGFyZ3VtZW50
ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0KLSAgICAgICAgICAg
IGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgpKQotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVl
KiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1
ZSo+KGFyZ3VtZW50KTsKLSAgICAgICAgICAgIEtVUkwgdXJsID0gbV9zdGF0ZS5kb2N1bWVudCgp
LT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwoKSk7Ci0KLSAgICAgICAgICAgIFJl
ZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IFJlZmVyZW5jZUZpbHRl
ck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1cmwuZnJhZ21lbnRJ
ZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOwotICAgICAgICAgICAgaWYgKFNWR1VSSVJlZmVy
ZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgbV9z
dGF0ZS5kb2N1bWVudCgpKSkgewotICAgICAgICAgICAgICAgIGlmICghc3ZnRG9jdW1lbnRWYWx1
ZS0+bG9hZFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnBlbmRpbmdT
VkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBzdmdEb2N1bWVudFZhbHVlKTsKLSAg
ICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVu
dCgpKQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24tPnNldENhY2hlZFNWR0RvY3VtZW50
UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShzdmdEb2N1
bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7Ci0jZW5kaWYK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhh
dCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0aGUKLSAgICAgICAg
Ly8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhhcyBhIFNoYWRvd1ZhbHVlIHBhcmFt
ZXRlci4KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gRmlsdGVyT3BlcmF0aW9uOjpEUk9Q
X1NIQURPVykgewotICAgICAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxz
ZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBmaWx0ZXJWYWx1ZS0+bGVu
Z3RoKCk7ICsraikgewotICAgICAgICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAg
ICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAo
aGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBmaWx0ZXJWYWx1
ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpbHRlclZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7Ci0gICAgICAgIHN3aXRjaCAoZmlsdGVy
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgewotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91Ymxl
IGFtb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEp
IHsKLSAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAg
ICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJP
cGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJv
dGF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gMDsKLSAg
ICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAg
ICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0KLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0
aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRl
ck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVz
c0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29u
dHJhc3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAo
ZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJp
Z2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJW
YWx1ZS0+bGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFs
dWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlz
UGVyY2VudGFnZSgpKQotICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFz
aWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0
aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAg
TGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAo
ZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCi0gICAgICAgICAgICAgICAgc3RkRGV2aWF0aW9u
ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7Ci0gICAgICAgICAgICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5kZWZpbmVkKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN0ZERldmlhdGlv
biwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjog
ewotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgQ1NTVmFsdWUqIGNzc1ZhbHVlID0g
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0gICAgICAgICAgICBpZiAo
IWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUq
Pihjc3NWYWx1ZSk7Ci0gICAgICAgICAgICBJbnRQb2ludCBsb2NhdGlvbihpdGVtLT54LT5jb21w
dXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvciksCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3RvcikpOwotICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVy
ID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21G
YWN0b3IpIDogMDsKLSAgICAgICAgICAgIENvbG9yIGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0
ZW0tPmNvbG9yKQotICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFs
dWUoaXRlbS0+Y29sb3IuZ2V0KCkpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGxvY2F0aW9uLCBi
bHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCwgb3BlcmF0
aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgZGVm
YXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4g
U3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSogcGVuZGlu
Z0ltYWdlKQotewotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRl
ciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIGlm
IChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgewotICAgICAgICBDU1NJbWFnZVZhbHVl
KiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7Ci0gICAgICAgIHJl
dHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAg
fQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7Ci0g
ICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdlR2VuZXJhdG9yVmFsdWUgPSBwZW5k
aW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsKLSAgICAgICAgaW1hZ2VHZW5lcmF0
b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgIHJl
dHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0b3JWYWx1ZSk7Ci0g
ICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpKSB7Ci0g
ICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvckltYWdlVmFsdWUgPSBwZW5kaW5nSW1h
Z2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGN1cnNvckltYWdlVmFs
dWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0KLSNpZiBFTkFC
TEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVl
KCkpIHsKLSAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1ZSA9IHBlbmRpbmdJ
bWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+
Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIH0KLSNlbmRpZgotCi0g
ICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZXMo
KQotewotICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9p
dGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5lbmQo
KS5rZXlzKCk7Ci0gICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0
b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5iZWdpbigpLmtl
eXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIENTU1Byb3BlcnR5SUQgY3VycmVudFBy
b3BlcnR5ID0gKml0OwotCi0gICAgICAgIHN3aXRjaCAoY3VycmVudFByb3BlcnR5KSB7Ci0gICAg
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6IHsKLSAgICAgICAgICAgIGZvciAo
RmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vzc0JhY2tn
cm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5ZXIgPSBiYWNrZ3Jv
dW5kTGF5ZXItPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kTGF5ZXIt
PmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5n
SW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3JvdW5kTGF5ZXItPmlt
YWdlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogewotICAgICAgICAgICAgZm9yIChDb250
ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENvbnRlbnREYXRhKj4obV9zdGF0ZS5z
dHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7IGNvbnRlbnREYXRhID0gY29udGVu
dERhdGEtPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50RGF0YS0+aXNJbWFn
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0eWxlSW1hZ2UqIGltYWdlID0gc3RhdGljX2Nh
c3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdl
KHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5zZXRJbWFnZShsb2Fk
ZWRJbWFnZS5yZWxlYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogewotICAgICAgICAgICAgaWYgKEN1cnNvckxpc3Qq
IGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNvcnMoKSkgewotICAgICAgICAgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVudEN1cnNvciA9IGN1cnNvckxpc3Qt
PmF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoU3R5bGVJbWFnZSogaW1hZ2UgPSBjdXJy
ZW50Q3Vyc29yLmltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+
aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3Vy
c29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1h
Z2UqPihpbWFnZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogewotICAgICAgICAgICAgaWYgKG1fc3RhdGUu
c3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUlt
YWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgp
LT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVu
ZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpKSkpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFn
ZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+aXNQZW5k
aW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldEJvcmRlcklt
YWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2Uq
PihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkpKSk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVj
dDogewotICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1fc3Rh
dGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTmluZVBp
ZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1hc2soKTsKLSAgICAgICAgICAgICAg
ICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdlLmltYWdlKCktPmlzUGVuZGluZ0lt
YWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZElt
YWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1h
c2tJbWFnZS5pbWFnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE1h
c2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNrSW1hZ2UuaW1hZ2VT
bGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdlLmJvcmRlclNsaWNlcygpLCBtYXNr
SW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFsUnVsZSgpLCBtYXNrSW1hZ2UudmVy
dGljYWxSdWxlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
a0JveEltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5tYXNr
Qm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgp
LT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0
TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5k
aW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpKSkpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE1hc2tJbWFnZTogewotICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIG1hc2tMYXllciA9IG1f
c3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBtYXNrTGF5ZXI7IG1hc2tMYXllciA9
IG1hc2tMYXllci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hc2tMYXllci0+aW1h
Z2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAg
ICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2Fz
dDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1f
c3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQotewotICAgIC8vIFN0YXJ0IGxvYWRpbmcg
aW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ0ltYWdlcygp
OwotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIHNo
YWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU2hhZGVycygp
OwotI2VuZGlmCi0gICAgCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQot
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlz
IHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7Ci0jZW5kaWYKLX0KLQotaW5s
aW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVkUHJvcGVydGllcygp
Ci0gICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQotewotfQotCi1pbmxpbmUgU3R5bGVSZXNv
bHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJvcGVydGllcygpCi17Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1l
bW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xh
c3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpD
U1MpOwotICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0aWVzIik7Ci19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW06OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0g
ICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1l
bW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQcm9wZXJ0aWVzLCAi
bWF0Y2hlZFByb3BlcnRpZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihyYW5nZXMsICJyYW5nZXMi
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwgInJlbmRlclN0eWxlIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5kZXJTdHlsZSIpOwot
fQotCi12b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGlu
Zm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAg
IGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJlc3Npb24iKTsKLX0KLQotdm9pZCBT
dHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlP
YmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVj
dEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2tleWZyYW1l
c1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIpOwotICAgIGluZm8u
YWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIsICJtYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lciIpOwotCi0gICAgaW5mby5hZGRNZW1iZXIobV9tZWRpdW0s
ICJtZWRpdW0iKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0U3R5bGUsICJyb290
RGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVudCwgImRvY3VtZW50
Iik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxlY3RvciwgImZvbnRTZWxlY3RvciIp
OwotICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0
cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMiKTsKLSAgICBpbmZvLmlnbm9y
ZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9pbnNwZWN0b3JD
U1NPTVdyYXBwZXJzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Njb3BlUmVzb2x2ZXIsICJzY29w
ZVJlc29sdmVyIik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX3N0YXRlLCAic3RhdGUiKTsKLQot
ICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3b3VsZCBiZSBjYWxs
ZWQgb25seSBvbmNlPwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0UXVpcmtzU3R5bGUi
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmlu
dFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1bHRWaWV3U291cmNl
U3R5bGUiKTsKKyAgICByZXR1cm4gbV9tYXRjaGVkUnVsZXMgJiYgIW1fbWF0Y2hlZFJ1bGVzLT5p
c0VtcHR5KCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCShyZXZpc2lvbiAxNDQ4OTMpCShmcm9tIFNv
dXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmg6MTQ0ODkzKQorKysgU291cmNlL1dlYkNv
cmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3
MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9y
ZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZu
ZGVmIFN0eWxlUmVzb2x2ZXJfaAorI2RlZmluZSBTdHlsZVJlc29sdmVyX2gKKworI2luY2x1ZGUg
IkNTU1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NTVG9TdHlsZU1hcC5oIgorI2luY2x1ZGUgIkNT
U1ZhbHVlTGlzdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzLmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRl
ICJNZWRpYVF1ZXJ5RXhwLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJS
dWxlRmVhdHVyZS5oIgorI2luY2x1ZGUgIlJ1bGVTZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5h
YmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKKyNpbmNsdWRlICJTZWxl
Y3RvckNoZWNrZXIuaCIKKyNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlN0
eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUgIlN0eWxlU2NvcGVSZXNvbHZlci5oIgorI2lu
Y2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisj
ZW5kaWYKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3Ry
aW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0gRVNtYXJ0TWluaW11bUZv
ckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5p
bXVtRm9yRm9udEZpemUgfTsKKworY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKK2NsYXNzIENT
U0ZvbnRTZWxlY3RvcjsKK2NsYXNzIENTU0ZvbnRGYWNlOworY2xhc3MgQ1NTRm9udEZhY2VSdWxl
OworY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsKK2NsYXNzIENTU0ltYWdlU2V0VmFsdWU7
CitjbGFzcyBDU1NJbWFnZVZhbHVlOworY2xhc3MgQ1NTUGFnZVJ1bGU7CitjbGFzcyBDU1NQcmlt
aXRpdmVWYWx1ZTsKK2NsYXNzIENTU1Byb3BlcnR5OworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFz
cyBDU1NTZWxlY3RvcjsKK2NsYXNzIENTU1N0eWxlU2hlZXQ7CitjbGFzcyBDU1NWYWx1ZTsKK2Ns
YXNzIENvbnRhaW5lck5vZGU7CitjbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247CitjbGFzcyBD
dXN0b21GaWx0ZXJQYXJhbWV0ZXI7CitjbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0Owor
Y2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBFbGVtZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFt
ZVZpZXc7CitjbGFzcyBLVVJMOworY2xhc3MgS2V5ZnJhbWVMaXN0OworY2xhc3MgS2V5ZnJhbWVW
YWx1ZTsKK2NsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7CitjbGFzcyBOb2RlOworY2xhc3MgUmVu
ZGVyUmVnaW9uOworY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOworY2xhc3MgUnVsZURhdGE7CitjbGFz
cyBSdWxlU2V0OworY2xhc3MgU2V0dGluZ3M7CitjbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKK2Ns
YXNzIFN0eWxlQnVpbGRlcjsKK2NsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKK2NsYXNzIFN0eWxl
SW1hZ2U7CitjbGFzcyBTdHlsZUtleWZyYW1lOworY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7Citj
bGFzcyBTdHlsZVByb3BlcnR5U2V0OworY2xhc3MgU3R5bGVSdWxlOworI2lmIEVOQUJMRShTSEFE
T1dfRE9NKQorY2xhc3MgU3R5bGVSdWxlSG9zdDsKKyNlbmRpZgorY2xhc3MgU3R5bGVSdWxlS2V5
ZnJhbWVzOworY2xhc3MgU3R5bGVSdWxlUGFnZTsKK2NsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKK2Ns
YXNzIFN0eWxlU2hhZGVyOworY2xhc3MgU3R5bGVTaGVldDsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0
OworY2xhc3MgU3R5bGVkRWxlbWVudDsKK2NsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKK2Ns
YXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOworY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7Citj
bGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOworCitjbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRp
YVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKKyAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhw
cikKKyAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCisgICAgeworICAgIH0KKyAgICB2b2lkIHJl
cG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKworICAgIE1lZGlhUXVl
cnlFeHAgbV9leHByZXNzaW9uOworICAgIGJvb2wgbV9yZXN1bHQ7Cit9OworCitlbnVtIFN0eWxl
U2hhcmluZ0JlaGF2aW9yIHsKKyAgICBBbGxvd1N0eWxlU2hhcmluZywKKyAgICBEaXNhbGxvd1N0
eWxlU2hhcmluZywKK307CisKKy8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4g
bWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKKy8vIGFyZSBpbnRlcnByZXRlZCBh
Y2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBv
bmx5CisvLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCisKK2VudW0gUnVs
ZU1hdGNoaW5nQmVoYXZpb3IgeworICAgIE1hdGNoQWxsUnVsZXMsCisgICAgTWF0Y2hBbGxSdWxl
c0V4Y2x1ZGluZ1NNSUwsCisgICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCit9OworCitjbGFz
cyBQc2V1ZG9TdHlsZVJlcXVlc3QgeworcHVibGljOgorICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQ
c2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxi
YXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCisgICAgICAgIDogcHNldWRvSWQocHNldWRv
SWQpCisgICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQorICAgICAgICAsIHNj
cm9sbGJhcihzY3JvbGxiYXIpCisgICAgeworICAgIH0KKworICAgIFBzZXVkb0lkIHBzZXVkb0lk
OworICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKKyAgICBSZW5kZXJTY3JvbGxiYXIq
IHNjcm9sbGJhcjsKK307CisKK2NsYXNzIE1hdGNoUmVxdWVzdCB7CitwdWJsaWM6CisgICAgTWF0
Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxz
ZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2
aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNO
b3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKKyAgICAgICAgLCBp
bmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKKyAgICAgICAgLCBzY29wZShzY29w
ZSkKKyAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0K
KyAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OworICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXM7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7CisgICAgY29uc3QgU2VsZWN0
b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OworfTsKKwor
Ly8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBi
YXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCitjbGFzcyBTdHlsZVJlc29sdmVy
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3R5bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wg
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKKyAgICB+U3R5bGVSZXNvbHZlcigpOworCisgICAg
Ly8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9y
IHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9yIGxvb2t1cHMuCisgICAg
dm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50Kik7CisgICAgdm9pZCBwb3BQYXJlbnRFbGVt
ZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRv
d1Jvb3QqKTsKKyAgICB2b2lkIHBvcFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCop
OworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxl
SG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWlu
ZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJlc29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUs
IGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNjb3BlKTsgfQorI2VuZGlmCisKKyAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmluZ0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJp
bmcsCisgICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVy
UmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CisKKyAgICB2b2lkIGtleWZyYW1lU3R5bGVz
Rm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBSZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYp
OworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVs
ZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdl
SW5kZXgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1l
bnQoKTsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOwor
CisgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9j
dW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxlKCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudFN0eWxlKCk7IH0KKyAgICBS
ZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpOyB9CisgICAgRWxlbWVudCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3Rh
dGUuZWxlbWVudCgpOyB9CisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1
bWVudDsgfQorICAgIFN0eWxlU2NvcGVSZXNvbHZlciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsg
cmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsgfQorICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Tm9kZSgpOyB9CisKKyAgICAvLyBGSVhNRTog
SXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNo
ZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3RvciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KKyAg
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCisgICAg
dm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVj
dG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBy
dWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKyAgICBjb25zdCBEb2N1bWVudFJ1bGVT
ZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKworI2lmIEVOQUJM
RShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIFN0eWxlU2NvcGVSZXNv
bHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCisgICAgeworI2lmIEVOQUJMRShTVFlMRV9TQ09Q
RUQpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxl
ZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkgfHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6
c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFi
bGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAg
ICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7Cisj
ZW5kaWYKKyAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgICAgICBtX3Njb3Bl
UmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVTY29wZVJlc29sdmVyKCkpOworICAgICAgICBy
ZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOworICAgIH0KKyNlbmRpZgorCitwcml2YXRlOgor
ICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgIFJlbmRlclN0eWxlKiBsb2NhdGVT
aGFyZWRTdHlsZSgpOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVT
ZXQoUnVsZVNldCopOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RS
dWxlcygpOworICAgIE5vZGUqIGxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNp
Z25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7CisgICAgU3R5bGVkRWxlbWVudCogZmluZFNp
YmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVuc2lnbmVkJiBjb3VudCkgY29uc3Q7CisgICAg
Ym9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisg
ICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJT
dHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBLZXlmcmFtZVZhbHVlJik7CisKK3B1YmxpYzoK
KyAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhh
dCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgKG9yIGEgcHNldWRvLWVsZW1lbnQpLgorICAg
IGVudW0gQ1NTUnVsZUZpbHRlciB7CisgICAgICAgIFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8
IDEsCisgICAgICAgIEF1dGhvckNTU1J1bGVzICAgICAgPSAxIDw8IDIsCisgICAgICAgIEVtcHR5
Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCisgICAgICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAx
IDw8IDQsCisgICAgICAgIEFsbEJ1dEVtcHR5Q1NTUnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8
IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5DU1NSdWxlcywKKyAgICAgICAgQWxsQ1NTUnVs
ZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMgfCBFbXB0eUNTU1J1bGVzLAorICAgIH07
CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gc3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVu
dCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7CisgICAg
UGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVu
dCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVs
ZXMpOworCisgICAgLy8gR2l2ZW4gYSBDU1Mga2V5d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxs
IHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICAgIC8v
IHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZh
dWx0IChtZWRpdW0pLgorICAgIHN0YXRpYyBmbG9hdCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1l
bnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKKworICAg
IC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJu
IGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFuZCA3LgorICAgIHN0YXRpYyBpbnQgbGVnYWN5
Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhl
ZERlZmF1bHRTaXplKTsKKworcHVibGljOgorICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUo
Q1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5kZXJTdHlsZSopOworCisgICAgdm9pZCBhcHBs
eVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKworICAg
IHZvaWQgdXBkYXRlRm9udCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5n
cyopOworCisgICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQg
c3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVt
Rm9yRm9udEZpemUpOworCisgICAgdm9pZCBzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mLCBm
bG9hdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXpl
RnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBSZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0
ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKTsKKworcHVi
bGljOgorICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCk7CisKKyAgICBzdGF0aWMgYm9vbCBjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVl
Kik7CisgICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUq
LCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2UpIGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxl
Y3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0
b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIGhhc1NlbGVj
dG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworCisgICAgQ1NTRm9u
dFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5n
ZXQoKTsgfQorI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgVmlld3BvcnRT
dHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0
U3R5bGVSZXNvbHZlci5nZXQoKTsgfQorI2VuZGlmCisKKyAgICB2b2lkIGFkZFZpZXdwb3J0RGVw
ZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQp
OworICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJl
dHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQor
ICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFk
ZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+KTsKKworICAgIGJv
b2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKworICAgIGJvb2wg
dXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCku
c2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQorICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkg
Y29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsg
fQorICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVT
ZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KKworICAgIHN0YXRpYyBib29s
IGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxl
KiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBv
dXRPcGVyYXRpb25zKTsKKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGll
c0NhY2hlKCk7CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisgICAgYm9vbCBjcmVhdGVGaWx0
ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Cisj
aWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIFN0eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NW
YWx1ZSopOworICAgIFN0eWxlU2hhZGVyKiBjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21W
YWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOworICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYpOworICAg
IFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3Qg
U3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRl
clBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBu
YW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlv
bj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KFdlYktpdENT
U0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIHZv
aWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5kaWYKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZv
aWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKKyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShD
U1NfRklMVEVSUykKKworICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworcHJpdmF0
ZToKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBp
ZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hh
bmdlZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0
eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNo
YW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7CisgICAgdm9pZCBj
aGVja0ZvclRleHRTaXplQWRqdXN0KCk7CisKKyAgICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJl
bmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1l
bnQqKTsKKworICAgIHN0cnVjdCBSdWxlUmFuZ2UgeworICAgICAgICBSdWxlUmFuZ2UoaW50JiBm
aXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RS
dWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQorICAgICAgICBpbnQm
IGZpcnN0UnVsZUluZGV4OworICAgICAgICBpbnQmIGxhc3RSdWxlSW5kZXg7CisgICAgfTsKKwor
ICAgIHN0cnVjdCBNYXRjaFJhbmdlcyB7CisgICAgICAgIE1hdGNoUmFuZ2VzKCkgOiBmaXJzdFVB
UnVsZSgtMSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUoLTEpLCBsYXN0QXV0aG9y
UnVsZSgtMSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUoLTEpIHsgfQorICAgICAg
ICBpbnQgZmlyc3RVQVJ1bGU7CisgICAgICAgIGludCBsYXN0VUFSdWxlOworICAgICAgICBpbnQg
Zmlyc3RBdXRob3JSdWxlOworICAgICAgICBpbnQgbGFzdEF1dGhvclJ1bGU7CisgICAgICAgIGlu
dCBmaXJzdFVzZXJSdWxlOworICAgICAgICBpbnQgbGFzdFVzZXJSdWxlOworICAgICAgICBSdWxl
UmFuZ2UgVUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVQVJ1bGUsIGxhc3RV
QVJ1bGUpOyB9CisgICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFuZ2UoKSB7IHJldHVybiBS
dWxlUmFuZ2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7IH0KKyAgICAgICAgUnVs
ZVJhbmdlIHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVc2VyUnVsZSwg
bGFzdFVzZXJSdWxlKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXMg
eworICAgICAgICBNYXRjaGVkUHJvcGVydGllcygpOworICAgICAgICB+TWF0Y2hlZFByb3BlcnRp
ZXMoKTsKKyAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikg
Y29uc3Q7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcHJvcGVy
dGllczsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAg
ICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKKyAgICAgICAgICAgICAgICB1bnNpZ25l
ZCB3aGl0ZWxpc3RUeXBlIDogMjsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBVc2Vk
IHRvIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6ZWQgc2luY2Ugd2UgY29t
cHV0ZSB0aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICAg
IHZvaWQqIHBvc3NpYmx5UGFkZGVkTWVtYmVyOworICAgICAgICB9OworICAgIH07CisKKyAgICBz
dHJ1Y3QgTWF0Y2hSZXN1bHQgeworICAgICAgICBNYXRjaFJlc3VsdCgpIDogaXNDYWNoZWFibGUo
dHJ1ZSkgeyB9CisgICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcywgNjQ+IG1hdGNoZWRQ
cm9wZXJ0aWVzOworICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1hdGNoZWRSdWxlczsK
KyAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBib29sIGlzQ2FjaGVhYmxlOwor
ICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3Vs
dCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1
bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVy
dHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyAgICB2b2lkIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworCisgICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1h
dGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOworICAgIHZvaWQgbWF0Y2hV
QVJ1bGVzKE1hdGNoUmVzdWx0Jik7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQm
LCBSdWxlU2V0Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3Vs
dCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JS
dWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0
Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKworICAg
IHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdl
Jik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJl
cXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlz
dChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdl
Jik7CisKKyAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYpIGNvbnN0
OworICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZvaWQgc29ydEFuZFRyYW5zZmVy
TWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CisKKyAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0
IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0
b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RD
cm9zc0JvdW5kYXJ5KTsKKyAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2Vs
ZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKyAgICB2b2lk
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBjb25zdCBFbGVtZW50
Kik7CisgICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7CisjaWYgRU5BQkxFKENTU19WQVJJ
QUJMRVMpCisgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCisjZW5kaWYKKyAgICAgICAgSGln
aFByaW9yaXR5UHJvcGVydGllcywKKyAgICAgICAgTG93UHJpb3JpdHlQcm9wZXJ0aWVzCisgICAg
fTsKKyAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFw
cGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBib29sIGltcG9ydGFudCwg
aW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KTsKKyAgICB0
ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5UHJvcGVy
dGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqLCBib29s
IGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9
IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAg
dm9pZCByZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwgVmVjdG9yPHN0
ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpOworI2Vu
ZGlmCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVy
dHlJRCk7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIHN0YXRpYyBib29sIGlzVmFsaWRD
dWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOworI2VuZGlmCisgICAgdm9pZCBtYXRjaFBh
Z2VSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNG
aXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVs
ZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVj
dG9yPFN0eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwg
Y29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgU2V0dGluZ3MqIGRvY3VtZW50U2V0dGluZ3Mo
KSB7IHJldHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9CisKKyAgICBib29sIGlzTGVmdFBh
Z2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBpc1JpZ2h0UGFnZShpbnQgcGFnZUlu
ZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgpOyB9CisgICAgYm9vbCBp
c0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBTdHJpbmcgcGFnZU5hbWUoaW50
IHBhZ2VJbmRleCkgY29uc3Q7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzIG1fcnVsZVNldHM7CisK
KyAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJlZlB0cjxTdHlsZVJ1bGVL
ZXlmcmFtZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKKyAgICBLZXlmcmFtZXNSdWxlTWFwIG1fa2V5
ZnJhbWVzUnVsZU1hcDsKKworcHVibGljOgorICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NQcm9wZXJ0
eUlELCBSZWZQdHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA7CisjaWYgRU5B
QkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgIHR5cGVkZWYgSGFzaE1hcDxGaWx0
ZXJPcGVyYXRpb24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZT4gPiBQZW5kaW5n
U1ZHRG9jdW1lbnRNYXA7CisjZW5kaWYKKworICAgIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoU3RhdGUpOworICAgIHB1YmxpYzoKKyAgICAgICAgU3RhdGUoKQor
ICAgICAgICA6IG1fZWxlbWVudCgwKQorICAgICAgICAsIG1fc3R5bGVkRWxlbWVudCgwKQorICAg
ICAgICAsIG1fcGFyZW50Tm9kZSgwKQorICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKKyAgICAg
ICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmco
MCkKKyAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQorICAgICAgICAsIG1fcHNldWRv
U3R5bGVSZXF1ZXN0KE5PUFNFVURPKQorICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShOb3RJ
bnNpZGVMaW5rKQorICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZhbHNl
KQorICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQorICAgICAg
ICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQorICAgICAgICAsIG1f
YXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCisgICAgICAgICwgbV9hcHBseVByb3Bl
cnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAg
ICAgICAgLCBtX2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQorI2VuZGlmCisgICAgICAgICwgbV9s
aW5lSGVpZ2h0VmFsdWUoMCkKKyAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxzZSkKKyAgICAgICAg
LCBtX2hhc1VBQXBwZWFyYW5jZShmYWxzZSkKKyAgICAgICAgLCBtX2JhY2tncm91bmREYXRhKEJh
Y2tncm91bmRGaWxsTGF5ZXIpIHsgfQorCisgICAgcHVibGljOgorICAgICAgICB2b2lkIGluaXRF
bGVtZW50KEVsZW1lbnQqKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3Vt
ZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVk
b1N0eWxlUmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdp
b24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAg
ICAgIERvY3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC0+ZG9jdW1l
bnQoKTsgfQorICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVt
ZW50OyB9CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJl
dHVybiBtX3N0eWxlZEVsZW1lbnQ7IH0KKyAgICAgICAgdm9pZCBzZXRTdHlsZShQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KKyAgICAgICAgUmVuZGVy
U3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQorICAgICAgICBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVh
c2UoKTsgfQorCisgICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOwor
ICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBt
X3J1bGVMaXN0LnJlbGVhc2UoKTsgfQorCisgICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBh
cmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KKyAgICAgICAgdm9pZCBz
ZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9
IHBhcmVudFN0eWxlOyB9CisgICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVt
ZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KKworICAgICAg
ICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBt
X3JlZ2lvbkZvclN0eWxpbmc7IH0KKyAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29s
IGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7
IH0KKyAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1l
T3JpZ2luT25seTsgfQorICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0
eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9CisgICAg
ICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1l
bnRMaW5rU3RhdGU7IH0KKyAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQo
KSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQorICAgICAg
ICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsg
bV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CisgICAgICAgIGJv
b2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KKyAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hl
Y2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICAgICAgU2VsZWN0b3JDaGVj
a2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KKyAgICAgICAgCisgICAg
ICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBt
X2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAgICAgdm9pZCBz
ZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5
UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9CisgICAgICAgIGJvb2wgYXBw
bHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGU7IH0KKyAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlu
a1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxl
OyB9CisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzKCkgeyByZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9CisjaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAm
IHBlbmRpbmdTVkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdEb2N1bWVudHM7IH0K
KyNlbmRpZgorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgdm9pZCBzZXRIYXNQZW5k
aW5nU2hhZGVycyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVuZGluZ1NoYWRlcnMg
PSBoYXNQZW5kaW5nU2hhZGVyczsgfQorICAgICAgICBib29sIGhhc1BlbmRpbmdTaGFkZXJzKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQorI2VuZGlmCisKKyAgICAgICAg
dm9pZCBzZXRMaW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1fbGluZUhlaWdodFZh
bHVlID0gdmFsdWU7IH0KKyAgICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRWYWx1ZSgpIHsgcmV0
dXJuIG1fbGluZUhlaWdodFZhbHVlOyB9CisgICAgICAgIHZvaWQgc2V0Rm9udERpcnR5KGJvb2wg
aXNEaXJ0eSkgeyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KKyAgICAgICAgYm9vbCBmb250RGly
dHkoKSBjb25zdCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQorCisgICAgICAgIHZvaWQgY2FjaGVC
b3JkZXJBbmRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGJvb2wgaGFzVUFBcHBlYXJhbmNlKCkgY29u
c3QgeyByZXR1cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KKyAgICAgICAgQm9yZGVyRGF0YSBib3Jk
ZXJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9CisgICAgICAgIEZpbGxMYXll
ciBiYWNrZ3JvdW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZERhdGE7IH0KKyAg
ICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5k
Q29sb3I7IH0KKworICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlv
bigpIHsgcmV0dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9CisgICAgICAgIGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9wYXJl
bnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAgICAgdm9pZCBzZXRGb250RGVzY3Jp
cHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9mb250RGly
dHkgfD0gbV9zdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAg
ICAgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0
Wm9vbShmKTsgfQorICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX2Zv
bnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgICAgIHZvaWQg
c2V0VGV4dFNpemVBZGp1c3QoYm9vbCBiKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRl
eHRTaXplQWRqdXN0KGIpOyB9CisgICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01v
ZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGluZ01vZGUo
d3JpdGluZ01vZGUpOyB9CisgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmll
bnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4
dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KKworICAgICAgICBWZWN0b3I8Y29uc3Qg
UnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9
CisgICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9t
YXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAg
ICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZpZXcsIHRo
ZXNlIG1lbWJlcgorICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZlciB3ZSBz
aG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCisgICAgICAgIC8vIHRoZXNlIHZhcmlhYmxlcy4K
KyAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IG1fc3R5bGU7CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVkRWxlbWVudDsKKyAgICAg
ICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9w
YXJlbnRTdHlsZTsKKyAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHlsZTsKKyAg
ICAgICAgCisgICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgICAg
ICBib29sIG1fc2FtZU9yaWdpbk9ubHk7CisgICAgICAgIFBzZXVkb1N0eWxlUmVxdWVzdCBtX3Bz
ZXVkb1N0eWxlUmVxdWVzdDsKKworICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3Rh
dGU7CisKKyAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKKworICAg
ICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOworCisgICAgICAgIFNlbGVj
dG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7CisKKyAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBo
b2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKKyAgICAgICAgLy8g
YW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgorICAgICAgICBW
ZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7CisgICAgICAgIFJlZlB0
cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKworICAgICAgICBib29sIG1fYXBwbHlQ
cm9wZXJ0eVRvUmVndWxhclN0eWxlOworICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlz
aXRlZExpbmtTdHlsZTsKKworICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCBtX3BlbmRp
bmdJbWFnZVByb3BlcnRpZXM7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICBib29s
IG1faGFzUGVuZGluZ1NoYWRlcnM7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYm
IEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCBtX3BlbmRpbmdTVkdE
b2N1bWVudHM7CisjZW5kaWYKKyAgICAgICAgQ1NTVmFsdWUqIG1fbGluZUhlaWdodFZhbHVlOwor
ICAgICAgICBib29sIG1fZm9udERpcnR5OworCisgICAgICAgIGJvb2wgbV9oYXNVQUFwcGVhcmFu
Y2U7CisgICAgICAgIEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOworICAgICAgICBGaWxsTGF5ZXIg
bV9iYWNrZ3JvdW5kRGF0YTsKKyAgICAgICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CisgICAg
fTsKKworICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRBdmFpbGFibGUoKSB7IHJl
dHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOyB9CisKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IHN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJ
bWFnZVZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBnZW5lcmF0ZWRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSopOworI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gc2V0T3JQ
ZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0VmFsdWUqKTsKKyNlbmRp
ZgorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENT
U1Byb3BlcnR5SUQsIENTU0N1cnNvckltYWdlVmFsdWUqKTsKKworICAgIGJvb2wgYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUoKTsgfQorICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZSgpOyB9CisKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0ludExlbmd0aChDU1NQcmlt
aXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91Ymxl
IG11bHRpcGxpZXIgPSAxKTsKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0Zsb2F0TGVuZ3Ro
KENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxl
LCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworCisgICAgQ1NTVG9TdHlsZU1hcCogc3R5bGVNYXAo
KSB7IHJldHVybiAmbV9zdHlsZU1hcDsgfQorICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGlu
c3BlY3RvckNTU09NV3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7
IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJu
IG1fc3RhdGUuZm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24m
IHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Rm9udERlc2Ny
aXB0aW9uKCk7IH0KKyAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnREZXNjcmlwdGlvbihmb250
RGVzY3JpcHRpb24pOyB9CisgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5zZXRa
b29tKGYpOyB9CisgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5z
ZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgdm9pZCBzZXRUZXh0U2l6ZUFkanVzdChib29sIGIp
IHsgbV9zdGF0ZS5zZXRUZXh0U2l6ZUFkanVzdChiKTsgfQorICAgIHZvaWQgc2V0V3JpdGluZ01v
ZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9zdGF0ZS5zZXRXcml0aW5nTW9kZSh3cml0
aW5nTW9kZSk7IH0KKyAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24g
dGV4dE9yaWVudGF0aW9uKSB7IG1fc3RhdGUuc2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRh
dGlvbik7IH0KKyAgICAKKyAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdElu
Zm8qKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgc3RhdGljIFJlbmRlclN0eWxlKiBzX3N0
eWxlTm90WWV0QXZhaWxhYmxlOworCisgICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQo
KTsKKworcHJpdmF0ZToKKyAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRF
bGVtZW50KikgY29uc3Q7CisKKyAgICB2b2lkIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCwg
Q1NTVmFsdWUqKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgdm9pZCBhcHBseVNWR1Byb3BlcnR5
KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7CisjZW5kaWYKKworICAgIFBhc3NSZWZQdHI8U3R5
bGVJbWFnZT4gbG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSopOworICAgIHZvaWQg
bG9hZFBlbmRpbmdJbWFnZXMoKTsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlTWF0Y2hl
ZFByb3BlcnRpZXNIYXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzKiwgdW5zaWduZWQgc2l6ZSk7
CisgICAgc3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIHsKKyAgICAgICAgdm9pZCBy
ZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7CisgICAgICAgIFZlY3Rv
cjxNYXRjaGVkUHJvcGVydGllcz4gbWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIE1hdGNoUmFu
Z2VzIHJhbmdlczsKKyAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiByZW5kZXJTdHlsZTsKKyAg
ICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBwYXJlbnRSZW5kZXJTdHlsZTsKKyAgICB9OworICAg
IGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsKKyAgICB2b2lkIGFk
ZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSwgdW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsK
KworICAgIC8vIEV2ZXJ5IE4gYWRkaXRpb25zIHRvIHRoZSBtYXRjaGVkIGRlY2xhcmF0aW9uIGNh
Y2hlIHRyaWdnZXIgYSBzd2VlcCB3aGVyZSBlbnRyaWVzIGhvbGRpbmcKKyAgICAvLyB0aGUgbGFz
dCByZWZlcmVuY2UgdG8gYSBzdHlsZSBkZWNsYXJhdGlvbiBhcmUgZ2FyYmFnZSBjb2xsZWN0ZWQu
CisgICAgdm9pZCBzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZl
cj4qKTsKKworICAgIGJvb2wgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNw
bGl0U3RyaW5nJikgY29uc3Q7CisgICAgYm9vbCBzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2Fs
U3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHVu
c2lnbmVkIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwOwor
CisgICAgdHlwZWRlZiBIYXNoTWFwPHVuc2lnbmVkLCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRl
bT4gTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKKworICAgIFRpbWVyPFN0eWxlUmVzb2x2ZXI+IG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXI7CisKKyAgICBPd25QdHI8TWVkaWFRdWVyeUV2
YWx1YXRvcj4gbV9tZWRpdW07CisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3Jvb3REZWZhdWx0
U3R5bGU7CisKKyAgICBEb2N1bWVudCogbV9kb2N1bWVudDsKKyAgICBTZWxlY3RvckZpbHRlciBt
X3NlbGVjdG9yRmlsdGVyOworCisgICAgYm9vbCBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlczsK
KworICAgIFJlZlB0cjxDU1NGb250U2VsZWN0b3I+IG1fZm9udFNlbGVjdG9yOworICAgIFZlY3Rv
cjxPd25QdHI8TWVkaWFRdWVyeVJlc3VsdD4gPiBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHM7CisKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIFJlZlB0
cjxWaWV3cG9ydFN0eWxlUmVzb2x2ZXI+IG1fdmlld3BvcnRTdHlsZVJlc29sdmVyOworI2VuZGlm
CisKKyAgICBjb25zdCBTdHlsZUJ1aWxkZXImIG1fc3R5bGVCdWlsZGVyOworCisgICAgT3duUHRy
PFN0eWxlU2NvcGVSZXNvbHZlcj4gbV9zY29wZVJlc29sdmVyOworICAgIENTU1RvU3R5bGVNYXAg
bV9zdHlsZU1hcDsKKyAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzIG1faW5zcGVjdG9yQ1NTT01X
cmFwcGVyczsKKworICAgIFN0YXRlIG1fc3RhdGU7CisKKyAgICBmcmllbmQgY2xhc3MgU3R5bGVC
dWlsZGVyOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hlZFByb3BlcnRp
ZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9y
IT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOwor
ICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRj
aFJhbmdlcyYpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hSYW5nZXMm
LCBjb25zdCBNYXRjaFJhbmdlcyYpOworfTsKKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6
aGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nICZhdHRyaWJ1dGVOYW1l
KSBjb25zdAoreworICAgIEFTU0VSVCghYXR0cmlidXRlTmFtZS5pc0VtcHR5KCkpOworICAgIHJl
dHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJblJ1bGVzLmNvbnRhaW5zKGF0dHJpYnV0
ZU5hbWUuaW1wbCgpKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0
b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmIGNsYXNzVmFsdWUpIGNvbnN0Cit7CisgICAg
QVNTRVJUKCFjbGFzc1ZhbHVlLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVh
dHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFzc1ZhbHVlLmltcGwoKSk7Cit9CisK
K2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWlj
U3RyaW5nJiBpZFZhbHVlKSBjb25zdAoreworICAgIEFTU0VSVCghaWRWYWx1ZS5pc0VtcHR5KCkp
OworICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhp
ZFZhbHVlLmltcGwoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IFN0eWxlUmVzb2x2ZXJfaApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmgJKHJldmlzaW9uIDE0NDg5MykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50
UnVsZUNvbGxlY3Rvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOSw2ODIgKzE5LDEwNiBAQAogICoK
ICAqLwogCi0jaWZuZGVmIFN0eWxlUmVzb2x2ZXJfaAotI2RlZmluZSBTdHlsZVJlc29sdmVyX2gK
KyNpZm5kZWYgRWxlbWVudFJ1bGVDb2xsZWN0b3JfaAorI2RlZmluZSBFbGVtZW50UnVsZUNvbGxl
Y3Rvcl9oCiAKLSNpbmNsdWRlICJDU1NSdWxlTGlzdC5oIgotI2luY2x1ZGUgIkNTU1RvU3R5bGVN
YXAuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudFJ1bGVT
ZXRzLmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5oIgotI2luY2x1ZGUgIkxp
bmtIYXNoLmgiCi0jaW5jbHVkZSAiTWVkaWFRdWVyeUV4cC5oIgotI2luY2x1ZGUgIlJlbmRlclN0
eWxlLmgiCi0jaW5jbHVkZSAiUnVsZUZlYXR1cmUuaCIKLSNpbmNsdWRlICJSdWxlU2V0LmgiCi0j
aW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlNjcm9sbFR5cGVz
LmgiCisjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgogI2luY2x1ZGUgIlNlbGVjdG9y
Q2hlY2tlci5oIgotI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVJ
bmhlcml0ZWREYXRhLmgiCi0jaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCi0jaW5jbHVk
ZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQotI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3VtZW50VmFsdWUuaCIKLSNlbmRp
ZgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNp
bmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCiAjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgogI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+
Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKLWVudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1G
b3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUgfTsKLQotY2xhc3MgQ1NTQ3Vy
c29ySW1hZ2VWYWx1ZTsKLWNsYXNzIENTU0ZvbnRTZWxlY3RvcjsKLWNsYXNzIENTU0ZvbnRGYWNl
OwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlOwotY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsK
LWNsYXNzIENTU0ltYWdlU2V0VmFsdWU7Ci1jbGFzcyBDU1NJbWFnZVZhbHVlOwotY2xhc3MgQ1NT
UGFnZVJ1bGU7Ci1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKLWNsYXNzIENTU1Byb3BlcnR5Owog
Y2xhc3MgQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBDU1NTZWxlY3RvcjsKLWNsYXNzIENTU1N0eWxlU2hl
ZXQ7Ci1jbGFzcyBDU1NWYWx1ZTsKLWNsYXNzIENvbnRhaW5lck5vZGU7Ci1jbGFzcyBDdXN0b21G
aWx0ZXJPcGVyYXRpb247Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXI7Ci1jbGFzcyBDdXN0
b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OwotY2xhc3MgRG9jdW1lbnQ7Ci1jbGFzcyBFbGVtZW50Owot
Y2xhc3MgRnJhbWU7Ci1jbGFzcyBGcmFtZVZpZXc7Ci1jbGFzcyBLVVJMOwotY2xhc3MgS2V5ZnJh
bWVMaXN0OwotY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKLWNsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7
Ci1jbGFzcyBOb2RlOworY2xhc3MgRG9jdW1lbnRSdWxlU2V0czsKIGNsYXNzIFJlbmRlclJlZ2lv
bjsKLWNsYXNzIFJlbmRlclNjcm9sbGJhcjsKIGNsYXNzIFJ1bGVEYXRhOwogY2xhc3MgUnVsZVNl
dDsKLWNsYXNzIFNldHRpbmdzOwotY2xhc3MgU3RhdGljQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBTdHls
ZUJ1aWxkZXI7CitjbGFzcyBTZWxlY3RvckZpbHRlcjsKIGNsYXNzIFN0eWxlU2NvcGVSZXNvbHZl
cjsKLWNsYXNzIFN0eWxlSW1hZ2U7Ci1jbGFzcyBTdHlsZUtleWZyYW1lOwotY2xhc3MgU3R5bGVQ
ZW5kaW5nSW1hZ2U7Ci1jbGFzcyBTdHlsZVByb3BlcnR5U2V0OwotY2xhc3MgU3R5bGVSdWxlOwot
I2lmIEVOQUJMRShTSEFET1dfRE9NKQotY2xhc3MgU3R5bGVSdWxlSG9zdDsKLSNlbmRpZgotY2xh
c3MgU3R5bGVSdWxlS2V5ZnJhbWVzOwotY2xhc3MgU3R5bGVSdWxlUGFnZTsKLWNsYXNzIFN0eWxl
UnVsZVJlZ2lvbjsKLWNsYXNzIFN0eWxlU2hhZGVyOwotY2xhc3MgU3R5bGVTaGVldDsKLWNsYXNz
IFN0eWxlU2hlZXRMaXN0OwotY2xhc3MgU3R5bGVkRWxlbWVudDsKLWNsYXNzIFZpZXdwb3J0U3R5
bGVSZXNvbHZlcjsKLWNsYXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOwotY2xhc3MgV2ViS2l0Q1NT
U2hhZGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOwotCi1jbGFzcyBN
ZWRpYVF1ZXJ5UmVzdWx0IHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVz
dWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgTWVkaWFRdWVyeVJl
c3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKLSAgICAgICAgOiBt
X2V4cHJlc3Npb24oZXhwcikKLSAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCi0gICAgewotICAg
IH0KLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsK
LQotICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNzaW9uOwotICAgIGJvb2wgbV9yZXN1bHQ7Ci19
OwotCi1lbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHsKLSAgICBBbGxvd1N0eWxlU2hhcmluZywK
LSAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKLX07Ci0KLS8vIE1hdGNoT25seVVzZXJBZ2VudFJ1
bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKLS8vIGFy
ZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHls
ZSwgYW5kIHN0eWxlZCBvbmx5Ci0vLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVs
ZXMuCi0KLWVudW0gUnVsZU1hdGNoaW5nQmVoYXZpb3IgewotICAgIE1hdGNoQWxsUnVsZXMsCi0g
ICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwsCi0gICAgTWF0Y2hPbmx5VXNlckFnZW50UnVs
ZXMsCi19OwotCi1jbGFzcyBQc2V1ZG9TdHlsZVJlcXVlc3QgewotcHVibGljOgotICAgIFBzZXVk
b1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxi
YXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCi0gICAgICAgIDog
cHNldWRvSWQocHNldWRvSWQpCi0gICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0
KQotICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxiYXIpCi0gICAgewotICAgIH0KLQotICAgIFBz
ZXVkb0lkIHBzZXVkb0lkOwotICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKLSAgICBS
ZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKLX07Ci0KLWNsYXNzIE1hdGNoUmVxdWVzdCB7Ci1w
dWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVt
cHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3Rv
ckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAgICA6IHJ1bGVTZXQocnVsZVNl
dCkKLSAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAg
ICAgLCBzY29wZShzY29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JB
dEJvdW5kYXJ5KSB7IH0KLSAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OwotICAgIGNvbnN0IGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXM7Ci0gICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7Ci0g
ICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJv
dW5kYXJ5OwotfTsKLQotLy8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEg
Z2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCi1jbGFz
cyBTdHlsZVJlc29sdmVyIHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVy
KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgU3R5bGVSZXNvbHZlcihE
b2N1bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKLSAgICB+U3R5bGVSZXNv
bHZlcigpOwotCi0gICAgLy8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93
IHN0eWxlIHNlbGVjdG9yIHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9y
IGxvb2t1cHMuCi0gICAgdm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50Kik7Ci0gICAgdm9p
ZCBwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICB2b2lkIHB1c2hQYXJlbnRTaGFkb3dS
b290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSAgICB2b2lkIHBvcFBhcmVudFNoYWRvd1Jvb3QoY29u
c3QgU2hhZG93Um9vdCopOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIHZvaWQgYWRkSG9z
dFJ1bGUoU3R5bGVSdWxlSG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2lu
LCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJlc29sdmVyKCktPmFk
ZEhvc3RSdWxlKHJ1bGUsIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNjb3BlKTsgfQotI2Vu
ZGlmCi0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVu
dCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmluZ0JlaGF2aW9yID0g
QWxsb3dTdHlsZVNoYXJpbmcsCi0gICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2aW9yID0gTWF0Y2hB
bGxSdWxlcywgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7Ci0KLSAgICB2b2lk
IGtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBSZW5kZXJTdHlsZSos
IEtleWZyYW1lTGlzdCYpOwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5
bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVG
b3JQYWdlKGludCBwYWdlSW5kZXgpOwotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGRlZmF1
bHRTdHlsZUZvckVsZW1lbnQoKTsKLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZv
clRleHQoVGV4dCopOwotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxl
Rm9yRG9jdW1lbnQoRG9jdW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7Ci0KLSAgICBSZW5k
ZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxlKCk7IH0KLSAgICBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudFN0
eWxlKCk7IH0KLSAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0
dXJuIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpOyB9Ci0gICAgRWxlbWVudCogZWxlbWVudCgp
IHsgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpOyB9Ci0gICAgRG9jdW1lbnQqIGRvY3VtZW50KCkg
eyByZXR1cm4gbV9kb2N1bWVudDsgfQotICAgIFN0eWxlU2NvcGVSZXNvbHZlciogc2NvcGVSZXNv
bHZlcigpIGNvbnN0IHsgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsgfQotICAgIGJvb2wg
aGFzUGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Tm9kZSgpOyB9Ci0K
LSAgICAvLyBGSVhNRTogSXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9ydWxlU2V0cy5hcHBl
bmRBdXRob3JTdHlsZVNoZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3RvciBTdHlsZVJzb2x2
ZXIgZnVydGhlci4KLSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTA4ODkwCi0gICAgdm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJz
dE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7Ci0KLSAgICBEb2N1
bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KLSAgICBjb25z
dCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7
IH0KLQotI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQotICAg
IFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCi0gICAgewotI2lmIEVO
QUJMRShTVFlMRV9TQ09QRUQpCi0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgICAgIEFTU0VS
VChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkgfHwgUnVudGltZUVu
YWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOwotI2Vsc2UKLSAgICAgICAgQVNT
RVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKLSNlbmRp
ZgotI2Vsc2UKLSAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RP
TUVuYWJsZWQoKSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCi0gICAg
ICAgICAgICBtX3Njb3BlUmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVTY29wZVJlc29sdmVy
KCkpOwotICAgICAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOwotICAgIH0KLSNlbmRp
ZgotCi1wcml2YXRlOgotICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOwotICAgIFJlbmRl
clN0eWxlKiBsb2NhdGVTaGFyZWRTdHlsZSgpOwotICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCopOwotICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc0hvc3RSdWxlcygpOwotICAgIE5vZGUqIGxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVu
dCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7Ci0gICAgU3R5bGVk
RWxlbWVudCogZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVuc2lnbmVkJiBjb3Vu
dCkgY29uc3Q7Ci0gICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVu
dCopIGNvbnN0OwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JLZXlmcmFt
ZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBLZXlmcmFtZVZhbHVl
Jik7Ci0KLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2ZSBiYWNrIHRoZSBz
ZXQgb2YgcnVsZXMgdGhhdCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgKG9yIGEgcHNldWRv
LWVsZW1lbnQpLgotICAgIGVudW0gQ1NTUnVsZUZpbHRlciB7Ci0gICAgICAgIFVBQW5kVXNlckNT
U1J1bGVzICAgPSAxIDw8IDEsCi0gICAgICAgIEF1dGhvckNTU1J1bGVzICAgICAgPSAxIDw8IDIs
Ci0gICAgICAgIEVtcHR5Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCi0gICAgICAgIENyb3NzT3Jp
Z2luQ1NTUnVsZXMgPSAxIDw8IDQsCi0gICAgICAgIEFsbEJ1dEVtcHR5Q1NTUnVsZXMgPSBVQUFu
ZFVzZXJDU1NSdWxlcyB8IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5DU1NSdWxlcywKLSAg
ICAgICAgQWxsQ1NTUnVsZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMgfCBFbXB0eUNT
U1J1bGVzLAotICAgIH07Ci0gICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gc3R5bGVSdWxlc0Zv
ckVsZW1lbnQoRWxlbWVudCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlD
U1NSdWxlcyk7Ci0gICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRvU3R5bGVSdWxlc0Zv
ckVsZW1lbnQoRWxlbWVudCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFs
bEJ1dEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgLy8gR2l2ZW4gYSBDU1Mga2V5d29yZCBpbiB0aGUg
cmFuZ2UgKHh4LXNtYWxsIHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBmdW5jdGlvbiB3aWxs
IHJldHVybgotICAgIC8vIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQgcmVsYXRpdmUgdG8g
dGhlIHVzZXIncyBkZWZhdWx0IChtZWRpdW0pLgotICAgIHN0YXRpYyBmbG9hdCBmb250U2l6ZUZv
cktleXdvcmQoRG9jdW1lbnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1
bHRTaXplKTsKLQotICAgIC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVsLCB0aGlzIGZ1bmN0
aW9uIHdpbGwgcmV0dXJuIGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFuZCA3LgotICAgIHN0
YXRpYyBpbnQgbGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9v
bCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKLQotcHVibGljOgotICAgIHZvaWQgYXBwbHlQ
cm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5kZXJTdHlsZSopOwot
Ci0gICAgdm9pZCBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NT
VmFsdWUqKTsKLQotICAgIHZvaWQgdXBkYXRlRm9udCgpOwotICAgIHZvaWQgaW5pdGlhbGl6ZUZv
bnRTdHlsZShTZXR0aW5ncyopOwotCi0gICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZy
b21TcGVjaWZpZWRTaXplKERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29s
dXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplID0g
VXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUpOwotCi0gICAgdm9pZCBzZXRGb250U2l6ZShGb250
RGVzY3JpcHRpb24mLCBmbG9hdCBzaXplKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgZmxvYXQg
Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBSZW5kZXJTdHlsZSos
IGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9v
bVJ1bGVzKTsKLQotcHVibGljOgotICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCk7Ci0KLSAgICBz
dGF0aWMgYm9vbCBjb2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENT
U1ByaW1pdGl2ZVZhbHVlKik7Ci0gICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NT
UHJpbWl0aXZlVmFsdWUqLCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2UpIGNvbnN0OwotCi0g
ICAgYm9vbCBoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OwotICAg
IGJvb2wgaGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLSAg
ICBib29sIGhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0
OwotCi0gICAgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBt
X2ZvbnRTZWxlY3Rvci5nZXQoKTsgfQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04p
Ci0gICAgVmlld3BvcnRTdHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKSB7IHJl
dHVybiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci5nZXQoKTsgfQotI2VuZGlmCi0KLSAgICB2b2lk
IGFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhw
KiwgYm9vbCByZXN1bHQpOwotICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJp
ZXMoKSBjb25zdCB7IHJldHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRz
LmlzRW1wdHkoKTsgfQotICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7
Ci0KLSAgICB2b2lkIGFkZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFt
ZXM+KTsKLQotICAgIGJvb2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50
KTsKLQotICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bGVT
ZXRzLmZlYXR1cmVzKCkuc2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQotICAgIGJvb2wgdXNlc0Zp
cnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNG
aXJzdExpbmVSdWxlczsgfQotICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7
IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KLQot
ICAgIHN0YXRpYyBib29sIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFs
dWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zv
cm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKLSAgICAKLSAgICB2b2lkIGludmFsaWRhdGVN
YXRjaGVkUHJvcGVydGllc0NhY2hlKCk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0gICAg
Ym9vbCBjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHls
ZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0
T3BlcmF0aW9ucyk7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIFN0eWxlU2hhZGVyKiBz
dHlsZVNoYWRlcihDU1NWYWx1ZSopOwotICAgIFN0eWxlU2hhZGVyKiBjYWNoZWRPclBlbmRpbmdT
dHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOwotICAgIGJvb2wgcGFy
c2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9tRmlsdGVyUGFyYW1l
dGVyTGlzdCYpOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1
c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKik7Ci0gICAg
UGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQ
YXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQYXNzUmVm
UHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIo
Y29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3Rv
bUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJl
ZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3Vz
dG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5l
U3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0
ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJW
YWx1ZSopOwotICAgIHZvaWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7Ci0jZW5kaWYKLSNpZiBFTkFC
TEUoU1ZHKQotICAgIHZvaWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKLSNlbmRpZgotI2Vu
ZGlmIC8vIEVOQUJMRShDU1NfRklMVEVSUykKLQotICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJj
ZXMoKTsKLQotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZh
dWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250
IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5
Q2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLSAgICB2b2lk
IGNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSk7Ci0gICAgdm9pZCBjaGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0KLSAgICB2b2lkIGFkanVz
dFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUsIEVsZW1lbnQqKTsKLQotICAgIHN0cnVjdCBSdWxlUmFuZ2UgewotICAgICAgICBS
dWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RS
dWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsg
fQotICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OwotICAgICAgICBpbnQmIGxhc3RSdWxlSW5k
ZXg7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNYXRjaFJhbmdlcyB7Ci0gICAgICAgIE1hdGNoUmFu
Z2VzKCkgOiBmaXJzdFVBUnVsZSgtMSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUo
LTEpLCBsYXN0QXV0aG9yUnVsZSgtMSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUo
LTEpIHsgfQotICAgICAgICBpbnQgZmlyc3RVQVJ1bGU7Ci0gICAgICAgIGludCBsYXN0VUFSdWxl
OwotICAgICAgICBpbnQgZmlyc3RBdXRob3JSdWxlOwotICAgICAgICBpbnQgbGFzdEF1dGhvclJ1
bGU7Ci0gICAgICAgIGludCBmaXJzdFVzZXJSdWxlOwotICAgICAgICBpbnQgbGFzdFVzZXJSdWxl
OwotICAgICAgICBSdWxlUmFuZ2UgVUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmly
c3RVQVJ1bGUsIGxhc3RVQVJ1bGUpOyB9Ci0gICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFu
Z2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7
IH0KLSAgICAgICAgUnVsZVJhbmdlIHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2Uo
Zmlyc3RVc2VyUnVsZSwgbGFzdFVzZXJSdWxlKTsgfQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0
Y2hlZFByb3BlcnRpZXMgewotICAgICAgICBNYXRjaGVkUHJvcGVydGllcygpOwotICAgICAgICB+
TWF0Y2hlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8U3R5bGVQcm9w
ZXJ0eVNldD4gcHJvcGVydGllczsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgc3RydWN0
IHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKLSAgICAgICAg
ICAgICAgICB1bnNpZ25lZCB3aGl0ZWxpc3RUeXBlIDogMjsKLSAgICAgICAgICAgIH07Ci0gICAg
ICAgICAgICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6
ZWQgc2luY2Ugd2UgY29tcHV0ZSB0aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVj
dC4KLSAgICAgICAgICAgIHZvaWQqIHBvc3NpYmx5UGFkZGVkTWVtYmVyOwotICAgICAgICB9Owot
ICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hSZXN1bHQgewotICAgICAgICBNYXRjaFJlc3VsdCgp
IDogaXNDYWNoZWFibGUodHJ1ZSkgeyB9Ci0gICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGll
cywgNjQ+IG1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+
IG1hdGNoZWRSdWxlczsKLSAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBib29s
IGlzQ2FjaGVhYmxlOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVy
dGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0
eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpN
YXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsK
LSAgICB2b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOwotCi0gICAgdm9pZCBt
YXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwot
ICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBtYXRjaFVBUnVs
ZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7Ci0gICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1h
dGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFVzZXJS
dWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0
Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
OwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKLQotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1
ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lv
bihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1
ZXN0JiwgUnVsZVJhbmdlJik7Ci0KLSAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBS
dWxlRGF0YSYpIGNvbnN0OwotICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOwotICAgIHZvaWQg
c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7Ci0KLSAgICBib29sIHJ1
bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBz
ZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNo
ZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0
b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVt
ZW50KTsKLSAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQm
LCBjb25zdCBFbGVtZW50Kik7Ci0gICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7Ci0jaWYg
RU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCi0jZW5k
aWYKLSAgICAgICAgSGlnaFByaW9yaXR5UHJvcGVydGllcywKLSAgICAgICAgTG93UHJpb3JpdHlQ
cm9wZXJ0aWVzCi0gICAgfTsKLSAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFz
cz4KLSAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBi
b29sIGltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0
ZWRPbmx5KTsKLSAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLSAgICB2
b2lkIGFwcGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBT
dHlsZVJ1bGUqLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5
V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0jaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCi0gICAgdm9pZCByZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1Zh
bHVlKiwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhw
cmVzc2lvbnMpOwotI2VuZGlmCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJv
cGVydHkoQ1NTUHJvcGVydHlJRCk7Ci0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIHN0YXRp
YyBib29sIGlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOwotI2VuZGlmCi0g
ICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVm
dFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwotICAgIHZv
aWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRS
dWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9v
bCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7Ci0gICAgU2V0dGluZ3MqIGRv
Y3VtZW50U2V0dGluZ3MoKSB7IHJldHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9Ci0KLSAg
ICBib29sIGlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7Ci0gICAgYm9vbCBpc1JpZ2h0
UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgp
OyB9Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKLSAgICBTdHJp
bmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRleCkgY29uc3Q7Ci0KLSAgICBEb2N1bWVudFJ1bGVTZXRz
IG1fcnVsZVNldHM7Ci0KLSAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJl
ZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKLSAgICBLZXlmcmFt
ZXNSdWxlTWFwIG1fa2V5ZnJhbWVzUnVsZU1hcDsKK2NsYXNzIFN0YXRpY0NTU1J1bGVMaXN0Owog
CitjbGFzcyBFbGVtZW50UnVsZUNvbGxlY3RvciB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBIYXNo
TWFwPENTU1Byb3BlcnR5SUQsIFJlZlB0cjxDU1NWYWx1ZT4gPiBQZW5kaW5nSW1hZ2VQcm9wZXJ0
eU1hcDsKLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCi0gICAgdHlwZWRl
ZiBIYXNoTWFwPEZpbHRlck9wZXJhdGlvbiosIFJlZlB0cjxXZWJLaXRDU1NTVkdEb2N1bWVudFZh
bHVlPiA+IFBlbmRpbmdTVkdEb2N1bWVudE1hcDsKLSNlbmRpZgotCi0gICAgY2xhc3MgU3RhdGUg
ewotICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdGF0ZSk7Ci0gICAgcHVibGljOgotICAg
ICAgICBTdGF0ZSgpCi0gICAgICAgIDogbV9lbGVtZW50KDApCi0gICAgICAgICwgbV9zdHlsZWRF
bGVtZW50KDApCi0gICAgICAgICwgbV9wYXJlbnROb2RlKDApCi0gICAgICAgICwgbV9wYXJlbnRT
dHlsZSgwKQotICAgICAgICAsIG1fcm9vdEVsZW1lbnRTdHlsZSgwKQorICAgIEVsZW1lbnRSdWxl
Q29sbGVjdG9yKFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6OlN0YXRlJiBzdGF0ZSkKKyAgICAgICAgOiBtX3N0YXRlKHN0YXRlKQorICAgICAgICAsIG1f
cnVsZVNldHMoc3R5bGVSZXNvbHZlci0+cnVsZVNldHMoKSkKKyAgICAgICAgLCBtX3NlbGVjdG9y
RmlsdGVyKHN0eWxlUmVzb2x2ZXItPnNlbGVjdG9yRmlsdGVyKCkpCisgICAgICAgICwgbV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzKHN0eWxlUmVzb2x2ZXItPmluc3BlY3RvckNTU09NV3JhcHBlcnMo
KSkKKyAgICAgICAgLCBtX3Njb3BlUmVzb2x2ZXIoc3R5bGVSZXNvbHZlci0+c2NvcGVSZXNvbHZl
cigpKQorICAgICAgICAsIG1faXNQcmludFN0eWxlKGZhbHNlKQogICAgICAgICAsIG1fcmVnaW9u
Rm9yU3R5bGluZygwKQotICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCiAgICAgICAg
ICwgbV9wc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pCi0gICAgICAgICwgbV9lbGVtZW50TGlu
a1N0YXRlKE5vdEluc2lkZUxpbmspCi0gICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9u
UG9pbnQoZmFsc2UpCi0gICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoZmFs
c2UpCisgICAgICAgICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkKICAgICAgICAgLCBtX21vZGUo
U2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKLSAgICAgICAgLCBtX2FwcGx5UHJvcGVy
dHlUb1JlZ3VsYXJTdHlsZSh0cnVlKQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRl
ZExpbmtTdHlsZShmYWxzZSkKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgICwgbV9o
YXNQZW5kaW5nU2hhZGVycyhmYWxzZSkKLSNlbmRpZgotICAgICAgICAsIG1fbGluZUhlaWdodFZh
bHVlKDApCi0gICAgICAgICwgbV9mb250RGlydHkoZmFsc2UpCi0gICAgICAgICwgbV9oYXNVQUFw
cGVhcmFuY2UoZmFsc2UpCi0gICAgICAgICwgbV9iYWNrZ3JvdW5kRGF0YShCYWNrZ3JvdW5kRmls
bExheWVyKSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVt
ZW50Kik7Ci0gICAgICAgIHZvaWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1l
bnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVl
c3QmID0gUHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKSwgUmVuZGVyUmVnaW9uKiByZWdpb25G
b3JTdHlsaW5nID0gMCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLQotICAgICAgICBEb2N1bWVu
dCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KLSAg
ICAgICAgRWxlbWVudCogZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotICAg
ICAgICBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9zdHls
ZWRFbGVtZW50OyB9Ci0gICAgICAgIHZvaWQgc2V0U3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gc3R5bGUpIHsgbV9zdHlsZSA9IHN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KLSAgICAgICAgUGFzc1JlZlB0cjxS
ZW5kZXJTdHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KLQot
ICAgICAgICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFz
c1JlZlB0cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5y
ZWxlYXNlKCk7IH0KLQotICAgICAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9wYXJlbnROb2RlOyB9Ci0gICAgICAgIHZvaWQgc2V0UGFyZW50U3R5
bGUoUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHls
ZTsgfQotICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBt
X3BhcmVudFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkg
Y29uc3QgeyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxlOyB9Ci0KLSAgICAgICAgY29uc3QgUmVu
ZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JT
dHlsaW5nOyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmln
aW5Pbmx5KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAg
IGJvb2wgaXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7
IH0KLSAgICAgICAgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3Qo
KSBjb25zdCB7IHJldHVybiBtX3BzZXVkb1N0eWxlUmVxdWVzdDsgfQotICAgICAgICBFSW5zaWRl
TGluayBlbGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRl
OyB9Ci0gICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRF
bGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFm
ZmVjdGVkQnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQotICAgICAgICBib29sIGVsZW1lbnRB
ZmZlY3RlZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlD
bGFzc1J1bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUg
bW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBt
b2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNl
dEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIHZvaWQgc2V0QXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlID0gaXNBcHBseTsgfQotICAgICAgICBib29sIGFwcGx5UHJvcGVydHlU
b1JlZ3VsYXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0
eWxlOyB9Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsgfQotICAgICAg
ICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCYgcGVuZGluZ0ltYWdlUHJvcGVydGllcygpIHsgcmV0
dXJuIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllczsgfQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKLSAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwJiBwZW5kaW5nU1ZH
RG9jdW1lbnRzKCkgeyByZXR1cm4gbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOyB9Ci0jZW5kaWYKLSNp
ZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIHZvaWQgc2V0SGFzUGVuZGluZ1NoYWRlcnMo
Ym9vbCBoYXNQZW5kaW5nU2hhZGVycykgeyBtX2hhc1BlbmRpbmdTaGFkZXJzID0gaGFzUGVuZGlu
Z1NoYWRlcnM7IH0KLSAgICAgICAgYm9vbCBoYXNQZW5kaW5nU2hhZGVycygpIGNvbnN0IHsgcmV0
dXJuIG1faGFzUGVuZGluZ1NoYWRlcnM7IH0KLSNlbmRpZgotCi0gICAgICAgIHZvaWQgc2V0TGlu
ZUhlaWdodFZhbHVlKENTU1ZhbHVlKiB2YWx1ZSkgeyBtX2xpbmVIZWlnaHRWYWx1ZSA9IHZhbHVl
OyB9Ci0gICAgICAgIENTU1ZhbHVlKiBsaW5lSGVpZ2h0VmFsdWUoKSB7IHJldHVybiBtX2xpbmVI
ZWlnaHRWYWx1ZTsgfQotICAgICAgICB2b2lkIHNldEZvbnREaXJ0eShib29sIGlzRGlydHkpIHsg
bV9mb250RGlydHkgPSBpc0RpcnR5OyB9Ci0gICAgICAgIGJvb2wgZm9udERpcnR5KCkgY29uc3Qg
eyByZXR1cm4gbV9mb250RGlydHk7IH0KLQotICAgICAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFj
a2dyb3VuZCgpOwotICAgICAgICBib29sIGhhc1VBQXBwZWFyYW5jZSgpIGNvbnN0IHsgcmV0dXJu
IG1faGFzVUFBcHBlYXJhbmNlOyB9Ci0gICAgICAgIEJvcmRlckRhdGEgYm9yZGVyRGF0YSgpIGNv
bnN0IHsgcmV0dXJuIG1fYm9yZGVyRGF0YTsgfQotICAgICAgICBGaWxsTGF5ZXIgYmFja2dyb3Vu
ZERhdGEoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmREYXRhOyB9Ci0gICAgICAgIENvbG9y
IGJhY2tncm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9Ci0K
LSAgICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVy
biBtX3N0eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQotICAgICAgICBjb25zdCBGb250RGVzY3Jp
cHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fcGFyZW50U3R5bGUtPmZv
bnREZXNjcmlwdGlvbigpOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5
bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgICAgIHZvaWQg
c2V0Wm9vbShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFpvb20oZik7IH0K
LSAgICAgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldFRleHRTaXpl
QWRqdXN0KGJvb2wgYikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0U2l6ZUFkanVz
dChiKTsgfQotICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdN
b2RlKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2Rl
KTsgfQotICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4
dE9yaWVudGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRhdGlv
bih0ZXh0T3JpZW50YXRpb24pOyB9Ci0KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwg
MzI+JiBtYXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxlczsgfQotICAgICAgICB2
b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1bGVz
LmFwcGVuZChydWxlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhN
RShidWcgMTA4NTYzKTogdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1iZXIK
LSAgICAgICAgLy8gdmFyaWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFkZCBt
ZXRob2RzIHRvIGFjY2VzcwotICAgICAgICAvLyB0aGVzZSB2YXJpYWJsZXMuCi0gICAgICAgIEVs
ZW1lbnQqIG1fZWxlbWVudDsKLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3N0eWxlOwot
ICAgICAgICBTdHlsZWRFbGVtZW50KiBtX3N0eWxlZEVsZW1lbnQ7Ci0gICAgICAgIENvbnRhaW5l
ck5vZGUqIG1fcGFyZW50Tm9kZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7
Ci0gICAgICAgIFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAg
ICAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3Nh
bWVPcmlnaW5Pbmx5OwotICAgICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJl
cXVlc3Q7Ci0KLSAgICAgICAgRUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRlOwotCi0gICAg
ICAgIGJvb2wgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7Ci0KLSAgICAgICAgYm9vbCBt
X2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsKLQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6
Ok1vZGUgbV9tb2RlOworICAgICAgICAsIG1fY2FuVXNlRmFzdFJlamVjdChtX3NlbGVjdG9yRmls
dGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkpCisgICAgICAg
ICwgbV9iZWhhdmlvckF0Qm91bmRhcnkoU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3Vu
ZGFyeSkKKyAgICAgICAgLCBtX21hdGNoaW5nVUFSdWxlcyhmYWxzZSkgeyB9CisKKyAgICB2b2lk
IG1hdGNoQWxsUnVsZXMoYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIGJvb2wgaW5jbHVk
ZVNNSUxQcm9wZXJ0aWVzKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcygpOworICAgIHZvaWQgbWF0
Y2hBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNl
clJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworCisgICAgdm9pZCBzZXRNb2RlKFNlbGVj
dG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICB2b2lkIHNldFBz
ZXVkb1N0eWxlUmVxdWVzdChjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHJlcXVlc3QpIHsgbV9w
c2V1ZG9TdHlsZVJlcXVlc3QgPSByZXF1ZXN0OyB9CisgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25s
eShib29sIGYpIHsgbV9zYW1lT3JpZ2luT25seSA9IGY7IH0gCisgICAgdm9pZCBzZXRSZWdpb25G
b3JTdHlsaW5nKFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykgeyBtX3JlZ2lvbkZvclN0
eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOyB9CisgICAgdm9pZCBzZXRNZWRpdW0oY29uc3QgTWVk
aWFRdWVyeUV2YWx1YXRvciogbWVkaXVtKSB7IG1faXNQcmludFN0eWxlID0gbWVkaXVtLT5tZWRp
YVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpOyB9CiAKLSAgICAgICAgLy8gQSBidWZmZXIgdXNl
ZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKLSAgICAg
ICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgotICAg
ICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7Ci0gICAgICAg
IFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKyAgICBib29sIGhhc0FueU1h
dGNoaW5nUnVsZXMoUnVsZVNldCopOwogCi0gICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGU7Ci0gICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVzdWx0KCk7Cisg
ICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gbWF0Y2hlZFJ1bGVMaXN0KCk7CiAKLSAgICAgICAg
UGVuZGluZ0ltYWdlUHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOwotI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFkZXJzOwotI2Vu
ZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgICAgICBQZW5k
aW5nU1ZHRG9jdW1lbnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlmCi0gICAgICAg
IENTU1ZhbHVlKiBtX2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2ZvbnREaXJ0eTsK
LQotICAgICAgICBib29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAgICAgICBCb3JkZXJEYXRhIG1f
Ym9yZGVyRGF0YTsKLSAgICAgICAgRmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7Ci0gICAgICAg
IENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMgUmVuZGVyU3R5
bGUqIHN0eWxlTm90WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJs
ZTsgfQotCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENTU1Byb3BlcnR5
SUQsIENTU1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNoZWRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAgIFBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQs
IENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAg
ICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0
eUlELCBDU1NJbWFnZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NDdXJzb3JJbWFn
ZVZhbHVlKik7Ci0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7IH0KLSAgICBi
b29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0
YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAgc3RhdGljIExl
bmd0aCBjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSos
IFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7Ci0gICAgc3Rh
dGljIExlbmd0aCBjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRl
clN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsK
LQotICAgIENTU1RvU3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5bGVNYXA7IH0K
LSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkgeyBy
ZXR1cm4gbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0
aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNjcmlwdGlvbigp
OyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7
IHJldHVybiBtX3N0YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgdm9pZCBzZXRG
b250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsg
bV9zdGF0ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQotICAgIHZvaWQg
c2V0Wm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZvaWQgc2V0RWZm
ZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAg
IHZvaWQgc2V0VGV4dFNpemVBZGp1c3QoYm9vbCBiKSB7IG1fc3RhdGUuc2V0VGV4dFNpemVBZGp1
c3QoYik7IH0KLSAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2Rl
KSB7IG1fc3RhdGUuc2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAgdm9pZCBzZXRU
ZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX3N0YXRl
LnNldFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9Ci0gICAgCi0gICAgdm9pZCBy
ZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAgCiBwcml2YXRl
OgotICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKKyAgICBE
b2N1bWVudCogZG9jdW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmRvY3VtZW50KCk7IH0KKyAgICB2
b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJv
b2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKIAotICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3Jv
dW5kKCk7Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5
bGVkRWxlbWVudCopIGNvbnN0OwotCi0gICAgdm9pZCBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5
SUQsIENTU1ZhbHVlKik7Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIHZvaWQgYXBwbHlTVkdQcm9w
ZXJ0eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQor
ICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKFJ1bGVTZXQqKTsKKyAgICB2b2lkIG1hdGNoU2hhZG93RGlz
dHJpYnV0ZWRSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzLCBTdHlsZVJlc29sdmVyOjpSdWxl
UmFuZ2UmKTsKKyAgICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaEhvc3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVz
KTsKICNlbmRpZgogCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdl
KFN0eWxlUGVuZGluZ0ltYWdlKik7Ci0gICAgdm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOwotCi0g
ICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXMqLCB1bnNpZ25lZCBzaXplKTsKLSAgICBzdHJ1Y3QgTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZUl0ZW0gewotICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKLSAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRj
aGVkUHJvcGVydGllczsKLSAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHJlbmRlclN0eWxlOwotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IHBhcmVudFJlbmRlclN0eWxlOwotICAgIH07Ci0gICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXND
YWNoZUl0ZW0qIGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBj
b25zdCBNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hl
KGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNp
Z25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOwotCi0gICAgLy8gRXZlcnkgTiBhZGRpdGlv
bnMgdG8gdGhlIG1hdGNoZWQgZGVjbGFyYXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJl
IGVudHJpZXMgaG9sZGluZwotICAgIC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRl
Y2xhcmF0aW9uIGFyZSBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgICB2b2lkIHN3ZWVwTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopOworICAgIHZvaWQgY29sbGVjdE1h
dGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdl
Jik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJl
cXVlc3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1
ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7CisgICAgYm9vbCBydWxlTWF0Y2hlcyhj
b25zdCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYpOwog
Ci0gICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJp
bmcmKSBjb25zdDsKLSAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFm
ZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0OwotCi0gICAgdW5zaWduZWQg
bV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXA7Ci0KLSAgICB0
eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtPiBNYXRj
aGVkUHJvcGVydGllc0NhY2hlOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUgbV9tYXRjaGVk
UHJvcGVydGllc0NhY2hlOwotCi0gICAgVGltZXI8U3R5bGVSZXNvbHZlcj4gbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lcjsKLQotICAgIE93blB0cjxNZWRpYVF1ZXJ5RXZhbHVhdG9y
PiBtX21lZGl1bTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fcm9vdERlZmF1bHRTdHlsZTsK
LQotICAgIERvY3VtZW50KiBtX2RvY3VtZW50OwotICAgIFNlbGVjdG9yRmlsdGVyIG1fc2VsZWN0
b3JGaWx0ZXI7Ci0KLSAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzOwotCi0gICAg
UmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7Ci0gICAgVmVjdG9yPE93blB0
cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0
czsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAgUmVmUHRyPFZpZXdw
b3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXI7Ci0jZW5kaWYKKyAgICB2
b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKKyAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcygpOwogCi0gICAgY29uc3QgU3R5bGVCdWlsZGVyJiBtX3N0eWxlQnVpbGRlcjsKKyAgICB2
b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKik7CisgICAgdm9pZCBjbGVhck1hdGNo
ZWRSdWxlcygpOwogCi0gICAgT3duUHRyPFN0eWxlU2NvcGVSZXNvbHZlcj4gbV9zY29wZVJlc29s
dmVyOwotICAgIENTU1RvU3R5bGVNYXAgbV9zdHlsZU1hcDsKLSAgICBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKLQotICAgIFN0YXRlIG1fc3RhdGU7Ci0K
LSAgICBmcmllbmQgY2xhc3MgU3R5bGVCdWlsZGVyOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9y
PT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOwot
ICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25z
dCBNYXRjaGVkUHJvcGVydGllcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qg
TWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdlcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJh
dG9yIT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdlcyYpOworICAgIFN0YXRp
Y0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICAKK3ByaXZhdGU6CisgICAg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9jdW1lbnRSdWxlU2V0
cyYgbV9ydWxlU2V0czsKKyAgICBTZWxlY3RvckZpbHRlciYgbV9zZWxlY3RvckZpbHRlcjsKKyAg
ICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7CisgICAg
U3R5bGVTY29wZVJlc29sdmVyKiBtX3Njb3BlUmVzb2x2ZXI7CisKKyAgICBib29sIG1faXNQcmlu
dFN0eWxlOworICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgIFBzZXVk
b1N0eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKKyAgICBib29sIG1fc2FtZU9yaWdp
bk9ubHk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKyAgICBib29sIG1fY2Fu
VXNlRmFzdFJlamVjdDsKKyAgICBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBt
X2JlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBib29sIG1fbWF0Y2hpbmdVQVJ1bGVzOworCisgICAg
T3duUHRyPFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiA+IG1fbWF0Y2hlZFJ1bGVzOworCisg
ICAgLy8gT3V0cHV0LgorICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsK
KyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKIH07CiAKLWlubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0
cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWF0dHJpYnV0ZU5hbWUu
aXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxl
cy5jb250YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxl
UmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5nJiBjbGFzc1Zh
bHVlKSBjb25zdAotewotICAgIEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkpOwotICAgIHJl
dHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NW
YWx1ZS5pbXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3Rv
ckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKLXsKLSAgICBBU1NFUlQo
IWlkVmFsdWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlk
c0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAKLSNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKKyNlbmRpZiAvLyBFbGVtZW50UnVs
ZUNvbGxlY3Rvcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3Iu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5j
cHAJKHJldmlzaW9uIDE0NDg5MykJKGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2
ZXIuY3BwOjE0NDg5MykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MjA3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDQt
MjAwNSBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gKGtkZUBjYXJld29sZi5jb20pCisgKiBDb3B5cmln
aHQgKEMpIDIwMDYsIDIwMDcgTmljaG9sYXMgU2hhbmtzICh3ZWJraXRAbmlja3NoYW5rcy5jb20p
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIw
MTEsIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDA3IEFsZXhleSBQcm9za3VyeWFrb3YgPGFwQHdlYmtpdC5vcmc+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcsIDIwMDggRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KKyAqIENv
cHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJpZ2h0IChjKSAyMDEx
LCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorCisjaW5jbHVk
ZSAiQXR0cmlidXRlLmgiCisjaW5jbHVkZSAiQ1NTQm9yZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJD
U1NDYWxjdWxhdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oIgor
I2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIkNTU0ZvbnRGYWNl
UnVsZS5oIgorI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU0xpbmVC
b3hDb250YWluVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NQYWdlUnVsZS5oIgorI2luY2x1ZGUgIkNT
U1BhcnNlci5oIgorI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZhbHVlTWFwcGluZ3MuaCIKKyNpbmNs
dWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCisjaW5jbHVkZSAiQ1NTUmVmbGVjdFZhbHVlLmgiCisj
aW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKKyNp
bmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NTdXBwb3J0c1J1bGUuaCIKKyNp
bmNsdWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVMaXN0
LmgiCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisjaW5jbHVkZSAiQ1NTVmFyaWFibGVWYWx1
ZS5oIgorI2VuZGlmCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJDYWxjdWxh
dGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ29udGVudERhdGEuaCIKKyNpbmNsdWRlICJDb250ZXh0
RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiQ291bnRlckNvbnRl
bnQuaCIKKyNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKKyNpbmNsdWRlICJG
b250RmVhdHVyZVZhbHVlLmgiCisjaW5jbHVkZSAiRm9udFZhbHVlLmgiCisjaW5jbHVkZSAiRnJh
bWUuaCIKKyNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5o
IgorI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgorI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFByb2dyZXNz
RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1M
VGV4dEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQuaCIKKyNpbmNsdWRl
ICJJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJLZXlmcmFtZUxpc3QuaCIK
KyNpbmNsdWRlICJMaW5rSGFzaC5oIgorI2luY2x1ZGUgIkxvY2FsZVRvU2NyaXB0TWFwcGluZy5o
IgorI2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCisjaW5jbHVkZSAiTWF0cml4M0RUcmFuc2Zvcm1P
cGVyYXRpb24uaCIKKyNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNs
dWRlICJNZWRpYUxpc3QuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCisjaW5j
bHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQu
aCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGFpci5oIgorI2luY2x1ZGUgIlBlcnNw
ZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgorI2lu
Y2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKKyNpbmNsdWRlICJSZW5k
ZXJTY3JvbGxiYXIuaCIKKyNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVtZS5oIgorI2luY2x1
ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNp
bmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAiUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9u
LmgiCisjaW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9u
cy5oIgorI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgorI2luY2x1ZGUgIlNjYWxlVHJh
bnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRl
ICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5j
bHVkZSAiU2hhZG93RGF0YS5oIgorI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKKyNpbmNsdWRlICJT
aGFkb3dWYWx1ZS5oIgorI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCisj
aW5jbHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIlN0eWxlQnVpbGRl
ci5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZUdlbmVy
YXRlZEltYWdlLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5kaW5nSW1hZ2UuaCIKKyNpbmNsdWRlICJT
dHlsZVByb3BlcnR5U2V0LmgiCisjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0eVNob3J0aGFuZC5oIgor
I2luY2x1ZGUgIlN0eWxlUnVsZS5oIgorI2luY2x1ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgorI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
CisjaW5jbHVkZSAiVGV4dC5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisj
aW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiVXNlckFn
ZW50U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKKyNp
bmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCisjaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3Ry
dW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lUnVsZS5oIgorI2luY2x1
ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25S
dWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuaCIKKyNpbmNsdWRlICJX
ZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKKyNpbmNsdWRlICJYTUxOYW1lcy5oIgorI2luY2x1ZGUg
PHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL01lbW9y
eUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVu
dGF0aW9uVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyNpbmNsdWRlICJGaWx0
ZXJPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NGaWx0ZXJWYWx1ZS5oIgorI2VuZGlm
CisKKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCisjaW5jbHVkZSAiRGFzaGJvYXJkUmVn
aW9uLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiQ2FjaGVkU1ZHRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgorI2luY2x1
ZGUgIlNWR0RvY3VtZW50LmgiCisjaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgorI2luY2x1ZGUgIlNW
R05hbWVzLmgiCisjaW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiV2ViS2l0
Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
CisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0
b21GaWx0ZXJDb25zdGFudHMuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJDdXN0
b21GaWx0ZXJQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJh
bWV0ZXIuaCIKKyNpbmNsdWRlICJTdHlsZUNhY2hlZFNoYWRlci5oIgorI2luY2x1ZGUgIlN0eWxl
Q3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgor
I2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZS5oIgorI2luY2x1ZGUgIldlYktpdENTU1NoYWRlclZhbHVlLmgiCisjZW5kaWYKKworI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQorI2luY2x1ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKKyNp
bmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShWSURF
T19UUkFDSykKKyNpbmNsdWRlICJXZWJWVFRFbGVtZW50LmgiCisjZW5kaWYKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlPD4gc3RydWN0IFNlcXVl
bmNlTWVtb3J5SW5zdHJ1bWVudGF0aW9uVHJhaXRzPGNvbnN0IFdlYkNvcmU6OlJ1bGVEYXRhKj4g
eworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJPiBzdGF0aWMgdm9pZCByZXBvcnRNZW1vcnlVc2Fn
ZShJLCBJLCBNZW1vcnlDbGFzc0luZm8mKSB7IH0KK307CisKK30KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCisjZGVmaW5lIEhBTkRMRV9JTkhF
UklUKHByb3AsIFByb3ApIFwKK2lmIChpc0luaGVyaXQpIHsgXAorICAgIG1fc3RhdGUuc3R5bGUo
KS0+c2V0IyNQcm9wKG1fc3RhdGUucGFyZW50U3R5bGUoKS0+cHJvcCgpKTsgXAorICAgIHJldHVy
bjsgXAorfQorCisjZGVmaW5lIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHByb3AsIFByb3Ap
IFwKK0hBTkRMRV9JTkhFUklUKHByb3AsIFByb3ApIFwKK2lmIChpc0luaXRpYWwpIHsgXAorICAg
IG1fc3RhdGUuc3R5bGUoKS0+c2V0IyNQcm9wKFJlbmRlclN0eWxlOjppbml0aWFsIyNQcm9wKCkp
OyBcCisgICAgcmV0dXJuOyBcCit9CisKK1JlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0
eWxlTm90WWV0QXZhaWxhYmxlOworCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmln
aHREZWNsYXJhdGlvbigpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQ
cm9wZXJ0eVNldD4sIGxlZnRUb1JpZ2h0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgp
KSk7CisgICAgaWYgKGxlZnRUb1JpZ2h0RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICBsZWZ0VG9S
aWdodERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7
CisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0RGVjbC5nZXQoKTsKK30KKworc3RhdGljIFN0eWxlUHJv
cGVydHlTZXQqIHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKQoreworICAgIERFRklORV9TVEFUSUNf
TE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVBy
b3BlcnR5U2V0OjpjcmVhdGUoKSkpOworICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHko
KSkKKyAgICAgICAgcmlnaHRUb0xlZnREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVj
dGlvbiwgQ1NTVmFsdWVSdGwpOworICAgIHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Cit9
CisKKworaW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5z
dXJlUnVsZUxpc3QoKQoreworICAgIGlmICghbV9ydWxlTGlzdCkKKyAgICAgICAgbV9ydWxlTGlz
dCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5n
ZXQoKTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVy
QW5kQmFja2dyb3VuZCgpCit7CisgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNB
cHBlYXJhbmNlKCk7CisgICAgaWYgKG1faGFzVUFBcHBlYXJhbmNlKSB7CisgICAgICAgIG1fYm9y
ZGVyRGF0YSA9IG1fc3R5bGUtPmJvcmRlcigpOworICAgICAgICBtX2JhY2tncm91bmREYXRhID0g
Km1fc3R5bGUtPmJhY2tncm91bmRMYXllcnMoKTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3Ig
PSBtX3N0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIFN0
eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigpCit7CisgICAgbV9lbGVtZW50ID0gMDsKKyAgICBt
X3N0eWxlZEVsZW1lbnQgPSAwOworICAgIG1fcGFyZW50U3R5bGUgPSAwOworICAgIG1fcGFyZW50
Tm9kZSA9IDA7CisgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gMDsKKyAgICBtX3J1bGVMaXN0ID0g
MDsKKyAgICBtX21hdGNoZWRSdWxlcy5jbGVhcigpOworICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVy
dGllcy5jbGVhcigpOworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICBtX2hhc1BlbmRpbmdT
aGFkZXJzID0gZmFsc2U7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJM
RShTVkcpCisgICAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzLmNsZWFyKCk7CisjZW5kaWYKK30KKwor
U3R5bGVSZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZG9jdW1lbnQsIGJvb2wgbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgIDogbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRk
aXRpb25zU2luY2VMYXN0U3dlZXAoMCkKKyAgICAsIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3
ZWVwVGltZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZSkKKyAgICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCisgICAgLCBtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcyhtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgLCBtX2ZvbnRTZWxlY3RvcihD
U1NGb250U2VsZWN0b3I6OmNyZWF0ZShkb2N1bWVudCkpCisjaWYgRU5BQkxFKENTU19ERVZJQ0Vf
QURBUFRBVElPTikKKyAgICAsIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyKFZpZXdwb3J0U3R5bGVS
ZXNvbHZlcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNlbmRpZgorICAgICwgbV9zdHlsZUJ1aWxkZXIo
U3R5bGVCdWlsZGVyOjpzaGFyZWRTdHlsZUJ1aWxkZXIoKSkKKyAgICAsIG1fc3R5bGVNYXAodGhp
cykKK3sKKyAgICBFbGVtZW50KiByb290ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOwor
CisgICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjppbml0RGVmYXVsdFN0eWxlKHJvb3QpOworCisg
ICAgLy8gY29uc3RydWN0IGRvY3VtZW50IHJvb3QgZWxlbWVudCBkZWZhdWx0IHN0eWxlLiB0aGlz
IGlzIG5lZWRlZAorICAgIC8vIHRvIGV2YWx1YXRlIG1lZGlhIHF1ZXJpZXMgdGhhdCBjb250YWlu
IHJlbGF0aXZlIGNvbnN0cmFpbnRzLCBsaWtlICJzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwZW0p
IgorICAgIC8vIFRoaXMgaXMgaGVyZSBpbnN0ZWFkIG9mIGNvbnN0cnVjdG9yLCBiZWNhdXNlIHdo
ZW4gY29uc3RydWN0b3IgaXMgcnVuLAorICAgIC8vIGRvY3VtZW50IGRvZXNuJ3QgaGF2ZSBkb2N1
bWVudEVsZW1lbnQKKyAgICAvLyBOT1RFOiB0aGlzIGFzc3VtZXMgdGhhdCBlbGVtZW50IHRoYXQg
Z2V0cyBwYXNzZWQgdG8gc3R5bGVGb3JFbGVtZW50IC1jYWxsCisgICAgLy8gaXMgYWx3YXlzIGZy
b20gdGhlIGRvY3VtZW50IHRoYXQgb3ducyB0aGUgc3R5bGUgc2VsZWN0b3IKKyAgICBGcmFtZVZp
ZXcqIHZpZXcgPSBkb2N1bWVudC0+dmlldygpOworICAgIGlmICh2aWV3KQorICAgICAgICBtX21l
ZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZpZXctPm1lZGlhVHlwZSgp
KSk7CisgICAgZWxzZQorICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5
RXZhbHVhdG9yKCJhbGwiKSk7CisKKyAgICBpZiAocm9vdCkKKyAgICAgICAgbV9yb290RGVmYXVs
dFN0eWxlID0gc3R5bGVGb3JFbGVtZW50KHJvb3QsIDAsIERpc2FsbG93U3R5bGVTaGFyaW5nLCBN
YXRjaE9ubHlVc2VyQWdlbnRSdWxlcyk7CisKKyAgICBpZiAobV9yb290RGVmYXVsdFN0eWxlICYm
IHZpZXcpCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0
b3Iodmlldy0+bWVkaWFUeXBlKCksIHZpZXctPmZyYW1lKCksIG1fcm9vdERlZmF1bHRTdHlsZS5n
ZXQoKSkpOworCisgICAgbV9ydWxlU2V0cy5yZXNldEF1dGhvclN0eWxlKCk7CisKKyAgICBEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbiA9IGRvY3VtZW50
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpOworICAgIG1fcnVsZVNldHMuaW5pdFVzZXJTdHlsZShz
dHlsZVNoZWV0Q29sbGVjdGlvbiwgKm1fbWVkaXVtLCAqdGhpcyk7CisKKyNpZiBFTkFCTEUoU1ZH
X0ZPTlRTKQorICAgIGlmIChkb2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpKSB7CisgICAgICAgIGNv
bnN0IEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj4mIHN2Z0ZvbnRGYWNlRWxlbWVudHMgPSBk
b2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpLT5zdmdGb250RmFjZUVsZW1lbnRzKCk7CisgICAgICAg
IEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHN2Z0Zv
bnRGYWNlRWxlbWVudHMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxTVkdGb250RmFjZUVs
ZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdmdGb250RmFjZUVsZW1lbnRzLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgIGZvbnRTZWxlY3RvcigpLT5hZGRGb250RmFj
ZVJ1bGUoKCppdCktPmZvbnRGYWNlUnVsZSgpKTsKKyAgICB9CisjZW5kaWYKKworICAgIGFwcGVu
ZEF1dGhvclN0eWxlU2hlZXRzKDAsIHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hY3RpdmVBdXRob3JT
dHlsZVNoZWV0cygpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBlbmRBdXRob3JTdHls
ZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNo
ZWV0PiA+JiBzdHlsZVNoZWV0cykKK3sKKyAgICBtX3J1bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxl
U2hlZXRzKGZpcnN0TmV3LCBzdHlsZVNoZWV0cywgbV9tZWRpdW0uZ2V0KCksIG1faW5zcGVjdG9y
Q1NTT01XcmFwcGVycywgZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIHRoaXMpOworICAgIGlm
IChkb2N1bWVudCgpLT5yZW5kZXJlcigpICYmIGRvY3VtZW50KCktPnJlbmRlcmVyKCktPnN0eWxl
KCkpCisgICAgICAgIGRvY3VtZW50KCktPnJlbmRlcmVyKCktPnN0eWxlKCktPmZvbnQoKS51cGRh
dGUoZm9udFNlbGVjdG9yKCkpOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikK
KyAgICB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKS0+cmVzb2x2ZSgpOworI2VuZGlmCit9CisKK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQorewor
ICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudHNQYXJlbnQgPSBwYXJlbnQtPnBhcmVudE9y
U2hhZG93SG9zdEVsZW1lbnQoKTsKKworICAgIC8vIFdlIGFyZSBub3QgYWx3YXlzIGludm9rZWQg
Y29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgc2NyaXB0IGV4ZWN1dGlvbiBjYW4gY2F1c2UgdXMg
dG8gZW50ZXIKKyAgICAvLyBzdHlsZSByZWNhbGMgaW4gdGhlIG1pZGRsZSBvZiB0cmVlIGJ1aWxk
aW5nLiBXZSBtYXkgYWxzbyBiZSBpbnZva2VkIGZyb20gc29tZXdoZXJlIHdpdGhpbiB0aGUgdHJl
ZS4KKyAgICAvLyBSZXNldCB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLCBvciBpZiB3ZSBzZWUgYSBu
ZXcgcm9vdCBlbGVtZW50LgorICAgIC8vIE90aGVyd2lzZSBqdXN0IHB1c2ggdGhlIG5ldyBwYXJl
bnQuCisgICAgaWYgKCFwYXJlbnRzUGFyZW50IHx8IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3Rh
Y2tJc0VtcHR5KCkpCisgICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIuc2V0dXBQYXJlbnRTdGFjayhw
YXJlbnQpOworICAgIGVsc2UKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5wdXNoUGFyZW50KHBh
cmVudCk7CisKKyAgICAvLyBOb3RlOiBXZSBtdXN0bid0IHNraXAgU2hhZG93Um9vdCBub2RlcyBm
b3IgdGhlIHNjb3BlIHN0YWNrLgorICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1f
c2NvcGVSZXNvbHZlci0+cHVzaChwYXJlbnQsIHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0Tm9k
ZSgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQq
IHBhcmVudCkKK3sKKyAgICAvLyBOb3RlIHRoYXQgd2UgbWF5IGdldCBpbnZva2VkIGZvciBzb21l
IHJhbmRvbSBlbGVtZW50cyBpbiBzb21lIHdhY2t5IGNhc2VzIGR1cmluZyBzdHlsZSByZXNvbHZl
LgorICAgIC8vIFBhdXNlIG1haW50YWluaW5nIHRoZSBzdGFjayBpbiB0aGlzIGNhc2UuCisgICAg
aWYgKG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQocGFyZW50KSkKKyAg
ICAgICAgbV9zZWxlY3RvckZpbHRlci5wb3BQYXJlbnQoKTsKKyAgICBpZiAobV9zY29wZVJlc29s
dmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnBvcChwYXJlbnQpOworfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRv
d1Jvb3QpCit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7CisgICAgaWYgKG1fc2Nv
cGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHNoYWRvd1Jvb3QsIHNo
YWRvd1Jvb3QtPmhvc3QoKSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50U2hh
ZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290KQoreworICAgIEFTU0VSVChzaGFk
b3dSb290LT5ob3N0KCkpOworICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2Nv
cGVSZXNvbHZlci0+cG9wKHNoYWRvd1Jvb3QpOworfQorCisvLyBUaGlzIGlzIGEgc2ltcGxpZmll
ZCBzdHlsZSBzZXR0aW5nIGZ1bmN0aW9uIGZvciBrZXlmcmFtZSBzdHlsZXMKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6YWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4g
cnVsZSkKK3sKKyAgICBBdG9taWNTdHJpbmcgcyhydWxlLT5uYW1lKCkpOworICAgIG1fa2V5ZnJh
bWVzUnVsZU1hcC5zZXQocy5pbXBsKCksIHJ1bGUpOworfQorCitTdHlsZVJlc29sdmVyOjp+U3R5
bGVSZXNvbHZlcigpCit7CisgICAgbV9mb250U2VsZWN0b3ItPmNsZWFyRG9jdW1lbnQoKTsKKwor
I2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgbV92aWV3cG9ydFN0eWxlUmVz
b2x2ZXItPmNsZWFyRG9jdW1lbnQoKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCit7Cisg
ICAgLy8gTG9vayBmb3IgY2FjaGUgZW50cmllcyBjb250YWluaW5nIGEgc3R5bGUgZGVjbGFyYXRp
b24gd2l0aCBhIHNpbmdsZSByZWYgYW5kIHJlbW92ZSB0aGVtLgorICAgIC8vIFRoaXMgbWF5IGhh
cHBlbiB3aGVuIGFuIGVsZW1lbnQgYXR0cmlidXRlIG11dGF0aW9uIGNhdXNlcyBpdCB0byBnZW5l
cmF0ZSBhIG5ldyBpbmxpbmVTdHlsZSgpCisgICAgLy8gb3IgcHJlc2VudGF0aW9uQXR0cmlidXRl
U3R5bGUoKSwgcG90ZW50aWFsbHkgbGVhdmluZyB0aGlzIGNhY2hlIHdpdGggdGhlIGxhc3QgcmVm
IG9uIHRoZSBvbGQgb25lLgorICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+IHRvUmVtb3ZlOworICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlLmJlZ2luKCk7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgZW5k
ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpOworICAgIGZvciAoOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiYgbWF0Y2hlZFByb3Bl
cnRpZXMgPSBpdC0+dmFsdWUubWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAg
IGlmIChtYXRjaGVkUHJvcGVydGllc1tpXS5wcm9wZXJ0aWVzLT5oYXNPbmVSZWYoKSkgeworICAg
ICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChpdC0+a2V5KTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgKytpKQorICAgICAgICBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUucmVtb3ZlKHRvUmVtb3ZlW2ldKTsKKworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
OjphZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IFN0
eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgdW5zaWduZWQgbGlu
a01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkK
K3sKKyAgICBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5ncm93KG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzJiBuZXdQ
cm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMubGFzdCgpOworICAgIG5l
d1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0eVNldCo+KHBy
b3BlcnRpZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNoVHlwZSA9IGxpbmtNYXRjaFR5
cGU7CisgICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0gcHJvcGVydHlXaGl0ZWxpc3RU
eXBlOworICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Cit9CisKK2lu
bGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hS
ZXN1bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydHlTZXQsIGJvb2wg
aXNDYWNoZWFibGUpCit7CisgICAgaWYgKCFwcm9wZXJ0eVNldCkKKyAgICAgICAgcmV0dXJuOwor
ICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpOworICAgIGlmIChyZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9PSAtMSkK
KyAgICAgICAgcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPSByZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlOworICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgcHJvcGVydHlT
ZXQpOworICAgIGlmICghaXNDYWNoZWFibGUpCisgICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9
IGZhbHNlOworfQorCitjbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29wZSB7CitwdWJsaWM6CisgICAg
TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKyAgICB+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKwor
ICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7CisKK3ByaXZhdGU6CisgICAgc3Rh
dGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Cit9OworCitNYXRjaGluZ1VBUnVsZXNTY29wZTo6
TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQoreworICAgIEFTU0VSVCghbV9tYXRjaGluZ1VBUnVsZXMp
OworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKK30KKworTWF0Y2hpbmdVQVJ1bGVzU2Nv
cGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSBm
YWxzZTsKK30KKworaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdV
QVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVsZXM7Cit9CisKK2Jvb2wgTWF0
Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRj
aFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIEFTU0VSVChtYXRjaFJlcXVl
c3QucnVsZVNldCk7CisgICAgQVNTRVJUKG1fc3RhdGUuZWxlbWVudCgpKTsKKworICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQo
KTsKKyAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVk
RWxlbWVudCgpOworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5z
aGFkb3dQc2V1ZG9JZCgpOworICAgIGlmICghcHNldWRvSWQuaXNFbXB0eSgpKSB7CisgICAgICAg
IEFTU0VSVChzdHlsZWRFbGVtZW50KTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQc2V1ZG9FbGVtZW50UnVsZXMocHNldWRv
SWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworI2lmIEVOQUJM
RShWSURFT19UUkFDSykKKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkpCisgICAg
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+Y3Vl
UHNldWRvUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2VuZGlmCisgICAgLy8g
Q2hlY2sgd2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxlcyBhcmUgYXBwbGljYWJsZSBpbiB0aGUg
Y3VycmVudCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3IgdGhpczoKKyAgICAvLyBhKSBpdCdzIGEg
VUEgcnVsZQorICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93cyBhdXRob3IgcnVsZXMKKyAg
ICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBzdHlsZSBzaGVldCB3aXRoaW4g
dGhlIHNhbWUgdHJlZSBzY29wZQorICAgIFRyZWVTY29wZSogdHJlZVNjb3BlID0gZWxlbWVudC0+
dHJlZVNjb3BlKCk7CisgICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VB
UnVsZXMoKQorICAgICAgICAmJiAhdHJlZVNjb3BlLT5hcHBseUF1dGhvclN0eWxlcygpCisgICAg
ICAgICYmICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1hdGNoUmVxdWVzdC5zY29wZS0+dHJlZVNj
b3BlKCkgIT0gdHJlZVNjb3BlKQorICAgICAgICAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJv
dW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFdlIG5lZWQgdG8gY29sbGVjdCB0aGUgcnVsZXMgZm9yIGlkLCBj
bGFzcywgdGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGludG8gYSBidWZmZXIgYW5kCisgICAgLy8g
dGhlbiBzb3J0IHRoZSBidWZmZXIuCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkpCisgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+aWRSdWxl
cyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSksIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKKyAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBzdHlsZWRFbGVtZW50LT5oYXND
bGFzcygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3R5bGVkRWxlbWVudC0+
Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQorICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1bGVzKHN0eWxlZEVsZW1lbnQt
PmNsYXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
fQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmxpbmtQc2V1ZG9DbGFzc1J1bGVzKCks
IG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjptYXRj
aGVzRm9jdXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1BzZXVkb0NsYXNzUnVsZXMoKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlz
dChtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVudC0+bG9jYWxOYW1lKCkuaW1w
bCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2FsUnVsZXMoKSwgbWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGlu
Z1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFu
Z2UmIHJ1bGVSYW5nZSkKK3sKKyAgICBpZiAoIW1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKQor
ICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hSZXF1ZXN0LnJ1bGVT
ZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ1NTU2VsZWN0b3IqIHJl
Z2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5k
UnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9y
KHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9zdGF0ZS5yZWdpb25Gb3JT
dHlsaW5nKCktPm5vZGUoKSkpKSB7CisgICAgICAgICAgICBSdWxlU2V0KiByZWdpb25SdWxlcyA9
IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkp
LnJ1bGVTZXQuZ2V0KCk7CisgICAgICAgICAgICBBU1NFUlQocmVnaW9uUnVsZXMpOworICAgICAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJlZ2lvblJ1bGVzLCBtYXRj
aFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdC5zY29wZSksIHJ1bGVSYW5n
ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydEFuZFRy
YW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgU3RhdGUmIHN0
YXRlID0gbV9zdGF0ZTsKKyAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRS
dWxlcyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOworICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBp
ZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7Cisg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kp
CisgICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRj
aGVkUnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gTm93IHRyYW5zZmVyIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxl
cyBvdmVyIHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdGF0ZS5z
dHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0dHJpYnV0ZVNlbGVj
dG9yKCkpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAg
YWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJv
cGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5r
TWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOwor
ICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxF
KFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgaWYgKCFtX3Njb3BlUmVz
b2x2ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIHNjb3BlZCBhdXRob3IgcnVs
ZXMgYnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3RhY2sgKHJlYnVpbGQgaXQgaWYg
aXQgZ290IGluY29uc2lzdGVudCkuCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlci0+aGFzU2NvcGVk
U3R5bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFja0NvbnNpc3RlbmN5KG1fc3Rh
dGUuZWxlbWVudCgpKSkgeworICAgICAgICBib29sIGFwcGx5QXV0aG9yU3R5bGVzID0gbV9zdGF0
ZS5lbGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0eWxlcygpOworICAgICAgICBi
b29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUgPSBt
X3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgc2NvcGVTaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVz
KCkuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBy
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgICAgICAgICAgY29uc3Qg
U3R5bGVTY29wZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBmcmFtZSA9IG1fc2NvcGVSZXNvbHZlci0+
c3RhY2tGcmFtZUF0KGkpOworICAgICAgICAgICAgZG9jdW1lbnRTY29wZSA9IGRvY3VtZW50U2Nv
cGUgJiYgIWZyYW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dUcmVlKCk7CisgICAgICAgICAgICBpZiAo
ZG9jdW1lbnRTY29wZSkgeworICAgICAgICAgICAgICAgIGlmICghYXBwbHlBdXRob3JTdHlsZXMp
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlci0+bWF0Y2hlc1N0eWxlQm91bmRzKGZy
YW1lKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QoZnJhbWUubV9ydWxlU2V0LCBpbmNs
dWRlRW1wdHlSdWxlcywgZnJhbWUubV9zY29wZSk7CisgICAgICAgICAgICBSdWxlUmFuZ2UgcnVs
ZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICAgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
KyAgICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAgICAg
ICB9CisgICAgfQorCisgICAgbWF0Y2hIb3N0UnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxl
cyk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOworICAgIFVOVVNFRF9QQVJBTShp
bmNsdWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZl
cjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpCit7CisjaWYgRU5BQkxF
KFNIQURPV19ET00pCisgICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlciAmJiBtX3Njb3BlUmVzb2x2
ZXItPnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50
KCkpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIEFTU0VSVChtX3Njb3Bl
UmVzb2x2ZXIpOworCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJl
c3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpIC0gMTsKKworICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOworICAgIG1fc2Nv
cGVSZXNvbHZlci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxl
cyk7CisgICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGZvciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsK
KyAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJh
bmdlKCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChtYXRjaGVk
UnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgpKSwgcnVs
ZVJhbmdlKTsKKyAgICB9CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7
CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOworICAgIFVOVVNFRF9QQVJBTShpbmNs
dWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEF1
dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7
CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKwor
ICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1h
dGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCisgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdCht
X3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFu
Z2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2lmIEVOQUJM
RShTSEFET1dfRE9NKQorICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Cisg
ICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVz
dHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKKyAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKKyNlbmRpZgorCisgICAgc29y
dEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisKKyAgICBtYXRjaFNjb3BlZEF1dGhv
clJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpCit7CisgICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQorICAgICAgICByZXR1
cm47CisgICAgCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworCisgICAgcmVz
dWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMTsKKyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxl
KCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0
LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1h
dGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKworICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhyZXN1bHQpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJl
c3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKK3sKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmNsZWFyKCk7CisgICAgCisgICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9
IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhN
YXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0
Y2hlZFJ1bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRj
aFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYg
KCFydWxlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
KyAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3Ig
cmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZl
LgorICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUg
aW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICBib29sIGNh
blVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50
KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9
PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OworCisgICAgdW5zaWduZWQg
c2l6ZSA9IHJ1bGVzLT5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7
ICsraSkgeworICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7
CisgICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJl
amVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5k
ZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOworICAgICAg
ICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworICAgICAg
ICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChydWxlTWF0
Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJl
cXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUg
aGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVi
dWcgbW9kZS4KKyAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMg
PSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHBy
b3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkg
eworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0
Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVk
LgorICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVsZURhdGEu
aGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBt
YXRjaGluZyBub3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKKyAgICAgICAgICAgIC8v
IHdlIHJlYWxseSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KKyAgICAgICAgICAgIGlm
IChkeW5hbWljUHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgp
LnBzZXVkb0lkID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUo
KSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICAgICAgICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNl
KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQp
CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5
bmFtaWNQc2V1ZG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBV
cGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFy
cmF5LgorICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisgICAgICAg
ICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKKyAgICAgICAgICAg
ICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5k
ZXg7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1h
dGNoZWQgcnVsZXMuCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVs
ZURhdGEpOworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0
Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRN
YXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wg
Y29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIyKQorewor
ICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOworICAgIHVuc2ln
bmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOworICAgIHJldHVybiAoc3BlY2lm
aWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigp
IDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OnNvcnRNYXRjaGVkUnVsZXMoKQoreworICAgIHN0ZDo6c29ydChtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVSdWxlcyk7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYgcmVz
dWx0LCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKK3sKKyAgICBtYXRjaFVBUnVsZXMocmVz
dWx0KTsKKworICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgorICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMocmVzdWx0
LCBmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmly
c3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwuCisgICAg
aWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVBy
b3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0
cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwgbWFw
cGVkIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBzaGFy
ZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCisgICAgICAg
IC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVwZW5k
cyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCisgICAgICAgIGFkZEVsZW1l
bnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRp
b25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworCisgICAgICAgIGlmIChtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBib29sIGlz
QXV0bzsKKyAgICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbiA9IHRvSFRNTEVs
ZW1lbnQobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFzRGlyQXV0
b0F0dHJpYnV0ZShpc0F1dG8pOworICAgICAgICAgICAgaWYgKGlzQXV0bykKKyAgICAgICAgICAg
ICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0gTFRSID8g
bGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNo
ZWV0cyBuZXh0LgorICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAg
bWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBvdXIg
aW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KKyAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmlubGluZVN0eWxlKCkpIHsKKyAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBh
cyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCisgICAgICAgIC8vIEZJWE1FOiBN
ZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNo
aW5nLgorICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5
LgorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOworICAg
IH0KKworI2lmIEVOQUJMRShTVkcpCisgICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92
ZXJyaWRlIHN0eWxlLgorICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9tYXRjaEF1
dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQorICAgICAgICBhZGRFbGVtZW50U3R5bGVQ
cm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2Fj
aGVhYmxlICovKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVydGll
cyk7CisjZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZmZWN0ZWRC
eVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0Cit7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgaWYgKG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFz
c05hbWVzW2ldLmltcGwoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5p
dEVsZW1lbnQoRWxlbWVudCogZSkKK3sKKyAgICBtX2VsZW1lbnQgPSBlOworICAgIG1fc3R5bGVk
RWxlbWVudCA9IGUgJiYgZS0+aXNTdHlsZWRFbGVtZW50KCkgPyBzdGF0aWNfY2FzdDxTdHlsZWRF
bGVtZW50Kj4oZSkgOiAwOworICAgIG1fZWxlbWVudExpbmtTdGF0ZSA9IGUgPyBlLT5kb2N1bWVu
dCgpLT52aXNpdGVkTGlua1N0YXRlKCktPmRldGVybWluZUxpbmtTdGF0ZShlKSA6IE5vdEluc2lk
ZUxpbms7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KEVsZW1l
bnQqIGUpCit7CisgICAgaWYgKG1fc3RhdGUuZWxlbWVudCgpICE9IGUpIHsKKyAgICAgICAgbV9z
dGF0ZS5pbml0RWxlbWVudChlKTsKKyAgICAgICAgaWYgKGUgJiYgZSA9PSBlLT5kb2N1bWVudCgp
LT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICAgICAgZS0+ZG9jdW1lbnQoKS0+c2V0RGly
ZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOworICAgICAgICAgICAgZS0+ZG9jdW1l
bnQoKS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAg
IH0KKyAgICB9Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9y
U3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVz
dCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQoreworICAgIG1fcHNldWRvU3R5bGVS
ZXF1ZXN0ID0gcHNldWRvU3R5bGVSZXF1ZXN0OworICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IHJl
Z2lvbkZvclN0eWxpbmc7CisKKyAgICBpZiAoZSkgeworICAgICAgICBOb2RlUmVuZGVyaW5nQ29u
dGV4dCBjb250ZXh0KGUpOworICAgICAgICBtX3BhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5v
ZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOworICAgICAgICBtX3BhcmVudFN0eWxlID0gY29udGV4
dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSA/IDAgOgorICAgICAgICAgICAgcGFyZW50U3R5bGUg
PyBwYXJlbnRTdHlsZSA6CisgICAgICAgICAgICBtX3BhcmVudE5vZGUgPyBtX3BhcmVudE5vZGUt
PnJlbmRlclN0eWxlKCkgOiAwOworICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2lu
dCA9IGNvbnRleHQuaW5zZXJ0aW9uUG9pbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3Bh
cmVudE5vZGUgPSAwOworICAgICAgICBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7CisgICAg
ICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gZmFsc2U7CisgICAgfQorCisgICAg
Tm9kZSogZG9jRWxlbWVudCA9IGUgPyBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA6
IDA7CisgICAgUmVuZGVyU3R5bGUqIGRvY1N0eWxlID0gZG9jdW1lbnQtPnJlbmRlclN0eWxlKCk7
CisgICAgbV9yb290RWxlbWVudFN0eWxlID0gZG9jRWxlbWVudCAmJiBlICE9IGRvY0VsZW1lbnQg
PyBkb2NFbGVtZW50LT5yZW5kZXJTdHlsZSgpIDogZG9jU3R5bGU7CisKKyAgICBtX3N0eWxlID0g
MDsKKyAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKKyAgICBtX3J1bGVMaXN0
ID0gMDsKKyAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOworfQorCitzdGF0aWMgY29uc3QgdW5zaWdu
ZWQgY1N0eWxlU2VhcmNoVGhyZXNob2xkID0gMTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY1N0
eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgPSAxMDsKKworc3RhdGljIGlubGluZSBib29sIHBhcmVu
dEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoY29uc3QgRWxlbWVudCogcGFyZW50RWxlbWVudCkKK3sK
KyAgICBpZiAoIXBhcmVudEVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gcGFyZW50RWxlbWVudC0+aGFzRmxhZ3NTZXREdXJpbmdTdHlsaW5nT2ZDaGlsZHJlbigpOwor
fQorCitOb2RlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVu
dCwgdW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNvbnN0Cit7CisgICAgaWYgKHZpc2l0ZWRO
b2RlQ291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkICogY1N0eWxlU2VhcmNoTGV2ZWxUaHJl
c2hvbGQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQtPmlz
U3R5bGVkRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGFyZW50LT5oYXNT
Y29wZWRIVE1MU3R5bGVDaGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBTdHlsZWRFbGVt
ZW50KiBwID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KHBhcmVudCk7CisgICAgaWYgKHAt
PmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworI2lmIEVOQUJMRShTVkcpCisgICAg
aWYgKHAtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihwKS0+YW5p
bWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisg
ICAgaWYgKHAtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29u
dGFpbnMocC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IHAtPnJlbmRlclN0eWxlKCk7Cisg
ICAgdW5zaWduZWQgc3ViY291bnQgPSAwOworICAgIE5vZGUqIHRoaXNDb3VzaW4gPSBwOworICAg
IE5vZGUqIGN1cnJlbnROb2RlID0gcC0+cHJldmlvdXNTaWJsaW5nKCk7CisKKyAgICAvLyBSZXNl
cnZlIHRoZSB0cmllcyBmb3IgdGhpcyBsZXZlbC4gVGhpcyBlZmZlY3RpdmVseSBtYWtlcyBzdXJl
IHRoYXQgdGhlIGFsZ29yaXRobQorICAgIC8vIHdpbGwgbmV2ZXIgZ28gZGVlcGVyIHRoYW4gY1N0
eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgbGV2ZWxzIGludG8gcmVjdXJzaW9uLgorICAgIHZpc2l0
ZWROb2RlQ291bnQgKz0gY1N0eWxlU2VhcmNoVGhyZXNob2xkOworICAgIHdoaWxlICh0aGlzQ291
c2luKSB7CisgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkgeworICAgICAgICAgICAgKytzdWJj
b3VudDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA9PSBwYXJl
bnRTdHlsZSAmJiBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCkKKyAgICAgICAgICAgICAgICAmJiBj
dXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmICFwYXJlbnRFbGVtZW50UHJldmVudHNTaGFy
aW5nKHRvRWxlbWVudChjdXJyZW50Tm9kZSkpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAg
ICAgICAgICAgICAgJiYgIXRvRWxlbWVudChjdXJyZW50Tm9kZSktPnNoYWRvdygpCisjZW5kaWYK
KyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHVudXNl
ZCByZXNlcnZlZCB0cmllcy4KKyAgICAgICAgICAgICAgICB2aXNpdGVkTm9kZUNvdW50IC09IGNT
dHlsZVNlYXJjaFRocmVzaG9sZCAtIHN1YmNvdW50OworICAgICAgICAgICAgICAgIHJldHVybiBj
dXJyZW50Tm9kZS0+bGFzdENoaWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
c3ViY291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQorICAgICAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS0+cHJldmlvdXNTaWJs
aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudE5vZGUgPSBsb2NhdGVDb3VzaW5MaXN0
KHRoaXNDb3VzaW4tPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7CisgICAgICAg
IHRoaXNDb3VzaW4gPSBjdXJyZW50Tm9kZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwor
Ym9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChS
dWxlU2V0KiBydWxlU2V0KQoreworICAgIGlmICghcnVsZVNldCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKworICAgIG1fc3RhdGUu
c2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxlcyk7CisgICAgaW50IGZpcnN0UnVs
ZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
KGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
cyhNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7CisgICAgbV9zdGF0ZS5zZXRNb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOworICAgIGlmIChtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fc3RhdGUu
bWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHls
ZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCogZWxlbWVu
dCkgY29uc3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIEhUTUxJ
bnB1dEVsZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgp
OworICAgIEhUTUxJbnB1dEVsZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVu
dCgpLT50b0lucHV0RWxlbWVudCgpOworCisgICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFv
dGhlcklucHV0RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRoaXNJ
bnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnRE
YXRhKCkpIHsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUo
dHlwZUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRy
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1l
bnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+
ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBv
dGhlcklucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJ
bnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVu
dC0+aXNSZXF1aXJlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVu
dC0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZv
cm1Db250cm9sKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5p
c0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0
b25Gb3JGb3JtKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdGF0ZS5kb2N1
bWVudCgpLT5jb250YWluc1ZhbGlkaXR5U3R5bGVSdWxlcygpKSB7CisgICAgICAgIGJvb2wgd2ls
bFZhbGlkYXRlID0gZWxlbWVudC0+d2lsbFZhbGlkYXRlKCk7CisKKyAgICAgICAgaWYgKHdpbGxW
YWxpZGF0ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICh3aWxsVmFsaWRhdGUgJiYgKGVsZW1lbnQtPmlz
VmFsaWRGb3JtQ29udHJvbEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzVmFsaWRGb3Jt
Q29udHJvbEVsZW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
aWYgKGVsZW1lbnQtPmlzSW5SYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNJblJhbmdlKCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGVsZW1lbnQtPmlzT3V0
T2ZSYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNPdXRPZlJhbmdlKCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBp
bmxpbmUgYm9vbCBlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhFbGVtZW50KiBlbGVtZW50KQorewor
ICAgIC8vIEZJWE1FOiBUaGlzIGxpbmUgaXMgc3VycHJpc2luZ2x5IGhvdCwgd2UgbWF5IHdpc2gg
dG8gaW5saW5lIGhhc0RpcmVjdGlvbkF1dG8gaW50byBTdHlsZVJlc29sdmVyLgorICAgIHJldHVy
biBlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgdG9IVE1MRWxlbWVudChlbGVtZW50KS0+aGFz
RGlyZWN0aW9uQXV0bygpOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnNoYXJpbmdDYW5kaWRh
dGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCogc2hh
cmluZ0NhbmRpZGF0ZSkgY29uc3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmVsZW1lbnREYXRhKCkgPT0gc2hhcmluZ0NhbmRp
ZGF0ZS0+ZWxlbWVudERhdGEoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKHN0YXRl
LmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpICE9IHNoYXJp
bmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1
dGUobGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0
dHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIXN0YXRlLmVsZW1lbnRBZmZl
Y3RlZEJ5Q2xhc3NSdWxlcygpKSB7CisgICAgICAgIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXND
bGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc2hhcmluZ0NhbmRpZGF0ZS0+Y2xh
c3NOYW1lcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHNo
YXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkpIHsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAv
LyBTVkcgZWxlbWVudHMgcmVxdWlyZSBhIChzbG93ISkgZ2V0QXR0cmlidXRlIGNvbXBhcmlzaW9u
IGJlY2F1c2UgImNsYXNzIiBpcyBhbiBhbmltYXRhYmxlIGF0dHJpYnV0ZSBmb3IgU1ZHLgorICAg
ICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkgeworICAgICAgICAgICAg
aWYgKHN0YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikgIT0gc2hhcmluZ0Nh
bmRpZGF0ZS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICBpZiAoc3RhdGUu
ZWxlbWVudCgpLT5jbGFzc05hbWVzKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAg
ICB9CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBz
aGFyaW5nQ2FuZGlkYXRlLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKKyAgICBpZiAoc3Rh
dGUuZWxlbWVudCgpLT5oYXNUYWdOYW1lKHByb2dyZXNzVGFnKSkgeworICAgICAgICBpZiAoc3Rh
dGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHN0YXRlLmVsZW1lbnQoKSktPmlzRGV0ZXJt
aW5hdGUoKSAhPSBzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc2hhcmluZ0NhbmRp
ZGF0ZSktPmlzRGV0ZXJtaW5hdGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNh
blNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAorewor
ICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IGVsZW1lbnQtPnJlbmRlclN0eWxlKCk7CisgICAgY29u
c3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGlmICghc3R5bGUpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKHN0eWxlLT5oYXNVbmlxdWVQc2V1ZG9TdHlsZSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPnRhZ1FOYW1lKCkgIT0gc3RhdGUuZWxlbWVudCgp
LT50YWdRTmFtZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmlu
bGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+bmVl
ZHNTdHlsZVJlY2FsYygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjaWYgRU5BQkxFKFNWRykK
KyAgICBpZiAoZWxlbWVudC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVu
dCo+KGVsZW1lbnQpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworI2VuZGlmCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICE9IHN0YXRlLmVs
ZW1lbnQoKS0+aXNMaW5rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVu
dC0+aG92ZXJlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aG92ZXJlZCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmFjdGl2ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
YWN0aXZlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+Zm9jdXNl
ZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+Zm9jdXNlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5z
aGFkb3dQc2V1ZG9JZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQg
PT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoIXNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0
dHJpYnV0ZXMoZWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVu
dC0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkgJiYgbV9ydWxlU2V0
cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoZWxlbWVudC0+aWRGb3JTdHlsZVJlc29s
dXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQt
Pmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIEZJWE1FOiBXZSBzaG91bGQgc2hhcmUgc3R5bGUgZm9yIG9wdGlvbiBhbmQgb3B0Z3JvdXAg
d2hlbmV2ZXIgcG9zc2libGUuCisgICAgLy8gQmVmb3JlIGRvaW5nIHNvLCB3ZSBuZWVkIHRvIHJl
c29sdmUgaXNzdWVzIGluIEhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMKKyAgICAv
LyBhbmQgUmVuZGVyTWVudUxpc3Q6OnNldFRleHQuIFNlZSBhbHNvIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODQwNQorICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1l
KG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgaXNDb250cm9sID0gZWxlbWVudC0+aXNGb3JtQ29u
dHJvbEVsZW1lbnQoKTsKKworICAgIGlmIChpc0NvbnRyb2wgIT0gc3RhdGUuZWxlbWVudCgpLT5p
c0Zvcm1Db250cm9sRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAo
aXNDb250cm9sICYmICFjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woZWxlbWVudCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdHlsZS0+dHJhbnNpdGlvbnMoKSB8fCBzdHlsZS0+
YW5pbWF0aW9ucygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgLy8gVHVybiBvZmYgc3R5bGUgc2hhcmluZyBmb3IgZWxlbWVu
dHMgdGhhdCBjYW4gZ2FpbiBsYXllcnMgZm9yIHJlYXNvbnMgb3V0c2lkZSBvZiB0aGUgc3R5bGUg
c3lzdGVtLgorICAgIC8vIFNlZSBjb21tZW50cyBpbiBSZW5kZXJPYmplY3Q6OnNldFN0eWxlKCku
CisgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGVtYmVkVGFnKSB8fCBlbGVt
ZW50LT5oYXNUYWdOYW1lKG9iamVjdFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhcHBsZXRU
YWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoY2FudmFzVGFnKQorI2lmIEVOQUJMRShQTFVHSU5f
UFJPWFlfRk9SX1ZJREVPKQorICAgICAgICAvLyBXaXRoIHByb3h5aW5nLCB0aGUgbWVkaWEgZWxl
bWVudHMgYXJlIGJhY2tlZCBieSBhIFJlbmRlckVtYmVkZGVkT2JqZWN0LgorICAgICAgICB8fCBl
bGVtZW50LT5oYXNUYWdOYW1lKHZpZGVvVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGF1ZGlv
VGFnKQorI2VuZGlmCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisK
KyAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oZWxlbWVudCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAmJiBzdGF0ZS5lbGVtZW50TGlu
a1N0YXRlKCkgIT0gc3R5bGUtPmluc2lkZUxpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIC8vIERlbnkgc2hhcmluZyBzdHlsZXMgYmV0
d2VlbiBXZWJWVFQgYW5kIG5vbi1XZWJWVFQgbm9kZXMuCisgICAgaWYgKGVsZW1lbnQtPmlzV2Vi
VlRURWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAm
JiBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpICYmIHRvV2ViVlRURWxlbWVudChl
bGVtZW50KS0+aXNQYXN0Tm9kZSgpICE9IHRvV2ViVlRURWxlbWVudChzdGF0ZS5lbGVtZW50KCkp
LT5pc1Bhc3ROb2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisjaWYgRU5B
QkxFKEZVTExTQ1JFRU5fQVBJKQorICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50
KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpIHx8IHN0YXRlLmVsZW1lbnQoKSA9
PSBzdGF0ZS5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGlu
ZSBTdHlsZWRFbGVtZW50KiBTdHlsZVJlc29sdmVyOjpmaW5kU2libGluZ0ZvclN0eWxlU2hhcmlu
ZyhOb2RlKiBub2RlLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0Cit7CisgICAgZm9yICg7IG5vZGU7
IG5vZGUgPSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW5vZGUtPmlz
U3R5bGVkRWxlbWVudCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjYW5T
aGFyZVN0eWxlV2l0aEVsZW1lbnQoc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpKSkK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY291bnQrKyA9PSBjU3R5bGVTZWFyY2hU
aHJlc2hvbGQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKK30KKworUmVuZGVyU3R5bGUqIFN0eWxlUmVz
b2x2ZXI6OmxvY2F0ZVNoYXJlZFN0eWxlKCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIGlmICghc3RhdGUuc3R5bGVkRWxlbWVudCgpIHx8ICFzdGF0ZS5wYXJlbnRTdHlsZSgp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBpbmxpbmUg
c3R5bGUgaXQgaXMgcHJvYmFibHkgdW5pcXVlLgorICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworI2lmIEVOQUJMRShTVkcpCisg
ICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nh
c3Q8U1ZHRWxlbWVudCo+KHN0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxl
UHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIC8vIElkcyBzdG9w
IHN0eWxlIHNoYXJpbmcgaWYgdGhleSBzaG93IHVwIGluIHRoZSBzdHlsZXNoZWV0cy4KKyAgICBp
ZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5pZHNJblJ1bGVzLmNvbnRhaW5zKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aWRGb3JTdHlsZVJl
c29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGFyZW50RWxl
bWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCisg
ICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc1Njb3Bl
ZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGF0ZS5lbGVt
ZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCisgICAgICAgIHJldHVybiAw
OworICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhzdGF0ZS5lbGVtZW50KCkpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIC8vIENhY2hlIHdoZXRoZXIgc3RhdGUuZWxlbWVudCBpcyBh
ZmZlY3RlZCBieSBhbnkga25vd24gY2xhc3Mgc2VsZWN0b3JzLgorICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZG4ndCBiZSBhIG1lbWJlciB2YXJpYWJsZS4gVGhlIHN0eWxlIHNoYXJpbmcgY29kZSBj
b3VsZCBiZSBmYWN0b3JlZCBvdXQgb2YgU3R5bGVSZXNvbHZlci4KKyAgICBzdGF0ZS5zZXRFbGVt
ZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQo
KS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHN0YXRlLmVsZW1lbnQo
KS0+Y2xhc3NOYW1lcygpKSk7CisKKyAgICAvLyBDaGVjayBwcmV2aW91cyBzaWJsaW5ncyBhbmQg
dGhlaXIgY291c2lucy4KKyAgICB1bnNpZ25lZCBjb3VudCA9IDA7CisgICAgdW5zaWduZWQgdmlz
aXRlZE5vZGVDb3VudCA9IDA7CisgICAgU3R5bGVkRWxlbWVudCogc2hhcmVFbGVtZW50ID0gMDsK
KyAgICBOb2RlKiBjb3VzaW5MaXN0ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmV2aW91c1Np
YmxpbmcoKTsKKyAgICB3aGlsZSAoY291c2luTGlzdCkgeworICAgICAgICBzaGFyZUVsZW1lbnQg
PSBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhjb3VzaW5MaXN0LCBjb3VudCk7CisgICAgICAg
IGlmIChzaGFyZUVsZW1lbnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY291c2luTGlz
dCA9IGxvY2F0ZUNvdXNpbkxpc3QoY291c2luTGlzdC0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVk
Tm9kZUNvdW50KTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGV4aGF1c3RlZCBhbGwgb3Vy
IGJ1ZGdldCBvciBvdXIgY291c2lucy4KKyAgICBpZiAoIXNoYXJlRWxlbWVudCkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAvLyBDYW4ndCBzaGFyZSBpZiBzaWJsaW5nIHJ1bGVzIGFwcGx5LiBU
aGlzIGlzIGNoZWNrZWQgYXQgdGhlIGVuZCBhcyBpdCBzaG91bGQgcmFyZWx5IGZhaWwuCisgICAg
aWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMuc2libGlu
ZygpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgYXR0cmlidXRl
IHJ1bGVzIGFwcGx5LgorICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNl
dChtX3J1bGVTZXRzLnVuY29tbW9uQXR0cmlidXRlKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICAvLyBDYW4ndCBzaGFyZSBpZiBAaG9zdCBALXJ1bGVzIGFwcGx5LgorICAgIGlmIChzdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkpCisgICAgICAgIHJldHVybiAwOworICAg
IC8vIFRyYWNraW5nIGNoaWxkIGluZGV4IHJlcXVpcmVzIHVuaXF1ZSBzdHlsZSBmb3IgZWFjaCBu
b2RlLiBUaGlzIG1heSBnZXQgc2V0IGJ5IHRoZSBzaWJsaW5nIHJ1bGUgbWF0Y2ggYWJvdmUuCisg
ICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJl
bnRFbGVtZW50KCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2hhcmVFbGVtZW50
LT5yZW5kZXJTdHlsZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhN
YXRjaFJlc3VsdCYgcmVzdWx0KQoreworICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNjb3BlOwor
CisgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4K
KyAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVTaGVldCkK
KyAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7CisgICAgUnVsZVNldCogdXNlckFn
ZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIp
CisgICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSA6IENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOworICAgIG1hdGNoVUFSdWxlcyhyZXN1
bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQpOworCisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1h
dGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChkb2N1
bWVudCgpLT5pblF1aXJrc01vZGUoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9j
dW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4g
eG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJj
ZSBzdHlsZSBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAg
ICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJj
ZVN0eWxlKCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQ
YWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHlsZSogc3R5bGUpCit7Cisg
ICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKQorICAgICAg
ICByZXR1cm47CisgICAgICAgIAorICAgIHN3aXRjaCAocGFnaW5hdGlvbk1vZGUpIHsKKyAgICBj
YXNlIFBhZ2luYXRpb246OkxlZnRUb1JpZ2h0UGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0
Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7CisgICAgICAgIGlmIChzdHlsZS0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9n
cmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nr
c1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Q
cm9ncmVzc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGFnaW5hdGlvbjo6UmlnaHRU
b0xlZnRQYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxD
b2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1
bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1h
bENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpUb3BUb0JvdHRvbVBhZ2luYXRlZDoKKyAgICAg
ICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYg
KHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8g
UmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2
ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0
aW9uOjpCb3R0b21Ub1RvcFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMo
VmVydGljYWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0
aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxl
LT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24g
OiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBz
dHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZDoKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3Rh
dGljIHZvaWQgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oY29uc3QgUmVuZGVyU3R5bGUqIHN0
eWxlLCBGb250T3JpZW50YXRpb24mIGZvbnRPcmllbnRhdGlvbiwgTm9uQ0pLR2x5cGhPcmllbnRh
dGlvbiYgZ2x5cGhPcmllbnRhdGlvbikKK3sKKyAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCkpIHsKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAg
ICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJp
Z2h0OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChzdHlsZS0+dGV4dE9y
aWVudGF0aW9uKCkpIHsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ6Cisg
ICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9yaWVudGF0
aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVy
bjsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblVwcmlnaHQ6CisgICAgICAgIGZvbnRPcmllbnRh
dGlvbiA9IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhP
cmllbnRhdGlvblVwcmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHRPcmllbnRh
dGlvblNpZGV3YXlzOgorICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgPT0gTGVmdFRv
UmlnaHRXcml0aW5nTW9kZSkgeworICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG1h
cCB0byBzaWRld2F5cy1sZWZ0LCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKyAgICAgICAg
ICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICAgICAgZ2x5cGhPcmllbnRh
dGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7
CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGlj
YWxSaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdh
eXNSaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAg
Z2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0Owor
ICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAgICAgIGdseXBo
T3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQsIENTU0ZvbnRTZWxlY3Rv
ciogZm9udFNlbGVjdG9yKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgp
OworCisgICAgLy8gSFRNTDUgc3RhdGVzIHRoYXQgc2VhbWxlc3MgaWZyYW1lcyBzaG91bGQgcmVw
bGFjZSBkZWZhdWx0IENTUyB2YWx1ZXMKKyAgICAvLyB3aXRoIHZhbHVlcyBpbmhlcml0ZWQgZnJv
bSB0aGUgY29udGFpbmluZyBpZnJhbWUgZWxlbWVudC4gSG93ZXZlciwKKyAgICAvLyBzb21lIHZh
bHVlcyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBkZXNpZ25Nb2RlID0gIm9uIikgc3RpbGwgbmVlZCB0
bworICAgIC8vIGJlIHNldCBieSB0aGlzICJkb2N1bWVudCBzdHlsZSIuCisgICAgUmVmUHRyPFJl
bmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgIGJv
b2wgc2VhbWxlc3NXaXRoUGFyZW50ID0gZG9jdW1lbnQtPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5
V2l0aFBhcmVudCgpOworICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpIHsKKyAgICAgICAgUmVu
ZGVyU3R5bGUqIGlmcmFtZVN0eWxlID0gZG9jdW1lbnQtPnNlYW1sZXNzUGFyZW50SUZyYW1lKCkt
PnJlbmRlclN0eWxlKCk7CisgICAgICAgIGlmIChpZnJhbWVTdHlsZSkKKyAgICAgICAgICAgIGRv
Y3VtZW50U3R5bGUtPmluaGVyaXRGcm9tKGlmcmFtZVN0eWxlKTsKKyAgICB9CisKKyAgICAvLyBG
SVhNRTogSXQncyBub3QgY2xlYXIgd2hpY2ggdmFsdWVzIGJlbG93IHdlIHdhbnQgdG8gb3ZlcnJp
ZGUgaW4gdGhlIHNlYW1sZXNzIGNhc2UhCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlzcGxheShC
TE9DSyk7CisgICAgaWYgKCFzZWFtbGVzc1dpdGhQYXJlbnQpIHsKKyAgICAgICAgZG9jdW1lbnRT
dHlsZS0+c2V0UlRMT3JkZXJpbmcoZG9jdW1lbnQtPnZpc3VhbGx5T3JkZXJlZCgpID8gVmlzdWFs
T3JkZXIgOiBMb2dpY2FsT3JkZXIpOworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRab29tKGZy
YW1lICYmICFkb2N1bWVudC0+cHJpbnRpbmcoKSA/IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpIDog
MSk7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFBhZ2VTY2FsZVRyYW5zZm9ybShmcmFtZSA/
IGZyYW1lLT5mcmFtZVNjYWxlRmFjdG9yKCkgOiAxKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+
c2V0TG9jYWxlKGRvY3VtZW50LT5jb250ZW50TGFuZ3VhZ2UoKSk7CisgICAgfQorICAgIC8vIFRo
aXMgb3ZlcnJpZGVzIGFueSAtd2Via2l0LXVzZXItbW9kaWZ5IGluaGVyaXRlZCBmcm9tIHRoZSBw
YXJlbnQgaWZyYW1lLgorICAgIGRvY3VtZW50U3R5bGUtPnNldFVzZXJNb2RpZnkoZG9jdW1lbnQt
PmluRGVzaWduTW9kZSgpID8gUkVBRF9XUklURSA6IFJFQURfT05MWSk7CisKKyAgICBFbGVtZW50
KiBkb2NFbGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOworICAgIFJlbmRlck9i
amVjdCogZG9jRWxlbWVudFJlbmRlcmVyID0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRl
cmVyKCkgOiAwOworICAgIGlmIChkb2NFbGVtZW50UmVuZGVyZXIpIHsKKyAgICAgICAgLy8gVXNl
IHRoZSBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSBvZiB0aGUgYm9keSB0byBzZXQgdGhlCisg
ICAgICAgIC8vIHZpZXdwb3J0J3MgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgdW5sZXNzIHRo
ZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuCisgICAgICAgIC8vIElm
IHRoZXJlIGlzIG5vIGJvZHksIHRoZW4gdXNlIHRoZSBkb2N1bWVudCBlbGVtZW50LgorICAgICAg
ICBSZW5kZXJPYmplY3QqIGJvZHlSZW5kZXJlciA9IGRvY3VtZW50LT5ib2R5KCkgPyBkb2N1bWVu
dC0+Ym9keSgpLT5yZW5kZXJlcigpIDogMDsKKyAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAh
ZG9jdW1lbnQtPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgICAg
IGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+d3Jp
dGluZ01vZGUoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNl
dFdyaXRpbmdNb2RlKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7
CisgICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT5kaXJlY3Rpb25TZXRPbkRv
Y3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9u
KGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oZG9jRWxlbWVudFJlbmRlcmVyLT5z
dHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAgfQorCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAg
IGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgICAg
IGNvbnN0IFBhZ2luYXRpb24mIHBhZ2luYXRpb24gPSBmcmFtZVZpZXctPnBhZ2luYXRpb24oKTsK
KyAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uLm1vZGUgIT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0
ZWQpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShwYWdpbmF0
aW9uLm1vZGUsIGRvY3VtZW50U3R5bGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIGRvY3VtZW50
U3R5bGUtPnNldENvbHVtbkdhcChwYWdpbmF0aW9uLmdhcCk7CisgICAgICAgICAgICAgICAgaWYg
KFJlbmRlclZpZXcqIHZpZXcgPSBkb2N1bWVudC0+cmVuZGVyVmlldygpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmICh2aWV3LT5oYXNDb2x1bW5zKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICB2aWV3LT51cGRhdGVDb2x1bW5JbmZvRnJvbVN0eWxlKGRvY3VtZW50U3R5bGUuZ2V0KCkpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIFNlYW1sZXNzIGlmcmFtZXMgd2FudCB0byBpbmhlcml0IHRoZWlyIGZvbnQgZnJvbSB0aGVp
ciBwYXJlbnQgaWZyYW1lLCBzbyBlYXJseSByZXR1cm4gYmVmb3JlIHNldHRpbmcgdGhlIGZvbnQu
CisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50U3R5
bGUucmVsZWFzZSgpOworCisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKKyAg
ICBmb250RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxl
Y3Rpb24oZG9jdW1lbnRTdHlsZS0+bG9jYWxlKCkpKTsKKyAgICBpZiAoU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCkpIHsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVu
Rm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRS
ZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiBzdGFuZGFyZEZvbnQgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFt
aWx5KGZvbnREZXNjcmlwdGlvbi5zY3JpcHQoKSk7CisgICAgICAgIGlmICghc3RhbmRhcmRGb250
LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoRm9udERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWlseSk7CisgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250KTsKKyAgICAgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKKyAgICAg
ICAgfQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRp
dW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKKyAgICAgICAgaW50IHNpemUgPSBTdHlsZVJlc29s
dmVyOjpmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQsIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSk7
CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOworICAgICAg
ICBib29sIHVzZVNWR1pvb21SdWxlcyA9IGRvY3VtZW50LT5pc1NWR0RvY3VtZW50KCk7CisgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoU3R5bGVSZXNvbHZlcjo6Z2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIGRvY3VtZW50U3R5bGUuZ2V0KCks
IGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMp
KTsKKyAgICB9IGVsc2UKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250
KGRvY3VtZW50LT5wcmludGluZygpKTsKKworICAgIEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50
YXRpb247CisgICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9uOworICAg
IGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnRPcmll
bnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7CisgICAgZm9udERlc2NyaXB0aW9uLnNldE9yaWVu
dGF0aW9uKGZvbnRPcmllbnRhdGlvbik7CisgICAgZm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0ds
eXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7CisKKyAgICBkb2N1bWVudFN0eWxlLT5z
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICBkb2N1bWVudFN0eWxlLT5m
b250KCkudXBkYXRlKGZvbnRTZWxlY3Rvcik7CisKKyAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5y
ZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U2hhZG93Qm91bmRhcnkoY29u
c3QgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlID0gZWxlbWVudC0+cGFyZW50
Tm9kZSgpOworICAgIHJldHVybiBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUtPmlzU2hhZG93Um9v
dCgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZv
ckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVyU3R5bGUqIGRlZmF1bHRQYXJlbnQsCisg
ICAgU3R5bGVTaGFyaW5nQmVoYXZpb3Igc2hhcmluZ0JlaGF2aW9yLCBSdWxlTWF0Y2hpbmdCZWhh
dmlvciBtYXRjaGluZ0JlaGF2aW9yLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7
CisgICAgLy8gT25jZSBhbiBlbGVtZW50IGhhcyBhIHJlbmRlcmVyLCB3ZSBkb24ndCB0cnkgdG8g
ZGVzdHJveSBpdCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSByZW5kZXJlcgorICAgIC8vIHdpbGwgdmFu
aXNoIGlmIGEgc3R5bGUgcmVjYWxjIGhhcHBlbnMgZHVyaW5nIGxvYWRpbmcuCisgICAgaWYgKHNo
YXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhZWxlbWVudC0+ZG9jdW1lbnQo
KS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgIWVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAg
ICAgICAgaWYgKCFzX3N0eWxlTm90WWV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBzX3N0eWxl
Tm90WWV0QXZhaWxhYmxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAg
ICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPnNldERpc3BsYXkoTk9ORSk7CisgICAgICAg
ICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9y
KTsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50LT5kb2N1bWVudCgpLT5zZXRIYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlKCk7CisgICAgICAgIHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxh
YmxlOworICAgIH0KKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaW5pdEVsZW1l
bnQoZWxlbWVudCk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBl
bGVtZW50LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywgcmVnaW9uRm9yU3R5bGluZyk7CisgICAg
aWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJp
YnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0
eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoKTsKKyAgICAgICAgaWYgKHNoYXJlZFN0eWxlKQorICAg
ICAgICAgICAgcmV0dXJuIHNoYXJlZFN0eWxlOworICAgIH0KKworICAgIFJlZlB0cjxSZW5kZXJT
dHlsZT4gY2xvbmVGb3JQYXJlbnQ7CisKKyAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUoKSkgewor
ICAgICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShzdGF0ZS5wYXJlbnRTdHlsZSgpLCBpc0F0U2hhZG93
Qm91bmRhcnkoZWxlbWVudCkgPyBSZW5kZXJTdHlsZTo6QXRTaGFkb3dCb3VuZGFyeSA6IFJlbmRl
clN0eWxlOjpOb3RBdFNoYWRvd0JvdW5kYXJ5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0
ZS5zZXRTdHlsZShkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkpOworICAgICAgICBjbG9uZUZvclBh
cmVudCA9IFJlbmRlclN0eWxlOjpjbG9uZShzdGF0ZS5zdHlsZSgpKTsKKyAgICAgICAgc3RhdGUu
c2V0UGFyZW50U3R5bGUoY2xvbmVGb3JQYXJlbnQuZ2V0KCkpOworICAgIH0KKyAgICAvLyBjb250
ZW50ZWRpdGFibGUgYXR0cmlidXRlIChpbXBsZW1lbnRlZCBieSAtd2Via2l0LXVzZXItbW9kaWZ5
KSBzaG91bGQKKyAgICAvLyBiZSBwcm9wYWdhdGVkIGZyb20gc2hhZG93IGhvc3QgdG8gZGlzdHJp
YnV0ZWQgbm9kZS4KKyAgICBpZiAoc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkp
IHsKKyAgICAgICAgaWYgKEVsZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgaWYgKFJlbmRlclN0eWxlKiBzdHlsZU9mU2hhZG93SG9zdCA9IHBh
cmVudC0+cmVuZGVyU3R5bGUoKSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRV
c2VyTW9kaWZ5KHN0eWxlT2ZTaGFkb3dIb3N0LT51c2VyTW9kaWZ5KCkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKSB7CisgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldElzTGluayh0cnVlKTsKKyAgICAgICAgRUluc2lkZUxpbmsgbGlua1N0YXRlID0gc3Rh
dGUuZWxlbWVudExpbmtTdGF0ZSgpOworICAgICAgICBpZiAobGlua1N0YXRlICE9IE5vdEluc2lk
ZUxpbmspIHsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VWaXNpdGVkID0gSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjpmb3JjZVBzZXVkb1N0YXRlKGVsZW1lbnQsIENTU1NlbGVjdG9yOjpQc2V1ZG9W
aXNpdGVkKTsKKyAgICAgICAgICAgIGlmIChmb3JjZVZpc2l0ZWQpCisgICAgICAgICAgICAgICAg
bGlua1N0YXRlID0gSW5zaWRlVmlzaXRlZExpbms7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdGUpOworICAgIH0KKworICAgIGJvb2wgbmVl
ZHNDb2xsZWN0aW9uID0gZmFsc2U7CisgICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjplbnN1cmVE
ZWZhdWx0U3R5bGVTaGVldHNGb3JFbGVtZW50KGVsZW1lbnQsIG5lZWRzQ29sbGVjdGlvbik7Cisg
ICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKKyAgICAgICAgbV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVy
ZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZlci5nZXQoKSk7CisK
KyAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAgICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9
PSBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcykKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVz
dWx0KTsKKyAgICBlbHNlCisgICAgICAgIG1hdGNoQWxsUnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNo
aW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOworCisgICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7CisKKyAgICAvLyBDbGVhbiB1
cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcg
b3RoZXIgZml4dXBzKS4KKyAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0
ZS5wYXJlbnRTdHlsZSgpLCBlbGVtZW50KTsKKworICAgIHN0YXRlLmNsZWFyKCk7IC8vIENsZWFy
IG91dCBmb3IgdGhlIG5leHQgcmVzb2x2ZS4KKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0
eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgorICAgIHJldHVy
biBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVS
ZXNvbHZlcjo6c3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxl
LCBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSwgS2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVW
YWx1ZSkKK3sKKyAgICBNYXRjaFJlc3VsdCByZXN1bHQ7CisgICAgaWYgKGtleWZyYW1lLT5wcm9w
ZXJ0aWVzKCkpCisgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUt
PnByb3BlcnRpZXMoKSk7CisKKyAgICBBU1NFUlQoIW1fc3RhdGUuc3R5bGUoKSk7CisKKyAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgLy8gQ3JlYXRlIHRoZSBzdHlsZQorICAgIHN0
YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjbG9uZShlbGVtZW50U3R5bGUpKTsKKyAgICBzdGF0
ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGJvdGhl
ciB3aXRoICFpbXBvcnRhbnQuIFNpbmNlIHRoZXJlIGlzIG9ubHkgZXZlciBvbmUKKyAgICAvLyBk
ZWNsLCB0aGVyZSdzIG5vdGhpbmcgdG8gb3ZlcnJpZGUuIFNvIGp1c3QgYWRkIHRoZSBmaXJzdCBw
cm9wZXJ0aWVzLgorICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIGlmIChrZXlm
cmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQ
cmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIElmIG91ciBmb250IGdv
dCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KKyAgICB1cGRhdGVGb250KCk7
CisKKyAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVk
IG9uIHRoZSBmb250LXNpemUKKyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisgICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSk7CisKKyAgICAvLyBOb3cgZG8gcmVzdCBvZiB0aGUgcHJvcGVydGllcy4KKyAgICBp
ZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
czxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIElmIG91ciBm
b250IGdvdCBkaXJ0aWVkIGJ5IG9uZSBvZiB0aGUgbm9uLWVzc2VudGlhbCBmb250IHByb3BzLAor
ICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgYSBzZWNvbmQgdGltZS4KKyAgICB1cGRhdGVG
b250KCk7CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRo
aXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICAvLyBBZGQg
YWxsIHRoZSBhbmltYXRpbmcgcHJvcGVydGllcyB0byB0aGUga2V5ZnJhbWUuCisgICAgaWYgKGNv
bnN0IFN0eWxlUHJvcGVydHlTZXQqIHN0eWxlRGVjbGFyYXRpb24gPSBrZXlmcmFtZS0+cHJvcGVy
dGllcygpKSB7CisgICAgICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBzdHlsZURlY2xhcmF0
aW9uLT5wcm9wZXJ0eUNvdW50KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBw
cm9wZXJ0eUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkg
PSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUF0KGkpLmlkKCk7CisgICAgICAgICAgICAvLyBU
aW1pbmctZnVuY3Rpb24gd2l0aGluIGtleWZyYW1lcyBpcyBzcGVjaWFsLCBiZWNhdXNlIGl0IGlz
IG5vdCBhbmltYXRlZDsgaXQganVzdAorICAgICAgICAgICAgLy8gZGVzY3JpYmVzIHRoZSB0aW1p
bmcgZnVuY3Rpb24gYmV0d2VlbiB0aGlzIGtleWZyYW1lIGFuZCB0aGUgbmV4dC4KKyAgICAgICAg
ICAgIGlmIChwcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0
aW9uKQorICAgICAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuYWRkUHJvcGVydHkocHJvcGVydHkp
OworICAgICAgICB9CisgICAgfQorCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNv
bHZlcigpOworCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqIGUsIGNvbnN0IFJl
bmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIEtleWZyYW1lTGlzdCYgbGlzdCkKK3sKKyAgICBsaXN0
LmNsZWFyKCk7CisKKyAgICAvLyBHZXQgdGhlIGtleWZyYW1lc1J1bGUgZm9yIHRoaXMgbmFtZQor
ICAgIGlmICghZSB8fCBsaXN0LmFuaW1hdGlvbk5hbWUoKS5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5jaGVja0NvbnNpc3RlbmN5KCk7CisKKyAg
ICBLZXlmcmFtZXNSdWxlTWFwOjppdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzUnVsZU1hcC5maW5k
KGxpc3QuYW5pbWF0aW9uTmFtZSgpLmltcGwoKSk7CisgICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVz
UnVsZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgU3R5bGVSdWxlS2V5
ZnJhbWVzKiBrZXlmcmFtZXNSdWxlID0gaXQtPnZhbHVlLmdldCgpOworCisgICAgLy8gQ29uc3Ry
dWN0IGFuZCBwb3B1bGF0ZSB0aGUgc3R5bGUgZm9yIGVhY2gga2V5ZnJhbWUKKyAgICBjb25zdCBW
ZWN0b3I8UmVmUHRyPFN0eWxlS2V5ZnJhbWU+ID4mIGtleWZyYW1lcyA9IGtleWZyYW1lc1J1bGUt
PmtleWZyYW1lcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrZXlmcmFtZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gQXBwbHkgdGhlIGRlY2xhcmF0aW9uIHRvIHRoZSBzdHls
ZS4gVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgbG9naWMgaW4gc3R5bGVGb3JF
bGVtZW50CisgICAgICAgIGluaXRFbGVtZW50KGUpOworICAgICAgICBtX3N0YXRlLmluaXRGb3JT
dHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSk7CisKKyAgICAgICAgY29uc3QgU3R5bGVLZXlmcmFt
ZSoga2V5ZnJhbWUgPSBrZXlmcmFtZXNbaV0uZ2V0KCk7CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1
ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0
eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBrZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwor
CisgICAgICAgIC8vIEFkZCB0aGlzIGtleWZyYW1lIHN0eWxlIHRvIGFsbCB0aGUgaW5kaWNhdGVk
IGtleSB0aW1lcworICAgICAgICBWZWN0b3I8ZmxvYXQ+IGtleXM7CisgICAgICAgIGtleWZyYW1l
LT5nZXRLZXlzKGtleXMpOworICAgICAgICBmb3IgKHNpemVfdCBrZXlJbmRleCA9IDA7IGtleUlu
ZGV4IDwga2V5cy5zaXplKCk7ICsra2V5SW5kZXgpIHsKKyAgICAgICAgICAgIGtleWZyYW1lVmFs
dWUuc2V0S2V5KGtleXNba2V5SW5kZXhdKTsKKyAgICAgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZy
YW1lVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIDAlIGtleWZyYW1l
IGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25l
IG90aGVyIGtleWZyYW1lKQorICAgIGludCBpbml0aWFsTGlzdFNpemUgPSBsaXN0LnNpemUoKTsK
KyAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiBsaXN0WzBdLmtleSgpKSB7CisgICAgICAg
IHN0YXRpYyBTdHlsZUtleWZyYW1lKiB6ZXJvUGVyY2VudEtleWZyYW1lOworICAgICAgICBpZiAo
IXplcm9QZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUg
PSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7CisgICAgICAgICAgICB6ZXJvUGVy
Y2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIwJSIpOworICAgICAgICB9CisgICAgICAgIEtleWZy
YW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKKyAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRT
dHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgemVyb1BlcmNlbnRLZXlmcmFtZSwg
a2V5ZnJhbWVWYWx1ZSkpOworICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKKyAg
ICB9CisKKyAgICAvLyBJZiB0aGUgMTAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQg
KGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKKyAgICBp
ZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiAobGlzdFtsaXN0LnNpemUoKSAtIDFdLmtleSgpICE9
IDEpKSB7CisgICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiBodW5kcmVkUGVyY2VudEtleWZy
YW1lOworICAgICAgICBpZiAoIWh1bmRyZWRQZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAgICAg
IGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVm
KCk7CisgICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIxMDAl
Iik7CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDEsIDAp
OworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVu
dFN0eWxlLCBodW5kcmVkUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisgICAgICAg
IGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGUs
IGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUpCit7CisgICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKKyAgICBpZiAoIWUp
CisgICAgICAgIHJldHVybiAwOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAg
IGluaXRFbGVtZW50KGUpOworCisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVu
dCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBzdGF0ZS5zZXRT
dHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRG
cm9tKG1fc3RhdGUucGFyZW50U3R5bGUoKSk7CisKKyAgICAvLyBTaW5jZSB3ZSBkb24ndCB1c2Ug
cHNldWRvLWVsZW1lbnRzIGluIGFueSBvZiBvdXIgcXVpcmsvcHJpbnQgdXNlciBhZ2VudCBydWxl
cywgZG9uJ3Qgd2FzdGUgdGltZSB3YWxraW5nCisgICAgLy8gdGhvc2UgcnVsZXMuCisKKyAgICAv
LyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVzLgorICAgIE1hdGNoUmVzdWx0IG1hdGNo
UmVzdWx0OworICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7CisKKyAgICBpZiAobV9tYXRj
aEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1
bHQsIGZhbHNlKTsKKyAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2Up
OworICAgIH0KKworICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBl
KHBzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzKG1hdGNoUmVzdWx0LCBlKTsKKworICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3Qn
cyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgorICAg
IGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIG1fc3RhdGUucGFyZW50U3R5bGUoKSwg
MCk7CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMg
c3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworICAgIGRvY3VtZW50KCktPmRp
ZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgor
ICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCit7CisgICAgbV9z
dGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGRvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpKTsgLy8gbV9yb290RWxlbWVudFN0eWxlIHdpbGwgYmUgc2V0IHRvIHRoZSBkb2N1
bWVudCBzdHlsZS4KKworICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgp
KTsKKyAgICBtX3N0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucm9vdEVsZW1lbnRT
dHlsZSgpKTsKKworICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgp
OworICAgIGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7CisgICAg
Y29uc3QgU3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOworICAgIAorICAgIE1hdGNo
UmVzdWx0IHJlc3VsdDsKKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHls
ZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAg
bWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlz
Rmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVs
ZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KKyAgICBtYXRjaFBh
Z2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0
LCBwYWdlKTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBib29sIGlu
aGVyaXRlZE9ubHkgPSBmYWxzZTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAs
IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKyNl
bmRpZgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4o
cmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGlu
aGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFk
IGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVp
Z2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4K
KyAgICBpZiAobV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0
eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOworCisg
ICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwg
ZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRP
bmx5KTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhp
cyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAgZG9jdW1lbnQoKS0+
ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUu
CisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OmRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKQoreworICAgIG1f
c3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKKyAgICAvLyBNYWtlIHN1cmUg
b3VyIGZvbnRzIGFyZSBpbml0aWFsaXplZCBpZiB3ZSBkb24ndCBpbmhlcml0IHRoZW0gZnJvbSBv
dXIgcGFyZW50IHN0eWxlLgorICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNl
dHRpbmdzKCkpIHsKKyAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7CisgICAg
ICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7CisgICAg
fSBlbHNlCisgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZSgwKTsKKworICAg
IHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclRleHQoVGV4dCogdGV4dE5vZGUpCit7CisgICAgQVNT
RVJUKHRleHROb2RlKTsKKworICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQodGV4dE5v
ZGUpOworICAgIE5vZGUqIHBhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJp
bmdBbmRTdHlsZSgpOworICAgIHJldHVybiBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgp
IHx8ICFwYXJlbnROb2RlID8KKyAgICAgICAgZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpIDogcGFy
ZW50Tm9kZS0+cmVuZGVyU3R5bGUoKTsKK30KKworc3RhdGljIHZvaWQgYWRkSW50cmluc2ljTWFy
Z2lucyhSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgLy8gSW50cmluc2ljIG1hcmdpbiB2YWx1
ZS4KKyAgICBjb25zdCBpbnQgaW50cmluc2ljTWFyZ2luID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVa
b29tKCk7CisKKyAgICAvLyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBub3Qg
YWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCisgICAgLy8g
RklYTUU6IFVzaW5nICJxdWlyayIgdG8gZGVjaWRlIHRoZSBtYXJnaW4gd2Fzbid0IHNldCBpcyBr
aW5kIG9mIGxhbWUuCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkp
IHsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmsoKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Cisg
ICAgICAgIGlmIChzdHlsZS0+bWFyZ2luUmlnaHQoKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5
bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAg
fQorCisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgeworICAgICAgICBpZiAoc3R5
bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luVG9w
KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgICAgIGlmIChzdHlsZS0+bWFy
Z2luQm90dG9tKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20o
TGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBFRGlz
cGxheSBlcXVpdmFsZW50QmxvY2tEaXNwbGF5KEVEaXNwbGF5IGRpc3BsYXksIGJvb2wgaXNGbG9h
dGluZywgYm9vbCBzdHJpY3RQYXJzaW5nKQoreworICAgIHN3aXRjaCAoZGlzcGxheSkgeworICAg
IGNhc2UgQkxPQ0s6CisgICAgY2FzZSBUQUJMRToKKyAgICBjYXNlIEJPWDoKKyAgICBjYXNlIEZM
RVg6CisgICAgY2FzZSBHUklEOgorICAgICAgICByZXR1cm4gZGlzcGxheTsKKworICAgIGNhc2Ug
TElTVF9JVEVNOgorICAgICAgICAvLyBJdCBpcyBhIFdpbklFIGJ1ZyB0aGF0IGZsb2F0ZWQgbGlz
dCBpdGVtcyBsb3NlIHRoZWlyIGJ1bGxldHMsIHNvIHdlJ2xsIGVtdWxhdGUgdGhlIHF1aXJrLCBi
dXQgb25seSBpbiBxdWlya3MgbW9kZS4KKyAgICAgICAgaWYgKCFzdHJpY3RQYXJzaW5nICYmIGlz
RmxvYXRpbmcpCisgICAgICAgICAgICByZXR1cm4gQkxPQ0s7CisgICAgICAgIHJldHVybiBkaXNw
bGF5OworICAgIGNhc2UgSU5MSU5FX1RBQkxFOgorICAgICAgICByZXR1cm4gVEFCTEU7CisgICAg
Y2FzZSBJTkxJTkVfQk9YOgorICAgICAgICByZXR1cm4gQk9YOworICAgIGNhc2UgSU5MSU5FX0ZM
RVg6CisgICAgICAgIHJldHVybiBGTEVYOworICAgIGNhc2UgSU5MSU5FX0dSSUQ6CisgICAgICAg
IHJldHVybiBHUklEOworCisgICAgY2FzZSBJTkxJTkU6CisgICAgY2FzZSBSVU5fSU46CisgICAg
Y2FzZSBDT01QQUNUOgorICAgIGNhc2UgSU5MSU5FX0JMT0NLOgorICAgIGNhc2UgVEFCTEVfUk9X
X0dST1VQOgorICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOgorICAgIGNhc2UgVEFCTEVfRk9P
VEVSX0dST1VQOgorICAgIGNhc2UgVEFCTEVfUk9XOgorICAgIGNhc2UgVEFCTEVfQ09MVU1OX0dS
T1VQOgorICAgIGNhc2UgVEFCTEVfQ09MVU1OOgorICAgIGNhc2UgVEFCTEVfQ0VMTDoKKyAgICBj
YXNlIFRBQkxFX0NBUFRJT046CisgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICBjYXNlIE5PTkU6
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gTk9ORTsKKyAg
ICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIEJMT0NLOworfQorCisv
LyBDU1MgcmVxdWlyZXMgdGV4dC1kZWNvcmF0aW9uIHRvIGJlIHJlc2V0IGF0IGVhY2ggRE9NIGVs
ZW1lbnQgZm9yIHRhYmxlcywgCisvLyBpbmxpbmUgYmxvY2tzLCBpbmxpbmUgdGFibGVzLCBydW4t
aW5zLCBzaGFkb3cgRE9NIGNyb3NzaW5ncywgZmxvYXRpbmcgZWxlbWVudHMsCisvLyBhbmQgYWJz
b2x1dGUgb3IgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLgorc3RhdGljIGJvb2wgZG9l
c05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUp
Cit7CisgICAgcmV0dXJuIHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBJTkxJTkVfVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBSVU5fSU4KKyAgICAg
ICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgfHwgc3R5bGUtPmRpc3BsYXko
KSA9PSBJTkxJTkVfQk9YIHx8IGlzQXRTaGFkb3dCb3VuZGFyeShlKQorICAgICAgICB8fCBzdHls
ZS0+aXNGbG9hdGluZygpIHx8IHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpOworfQorCitz
dGF0aWMgYm9vbCBpc0Rpc3BsYXlGbGV4aWJsZUJveChFRGlzcGxheSBkaXNwbGF5KQoreworICAg
IHJldHVybiBkaXNwbGF5ID09IEZMRVggfHwgZGlzcGxheSA9PSBJTkxJTkVfRkxFWDsKK30KKwor
dm9pZCBTdHlsZVJlc29sdmVyOjphZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUs
IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCAqZSkKK3sKKyAgICBBU1NFUlQocGFy
ZW50U3R5bGUpOworCisgICAgLy8gQ2FjaGUgb3VyIG9yaWdpbmFsIGRpc3BsYXkuCisgICAgc3R5
bGUtPnNldE9yaWdpbmFsRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpKTsKKworICAgIGlmIChzdHls
ZS0+ZGlzcGxheSgpICE9IE5PTkUpIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIDx0ZD4gdGhh
dCBzcGVjaWZpZXMgYSBmbG9hdCBwcm9wZXJ0eSwgaW4gcXVpcmtzIG1vZGUgd2UganVzdCBkcm9w
IHRoZSBmbG9hdAorICAgICAgICAvLyBwcm9wZXJ0eS4KKyAgICAgICAgLy8gU2l0ZXMgYWxzbyBj
b21tb25seSB1c2UgZGlzcGxheTppbmxpbmUvYmxvY2sgb24gPHRkPnMgYW5kIDx0YWJsZT5zLiBJ
biBxdWlya3MgbW9kZSB3ZSBmb3JjZQorICAgICAgICAvLyB0aGVzZSB0YWdzIHRvIHJldGFpbiB0
aGVpciBkaXNwbGF5IHR5cGVzLgorICAgICAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2Rl
KCkgJiYgZSkgeworICAgICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUodGRUYWcpKSB7CisgICAg
ICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVfQ0VMTCk7CisgICAgICAgICAgICAg
ICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChl
LT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxh
eShzdHlsZS0+aXNEaXNwbGF5SW5saW5lVHlwZSgpID8gSU5MSU5FX1RBQkxFIDogVEFCTEUpOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8IGUt
Pmhhc1RhZ05hbWUodGhUYWcpKSkgeworICAgICAgICAgICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNl
KCkgPT0gS0hUTUxfTk9XUkFQKSB7CisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBpZiB3
ZSBhcmUgcmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYgd2Ugc2hvdWxkIGp1c3QKKyAgICAgICAgICAg
ICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQuIElmIHRoZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBm
aXhlZCwgdGhlbgorICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGFjdHVhbGx5IHVzZSBOT1dS
QVAuCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzRml4ZWQoKSkKKyAgICAg
ICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9STUFMKTsKKyAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JB
UCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUYWJsZXMgbmV2ZXIg
c3VwcG9ydCB0aGUgLXdlYmtpdC0qIHZhbHVlcyBmb3IgdGV4dC1hbGlnbiBhbmQgd2lsbCByZXNl
dCBiYWNrIHRvIHRoZSBkZWZhdWx0LgorICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRh
YmxlVGFnKSAmJiAoc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9MRUZUIHx8IHN0eWxlLT50
ZXh0QWxpZ24oKSA9PSBXRUJLSVRfQ0VOVEVSIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJL
SVRfUklHSFQpKQorICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihUQVNUQVJUKTsKKwor
ICAgICAgICAvLyBGcmFtZXMgYW5kIGZyYW1lc2V0cyBuZXZlciBob25vciBwb3NpdGlvbjpyZWxh
dGl2ZSBvciBwb3NpdGlvbjphYnNvbHV0ZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8KKyAgICAgICAg
Ly8gZml4IGEgY3Jhc2ggd2hlcmUgYSBzaXRlIHRyaWVzIHRvIHBvc2l0aW9uIHRoZXNlIG9iamVj
dHMuIFRoZXkgYWxzbyBuZXZlciBob25vciBkaXNwbGF5LgorICAgICAgICBpZiAoZSAmJiAoZS0+
aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpKSB7Cisg
ICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOworICAgICAgICAg
ICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAgICAgICB9CisKKyAgICAgICAgLy8gUnVi
eSB0ZXh0IGRvZXMgbm90IHN1cHBvcnQgZmxvYXQgb3IgcG9zaXRpb24uIFRoaXMgbWlnaHQgY2hh
bmdlIHdpdGggZXZvbHV0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAgICBpZiAoZSAm
JiBlLT5oYXNUYWdOYW1lKHJ0VGFnKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9u
KFN0YXRpY1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgb3ZlcnJp
ZGluZyBzdGFydC8td2Via2l0LWF1dG8gbGlrZSB0aGlzLiBEbyBpdCBpbiBodG1sLmNzcyBpbnN0
ZWFkLgorICAgICAgICAvLyBUYWJsZSBoZWFkZXJzIHdpdGggYSB0ZXh0LWFsaWduIG9mIC13ZWJr
aXQtYXV0byB3aWxsIGNoYW5nZSB0aGUgdGV4dC1hbGlnbiB0byBjZW50ZXIuCisgICAgICAgIGlm
IChlICYmIGUtPmhhc1RhZ05hbWUodGhUYWcpICYmIHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBUQVNU
QVJUKQorICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihDRU5URVIpOworCisgICAgICAg
IGlmIChlICYmIGUtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSkKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KEJMT0NLKTsKKworICAgICAgICAvLyBBYnNvbHV0ZS9maXhlZCBwb3NpdGlvbmVk
IGVsZW1lbnRzLCBmbG9hdGluZyBlbGVtZW50cyBhbmQgdGhlIGRvY3VtZW50IGVsZW1lbnQgbmVl
ZCBibG9jay1saWtlIG91dHNpZGUgZGlzcGxheS4KKyAgICAgICAgaWYgKHN0eWxlLT5oYXNPdXRP
ZkZsb3dQb3NpdGlvbigpIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgKGUgJiYgZS0+ZG9jdW1l
bnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkpCisgICAgICAgICAgICBzdHlsZS0+c2V0RGlz
cGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zs
b2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworCisgICAgICAgIC8vIEZJ
WE1FOiBEb24ndCBzdXBwb3J0IHRoaXMgbXV0YXRpb24gZm9yIHBzZXVkbyBzdHlsZXMgbGlrZSBm
aXJzdC1sZXR0ZXIgb3IgZmlyc3QtbGluZSwgc2luY2UgaXQncyBub3QgY29tcGxldGVseQorICAg
ICAgICAvLyBjbGVhciBob3cgdGhhdCBzaG91bGQgd29yay4KKyAgICAgICAgaWYgKHN0eWxlLT5k
aXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0eWxlLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiBz
dHlsZS0+d3JpdGluZ01vZGUoKSAhPSBwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisKKyAgICAgICAgLy8gQWZ0
ZXIgcGVyZm9ybWluZyB0aGUgZGlzcGxheSBtdXRhdGlvbiwgY2hlY2sgdGFibGUgcm93cy4gV2Ug
ZG8gbm90IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOnN0aWNreSBvbgorICAg
ICAgICAvLyB0YWJsZSByb3dzIG9yIGNlbGxzLiBUaGlzIGhhcyBiZWVuIGVzdGFibGlzaGVkIGZv
ciBwb3NpdGlvbjpyZWxhdGl2ZSBpbiBDU1MyLjEgKGFuZCBjYXVzZWQgYSBjcmFzaCBpbiBjb250
YWluaW5nQmxvY2soKQorICAgICAgICAvLyBvbiBzb21lIHNpdGVzKS4KKyAgICAgICAgaWYgKChz
dHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX1JPV19HUk9VUAorICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9GT09URVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpCisgICAg
ICAgICAgICAmJiBzdHlsZS0+aGFzSW5GbG93UG9zaXRpb24oKSkKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7CisKKyAgICAgICAgLy8gd3JpdGluZy1tb2Rl
IGRvZXMgbm90IGFwcGx5IHRvIHRhYmxlIHJvdyBncm91cHMsIHRhYmxlIGNvbHVtbiBncm91cHMs
IHRhYmxlIHJvd3MsIGFuZCB0YWJsZSBjb2x1bW5zLgorICAgICAgICAvLyBGSVhNRTogVGFibGUg
Y2VsbHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgcGVycGVuZGljdWxhciBvciBmbGlwcGVkIHdp
dGggcmVzcGVjdCB0byB0aGUgdGFibGUsIHRob3VnaC4KKyAgICAgICAgaWYgKHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfQ09MVU1OIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1O
X0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQCisgICAgICAg
ICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX1JPVyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19H
Uk9VUAorICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DRUxMKQorICAg
ICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgp
KTsKKworICAgICAgICAvLyBGSVhNRTogU2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBibG9jay1mbG93
IG9uIGZsZXhpYmxlIGJveGVzIHlldCwgZGlzYWxsb3cgc2V0dGluZworICAgICAgICAvLyBvZiBi
bG9jay1mbG93IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZS4K
KyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2NDE4
IC0gRmxleGlibGUgYm94IHN1cHBvcnQuCisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUo
KSAhPSBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlICYmIChzdHlsZS0+ZGlzcGxheSgpID09IEJPWCB8
fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dFdyaXRpbmdNb2RlKFRvcFRvQm90dG9tV3JpdGluZ01vZGUpOworCisgICAgICAgIGlmIChpc0Rp
c3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkgeworICAgICAgICAgICAg
c3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3Bs
YXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9h
dGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKKyAgICAgICAgfQorCisjaWYg
RU5BQkxFKERJQUxPR19FTEVNRU5UKQorICAgICAgICAvLyBQZXIgdGhlIHNwZWMsIHBvc2l0aW9u
ICdzdGF0aWMnIGFuZCAncmVsYXRpdmUnIGluIHRoZSB0b3AgbGF5ZXIgY29tcHV0ZSB0byAnYWJz
b2x1dGUnLgorICAgICAgICBpZiAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSAmJiAoc3R5bGUtPnBv
c2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gfHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gUmVsYXRp
dmVQb3NpdGlvbikpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihBYnNvbHV0ZVBv
c2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKKyAgICAgICAg
fQorI2VuZGlmCisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIG91ciB6LWluZGV4IHZhbHVlIGlz
IG9ubHkgYXBwbGllZCBpZiB0aGUgb2JqZWN0IGlzIHBvc2l0aW9uZWQuCisgICAgaWYgKHN0eWxl
LT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uICYmICFpc0Rpc3BsYXlGbGV4aWJsZUJveChw
YXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkKKyAgICAgICAgc3R5bGUtPnNldEhhc0F1dG9aSW5kZXgo
KTsKKworICAgIC8vIEF1dG8gei1pbmRleCBiZWNvbWVzIDAgZm9yIHRoZSByb290IGVsZW1lbnQg
YW5kIHRyYW5zcGFyZW50IG9iamVjdHMuIFRoaXMgcHJldmVudHMKKyAgICAvLyBjYXNlcyB3aGVy
ZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGJsZW5kZWQgYXMgYSBzaW5nbGUgdW5pdCBlbmQgdXAg
d2l0aCBhIG5vbi10cmFuc3BhcmVudAorICAgIC8vIG9iamVjdCB3ZWRnZWQgaW4gYmV0d2VlbiB0
aGVtLiBBdXRvIHotaW5kZXggYWxzbyBiZWNvbWVzIDAgZm9yIG9iamVjdHMgdGhhdCBzcGVjaWZ5
IHRyYW5zZm9ybXMvbWFza3MvcmVmbGVjdGlvbnMuCisgICAgaWYgKHN0eWxlLT5oYXNBdXRvWklu
ZGV4KCkgJiYgKChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpCisg
ICAgICAgIHx8IHN0eWxlLT5vcGFjaXR5KCkgPCAxLjBmCisgICAgICAgIHx8IHN0eWxlLT5oYXNU
cmFuc2Zvcm1SZWxhdGVkUHJvcGVydHkoKQorICAgICAgICB8fCBzdHlsZS0+aGFzTWFzaygpCisg
ICAgICAgIHx8IHN0eWxlLT5jbGlwUGF0aCgpCisgICAgICAgIHx8IHN0eWxlLT5ib3hSZWZsZWN0
KCkKKyAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpCisgICAgICAgIHx8IHN0eWxlLT5oYXNC
bGVuZE1vZGUoKQorICAgICAgICB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGlja3lQb3NpdGlv
bgorICAgICAgICB8fCAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gRml4ZWRQb3NpdGlvbiAmJiBlICYm
IGUtPmRvY3VtZW50KCktPnBhZ2UoKSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCktPnNldHRpbmdz
KCktPmZpeGVkUG9zaXRpb25DcmVhdGVzU3RhY2tpbmdDb250ZXh0KCkpCisjaWYgRU5BQkxFKEFD
Q0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykKKyAgICAgICAgLy8gVG91Y2ggb3ZlcmZsb3cg
c2Nyb2xsaW5nIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0LgorICAgICAgICB8fCAoKHN0eWxl
LT5vdmVyZmxvd1goKSAhPSBPSElEREVOIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVO
KSAmJiBzdHlsZS0+dXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZygpKQorI2VuZGlmCisjaWYgRU5B
QkxFKERJQUxPR19FTEVNRU5UKQorICAgICAgICB8fCAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSkK
KyNlbmRpZgorICAgICAgICApKQorICAgICAgICBzdHlsZS0+c2V0WkluZGV4KDApOworCisgICAg
Ly8gVGV4dGFyZWEgY29uc2lkZXJzIG92ZXJmbG93IHZpc2libGUgYXMgYXV0by4KKyAgICBpZiAo
ZSAmJiBlLT5oYXNUYWdOYW1lKHRleHRhcmVhVGFnKSkgeworICAgICAgICBzdHlsZS0+c2V0T3Zl
cmZsb3dYKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92
ZXJmbG93WCgpKTsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShzdHlsZS0+b3ZlcmZsb3dZ
KCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1koKSk7CisgICAgfQorCisg
ICAgaWYgKGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oc3R5bGUsIGUpKQorICAgICAgICBz
dHlsZS0+c2V0VGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkp
OworICAgIGVsc2UKKyAgICAgICAgc3R5bGUtPmFkZFRvVGV4dERlY29yYXRpb25zSW5FZmZlY3Qo
c3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOworCisgICAgLy8gSWYgZWl0aGVyIG92ZXJmbG93IHZh
bHVlIGlzIG5vdCB2aXNpYmxlLCBjaGFuZ2UgdG8gYXV0by4KKyAgICBpZiAoc3R5bGUtPm92ZXJm
bG93WCgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPTUFSUVVFRSkKKyAg
ICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPTUFSUVVFRSk7CisgICAgZWxzZSBpZiAoc3R5bGUt
Pm92ZXJmbG93WSgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPTUFSUVVF
RSkKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPTUFSUVVFRSk7CisgICAgZWxzZSBpZiAo
c3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBP
VklTSUJMRSkgeworICAgICAgICAvLyBGSVhNRTogT25jZSB3ZSBpbXBsZW1lbnQgcGFnaW5hdGlv
biBjb250cm9scywgb3ZlcmZsb3cteCBzaG91bGQgZGVmYXVsdCB0byBoaWRkZW4KKyAgICAgICAg
Ly8gaWYgb3ZlcmZsb3cteSBpcyBzZXQgdG8gLXdlYmtpdC1wYWdlZC14IG9yIC13ZWJraXQtcGFn
ZS15LiBGb3Igbm93LCB3ZSdsbCBsZXQgaXQKKyAgICAgICAgLy8gZGVmYXVsdCB0byBhdXRvIHNv
IHdlIGNhbiBhdCBsZWFzdCBzY3JvbGwgdGhyb3VnaCB0aGUgcGFnZXMuCisgICAgICAgIHN0eWxl
LT5zZXRPdmVyZmxvd1goT0FVVE8pOworICAgIH0gZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgp
ID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSkKKyAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WShPQVVUTyk7CisKKyAgICAvLyBDYWxsIHNldFN0eWxlc0ZvclBh
Z2luYXRpb25Nb2RlKCkgaWYgYSBwYWdpbmF0aW9uIG1vZGUgaXMgc2V0IGZvciBhbnkgbm9uLXJv
b3QgZWxlbWVudHMuIElmIHRoZXNlCisgICAgLy8gc3R5bGVzIGFyZSBzcGVjaWZpZWQgb24gYSBy
b290IGVsZW1lbnQsIHRoZW4gdGhleSB3aWxsIGJlIGluY29ycG9yYXRlZCBpbgorICAgIC8vIFN0
eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoKS4KKyAgICBpZiAoKHN0eWxlLT5vdmVyZmxv
d1koKSA9PSBPUEFHRURYIHx8IHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURZKSAmJiAhKGUg
JiYgKGUtPmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgZS0+aGFzVGFnTmFtZShib2R5VGFnKSkpKQor
ICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShXZWJDb3JlOjpwYWdpbmF0aW9uTW9k
ZUZvclJlbmRlclN0eWxlKHN0eWxlKSwgc3R5bGUpOworCisgICAgLy8gVGFibGUgcm93cywgc2Vj
dGlvbnMgYW5kIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBzdXBwb3J0IG92ZXJmbG93OmhpZGRlbiBh
bmQgd2lsbCBpZ25vcmUgc2Nyb2xsL2F1dG8uCisgICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgdGFi
bGUgc2VjdGlvbnMgd2lsbCBzdXBwb3J0IGF1dG8gYW5kIHNjcm9sbC4KKyAgICBpZiAoc3R5bGUt
PmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRQor
ICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUCB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX1JPVykgeworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgp
ICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOKQorICAgICAgICAg
ICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7CisgICAgICAgIGlmIChzdHlsZS0+b3Zl
cmZsb3dZKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pCisg
ICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKyAgICB9CisKKyAgICAv
LyBNZW51bGlzdHMgc2hvdWxkIGhhdmUgdmlzaWJsZSBvdmVyZmxvdworICAgIGlmIChzdHlsZS0+
YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkgeworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZs
b3dYKE9WSVNJQkxFKTsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Cisg
ICAgfQorCisgICAgLy8gQ3VsbCBvdXQgYW55IHVzZWxlc3MgbGF5ZXJzIGFuZCBhbHNvIHJlcGVh
dCBwYXR0ZXJucyBpbnRvIGFkZGl0aW9uYWwgbGF5ZXJzLgorICAgIHN0eWxlLT5hZGp1c3RCYWNr
Z3JvdW5kTGF5ZXJzKCk7CisgICAgc3R5bGUtPmFkanVzdE1hc2tMYXllcnMoKTsKKworICAgIC8v
IERvIHRoZSBzYW1lIGZvciBhbmltYXRpb25zIGFuZCB0cmFuc2l0aW9ucy4KKyAgICBzdHlsZS0+
YWRqdXN0QW5pbWF0aW9ucygpOworICAgIHN0eWxlLT5hZGp1c3RUcmFuc2l0aW9ucygpOworCisg
ICAgLy8gSW1wb3J0YW50OiBJbnRyaW5zaWMgbWFyZ2lucyBnZXQgYWRkZWQgdG8gY29udHJvbHMg
YmVmb3JlIHRoZSB0aGVtZSBoYXMgYWRqdXN0ZWQgdGhlIHN0eWxlLCBzaW5jZSB0aGUgdGhlbWUg
d2lsbAorICAgIC8vIGFsdGVyIGZvbnRzIGFuZCBoZWlnaHRzL3dpZHRocy4KKyAgICBpZiAoZSAm
JiBlLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpICYmIHN0eWxlLT5mb250U2l6ZSgpID49IDExKSB7
CisgICAgICAgIC8vIERvbid0IGFwcGx5IGludHJpbnNpYyBtYXJnaW5zIHRvIGltYWdlIGJ1dHRv
bnMuIFRoZSBkZXNpZ25lciBrbm93cyBob3cgYmlnIHRoZSBpbWFnZXMgYXJlLAorICAgICAgICAv
LyBzbyB3ZSBoYXZlIHRvIHRyZWF0IGFsbCBpbWFnZSBidXR0b25zIGFzIHRob3VnaCB0aGV5IHdl
cmUgZXhwbGljaXRseSBzaXplZC4KKyAgICAgICAgaWYgKCFlLT5oYXNUYWdOYW1lKGlucHV0VGFn
KSB8fCAhc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGUpLT5pc0ltYWdlQnV0dG9uKCkp
CisgICAgICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKKyAgICB9CisKKyAgICAv
LyBMZXQgdGhlIHRoZW1lIGFsc28gaGF2ZSBhIGNyYWNrIGF0IGFkanVzdGluZyB0aGUgc3R5bGUu
CisgICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAgIFJlbmRlclRoZW1lOjpk
ZWZhdWx0VGhlbWUoKS0+YWRqdXN0U3R5bGUodGhpcywgc3R5bGUsIGUsIG1fc3RhdGUuaGFzVUFB
cHBlYXJhbmNlKCksIG1fc3RhdGUuYm9yZGVyRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmREYXRh
KCksIG1fc3RhdGUuYmFja2dyb3VuZENvbG9yKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZSBmaXJz
dC1sZXR0ZXIgcHNldWRvIHN0eWxlLCBkbyBub3Qgc2hhcmUgdGhpcyBzdHlsZS4KKyAgICBpZiAo
c3R5bGUtPmhhc1BzZXVkb1N0eWxlKEZJUlNUX0xFVFRFUikpCisgICAgICAgIHN0eWxlLT5zZXRV
bmlxdWUoKTsKKworICAgIC8vIEZJWE1FOiB3aGVuIGRyb3BwaW5nIHRoZSAtd2Via2l0IHByZWZp
eCBvbiB0cmFuc2Zvcm0tc3R5bGUsIHdlIHNob3VsZCBhbHNvIGhhdmUgb3BhY2l0eSA8IDEgY2F1
c2UgZmxhdHRlbmluZy4KKyAgICBpZiAoc3R5bGUtPnByZXNlcnZlczNEKCkgJiYgKHN0eWxlLT5v
dmVyZmxvd1goKSAhPSBPVklTSUJMRQorICAgICAgICB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0g
T1ZJU0lCTEUKKyAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpKSkKKyAgICAgICAgc3R5bGUt
PnNldFRyYW5zZm9ybVN0eWxlM0QoVHJhbnNmb3JtU3R5bGUzREZsYXQpOworCisgICAgLy8gU2Vh
bWxlc3MgaWZyYW1lcyBiZWhhdmUgbGlrZSBibG9ja3MuIE1hcCB0aGVpciBkaXNwbGF5IHRvIGlu
bGluZS1ibG9jayB3aGVuIG1hcmtlZCBpbmxpbmUuCisgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFt
ZShpZnJhbWVUYWcpICYmIHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0YXRpY19jYXN0
PEhUTUxJRnJhbWVFbGVtZW50Kj4oZSktPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5KCkpCisgICAg
ICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisKKyNpZiBFTkFCTEUoU1ZHKQor
ICAgIGlmIChlICYmIGUtPmlzU1ZHRWxlbWVudCgpKSB7CisgICAgICAgIC8vIFNwZWM6IGh0dHA6
Ly93d3cudzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwjT3ZlcmZsb3dQcm9wZXJ0eQorICAgICAg
ICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9TQ1JPTEwpCisgICAgICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dZKE9ISURERU4pOworICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZ
KCkgPT0gT0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsK
KworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9TQ1JPTEwpCisgICAgICAgICAg
ICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOworICAgICAgICBlbHNlIGlmIChzdHlsZS0+
b3ZlcmZsb3dYKCkgPT0gT0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9W
SVNJQkxFKTsKKworICAgICAgICAvLyBPbmx5IHRoZSByb290IDxzdmc+IGVsZW1lbnQgaW4gYW4g
U1ZHIGRvY3VtZW50IGZyYWdtZW50IHRyZWUgaG9ub3JzIGNzcyBwb3NpdGlvbgorICAgICAgICBp
ZiAoIShlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpICYmIGUtPnBhcmVudE5vZGUoKSAm
JiAhZS0+cGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQoKSkpCisgICAgICAgICAgICBzdHlsZS0+
c2V0UG9zaXRpb24oUmVuZGVyU3R5bGU6OmluaXRpYWxQb3NpdGlvbigpKTsKKworICAgICAgICAv
LyBSZW5kZXJTVkdSb290IGhhbmRsZXMgem9vbWluZyBmb3IgdGhlIHdob2xlIFNWRyBzdWJ0cmVl
LCBzbyBmb3JlaWduT2JqZWN0IGNvbnRlbnQgc2hvdWxkCisgICAgICAgIC8vIG5vdCBiZSBzY2Fs
ZWQgYWdhaW4uCisgICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpmb3JlaWduT2Jq
ZWN0VGFnKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRFZmZlY3RpdmVab29tKFJlbmRlclN0eWxl
Ojppbml0aWFsWm9vbSgpKTsKKyAgICB9CisjZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29sdmVy
OjpjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgLy8gRklY
TUUgKEJVRyA3MjQ3Mik6IFdlIGRvbid0IGFkZCBALXdlYmtpdC1yZWdpb24gcnVsZXMgb2Ygc2Nv
cGVkIHN0eWxlIHNoZWV0cyBmb3IgdGhlIG1vbWVudCwKKyAgICAvLyBzbyBhbGwgcmVnaW9uIHJ1
bGVzIGFyZSBnbG9iYWwgYnkgZGVmYXVsdC4gVmVyaWZ5IHdoZXRoZXIgdGhhdCBjYW4gc3RhbmQg
b3IgbmVlZHMgY2hhbmdpbmcuCisKKyAgICB1bnNpZ25lZCBydWxlc1NpemUgPSBtX3J1bGVTZXRz
LmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgeworICAgICAgICBBU1NF
UlQobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRz
LmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOworICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3Rvciht
X3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQo
aSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgaWYgKG1fcnVsZVNldHMudXNlclN0eWxlKCkpIHsKKyAgICAgICAgcnVsZXNT
aXplID0gbV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0
cy5zaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsr
aSkgeworICAgICAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7CisgICAgICAgICAgICBp
ZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNl
bGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShSZW5kZXJT
dHlsZSogc3R5bGUpCit7CisgICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAg
ICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247CisgICAgZ2V0Rm9udEFu
ZEdseXBoT3JpZW50YXRpb24oc3R5bGUsIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlv
bik7CisKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiA9IHN0eWxl
LT5mb250RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoZm9udERlc2NyaXB0aW9uLm9yaWVudGF0aW9u
KCkgPT0gZm9udE9yaWVudGF0aW9uICYmIGZvbnREZXNjcmlwdGlvbi5ub25DSktHbHlwaE9yaWVu
dGF0aW9uKCkgPT0gZ2x5cGhPcmllbnRhdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgRm9u
dERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIG5l
d0ZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRp
b24pOworICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRp
b24pOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjp1cGRhdGVGb250KCkKK3sKKyAgICBpZiAoIW1fc3Rh
dGUuZm9udERpcnR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNoZWNrRm9yVGV4dFNpemVB
ZGp1c3QoKTsKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3N0YXRlLnN0eWxlKCk7CisgICAg
Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVudFN0eWxlKCkp
OworICAgIGNoZWNrRm9yWm9vbUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsK
KyAgICBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKHN0eWxlKTsKKyAgICBzdHlsZS0+Zm9udCgp
LnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7CisgICAgbV9zdGF0ZS5zZXRGb250RGlydHkoZmFsc2Up
OworfQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpzdHlsZVJ1bGVz
Rm9yRWxlbWVudChFbGVtZW50KiBlLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKK3sKKyAgICBy
ZXR1cm4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoZSwgTk9QU0VVRE8sIHJ1bGVzVG9JbmNs
dWRlKTsKK30KKworUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6cHNldWRv
U3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgUHNldWRvSWQgcHNldWRvSWQsIHVuc2ln
bmVkIHJ1bGVzVG9JbmNsdWRlKQoreworICAgIGlmICghZSB8fCAhZS0+ZG9jdW1lbnQoKS0+aGF2
ZVN0eWxlc2hlZXRzTG9hZGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgbV9zdGF0ZS5z
ZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKKworICAgIGluaXRFbGVt
ZW50KGUpOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCAw
LCBwc2V1ZG9JZCk7CisKKyAgICBNYXRjaFJlc3VsdCBkdW1teTsKKyAgICBpZiAocnVsZXNUb0lu
Y2x1ZGUgJiBVQUFuZFVzZXJDU1NSdWxlcykgeworICAgICAgICAvLyBGaXJzdCB3ZSBtYXRjaCBy
dWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgICAgICBtYXRjaFVBUnVsZXMoZHVt
bXkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgorICAgICAg
ICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAgICAgICBtYXRjaFVzZXJS
dWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKyAgICB9CisKKyAg
ICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgKHJ1bGVzVG9JbmNsdWRlICYgQXV0
aG9yQ1NTUnVsZXMpKSB7CisgICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoIShydWxl
c1RvSW5jbHVkZSAmIENyb3NzT3JpZ2luQ1NTUnVsZXMpKTsKKworICAgICAgICAvLyBDaGVjayB0
aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cy4KKyAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhkdW1t
eSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKworICAgICAgICBtX3N0YXRlLnNl
dFNhbWVPcmlnaW5Pbmx5KGZhbHNlKTsKKyAgICB9CisKKyAgICBtX3N0YXRlLnNldE1vZGUoU2Vs
ZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisKKyAgICByZXR1cm4gbV9zdGF0ZS50YWtl
UnVsZUxpc3QoKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6cnVsZU1hdGNoZXMo
Y29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNl
dWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5
IGJlaGF2aW9yQXRCb3VuZGFyeSkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisg
ICAgaWYgKHJ1bGVEYXRhLmhhc0Zhc3RDaGVja2FibGVTZWxlY3RvcigpKSB7CisgICAgICAgIC8v
IFdlIGtub3cgdGhpcyBzZWxlY3RvciBkb2VzIG5vdCBpbmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVu
dHMuCisgICAgICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBO
T1BTRVVETykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gV2Uga25vdyBh
IHN1ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkg
YmVjYXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxlIGhhc2guCisgICAgICAgIC8vIFRoaXMg
aXMgbGltaXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFt
ZXNwYWNlLgorICAgICAgICBpZiAocnVsZURhdGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGlu
Z0hUTUxCYXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQor
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChydWxl
RGF0YS5zZWxlY3RvcigpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9y
Q2hlY2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCkt
PnRhZ1FOYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBTZWxlY3Rv
ckNoZWNrZXJGYXN0UGF0aCBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aChydWxlRGF0YS5zZWxlY3Rv
cigpLCBzdGF0ZS5lbGVtZW50KCkpOworICAgICAgICBpZiAoIXNlbGVjdG9yQ2hlY2tlckZhc3RQ
YXRoLm1hdGNoZXNSaWdodG1vc3RBdHRyaWJ1dGVTZWxlY3RvcigpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRj
aGVzKCk7CisgICAgfQorCisgICAgLy8gU2xvdyBwYXRoLgorICAgIFNlbGVjdG9yQ2hlY2tlciBz
ZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgc3RhdGUubW9kZSgpKTsKKyAgICBTZWxlY3RvckNo
ZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEuc2VsZWN0b3Io
KSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQp
OworICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKKyAgICBjb250ZXh0
LnNjb3BlID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1ZG9JZCA9IHN0YXRlLnBzZXVkb1N0eWxl
UmVxdWVzdCgpLnBzZXVkb0lkOworICAgIGNvbnRleHQuc2Nyb2xsYmFyID0gc3RhdGUucHNldWRv
U3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyOworICAgIGNvbnRleHQuc2Nyb2xsYmFyUGFydCA9IHN0
YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhclBhcnQ7CisgICAgY29udGV4dC5iZWhh
dmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7CisgICAgU2VsZWN0b3JDaGVja2Vy
OjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250ZXh0LCBkeW5hbWljUHNl
dWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7CisgICAgaWYgKG1hdGNoICE9IFNl
bGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPICYm
IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IGR5bmFtaWNQc2V1ZG8pCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZVJl
c29sdmVyOjpjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxl
Y3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICBpZiAoIXJlZ2lvblNlbGVjdG9y
IHx8ICFyZWdpb25FbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTZWxlY3Rv
ckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIG1fc3RhdGUubW9kZSgpKTsKKyAg
ICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2VsZWN0b3I7IHM7IHMgPSBDU1NT
ZWxlY3Rvckxpc3Q6Om5leHQocykpIHsKKyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rv
ckNoZWNraW5nQ29udGV4dCBzZWxlY3RvckNoZWNraW5nQ29udGV4dChzLCByZWdpb25FbGVtZW50
LCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERpc2FibGVkKTsKKyAgICAgICAgUHNldWRv
SWQgaWdub3JlRHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOworICAgICAgICBpZiAoc2VsZWN0b3JD
aGVja2VyLm1hdGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0LCBpZ25vcmVEeW5hbWljUHNldWRv
LCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkgPT0gU2VsZWN0b3JDaGVja2VyOjpTZWxl
Y3Rvck1hdGNoZXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRoaXMg
aXMgbW9zdGx5IGJvcmluZyBzdHVmZiBvbiBob3cgdG8gYXBwbHkgYSBjZXJ0YWluIHJ1bGUgdG8g
dGhlIHJlbmRlcnN0eWxlLi4uCisKK0xlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9JbnRM
ZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5
bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQoreworICAgIHJl
dHVybiBwcmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4
ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZl
cnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9u
PihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOworfQor
CitMZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvRmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBy
b290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQoreworICAgIHJldHVybiBwcmltaXRpdmVWYWx1
ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRGbG9hdENvbnZlcnNpb24g
fCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252
ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwg
bXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKK30KKwordGVtcGxhdGUgPFN0eWxlUmVz
b2x2ZXI6OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFw
cGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1
bGUqIHJ1bGUsIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlX
aGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAgICBBU1NFUlQoKHByb3Bl
cnR5V2hpdGVsaXN0VHlwZSAhPSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbikgfHwgbV9zdGF0ZS5y
ZWdpb25Gb3JTdHlsaW5nKCkpOworICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBj
b29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxQcm9jZXNzUnVsZShkb2N1bWVu
dCgpLCBydWxlLCB0aGlzKTsKKworICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBwcm9wZXJ0
aWVzLT5wcm9wZXJ0eUNvdW50KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3Bl
cnR5Q291bnQ7ICsraSkgeworICAgICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVy
ZW5jZSBjdXJyZW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlBdChpKTsKKyAgICAgICAgaWYgKGlz
SW1wb3J0YW50ICE9IGN1cnJlbnQuaXNJbXBvcnRhbnQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBpZiAoaW5oZXJpdGVkT25seSAmJiAhY3VycmVudC5pc0luaGVyaXRlZCgpKSB7
CisgICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgZXhwbGljaXRseSBpbmhl
cml0ZWQsIHdlIG5lZWQgdG8gYXBwbHkgZnVydGhlciBub24taW5oZXJpdGVkIHByb3BlcnRpZXMK
KyAgICAgICAgICAgIC8vIGFzIHRoZXkgbWlnaHQgb3ZlcnJpZGUgdGhlIHZhbHVlIGluaGVyaXRl
ZCBoZXJlLiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb25zIHdpdGgK
KyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gYmUgY2Fj
aGVkLgorICAgICAgICAgICAgQVNTRVJUKCFjdXJyZW50LnZhbHVlKCktPmlzSW5oZXJpdGVkVmFs
dWUoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDU1NQcm9w
ZXJ0eUlEIHByb3BlcnR5ID0gY3VycmVudC5pZCgpOworCisgICAgICAgIGlmIChwcm9wZXJ0eVdo
aXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24gJiYgIVN0eWxlUmVzb2x2ZXI6
OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyAgICAgICAgaWYgKHByb3BlcnR5V2hpdGVs
aXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdEN1ZSAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxp
ZEN1ZVN0eWxlUHJvcGVydHkocHJvcGVydHkpKQorICAgICAgICAgICAgY29udGludWU7CisjZW5k
aWYKKyAgICAgICAgc3dpdGNoIChwYXNzKSB7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisg
ICAgICAgIGNhc2UgVmFyaWFibGVEZWZpbml0aW9uczoKKyAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKENTU1Byb3BlcnR5VmFyaWFibGUgPCBmaXJzdENTU1Byb3BlcnR5LCBDU1NfdmFyaWFibGVf
aXNfYmVmb3JlX2ZpcnN0X3Byb3BlcnR5KTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBD
U1NQcm9wZXJ0eVZhcmlhYmxlKQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVu
dC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAg
ICAgICAgY2FzZSBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzOgorICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoZmlyc3RDU1NQcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUNvbG9yLCBDU1NfY29sb3JfaXNf
Zmlyc3RfcHJvcGVydHkpOworICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHla
b29tID09IENTU1Byb3BlcnR5Q29sb3IgKyAxOCwgQ1NTX3pvb21faXNfZW5kX29mX2ZpcnN0X3By
b3BfcmFuZ2UpOworICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlMaW5lSGVp
Z2h0ID09IENTU1Byb3BlcnR5Wm9vbSArIDEsIENTU19saW5lX2hlaWdodF9pc19hZnRlcl96b29t
KTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9
PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlm
CisgICAgICAgICAgICAvLyBnaXZlIHNwZWNpYWwgcHJpb3JpdHkgdG8gZm9udC14eHgsIGNvbG9y
IHByb3BlcnRpZXMsIGV0YworICAgICAgICAgICAgaWYgKHByb3BlcnR5IDwgQ1NTUHJvcGVydHlM
aW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBj
dXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgLy8gd2UgYXBwbHkgbGluZS1oZWlnaHQgbGF0
ZXIKKyAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5TGluZUhlaWdo
dCkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZShjdXJyZW50LnZh
bHVlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTG93UHJpb3JpdHlQcm9w
ZXJ0aWVzOgorICAgICAgICAgICAgaWYgKHByb3BlcnR5ID4gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0
KQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50LnZh
bHVlKCkpOworICAgICAgICB9CisgICAgfQorICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkUHJvY2Vzc1J1bGUoY29va2llKTsKK30KKwordGVtcGxhdGUgPFN0eWxlUmVzb2x2ZXI6OlN0
eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBib29sIGlzSW1wb3J0
YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9ubHkpCit7
CisgICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpCisgICAgICAgIHJldHVybjsKKworICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKHN0YXRlLnN0eWxlKCktPmluc2lkZUxpbmsoKSAh
PSBOb3RJbnNpZGVMaW5rKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9
IGVuZEluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiBt
YXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldOworICAg
ICAgICAgICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IG1hdGNoZWRQcm9wZXJ0aWVzLmxpbmtN
YXRjaFR5cGU7CisgICAgICAgICAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZXIgdG8gcGFz
cyB0aGVzZSBhcyBhcmd1bWVudHMgYnV0IHRoYXQgcmVxdWlyZXMgY2hhbmdlcyBpbiBtYW55IHBs
YWNlcy4KKyAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShs
aW5rTWF0Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpNYXRjaExpbmspOworICAgICAgICAgICAg
c3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShsaW5rTWF0Y2hUeXBlICYg
U2VsZWN0b3JDaGVja2VyOjpNYXRjaFZpc2l0ZWQpOworCisgICAgICAgICAgICBhcHBseVByb3Bl
cnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJvcGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1
bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwgaW5oZXJpdGVkT25seSwgc3RhdGljX2Nh
c3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVkUHJvcGVydGllcy53aGl0ZWxpc3RUeXBl
KSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0
eWxlKHRydWUpOworICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBpID0gc3Rh
cnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7CisgICAgICAgIGNvbnN0IE1hdGNoZWRQcm9w
ZXJ0aWVzJiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
W2ldOworICAgICAgICBhcHBseVByb3BlcnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJv
cGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwg
aW5oZXJpdGVkT25seSwgc3RhdGljX2Nhc3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVk
UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlKSk7CisgICAgfQorfQorCit1bnNpZ25lZCBTdHlsZVJl
c29sdmVyOjpjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNIYXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0
aWVzKiBwcm9wZXJ0aWVzLCB1bnNpZ25lZCBzaXplKQoreworICAgIAorICAgIHJldHVybiBTdHJp
bmdIYXNoZXI6Omhhc2hNZW1vcnkocHJvcGVydGllcywgc2l6ZW9mKE1hdGNoZWRQcm9wZXJ0aWVz
KSAqIHNpemUpOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQoreworICAg
IHJldHVybiBhLmZpcnN0VUFSdWxlID09IGIuZmlyc3RVQVJ1bGUKKyAgICAgICAgJiYgYS5sYXN0
VUFSdWxlID09IGIubGFzdFVBUnVsZQorICAgICAgICAmJiBhLmZpcnN0QXV0aG9yUnVsZSA9PSBi
LmZpcnN0QXV0aG9yUnVsZQorICAgICAgICAmJiBhLmxhc3RBdXRob3JSdWxlID09IGIubGFzdEF1
dGhvclJ1bGUKKyAgICAgICAgJiYgYS5maXJzdFVzZXJSdWxlID09IGIuZmlyc3RVc2VyUnVsZQor
ICAgICAgICAmJiBhLmxhc3RVc2VyUnVsZSA9PSBiLmxhc3RVc2VyUnVsZTsKK30KKworYm9vbCBv
cGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHls
ZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOworfQor
Citib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQoreworICAgIHJl
dHVybiBhLnByb3BlcnRpZXMgPT0gYi5wcm9wZXJ0aWVzICYmIGEubGlua01hdGNoVHlwZSA9PSBi
LmxpbmtNYXRjaFR5cGU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVy
OjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3Bl
cnRpZXMmIGIpCit7CisgICAgcmV0dXJuICEoYSA9PSBiKTsKK30KKworY29uc3QgU3R5bGVSZXNv
bHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIFN0eWxlUmVzb2x2ZXI6OmZpbmRGcm9t
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYg
bWF0Y2hSZXN1bHQpCit7CisgICAgQVNTRVJUKGhhc2gpOworCisgICAgTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZmluZChoYXNo
KTsKKyAgICBpZiAoaXQgPT0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSYgY2FjaGVJdGVtID0g
aXQtPnZhbHVlOworCisgICAgc2l6ZV90IHNpemUgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCk7CisgICAgaWYgKHNpemUgIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVz
LnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
aXplOyArK2kpIHsKKyAgICAgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ld
ICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllc1tpXSkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgIH0KKyAgICBpZiAoY2FjaGVJdGVtLnJhbmdlcyAhPSBtYXRjaFJlc3VsdC5yYW5nZXMp
CisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAmY2FjaGVJdGVtOworfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHls
ZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgdW5zaWduZWQgaGFzaCwg
Y29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQoreworICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5Td2VlcHMgPSAxMDA7
CisgICAgaWYgKCsrbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dl
ZXAgPj0gbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dlZXBzCisgICAg
ICAgICYmICFtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLmlzQWN0aXZlKCkpIHsK
KyAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlU3dl
ZXBUaW1lSW5TZWNvbmRzID0gNjA7CisgICAgICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3
ZWVwVGltZXIuc3RhcnRPbmVTaG90KG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlU3dlZXBUaW1lSW5T
ZWNvbmRzKTsKKyAgICB9CisKKyAgICBBU1NFUlQoaGFzaCk7CisgICAgTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZUl0ZW0gY2FjaGVJdGVtOworICAgIGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllcy5h
cHBlbmQobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMpOworICAgIGNhY2hlSXRlbS5yYW5n
ZXMgPSBtYXRjaFJlc3VsdC5yYW5nZXM7CisgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGNhY2hl
IHRoZSBvcmlnaW5hbCBSZW5kZXJTdHlsZSBpbnN0YW5jZS4gSXQgbWF5IGJlIGZ1cnRoZXIgbW9k
aWZpZWQuCisgICAgLy8gVGhlIFJlbmRlclN0eWxlIGluIHRoZSBjYWNoZSBpcyByZWFsbHkganVz
dCBhIGhvbGRlciBmb3IgdGhlIHN1YnN0cnVjdHVyZXMgYW5kIG5ldmVyIHVzZWQgYXMtaXMuCisg
ICAgY2FjaGVJdGVtLnJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHN0eWxlKTsKKyAg
ICBjYWNoZUl0ZW0ucGFyZW50UmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocGFyZW50
U3R5bGUpOworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5hZGQoaGFzaCwgY2FjaGVJdGVt
KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjppbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXND
YWNoZSgpCit7CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmNsZWFyKCk7Cit9CisKK3N0
YXRpYyBib29sIGlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IEVsZW1l
bnQqIGVsZW1lbnQsIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlKQoreworICAgIC8vIEZJWE1FOiBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdN
b2RlIG1vZGlmaWVzIHN0YXRlIHdoZW4gYXBwbHlpbmcgdG8gZG9jdW1lbnQgZWxlbWVudC4gV2Ug
Y2FuJ3Qgc2tpcCB0aGUgYXBwbHlpbmcgYnkgY2FjaGluZy4KKyAgICBpZiAoZWxlbWVudCA9PSBl
bGVtZW50LT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSAmJiBlbGVtZW50LT5kb2N1bWVu
dCgpLT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpIHx8IChzdHlsZS0+c3R5bGVUeXBlKCkgIT0g
Tk9QU0VVRE8gJiYgcGFyZW50U3R5bGUtPnVuaXF1ZSgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKHN0eWxlLT56b29tKCkgIT0gUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gUmVu
ZGVyU3R5bGU6OmluaXRpYWxXcml0aW5nTW9kZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgLy8gVGhlIGNhY2hlIGFzc3VtZXMgc3RhdGljIGtub3dsZWRnZSBhYm91dCB3aGljaCBwcm9w
ZXJ0aWVzIGFyZSBpbmhlcml0ZWQuCisgICAgaWYgKHBhcmVudFN0eWxlLT5oYXNFeHBsaWNpdGx5
SW5oZXJpdGVkUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhj
b25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7
CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAg
dW5zaWduZWQgY2FjaGVIYXNoID0gbWF0Y2hSZXN1bHQuaXNDYWNoZWFibGUgPyBjb21wdXRlTWF0
Y2hlZFByb3BlcnRpZXNIYXNoKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmRhdGEoKSwg
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKSA6IDA7CisgICAgYm9vbCBhcHBs
eUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hl
SXRlbSogY2FjaGVJdGVtID0gMDsKKyAgICBpZiAoY2FjaGVIYXNoICYmIChjYWNoZUl0ZW0gPSBm
aW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCkpKSB7
CisgICAgICAgIC8vIFdlIGNhbiBidWlsZCB1cCB0aGUgc3R5bGUgYnkgY29weWluZyBub24taW5o
ZXJpdGVkIHByb3BlcnRpZXMgZnJvbSBhbiBlYXJsaWVyIHN0eWxlIG9iamVjdCBidWlsdCB1c2lu
ZyB0aGUgc2FtZSBleGFjdAorICAgICAgICAvLyBzdHlsZSBkZWNsYXJhdGlvbnMuIFdlIHRoZW4g
b25seSBuZWVkIHRvIGFwcGx5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcywgaWYgYW55LCBhcyB0
aGVpciB2YWx1ZXMgY2FuIGRlcGVuZCBvbiB0aGUgCisgICAgICAgIC8vIGVsZW1lbnQgY29udGV4
dC4gVGhpcyBpcyBmYXN0IGFuZCBzYXZlcyBtZW1vcnkgYnkgcmV1c2luZyB0aGUgc3R5bGUgZGF0
YSBzdHJ1Y3R1cmVzLgorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jb3B5Tm9uSW5oZXJpdGVkRnJv
bShjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKKyAgICAgICAgaWYgKHN0YXRlLnBhcmVu
dFN0eWxlKCktPmluaGVyaXRlZERhdGFTaGFyZWQoY2FjaGVJdGVtLT5wYXJlbnRSZW5kZXJTdHls
ZS5nZXQoKSkgJiYgIWlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSkgeworICAgICAgICAgICAg
RUluc2lkZUxpbmsgbGlua1N0YXR1cyA9IHN0YXRlLnN0eWxlKCktPmluc2lkZUxpbmsoKTsKKyAg
ICAgICAgICAgIC8vIElmIHRoZSBjYWNoZSBpdGVtIHBhcmVudCBzdHlsZSBoYXMgaWRlbnRpY2Fs
IGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJyZW50IHBhcmVudCBzdHlsZSB0aGVuIHRo
ZQorICAgICAgICAgICAgLy8gcmVzdWx0aW5nIHN0eWxlIHdpbGwgYmUgaWRlbnRpY2FsIHRvby4g
V2UgY29weSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMgb3ZlciBmcm9tIHRoZSBjYWNoZSBhbmQg
YXJlIGRvbmUuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShjYWNoZUl0
ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKKworICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSB0
aGUgbGluayBzdGF0dXMgaXMgdHJlYXRlZCBsaWtlIGFuIGluaGVyaXRlZCBwcm9wZXJ0eS4gV2Ug
bmVlZCB0byBleHBsaWNpdGx5IHJlc3RvcmUgaXQuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IHRydWU7IAorICAgIH0KKworI2lmIEVO
QUJMRShDU1NfVkFSSUFCTEVTKQorICAgIC8vIEZpcnN0IGFwcGx5IGFsbCB2YXJpYWJsZSBkZWZp
bml0aW9ucywgYXMgdGhleSBtYXkgYmUgdXNlZCBkdXJpbmcgYXBwbGljYXRpb24gb2YgbGF0ZXIg
cHJvcGVydGllcy4KKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlv
bnM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5y
YW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJs
ZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0
VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVk
T25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPiht
YXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJl
c3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyNlbmRpZgorCisg
ICAgLy8gTm93IHdlIGhhdmUgYWxsIG9mIHRoZSBtYXRjaGVkIHJ1bGVzIGluIHRoZSBhcHByb3By
aWF0ZSBvcmRlci4gV2FsayB0aGUgcnVsZXMgYW5kIGFwcGx5CisgICAgLy8gaGlnaC1wcmlvcml0
eSBwcm9wZXJ0aWVzIGZpcnN0LCBpLmUuLCB0aG9zZSBwcm9wZXJ0aWVzIHRoYXQgb3RoZXIgcHJv
cGVydGllcyBkZXBlbmQgb24uCisgICAgLy8gVGhlIG9yZGVyIGlzICgxKSBoaWdoLXByaW9yaXR5
IG5vdCBpbXBvcnRhbnQsICgyKSBoaWdoLXByaW9yaXR5IGltcG9ydGFudCwgKDMpIG5vcm1hbCBu
b3QgaW1wb3J0YW50CisgICAgLy8gYW5kICg0KSBub3JtYWwgaW1wb3J0YW50LgorICAgIHN0YXRl
LnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQ
cmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0
cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5n
ZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNl
clJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxI
aWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKKworICAgIGlmIChjYWNoZUl0ZW0gJiYgY2FjaGVJdGVtLT5yZW5kZXJTdHls
ZS0+ZWZmZWN0aXZlWm9vbSgpICE9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSkgewor
ICAgICAgICBzdGF0ZS5zZXRGb250RGlydHkodHJ1ZSk7CisgICAgICAgIGFwcGx5SW5oZXJpdGVk
T25seSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBn
byBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KKyAgICB1cGRhdGVGb250KCk7CisKKyAgICAvLyBM
aW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250
LXNpemUuCisgICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAgICBhcHBseVBy
b3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwor
CisgICAgLy8gTWFueSBwcm9wZXJ0aWVzIGRlcGVuZCBvbiB0aGUgZm9udC4gSWYgaXQgY2hhbmdl
cyB3ZSBqdXN0IGFwcGx5IGFsbCBwcm9wZXJ0aWVzLgorICAgIGlmIChjYWNoZUl0ZW0gJiYgY2Fj
aGVJdGVtLT5yZW5kZXJTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCkgIT0gc3RhdGUuc3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCkpCisgICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOwor
CisgICAgLy8gTm93IGRvIHRoZSBub3JtYWwgcHJpb3JpdHkgVUEgcHJvcGVydGllcy4KKyAgICBh
cHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQs
IGZhbHNlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdl
cy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIAorICAgIC8vIENhY2hlIG91
ciBib3JkZXIgYW5kIGJhY2tncm91bmQgc28gdGhhdCB3ZSBjYW4gZXhhbWluZSB0aGVtIGxhdGVy
LgorICAgIHN0YXRlLmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOworICAgIAorICAgIC8vIE5v
dyBkbyB0aGUgYXV0aG9yIGFuZCB1c2VyIG5vcm1hbCBwcmlvcml0eSBwcm9wZXJ0aWVzIGFuZCBh
bGwgdGhlICFpbXBvcnRhbnQgcHJvcGVydGllcy4KKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
PExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCBtYXRjaFJlc3VsdC5y
YW5nZXMubGFzdFVBUnVsZSArIDEsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxM
b3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5n
ZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFw
cGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0
eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RV
c2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRP
bmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4o
bWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAKKyAgICAv
LyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAg
bG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICBBU1NFUlQoIXN0YXRlLmZvbnREaXJ0
eSgpKTsKKyAgICAKKyAgICBpZiAoY2FjaGVJdGVtIHx8ICFjYWNoZUhhc2gpCisgICAgICAgIHJl
dHVybjsKKyAgICBpZiAoIWlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRl
LmVsZW1lbnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSkpCisgICAgICAg
IHJldHVybjsKKyAgICBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuc3R5bGUoKSwg
c3RhdGUucGFyZW50U3R5bGUoKSwgY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCk7Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBj
b25zdCBTdHlsZVJ1bGVQYWdlKiByMikKK3sKKyAgICByZXR1cm4gcjEtPnNlbGVjdG9yKCktPnNw
ZWNpZmljaXR5KCkgPCByMi0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKTsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0
KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcm
IHBhZ2VOYW1lKQoreworICAgIGlmICghcnVsZXMpCisgICAgICAgIHJldHVybjsKKworICAgIFZl
Y3RvcjxTdHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VSdWxlczsKKyAgICBtYXRjaFBhZ2VSdWxl
c0Zvckxpc3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMtPnBhZ2VSdWxlcygpLCBpc0xlZnRQYWdl
LCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpOworICAgIGlmIChtYXRjaGVkUGFnZVJ1bGVzLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RkOjpzdGFibGVfc29ydChtYXRjaGVkUGFn
ZVJ1bGVzLmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMuZW5kKCksIGNvbXBhcmVQYWdlUnVsZXMp
OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRQYWdlUnVsZXMuc2l6ZSgp
OyBpKyspCisgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgbWF0Y2hlZFBhZ2VS
dWxlc1tpXS0+cHJvcGVydGllcygpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0
b3JDb21wb25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdl
LCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZvciAo
Y29uc3QgQ1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVjdG9yOyBjb21wb25lbnQ7IGNvbXBv
bmVudCA9IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7CisgICAgICAgIGlmIChjb21wb25lbnQt
Pm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgeworICAgICAgICAgICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FOYW1lKCkubG9jYWxOYW1lKCk7Cisg
ICAgICAgICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIGxvY2FsTmFtZSAhPSBwYWdl
TmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAg
ICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9U
eXBlKCk7CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVm
dFBhZ2UgJiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NT
ZWxlY3Rvcjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAo
cHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFn
ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFBhZ2VS
dWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBW
ZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmly
c3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHlsZVJ1bGVQYWdlKiBydWxl
ID0gcnVsZXNbaV07CisKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMo
cnVsZS0+c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9w
ZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4KKyAgICAgICAgY29uc3QgU3R5bGVQcm9w
ZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKCFw
cm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxl
cy4KKyAgICAgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKKyAgICB9Cit9CisKK2Jvb2wg
U3R5bGVSZXNvbHZlcjo6aXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIGJv
b2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50
U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICBpc0ZpcnN0UGFnZUxl
ZnQgPSB0cnVlOworCisgICAgcmV0dXJuIChwYWdlSW5kZXggKyAoaXNGaXJzdFBhZ2VMZWZ0ID8g
MSA6IDApKSAlIDI7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6aXNGaXJzdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogSW4gY2FzZSBvZiBmb3JjZWQgbGVmdC9y
aWdodCBwYWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUgdGhlIGZpcnN0IHBhZ2Uu
CisgICAgcmV0dXJuICghcGFnZUluZGV4KTsKK30KKworU3RyaW5nIFN0eWxlUmVzb2x2ZXI6OnBh
Z2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEltcGxl
bWVudCBwYWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBwaW5nLgorICAgIHJldHVybiAiIjsKK30K
Kwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlE
IGlkLCBDU1NWYWx1ZSogdmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBpbml0RWxl
bWVudCgwKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgMCwg
c3R5bGUpOworICAgIG1fc3RhdGUuc2V0U3R5bGUoc3R5bGUpOworICAgIGFwcGx5UHJvcGVydHlU
b0N1cnJlbnRTdHlsZShpZCwgdmFsdWUpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5
UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUp
Cit7CisgICAgaWYgKHZhbHVlKQorICAgICAgICBhcHBseVByb3BlcnR5KGlkLCB2YWx1ZSk7Cit9
CisKK2lubGluZSBib29sIGlzVmFsaWRWaXNpdGVkTGlua1Byb3BlcnR5KENTU1Byb3BlcnR5SUQg
aWQpCit7CisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6
CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIENTU1Byb3BlcnR5RmlsbDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5U3Ryb2tlOgorI2VuZGlmCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1
bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8g
aHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxl
LXJ1bGUKKy8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9u
IHN0eWxpbmcgcHJvcGVydGllcy4KK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRS
ZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkg
eworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUNvbG9yOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBi
cmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZiBFTkFCTEUoVklERU9f
VFJBQ0spCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1l
bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFn
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udEZhbWlseToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWln
aHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91
dGxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5T3V0bGluZU9mZnNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVZp
c2liaWxpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHREZWNvcmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30K
KyNlbmRpZgorLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFy
ZWQgdG8gQ1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKKy8vIG9mIGVh
Y2ggaW5kaXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENT
U1ByaW1pdGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigpCisvLyBtdWx0aXBsaWVzIGVhY2ggcmVz
b2x2ZWQgbGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVl
ZCB0byBkaXNhYmxlIHRoYXQuCisvLyBUaG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUg
YXBwbGllZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIv
cGFkZGluZy4uLikKKy8vIG5lZWQgdG8gcmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0
aGUgcGFyZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCisvLyB3
aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZv
ciBTVkcgdGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNjYWxlLAorLy8gaWYgd2UnZCBwYXNzIGEg
MS4wIHpvb20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9y
IG9mIDEuMCBmb3Igc3BlY2lmaWMKKy8vIHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQg
dG8gc2NhbGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2lu
Zy9mb250LXNpemUpLgorYm9vbCBTdHlsZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQorewor
ICAgIHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdF
bGVtZW50KCk7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJp
bWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYg
c3RhdGUsIExlbmd0aCYgd29ya2luZ0xlbmd0aCkKK3sKKyAgICBpZiAocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5Db250ZW50KSB7CisgICAgICAgIHdvcmtp
bmdMZW5ndGggPSBMZW5ndGgoTWluQ29udGVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtp
dE1heENvbnRlbnQpIHsKKyAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50
KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgd29ya2luZ0xlbmd0aCA9IHBy
aW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBl
cmNlbnRDb252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252
ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0
eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7CisgICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmlu
ZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5p
c0xlbmd0aCgpKQorICAgICAgICB3b3JraW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVl
LT5pc1F1aXJrVmFsdWUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wg
Y3JlYXRlR3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1Np
emUpCit7CisgICAgUGFpciogbWluTWF4VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdl
dFBhaXJWYWx1ZSgpOworICAgIGlmICghbWluTWF4VHJhY2tCcmVhZHRoKSB7CisgICAgICAgIExl
bmd0aCB3b3JraW5nTGVuZ3RoOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgo
cHJpbWl0aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICB0cmFja1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRo
OworICAgIExlbmd0aCBtYXhUcmFja0JyZWFkdGg7CisgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tC
cmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0
aCkgfHwgIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQo
KSwgc3RhdGUsIG1heFRyYWNrQnJlYWR0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IHRyYWNrU2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwor
ICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChD
U1NWYWx1ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9y
PEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzKQoreworICAgIGlmICghdmFsdWUtPmlzVmFsdWVM
aXN0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRl
cmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgQ1NT
VmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlz
UHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBH
cmlkVHJhY2tTaXplIHRyYWNrU2l6ZTsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5N
YXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJh
Y2tTaXplKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0cmFja1NpemVz
LmFwcGVuZCh0cmFja1NpemUpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGlj
IGJvb2wgY3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJh
Y2tTaXplPiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQor
eworICAgIC8vIEhhbmRsZSAnbm9uZScuCisgICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVl
KCkpIHsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHJldHVybiBwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmU7CisgICAgfQorCisgICAgcmV0dXJu
IGNyZWF0ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Cit9CisKKwor
c3RhdGljIGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0
aW9uJiBwb3NpdGlvbikKK3sKKyAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVn
ZXI+IHwgJ2F1dG8nCisgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICBpZiAocHJpbWl0
aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVl
LT5pc051bWJlcigpKTsKKyAgICBwb3NpdGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZl
VmFsdWUtPmdldEludFZhbHVlKCkpOworICAgIHJldHVybiB0cnVlOworfQorCisjaWYgRU5BQkxF
KENTU19WQVJJQUJMRVMpCitzdGF0aWMgYm9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1
ZSogdmFsdWUpCit7CisgICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFz
VmFyaWFibGVSZWZlcmVuY2UoKTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRp
b25WYWx1ZSgpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFs
dWUpLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOworCisgICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RW
YWx1ZSgpKSB7CisgICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogZGlyZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7CisgICAgICAgIENT
U1ZhbHVlKiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNrKCk7CisgICAgICAgIHJldHVybiAoZGly
ZWN0aW9uICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYg
aGFzVmFyaWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZl
cmVuY2UobWFzaykpOworICAgIH0KKworICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9
IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgaWYgKGhhc1Zhcmlh
YmxlUmVmZXJlbmNlKGkudmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZh
cmlhYmxlcyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBh
aXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKQoreworICAgIHN0
ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJp
YWxpemVSZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsK
KworICAgIGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQorICAgICAg
ICByZXR1cm47IC8vIGN5Y2xlIGRldGVjdGVkLgorCisgICAga25vd25FeHByZXNzaW9ucy5hcHBl
bmQoZXhwcmVzc2lvbik7CisKKyAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0
byByZS1wYXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0
aW9uIGxpdmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdlIGRvIGl0IHRoZXJlLgorICAgIFJlZlB0
cjxTdHlsZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUo
KTsKKyAgICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBl
eHByZXNzaW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50KCkpKQorICAgICAgICByZXR1cm47IC8v
IGV4cHJlc3Npb24gZmFpbGVkIHRvIHBhcnNlLgorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHJlc3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBpKyspIHsKKyAgICAgICAgU3R5bGVQcm9w
ZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5
QXQoaSk7CisgICAgICAgIGlmIChwcm9wZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUg
JiYgaGFzVmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHkudmFsdWUoKSkpCisgICAgICAgICAgICBy
ZXNvbHZlVmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhw
cmVzc2lvbnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3Bl
cnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCkpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZh
bHVlKQoreworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGlmIChpZCAhPSBDU1NQcm9w
ZXJ0eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHZhbHVlKSkgeworICAgICAgICBW
ZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25z
OworICAgICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIENTUyB2YXJpYWJsZXMg
ZG9uJ3QgcmVzb2x2ZSBzaG9ydGhhbmRzIGF0IHBhcnNpbmcgdGltZSwgc28gdGhpcyBzaG91bGQg
YmUgKmFmdGVyKiBoYW5kbGluZyB2YXJpYWJsZXMuCisgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSgh
aXNFeHBhbmRlZFNob3J0aGFuZChpZCksICJTaG9ydGhhbmQgcHJvcGVydHkgaWQgPSAlZCB3YXNu
J3QgZXhwYW5kZWQgYXQgcGFyc2luZyB0aW1lIiwgaWQpOworCisgICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKKyAgICBib29sIGlzSW5oZXJpdCA9IHN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1
ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpOworICAgIGJvb2wgaXNJbml0aWFsID0gdmFsdWUtPmlzSW5p
dGlhbFZhbHVlKCkgfHwgKCFzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVk
VmFsdWUoKSk7CisKKyAgICBBU1NFUlQoIWlzSW5oZXJpdCB8fCAhaXNJbml0aWFsKTsgLy8gaXNJ
bmhlcml0IC0+ICFpc0luaXRpYWwgJiYgaXNJbml0aWFsIC0+ICFpc0luaGVyaXQKKyAgICBBU1NF
UlQoIWlzSW5oZXJpdCB8fCAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxl
KCkpKTsgLy8gaXNJbmhlcml0IC0+IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUucGFyZW50
U3R5bGUoKSkKKworICAgIGlmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkg
JiYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgfHwgIWlzVmFsaWRW
aXNpdGVkTGlua1Byb3BlcnR5KGlkKSkpIHsKKyAgICAgICAgLy8gTGltaXQgdGhlIHByb3BlcnRp
ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvbmx5IHRoZSBvbmVzIGhvbm9yZWQgYnkgOnZpc2l0
ZWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNJbmhlcml0ICYmICFzdGF0
ZS5wYXJlbnRTdHlsZSgpLT5oYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpICYmICFD
U1NQcm9wZXJ0eTo6aXNJbmhlcml0ZWRQcm9wZXJ0eShpZCkpCisgICAgICAgIHN0YXRlLnBhcmVu
dFN0eWxlKCktPnNldEhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCk7CisKKyNpZiBF
TkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkg
eworICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTih2YWx1ZS0+aXNWYXJp
YWJsZVZhbHVlKCkpOworICAgICAgICBDU1NWYXJpYWJsZVZhbHVlKiB2YXJpYWJsZSA9IHN0YXRp
Y19jYXN0PENTU1ZhcmlhYmxlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIEFTU0VSVCghdmFyaWFi
bGUtPm5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT52YWx1ZSgp
LmlzRW1wdHkoKSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFZhcmlhYmxlKHZhcmlhYmxl
LT5uYW1lKCksIHZhcmlhYmxlLT52YWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNl
bmRpZgorCisgICAgLy8gQ2hlY2sgbG9va3VwIHRhYmxlIGZvciBpbXBsZW1lbnRhdGlvbnMgYW5k
IHVzZSB3aGVuIGF2YWlsYWJsZS4KKyAgICBjb25zdCBQcm9wZXJ0eUhhbmRsZXImIGhhbmRsZXIg
PSBtX3N0eWxlQnVpbGRlci5wcm9wZXJ0eUhhbmRsZXIoaWQpOworICAgIGlmIChoYW5kbGVyLmlz
VmFsaWQoKSkgeworICAgICAgICBpZiAoaXNJbmhlcml0KQorICAgICAgICAgICAgaGFuZGxlci5h
cHBseUluaGVyaXRWYWx1ZShpZCwgdGhpcyk7CisgICAgICAgIGVsc2UgaWYgKGlzSW5pdGlhbCkK
KyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbml0aWFsVmFsdWUoaWQsIHRoaXMpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBoYW5kbGVyLmFwcGx5VmFsdWUoaWQsIHRoaXMsIHZhbHVlKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRp
dmVWYWx1ZSA9IHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHZhbHVlKSA6IDA7CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3RhdGUu
c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworCisgICAgLy8gV2hhdCBmb2xsb3dzIGlzIGEgbGlz
dCB0aGF0IG1hcHMgdGhlIENTUyBwcm9wZXJ0aWVzIGludG8gdGhlaXIgY29ycmVzcG9uZGluZyBm
cm9udC1lbmQKKyAgICAvLyBSZW5kZXJTdHlsZSB2YWx1ZXMuCisgICAgc3dpdGNoIChpZCkgewor
ICAgIC8vIGxpc3RzCisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6CisgICAgICAgIC8vIGxp
c3Qgb2Ygc3RyaW5nLCB1cmksIGNvdW50ZXIsIGF0dHIsIGkKKyAgICAgICAgeworICAgICAgICAg
ICAgLy8gRklYTUU6IEluIENTUzMsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gaW5oZXJpdCBjb250
ZW50LiBJbiBDU1MyIGl0IGlzIG5vdC4gVGhpcworICAgICAgICAgICAgLy8gbm90ZSBpcyBhIHJl
bWluZGVyIHRoYXQgZXZlbnR1YWxseSAiaW5oZXJpdCIgbmVlZHMgdG8gYmUgc3VwcG9ydGVkLgor
CisgICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgYm9vbCBkaWRTZXQgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsg
aS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGkudmFsdWUo
KTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzR3JhZGllbnRWYWx1ZSgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRl
ZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KGl0ZW0pLT5ncmFk
aWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSksIGRpZFNldCk7CisgICAgICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dENvbnRlbnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRpY19jYXN0PENTU0ltYWdl
R2VuZXJhdG9yVmFsdWUqPihpdGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRp
ZFNldCA9IHRydWU7CisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisgICAgICAgICAgICAgICAg
fSBlbHNlIGlmIChpdGVtLT5pc0ltYWdlU2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9w
ZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlU2V0VmFsdWUqPihpdGVtKSksIGRpZFNl
dCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisjZW5kaWYKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZVZhbHVlKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjYWNoZWRPclBl
bmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZh
bHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
Y29udGVudFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsKKwor
ICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWUtPmlzU3RyaW5nKCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb250ZW50VmFsdWUtPmdldFN0
cmluZ1ZhbHVlKCkuaW1wbCgpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQg
PSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFZhbHVlLT5pc0F0dHIo
KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2FuIGEgbmFtZXNwYWNlIGJlIHNw
ZWNpZmllZCBmb3IgYW4gYXR0cihmb28pPworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUu
c3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8pCisgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0VW5pcXVlKCk7
CisgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgYXR0cihudWxsQXRvbSwgY29udGVu
dFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgbnVsbEF0b20pOworICAgICAgICAgICAg
ICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlID0gc3RhdGUuZWxlbWVudCgpLT5nZXRB
dHRyaWJ1dGUoYXR0cik7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENv
bnRlbnQodmFsdWUuaXNOdWxsKCkgPyBlbXB0eUF0b20gOiB2YWx1ZS5pbXBsKCksIGRpZFNldCk7
CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAg
IC8vIHJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBhZmZlY3RzIHRo
ZSBzdHlsZQorICAgICAgICAgICAgICAgICAgICBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJ
blJ1bGVzLmFkZChhdHRyLmxvY2FsTmFtZSgpLmltcGwoKSk7CisgICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChjb250ZW50VmFsdWUtPmlzQ291bnRlcigpKSB7CisgICAgICAgICAgICAgICAgICAg
IENvdW50ZXIqIGNvdW50ZXJWYWx1ZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0Q291bnRlclZhbHVlKCk7
CisgICAgICAgICAgICAgICAgICAgIEVMaXN0U3R5bGVUeXBlIGxpc3RTdHlsZVR5cGUgPSBOb25l
TGlzdFN0eWxlOworICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdFN0eWxlSWRlbnQgPSBjb3Vu
dGVyVmFsdWUtPmxpc3RTdHlsZUlkZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0
U3R5bGVJZGVudCAhPSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0
U3R5bGVUeXBlID0gc3RhdGljX2Nhc3Q8RUxpc3RTdHlsZVR5cGU+KGxpc3RTdHlsZUlkZW50IC0g
Q1NTVmFsdWVEaXNjKTsKKyAgICAgICAgICAgICAgICAgICAgT3duUHRyPENvdW50ZXJDb250ZW50
PiBjb3VudGVyID0gYWRvcHRQdHIobmV3IENvdW50ZXJDb250ZW50KGNvdW50ZXJWYWx1ZS0+aWRl
bnRpZmllcigpLCBsaXN0U3R5bGVUeXBlLCBjb3VudGVyVmFsdWUtPnNlcGFyYXRvcigpKSk7Cisg
ICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY291bnRlci5yZWxl
YXNlKCksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50
VmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU9w
ZW5RdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoT1BFTl9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZUNsb3NlUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRDb250ZW50KENMT1NFX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAg
ICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9PcGVuUXVvdGU6CisgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KE5PX09QRU5fUVVPVEUs
IGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVOb0Nsb3NlUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRDb250ZW50KE5PX0NMT1NFX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICAg
ICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFs
IGFuZCBub25lIGRvIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgICAgICAgICAgICAgICAgICAgICAg
ICB7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmICghZGlkU2V0KQorICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPmNsZWFyQ29udGVudCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVF1b3RlczoKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHN0YXRlLnBhcmVudFN0eWxlKCktPnF1
b3RlcygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNJ
bml0aWFsKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoMCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLT5pc1ZhbHVlTGlz
dCgpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NW
YWx1ZUxpc3QqPih2YWx1ZSk7CisgICAgICAgICAgICBSZWZQdHI8UXVvdGVzRGF0YT4gcXVvdGVz
ID0gUXVvdGVzRGF0YTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGxpc3QtPmxlbmd0aCgpOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSog
Zmlyc3QgPSBsaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOworICAgICAgICAgICAgICAg
IC8vIGl0ZW0oKSByZXR1cm5zIG51bGwgaWYgb3V0IG9mIGJvdW5kcyBzbyB0aGlzIGlzIHNhZmUu
CisgICAgICAgICAgICAgICAgQ1NTVmFsdWUqIHNlY29uZCA9IGxpc3QtPml0ZW0oaSArIDEpOwor
ICAgICAgICAgICAgICAgIGlmICghc2Vjb25kKQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihmaXJz
dC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNV
UklUWV9JTVBMSUNBVElPTihzZWNvbmQtPmlzUHJpbWl0aXZlVmFsdWUoKSk7CisgICAgICAgICAg
ICAgICAgU3RyaW5nIHN0YXJ0UXVvdGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGZpcnN0KS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5kUXVv
dGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHNlY29uZCktPmdldFN0cmluZ1Zh
bHVlKCk7CisgICAgICAgICAgICAgICAgcXVvdGVzLT5hZGRQYWlyKHN0ZDo6bWFrZV9wYWlyKHN0
YXJ0UXVvdGUsIGVuZFF1b3RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRRdW90ZXMocXVvdGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0UXVvdGVzKFF1b3Rlc0RhdGE6OmNyZWF0ZSgpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6IHsKKyAgICAg
ICAgLy8gbGlzdCBvZiBzdHJpbmdzIGFuZCBpZHMKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgewor
ICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIHBhcmVudEZvbnREZXNjcmlwdGlvbiA9IHN0YXRl
LnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgRm9udERlc2Ny
aXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigp
OworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkocGFyZW50Rm9u
dERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0RmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpKTsKKyAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmllZEZvbnQocGFyZW50Rm9udERlc2Ny
aXB0aW9uLmlzU3BlY2lmaWVkRm9udCgpKTsKKyAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlv
bihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGluaXRp
YWxEZXNjID0gRm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCB0aGUgc2l6ZSB0byBhY2NvdW50IGZvciB0aGUg
Z2VuZXJpYyBmYW1pbHkgY2hhbmdlIGZyb20gbW9ub3NwYWNlCisgICAgICAgICAgICAvLyB0byBu
b24tbW9ub3NwYWNlLgorICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6
ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCkpCisgICAgICAgICAg
ICAgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9j
dW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkg
LSAxLCBmYWxzZSkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoaW5pdGlhbERlc2MuZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAgICAgICAgIGlmICghaW5pdGlh
bERlc2MuZmlyc3RGYW1pbHkoKS5mYW1pbHlJc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldEZhbWlseShpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpKTsKKyAgICAg
ICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlw
dGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBGb250RmFt
aWx5JiBmaXJzdEZhbWlseSA9IGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpOworICAgICAg
ICBGb250RmFtaWx5KiBjdXJyRmFtaWx5ID0gMDsKKworICAgICAgICAvLyBCZWZvcmUgbWFwcGlu
ZyBpbiBhIG5ldyBmb250LWZhbWlseSBwcm9wZXJ0eSwgd2Ugc2hvdWxkIHJlc2V0IHRoZSBnZW5l
cmljIGZhbWlseS4KKyAgICAgICAgYm9vbCBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSA9
IGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCk7CisgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOworCisg
ICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsg
aS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwor
ICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogY29udGVudFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsKKyAgICAgICAgICAgIEF0
b21pY1N0cmluZyBmYWNlOworICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1l
bnRTZXR0aW5ncygpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkK
KyAgICAgICAgICAgICAgICBmYWNlID0gY29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwor
ICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gg
KGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVXZWJraXRCb2R5OgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2V0dGluZ3MtPnN0YW5k
YXJkRm9udEZhbWlseSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlU2VyaWY6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXJp
ZkZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkoRm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWlseSk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTYW5zU2VyaWY6CisgICAgICAg
ICAgICAgICAgICAgIGZhY2UgPSBzYW5zU2VyaWZGYW1pbHk7CisgICAgICAgICAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2Fuc1Nl
cmlmRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZUN1cnNpdmU6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBjdXJzaXZl
RmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0Zh
bWlseShGb250RGVzY3JpcHRpb246OkN1cnNpdmVGYW1pbHkpOworICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFudGFzeToKKyAgICAgICAg
ICAgICAgICAgICAgZmFjZSA9IGZhbnRhc3lGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6RmFudGFzeUZh
bWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Ug
Q1NTVmFsdWVNb25vc3BhY2U6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBtb25vc3BhY2VG
YW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFt
aWx5KEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFBpY3RvZ3JhcGg6
CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBwaWN0b2dyYXBoRmFtaWx5OworICAgICAgICAg
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRp
b246OlBpY3RvZ3JhcGhGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZmFjZS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJGYW1pbHkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gRmlsbGluZyBpbiB0aGUgZmlyc3QgZmFtaWx5LgorICAgICAgICAgICAgICAg
ICAgICBmaXJzdEZhbWlseS5zZXRGYW1pbHkoZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIGZp
cnN0RmFtaWx5LmFwcGVuZEZhbWlseSgwKTsgLy8gUmVtb3ZlIGFueSBpbmhlcml0ZWQgZmFtaWx5
LWZhbGxiYWNrIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSAmZmlyc3RG
YW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmll
ZEZvbnQoZm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSA9PSBGb250RGVzY3JpcHRpb246
Ok5vRmFtaWx5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAg
ICBSZWZQdHI8U2hhcmVkRm9udEZhbWlseT4gbmV3RmFtaWx5ID0gU2hhcmVkRm9udEZhbWlseTo6
Y3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZhbWlseS0+c2V0RmFtaWx5KGZhY2Up
OworICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5LT5hcHBlbmRGYW1pbHkobmV3RmFtaWx5
KTsKKyAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9IG5ld0ZhbWlseS5nZXQoKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBX
ZSBjYW4ndCBjYWxsIHVzZUZpeGVkRGVmYXVsdFNpemUoKSB1bnRpbCBhbGwgbmV3IGZvbnQgZmFt
aWxpZXMgaGF2ZSBiZWVuIGFkZGVkCisgICAgICAgIC8vIElmIGN1cnJGYW1pbHkgaXMgbm9uLXpl
cm8gdGhlbiB3ZSBzZXQgYXQgbGVhc3Qgb25lIGZhbWlseSBvbiB0aGlzIGRlc2NyaXB0aW9uLgor
ICAgICAgICBpZiAoY3VyckZhbWlseSkgeworICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlv
bi5rZXl3b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCkg
IT0gb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpCisgICAgICAgICAgICAgICAgc2V0Rm9u
dFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NT
VmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgLSAxLCAhb2xkRmFt
aWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpKTsKKworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0
aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICAvLyBTaG9ydGhhbmQgcHJvcGVydGllcy4KKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoK
KyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZv
bnREZXNjcmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwor
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5zcGVjaWZpZWRMaW5lSGVpZ2h0KCkpOworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhl
aWdodFZhbHVlKDApOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBTZXR0
aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICBBU1NFUlQo
c2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3Vt
ZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCisg
ICAgICAgICAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgIGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOworICAgICAgICB9IGVsc2UgaWYg
KHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVp
Z2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAgICAgICAgICAgIHN0YXRl
LnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZv
bnREZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+
c3lzdGVtRm9udChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSwgZm9udERlc2NyaXB0aW9uKTsK
KworICAgICAgICAgICAgLy8gRG91YmxlLWNoZWNrIGFuZCBzZWUgaWYgdGhlIHRoZW1lIGRpZCBh
bnl0aGluZy4gSWYgbm90LCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhlIGZvbnQuCisgICAgICAg
ICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBtb2RlIGFuZCBwcmludGVyIGZvbnQgc2V0
dGluZ3MgYXJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0g
ZG9jdW1lbnRTZXR0aW5ncygpOworICAgICAgICAgICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8v
IElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFs
d2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MKKyAgICAgICAgICAgICAg
ICBpZiAoIXNldHRpbmdzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5k
ZXJpbmdNb2RlKCkpOworICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmlu
dGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1
YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIHpv
b20gZmFjdG9yLgorICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNp
emUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQoKSwgc3RhdGUuc3R5
bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIGZvbnREZXNjcmlwdGlvbi5z
cGVjaWZpZWRTaXplKCksIHVzZVNWR1pvb21SdWxlcygpKSk7CisgICAgICAgICAgICAgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSBpZiAodmFsdWUtPmlzRm9udFZhbHVlKCkpIHsKKyAgICAgICAgICAgIEZvbnRWYWx1
ZSogZm9udCA9IHN0YXRpY19jYXN0PEZvbnRWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgICAgIGlm
ICghZm9udC0+c3R5bGUgfHwgIWZvbnQtPnZhcmlhbnQgfHwgIWZvbnQtPndlaWdodAorICAgICAg
ICAgICAgICAgIHx8ICFmb250LT5zaXplIHx8ICFmb250LT5saW5lSGVpZ2h0IHx8ICFmb250LT5m
YW1pbHkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0
eShDU1NQcm9wZXJ0eUZvbnRTdHlsZSwgZm9udC0+c3R5bGUuZ2V0KCkpOworICAgICAgICAgICAg
YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRWYXJpYW50LCBmb250LT52YXJpYW50LmdldCgp
KTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250V2VpZ2h0LCBmb250
LT53ZWlnaHQuZ2V0KCkpOworICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIHByb3BlcnRpZXMg
Y2FuIGRpcnR5IG91ciBmb250IGJ1dCB0aGV5IGRvbid0IHRyeSB0byByZWFkIHRoZSBmb250J3MK
KyAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYmFjaywgd2hpY2ggaXMgc2FmZS4gSG93ZXZlciBp
ZiBmb250LXNpemUgaXMgdXNpbmcgdGhlICdleCcgdW5pdCwgaXQgd2lsbAorICAgICAgICAgICAg
Ly8gbmVlZCBxdWVyeSB0aGUgZGlydGllZCBmb250J3MgeC1oZWlnaHQgdG8gZ2V0IHRoZSBjb21w
dXRlZCBzaXplLiBUbyBiZSBzYWZlIGluIHRoaXMKKyAgICAgICAgICAgIC8vIGNhc2UsIGxldCdz
IGp1c3QgdXBkYXRlIHRoZSBmb250IG5vdy4KKyAgICAgICAgICAgIHVwZGF0ZUZvbnQoKTsKKyAg
ICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U2l6ZSwgZm9udC0+c2l6ZS5n
ZXQoKSk7CisKKyAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZShmb250LT5saW5l
SGVpZ2h0LmdldCgpKTsKKworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZv
bnRGYW1pbHksIGZvbnQtPmZhbWlseS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
OworCisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVh
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJCb3R0b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJSaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3BhY2luZzoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RT
dHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvdzoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5UGFkZGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3Jk
ZXJBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJvcmRlclN0YXJ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJSYWRpdXM6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblJ1bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhGbG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRH
cmlkQ29sdW1uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJnaW5Db2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFycXVlZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFzazoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXM6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
bjoKKyNpZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFdyYXA6CisjZW5kaWYKKyAgICAgICAgQVNTRVJUKGlzRXhwYW5kZWRTaG9ydGhhbmQoaWQpKTsK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8g
Q1NTMyBQcm9wZXJ0aWVzCisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRTaGFkb3c6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJveFNoYWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94U2hh
ZG93OiB7CisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIGlmIChpZCA9PSBD
U1NQcm9wZXJ0eVRleHRTaGFkb3cpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxl
KCktPnNldFRleHRTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4dFNoYWRvdygpID8gYWRv
cHRQdHIobmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSkp
IDogbnVsbHB0cik7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hh
ZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpID8gYWRvcHRQdHIobmV3IFNoYWRv
d0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpKSkgOiBudWxscHRyKTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAoaXNJbml0aWFsIHx8IHByaW1pdGl2ZVZhbHVlKSAvLyBpbml0
aWFsIHwgbm9uZQorICAgICAgICAgICAgcmV0dXJuIGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRv
dyA/IHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3cobnVsbHB0cikgOiBzdGF0ZS5zdHlsZSgp
LT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxp
c3QoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0
ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgICAg
ICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICAgICAgaWYgKCFjdXJy
VmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjdXJy
VmFsdWUpOworICAgICAgICAgICAgaW50IHggPSBpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4o
c3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAg
ICAgICAgICAgIGludCB5ID0gaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxl
KCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBp
bnQgYmx1ciA9IGl0ZW0tPmJsdXIgPyBpdGVtLT5ibHVyLT5jb21wdXRlTGVuZ3RoPGludD4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSA6IDA7Cisg
ICAgICAgICAgICBpbnQgc3ByZWFkID0gaXRlbS0+c3ByZWFkID8gaXRlbS0+c3ByZWFkLT5jb21w
dXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6
b29tRmFjdG9yKSA6IDA7CisgICAgICAgICAgICBTaGFkb3dTdHlsZSBzaGFkb3dTdHlsZSA9IGl0
ZW0tPnN0eWxlICYmIGl0ZW0tPnN0eWxlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5zZXQgPyBJ
bnNldCA6IE5vcm1hbDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAgICAgICAgaWYg
KGl0ZW0tPmNvbG9yKQorICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZl
VmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuc3R5
bGUoKSkKKyAgICAgICAgICAgICAgICBjb2xvciA9IHN0YXRlLnN0eWxlKCktPmNvbG9yKCk7CisK
KyAgICAgICAgICAgIE93blB0cjxTaGFkb3dEYXRhPiBzaGFkb3dEYXRhID0gYWRvcHRQdHIobmV3
IFNoYWRvd0RhdGEoSW50UG9pbnQoeCwgeSksIGJsdXIsIHNwcmVhZCwgc2hhZG93U3R5bGUsIGlk
ID09IENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93LCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6
IENvbG9yOjp0cmFuc3BhcmVudCkpOworICAgICAgICAgICAgaWYgKGlkID09IENTU1Byb3BlcnR5
VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93
KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBpLmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYg
dGhpcyBpcyBub3QgdGhlIGZpcnN0IGVudHJ5CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBp
LmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGVu
dHJ5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm94UmVmbGVjdDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElB
TChib3hSZWZsZWN0LCBCb3hSZWZsZWN0KQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsK
KyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QoUmVuZGVyU3R5bGU6Omlu
aXRpYWxCb3hSZWZsZWN0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCF2YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxlY3RWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgUmVmUHRyPFN0eWxlUmVmbGVjdGlvbj4g
cmVmbGVjdGlvbiA9IFN0eWxlUmVmbGVjdGlvbjo6Y3JlYXRlKCk7CisgICAgICAgIHJlZmxlY3Rp
b24tPnNldERpcmVjdGlvbigqcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKSk7CisgICAgICAgIGlm
IChyZWZsZWN0VmFsdWUtPm9mZnNldCgpKQorICAgICAgICAgICAgcmVmbGVjdGlvbi0+c2V0T2Zm
c2V0KHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCktPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJD
b252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbj4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSk7CisgICAg
ICAgIE5pbmVQaWVjZUltYWdlIG1hc2s7CisgICAgICAgIG1hc2suc2V0TWFza0RlZmF1bHRzKCk7
CisgICAgICAgIG1fc3R5bGVNYXAubWFwTmluZVBpZWNlSW1hZ2UoaWQsIHJlZmxlY3RWYWx1ZS0+
bWFzaygpLCBtYXNrKTsKKyAgICAgICAgcmVmbGVjdGlvbi0+c2V0TWFzayhtYXNrKTsKKworICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KHJlZmxlY3Rpb24ucmVsZWFzZSgpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5U3JjOiAvLyBPbmx5
IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1NT
UHJvcGVydHlVbmljb2RlUmFuZ2U6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0
aW9uOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291
bnQsIE1hcnF1ZWVMb29wQ291bnQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9
PSBDU1NWYWx1ZUluZmluaXRlKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVl
ZUxvb3BDb3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVhdCBmb3JldmVyLgorICAgICAgICBlbHNl
IGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVl
U3BlZWQ6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVk
LCBNYXJxdWVlU3BlZWQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIGlmIChpbnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSkgeworICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgeworICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZVNsb3c6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNw
ZWVkKDUwMCk7IC8vIDUwMCBtc2VjLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6CisgICAgICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBT
dXBlciBmYXN0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1RpbWUoKSkKKyAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50
LCBDU1NQcmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRzPigpKTsKKyAgICAgICAgZWxzZSBpZiAo
cHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4K
KyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1
ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFycXVlZUluY3JlbWVudCkKKyAgICAgICAg
aWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Cisg
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgo
MSwgRml4ZWQpKTsgLy8gMXB4LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZU5vcm1hbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRN
YXJxdWVlSW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZh
dWx0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxh
cmdlOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQo
TGVuZ3RoKDM2LCBGaXhlZCkpOyAvLyAzNnB4LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVM
ZW5ndGggPSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCks
IHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5n
dGguaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlSW5jcmVtZW50KG1hcnF1ZWVMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvY2FsZTogeworICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExvY2FsZSk7CisgICAgICAgIGlmICghcHJp
bWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCisgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRMb2NhbGUobnVsbEF0b20pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwor
ICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9j
YWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkp
OworICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNpemVBZGp1c3Q6
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFNpemVBZGp1c3QsIFRl
eHRTaXplQWRqdXN0KQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc2V0VGV4dFNp
emVBZGp1c3QocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoKKyAgICB7CisgICAgICAgIEhB
TkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lv
bnMpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkg
eworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJT
dHlsZTo6bm9uZURhc2hib2FyZFJlZ2lvbnMoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVl
LT5nZXREYXNoYm9hcmRSZWdpb25WYWx1ZSgpOworICAgICAgICBpZiAoIXJlZ2lvbikKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9u
OworICAgICAgICB3aGlsZSAocmVnaW9uKSB7CisgICAgICAgICAgICBMZW5ndGggdG9wID0gY29u
dmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRM
ZW5ndGgocmVnaW9uLT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCkpOworICAgICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChy
ZWdpb24tPmJvdHRvbSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkp
OworICAgICAgICAgICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5s
ZWZ0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisKKyAgICAg
ICAgICAgIGlmICh0b3AuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICB0b3AgPSBMZW5n
dGgoKTsKKyAgICAgICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAg
ICAgIHJpZ2h0ID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVk
KCkpCisgICAgICAgICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAo
bGVmdC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKKwor
ICAgICAgICAgICAgaWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKKyAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNs
ZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBm
aXJzdCA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNS
ZWN0YW5nbGUpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVn
aW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9w
LCByaWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwor
ICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0KCk7CisgICAgICAgIH0KKwor
ICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwor
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyNpZiBFTkFCTEUoRFJBR0dBQkxFX1JF
R0lPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVnaW9uOiB7CisgICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25N
b2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJs
ZVJlZ2lvbkRyYWcgOiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOworICAgICAgICBzdGF0ZS5kb2N1
bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDog
eworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRl
eHRTdHJva2VXaWR0aCkKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAgICBzd2l0Y2gg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUaGlu
OgorICAgICAgICBjYXNlIENTU1ZhbHVlTWVkaXVtOgorICAgICAgICBjYXNlIENTU1ZhbHVlVGhp
Y2s6IHsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAgLyA0ODsKKyAgICAgICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKKyAgICAg
ICAgICAgICAgICByZXN1bHQgKj0gMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVGhpY2spCisgICAgICAgICAgICAgICAgcmVzdWx0
ICo9IDU7CisgICAgICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVz
dWx0LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
d2lkdGggPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0
aCh3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zZm9ybTogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFu
c2Zvcm0sIFRyYW5zZm9ybSk7CisgICAgICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9u
czsKKyAgICAgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKKyAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0VHJhbnNmb3JtKG9wZXJhdGlvbnMpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZTogeworICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCisKKyAgICAg
ICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7CisgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7CisgICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgICAgIHBlcnNwZWN0aXZl
VmFsdWUgPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgZWxzZSBp
ZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBiYWNr
d2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KKyAgICAg
ICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1p
dGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+
Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgaWYgKHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikKKyAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFsdWUpOworICAgICAgICByZXR1
cm47CisgICAgfQorI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKHRhcEhpZ2hsaWdodENvbG9yLCBUYXBIaWdobGlnaHRDb2xvcik7CisgICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDb2xvciBj
b2wgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShwcmltaXRpdmVWYWx1ZSk7CisgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldFRhcEhpZ2hsaWdodENvbG9yKGNvbCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisjZW5kaWYKKyNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1dfU0NST0xMSU5H
KQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogeworICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh1c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nLCBV
c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VUb3VjaE92
ZXJmbG93U2Nyb2xsaW5nKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVG91
Y2gpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0
eUludmFsaWQ6CisgICAgICAgIHJldHVybjsKKyAgICAvLyBEaXJlY3Rpb25hbCBwcm9wZXJ0aWVz
IGFyZSByZXNvbHZlZCBieSByZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eSgpIGJlZm9yZSB0
aGUgc3dpdGNoLgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckVuZFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3Jk
ZXJTdGFydENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFdpZHRoOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckJlZm9yZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlckNvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlclN0eWxlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcldpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXJnaW5FbmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpblN0YXJ0Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5CZWZvcmU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcmdpbkFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5C
ZWZvcmVDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luVG9wQ29sbGFw
c2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFmdGVyQ29sbGFwc2U6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJvdHRvbUNvbGxhcHNlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRQYWRkaW5nRW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRk
aW5nU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdCZWZvcmU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsSGVp
Z2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1heExvZ2ljYWxXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9n
aWNhbEhlaWdodDoKKyAgICB7CisgICAgICAgIENTU1Byb3BlcnR5SUQgbmV3SWQgPSBDU1NQcm9w
ZXJ0eTo6cmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoaWQsIHN0YXRlLnN0eWxlKCktPmRp
cmVjdGlvbigpLCBzdGF0ZS5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAgQVNTRVJU
KG5ld0lkICE9IGlkKTsKKyAgICAgICAgcmV0dXJuIGFwcGx5UHJvcGVydHkobmV3SWQsIHZhbHVl
KTsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHJldGNoOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlQYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2g6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0TGluZVRocm91Z2hNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91
Z2hTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoV2lkdGg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92
ZXJsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZU1vZGU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0T3ZlcmxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0VW5kZXJsaW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZVN0
eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lV2lkdGg6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZvbnRTaXplRGVsdGE6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRleHREZWNvcmF0aW9uc0luRWZmZWN0OgorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDU1Mg
VGV4dCBMYXlvdXQgTW9kdWxlIExldmVsIDM6IFZlcnRpY2FsIHdyaXRpbmcgc3VwcG9ydAorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZTogeworICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTCh3cml0aW5nTW9kZSwgV3JpdGluZ01vZGUpOworICAgICAgICAKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgc2V0V3JpdGluZ01vZGUoKnBy
aW1pdGl2ZVZhbHVlKTsKKworICAgICAgICAvLyBGSVhNRTogSXQgaXMgbm90IG9rIHRvIG1vZGlm
eSBkb2N1bWVudCBzdGF0ZSB3aGlsZSBhcHBseWluZyBzdHlsZS4KKyAgICAgICAgaWYgKHN0YXRl
LmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+ZG9jdW1l
bnRFbGVtZW50KCkpCisgICAgICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9k
ZVNldE9uRG9jdW1lbnRFbGVtZW50KHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRPcmllbnRhdGlvbjogeworICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0T3JpZW50YXRpb24sIFRleHRPcmllbnRhdGlvbik7
CisKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgc2V0VGV4dE9yaWVu
dGF0aW9uKCpwcmltaXRpdmVWYWx1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQm94Q29udGFpbjogeworICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChsaW5lQm94Q29udGFpbiwgTGluZUJveENvbnRhaW4pCisgICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250
YWluKExpbmVCb3hDb250YWluTm9uZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KworICAgICAgICBpZiAoIXZhbHVlLT5pc0NTU0xpbmVCb3hDb250YWluVmFsdWUoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBDU1NMaW5lQm94Q29udGFpblZhbHVlKiBsaW5lQm94
Q29udGFpblZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTTGluZUJveENvbnRhaW5WYWx1ZSo+KHZhbHVl
KTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4obGluZUJveENvbnRh
aW5WYWx1ZS0+dmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDU1Mg
Rm9udHMgTW9kdWxlIExldmVsIDMKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEZlYXR1
cmVTZXR0aW5nczogeworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb3JtYWwpIHsKKyAgICAgICAgICAgIHNldEZvbnRE
ZXNjcmlwdGlvbihzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKS5tYWtlTm9ybWFsRmVh
dHVyZVNldHRpbmdzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9u
dERlc2NyaXB0aW9uKCk7CisgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19jYXN0
PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKKyAgICAgICAgUmVmUHRyPEZvbnRGZWF0dXJlU2V0dGlu
Z3M+IHNldHRpbmdzID0gRm9udEZlYXR1cmVTZXR0aW5nczo6Y3JlYXRlKCk7CisgICAgICAgIGlu
dCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47
ICsraSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBsaXN0LT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKGkpOworICAgICAgICAgICAgaWYgKCFpdGVtLT5pc0ZvbnRGZWF0dXJlVmFsdWUo
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEZvbnRGZWF0dXJlVmFs
dWUqIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGb250RmVhdHVyZVZhbHVlKj4oaXRlbSk7CisgICAg
ICAgICAgICBzZXR0aW5ncy0+YXBwZW5kKEZvbnRGZWF0dXJlKGZlYXR1cmUtPnRhZygpLCBmZWF0
dXJlLT52YWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZl
YXR1cmVTZXR0aW5ncyhzZXR0aW5ncy5yZWxlYXNlKCkpOworICAgICAgICBzZXRGb250RGVzY3Jp
cHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIEVO
QUJMRShDU1NfRklMVEVSUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmlsdGVyOiB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGZpbHRlciwgRmlsdGVyKTsKKyAgICAg
ICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgICAgICBpZiAoY3JlYXRlRmlsdGVy
T3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LCBvcGVyYXRpb25zKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEZpbHRlcihvcGVy
YXRpb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRHcmlkQ29sdW1uczogeworICAgICAgICBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4g
dHJhY2tTaXplczsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0KHZhbHVlLCB0cmFj
a1NpemVzLCBzdGF0ZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRDb2x1bW5zKHRyYWNrU2l6ZXMpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93czogeworICAgICAgICBWZWN0b3I8R3Jp
ZFRyYWNrU2l6ZT4gdHJhY2tTaXplczsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0
KHZhbHVlLCB0cmFja1NpemVzLCBzdGF0ZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldEdyaWRSb3dzKHRyYWNrU2l6ZXMpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRTdGFydDogeworICAgICAg
ICBHcmlkUG9zaXRpb24gc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9z
aXRpb24odmFsdWUsIHN0YXJ0UG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24pOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkRW5kOiB7Cisg
ICAgICAgIEdyaWRQb3NpdGlvbiBlbmRQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlk
UG9zaXRpb24odmFsdWUsIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRCZWZvcmU6IHsK
KyAgICAgICAgR3JpZFBvc2l0aW9uIGJlZm9yZVBvc2l0aW9uOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYmVmb3JlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUJlZm9yZShiZWZvcmVQb3NpdGlv
bik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdy
aWRBZnRlcjogeworICAgICAgICBHcmlkUG9zaXRpb24gYWZ0ZXJQb3NpdGlvbjsKKyAgICAgICAg
aWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGFmdGVyUG9zaXRpb24pKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUFmdGVyKGFmdGVy
UG9zaXRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlc2UgcHJvcGVy
dGllcyBhcmUgYWxpYXNlZCBhbmQgU3R5bGVCdWlsZGVyIGFscmVhZHkgYXBwbGllZCB0aGUgcHJv
cGVydHkgb24gdGhlIHByZWZpeGVkIHZlcnNpb24uCisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkR1cmF0aW9uOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICAgICAgcmV0dXJuOworICAgIC8vIFRoZXNl
IHByb3BlcnRpZXMgYXJlIGltcGxlbWVudGVkIGluIHRoZSBTdHlsZUJ1aWxkZXIgbG9va3VwIHRh
YmxlLgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kUG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFJlcGVhdFk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXpl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQm90dG9tTGVmdFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Qm90dG9tUmlnaHRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21XaWR0aDoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlT3V0
c2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVJlcGVhdDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1h
Z2VTb3VyY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
TGVmdFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0V2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clJpZ2h0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0V2lkdGg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJUb3BMZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BSaWdodFJhZGl1
czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wU3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlclRvcFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3R0b206CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJveFNpemluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2FwdGlvblNpZGU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNsZWFyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDbGlwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlcklu
Y3JlbWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlclJlc2V0OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlDdXJzb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eURpcmVjdGlvbjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5RGlzcGxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5RW1wdHlDZWxsczoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5RmxvYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRW
YXJpYW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlIZWlnaHQ6CisjaWYgRU5BQkxFKENTU19JTUFHRV9PUklFTlRBVElPTikKKyAgICBjYXNl
IENTU1Byb3BlcnR5SW1hZ2VPcmllbnRhdGlvbjoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlJbWFnZVJlbmRlcmluZzoKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1JFU09MVVRJT04pCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVzb2x1dGlvbjoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJv
cGVydHlMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5nOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFn
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlUG9zaXRpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUxpc3RTdHlsZVR5cGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToK
KyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luTGVmdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFy
Z2luUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRvcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5TWF4SGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5TWluSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoK
KyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dX
cmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1g6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU92ZXJmbG93WToKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbToKKyAgICBjYXNl
IENTU1Byb3BlcnR5UGFkZGluZ0xlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdSaWdo
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1RvcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
UGFnZUJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0JlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrSW5zaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQ
b2ludGVyRXZlbnRzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQb3NpdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5UmVzaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlSaWdodDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5U3BlYWs6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVRhYlNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRhYmxlTGF5b3V0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0QWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0SW5kZW50OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0T3ZlcmZsb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRSZW5kZXJpbmc6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRUcmFuc2Zvcm06CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRvcDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZUJpZGk6CisjaWYgRU5BQkxFKENTU19WQVJJQUJM
RVMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVZhcmlhYmxlOgorI2VuZGlmCisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVZlcnRpY2FsQWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBbmltYXRpb25EaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEFuaW1hdGlvbkR1cmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25G
aWxsTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uQ291
bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbk5hbWU6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblBsYXlTdGF0ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEFwcGVhcmFuY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFzcGVjdFJhdGlvOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZmFjZVZpc2liaWxpdHk6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
YWNrZ3JvdW5kQ29tcG9zaXRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5k
T3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kU2l6ZToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRml0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJIb3Jpem9udGFsU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVySW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2lu
ZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246CisjaWYgRU5BQkxFKENTU19C
T1hfREVDT1JBVElPTl9CUkVBSykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGVjb3Jh
dGlvbkJyZWFrOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERpcmVjdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm94RmxleEdyb3VwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hMaW5l
czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdyb3VwOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hPcmllbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eFBhY2s6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29ycmVjdGlvbjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJl
YWtCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrSW5zaWRlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uR2FwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Qcm9n
cmVzc2lvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uU3BhbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGg6CisjaWYgRU5B
QkxFKENVUlNPUl9WSVNJQklMSVRZKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDdXJzb3JW
aXNpYmlsaXR5OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduQ29udGVu
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVtczoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0QWxpZ25TZWxmOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFz
aXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZsZXhHcm93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
U2hyaW5rOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4V3JhcDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0SnVzdGlmeUNvbnRlbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE9yZGVyOgorI2lmIEVOQUJMRShDU1NfUkVHSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Rmxvd0Zyb206CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dJbnRvOgorI2VuZGlm
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRLZXJuaW5nOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRGb250U21vb3RoaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250
VmFyaWFudExpZ2F0dXJlczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SGlnaGxpZ2h0Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVDaGFyYWN0ZXI6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRI
eXBoZW5hdGVMaW1pdExpbmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5zOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdExpbmVCcmVhazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUNsYW1wOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lR3JpZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZVNuYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVEaXJlY3Rp
b246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrQm94SW1hZ2VPdXRzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFn
ZVJlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU2xpY2U6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNvdXJjZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ29tcG9zaXRlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hc2tPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlv
blg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblk6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE5ic3BNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQ
ZXJzcGVjdGl2ZU9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVP
cmlnaW5YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6CisjaWYgRU5BQkxFKENT
U19SRUdJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVyOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFJlZ2lvbk92ZXJmbG93OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ0
bE9yZGVyaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRDb21iaW5lOgorI2lmIEVOQUJMRShDU1MzX1RFWFQp
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dEFsaWduTGFzdDoKKyNlbmRpZiAvLyBDU1MzX1RFWFQKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRleHRFbXBoYXNpc1Bvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
RW1waGFzaXNTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRy
YW5zZm9ybU9yaWdpblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
blk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblo6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUcmFuc2l0aW9uRGVsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRp
b25EdXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvblByb3BlcnR5
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uVGltaW5nRnVuY3Rpb246Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJEcmFnOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRVc2VyTW9kaWZ5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyU2VsZWN0Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDbGlwUGF0aDoKKyNpZiBFTkFCTEUoQ1NTX0VYQ0xV
U0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBGbG93OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRTaGFwZU1hcmdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hh
cGVQYWRkaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwVGhyb3VnaDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFNoYXBlT3V0c2lkZToKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaWRvd3M6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdpZHRo
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkQnJlYWs6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdv
cmRTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkV3JhcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5WkluZGV4OgorICAgIGNhc2UgQ1NTUHJvcGVydHlab29tOgorI2lmIEVOQUJMRShDU1Nf
REVWSUNFX0FEQVBUQVRJT04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFpvb206CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU1pblpvb206CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9yaWVudGF0aW9uOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlVc2VyWm9vbToKKyNlbmRpZgorICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisjaWYgRU5BQkxFKFNW
RykKKyAgICAgICAgLy8gVHJ5IHRoZSBTVkcgcHJvcGVydGllcworICAgICAgICBhcHBseVNWR1By
b3BlcnR5KGlkLCB2YWx1ZSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwor
UGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUltYWdlKENTU1Byb3Bl
cnR5SUQgcHJvcGVydHksIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzSW1h
Z2VWYWx1ZSgpKQorICAgICAgICByZXR1cm4gY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3Bl
cnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZhbHVlKj4odmFsdWUpKTsKKworICAgIGlmICh2YWx1
ZS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlLT5pc0dyYWRp
ZW50VmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFs
dWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFsdWUqPih2YWx1ZSktPmdyYWRp
ZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGdlbmVy
YXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5l
cmF0b3JWYWx1ZSo+KHZhbHVlKSk7CisgICAgfQorCisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQp
CisgICAgaWYgKHZhbHVlLT5pc0ltYWdlU2V0VmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHNldE9y
UGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+
KHZhbHVlKSk7CisjZW5kaWYKKworICAgIGlmICh2YWx1ZS0+aXNDdXJzb3JJbWFnZVZhbHVlKCkp
CisgICAgICAgIHJldHVybiBjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRp
Y19jYXN0PENTU0N1cnNvckltYWdlVmFsdWUqPih2YWx1ZSkpOworCisgICAgcmV0dXJuIDA7Cit9
CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y2FjaGVkT3JQZW5kaW5n
RnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlVmFsdWUqIHZhbHVlKQor
eworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJ
bWFnZSgpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAg
ICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7
CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxTdHlsZUltYWdl
PiBTdHlsZVJlc29sdmVyOjpnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJ
RCBwcm9wZXJ0eSwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHZh
bHVlLT5pc1BlbmRpbmcoKSkgeworICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRp
ZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFN0eWxlUGVuZGluZ0lt
YWdlOjpjcmVhdGUodmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gU3R5bGVHZW5lcmF0ZWRJbWFn
ZTo6Y3JlYXRlKHZhbHVlKTsKK30KKworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorUGFzc1Jl
ZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VTZXRWYWx1ZSogdmFsdWUpCit7CisgICAgUmVm
UHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlU2V0KGRv
Y3VtZW50KCkpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAg
ICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1
ZSk7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKyNlbmRpZgorCitQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQ
cm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NDdXJzb3JJbWFnZVZhbHVlKiB2YWx1ZSkKK3sKKyAgICBS
ZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2UoZG9j
dW1lbnQoKSk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQorICAg
ICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVl
KTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OmNoZWNrRm9yVGV4dFNpemVBZGp1c3QoKQoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1f
c3RhdGUuc3R5bGUoKTsKKworICAgIGlmIChzdHlsZS0+dGV4dFNpemVBZGp1c3QoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihzdHls
ZS0+Zm9udERlc2NyaXB0aW9uKCkpOworICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRl
ZFNpemUobmV3Rm9udERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSk7CisgICAgc3R5bGUtPnNl
dEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OmNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSkKK3sKKyAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA9PSBwYXJl
bnRTdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBG
b250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKyAg
ICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7CisgICAgc2V0
Rm9udFNpemUobmV3Rm9udERlc2NyaXB0aW9uLCBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgpKTsK
KyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0
eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworCisgICAg
aWYgKGNoaWxkRm9udC5pc0Fic29sdXRlU2l6ZSgpIHx8ICFwYXJlbnRTdHlsZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250ID0gcGFyZW50
U3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIGlmIChjaGlsZEZvbnQudXNlRml4ZWREZWZh
dWx0U2l6ZSgpID09IHBhcmVudEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBGb3Igbm93LCBsdW1wIGFsbCBmYW1pbGllcyBidXQgbW9ub3NwYWNl
IHRvZ2V0aGVyLgorICAgIGlmIChjaGlsZEZvbnQuZ2VuZXJpY0ZhbWlseSgpICE9IEZvbnREZXNj
cmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5CisgICAgICAgICYmIHBhcmVudEZvbnQuZ2VuZXJpY0Zh
bWlseSgpICE9IEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBXZSBrbm93IHRoZSBwYXJlbnQgaXMgbW9ub3NwYWNlIG9yIHRoZSBjaGls
ZCBpcyBtb25vc3BhY2UsIGFuZCB0aGF0IGZvbnQKKyAgICAvLyBzaXplIHdhcyB1bnNwZWNpZmll
ZC4gV2Ugd2FudCB0byBzY2FsZSBvdXIgZm9udCBzaXplIGFzIGFwcHJvcHJpYXRlLgorICAgIC8v
IElmIHRoZSBmb250IHVzZXMgYSBrZXl3b3JkIHNpemUsIHRoZW4gd2UgcmVmZXRjaCBmcm9tIHRo
ZSB0YWJsZSByYXRoZXIgdGhhbgorICAgIC8vIG11bHRpcGx5aW5nIGJ5IG91ciBzY2FsZSBmYWN0
b3IuCisgICAgZmxvYXQgc2l6ZTsKKyAgICBpZiAoY2hpbGRGb250LmtleXdvcmRTaXplKCkpCisg
ICAgICAgIHNpemUgPSBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNt
YWxsICsgY2hpbGRGb250LmtleXdvcmRTaXplKCkgLSAxLCBjaGlsZEZvbnQudXNlRml4ZWREZWZh
dWx0U2l6ZSgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9j
dW1lbnRTZXR0aW5ncygpOworICAgICAgICBmbG9hdCBmaXhlZFNjYWxlRmFjdG9yID0gKHNldHRp
bmdzICYmIHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpICYmIHNldHRpbmdzLT5kZWZh
dWx0Rm9udFNpemUoKSkKKyAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNldHRpbmdz
LT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpKSAvIHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKQor
ICAgICAgICAgICAgOiAxOworICAgICAgICBzaXplID0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1
bHRTaXplKCkgPworICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgLyBm
aXhlZFNjYWxlRmFjdG9yIDoKKyAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6
ZSgpICogZml4ZWRTY2FsZUZhY3RvcjsKKyAgICB9CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3
Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7CisgICAgc2V0Rm9udFNpemUobmV3Rm9udERlc2Ny
aXB0aW9uLCBzaXplKTsKKyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNj
cmlwdGlvbik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdGlhbGl6ZUZvbnRTdHlsZShT
ZXR0aW5ncyogc2V0dGluZ3MpCit7CisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlv
bjsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246
OlN0YW5kYXJkRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShz
ZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFVz
ZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5G
b250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0YW5k
YXJkRm9udEZhbWlseSA9IGRvY3VtZW50U2V0dGluZ3MoKS0+c3RhbmRhcmRGb250RmFtaWx5KCk7
CisgICAgaWYgKCFzdGFuZGFyZEZvbnRGYW1pbHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnRGYW1pbHkpOwor
ICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7Cisg
ICAgfQorICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAt
IENTU1ZhbHVlWHhTbWFsbCArIDEpOworICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwg
Zm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSkpOwor
ICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExp
bmVIZWlnaHQoKSk7CisgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6c2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGZsb2F0IHNp
emUpCit7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7CisgICAg
Zm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lm
aWVkU2l6ZShkb2N1bWVudCgpLCBtX3N0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fi
c29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMoKSkpOworfQorCitmbG9hdCBTdHls
ZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCogZG9j
dW1lbnQsIFJlbmRlclN0eWxlKiBzdHlsZSwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3Bl
Y2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVsZXMpCit7CisgICAgZmxvYXQgem9vbUZhY3Rv
ciA9IDEuMGY7CisgICAgaWYgKCF1c2VTVkdab29tUnVsZXMpIHsKKyAgICAgICAgem9vbUZhY3Rv
ciA9IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKSkKKyAgICAgICAgICAgIHpvb21GYWN0b3IgKj0gZnJhbWUtPnRleHRa
b29tRmFjdG9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCB6b29tRmFjdG9yLCBpc0Fic29sdXRl
U2l6ZSwgc3BlY2lmaWVkU2l6ZSk7Cit9CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgZmxvYXQgem9vbUZh
Y3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWlu
aW11bUZvckZvbnRTaXplIHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplKQoreworICAgIC8vIFRl
eHQgd2l0aCBhIDBweCBmb250IHNpemUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIGFuZCB0aGVyZWZv
cmUgbmVlZHMgdG8gYmUKKyAgICAvLyBleGVtcHQgZnJvbSBtaW5pbXVtIGZvbnQgc2l6ZSBydWxl
cy4gQWNpZDMgcmVsaWVzIG9uIHRoaXMgZm9yIHBpeGVsLXBlcmZlY3QKKyAgICAvLyByZW5kZXJp
bmcuIFRoaXMgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYnJvd3NlcnMgdGhhdCBoYXZl
IG1pbmltdW0KKyAgICAvLyBmb250IHNpemUgc2V0dGluZ3MgKGUuZy4gRmlyZWZveCkuCisgICAg
aWYgKGZhYnNmKHNwZWNpZmllZFNpemUpIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVw
c2lsb24oKSkKKyAgICAgICAgcmV0dXJuIDAuMGY7CisKKyAgICAvLyBXZSBzdXBwb3J0IHR3byB0
eXBlcyBvZiBtaW5pbXVtIGZvbnQgc2l6ZS4gVGhlIGZpcnN0IGlzIGEgaGFyZCBvdmVycmlkZSB0
aGF0IGFwcGxpZXMgdG8KKyAgICAvLyBhbGwgZm9udHMuIFRoaXMgaXMgIm1pblNpemUuIiBUaGUg
c2Vjb25kIHR5cGUgb2YgbWluaW11bSBmb250IHNpemUgaXMgYSAic21hcnQgbWluaW11bSIKKyAg
ICAvLyB0aGF0IGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSBXZWIgcGFnZSBjYW4ndCBrbm93IHdo
YXQgc2l6ZSBpdCByZWFsbHkgYXNrZWQgZm9yLCBlLmcuLAorICAgIC8vIHdoZW4gaXQgdXNlcyBs
b2dpY2FsIHNpemVzIGxpa2UgInNtYWxsIiBvciBleHByZXNzZXMgdGhlIGZvbnQtc2l6ZSBhcyBh
IHBlcmNlbnRhZ2Ugb2YKKyAgICAvLyB0aGUgdXNlcidzIGRlZmF1bHQgZm9udCBzZXR0aW5nLgor
CisgICAgLy8gV2l0aCB0aGUgc21hcnQgbWluaW11bSwgd2UgbmV2ZXIgd2FudCB0byBnZXQgc21h
bGxlciB0aGFuIHRoZSBtaW5pbXVtIGZvbnQgc2l6ZSB0byBrZWVwIGZvbnRzIHJlYWRhYmxlLgor
ICAgIC8vIEhvd2V2ZXIgd2UgYWx3YXlzIGFsbG93IHRoZSBwYWdlIHRvIHNldCBhbiBleHBsaWNp
dCBwaXhlbCBzaXplIHRoYXQgaXMgc21hbGxlciwKKyAgICAvLyBzaW5jZSBzaXRlcyB3aWxsIG1p
cy1yZW5kZXIgb3RoZXJ3aXNlIChlLmcuLCBodHRwOi8vd3d3LmdhbWVzcG90LmNvbSB3aXRoIGEg
OXB4IG1pbmltdW0pLgorCisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRp
bmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0dXJuIDEuMGY7CisKKyAgICBp
bnQgbWluU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtRm9udFNpemUoKTsKKyAgICBpbnQgbWluTG9n
aWNhbFNpemUgPSBzZXR0aW5ncy0+bWluaW11bUxvZ2ljYWxGb250U2l6ZSgpOworICAgIGZsb2F0
IHpvb21lZFNpemUgPSBzcGVjaWZpZWRTaXplICogem9vbUZhY3RvcjsKKworICAgIC8vIEFwcGx5
IHRoZSBoYXJkIG1pbmltdW0gZmlyc3QuIFdlIG9ubHkgYXBwbHkgdGhlIGhhcmQgbWluaW11bSBp
ZiBhZnRlciB6b29taW5nIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbC4KKyAgICBpZiAoem9vbWVkU2l6
ZSA8IG1pblNpemUpCisgICAgICAgIHpvb21lZFNpemUgPSBtaW5TaXplOworCisgICAgLy8gTm93
IGFwcGx5IHRoZSAic21hcnQgbWluaW11bS4iIFRoaXMgbWluaW11bSBpcyBhbHNvIG9ubHkgYXBw
bGllZCBpZiB3ZSdyZSBzdGlsbCB0b28gc21hbGwKKyAgICAvLyBhZnRlciB6b29taW5nLiBUaGUg
Zm9udCBzaXplIG11c3QgZWl0aGVyIGJlIHJlbGF0aXZlIHRvIHRoZSB1c2VyIGRlZmF1bHQgb3Ig
dGhlIG9yaWdpbmFsIHNpemUKKyAgICAvLyBtdXN0IGhhdmUgYmVlbiBhY2NlcHRhYmxlLiBJbiBv
dGhlciB3b3Jkcywgd2Ugb25seSBhcHBseSB0aGUgc21hcnQgbWluaW11bSB3aGVuZXZlciB3ZSdy
ZSBwb3NpdGl2ZQorICAgIC8vIGRvaW5nIHNvIHdvbid0IGRpc3J1cHQgdGhlIGxheW91dC4KKyAg
ICBpZiAodXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUgJiYgem9vbWVkU2l6ZSA8IG1pbkxvZ2lj
YWxTaXplICYmIChzcGVjaWZpZWRTaXplID49IG1pbkxvZ2ljYWxTaXplIHx8ICFpc0Fic29sdXRl
U2l6ZSkpCisgICAgICAgIHpvb21lZFNpemUgPSBtaW5Mb2dpY2FsU2l6ZTsKKworICAgIC8vIEFs
c28gY2xhbXAgdG8gYSByZWFzb25hYmxlIG1heGltdW0gdG8gcHJldmVudCBpbnNhbmUgZm9udCBz
aXplcyBmcm9tIGNhdXNpbmcgY3Jhc2hlcyBvbiB2YXJpb3VzCisgICAgLy8gcGxhdGZvcm1zIChJ
J20gbG9va2luZyBhdCB5b3UsIFdpbmRvd3MuKQorICAgIHJldHVybiBtaW4obWF4aW11bUFsbG93
ZWRGb250U2l6ZSwgem9vbWVkU2l6ZSk7Cit9CisKK2NvbnN0IGludCBmb250U2l6ZVRhYmxlTWF4
ID0gMTY7Citjb25zdCBpbnQgZm9udFNpemVUYWJsZU1pbiA9IDk7Citjb25zdCBpbnQgdG90YWxL
ZXl3b3JkcyA9IDg7CisKKy8vIFdpbklFL05hdjQgdGFibGUgZm9yIGZvbnQgc2l6ZXMuIERlc2ln
bmVkIHRvIG1hdGNoIHRoZSBsZWdhY3kgZm9udCBtYXBwaW5nIHN5c3RlbSBvZiBIVE1MLgorc3Rh
dGljIGNvbnN0IGludCBxdWlya3NGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250
U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQoreworICAgICAgeyA5LCAgICA5LCAg
ICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI4IH0sCisgICAgICB7IDksICAg
IDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzEgfSwKKyAgICAgIHsg
OSwgICAgOSwgICAgIDksICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzNCB9LAorICAg
ICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM3IH0s
CisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAg
NDAgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKKyAgICAgIHsgOSwgICAgOSwgICAgMTEs
ICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAorICAgICAgeyA5LCAgIDEwLCAg
ICAxMiwgICAgMTUsICAgIDE3LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCisgICAgICB7IDksICAg
MTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0
aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKK307CisvLyBIVE1MICAgICAgIDEgICAgICAyICAgICAg
MyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKKy8vIENTUyAgeHhzICAgeHMgICAgIHMgICAg
ICBtICAgICAgbCAgICAgeGwgICAgIHh4bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwK
Ky8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgorCisvLyBTdHJpY3QgbW9kZSB0YWJs
ZSBtYXRjaGVzIE1hY0lFIGFuZCBNb3ppbGxhJ3Mgc2V0dGluZ3MgZXhhY3RseS4KK3N0YXRpYyBj
b25zdCBpbnQgc3RyaWN0Rm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0gZm9udFNpemVU
YWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KK3sKKyAgICAgIHsgOSwgICAgOSwgICAgIDks
ICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyNyB9LAorICAgICAgeyA5LCAgICA5LCAg
ICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMwIH0sCisgICAgICB7IDksICAg
IDksICAgIDEwLCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzMgfSwKKyAgICAgIHsg
OSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAzNiB9LAorICAg
ICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYsICAgIDM5IH0s
IC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCisgICAgICB7IDksICAgMTAsICAgIDEyLCAgICAx
NCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTMs
ICAgIDE1LCAgICAxOCwgICAgMjMsICAgIDMwLCAgICA0NSB9LAorICAgICAgeyA5LCAgIDEwLCAg
ICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJvcG9ydGlvbmFs
IGZvbnQgZGVmYXVsdCAoMTYpCit9OworLy8gSFRNTCAgICAgICAxICAgICAgMiAgICAgIDMgICAg
ICA0ICAgICAgNSAgICAgIDYgICAgICA3CisvLyBDU1MgIHh4cyAgIHhzICAgICBzICAgICAgbSAg
ICAgIGwgICAgIHhsICAgICB4eGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyAg
ICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKKworLy8gRm9yIHZhbHVlcyBvdXRzaWRlIHRo
ZSByYW5nZSBvZiB0aGUgdGFibGUsIHdlIHVzZSBUb2RkIEZhaHJuZXIncyBzdWdnZXN0ZWQgc2Nh
bGUKKy8vIGZhY3RvcnMgZm9yIGVhY2gga2V5d29yZCB2YWx1ZS4KK3N0YXRpYyBjb25zdCBmbG9h
dCBmb250U2l6ZUZhY3RvcnNbdG90YWxLZXl3b3Jkc10gPSB7IDAuNjBmLCAwLjc1ZiwgMC44OWYs
IDEuMGYsIDEuMmYsIDEuNWYsIDIuMGYsIDMuMGYgfTsKKworZmxvYXQgU3R5bGVSZXNvbHZlcjo6
Zm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiBkb2N1bWVudCwgaW50IGtleXdvcmQsIGJvb2wg
c2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKK3sKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICByZXR1cm4g
MS4wZjsKKworICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01vZGUoKTsK
KyAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBzZXR0aW5n
cy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKTsK
KyAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNpemUgPD0g
Zm9udFNpemVUYWJsZU1heCkgeworICAgICAgICAvLyBMb29rIHVwIHRoZSBlbnRyeSBpbiB0aGUg
dGFibGUuCisgICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsK
KyAgICAgICAgaW50IGNvbCA9IChrZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxsKTsKKyAgICAgICAg
cmV0dXJuIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRhYmxlW3Jvd11bY29sXSA6IHN0cmlj
dEZvbnRTaXplVGFibGVbcm93XVtjb2xdOworICAgIH0KKworICAgIC8vIFZhbHVlIGlzIG91dHNp
ZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZS4gQXBwbHkgdGhlIHNjYWxlIGZhY3RvciBpbnN0ZWFk
LgorICAgIGZsb2F0IG1pbkxvZ2ljYWxTaXplID0gbWF4KHNldHRpbmdzLT5taW5pbXVtTG9naWNh
bEZvbnRTaXplKCksIDEpOworICAgIHJldHVybiBtYXgoZm9udFNpemVGYWN0b3JzW2tleXdvcmQg
LSBDU1NWYWx1ZVh4U21hbGxdKm1lZGl1bVNpemUsIG1pbkxvZ2ljYWxTaXplKTsKK30KKwordGVt
cGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbnQgZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZShp
bnQgcGl4ZWxGb250U2l6ZSwgY29uc3QgVCogdGFibGUsIGludCBtdWx0aXBsaWVyKQoreworICAg
IC8vIElnbm9yZSB0YWJsZVswXSBiZWNhdXNlIHh4LXNtYWxsIGRvZXMgbm90IGNvcnJlc3BvbmQg
dG8gYW55IGxlZ2FjeSBmb250IHNpemUuCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0b3RhbEtl
eXdvcmRzIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChwaXhlbEZvbnRTaXplICogMiA8ICh0YWJs
ZVtpXSArIHRhYmxlW2kgKyAxXSkgKiBtdWx0aXBsaWVyKQorICAgICAgICAgICAgcmV0dXJuIGk7
CisgICAgfQorICAgIHJldHVybiB0b3RhbEtleXdvcmRzIC0gMTsKK30KKworaW50IFN0eWxlUmVz
b2x2ZXI6OmxlZ2FjeUZvbnRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgaW50IHBpeGVsRm9udFNp
emUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKK3sKKyAgICBTZXR0aW5ncyogc2V0
dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAg
ICByZXR1cm4gMTsKKworICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01v
ZGUoKTsKKyAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBz
ZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNp
emUoKTsKKyAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNp
emUgPD0gZm9udFNpemVUYWJsZU1heCkgeworICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6ZSAt
IGZvbnRTaXplVGFibGVNaW47CisgICAgICAgIHJldHVybiBmaW5kTmVhcmVzdExlZ2FjeUZvbnRT
aXplPGludD4ocGl4ZWxGb250U2l6ZSwgcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVb
cm93XSA6IHN0cmljdEZvbnRTaXplVGFibGVbcm93XSwgMSk7CisgICAgfQorCisgICAgcmV0dXJu
IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8ZmxvYXQ+KHBpeGVsRm9udFNpemUsIGZvbnRTaXpl
RmFjdG9ycywgbWVkaXVtU2l6ZSk7Cit9CisKK3N0YXRpYyBDb2xvciBjb2xvckZvckNTU1ZhbHVl
KGludCBjc3NWYWx1ZUlkKQoreworICAgIHN0cnVjdCBDb2xvclZhbHVlIHsKKyAgICAgICAgaW50
IGNzc1ZhbHVlSWQ7CisgICAgICAgIFJHQkEzMiBjb2xvcjsKKyAgICB9OworCisgICAgc3RhdGlj
IGNvbnN0IENvbG9yVmFsdWUgY29sb3JWYWx1ZXNbXSA9IHsKKyAgICAgICAgeyBDU1NWYWx1ZUFx
dWEsIDB4RkYwMEZGRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUJsYWNrLCAweEZGMDAwMDAwIH0s
CisgICAgICAgIHsgQ1NTVmFsdWVCbHVlLCAweEZGMDAwMEZGIH0sCisgICAgICAgIHsgQ1NTVmFs
dWVGdWNoc2lhLCAweEZGRkYwMEZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmF5LCAweEZGODA4
MDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmVlbiwgMHhGRjAwODAwMCAgfSwKKyAgICAgICAg
eyBDU1NWYWx1ZUdyZXksIDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUxpbWUsIDB4
RkYwMEZGMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU1hcm9vbiwgMHhGRjgwMDAwMCB9LAorICAg
ICAgICB7IENTU1ZhbHVlTmF2eSwgMHhGRjAwMDA4MCB9LAorICAgICAgICB7IENTU1ZhbHVlT2xp
dmUsIDB4RkY4MDgwMDAgIH0sCisgICAgICAgIHsgQ1NTVmFsdWVPcmFuZ2UsIDB4RkZGRkE1MDAg
fSwKKyAgICAgICAgeyBDU1NWYWx1ZVB1cnBsZSwgMHhGRjgwMDA4MCB9LAorICAgICAgICB7IENT
U1ZhbHVlUmVkLCAweEZGRkYwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVTaWx2ZXIsIDB4RkZD
MEMwQzAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVRlYWwsIDB4RkYwMDgwODAgIH0sCisgICAgICAg
IHsgQ1NTVmFsdWVUcmFuc3BhcmVudCwgMHgwMDAwMDAwMCB9LAorICAgICAgICB7IENTU1ZhbHVl
V2hpdGUsIDB4RkZGRkZGRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVllbGxvdywgMHhGRkZGRkYw
MCB9LAorICAgICAgICB7IDAsIDAgfQorICAgIH07CisKKyAgICBmb3IgKGNvbnN0IENvbG9yVmFs
dWUqIGNvbCA9IGNvbG9yVmFsdWVzOyBjb2wtPmNzc1ZhbHVlSWQ7ICsrY29sKSB7CisgICAgICAg
IGlmIChjb2wtPmNzc1ZhbHVlSWQgPT0gY3NzVmFsdWVJZCkKKyAgICAgICAgICAgIHJldHVybiBj
b2wtPmNvbG9yOworICAgIH0KKyAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgp
LT5zeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVl
KiB2YWx1ZSkKK3sKKyAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0SWRlbnQoKTsKKyAgICBzd2l0
Y2ggKGlkZW50KSB7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6CisgICAgY2FzZSBDU1NW
YWx1ZVdlYmtpdExpbms6CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxpbms6CisgICAg
Y2FzZSBDU1NWYWx1ZUN1cnJlbnRjb2xvcjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworQ29sb3IgU3R5bGVSZXNv
bHZlcjo6Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlLCBi
b29sIGZvclZpc2l0ZWRMaW5rKSBjb25zdAoreworICAgIGlmICh2YWx1ZS0+aXNSR0JDb2xvcigp
KQorICAgICAgICByZXR1cm4gQ29sb3IodmFsdWUtPmdldFJHQkEzMlZhbHVlKCkpOworCisgICAg
Y29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0
SWRlbnQoKTsKKyAgICBzd2l0Y2ggKGlkZW50KSB7CisgICAgY2FzZSAwOgorICAgICAgICByZXR1
cm4gQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKKyAgICAgICAgcmV0dXJu
IHN0YXRlLmRvY3VtZW50KCktPnRleHRDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRM
aW5rOgorICAgICAgICByZXR1cm4gKHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkgJiYgZm9yVmlz
aXRlZExpbmspID8gc3RhdGUuZG9jdW1lbnQoKS0+dmlzaXRlZExpbmtDb2xvcigpIDogc3RhdGUu
ZG9jdW1lbnQoKS0+bGlua0NvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxp
bms6CisgICAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudCgpLT5hY3RpdmVMaW5rQ29sb3IoKTsK
KyAgICBjYXNlIENTU1ZhbHVlV2Via2l0Rm9jdXNSaW5nQ29sb3I6CisgICAgICAgIHJldHVybiBS
ZW5kZXJUaGVtZTo6Zm9jdXNSaW5nQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNv
bG9yOgorICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKKyAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm4gY29sb3JGb3JDU1NWYWx1ZShpZGVudCk7CisgICAgfQorfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChj
b25zdCBNZWRpYVF1ZXJ5RXhwKiBleHByLCBib29sIHJlc3VsdCkKK3sKKyAgICBtX3ZpZXdwb3J0
RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuYXBwZW5kKGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5
UmVzdWx0KCpleHByLCByZXN1bHQpKSk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6YWZmZWN0
ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3QKK3sKKyAgICB1bnNpZ25lZCBzID0gbV92aWV3cG9y
dERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgczsgaSsrKSB7CisgICAgICAgIGlmIChtX21lZGl1bS0+ZXZhbCgmbV92aWV3cG9y
dERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX2V4cHJlc3Npb24pICE9IG1fdmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9yZXN1bHQpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgVHJhbnNm
b3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUoV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zZm9ybU9wZXJhdGlvblR5cGUgdHlwZSkKK3sKKyAg
ICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2Fs
ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU7Cisg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9YOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6U0NBTEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpT
Y2FsZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxF
X1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5zZm9ybU9w
ZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfM0Q7CisgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6VFJBTlNMQVRFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNs
YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNM
QVRFX1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV8zRDsK
KyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURTsKKyAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpST1RBVEVfWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpS
T1RBVEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWjsKKyAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlNLRVc7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWDsKKyAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6TUFUUklYOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJp
eDNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVhf
M0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zv
cm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlBFUlNQRUNUSVZFOworICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok5PTkU7CisgICAgfQorICAgIHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246Ok5PTkU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlVHJh
bnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBS
ZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25z
KQoreworICAgIGlmICghaW5WYWx1ZSB8fCAhaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeworICAg
ICAgICBvdXRPcGVyYXRpb25zLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgp
IDogMTsKKyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7
CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisKKyAgICAgICAgaWYg
KCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKiB0cmFuc2Zvcm1WYWx1
ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKj4oaS52YWx1ZSgpKTsKKyAg
ICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZhbHNlOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpOyArK2op
IHsKKyAgICAgICAgICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGhhdmVOb25Qcmlt
aXRpdmVWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1ZSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygwKSk7CisKKyAgICAgICAgc3dpdGNoICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSB7CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNj
YWxlVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91
YmxlIHN4ID0gMS4wOworICAgICAgICAgICAgZG91YmxlIHN5ID0gMS4wOworICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBzeSA9IGZp
cnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7
CisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAg
IHN5ID0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpj
cmVhdGUoc3gsIHN5LCAxLjAsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJh
dGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5z
Zm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIHN4ID0gMS4wOworICAgICAgICAg
ICAgZG91YmxlIHN5ID0gMS4wOworICAgICAgICAgICAgZG91YmxlIHN6ID0gMS4wOworICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBz
eiA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgc3kgPSBmaXJzdFZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAg
ICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBzeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZh
bHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAg
ICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHN4OworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0
aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHN4LCBzeSwgc3os
IGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlv
bjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5z
Zm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3RoIHR4ID0gTGVuZ3RoKDAsIEZpeGVk
KTsKKyAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB0
eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHggPSBjb252
ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9y
KTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAh
PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikg
eworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZl
cnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9y
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIG9wZXJhdGlv
bnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0
ZSh0eCwgdHksIExlbmd0aCgwLCBGaXhlZCksIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpU
cmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGggdHgg
PSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZp
eGVkKTsKKyAgICAgICAgICAgIExlbmd0aCB0eiA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUs
IHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9y
bU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZp
cnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICAgICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVl
LCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgodGhpcmRWYWx1ZSwg
c3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9G
bG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZpbmVkKCkgfHwg
dHouaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1P
cGVyYXRpb246OmNyZWF0ZSh0eCwgdHksIHR6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUt
PmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5h
cHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoMCwgMCwgMSwgYW5nbGUsIGdl
dFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246CisgICAg
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRp
b246IHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSB5ID0g
MDsKKyAgICAgICAgICAgIGRvdWJsZSB6ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9
IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3Rh
dGVYVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAg
ICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICB5ID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ID0gMTsKKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVy
YXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlM0RU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVu
Z3RoKCkgPCA0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOworICAgICAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZvdXJ0aFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSk7
CisgICAgICAgICAgICBkb3VibGUgeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICBkb3VibGUgeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAg
ICAgICAgICAgZG91YmxlIHogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAg
ICAgICAgZG91YmxlIGFuZ2xlID0gZm91cnRoVmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3Bl
cmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFu
c2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNr
ZXdYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFuZ2xl
WCA9IDA7CisgICAgICAgICAgICBkb3VibGUgYW5nbGVZID0gMDsKKyAgICAgICAgICAgIGRvdWJs
ZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgYW5nbGVZID0gYW5n
bGU7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbmdsZVggPSBhbmdsZTsK
KyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAg
ICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZVkgPSBzZWNvbmRWYWx1
ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGVYLCBhbmdsZVksIGdl
dFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDYpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBkb3VibGUgYSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICBkb3VibGUgYiA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgZG91YmxlIGMgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFs
dWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSktPmdldERvdWJs
ZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZSA9IHpvb21GYWN0b3IgKiBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBmID0gem9vbUZh
Y3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjo6
Y3JlYXRlKGEsIGIsIGMsIGQsIGUsIGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeDNEVHJhbnNmb3Jt
T3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwg
MTYpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCBtYXRyaXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVl
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSktPmdl
dERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygzKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg2KSktPmdldERvdWJsZVZh
bHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg3KSkt
PmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjayg4KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayg5KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMCkpLT5nZXREb3VibGVWYWx1ZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTEpKS0+Z2V0RG91
YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9yICog
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxMikpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEzKSktPmdldERvdWJsZVZh
bHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNCkp
LT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMTUpKS0+Z2V0RG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICBvcGVyYXRpb25z
Lm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSht
YXRyaXgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBMZW5ndGggcCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBpZiAo
Zmlyc3RWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBwID0gY29udmVydFRvRmxv
YXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAg
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcXVpcmsgdGhhdCBz
aG91bGQgZ28gYXdheSB3aGVuIDNkIHRyYW5zZm9ybXMgYXJlIGZpbmFsaXplZC4KKyAgICAgICAg
ICAgICAgICBkb3VibGUgdmFsID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAg
ICAgICAgICAgICBwID0gdmFsID49IDAgPyBMZW5ndGgoY2xhbXBUb1Bvc2l0aXZlSW50ZWdlcih2
YWwpLCBGaXhlZCkgOiBMZW5ndGgoVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKHAuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChQZXJzcGVjdGl2
ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFu
c2Zvcm1PcGVyYXRpb246CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0T3BlcmF0aW9ucyA9IG9w
ZXJhdGlvbnM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMp
CitzdGF0aWMgRmlsdGVyT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGZpbHRlck9wZXJhdGlvbkZv
clR5cGUoV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkZpbHRlck9wZXJhdGlvblR5cGUgdHlwZSkKK3sK
KyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpSZWZl
cmVuY2VGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlJF
RkVSRU5DRTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJP
cGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkdSQVlTQ0FMRTsKKyAg
ICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKKyAgICAg
ICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0VQSUE7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OlNBVFVSQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJv
dGF0ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SFVF
X1JPVEFURTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJPcGVy
YXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OklOVkVSVDsKKyAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpPUEFDSVRZOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OkJSSUdIVE5FU1M7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29u
dHJhc3RGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkNP
TlRSQVNUOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRp
b246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkJMVVI7CisgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6RFJPUF9TSEFET1c7CisjaWYgRU5BQkxFKENTU19TSEFERVJT
KQorICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkN1c3RvbUZpbHRlck9wZXJhdGlvbjoK
KyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NOworI2VuZGlmCisgICAgY2Fz
ZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Tk9ORTsKKyAgICB9CisgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6Tk9ORTsKK30KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNW
RykKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKQoreworICAg
IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKCFzdGF0ZS5zdHlsZSgpLT5oYXNGaWx0
ZXIoKSB8fCBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIg
PSBzdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworICAgIFZlY3RvcjxS
ZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gc3RhdGUuc3R5bGUo
KS0+bXV0YWJsZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZmlsdGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8Rmls
dGVyT3BlcmF0aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOwor
ICAgICAgICBpZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVy
T3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUZpbHRlck9wZXJh
dGlvbiogcmVmZXJlbmNlRmlsdGVyID0gc3RhdGljX2Nhc3Q8UmVmZXJlbmNlRmlsdGVyT3BlcmF0
aW9uKj4oZmlsdGVyT3BlcmF0aW9uLmdldCgpKTsKKworICAgICAgICAgICAgV2ViS2l0Q1NTU1ZH
RG9jdW1lbnRWYWx1ZSogdmFsdWUgPSBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuZ2V0KHJl
ZmVyZW5jZUZpbHRlcikuZ2V0KCk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ2FjaGVkU1ZHRG9jdW1lbnQqIGNhY2hlZERv
Y3VtZW50ID0gdmFsdWUtPmxvYWQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgICAgICAgICAg
aWYgKCFjYWNoZWREb2N1bWVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAgICAgLy8gU3Rhc2ggdGhlIENhY2hlZFNWR0RvY3VtZW50IG9uIHRoZSByZWZlcmVuY2UgZmls
dGVyLgorICAgICAgICAgICAgcmVmZXJlbmNlRmlsdGVyLT5zZXRDYWNoZWRTVkdEb2N1bWVudFJl
ZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UoY2FjaGVkRG9j
dW1lbnQpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50
cygpLmNsZWFyKCk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKK1N0eWxl
U2hhZGVyKiBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYWRlcihDU1NWYWx1ZSogdmFsdWUpCit7Cisg
ICAgaWYgKHZhbHVlLT5pc1dlYktpdENTU1NoYWRlclZhbHVlKCkpCisgICAgICAgIHJldHVybiBj
YWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShzdGF0aWNfY2FzdDxXZWJLaXRDU1NT
aGFkZXJWYWx1ZSo+KHZhbHVlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK1N0eWxlU2hhZGVyKiBT
dHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRD
U1NTaGFkZXJWYWx1ZSogdmFsdWUpCit7CisgICAgU3R5bGVTaGFkZXIqIHNoYWRlciA9IHZhbHVl
LT5jYWNoZWRPclBlbmRpbmdTaGFkZXIoKTsKKyAgICBpZiAoc2hhZGVyICYmIHNoYWRlci0+aXNQ
ZW5kaW5nU2hhZGVyKCkpCisgICAgICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnModHJ1
ZSk7CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVu
ZGluZ1NoYWRlcnMoKQoreworICAgIGlmICghbV9zdGF0ZS5zdHlsZSgpLT5oYXNGaWx0ZXIoKSB8
fCAhbV9zdGF0ZS5oYXNQZW5kaW5nU2hhZGVycygpKQorICAgICAgICByZXR1cm47CisKKyAgICBD
YWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBtX3N0YXRlLmRvY3Vt
ZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisKKyAgICBWZWN0b3I8UmVmUHRyPEZpbHRl
ck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IG1fc3RhdGUuc3R5bGUoKS0+bXV0YWJs
ZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmls
dGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8RmlsdGVyT3BlcmF0
aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOworICAgICAgICBp
ZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVyT3BlcmF0aW9u
OjpDVVNUT00pIHsKKyAgICAgICAgICAgIEN1c3RvbUZpbHRlck9wZXJhdGlvbiogY3VzdG9tRmls
dGVyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9u
LmdldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVChjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7Cisg
ICAgICAgICAgICBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qIHByb2dyYW0gPSBzdGF0aWNfY2Fz
dDxTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qPihjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7Cisg
ICAgICAgICAgICBpZiAocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkgJiYgcHJvZ3JhbS0+dmVydGV4
U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7CisgICAgICAgICAgICAgICAgV2ViS2l0Q1NT
U2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVy
Kj4ocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOworICAgICAgICAg
ICAgICAgIHByb2dyYW0tPnNldFZlcnRleFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVy
KGNhY2hlZFJlc291cmNlTG9hZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
cHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSAmJiBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLT5p
c1BlbmRpbmdTaGFkZXIoKSkgeworICAgICAgICAgICAgICAgIFdlYktpdENTU1NoYWRlclZhbHVl
KiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRlcio+KHByb2dyYW0t
PmZyYWdtZW50U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOworICAgICAgICAgICAgICAgIHBy
b2dyYW0tPnNldEZyYWdtZW50U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVk
UmVzb3VyY2VMb2FkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBt
X3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKTsKK30KKworc3RhdGljIGJvb2wgc29y
dFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI+JiBhLCBjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiYgYikKK3sKKyAg
ICByZXR1cm4gY29kZVBvaW50Q29tcGFyZUxlc3NUaGFuKGEtPm5hbWUoKSwgYi0+bmFtZSgpKTsK
K30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBh
cnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1
ZUxpc3QqIHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI+
IGFycmF5UGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI6OmNyZWF0ZShuYW1l
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBsZW5ndGggPSB2YWx1ZXMtPmxlbmd0aCgpOyBp
IDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKGkpOworICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7
CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGFy
cmF5UGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7
CisgICAgfQorICAgIHJldHVybiBhcnJheVBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFs
dWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI+IG51bWJlclBh
cmFtZXRlciA9IEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YWx1ZXMtPmxlbmd0aCgpOyArK2kpIHsKKyAgICAg
ICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwor
ICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG51bWJlclBhcmFtZXRlci0+YWRkVmFsdWUo
cHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVt
YmVyUGFyYW1ldGVyLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVy
KGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRy
PEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcj4gdHJhbnNmb3JtUGFyYW1ldGVyID0gQ3Vz
dG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7CisgICAgVHJhbnNmb3Jt
T3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFs
dWVzLCBtX3N0YXRlLnN0eWxlKCksIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRp
b25zKTsKKyAgICB0cmFuc2Zvcm1QYXJhbWV0ZXItPnNldE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7
CisgICAgcmV0dXJuIHRyYW5zZm9ybVBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRl
clBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKiBwYXJhbWV0ZXJWYWx1ZSkK
K3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IG90aGVyIHBhcmFtZXRlcnMgdHlwZXMgcGFyc2lu
Zy4KKyAgICAvLyBib29sZWFuczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTc2NDM4CisgICAgLy8gdGV4dHVyZXM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03MTQ0MgorICAgIC8vIG1hdDIsIG1hdDMsIG1hdDQ6IGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTQ0NAorICAgIC8vIE51bWJlciBwYXJhbWV0ZXJz
IGFyZSB3cmFwcGVkIGluc2lkZSBhIENTU1ZhbHVlTGlzdCBhbmQgYWxsCisgICAgLy8gdGhlIG90
aGVyIGZ1bmN0aW9ucyB2YWx1ZXMgaW5oZXJpdCBmcm9tIENTU1ZhbHVlTGlzdC4KKyAgICBpZiAo
IXBhcmFtZXRlclZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IENTU1ZhbHVlTGlzdCogdmFsdWVzID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4ocGFyYW1l
dGVyVmFsdWUpOworICAgIGlmICghdmFsdWVzLT5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBpZiAocGFyYW1ldGVyVmFsdWUtPmlzV2ViS2l0Q1NTQXJyYXlGdW5jdGlvblZhbHVl
KCkpCisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKG5hbWUs
IHZhbHVlcyk7CisKKyAgICAvLyBJZiB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGxpc3QgaXMgYSB0
cmFuc2Zvcm0gZnVuY3Rpb24sCisgICAgLy8gdGhlbiB3ZSBjb3VsZCBzYWZlbHkgYXNzdW1lIHRo
YXQgYWxsIHRoZSByZW1haW5pbmcgaXRlbXMKKyAgICAvLyBhcmUgdHJhbnNmb3Jtcy4gcGFyc2VD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIgd2lsbAorICAgIC8vIHJldHVybiAwIGlmIHRo
YXQgYXNzdW1wdGlvbiBpcyBpbmNvcnJlY3QuCisgICAgaWYgKHZhbHVlcy0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygwKS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQorICAgICAgICByZXR1
cm4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKwor
ICAgIC8vIFdlIGNhbiBoYXZlIG9ubHkgYXJyYXlzIG9mIGJvb2xlYW5zIG9yIG51bWJlcnMsIHNv
IHVzZSB0aGUgZmlyc3QgdmFsdWUgdG8gY2hvb3NlIGJldHdlZW4gdGhvc2UgdHdvLgorICAgIC8v
IFdlIG5lZWQgdXAgdG8gNCB2YWx1ZXMgKGFsbCBib29sZWFucyBvciBhbGwgbnVtYmVycykuCisg
ICAgaWYgKCF2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFs
dWUoKSB8fCB2YWx1ZXMtPmxlbmd0aCgpID4gNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0UHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7Cisg
ICAgaWYgKGZpcnN0UHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRp
dmVWYWx1ZTo6Q1NTX05VTUJFUikKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyTnVt
YmVyUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7CisKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHRo
ZSBib29sZWFuIGFycmF5IHBhcmFtZXRlciBoZXJlLgorICAgIC8vIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQzOAorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wg
U3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiBw
YXJhbWV0ZXJzVmFsdWUsIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmIHBhcmFtZXRlckxpc3Qp
Cit7CisgICAgSGFzaFNldDxTdHJpbmc+IGtub3duUGFyYW1ldGVyTmFtZXM7CisgICAgQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgcGFyYW1ldGVySXRlcmF0b3IocGFyYW1ldGVyc1ZhbHVlKTsKKyAgICBm
b3IgKDsgcGFyYW1ldGVySXRlcmF0b3IuaGFzTW9yZSgpOyBwYXJhbWV0ZXJJdGVyYXRvci5hZHZh
bmNlKCkpIHsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpLT5pc1ZhbHVl
TGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBDU1NWYWx1ZUxpc3RJ
dGVyYXRvciBpdGVyYXRvcihwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgaWYg
KCFpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfU1RS
SU5HKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgU3RyaW5n
IG5hbWUgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgLy8gRG8g
bm90IGFsbG93IGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMuCisgICAgICAgIGlmIChrbm93blBh
cmFtZXRlck5hbWVzLmNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBrbm93blBhcmFtZXRlck5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgCisgICAgICAg
IGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghaXRlcmF0b3IuaGFz
TW9yZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgUmVm
UHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyYW1ldGVyID0gcGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXIobmFtZSwgaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmICghcGFyYW1ldGVy
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBwYXJhbWV0ZXJMaXN0LmFwcGVu
ZChwYXJhbWV0ZXIucmVsZWFzZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gTWFrZSBzdXJlIHdl
IHNvcnQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHBhc3NpbmcgdGhlbSBkb3duIHRvIHRoZSBDdXN0
b21GaWx0ZXJPcGVyYXRpb24uCisgICAgc3RkOjpzb3J0KHBhcmFtZXRlckxpc3QuYmVnaW4oKSwg
cGFyYW1ldGVyTGlzdC5lbmQoKSwgc29ydFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKTsKKyAg
ICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRp
b24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1bGVS
ZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQoreworICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgc3R5bGUgcmVzb2x1dGlvbiBmb3IgdGhlIGN1c3RvbSBmaWx0
ZXIgYXQtcnVsZSByZWZlcmVuY2Ugc3ludGF4LgorICAgIFVOVVNFRF9QQVJBTShmaWx0ZXJWYWx1
ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
PiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3lu
dGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICBDU1NWYWx1ZSog
c2hhZGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Cisg
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2hhZGVyc1ZhbHVlLT5pc1ZhbHVl
TGlzdCgpKTsKKyAgICBDU1NWYWx1ZUxpc3QqIHNoYWRlcnNMaXN0ID0gc3RhdGljX2Nhc3Q8Q1NT
VmFsdWVMaXN0Kj4oc2hhZGVyc1ZhbHVlKTsKKworICAgIHVuc2lnbmVkIHNoYWRlcnNMaXN0TGVu
Z3RoID0gc2hhZGVyc0xpc3QtPmxlbmd0aCgpOworICAgIEFTU0VSVChzaGFkZXJzTGlzdExlbmd0
aCk7CisKKyAgICBSZWZQdHI8U3R5bGVTaGFkZXI+IHZlcnRleFNoYWRlciA9IHN0eWxlU2hhZGVy
KHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKyAgICBSZWZQdHI8U3R5
bGVTaGFkZXI+IGZyYWdtZW50U2hhZGVyOworICAgIEN1c3RvbUZpbHRlclByb2dyYW1UeXBlIHBy
b2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX0JMRU5EU19FTEVNRU5UX1RFWFRVUkU7CisgICAgQ3Vz
dG9tRmlsdGVyUHJvZ3JhbU1peFNldHRpbmdzIG1peFNldHRpbmdzOworCisgICAgaWYgKHNoYWRl
cnNMaXN0TGVuZ3RoID4gMSkgeworICAgICAgICBDU1NWYWx1ZSogZnJhZ21lbnRTaGFkZXJPck1p
eEZ1bmN0aW9uID0gc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7CisKKyAg
ICAgICAgaWYgKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbi0+aXNXZWJLaXRDU1NNaXhGdW5j
dGlvblZhbHVlKCkpIHsKKyAgICAgICAgICAgIFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUqIG1p
eEZ1bmN0aW9uID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSo+KGZyYWdt
ZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7CisgICAgICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRv
ciBpdGVyYXRvcihtaXhGdW5jdGlvbik7CisKKyAgICAgICAgICAgIEFTU0VSVChtaXhGdW5jdGlv
bi0+bGVuZ3RoKCkpOworICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihp
dGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKworICAg
ICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSA8PSAzKTsKKyAgICAgICAgICAg
IHdoaWxlIChpdGVyYXRvci5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmIChDU1NQYXJzZXI6OmlzQmxl
bmRNb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAg
bWl4U2V0dGluZ3MuYmxlbmRNb2RlID0gKnByaW1pdGl2ZVZhbHVlOworICAgICAgICAgICAgICAg
IGVsc2UgaWYgKENTU1BhcnNlcjo6aXNDb21wb3NpdGVPcGVyYXRvcihwcmltaXRpdmVWYWx1ZS0+
Z2V0SWRlbnQoKSkpCisgICAgICAgICAgICAgICAgICAgIG1peFNldHRpbmdzLmNvbXBvc2l0ZU9w
ZXJhdG9yID0gKnByaW1pdGl2ZVZhbHVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgaXRlcmF0
b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfTk9fRUxFTUVOVF9URVhUVVJFOworICAgICAg
ICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihmcmFnbWVudFNoYWRlck9yTWl4RnVu
Y3Rpb24pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIG1lc2hSb3dzID0g
MTsKKyAgICB1bnNpZ25lZCBtZXNoQ29sdW1ucyA9IDE7CisgICAgQ3VzdG9tRmlsdGVyTWVzaFR5
cGUgbWVzaFR5cGUgPSBNZXNoVHlwZUF0dGFjaGVkOworICAgIAorICAgIENTU1ZhbHVlKiBwYXJh
bWV0ZXJzVmFsdWUgPSAwOworICAgIAorICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7CisgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKGZpbHRlclZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBzZWNv
bmQgdmFsdWUgbWlnaHQgYmUgdGhlIG1lc2ggYm94IG9yIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnM6
CisgICAgICAgIC8vIElmIGl0IHN0YXJ0cyB3aXRoIGEgbnVtYmVyIG9yIGFueSBvZiB0aGUgbWVz
aC1ib3ggaWRlbnRpZmllcnMgaXQgaXMgCisgICAgICAgIC8vIHRoZSBtZXNoLWJveCBsaXN0LCBp
ZiBub3QgaXQgbWVhbnMgaXQgaXMgdGhlIHBhcmFtZXRlcnMgbGlzdC4KKworICAgICAgICBpZiAo
aXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAg
ICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIG9ubHkg
b25lIGludGVnZXIgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHNldCBib3RoCisgICAgICAg
ICAgICAgICAgLy8gdGhlIHJvd3MgYW5kIHRoZSBjb2x1bW5zLgorICAgICAgICAgICAgICAgIG1l
c2hDb2x1bW5zID0gbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKKyAg
ICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGFub3RoZXIgbnVtYmVyIGZvciB0aGUgcm93cy4K
KyAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJp
bWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9y
LnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVt
YmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc2hSb3dzID0gcHJpbWl0aXZlVmFs
dWUtPmdldEludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZh
bmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3Jl
KCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlRGV0YWNoZWQpIHsKKyAgICAgICAgICAgICAgICBtZXNoVHlw
ZSA9IE1lc2hUeXBlRGV0YWNoZWQ7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWl0ZXJh
dG9yLmluZGV4KCkpIHsKKyAgICAgICAgICAgIC8vIElmIG5vIHZhbHVlIHdhcyBjb25zdW1lZCBm
cm9tIHRoZSBtZXNoIHZhbHVlLCB0aGVuIGl0IGlzIGp1c3QgYSBwYXJhbWV0ZXIgbGlzdCwgbWVh
bmluZyB0aGF0IHdlIGVuZCB1cAorICAgICAgICAgICAgLy8gaGF2aW5nIGp1c3QgdHdvIENTU0xp
c3RWYWx1ZXM6IGxpc3Qgb2Ygc2hhZGVycyBhbmQgbGlzdCBvZiBwYXJhbWV0ZXJzLgorICAgICAg
ICAgICAgQVNTRVJUKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAyKTsKKyAgICAgICAgICAgIHBh
cmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpOwor
ICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPiAy
ICYmICFwYXJhbWV0ZXJzVmFsdWUpCisgICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpOworICAgIAorICAgIEN1c3RvbUZpbHRlclBh
cmFtZXRlckxpc3QgcGFyYW1ldGVyTGlzdDsKKyAgICBpZiAocGFyYW1ldGVyc1ZhbHVlICYmICFw
YXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QocGFyYW1ldGVyc1ZhbHVlLCBwYXJhbWV0ZXJM
aXN0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgUmVmUHRyPFN0eWxlQ3VzdG9tRmls
dGVyUHJvZ3JhbT4gcHJvZ3JhbSA9IFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbTo6Y3JlYXRlKHZl
cnRleFNoYWRlci5yZWxlYXNlKCksIGZyYWdtZW50U2hhZGVyLnJlbGVhc2UoKSwgcHJvZ3JhbVR5
cGUsIG1peFNldHRpbmdzLCBtZXNoVHlwZSk7CisgICAgcmV0dXJuIEN1c3RvbUZpbHRlck9wZXJh
dGlvbjo6Y3JlYXRlKHByb2dyYW0ucmVsZWFzZSgpLCBwYXJhbWV0ZXJMaXN0LCBtZXNoUm93cywg
bWVzaENvbHVtbnMsIG1lc2hUeXBlKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVy
YXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRD
U1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCit7CisgICAgQVNTRVJUKGZpbHRlclZhbHVlLT5s
ZW5ndGgoKSk7CisgICAgYm9vbCBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA9IGZpbHRlclZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVlKCk7CisgICAgcmV0
dXJuIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID8gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9u
V2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChmaWx0ZXJWYWx1ZSkgOiBjcmVhdGVDdXN0b21GaWx0
ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KGZpbHRlclZhbHVlKTsKK30KKworI2VuZGlmCisK
K2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5W
YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJP
cGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKQoreworICAgIEFTU0VSVChvdXRPcGVyYXRpb25zLmlz
RW1wdHkoKSk7CisgICAgCisgICAgaWYgKCFpblZhbHVlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgCisgICAgaWYgKGluVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KGluVmFsdWUpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkgPT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIGlmICghaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpvb20o
KSA6IDE7CisgICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGZvciAoQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewor
ICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICBpZiAoIWN1
cnJWYWx1ZS0+aXNXZWJLaXRDU1NGaWx0ZXJWYWx1ZSgpKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlID0gc3RhdGljX2Nh
c3Q8V2ViS2l0Q1NTRmlsdGVyVmFsdWUqPihpLnZhbHVlKCkpOworICAgICAgICBGaWx0ZXJPcGVy
YXRpb246Ok9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9IGZpbHRlck9wZXJhdGlvbkZvclR5
cGUoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQURF
UlMpCisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6VkFMSURB
VEVEX0NVU1RPTSkgeworICAgICAgICAgICAgLy8gVmFsaWRhdGVkQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBlbmQgdXAgaW4gdGhlIFJlbmRlclN0eWxlLgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RP
TSkgeworICAgICAgICAgICAgUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0aW9u
ID0gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKGZpbHRlclZhbHVlKTsKKyAgICAgICAgICAg
IGlmICghb3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlv
bik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlm
IChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7CisjaWYgRU5B
QkxFKFNWRykKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBhcmd1bWVudCA9
IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworCisgICAgICAgICAgICBp
ZiAoIWFyZ3VtZW50LT5pc1dlYktpdENTU1NWR0RvY3VtZW50VmFsdWUoKSkKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSog
c3ZnRG9jdW1lbnRWYWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWUq
Pihhcmd1bWVudCk7CisgICAgICAgICAgICBLVVJMIHVybCA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+
Y29tcGxldGVVUkwoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCkpOworCisgICAgICAgICAgICBSZWZQ
dHI8UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBSZWZlcmVuY2VGaWx0ZXJP
cGVyYXRpb246OmNyZWF0ZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgdXJsLmZyYWdtZW50SWRl
bnRpZmllcigpLCBvcGVyYXRpb25UeXBlKTsKKyAgICAgICAgICAgIGlmIChTVkdVUklSZWZlcmVu
Y2U6OmlzRXh0ZXJuYWxVUklSZWZlcmVuY2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIG1fc3Rh
dGUuZG9jdW1lbnQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN2Z0RvY3VtZW50VmFsdWUt
PmxvYWRSZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZS5wZW5kaW5nU1ZH
RG9jdW1lbnRzKCkuc2V0KG9wZXJhdGlvbi5nZXQoKSwgc3ZnRG9jdW1lbnRWYWx1ZSk7CisgICAg
ICAgICAgICAgICAgZWxzZSBpZiAoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQo
KSkKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLT5zZXRDYWNoZWRTVkdEb2N1bWVudFJl
ZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2Uoc3ZnRG9jdW1l
bnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24pOworI2VuZGlmCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoYXQg
YWxsIHBhcmFtZXRlcnMgYXJlIHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggdGhlCisgICAgICAgIC8v
IGV4Y2VwdGlvbiBvZiBkcm9wIHNoYWRvdyB3aGljaCBoYXMgYSBTaGFkb3dWYWx1ZSBwYXJhbWV0
ZXIuCisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlICE9IEZpbHRlck9wZXJhdGlvbjo6RFJPUF9T
SEFET1cpIHsKKyAgICAgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7
CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgZmlsdGVyVmFsdWUtPmxlbmd0
aCgpOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhh
dmVOb25QcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorCisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0gZmlsdGVyVmFsdWUt
Pmxlbmd0aCgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmaWx0ZXJWYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSkgOiAwOworICAgICAgICBzd2l0Y2ggKGZpbHRlclZh
bHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6R3JheXNjYWxlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRl
clZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBh
bW91bnQgPSAxOworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKSB7
CisgICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNQZXJjZW50YWdlKCkpCisgICAgICAg
ICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3Bl
cmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpIdWVSb3Rh
dGVGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IDA7CisgICAg
ICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpCisgICAgICAgICAgICAgICAg
YW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworCisgICAgICAgICAgICBvcGVy
YXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlv
bjo6Y3JlYXRlKGFuZ2xlLCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJP
cGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5lc3NG
aWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkNvbnRy
YXN0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpP
cGFjaXR5RmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW1vdW50ID0gKGZp
bHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdo
dG5lc3NGaWx0ZXJPcGVyYXRpb24pID8gMCA6IDE7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFs
dWUtPmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVl
LT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1Bl
cmNlbnRhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2lj
Q29tcG9uZW50VHJhbnNmZXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlv
blR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIExl
bmd0aCBzdGREZXZpYXRpb24gPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA+PSAxKQorICAgICAgICAgICAgICAgIHN0ZERldmlhdGlvbiA9
IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21G
YWN0b3IpOworICAgICAgICAgICAgaWYgKHN0ZERldmlhdGlvbi5pc1VuZGVmaW5lZCgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKEJsdXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShzdGREZXZpYXRpb24s
IG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246IHsK
KyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIENTU1ZhbHVlKiBjc3NWYWx1ZSA9IGZp
bHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworICAgICAgICAgICAgaWYgKCFj
c3NWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4o
Y3NzVmFsdWUpOworICAgICAgICAgICAgSW50UG9pbnQgbG9jYXRpb24oaXRlbS0+eC0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290
U3R5bGUsIHpvb21GYWN0b3IpKTsKKyAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/
IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFj
dG9yKSA6IDA7CisgICAgICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgIGlmIChpdGVt
LT5jb2xvcikKKyAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVl
KGl0ZW0tPmNvbG9yLmdldCgpKTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKERyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShsb2NhdGlvbiwgYmx1
ciwgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQsIG9wZXJhdGlv
blR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgb3V0T3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0
eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqIHBlbmRpbmdJ
bWFnZSkKK3sKKyAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIg
PSBtX3N0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisKKyAgICBpZiAo
cGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VWYWx1ZSog
aW1hZ2VWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpOworICAgICAgICByZXR1
cm4gaW1hZ2VWYWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0K
KworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgeworICAg
ICAgICBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiBpbWFnZUdlbmVyYXRvclZhbHVlID0gcGVuZGlu
Z0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCk7CisgICAgICAgIGltYWdlR2VuZXJhdG9y
VmFsdWUtPmxvYWRTdWJpbWFnZXMoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgICAgICByZXR1
cm4gU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKGltYWdlR2VuZXJhdG9yVmFsdWUpOworICAg
IH0KKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKSkgeworICAg
ICAgICBDU1NDdXJzb3JJbWFnZVZhbHVlKiBjdXJzb3JJbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdl
LT5jc3NDdXJzb3JJbWFnZVZhbHVlKCk7CisgICAgICAgIHJldHVybiBjdXJzb3JJbWFnZVZhbHVl
LT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgfQorCisjaWYgRU5BQkxF
KENTU19JTUFHRV9TRVQpCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgp
KSB7CisgICAgICAgIENTU0ltYWdlU2V0VmFsdWUqIGltYWdlU2V0VmFsdWUgPSBwZW5kaW5nSW1h
Z2UtPmNzc0ltYWdlU2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGltYWdlU2V0VmFsdWUtPmNh
Y2hlZEltYWdlU2V0KGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9CisjZW5kaWYKKworICAg
IHJldHVybiAwOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2VzKCkK
K3sKKyAgICBpZiAobV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRl
cmF0b3I6OktleXMgZW5kID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuZW5kKCku
a2V5cygpOworICAgIGZvciAoUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0X2l0ZXJhdG9y
OjpLZXlzIGl0ID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuYmVnaW4oKS5rZXlz
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBDU1NQcm9wZXJ0eUlEIGN1cnJlbnRQcm9w
ZXJ0eSA9ICppdDsKKworICAgICAgICBzd2l0Y2ggKGN1cnJlbnRQcm9wZXJ0eSkgeworICAgICAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOiB7CisgICAgICAgICAgICBmb3IgKEZp
bGxMYXllciogYmFja2dyb3VuZExheWVyID0gbV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NCYWNrZ3Jv
dW5kTGF5ZXJzKCk7IGJhY2tncm91bmRMYXllcjsgYmFja2dyb3VuZExheWVyID0gYmFja2dyb3Vu
ZExheWVyLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZExheWVyLT5p
bWFnZSgpICYmIGJhY2tncm91bmRMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAg
ICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZExheWVyLT5zZXRJbWFnZShsb2FkUGVuZGluZ0lt
YWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oYmFja2dyb3VuZExheWVyLT5pbWFn
ZSgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6IHsKKyAgICAgICAgICAgIGZvciAoQ29udGVu
dERhdGEqIGNvbnRlbnREYXRhID0gY29uc3RfY2FzdDxDb250ZW50RGF0YSo+KG1fc3RhdGUuc3R5
bGUoKS0+Y29udGVudERhdGEoKSk7IGNvbnRlbnREYXRhOyBjb250ZW50RGF0YSA9IGNvbnRlbnRE
YXRhLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudERhdGEtPmlzSW1hZ2Uo
KSkgeworICAgICAgICAgICAgICAgICAgICBTdHlsZUltYWdlKiBpbWFnZSA9IHN0YXRpY19jYXN0
PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPmltYWdlKCk7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShz
dGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGltYWdlKSk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAobG9hZGVkSW1hZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+c2V0SW1hZ2UobG9hZGVk
SW1hZ2UucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgQ1NTUHJvcGVydHlDdXJzb3I6IHsKKyAgICAgICAgICAgIGlmIChDdXJzb3JMaXN0KiBj
dXJzb3JMaXN0ID0gbV9zdGF0ZS5zdHlsZSgpLT5jdXJzb3JzKCkpIHsKKyAgICAgICAgICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGN1cnNvckxpc3QtPnNpemUoKTsgKytpKSB7CisgICAg
ICAgICAgICAgICAgICAgIEN1cnNvckRhdGEmIGN1cnJlbnRDdXJzb3IgPSBjdXJzb3JMaXN0LT5h
dChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0eWxlSW1hZ2UqIGltYWdlID0gY3VycmVu
dEN1cnNvci5pbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmlz
UGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN1cnNv
ci5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdl
Kj4oaW1hZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0
eWxlKCktPmxpc3RTdHlsZUltYWdlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFn
ZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+
c2V0TGlzdFN0eWxlSW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRp
bmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFn
ZVNvdXJjZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VT
b3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCktPmlzUGVuZGlu
Z0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRCb3JkZXJJbWFn
ZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4o
bV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpKSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6
IHsKKyAgICAgICAgICAgIGlmIChTdHlsZVJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtX3N0YXRl
LnN0eWxlKCktPmJveFJlZmxlY3QoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IE5pbmVQaWVj
ZUltYWdlJiBtYXNrSW1hZ2UgPSByZWZsZWN0aW9uLT5tYXNrKCk7CisgICAgICAgICAgICAgICAg
aWYgKG1hc2tJbWFnZS5pbWFnZSgpICYmIG1hc2tJbWFnZS5pbWFnZSgpLT5pc1BlbmRpbmdJbWFn
ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJbWFn
ZSA9IGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNr
SW1hZ2UuaW1hZ2UoKSkpOworICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNr
KE5pbmVQaWVjZUltYWdlKGxvYWRlZEltYWdlLnJlbGVhc2UoKSwgbWFza0ltYWdlLmltYWdlU2xp
Y2VzKCksIG1hc2tJbWFnZS5maWxsKCksIG1hc2tJbWFnZS5ib3JkZXJTbGljZXMoKSwgbWFza0lt
YWdlLm91dHNldCgpLCBtYXNrSW1hZ2UuaG9yaXpvbnRhbFJ1bGUoKSwgbWFza0ltYWdlLnZlcnRp
Y2FsUnVsZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZVNvdXJjZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bWFza0Jv
eEltYWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKS0+
aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldE1h
c2tCb3hJbWFnZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGlu
Z0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSkpKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrSW1hZ2U6IHsKKyAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBtYXNrTGF5ZXIgPSBtX3N0
YXRlLnN0eWxlKCktPmFjY2Vzc01hc2tMYXllcnMoKTsgbWFza0xheWVyOyBtYXNrTGF5ZXIgPSBt
YXNrTGF5ZXItPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChtYXNrTGF5ZXItPmltYWdl
KCkgJiYgbWFza0xheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAg
ICAgICAgICBtYXNrTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8
U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNrTGF5ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3N0
YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5jbGVhcigpOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OmxvYWRQZW5kaW5nUmVzb3VyY2VzKCkKK3sKKyAgICAvLyBTdGFydCBsb2FkaW5nIGlt
YWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdJbWFnZXMoKTsK
KworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAvLyBTdGFydCBsb2FkaW5nIHRoZSBzaGFk
ZXJzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1NoYWRlcnMoKTsK
KyNlbmRpZgorICAgIAorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAg
ICAvLyBTdGFydCBsb2FkaW5nIHRoZSBTVkcgRG9jdW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBz
dHlsZS4KKyAgICBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOworI2VuZGlmCit9CisKK2lubGlu
ZSBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6TWF0Y2hlZFByb3BlcnRpZXMoKQor
ICAgIDogcG9zc2libHlQYWRkZWRNZW1iZXIoMCkKK3sKK30KKworaW5saW5lIFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjp+TWF0Y2hlZFByb3BlcnRpZXMoKQoreworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNz
SW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NT
KTsKKyAgICBpbmZvLmFkZE1lbWJlcihwcm9wZXJ0aWVzLCAicHJvcGVydGllcyIpOworfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtOjpyZXBvcnRNZW1v
cnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAg
IE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1v
cnlUeXBlczo6Q1NTKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtYXRjaGVkUHJvcGVydGllcywgIm1h
dGNoZWRQcm9wZXJ0aWVzIik7CisgICAgaW5mby5hZGRNZW1iZXIocmFuZ2VzLCAicmFuZ2VzIik7
CisgICAgaW5mby5hZGRNZW1iZXIocmVuZGVyU3R5bGUsICJyZW5kZXJTdHlsZSIpOworICAgIGlu
Zm8uYWRkTWVtYmVyKHBhcmVudFJlbmRlclN0eWxlLCAicGFyZW50UmVuZGVyU3R5bGUiKTsKK30K
Kwordm9pZCBNZWRpYVF1ZXJ5UmVzdWx0OjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJ
bmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZv
KG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBp
bmZvLmFkZE1lbWJlcihtX2V4cHJlc3Npb24sICJleHByZXNzaW9uIik7Cit9CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2Jq
ZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJ
bmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9ydWxlU2V0cywgInJ1bGVTZXRzIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9rZXlmcmFtZXNS
dWxlTWFwLCAia2V5ZnJhbWVzUnVsZU1hcCIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZSwgIm1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUiKTsKKyAgICBpbmZvLmFk
ZE1lbWJlcihtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLCAibWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZVN3ZWVwVGltZXIiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fbWVkaXVtLCAi
bWVkaXVtIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9yb290RGVmYXVsdFN0eWxlLCAicm9vdERl
ZmF1bHRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZG9jdW1lbnQsICJkb2N1bWVudCIp
OworCisgICAgaW5mby5hZGRNZW1iZXIobV9mb250U2VsZWN0b3IsICJmb250U2VsZWN0b3IiKTsK
KyAgICBpbmZvLmFkZE1lbWJlcihtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMs
ICJ2aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzIik7CisgICAgaW5mby5pZ25vcmVN
ZW1iZXIobV9zdHlsZUJ1aWxkZXIpOworICAgIGluZm8uYWRkTWVtYmVyKG1faW5zcGVjdG9yQ1NT
T01XcmFwcGVycyk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zY29wZVJlc29sdmVyLCAic2NvcGVS
ZXNvbHZlciIpOworCisgICAgaW5mby5hZGRNZW1iZXIobV9zdGF0ZSwgInN0YXRlIik7CisKKyAg
ICAvLyBGSVhNRTogbW92ZSB0aGlzIHRvIGEgcGxhY2Ugd2hlcmUgaXQgd291bGQgYmUgY2FsbGVk
IG9ubHkgb25jZT8KKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRl
ZmF1bHRTdHlsZSwgImRlZmF1bHRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlLCAiZGVmYXVsdFF1aXJrc1N0eWxlIik7
CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRT
dHlsZSwiZGVmYXVsdFByaW50U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0
U3R5bGVTaGVldHM6OmRlZmF1bHRWaWV3U291cmNlU3R5bGUsICJkZWZhdWx0Vmlld1NvdXJjZVN0
eWxlIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAkocmV2aXNpb24gMTQ0ODkzKQorKysgU291cmNlL1dl
YkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNTIx
NiArMjcsMTA0IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0eWxl
UmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJQYWdlUnVsZUNvbGxlY3Rvci5oIgogCi0jaW5jbHVkZSAi
QXR0cmlidXRlLmgiCi0jaW5jbHVkZSAiQ1NTQm9yZGVySW1hZ2UuaCIKLSNpbmNsdWRlICJDU1ND
YWxjdWxhdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oIgogI2lu
Y2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIkNTU0ZvbnRGYWNlUnVs
ZS5oIgotI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5oIgotI2luY2x1ZGUgIkNTU0xpbmVCb3hD
b250YWluVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NQYWdlUnVsZS5oIgotI2luY2x1ZGUgIkNTU1Bh
cnNlci5oIgotI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZhbHVlTWFwcGluZ3MuaCIKLSNpbmNsdWRl
ICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0jaW5jbHVkZSAiQ1NTUmVmbGVjdFZhbHVlLmgiCi0jaW5j
bHVkZSAiQ1NTU2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKLSNpbmNs
dWRlICJDU1NTdHlsZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NTdXBwb3J0c1J1bGUuaCIKLSNpbmNs
dWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVMaXN0Lmgi
Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0jaW5jbHVkZSAiQ1NTVmFyaWFibGVWYWx1ZS5o
IgotI2VuZGlmCi0jaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJDYWxjdWxhdGlv
blZhbHVlLmgiCi0jaW5jbHVkZSAiQ29udGVudERhdGEuaCIKLSNpbmNsdWRlICJDb250ZXh0RmVh
dHVyZXMuaCIKLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAiQ291bnRlckNvbnRlbnQu
aCIKLSNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKLSNpbmNsdWRlICJGb250
RmVhdHVyZVZhbHVlLmgiCi0jaW5jbHVkZSAiRm9udFZhbHVlLmgiCi0jaW5jbHVkZSAiRnJhbWUu
aCIKLSNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgot
I2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgot
I2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTFByb2dyZXNzRWxl
bWVudC5oIgotI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MVGV4
dEFyZWFFbGVtZW50LmgiCi0jaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQuaCIKLSNpbmNsdWRlICJJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJLZXlmcmFtZUxpc3QuaCIKLSNp
bmNsdWRlICJMaW5rSGFzaC5oIgotI2luY2x1ZGUgIkxvY2FsZVRvU2NyaXB0TWFwcGluZy5oIgot
I2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCi0jaW5jbHVkZSAiTWF0cml4M0RUcmFuc2Zvcm1PcGVy
YXRpb24uaCIKLSNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRl
ICJNZWRpYUxpc3QuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCi0jaW5jbHVk
ZSAiTm9kZVJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQuaCIK
LSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGFpci5oIgotI2luY2x1ZGUgIlBlcnNwZWN0
aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgotI2luY2x1
ZGUgIlJlY3QuaCIKLSNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKLSNpbmNsdWRlICJSZW5kZXJT
Y3JvbGxiYXIuaCIKLSNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVtZS5oIgotI2luY2x1ZGUg
IlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKLSNpbmNs
dWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgi
Ci0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9ucy5o
IgotI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgotI2luY2x1ZGUgIlNjYWxlVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKLSNpbmNsdWRlICJT
ZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVk
ZSAiU2hhZG93RGF0YS5oIgotI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKLSNpbmNsdWRlICJTaGFk
b3dWYWx1ZS5oIgotI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCi0jaW5j
bHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5o
IgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJTdHlsZUdlbmVyYXRl
ZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVQZW5kaW5nSW1hZ2UuaCIKICNpbmNsdWRlICJTdHls
ZVByb3BlcnR5U2V0LmgiCiAjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiU3R5bGVS
dWxlSW1wb3J0LmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCi0jaW5jbHVkZSAi
U3R5bGVTaGVldExpc3QuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiVHJhbnNmb3Jt
YXRpb25NYXRyaXguaCIKLSNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIK
LSNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIlZpZXdwb3J0U3R5
bGVSZXNvbHZlci5oIgotI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKLSNpbmNsdWRlICJX
ZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJh
bWVSdWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgotI2luY2x1ZGUg
IldlYktpdENTU1JlZ2lvblJ1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZS5oIgotI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgotI2luY2x1ZGUgIlhNTE5h
bWVzLmgiCi0jaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KLSNp
bmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0
Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0
cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotCi0jaWYgRU5BQkxFKENTU19GSUxURVJT
KQotI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdENTU0ZpbHRl
clZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKLSNpbmNs
dWRlICJEYXNoYm9hcmRSZWdpb24uaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFNWRykKLSNpbmNs
dWRlICJDYWNoZWRTVkdEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVm
ZXJlbmNlLmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50
LmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIK
LSNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5o
IgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgotI2luY2x1ZGUgIkN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5o
IgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZp
bHRlclRyYW5zZm9ybVBhcmFtZXRlci5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgi
Ci0jaW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCi0jaW5jbHVkZSAiU3R5bGVQ
ZW5kaW5nU2hhZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKLSNpbmNsdWRlICJXZWJL
aXRDU1NNaXhGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUu
aCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0jaW5jbHVkZSAiQ1NTSW1h
Z2VTZXRWYWx1ZS5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKLSNlbmRpZgot
Ci0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKLSNl
bmRpZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1uYW1lc3BhY2UgV1RGIHsKLQotdGVtcGxh
dGU8PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2Vi
Q29yZTo6UnVsZURhdGEqPiB7Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lk
IHJlcG9ydE1lbW9yeVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5mbyYpIHsgfQotfTsKLQotfQog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLSNk
ZWZpbmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5oZXJpdCkgeyBcCi0g
ICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9w
KCkpOyBcCi0gICAgcmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwocHJvcCwgUHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlz
SW5pdGlhbCkgeyBcCi0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6
OmluaXRpYWwjI1Byb3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotUmVuZGVyU3R5bGUqIFN0
eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KLXN0YXRpYyBTdHlsZVByb3Bl
cnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xP
Q0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9w
ZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkp
Ci0gICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rp
b24sIENTU1ZhbHVlTHRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwotfQot
Ci1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCi17Ci0g
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9M
ZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKHJpZ2h0VG9M
ZWZ0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5
KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0gICAgcmV0dXJuIHJpZ2h0VG9M
ZWZ0RGVjbC5nZXQoKTsKLX0KLQotCi1pbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVz
b2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAgaWYgKCFtX3J1bGVMaXN0KQot
ICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIHJl
dHVybiBtX3J1bGVMaXN0LmdldCgpOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpT
dGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKLXsKLSAgICBtX2hhc1VBQXBwZWFyYW5j
ZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKLSAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2Up
IHsKLSAgICAgICAgbV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9yZGVyKCk7Ci0gICAgICAgIG1f
YmFja2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExheWVycygpOwotICAgICAgICBt
X2JhY2tncm91bmRDb2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOwotICAgIH0KLX0K
LQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKLXsKLSAgICBtX2Vs
ZW1lbnQgPSAwOwotICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7Ci0gICAgbV9wYXJlbnRTdHlsZSA9
IDA7Ci0gICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOwot
ICAgIG1fcnVsZUxpc3QgPSAwOwotICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7Ci0gICAgbV9w
ZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQot
ICAgIG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKLSNlbmRpZgotI2lmIEVOQUJMRShDU1Nf
RklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIo
KTsKLSNlbmRpZgotfQotCi1TdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBk
b2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgOiBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgwKQotICAgICwgbV9tYXRjaGVk
UHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRj
aGVkUHJvcGVydGllc0NhY2hlKQotICAgICwgbV9kb2N1bWVudChkb2N1bWVudCkKLSAgICAsIG1f
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAs
IG1fZm9udFNlbGVjdG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKLSNpZiBF
TkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2
ZXIoVmlld3BvcnRTdHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1lbnQpKQotI2VuZGlmCi0gICAg
LCBtX3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQotICAg
ICwgbV9zdHlsZU1hcCh0aGlzKQotewotICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9j
dW1lbnRFbGVtZW50KCk7Ci0KLSAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0
U3R5bGUocm9vdCk7Ci0KLSAgICAvLyBjb25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRl
ZmF1bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVkCi0gICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVl
cmllcyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQg
KG1heC13aWR0aDogMTBlbSkiCi0gICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3Ry
dWN0b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4sCi0gICAgLy8gZG9jdW1lbnQg
ZG9lc24ndCBoYXZlIGRvY3VtZW50RWxlbWVudAotICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0
aGF0IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKLSAg
ICAvLyBpcyBhbHdheXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxl
Y3RvcgotICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52aWV3KCk7Ci0gICAgaWYgKHZp
ZXcpCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Io
dmlldy0+bWVkaWFUeXBlKCkpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQ
dHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKLQotICAgIGlmIChyb290KQotICAg
ICAgICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxs
b3dTdHlsZVNoYXJpbmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKTsKLQotICAgIGlmIChtX3Jv
b3REZWZhdWx0U3R5bGUgJiYgdmlldykKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcg
TWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9y
b290RGVmYXVsdFN0eWxlLmdldCgpKSk7Ci0KLSAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5
bGUoKTsKLQotICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xs
ZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCk7Ci0gICAgbV9ydWxlU2V0
cy5pbml0VXNlclN0eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsK
LQotI2lmIEVOQUJMRShTVkdfRk9OVFMpCi0gICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25z
KCkpIHsKLSAgICAgICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9u
dEZhY2VFbGVtZW50cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxl
bWVudHMoKTsKLSAgICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNo
U2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNl
RWxlbWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgZm9udFNlbGVj
dG9yKCktPmFkZEZvbnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VSdWxlKCkpOwotICAgIH0KLSNl
bmRpZgotCi0gICAgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rp
b24tPmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRzKCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8
UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQotewotICAgIG1fcnVsZVNldHMu
YXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5n
ZXQoKSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2Uo
KSwgdGhpcyk7Ci0gICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+
cmVuZGVyZXIoKS0+c3R5bGUoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5
bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RF
VklDRV9BREFQVEFUSU9OKQotICAgIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7
Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVt
ZW50KiBwYXJlbnQpCi17Ci0gICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9
IHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOwotCi0gICAgLy8gV2UgYXJlIG5v
dCBhbHdheXMgaW52b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0
aW9uIGNhbiBjYXVzZSB1cyB0byBlbnRlcgotICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlk
ZGxlIG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hl
cmUgd2l0aGluIHRoZSB0cmVlLgotICAgIC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2Us
IG9yIGlmIHdlIHNlZSBhIG5ldyByb290IGVsZW1lbnQuCi0gICAgLy8gT3RoZXJ3aXNlIGp1c3Qg
cHVzaCB0aGUgbmV3IHBhcmVudC4KLSAgICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3Rv
ckZpbHRlci5wYXJlbnRTdGFja0lzRW1wdHkoKSkKLSAgICAgICAgbV9zZWxlY3RvckZpbHRlci5z
ZXR1cFBhcmVudFN0YWNrKHBhcmVudCk7Ci0gICAgZWxzZQotICAgICAgICBtX3NlbGVjdG9yRmls
dGVyLnB1c2hQYXJlbnQocGFyZW50KTsKLQotICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBT
aGFkb3dSb290IG5vZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCi0gICAgaWYgKG1fc2NvcGVSZXNv
bHZlcikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJl
bnRPclNoYWRvd0hvc3ROb2RlKCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVu
dEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQotewotICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0
IGludm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVy
aW5nIHN0eWxlIHJlc29sdmUuCi0gICAgLy8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGlu
IHRoaXMgY2FzZS4KLSAgICBpZiAobV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lz
dGVudChwYXJlbnQpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOwotICAg
IGlmIChtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVu
dCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3Qg
U2hhZG93Um9vdCogc2hhZG93Um9vdCkKLXsKLSAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgp
KTsKLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1
c2goc2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCi17
Ci0gICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZl
cikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7Ci19Ci0KLS8vIFRo
aXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0
eWxlcwotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5
bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQotewotICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUo
KSk7Ci0gICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7Ci19Ci0KLVN0
eWxlUmVzb2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKLXsKLSAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xl
YXJEb2N1bWVudCgpOwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBt
X3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOwotI2VuZGlmCi19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxl
UmVzb2x2ZXI+KikKLXsKLSAgICAvLyBMb29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcg
YSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCi0g
ICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24g
Y2F1c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxlKCkKLSAgICAvLyBvciBwcmVz
ZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUg
d2l0aCB0aGUgbGFzdCByZWYgb24gdGhlIG9sZCBvbmUuCi0gICAgVmVjdG9yPHVuc2lnbmVkLCAx
Nj4gdG9SZW1vdmU7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBt
X21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0Nh
Y2hlOjppdGVyYXRvciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7Ci0gICAg
Zm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRp
ZXM+JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKLSAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsr
aSkgewotICAgICAgICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhh
c09uZVJlZigpKSB7Ci0gICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOwot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCi0gICAgICAg
IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1vdmVbaV0pOwotCi0gICAgbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRj
aFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBy
dWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVy
dHlXaGl0ZWxpc3RUeXBlKQotewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdy
b3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hl
ZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5sYXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHls
ZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hU
eXBlID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBw
cm9wZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVu
ZChydWxlKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxl
UHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBw
cm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKLXsKLSAgICBpZiAoIXByb3BlcnR5U2V0KQot
ICAgICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RB
dXRob3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9
IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMo
cmVzdWx0LCBwcm9wZXJ0eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hlYWJsZSkKLSAgICAgICAgcmVz
dWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3Bl
IHsKLXB1YmxpYzoKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotICAgIH5NYXRjaGluZ1VB
UnVsZXNTY29wZSgpOwotCi0gICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKLQot
cHJpdmF0ZToKLSAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKLX07Ci0KLU1hdGNo
aW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgQVNTRVJUKCFt
X21hdGNoaW5nVUFSdWxlcyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwotfQotCi1N
YXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBtX21h
dGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotfQotCi1pbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNT
Y29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotewotICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxl
czsKLX0KLQotYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBm
YWxzZTsKLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBN
YXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAg
QVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKLSAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50
KCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBFbGVtZW50KiBlbGVtZW50
ID0gc3RhdGUuZWxlbWVudCgpOwotICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1l
bnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1
ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7Ci0gICAgaWYgKCFwc2V1ZG9JZC5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOwotICAgICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0Vs
ZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0g
ICAgfQotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIGlmIChlbGVtZW50LT5pc1dlYlZU
VEVsZW1lbnQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
Ci0jZW5kaWYKLSAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBh
cHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgot
ICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCi0gICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dz
IGF1dGhvciBydWxlcwotICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0
eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCi0gICAgVHJlZVNjb3BlKiB0cmVl
U2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKLSAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Nj
b3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi0gICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0
aG9yU3R5bGVzKCkKLSAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1
ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNoUmVx
dWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NC
b3VuZGFyeSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRo
ZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1
ZmZlciBhbmQKLSAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZWxlbWVudC0+
aGFzSUQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgp
KSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0
eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVs
ZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKLSAgICB9Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCi0gICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1Bz
ZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChTZWxl
Y3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQotICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNl
dWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50
LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxS
dWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRj
aFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAgIGlmICghbV9zdGF0ZS5yZWdp
b25Gb3JTdHlsaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBt
YXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25z
dCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGNo
ZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPiht
X3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKLSAgICAgICAgICAgIFJ1bGVT
ZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKLSAgICAgICAgICAgIEFTU0VSVChyZWdp
b25SdWxlcyk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3Qo
cmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0
LnNjb3BlKSwgcnVsZVJhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkK
LXsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0
YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7Ci0gICAgaWYgKG1h
dGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNvcnRNYXRjaGVk
UnVsZXMoKTsKLQotICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xs
ZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRS
dWxlcy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1
bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNl
dCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKLSAg
ICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29t
bW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVu
aXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxl
c1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRj
aGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdo
aXRlbGlzdFR5cGUoKSk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2Nv
cGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxl
cykKLXsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAg
ICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2gg
c2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFj
ayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KLSAgICBpZiAobV9zY29wZVJl
c29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNr
Q29uc2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7Ci0gICAgICAgIGJvb2wgYXBwbHlBdXRo
b3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5
bGVzKCk7Ci0gICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7Ci0gICAgICAgIHVuc2ln
bmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9z
dGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5s
YXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0g
ICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0g
bV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7Ci0gICAgICAgICAgICBkb2N1bWVudFNj
b3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsK
LSAgICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFh
cHBseUF1dGhvclN0eWxlcykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRj
aGVzU3R5bGVCb3VuZHMoZnJhbWUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFt
ZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAg
ICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgp
OwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVz
KHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQs
IGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0g
ICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCi1pbmxpbmUg
Ym9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVz
KCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBh
Z2UqIHIxLCBjb25zdCBTdHlsZVJ1bGVQYWdlKiByMikKIHsKLSNpZiBFTkFCTEUoU0hBRE9XX0RP
TSkKLSAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7Ci0jZWxz
ZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgorICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+
c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwogfQogCi12b2lk
IFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wg
aW5jbHVkZUVtcHR5UnVsZXMpCitib29sIFBhZ2VSdWxlQ29sbGVjdG9yOjppc0xlZnRQYWdlKGlu
dCBwYWdlSW5kZXgpIGNvbnN0CiB7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgQVNTRVJU
KG1fc2NvcGVSZXNvbHZlcik7Ci0KLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxOwotCi0gICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7Ci0g
ICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0
Y2hlZFJ1bGVzKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuOworICAgIGJvb2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICBp
c0ZpcnN0UGFnZUxlZnQgPSB0cnVlOwogCi0gICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1
bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
cmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxl
cywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwotICAgIH0KLSAgICBzb3J0QW5kVHJh
bnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3Vs
dCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgorICAgIHJl
dHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwogfQogCi12
b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwg
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK2Jvb2wgUGFnZVJ1bGVDb2xsZWN0b3I6OmlzRmlyc3RQ
YWdlKGludCBwYWdlSW5kZXgpIGNvbnN0CiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5j
bGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQotICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIC8vIE1hdGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCi0gICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1
ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5h
dXRob3JSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3RvcjxNYXRj
aFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRl
ZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVx
dWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7
ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVs
ZVJhbmdlKTsKLSNlbmRpZgotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3Vs
dCk7Ci0KLSAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVs
ZXMpOworICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBh
Z2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4g
KCFwYWdlSW5kZXgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVXNlclJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCitTdHJpbmcgUGFnZVJ1
bGVDb2xsZWN0b3I6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0CiB7Ci0gICAg
aWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0
VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBNYXRj
aFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy51c2VyUnVs
ZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAg
ICByZXR1cm4gIiI7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNo
UmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQordm9pZCBQYWdlUnVsZUNvbGxlY3Rvcjo6
bWF0Y2hBbGxQYWdlUnVsZXMoaW50IHBhZ2VJbmRleCkKIHsKLSAgICBtX3N0YXRlLm1hdGNoZWRS
dWxlcygpLmNsZWFyKCk7CisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJ
bmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsK
KyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CiAgICAgCi0gICAg
cmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFu
Z2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxl
UmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAg
bWF0Y2hQYWdlUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwg
aXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLnVz
ZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIg
dGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRN
TDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlz
TGVmdCwgaXNGaXJzdCwgcGFnZSk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBN
YXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit2b2lkIFBh
Z2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xl
ZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQogewogICAg
IGlmICghcnVsZXMpCiAgICAgICAgIHJldHVybjsKIAotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUg
Zm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVz
b2x2ZS4KLSAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVyIGZpbHRlciB3b24ndCBiZSB1cC10by1k
YXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBmYXN0IHBhdGguCi0gICAgYm9v
bCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lz
dGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRh
cnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeTsKLQotICAgIHVuc2ln
bmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBz
aXplOyArK2kpIHsKLSAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0
KGkpOwotICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZh
c3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURh
dGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotCi0gICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKLSAg
ICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKLSAg
ICAgICAgUHNldWRvSWQgZHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOwotICAgICAgICBpZiAocnVs
ZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVxdWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywgbWF0
Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBy
dWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9u
LWRlYnVnIG1vZGUuCi0gICAgICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0
aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8
IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxl
cykpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNo
UnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5kYXJkIGdl
dE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5l
ZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVE
YXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgewotICAgICAgICAgICAgICAgIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgd2Un
cmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCi0gICAgICAgICAg
ICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCi0gICAgICAgICAg
ICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVl
c3QoKS5wc2V1ZG9JZCA9PSBOT1BTRVVETykgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5t
b2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgICAg
ICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBm
YWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyA8IEZJUlNUX0lOVEVSTkFMX1BTRVVE
T0lEKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRIYXNQc2V1ZG9TdHls
ZShkeW5hbWljUHNldWRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
Ly8gVXBkYXRlIG91ciBmaXJzdC9sYXN0IHJ1bGUgaW5kaWNlcyBpbiB0aGUgbWF0Y2hlZCBydWxl
cyBhcnJheS4KLSAgICAgICAgICAgICAgICArK3J1bGVSYW5nZS5sYXN0UnVsZUluZGV4OwotICAg
ICAgICAgICAgICAgIGlmIChydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPT0gLTEpCi0gICAgICAg
ICAgICAgICAgICAgIHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVs
ZUluZGV4OwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICAgICAgICAgIG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUo
JnJ1bGVEYXRhKTsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZE1hdGNoUnVsZShjb29raWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBi
b29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikK
LXsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKLSAgICB1
bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKLSAgICByZXR1cm4gKHNw
ZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRp
b24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKLXsKLSAgICBzdGQ6OnNvcnQobV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5iZWdpbigpLCBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmVuZCgpLCBjb21wYXJlUnVs
ZXMpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCi17Ci0gICAgbWF0Y2hVQVJ1bGVz
KHJlc3VsdCk7Ci0KLSAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KLSAgICBp
ZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoVXNlclJ1bGVzKHJl
c3VsdCwgZmFsc2UpOwotCi0gICAgLy8gTm93IGNoZWNrIGF1dGhvciBydWxlcywgYmVnaW5uaW5n
IGZpcnN0IHdpdGggcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcyBtYXBwZWQgZnJvbSBIVE1MLgot
ICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkgewotICAgICAgICBhZGRFbGVtZW50U3R5
bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlv
bkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFs
IG1hcHBlZCBkZWNsYXJhdGlvbnMuCi0gICAgICAgIC8vIFRhYmxlcyBhbmQgdGFibGUgY2VsbHMg
c2hhcmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3QgYmUgYXBwbGllZAotICAg
ICAgICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRl
cGVuZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVzLgotICAgICAgICBhZGRF
bGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFk
ZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICBpZiAobV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgYm9v
bCBpc0F1dG87Ci0gICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0b0hU
TUxFbGVtZW50KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9uYWxpdHlJZmhhc0Rp
ckF1dG9BdHRyaWJ1dGUoaXNBdXRvKTsKLSAgICAgICAgICAgIGlmIChpc0F1dG8pCi0gICAgICAg
ICAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0ZXh0RGlyZWN0aW9uID09IExU
UiA/IGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhv
ciBzaGVldHMgbmV4dC4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAg
ICAgIG1hdGNoQXV0aG9yUnVsZXMocmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sg
b3VyIGlubGluZSBzdHlsZSBhdHRyaWJ1dGUuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpKSB7Ci0gICAgICAgIC8vIElubGluZSBzdHlsZSBpcyBpbW11dGFi
bGUgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVyLgotICAgICAgICAvLyBGSVhN
RTogTWVkaWEgY29udHJvbCBzaGFkb3cgdHJlZXMgc2VlbSB0byBoYXZlIHByb2JsZW1zIHdpdGgg
Y2FjaGluZy4KLSAgICAgICAgYm9vbCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAmJiAhbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBDb25z
dGlmeS4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlv
biBvdmVycmlkZSBzdHlsZS4KLSAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgYWRkRWxlbWVudFN0
eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBp
c0NhY2hlYWJsZSAqLyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlU01JTFByb3Bl
cnRpZXMpOwotI2VuZGlmCi19CisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFn
ZVJ1bGVzOworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxl
cy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAg
aWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CiAKLWJvb2wg
U3R5bGVSZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0
U3RyaW5nJiBjbGFzc05hbWVzKSBjb25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBjbGFzc05hbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX3J1bGVTZXRzLmZlYXR1
cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NOYW1lc1tpXS5pbXBsKCkpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KKyAgICBz
dGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxl
cy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7CiAKLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6
OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQotewotICAgIG1fZWxlbWVudCA9IGU7Ci0g
ICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19j
YXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7Ci0gICAgbV9lbGVtZW50TGlua1N0YXRlID0gZSA/
IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUp
IDogTm90SW5zaWRlTGluazsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBh
Z2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRp
ZXMobWF0Y2hlZFBhZ2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsKIH0KIAotaW5saW5lIHZvaWQg
U3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKK3N0YXRpYyBib29sIGNoZWNr
UGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wg
aXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKIHsK
LSAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkgewotICAgICAgICBtX3N0YXRlLmluaXRF
bGVtZW50KGUpOwotICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRP
bkRvY3VtZW50RWxlbWVudChmYWxzZSk7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRX
cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKKyAgICBmb3IgKGNvbnN0IENT
U1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBj
b21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNo
ID09IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
bG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOworICAgICAgICAg
ICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxp
bmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVu
dCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgY29uc3Qg
UHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclJlZ2lvbiogcmVn
aW9uRm9yU3R5bGluZykKLXsKLSAgICBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHBzZXVkb1N0eWxl
UmVxdWVzdDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOwogCi0g
ICAgaWYgKGUpIHsKLSAgICAgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dChlKTsKLSAg
ICAgICAgbV9wYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5
bGUoKTsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRh
bmNlKCkgPyAwIDoKLSAgICAgICAgICAgIHBhcmVudFN0eWxlID8gcGFyZW50U3R5bGUgOgotICAg
ICAgICAgICAgbV9wYXJlbnROb2RlID8gbV9wYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpIDogMDsK
LSAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBjb250ZXh0Lmluc2VydGlv
blBvaW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICAg
ICAgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOwotICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9J
bnNlcnRpb25Qb2ludCA9IGZhbHNlOwotICAgIH0KLQotICAgIE5vZGUqIGRvY0VsZW1lbnQgPSBl
ID8gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgOiAwOwotICAgIFJlbmRlclN0eWxl
KiBkb2NTdHlsZSA9IGRvY3VtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIG1fcm9vdEVsZW1lbnRT
dHlsZSA9IGRvY0VsZW1lbnQgJiYgZSAhPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVy
U3R5bGUoKSA6IGRvY1N0eWxlOwotCi0gICAgbV9zdHlsZSA9IDA7Ci0gICAgbV9wZW5kaW5nSW1h
Z2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0gICAgbV9mb250RGly
dHkgPSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaFRocmVz
aG9sZCA9IDEwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaExldmVsVGhyZXNo
b2xkID0gMTA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwYXJlbnRFbGVtZW50UHJldmVudHNTaGFy
aW5nKGNvbnN0IEVsZW1lbnQqIHBhcmVudEVsZW1lbnQpCi17Ci0gICAgaWYgKCFwYXJlbnRFbGVt
ZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHBhcmVudEVsZW1lbnQtPmhh
c0ZsYWdzU2V0RHVyaW5nU3R5bGluZ09mQ2hpbGRyZW4oKTsKLX0KLQotTm9kZSogU3R5bGVSZXNv
bHZlcjo6bG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVk
Tm9kZUNvdW50KSBjb25zdAotewotICAgIGlmICh2aXNpdGVkTm9kZUNvdW50ID49IGNTdHlsZVNl
YXJjaFRocmVzaG9sZCAqIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3R5bGVkRWxlbWVudCogcCA9IHN0YXRpY19jYXN0
PFN0eWxlZEVsZW1lbnQqPihwYXJlbnQpOwotICAgIGlmIChwLT5pbmxpbmVTdHlsZSgpKQotICAg
ICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChwLT5pc1NWR0VsZW1lbnQo
KSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4ocCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVy
dGllcygpKQotICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIGlmIChwLT5oYXNJRCgpICYm
IG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHAtPmlkRm9yU3R5bGVS
ZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUgPSBwLT5yZW5kZXJTdHlsZSgpOwotICAgIHVuc2lnbmVkIHN1YmNvdW50
ID0gMDsKLSAgICBOb2RlKiB0aGlzQ291c2luID0gcDsKLSAgICBOb2RlKiBjdXJyZW50Tm9kZSA9
IHAtPnByZXZpb3VzU2libGluZygpOwotCi0gICAgLy8gUmVzZXJ2ZSB0aGUgdHJpZXMgZm9yIHRo
aXMgbGV2ZWwuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMgc3VyZSB0aGF0IHRoZSBhbGdvcml0aG0K
LSAgICAvLyB3aWxsIG5ldmVyIGdvIGRlZXBlciB0aGFuIGNTdHlsZVNlYXJjaExldmVsVGhyZXNo
b2xkIGxldmVscyBpbnRvIHJlY3Vyc2lvbi4KLSAgICB2aXNpdGVkTm9kZUNvdW50ICs9IGNTdHls
ZVNlYXJjaFRocmVzaG9sZDsKLSAgICB3aGlsZSAodGhpc0NvdXNpbikgewotICAgICAgICB3aGls
ZSAoY3VycmVudE5vZGUpIHsKLSAgICAgICAgICAgICsrc3ViY291bnQ7Ci0gICAgICAgICAgICBp
ZiAoY3VycmVudE5vZGUtPnJlbmRlclN0eWxlKCkgPT0gcGFyZW50U3R5bGUgJiYgY3VycmVudE5v
ZGUtPmxhc3RDaGlsZCgpCi0gICAgICAgICAgICAgICAgJiYgY3VycmVudE5vZGUtPmlzRWxlbWVu
dE5vZGUoKSAmJiAhcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyh0b0VsZW1lbnQoY3VycmVu
dE5vZGUpKQotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgICAgICAgICAgICAgICYmICF0b0Vs
ZW1lbnQoY3VycmVudE5vZGUpLT5zaGFkb3coKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgKSB7
Ci0gICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB1bnVzZWQgcmVzZXJ2ZWQgdHJpZXMuCi0g
ICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVDb3VudCAtPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQg
LSBzdWJjb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGUtPmxhc3RDaGls
ZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1YmNvdW50ID49IGNTdHlsZVNl
YXJjaFRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGN1
cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnByZXZpb3VzU2libGluZygpOworICAgICAgICBDU1NT
ZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7
CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2Ug
JiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rv
cjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRv
VHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBj
dXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxlbWVudCgp
LCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnROb2RlOwog
ICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hh
cmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCi17Ci0gICAgaWYg
KCFydWxlU2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOwotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hh
cmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9
IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5k
ZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVs
ZVJhbmdlKTsKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdT
dHlsZSk7Ci0gICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0eSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwogICAg
IHJldHVybiB0cnVlOwogfQogCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRo
Q29udHJvbChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAordm9pZCBQYWdlUnVsZUNvbGxl
Y3Rvcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNo
ZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKIHsKLSAgICBj
b25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRoaXNJ
bnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgpOwotICAgIEhUTUxJbnB1dEVs
ZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpLT50b0lucHV0RWxlbWVu
dCgpOwotCi0gICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFvdGhlcklucHV0RWxlbWVudCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmVsZW1l
bnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkpIHsKLSAgICAgICAg
aWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1
dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShy
ZWFkb25seUF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlm
ICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+
aXNBdXRvZmlsbGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0
RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5zaG91
bGRBcHBlYXJDaGVja2VkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lu
cHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzSW5k
ZXRlcm1pbmF0ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVs
ZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNFbmFibGVkRm9ybUNv
bnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZvcm1Db250cm9sKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0RlZmF1bHRCdXR0b25Gb3JG
b3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5kb2N1bWVudCgpLT5jb250YWluc1Zh
bGlkaXR5U3R5bGVSdWxlcygpKSB7Ci0gICAgICAgIGJvb2wgd2lsbFZhbGlkYXRlID0gZWxlbWVu
dC0+d2lsbFZhbGlkYXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAhPSBzdGF0ZS5l
bGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBT
dHlsZVJ1bGVQYWdlKiBydWxlID0gcnVsZXNbaV07CiAKLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0
ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1l
bnQoKS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+c2Vs
ZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChlbGVtZW50LT5pc0luUmFuZ2UoKSAhPSBzdGF0ZS5l
bGVtZW50KCktPmlzSW5SYW5nZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUg
aXQuCisgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5w
cm9wZXJ0aWVzKCk7CisgICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0Vt
cHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoZWxlbWVudC0+aXNP
dXRPZlJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2UoKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwogICAg
IH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZWxlbWVudEhh
c0RpcmVjdGlvbkF1dG8oRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBs
aW5lIGlzIHN1cnByaXNpbmdseSBob3QsIHdlIG1heSB3aXNoIHRvIGlubGluZSBoYXNEaXJlY3Rp
b25BdXRvIGludG8gU3R5bGVSZXNvbHZlci4KLSAgICByZXR1cm4gZWxlbWVudC0+aXNIVE1MRWxl
bWVudCgpICYmIHRvSFRNTEVsZW1lbnQoZWxlbWVudCktPmhhc0RpcmVjdGlvbkF1dG8oKTsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjpzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVB
ZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqIHNoYXJpbmdDYW5kaWRhdGUpIGNvbnN0
Ci17Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuZWxl
bWVudCgpLT5lbGVtZW50RGF0YSgpID09IHNoYXJpbmdDYW5kaWRhdGUtPmVsZW1lbnREYXRhKCkp
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRB
dHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0
QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSAhPSBzaGFy
aW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgaWYgKCFzdGF0ZS5lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSkg
ewotICAgICAgICBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVz
QWZmZWN0ZWRCeVJ1bGVzKHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXND
bGFzcygpKSB7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLy8gU1ZHIGVsZW1lbnRzIHJlcXVp
cmUgYSAoc2xvdyEpIGdldEF0dHJpYnV0ZSBjb21wYXJpc2lvbiBiZWNhdXNlICJjbGFzcyIgaXMg
YW4gYW5pbWF0YWJsZSBhdHRyaWJ1dGUgZm9yIFNWRy4KLSAgICAgICAgaWYgKHN0YXRlLmVsZW1l
bnQoKS0+aXNTVkdFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCkt
PmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmdldEF0dHJpYnV0
ZShjbGFzc0F0dHIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBl
bHNlIHsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1l
cygpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfSBl
bHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+cHJl
c2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYg
RU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCi0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aGFzVGFn
TmFtZShwcm9ncmVzc1RhZykpIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxQcm9ncmVz
c0VsZW1lbnQqPihzdGF0ZS5lbGVtZW50KCkpLT5pc0RldGVybWluYXRlKCkgIT0gc3RhdGljX2Nh
c3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHNoYXJpbmdDYW5kaWRhdGUpLT5pc0RldGVybWluYXRl
KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aEVsZW1l
bnQoU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5
bGUgPSBlbGVtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0KLSAgICBpZiAoIXN0eWxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYg
KHN0eWxlLT51bmlxdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+
aGFzVW5pcXVlUHNldWRvU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChl
bGVtZW50LT50YWdRTmFtZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+dGFnUU5hbWUoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5pbmxpbmVTdHlsZSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKGVsZW1lbnQtPmlz
U1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihlbGVtZW50KS0+YW5pbWF0
ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgot
ICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmhvdmVyZWQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmhvdmVyZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChl
bGVtZW50LT5hY3RpdmUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmFjdGl2ZSgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmZvY3VzZWQoKSAhPSBzdGF0ZS5lbGVtZW50
KCktPmZvY3VzZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5z
aGFkb3dQc2V1ZG9JZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+c2hhZG93UHNldWRvSWQoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50
KCktPmNzc1RhcmdldCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFzaGFyaW5n
Q2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKGVsZW1lbnQpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmFkZGl0aW9uYWxQcmVzZW50
YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25h
bFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGlmIChlbGVtZW50LT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1
bGVzLmNvbnRhaW5zKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5oYXNTY29wZWRIVE1MU3R5bGVD
aGlsZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IHNoYXJlIHN0eWxlIGZvciBvcHRpb24gYW5kIG9wdGdyb3VwIHdoZW5ldmVyIHBvc3NpYmxlLgot
ICAgIC8vIEJlZm9yZSBkb2luZyBzbywgd2UgbmVlZCB0byByZXNvbHZlIGlzc3VlcyBpbiBIVE1M
U2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zCi0gICAgLy8gYW5kIFJlbmRlck1lbnVMaXN0
OjpzZXRUZXh0LiBTZWUgYWxzbyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODg0MDUKLSAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGVsZW1l
bnQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBib29sIGlzQ29udHJvbCA9IGVsZW1lbnQtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCk7Ci0KLSAg
ICBpZiAoaXNDb250cm9sICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNGb3JtQ29udHJvbEVsZW1lbnQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGlzQ29udHJvbCAmJiAhY2FuU2hh
cmVTdHlsZVdpdGhDb250cm9sKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoc3R5bGUtPnRyYW5zaXRpb25zKCkgfHwgc3R5bGUtPmFuaW1hdGlvbnMoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAg
IC8vIFR1cm4gb2ZmIHN0eWxlIHNoYXJpbmcgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdhaW4gbGF5
ZXJzIGZvciByZWFzb25zIG91dHNpZGUgb2YgdGhlIHN0eWxlIHN5c3RlbS4KLSAgICAvLyBTZWUg
Y29tbWVudHMgaW4gUmVuZGVyT2JqZWN0OjpzZXRTdHlsZSgpLgotICAgIGlmIChlbGVtZW50LT5o
YXNUYWdOYW1lKGlmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwg
ZWxlbWVudC0+aGFzVGFnTmFtZShlbWJlZFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvYmpl
Y3RUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXBwbGV0VGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGNhbnZhc1RhZykKLSNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAg
ICAgICAgLy8gV2l0aCBwcm94eWluZywgdGhlIG1lZGlhIGVsZW1lbnRzIGFyZSBiYWNrZWQgYnkg
YSBSZW5kZXJFbWJlZGRlZE9iamVjdC4KLSAgICAgICAgfHwgZWxlbWVudC0+aGFzVGFnTmFtZSh2
aWRlb1RhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhdWRpb1RhZykKLSNlbmRpZgotICAgICAg
ICApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gICAgaWYgKGVsZW1lbnRIYXNE
aXJlY3Rpb25BdXRvKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAo
ZWxlbWVudC0+aXNMaW5rKCkgJiYgc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpICE9IHN0eWxlLT5p
bnNpZGVMaW5rKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lmIEVOQUJMRShWSURFT19U
UkFDSykKLSAgICAvLyBEZW55IHNoYXJpbmcgc3R5bGVzIGJldHdlZW4gV2ViVlRUIGFuZCBub24t
V2ViVlRUIG5vZGVzLgotICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5p
c1dlYlZUVEVsZW1lbnQoKSAmJiB0b1dlYlZUVEVsZW1lbnQoZWxlbWVudCktPmlzUGFzdE5vZGUo
KSAhPSB0b1dlYlZUVEVsZW1lbnQoc3RhdGUuZWxlbWVudCgpKS0+aXNQYXN0Tm9kZSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkK
LSAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVs
bFNjcmVlbkVsZW1lbnQoKSB8fCBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+
d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUgU3R5bGVkRWxlbWVudCogU3R5
bGVSZXNvbHZlcjo6ZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSogbm9kZSwgdW5zaWdu
ZWQmIGNvdW50KSBjb25zdAotewotICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cHJldmlv
dXNTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoY2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50
KHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKSkpCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgaWYgKGNvdW50KysgPT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50
Kj4obm9kZSk7Ci19Ci0KLVJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWRT
dHlsZSgpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0
eWxlZEVsZW1lbnQoKSB8fCAhc3RhdGUucGFyZW50U3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgaW5saW5lIHN0eWxlIGl0IGlzIHByb2JhYmx5
IHVuaXF1ZS4KLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKQot
ICAgICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChzdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihzdGF0
ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAvLyBJZHMgc3RvcCBzdHlsZSBzaGFyaW5nIGlmIHRo
ZXkgc2hvdyB1cCBpbiB0aGUgc3R5bGVzaGVldHMuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlu
cyhzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmco
c3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3Vt
ZW50KCktPmNzc1RhcmdldCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZWxlbWVudEhh
c0RpcmVjdGlvbkF1dG8oc3RhdGUuZWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICAvLyBDYWNoZSB3aGV0aGVyIHN0YXRlLmVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkgYW55IGtub3du
IGNsYXNzIHNlbGVjdG9ycy4KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1i
ZXIgdmFyaWFibGUuIFRoZSBzdHlsZSBzaGFyaW5nIGNvZGUgY291bGQgYmUgZmFjdG9yZWQgb3V0
IG9mIFN0eWxlUmVzb2x2ZXIuCi0gICAgc3RhdGUuc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1
bGVzKHN0YXRlLmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmhhc0NsYXNzKCkgJiYgY2xh
c3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSkpOwot
Ci0gICAgLy8gQ2hlY2sgcHJldmlvdXMgc2libGluZ3MgYW5kIHRoZWlyIGNvdXNpbnMuCi0gICAg
dW5zaWduZWQgY291bnQgPSAwOwotICAgIHVuc2lnbmVkIHZpc2l0ZWROb2RlQ291bnQgPSAwOwot
ICAgIFN0eWxlZEVsZW1lbnQqIHNoYXJlRWxlbWVudCA9IDA7Ci0gICAgTm9kZSogY291c2luTGlz
dCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUg
KGNvdXNpbkxpc3QpIHsKLSAgICAgICAgc2hhcmVFbGVtZW50ID0gZmluZFNpYmxpbmdGb3JTdHls
ZVNoYXJpbmcoY291c2luTGlzdCwgY291bnQpOwotICAgICAgICBpZiAoc2hhcmVFbGVtZW50KQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNvdXNpbkxpc3QgPSBsb2NhdGVDb3VzaW5MaXN0
KGNvdXNpbkxpc3QtPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7Ci0gICAgfQot
Ci0gICAgLy8gSWYgd2UgaGF2ZSBleGhhdXN0ZWQgYWxsIG91ciBidWRnZXQgb3Igb3VyIGNvdXNp
bnMuCi0gICAgaWYgKCFzaGFyZUVsZW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8g
Q2FuJ3Qgc2hhcmUgaWYgc2libGluZyBydWxlcyBhcHBseS4gVGhpcyBpcyBjaGVja2VkIGF0IHRo
ZSBlbmQgYXMgaXQgc2hvdWxkIHJhcmVseSBmYWlsLgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5k
aWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnNpYmxpbmcoKSkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIC8vIENhbid0IHNoYXJlIGlmIGF0dHJpYnV0ZSBydWxlcyBhcHBseS4KLSAgICBp
ZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy51bmNvbW1v
bkF0dHJpYnV0ZSgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYg
QGhvc3QgQC1ydWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hl
c0hvc3RSdWxlcygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvLyBUcmFja2luZyBjaGlsZCBp
bmRleCByZXF1aXJlcyB1bmlxdWUgc3R5bGUgZm9yIGVhY2ggbm9kZS4gVGhpcyBtYXkgZ2V0IHNl
dCBieSB0aGUgc2libGluZyBydWxlIG1hdGNoIGFib3ZlLgotICAgIGlmIChwYXJlbnRFbGVtZW50
UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkK
LXsKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1h
dGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0Nh
Y2hlYWJsZSA9IGZhbHNlOwotICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21l
ZGl1bS0+bWVkaWFUeXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6
OmRlZmF1bHRTdHlsZTsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNo
ZWV0KTsKLQotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBx
dWlya3MgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2Rl
KCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
ZGVmYXVsdFF1aXJrc1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3Vy
Y2Ugc3R5bGVzIChpbiB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRo
ZW4gd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAg
aWYgKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVz
dWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQotc3Rh
dGljIHZvaWQgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdp
bmF0aW9uTW9kZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIGlmIChwYWdpbmF0aW9uTW9k
ZSA9PSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAK
LSAgICBzd2l0Y2ggKHBhZ2luYXRpb25Nb2RlKSB7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpMZWZ0
VG9SaWdodFBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRh
bENvbHVtbkF4aXMpOwotICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
KCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNv
bHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENv
bHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2
ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFBhZ2luYXRpb246OlJpZ2h0VG9MZWZ0UGFnaW5hdGVkOgotICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAg
IGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8g
UmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6
IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFn
aW5hdGlvbjo6VG9wVG9Cb3R0b21QYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5B
eGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihz
dHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVz
c2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0
aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lv
bik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6Qm90dG9tVG9Ub3BQYWdp
bmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7
Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3Jp
dGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dy
ZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dy
ZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJv
Z3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEZvbnRBbmRH
bHlwaE9yaWVudGF0aW9uKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgRm9udE9yaWVudGF0aW9u
JiBmb250T3JpZW50YXRpb24sIE5vbkNKS0dseXBoT3JpZW50YXRpb24mIGdseXBoT3JpZW50YXRp
b24pCi17Ci0gICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7Ci0gICAg
ICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRp
b24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIHN3aXRjaCAoc3R5bGUtPnRleHRPcmllbnRhdGlvbigpKSB7Ci0gICAg
Y2FzZSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRp
b24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3Jp
ZW50YXRpb25VcHJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAg
ICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25VcHJpZ2h0Owot
ICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5czoKLSAgICAg
ICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpID09IExlZnRUb1JpZ2h0V3JpdGluZ01vZGUpIHsK
LSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBtYXAgdG8gc2lkZXdheXMtbGVmdCwg
d2hpY2ggaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAgICAgICBmb250T3JpZW50YXRpb24g
PSBWZXJ0aWNhbDsKLSAgICAgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9y
aWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVu
dGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJl
dHVybjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzUmlnaHQ6Ci0gICAgICAgIGZv
bnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBO
b25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAg
IGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBmb250T3Jp
ZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pL
R2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19
Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1l
bnQoRG9jdW1lbnQqIGRvY3VtZW50LCBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcikKLXsK
LSAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKLQotICAgIC8vIEhUTUw1IHN0
YXRlcyB0aGF0IHNlYW1sZXNzIGlmcmFtZXMgc2hvdWxkIHJlcGxhY2UgZGVmYXVsdCBDU1MgdmFs
dWVzCi0gICAgLy8gd2l0aCB2YWx1ZXMgaW5oZXJpdGVkIGZyb20gdGhlIGNvbnRhaW5pbmcgaWZy
YW1lIGVsZW1lbnQuIEhvd2V2ZXIsCi0gICAgLy8gc29tZSB2YWx1ZXMgKHN1Y2ggYXMgdGhlIGNh
c2Ugb2YgZGVzaWduTW9kZSA9ICJvbiIpIHN0aWxsIG5lZWQgdG8KLSAgICAvLyBiZSBzZXQgYnkg
dGhpcyAiZG9jdW1lbnQgc3R5bGUiLgotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gZG9jdW1lbnRT
dHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICBib29sIHNlYW1sZXNzV2l0aFBhcmVu
dCA9IGRvY3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKTsKLSAgICBp
ZiAoc2VhbWxlc3NXaXRoUGFyZW50KSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBpZnJhbWVTdHls
ZSA9IGRvY3VtZW50LT5zZWFtbGVzc1BhcmVudElGcmFtZSgpLT5yZW5kZXJTdHlsZSgpOwotICAg
ICAgICBpZiAoaWZyYW1lU3R5bGUpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5pbmhlcml0
RnJvbShpZnJhbWVTdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFy
IHdoaWNoIHZhbHVlcyBiZWxvdyB3ZSB3YW50IHRvIG92ZXJyaWRlIGluIHRoZSBzZWFtbGVzcyBj
YXNlIQotICAgIGRvY3VtZW50U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgIGlmICghc2Vh
bWxlc3NXaXRoUGFyZW50KSB7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFJUTE9yZGVyaW5n
KGRvY3VtZW50LT52aXN1YWxseU9yZGVyZWQoKSA/IFZpc3VhbE9yZGVyIDogTG9naWNhbE9yZGVy
KTsKLSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Wm9vbShmcmFtZSAmJiAhZG9jdW1lbnQtPnBy
aW50aW5nKCkgPyBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKSA6IDEpOwotICAgICAgICBkb2N1bWVu
dFN0eWxlLT5zZXRQYWdlU2NhbGVUcmFuc2Zvcm0oZnJhbWUgPyBmcmFtZS0+ZnJhbWVTY2FsZUZh
Y3RvcigpIDogMSk7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldExvY2FsZShkb2N1bWVudC0+
Y29udGVudExhbmd1YWdlKCkpOwotICAgIH0KLSAgICAvLyBUaGlzIG92ZXJyaWRlcyBhbnkgLXdl
YmtpdC11c2VyLW1vZGlmeSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGlmcmFtZS4KLSAgICBk
b2N1bWVudFN0eWxlLT5zZXRVc2VyTW9kaWZ5KGRvY3VtZW50LT5pbkRlc2lnbk1vZGUoKSA/IFJF
QURfV1JJVEUgOiBSRUFEX09OTFkpOwotCi0gICAgRWxlbWVudCogZG9jRWxlbWVudCA9IGRvY3Vt
ZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKLSAgICBSZW5kZXJPYmplY3QqIGRvY0VsZW1lbnRSZW5k
ZXJlciA9IGRvY0VsZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJlcigpIDogMDsKLSAgICBpZiAo
ZG9jRWxlbWVudFJlbmRlcmVyKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGlyZWN0aW9uIGFuZCB3
cml0aW5nLW1vZGUgb2YgdGhlIGJvZHkgdG8gc2V0IHRoZQotICAgICAgICAvLyB2aWV3cG9ydCdz
IGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIHVubGVzcyB0aGUgcHJvcGVydHkgaXMgc2V0IG9u
IHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBib2R5LCB0
aGVuIHVzZSB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBib2R5
UmVuZGVyZXIgPSBkb2N1bWVudC0+Ym9keSgpID8gZG9jdW1lbnQtPmJvZHkoKS0+cmVuZGVyZXIo
KSA6IDA7Ci0gICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT53cml0aW5nTW9k
ZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRX
cml0aW5nTW9kZShib2R5UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShkb2NFbGVt
ZW50UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoYm9keVJl
bmRlcmVyICYmICFkb2N1bWVudC0+ZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAg
ICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihib2R5UmVuZGVyZXItPnN0eWxl
KCktPmRpcmVjdGlvbigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnRTdHls
ZS0+c2V0RGlyZWN0aW9uKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkp
OwotICAgIH0KLQotICAgIGlmIChmcmFtZSkgewotICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBmcmFtZS0+dmlldygpKSB7Ci0gICAgICAgICAgICBjb25zdCBQYWdpbmF0aW9uJiBw
YWdpbmF0aW9uID0gZnJhbWVWaWV3LT5wYWdpbmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFn
aW5hdGlvbi5tb2RlICE9IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAg
ICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUocGFnaW5hdGlvbi5tb2RlLCBkb2N1bWVudFN0
eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRDb2x1bW5HYXAo
cGFnaW5hdGlvbi5nYXApOwotICAgICAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3KiB2aWV3ID0g
ZG9jdW1lbnQtPnJlbmRlclZpZXcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmlldy0+
aGFzQ29sdW1ucygpKQotICAgICAgICAgICAgICAgICAgICAgICAgdmlldy0+dXBkYXRlQ29sdW1u
SW5mb0Zyb21TdHlsZShkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTZWFtbGVzcyBpZnJhbWVz
IHdhbnQgdG8gaW5oZXJpdCB0aGVpciBmb250IGZyb20gdGhlaXIgcGFyZW50IGlmcmFtZSwgc28g
ZWFybHkgcmV0dXJuIGJlZm9yZSBzZXR0aW5nIHRoZSBmb250LgotICAgIGlmIChzZWFtbGVzc1dp
dGhQYXJlbnQpCi0gICAgICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKLQotICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9uLnNl
dFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKGRvY3VtZW50U3R5bGUt
PmxvY2FsZSgpKSk7Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0
aW5ncygpKSB7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1
bWVudC0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFi
bGVkKCkpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5n
cy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3Rh
bmRhcmRGb250ID0gc2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseShmb250RGVzY3JpcHRpb24u
c2NyaXB0KCkpOwotICAgICAgICBpZiAoIXN0YW5kYXJkRm9udC5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6
U3RhbmRhcmRGYW1pbHkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5
KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
Zmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxs
ICsgMSk7Ci0gICAgICAgIGludCBzaXplID0gU3R5bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3
b3JkKGRvY3VtZW50LCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpOwotICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAgICAgICAgYm9vbCB1c2VTVkdab29tUnVs
ZXMgPSBkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpOwotICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0Q29tcHV0ZWRTaXplKFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZp
ZWRTaXplKGRvY3VtZW50LCBkb2N1bWVudFN0eWxlLmdldCgpLCBmb250RGVzY3JpcHRpb24uaXNB
YnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKSk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmco
KSk7Ci0KLSAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOwotICAgIE5vbkNKS0ds
eXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKLSAgICBnZXRGb250QW5kR2x5cGhPcmll
bnRhdGlvbihkb2N1bWVudFN0eWxlLmdldCgpLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50
YXRpb24pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRp
b24pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBo
T3JpZW50YXRpb24pOwotCi0gICAgZG9jdW1lbnRTdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7Ci0gICAgZG9jdW1lbnRTdHlsZS0+Zm9udCgpLnVwZGF0ZShmb250U2Vs
ZWN0b3IpOwotCi0gICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotfQotCi1zdGF0
aWMgaW5saW5lIGJvb2wgaXNBdFNoYWRvd0JvdW5kYXJ5KGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQp
Ci17Ci0gICAgaWYgKCFlbGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ29udGFp
bmVyTm9kZSogcGFyZW50Tm9kZSA9IGVsZW1lbnQtPnBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4g
cGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLT5pc1NoYWRvd1Jvb3QoKTsKLX0KLQotUGFzc1JlZlB0
cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGVs
ZW1lbnQsIFJlbmRlclN0eWxlKiBkZWZhdWx0UGFyZW50LAotICAgIFN0eWxlU2hhcmluZ0JlaGF2
aW9yIHNoYXJpbmdCZWhhdmlvciwgUnVsZU1hdGNoaW5nQmVoYXZpb3IgbWF0Y2hpbmdCZWhhdmlv
ciwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQotewotICAgIC8vIE9uY2UgYW4gZWxl
bWVudCBoYXMgYSByZW5kZXJlciwgd2UgZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgaXQsIHNpbmNlIG90
aGVyd2lzZSB0aGUgcmVuZGVyZXIKLSAgICAvLyB3aWxsIHZhbmlzaCBpZiBhIHN0eWxlIHJlY2Fs
YyBoYXBwZW5zIGR1cmluZyBsb2FkaW5nLgotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxs
b3dTdHlsZVNoYXJpbmcgJiYgIWVsZW1lbnQtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xv
YWRlZCgpICYmICFlbGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICghc19zdHlsZU5v
dFlldEF2YWlsYWJsZSkgewotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZSA9IFJl
bmRlclN0eWxlOjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0
QXZhaWxhYmxlLT5zZXREaXNwbGF5KE5PTkUpOwotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2
YWlsYWJsZS0+Zm9udCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAg
ICAgZWxlbWVudC0+ZG9jdW1lbnQoKS0+c2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgp
OwotICAgICAgICByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKLSAgICB9Ci0KLSAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0
YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVu
dCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOwotICAgIGlmIChzaGFyaW5nQmVoYXZpb3Ig
PT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2lu
dCgpKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJlZFN0
eWxlKCk7Ci0gICAgICAgIGlmIChzaGFyZWRTdHlsZSkKLSAgICAgICAgICAgIHJldHVybiBzaGFy
ZWRTdHlsZTsKLSAgICB9Ci0KLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNsb25lRm9yUGFyZW50
OwotCi0gICAgaWYgKHN0YXRlLnBhcmVudFN0eWxlKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5
bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJp
dEZyb20oc3RhdGUucGFyZW50U3R5bGUoKSwgaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpID8g
UmVuZGVyU3R5bGU6OkF0U2hhZG93Qm91bmRhcnkgOiBSZW5kZXJTdHlsZTo6Tm90QXRTaGFkb3dC
b3VuZGFyeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoZGVmYXVsdFN0
eWxlRm9yRWxlbWVudCgpKTsKLSAgICAgICAgY2xvbmVGb3JQYXJlbnQgPSBSZW5kZXJTdHlsZTo6
Y2xvbmUoc3RhdGUuc3R5bGUoKSk7Ci0gICAgICAgIHN0YXRlLnNldFBhcmVudFN0eWxlKGNsb25l
Rm9yUGFyZW50LmdldCgpKTsKLSAgICB9Ci0gICAgLy8gY29udGVudGVkaXRhYmxlIGF0dHJpYnV0
ZSAoaW1wbGVtZW50ZWQgYnkgLXdlYmtpdC11c2VyLW1vZGlmeSkgc2hvdWxkCi0gICAgLy8gYmUg
cHJvcGFnYXRlZCBmcm9tIHNoYWRvdyBob3N0IHRvIGRpc3RyaWJ1dGVkIG5vZGUuCi0gICAgaWYg
KHN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIGlmIChFbGVt
ZW50KiBwYXJlbnQgPSBlbGVtZW50LT5wYXJlbnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlm
IChSZW5kZXJTdHlsZSogc3R5bGVPZlNoYWRvd0hvc3QgPSBwYXJlbnQtPnJlbmRlclN0eWxlKCkp
Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlck1vZGlmeShzdHlsZU9mU2hh
ZG93SG9zdC0+dXNlck1vZGlmeSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbGVt
ZW50LT5pc0xpbmsoKSkgewotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJc0xpbmsodHJ1ZSk7
Ci0gICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0ZSA9IHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUo
KTsKLSAgICAgICAgaWYgKGxpbmtTdGF0ZSAhPSBOb3RJbnNpZGVMaW5rKSB7Ci0gICAgICAgICAg
ICBib29sIGZvcmNlVmlzaXRlZCA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6Zm9yY2VQc2V1
ZG9TdGF0ZShlbGVtZW50LCBDU1NTZWxlY3Rvcjo6UHNldWRvVmlzaXRlZCk7Ci0gICAgICAgICAg
ICBpZiAoZm9yY2VWaXNpdGVkKQotICAgICAgICAgICAgICAgIGxpbmtTdGF0ZSA9IEluc2lkZVZp
c2l0ZWRMaW5rOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxp
bmsobGlua1N0YXRlKTsKLSAgICB9Ci0KLSAgICBib29sIG5lZWRzQ29sbGVjdGlvbiA9IGZhbHNl
OwotICAgIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZW5zdXJlRGVmYXVsdFN0eWxlU2hlZXRzRm9y
RWxlbWVudChlbGVtZW50LCBuZWVkc0NvbGxlY3Rpb24pOwotICAgIGlmIChuZWVkc0NvbGxlY3Rp
b24pCi0gICAgICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50KCktPmlzVmll
d1NvdXJjZSgpLCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwotCi0gICAgTWF0Y2hSZXN1bHQgbWF0
Y2hSZXN1bHQ7Ci0gICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50
UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0gICAgZWxzZQotICAg
ICAgICBtYXRjaEFsbFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNo
QWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0
Y2hSZXN1bHQsIGVsZW1lbnQpOwotCi0gICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdz
IGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCi0gICAg
YWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxl
bWVudCk7Ci0KLSAgICBzdGF0ZS5jbGVhcigpOyAvLyBDbGVhciBvdXQgZm9yIHRoZSBuZXh0IHJl
c29sdmUuCi0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAg
ICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yS2V5
ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgY29uc3QgU3R5bGVLZXlmcmFt
ZSoga2V5ZnJhbWUsIEtleWZyYW1lVmFsdWUmIGtleWZyYW1lVmFsdWUpCi17Ci0gICAgTWF0Y2hS
ZXN1bHQgcmVzdWx0OwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBh
ZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwotCi0g
ICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLQotICAgIC8vIENyZWF0ZSB0aGUgc3R5bGUKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJT
dHlsZTo6Y2xvbmUoZWxlbWVudFN0eWxlKSk7Ci0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVl
KDApOwotCi0gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgd2l0aCAhaW1wb3J0YW50LiBT
aW5jZSB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lCi0gICAgLy8gZGVjbCwgdGhlcmUncyBub3RoaW5n
IHRvIG92ZXJyaWRlLiBTbyBqdXN0IGFkZCB0aGUgZmlyc3QgcHJvcGVydGllcy4KLSAgICBib29s
IGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkK
LSAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihy
ZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5o
ZXJpdGVkT25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQg
YW5kIHVwZGF0ZSBpdCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWln
aHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplCi0g
ICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENT
U1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgLy8g
Tm93IGRvIHJlc3Qgb2YgdGhlIHByb3BlcnRpZXMuCi0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0
aWVzKCkpCi0gICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0
aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCBieSBv
bmUgb2YgdGhlIG5vbi1lc3NlbnRpYWwgZm9udCBwcm9wcywKLSAgICAvLyBnbyBhaGVhZCBhbmQg
dXBkYXRlIGl0IGEgc2Vjb25kIHRpbWUuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gU3Rh
cnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQ
ZW5kaW5nUmVzb3VyY2VzKCk7Ci0gICAgCi0gICAgLy8gQWRkIGFsbCB0aGUgYW5pbWF0aW5nIHBy
b3BlcnRpZXMgdG8gdGhlIGtleWZyYW1lLgotICAgIGlmIChjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBzdHlsZURlY2xhcmF0aW9uID0ga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkgewotICAgICAgICB1
bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlDb3VudCgp
OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7
Ci0gICAgICAgICAgICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0gc3R5bGVEZWNsYXJhdGlvbi0+
cHJvcGVydHlBdChpKS5pZCgpOwotICAgICAgICAgICAgLy8gVGltaW5nLWZ1bmN0aW9uIHdpdGhp
biBrZXlmcmFtZXMgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBub3QgYW5pbWF0ZWQ7IGl0IGp1
c3QKLSAgICAgICAgICAgIC8vIGRlc2NyaWJlcyB0aGUgdGltaW5nIGZ1bmN0aW9uIGJldHdlZW4g
dGhpcyBrZXlmcmFtZSBhbmQgdGhlIG5leHQuCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0g
Q1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbikKLSAgICAgICAgICAgICAg
ICBrZXlmcmFtZVZhbHVlLmFkZFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIHJldHVy
biBzdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjprZXlmcmFtZVN0
eWxlc0ZvckFuaW1hdGlvbihFbGVtZW50KiBlLCBjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0
eWxlLCBLZXlmcmFtZUxpc3QmIGxpc3QpCi17Ci0gICAgbGlzdC5jbGVhcigpOwotCi0gICAgLy8g
R2V0IHRoZSBrZXlmcmFtZXNSdWxlIGZvciB0aGlzIG5hbWUKLSAgICBpZiAoIWUgfHwgbGlzdC5h
bmltYXRpb25OYW1lKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2tleWZy
YW1lc1J1bGVNYXAuY2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgS2V5ZnJhbWVzUnVsZU1hcDo6
aXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lc1J1bGVNYXAuZmluZChsaXN0LmFuaW1hdGlvbk5hbWUo
KS5pbXBsKCkpOwotICAgIGlmIChpdCA9PSBtX2tleWZyYW1lc1J1bGVNYXAuZW5kKCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGNvbnN0IFN0eWxlUnVsZUtleWZyYW1lcyoga2V5ZnJhbWVzUnVs
ZSA9IGl0LT52YWx1ZS5nZXQoKTsKLQotICAgIC8vIENvbnN0cnVjdCBhbmQgcG9wdWxhdGUgdGhl
IHN0eWxlIGZvciBlYWNoIGtleWZyYW1lCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZUtl
eWZyYW1lPiA+JiBrZXlmcmFtZXMgPSBrZXlmcmFtZXNSdWxlLT5rZXlmcmFtZXMoKTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5ZnJhbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
IC8vIEFwcGx5IHRoZSBkZWNsYXJhdGlvbiB0byB0aGUgc3R5bGUuIFRoaXMgaXMgYSBzaW1wbGlm
aWVkIHZlcnNpb24gb2YgdGhlIGxvZ2ljIGluIHN0eWxlRm9yRWxlbWVudAotICAgICAgICBpbml0
RWxlbWVudChlKTsKLSAgICAgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50
KCksIGUpOwotCi0gICAgICAgIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lID0ga2V5ZnJh
bWVzW2ldLmdldCgpOwotCi0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAw
KTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1l
bnRTdHlsZSwga2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLQotICAgICAgICAvLyBBZGQgdGhp
cyBrZXlmcmFtZSBzdHlsZSB0byBhbGwgdGhlIGluZGljYXRlZCBrZXkgdGltZXMKLSAgICAgICAg
VmVjdG9yPGZsb2F0PiBrZXlzOwotICAgICAgICBrZXlmcmFtZS0+Z2V0S2V5cyhrZXlzKTsKLSAg
ICAgICAgZm9yIChzaXplX3Qga2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMuc2l6ZSgpOyAr
K2tleUluZGV4KSB7Ci0gICAgICAgICAgICBrZXlmcmFtZVZhbHVlLnNldEtleShrZXlzW2tleUlu
ZGV4XSk7Ci0gICAgICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIElmIHRoZSAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUg
aXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKLSAg
ICBpbnQgaW5pdGlhbExpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgaWYgKGluaXRpYWxMaXN0
U2l6ZSA+IDAgJiYgbGlzdFswXS5rZXkoKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFt
ZSogemVyb1BlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCF6ZXJvUGVyY2VudEtleWZyYW1l
KSB7Ci0gICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3Jl
YXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZS0+c2V0S2V5
VGV4dCgiMCUiKTsKLSAgICAgICAgfQotICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFs
dWUoMCwgMCk7Ci0gICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFt
ZShlbGVtZW50U3R5bGUsIHplcm9QZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLSAg
ICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhl
IDEwMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBp
cyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCi0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+
IDAgJiYgKGxpc3RbbGlzdC5zaXplKCkgLSAxXS5rZXkoKSAhPSAxKSkgewotICAgICAgICBzdGF0
aWMgU3R5bGVLZXlmcmFtZSogaHVuZHJlZFBlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCFo
dW5kcmVkUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZy
YW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgaHVu
ZHJlZFBlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMTAwJSIpOwotICAgICAgICB9Ci0gICAg
ICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgxLCAwKTsKLSAgICAgICAga2V5ZnJhbWVW
YWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgaHVuZHJlZFBlcmNl
bnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFt
ZVZhbHVlKTsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2
ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlLCBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewot
ICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7Ci0gICAgaWYgKCFlKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLQot
ICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUs
IHBzZXVkb1N0eWxlUmVxdWVzdCk7Ci0gICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpKTsKLSAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnBhcmVudFN0
eWxlKCkpOwotCi0gICAgLy8gU2luY2Ugd2UgZG9uJ3QgdXNlIHBzZXVkby1lbGVtZW50cyBpbiBh
bnkgb2Ygb3VyIHF1aXJrL3ByaW50IHVzZXIgYWdlbnQgcnVsZXMsIGRvbid0IHdhc3RlIHRpbWUg
d2Fsa2luZwotICAgIC8vIHRob3NlIHJ1bGVzLgotCi0gICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5k
IGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVB
UnVsZXMobWF0Y2hSZXN1bHQpOwotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
KSB7Ci0gICAgICAgIG1hdGNoVXNlclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAg
IG1hdGNoQXV0aG9yUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAo
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHN0YXRlLnN0eWxlKCktPnNldFN0eWxlVHlwZShwc2V1ZG9TdHlsZVJlcXVlc3Qu
cHNldWRvSWQpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZSk7
Ci0KLSAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBk
ZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJTdHlsZShz
dGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnBhcmVudFN0eWxlKCksIDApOwotCi0gICAgLy8gU3RhcnQg
bG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5k
aW5nUmVzb3VyY2VzKCk7Ci0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVy
KCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFr
ZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0
eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQotewotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVz
b2x2ZShkb2N1bWVudCgpLCBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSk7IC8vIG1fcm9v
dEVsZW1lbnRTdHlsZSB3aWxsIGJlIHNldCB0byB0aGUgZG9jdW1lbnQgc3R5bGUuCi0KLSAgICBt
X3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgbV9zdGF0ZS5zdHls
ZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICBjb25z
dCBib29sIGlzTGVmdCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlz
Rmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0g
cGFnZU5hbWUocGFnZUluZGV4KTsKLSAgICAKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAg
bWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmlu
dFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3Vs
dCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAv
LyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVz
LCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCi0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1
bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbV9zdGF0
ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7
Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxW
YXJpYWJsZURlZmluaXRpb25zPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0jZW5kaWYKLSAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAg
IC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4K
LSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBh
cmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUuCi0gICAgaWYgKG1fc3RhdGUubGlu
ZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVp
Z2h0LCBtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBTdGFy
dCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBl
bmRpbmdSZXNvdXJjZXMoKTsKLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2
ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBtX3N0YXRl
LnRha2VTdHlsZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkKLXsKLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRl
clN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgLy8gTWFrZSBzdXJlIG91ciBmb250cyBhcmUgaW5pdGlh
bGl6ZWQgaWYgd2UgZG9uJ3QgaW5oZXJpdCB0aGVtIGZyb20gb3VyIHBhcmVudCBzdHlsZS4KLSAg
ICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpKSB7Ci0gICAgICAg
IGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOwotICAgICAgICBtX3N0YXRlLnN0eWxlKCkt
PmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKCkpOwotICAgIH0gZWxzZQotICAgICAgICBtX3N0
YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoMCk7Ci0KLSAgICByZXR1cm4gbV9zdGF0ZS50YWtl
U3R5bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5
bGVGb3JUZXh0KFRleHQqIHRleHROb2RlKQotewotICAgIEFTU0VSVCh0ZXh0Tm9kZSk7Ci0KLSAg
ICBOb2RlUmVuZGVyaW5nQ29udGV4dCBjb250ZXh0KHRleHROb2RlKTsKLSAgICBOb2RlKiBwYXJl
bnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICBy
ZXR1cm4gY29udGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSB8fCAhcGFyZW50Tm9kZSA/Ci0g
ICAgICAgIGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSA6IHBhcmVudE5vZGUtPnJlbmRlclN0eWxl
KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqIHN0
eWxlKQotewotICAgIC8vIEludHJpbnNpYyBtYXJnaW4gdmFsdWUuCi0gICAgY29uc3QgaW50IGlu
dHJpbnNpY01hcmdpbiA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gRklY
TUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1p
bi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgotICAgIC8vIEZJWE1FOiBVc2luZyAicXVpcmsi
IHRvIGRlY2lkZSB0aGUgbWFyZ2luIHdhc24ndCBzZXQgaXMga2luZCBvZiBsYW1lLgotICAgIGlm
IChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChzdHls
ZS0+bWFyZ2luTGVmdCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVm
dChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1h
cmdpblJpZ2h0KCkucXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChM
ZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChzdHlsZS0+
aGVpZ2h0KCkuaXNBdXRvKCkpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Ub3AoKS5xdWly
aygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgoaW50cmluc2ljTWFy
Z2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkp
Ci0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChpbnRyaW5zaWNNYXJn
aW4sIEZpeGVkKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgRURpc3BsYXkgZXF1aXZhbGVudEJsb2Nr
RGlzcGxheShFRGlzcGxheSBkaXNwbGF5LCBib29sIGlzRmxvYXRpbmcsIGJvb2wgc3RyaWN0UGFy
c2luZykKLXsKLSAgICBzd2l0Y2ggKGRpc3BsYXkpIHsKLSAgICBjYXNlIEJMT0NLOgotICAgIGNh
c2UgVEFCTEU6Ci0gICAgY2FzZSBCT1g6Ci0gICAgY2FzZSBGTEVYOgotICAgIGNhc2UgR1JJRDoK
LSAgICAgICAgcmV0dXJuIGRpc3BsYXk7Ci0KLSAgICBjYXNlIExJU1RfSVRFTToKLSAgICAgICAg
Ly8gSXQgaXMgYSBXaW5JRSBidWcgdGhhdCBmbG9hdGVkIGxpc3QgaXRlbXMgbG9zZSB0aGVpciBi
dWxsZXRzLCBzbyB3ZSdsbCBlbXVsYXRlIHRoZSBxdWlyaywgYnV0IG9ubHkgaW4gcXVpcmtzIG1v
ZGUuCi0gICAgICAgIGlmICghc3RyaWN0UGFyc2luZyAmJiBpc0Zsb2F0aW5nKQotICAgICAgICAg
ICAgcmV0dXJuIEJMT0NLOwotICAgICAgICByZXR1cm4gZGlzcGxheTsKLSAgICBjYXNlIElOTElO
RV9UQUJMRToKLSAgICAgICAgcmV0dXJuIFRBQkxFOwotICAgIGNhc2UgSU5MSU5FX0JPWDoKLSAg
ICAgICAgcmV0dXJuIEJPWDsKLSAgICBjYXNlIElOTElORV9GTEVYOgotICAgICAgICByZXR1cm4g
RkxFWDsKLSAgICBjYXNlIElOTElORV9HUklEOgotICAgICAgICByZXR1cm4gR1JJRDsKLQotICAg
IGNhc2UgSU5MSU5FOgotICAgIGNhc2UgUlVOX0lOOgotICAgIGNhc2UgQ09NUEFDVDoKLSAgICBj
YXNlIElOTElORV9CTE9DSzoKLSAgICBjYXNlIFRBQkxFX1JPV19HUk9VUDoKLSAgICBjYXNlIFRB
QkxFX0hFQURFUl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoKLSAgICBjYXNl
IFRBQkxFX1JPVzoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICBjYXNlIFRBQkxF
X0NPTFVNTjoKLSAgICBjYXNlIFRBQkxFX0NFTEw6Ci0gICAgY2FzZSBUQUJMRV9DQVBUSU9OOgot
ICAgICAgICByZXR1cm4gQkxPQ0s7Ci0gICAgY2FzZSBOT05FOgotICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIE5PTkU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgIHJldHVybiBCTE9DSzsKLX0KLQotLy8gQ1NTIHJlcXVpcmVzIHRleHQt
ZGVjb3JhdGlvbiB0byBiZSByZXNldCBhdCBlYWNoIERPTSBlbGVtZW50IGZvciB0YWJsZXMsIAot
Ly8gaW5saW5lIGJsb2NrcywgaW5saW5lIHRhYmxlcywgcnVuLWlucywgc2hhZG93IERPTSBjcm9z
c2luZ3MsIGZsb2F0aW5nIGVsZW1lbnRzLAotLy8gYW5kIGFic29sdXRlIG9yIHJlbGF0aXZlbHkg
cG9zaXRpb25lZCBlbGVtZW50cy4KLXN0YXRpYyBib29sIGRvZXNOb3RJbmhlcml0VGV4dERlY29y
YXRpb24oUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKQotewotICAgIHJldHVybiBzdHls
ZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxF
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gUlVOX0lOCi0gICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gSU5MSU5FX0JMT0NLIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCB8fCBp
c0F0U2hhZG93Qm91bmRhcnkoZSkKLSAgICAgICAgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCBz
dHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKTsKLX0KLQotc3RhdGljIGJvb2wgaXNEaXNwbGF5
RmxleGlibGVCb3goRURpc3BsYXkgZGlzcGxheSkKLXsKLSAgICByZXR1cm4gZGlzcGxheSA9PSBG
TEVYIHx8IGRpc3BsYXkgPT0gSU5MSU5FX0ZMRVg7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
YWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUsIEVsZW1lbnQgKmUpCi17Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKLQotICAgIC8v
IENhY2hlIG91ciBvcmlnaW5hbCBkaXNwbGF5LgotICAgIHN0eWxlLT5zZXRPcmlnaW5hbERpc3Bs
YXkoc3R5bGUtPmRpc3BsYXkoKSk7Ci0KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05F
KSB7Ci0gICAgICAgIC8vIElmIHdlIGhhdmUgYSA8dGQ+IHRoYXQgc3BlY2lmaWVzIGEgZmxvYXQg
cHJvcGVydHksIGluIHF1aXJrcyBtb2RlIHdlIGp1c3QgZHJvcCB0aGUgZmxvYXQKLSAgICAgICAg
Ly8gcHJvcGVydHkuCi0gICAgICAgIC8vIFNpdGVzIGFsc28gY29tbW9ubHkgdXNlIGRpc3BsYXk6
aW5saW5lL2Jsb2NrIG9uIDx0ZD5zIGFuZCA8dGFibGU+cy4gSW4gcXVpcmtzIG1vZGUgd2UgZm9y
Y2UKLSAgICAgICAgLy8gdGhlc2UgdGFncyB0byByZXRhaW4gdGhlaXIgZGlzcGxheSB0eXBlcy4K
LSAgICAgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpICYmIGUpIHsKLSAgICAgICAg
ICAgIGlmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSkgewotICAgICAgICAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KFRBQkxFX0NFTEwpOwotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGlu
ZyhOb0Zsb2F0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS0+aGFzVGFnTmFtZSh0YWJsZVRh
ZykpCi0gICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoc3R5bGUtPmlzRGlzcGxheUlu
bGluZVR5cGUoKSA/IElOTElORV9UQUJMRSA6IFRBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChlICYmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBlLT5oYXNUYWdOYW1lKHRoVGFnKSkp
IHsKLSAgICAgICAgICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1MX05PV1JBUCkg
ewotICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxseSBub3dyYXBw
aW5nIG9yIGlmIHdlIHNob3VsZCBqdXN0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIG5vcm1hbCBp
bnN0ZWFkLiBJZiB0aGUgd2lkdGggb2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAg
ICAgICAgICAvLyB3ZSBkb24ndCBhY3R1YWxseSB1c2UgTk9XUkFQLgotICAgICAgICAgICAgICAg
IGlmIChzdHlsZS0+d2lkdGgoKS5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHN0eWxl
LT5zZXRXaGl0ZVNwYWNlKE5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVApOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGFibGVzIG5ldmVyIHN1cHBvcnQgdGhlIC13ZWJraXQt
KiB2YWx1ZXMgZm9yIHRleHQtYWxpZ24gYW5kIHdpbGwgcmVzZXQgYmFjayB0byB0aGUgZGVmYXVs
dC4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykgJiYgKHN0eWxlLT50
ZXh0QWxpZ24oKSA9PSBXRUJLSVRfTEVGVCB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lU
X0NFTlRFUiB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAgICAg
ICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oVEFTVEFSVCk7Ci0KLSAgICAgICAgLy8gRnJhbWVzIGFu
ZCBmcmFtZXNldHMgbmV2ZXIgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246YWJz
b2x1dGUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCi0gICAgICAgIC8vIGZpeCBhIGNyYXNoIHdoZXJl
IGEgc2l0ZSB0cmllcyB0byBwb3NpdGlvbiB0aGVzZSBvYmplY3RzLiBUaGV5IGFsc28gbmV2ZXIg
aG9ub3IgZGlzcGxheS4KLSAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUoZnJhbWVUYWcp
IHx8IGUtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNl
dFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5
KEJMT0NLKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1YnkgdGV4dCBkb2VzIG5vdCBzdXBw
b3J0IGZsb2F0IG9yIHBvc2l0aW9uLiBUaGlzIG1pZ2h0IGNoYW5nZSB3aXRoIGV2b2x1dGlvbiBv
ZiB0aGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShydFRh
ZykpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0g
ICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIG92ZXJyaWRpbmcgc3RhcnQvLXdlYmtpdC1h
dXRvIGxpa2UgdGhpcy4gRG8gaXQgaW4gaHRtbC5jc3MgaW5zdGVhZC4KLSAgICAgICAgLy8gVGFi
bGUgaGVhZGVycyB3aXRoIGEgdGV4dC1hbGlnbiBvZiAtd2Via2l0LWF1dG8gd2lsbCBjaGFuZ2Ug
dGhlIHRleHQtYWxpZ24gdG8gY2VudGVyLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1l
KHRoVGFnKSAmJiBzdHlsZS0+dGV4dEFsaWduKCkgPT0gVEFTVEFSVCkKLSAgICAgICAgICAgIHN0
eWxlLT5zZXRUZXh0QWxpZ24oQ0VOVEVSKTsKLQotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdO
YW1lKGxlZ2VuZFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0K
LSAgICAgICAgLy8gQWJzb2x1dGUvZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywgZmxvYXRpbmcg
ZWxlbWVudHMgYW5kIHRoZSBkb2N1bWVudCBlbGVtZW50IG5lZWQgYmxvY2stbGlrZSBvdXRzaWRl
IGRpc3BsYXkuCi0gICAgICAgIGlmIChzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSB8fCBz
dHlsZS0+aXNGbG9hdGluZygpIHx8IChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVu
dCgpID09IGUpKQotICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2Nr
RGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQo
KS0+aW5RdWlya3NNb2RlKCkpKTsKLQotICAgICAgICAvLyBGSVhNRTogRG9uJ3Qgc3VwcG9ydCB0
aGlzIG11dGF0aW9uIGZvciBwc2V1ZG8gc3R5bGVzIGxpa2UgZmlyc3QtbGV0dGVyIG9yIGZpcnN0
LWxpbmUsIHNpbmNlIGl0J3Mgbm90IGNvbXBsZXRlbHkKLSAgICAgICAgLy8gY2xlYXIgaG93IHRo
YXQgc2hvdWxkIHdvcmsuCi0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAm
JiBzdHlsZS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgc3R5bGUtPndyaXRpbmdNb2RlKCkg
IT0gcGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlz
cGxheShJTkxJTkVfQkxPQ0spOwotCi0gICAgICAgIC8vIEFmdGVyIHBlcmZvcm1pbmcgdGhlIGRp
c3BsYXkgbXV0YXRpb24sIGNoZWNrIHRhYmxlIHJvd3MuIFdlIGRvIG5vdCBob25vciBwb3NpdGlv
bjpyZWxhdGl2ZSBvciBwb3NpdGlvbjpzdGlja3kgb24KLSAgICAgICAgLy8gdGFibGUgcm93cyBv
ciBjZWxscy4gVGhpcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBmb3IgcG9zaXRpb246cmVsYXRpdmUg
aW4gQ1NTMi4xIChhbmQgY2F1c2VkIGEgY3Jhc2ggaW4gY29udGFpbmluZ0Jsb2NrKCkKLSAgICAg
ICAgLy8gb24gc29tZSBzaXRlcykuCi0gICAgICAgIGlmICgoc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAK
LSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKQotICAgICAgICAgICAgJiYgc3R5bGUtPmhh
c0luRmxvd1Bvc2l0aW9uKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGlj
UG9zaXRpb24pOwotCi0gICAgICAgIC8vIHdyaXRpbmctbW9kZSBkb2VzIG5vdCBhcHBseSB0byB0
YWJsZSByb3cgZ3JvdXBzLCB0YWJsZSBjb2x1bW4gZ3JvdXBzLCB0YWJsZSByb3dzLCBhbmQgdGFi
bGUgY29sdW1ucy4KLSAgICAgICAgLy8gRklYTUU6IFRhYmxlIGNlbGxzIHNob3VsZCBiZSBhbGxv
d2VkIHRvIGJlIHBlcnBlbmRpY3VsYXIgb3IgZmxpcHBlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHRh
YmxlLCB0aG91Z2guCi0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVN
TiB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCB8fCBzdHlsZS0+ZGlz
cGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9S
T1cgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ0VMTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRX
cml0aW5nTW9kZShwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSk7Ci0KLSAgICAgICAgLy8gRklY
TUU6IFNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYmxvY2stZmxvdyBvbiBmbGV4aWJsZSBib3hlcyB5
ZXQsIGRpc2FsbG93IHNldHRpbmcKLSAgICAgICAgLy8gb2YgYmxvY2stZmxvdyB0byBhbnl0aGlu
ZyBvdGhlciB0aGFuIFRvcFRvQm90dG9tV3JpdGluZ01vZGUuCi0gICAgICAgIC8vIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NjQxOCAtIEZsZXhpYmxlIGJveCBzdXBw
b3J0LgotICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gVG9wVG9Cb3R0b21Xcml0
aW5nTW9kZSAmJiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBCT1ggfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBJTkxJTkVfQk9YKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShUb3BUb0Jv
dHRvbVdyaXRpbmdNb2RlKTsKLQotICAgICAgICBpZiAoaXNEaXNwbGF5RmxleGlibGVCb3gocGFy
ZW50U3R5bGUtPmRpc3BsYXkoKSkpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhO
b0Zsb2F0KTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rp
c3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCkt
PmluUXVpcmtzTW9kZSgpKSk7Ci0gICAgICAgIH0KLQotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVO
VCkKLSAgICAgICAgLy8gUGVyIHRoZSBzcGVjLCBwb3NpdGlvbiAnc3RhdGljJyBhbmQgJ3JlbGF0
aXZlJyBpbiB0aGUgdG9wIGxheWVyIGNvbXB1dGUgdG8gJ2Fic29sdXRlJy4KLSAgICAgICAgaWYg
KGUgJiYgZS0+aXNJblRvcExheWVyKCkgJiYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bv
c2l0aW9uIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFJlbGF0aXZlUG9zaXRpb24pKSB7Ci0gICAg
ICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oQWJzb2x1dGVQb3NpdGlvbik7Ci0gICAgICAgICAg
ICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQot
ICAgIC8vIE1ha2Ugc3VyZSBvdXIgei1pbmRleCB2YWx1ZSBpcyBvbmx5IGFwcGxpZWQgaWYgdGhl
IG9iamVjdCBpcyBwb3NpdGlvbmVkLgotICAgIGlmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0
aWNQb3NpdGlvbiAmJiAhaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXko
KSkpCi0gICAgICAgIHN0eWxlLT5zZXRIYXNBdXRvWkluZGV4KCk7Ci0KLSAgICAvLyBBdXRvIHot
aW5kZXggYmVjb21lcyAwIGZvciB0aGUgcm9vdCBlbGVtZW50IGFuZCB0cmFuc3BhcmVudCBvYmpl
Y3RzLiBUaGlzIHByZXZlbnRzCi0gICAgLy8gY2FzZXMgd2hlcmUgb2JqZWN0cyB0aGF0IHNob3Vs
ZCBiZSBibGVuZGVkIGFzIGEgc2luZ2xlIHVuaXQgZW5kIHVwIHdpdGggYSBub24tdHJhbnNwYXJl
bnQKLSAgICAvLyBvYmplY3Qgd2VkZ2VkIGluIGJldHdlZW4gdGhlbS4gQXV0byB6LWluZGV4IGFs
c28gYmVjb21lcyAwIGZvciBvYmplY3RzIHRoYXQgc3BlY2lmeSB0cmFuc2Zvcm1zL21hc2tzL3Jl
ZmxlY3Rpb25zLgotICAgIGlmIChzdHlsZS0+aGFzQXV0b1pJbmRleCgpICYmICgoZSAmJiBlLT5k
b2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKQotICAgICAgICB8fCBzdHlsZS0+b3Bh
Y2l0eSgpIDwgMS4wZgotICAgICAgICB8fCBzdHlsZS0+aGFzVHJhbnNmb3JtUmVsYXRlZFByb3Bl
cnR5KCkKLSAgICAgICAgfHwgc3R5bGUtPmhhc01hc2soKQotICAgICAgICB8fCBzdHlsZS0+Y2xp
cFBhdGgoKQotICAgICAgICB8fCBzdHlsZS0+Ym94UmVmbGVjdCgpCi0gICAgICAgIHx8IHN0eWxl
LT5oYXNGaWx0ZXIoKQotICAgICAgICB8fCBzdHlsZS0+aGFzQmxlbmRNb2RlKCkKLSAgICAgICAg
fHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RpY2t5UG9zaXRpb24KLSAgICAgICAgfHwgKHN0eWxl
LT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb24gJiYgZSAmJiBlLT5kb2N1bWVudCgpLT5wYWdl
KCkgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpLT5zZXR0aW5ncygpLT5maXhlZFBvc2l0aW9uQ3Jl
YXRlc1N0YWNraW5nQ29udGV4dCgpKQotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19T
Q1JPTExJTkcpCi0gICAgICAgIC8vIFRvdWNoIG92ZXJmbG93IHNjcm9sbGluZyBjcmVhdGVzIGEg
c3RhY2tpbmcgY29udGV4dC4KLSAgICAgICAgfHwgKChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJ
RERFTiB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikgJiYgc3R5bGUtPnVzZVRvdWNo
T3ZlcmZsb3dTY3JvbGxpbmcoKSkKLSNlbmRpZgotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkK
LSAgICAgICAgfHwgKGUgJiYgZS0+aXNJblRvcExheWVyKCkpCi0jZW5kaWYKLSAgICAgICAgKSkK
LSAgICAgICAgc3R5bGUtPnNldFpJbmRleCgwKTsKLQotICAgIC8vIFRleHRhcmVhIGNvbnNpZGVy
cyBvdmVyZmxvdyB2aXNpYmxlIGFzIGF1dG8uCi0gICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0
ZXh0YXJlYVRhZykpIHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChzdHlsZS0+b3ZlcmZs
b3dYKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1goKSk7Ci0gICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1koc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFID8gT0FV
VE8gOiBzdHlsZS0+b3ZlcmZsb3dZKCkpOwotICAgIH0KLQotICAgIGlmIChkb2VzTm90SW5oZXJp
dFRleHREZWNvcmF0aW9uKHN0eWxlLCBlKSkKLSAgICAgICAgc3R5bGUtPnNldFRleHREZWNvcmF0
aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLSAgICBlbHNlCi0gICAgICAg
IHN0eWxlLT5hZGRUb1RleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlv
bigpKTsKLQotICAgIC8vIElmIGVpdGhlciBvdmVyZmxvdyB2YWx1ZSBpcyBub3QgdmlzaWJsZSwg
Y2hhbmdlIHRvIGF1dG8uCi0gICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPTUFSUVVFRSAm
JiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVy
Zmxvd1koT01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPTUFS
UVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1goT01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9
PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUpIHsKLSAgICAgICAg
Ly8gRklYTUU6IE9uY2Ugd2UgaW1wbGVtZW50IHBhZ2luYXRpb24gY29udHJvbHMsIG92ZXJmbG93
LXggc2hvdWxkIGRlZmF1bHQgdG8gaGlkZGVuCi0gICAgICAgIC8vIGlmIG92ZXJmbG93LXkgaXMg
c2V0IHRvIC13ZWJraXQtcGFnZWQteCBvciAtd2Via2l0LXBhZ2UteS4gRm9yIG5vdywgd2UnbGwg
bGV0IGl0Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gYXV0byBzbyB3ZSBjYW4gYXQgbGVhc3Qgc2Ny
b2xsIHRocm91Z2ggdGhlIHBhZ2VzLgotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9BVVRP
KTsKLSAgICB9IGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSAmJiBzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1ko
T0FVVE8pOwotCi0gICAgLy8gQ2FsbCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZSgpIGlmIGEg
cGFnaW5hdGlvbiBtb2RlIGlzIHNldCBmb3IgYW55IG5vbi1yb290IGVsZW1lbnRzLiBJZiB0aGVz
ZQotICAgIC8vIHN0eWxlcyBhcmUgc3BlY2lmaWVkIG9uIGEgcm9vdCBlbGVtZW50LCB0aGVuIHRo
ZXkgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW4KLSAgICAvLyBTdHlsZVJlc29sdmVyOjpzdHlsZUZv
ckRvY3VtZW50KCkuCi0gICAgaWYgKChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWCB8fCBz
dHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWSkgJiYgIShlICYmIChlLT5oYXNUYWdOYW1lKGh0
bWxUYWcpIHx8IGUtPmhhc1RhZ05hbWUoYm9keVRhZykpKSkKLSAgICAgICAgc2V0U3R5bGVzRm9y
UGFnaW5hdGlvbk1vZGUoV2ViQ29yZTo6cGFnaW5hdGlvbk1vZGVGb3JSZW5kZXJTdHlsZShzdHls
ZSksIHN0eWxlKTsKLQotICAgIC8vIFRhYmxlIHJvd3MsIHNlY3Rpb25zIGFuZCB0aGUgdGFibGUg
aXRzZWxmIHdpbGwgc3VwcG9ydCBvdmVyZmxvdzpoaWRkZW4gYW5kIHdpbGwgaWdub3JlIHNjcm9s
bC9hdXRvLgotICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5IHRhYmxlIHNlY3Rpb25zIHdpbGwgc3Vw
cG9ydCBhdXRvIGFuZCBzY3JvbGwuCi0gICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUg
fHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUKLSAgICAgICAgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9S
T1cpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSAmJiBzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTikKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1goT1ZJU0lCTEUpOwotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxF
ICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WShPVklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8gTWVudWxpc3RzIHNob3VsZCBo
YXZlIHZpc2libGUgb3ZlcmZsb3cKLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51
bGlzdFBhcnQpIHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0gICAg
ICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwotICAgIH0KLQotICAgIC8vIEN1bGwg
b3V0IGFueSB1c2VsZXNzIGxheWVycyBhbmQgYWxzbyByZXBlYXQgcGF0dGVybnMgaW50byBhZGRp
dGlvbmFsIGxheWVycy4KLSAgICBzdHlsZS0+YWRqdXN0QmFja2dyb3VuZExheWVycygpOwotICAg
IHN0eWxlLT5hZGp1c3RNYXNrTGF5ZXJzKCk7Ci0KLSAgICAvLyBEbyB0aGUgc2FtZSBmb3IgYW5p
bWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMuCi0gICAgc3R5bGUtPmFkanVzdEFuaW1hdGlvbnMoKTsK
LSAgICBzdHlsZS0+YWRqdXN0VHJhbnNpdGlvbnMoKTsKLQotICAgIC8vIEltcG9ydGFudDogSW50
cmluc2ljIG1hcmdpbnMgZ2V0IGFkZGVkIHRvIGNvbnRyb2xzIGJlZm9yZSB0aGUgdGhlbWUgaGFz
IGFkanVzdGVkIHRoZSBzdHlsZSwgc2luY2UgdGhlIHRoZW1lIHdpbGwKLSAgICAvLyBhbHRlciBm
b250cyBhbmQgaGVpZ2h0cy93aWR0aHMuCi0gICAgaWYgKGUgJiYgZS0+aXNGb3JtQ29udHJvbEVs
ZW1lbnQoKSAmJiBzdHlsZS0+Zm9udFNpemUoKSA+PSAxMSkgewotICAgICAgICAvLyBEb24ndCBh
cHBseSBpbnRyaW5zaWMgbWFyZ2lucyB0byBpbWFnZSBidXR0b25zLiBUaGUgZGVzaWduZXIga25v
d3MgaG93IGJpZyB0aGUgaW1hZ2VzIGFyZSwKLSAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB0cmVh
dCBhbGwgaW1hZ2UgYnV0dG9ucyBhcyB0aG91Z2ggdGhleSB3ZXJlIGV4cGxpY2l0bHkgc2l6ZWQu
Ci0gICAgICAgIGlmICghZS0+aGFzVGFnTmFtZShpbnB1dFRhZykgfHwgIXN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihlKS0+aXNJbWFnZUJ1dHRvbigpKQotICAgICAgICAgICAgYWRkSW50
cmluc2ljTWFyZ2lucyhzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSB0aGVtZSBhbHNv
IGhhdmUgYSBjcmFjayBhdCBhZGp1c3RpbmcgdGhlIHN0eWxlLgotICAgIGlmIChzdHlsZS0+aGFz
QXBwZWFyYW5jZSgpKQotICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFkanVz
dFN0eWxlKHRoaXMsIHN0eWxlLCBlLCBtX3N0YXRlLmhhc1VBQXBwZWFyYW5jZSgpLCBtX3N0YXRl
LmJvcmRlckRhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91
bmRDb2xvcigpKTsKLQotICAgIC8vIElmIHdlIGhhdmUgZmlyc3QtbGV0dGVyIHBzZXVkbyBzdHls
ZSwgZG8gbm90IHNoYXJlIHRoaXMgc3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNQc2V1ZG9TdHls
ZShGSVJTVF9MRVRURVIpKQotICAgICAgICBzdHlsZS0+c2V0VW5pcXVlKCk7Ci0KLSAgICAvLyBG
SVhNRTogd2hlbiBkcm9wcGluZyB0aGUgLXdlYmtpdCBwcmVmaXggb24gdHJhbnNmb3JtLXN0eWxl
LCB3ZSBzaG91bGQgYWxzbyBoYXZlIG9wYWNpdHkgPCAxIGNhdXNlIGZsYXR0ZW5pbmcuCi0gICAg
aWYgKHN0eWxlLT5wcmVzZXJ2ZXMzRCgpICYmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lC
TEUKLSAgICAgICAgfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFCi0gICAgICAgIHx8
IHN0eWxlLT5oYXNGaWx0ZXIoKSkpCi0gICAgICAgIHN0eWxlLT5zZXRUcmFuc2Zvcm1TdHlsZTNE
KFRyYW5zZm9ybVN0eWxlM0RGbGF0KTsKLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgYmVoYXZl
IGxpa2UgYmxvY2tzLiBNYXAgdGhlaXIgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sgd2hlbiBtYXJr
ZWQgaW5saW5lLgotICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSAmJiBzdHls
ZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+
KGUpLT5zaG91bGREaXNwbGF5U2VhbWxlc3NseSgpKQotICAgICAgICBzdHlsZS0+c2V0RGlzcGxh
eShJTkxJTkVfQkxPQ0spOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZSAmJiBlLT5pc1NW
R0VsZW1lbnQoKSkgewotICAgICAgICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcv
bWFza2luZy5odG1sI092ZXJmbG93UHJvcGVydHkKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxv
d1koKSA9PSBPU0NST0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPSElEREVO
KTsKLSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9BVVRPKQotICAgICAg
ICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKHN0eWxl
LT5vdmVyZmxvd1goKSA9PSBPU0NST0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93
WChPSElEREVOKTsKLSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9BVVRP
KQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0KLSAgICAgICAg
Ly8gT25seSB0aGUgcm9vdCA8c3ZnPiBlbGVtZW50IGluIGFuIFNWRyBkb2N1bWVudCBmcmFnbWVu
dCB0cmVlIGhvbm9ycyBjc3MgcG9zaXRpb24KLSAgICAgICAgaWYgKCEoZS0+aGFzVGFnTmFtZShT
VkdOYW1lczo6c3ZnVGFnKSAmJiBlLT5wYXJlbnROb2RlKCkgJiYgIWUtPnBhcmVudE5vZGUoKS0+
aXNTVkdFbGVtZW50KCkpKQotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFJlbmRlclN0
eWxlOjppbml0aWFsUG9zaXRpb24oKSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyU1ZHUm9vdCBoYW5k
bGVzIHpvb21pbmcgZm9yIHRoZSB3aG9sZSBTVkcgc3VidHJlZSwgc28gZm9yZWlnbk9iamVjdCBj
b250ZW50IHNob3VsZAotICAgICAgICAvLyBub3QgYmUgc2NhbGVkIGFnYWluLgotICAgICAgICBp
ZiAoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6Zm9yZWlnbk9iamVjdFRhZykpCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSk7Ci0g
ICAgfQotI2VuZGlmCi19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TdHlsZShF
bGVtZW50KiByZWdpb25FbGVtZW50KQotewotICAgIC8vIEZJWE1FIChCVUcgNzI0NzIpOiBXZSBk
b24ndCBhZGQgQC13ZWJraXQtcmVnaW9uIHJ1bGVzIG9mIHNjb3BlZCBzdHlsZSBzaGVldHMgZm9y
IHRoZSBtb21lbnQsCi0gICAgLy8gc28gYWxsIHJlZ2lvbiBydWxlcyBhcmUgZ2xvYmFsIGJ5IGRl
ZmF1bHQuIFZlcmlmeSB3aGV0aGVyIHRoYXQgY2FuIHN0YW5kIG9yIG5lZWRzIGNoYW5naW5nLgot
Ci0gICAgdW5zaWduZWQgcnVsZXNTaXplID0gbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3Jl
Z2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMuYXV0aG9y
U3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgp
KTsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy5hdXRob3JTdHls
ZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25F
bGVtZW50KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3J1
bGVTZXRzLnVzZXJTdHlsZSgpKSB7Ci0gICAgICAgIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMudXNl
clN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgICAgIEFT
U0VSVChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRz
LmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0
b3IobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5h
dChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2
b2lkIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAg
IEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRh
dGlvbiBnbHlwaE9yaWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKHN0
eWxlLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotCi0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24gPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7
Ci0gICAgaWYgKGZvbnREZXNjcmlwdGlvbi5vcmllbnRhdGlvbigpID09IGZvbnRPcmllbnRhdGlv
biAmJiBmb250RGVzY3JpcHRpb24ubm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09IGdseXBoT3Jp
ZW50YXRpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250
RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0
Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKLSAgICBuZXdGb250RGVz
Y3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKLSAgICBzdHlsZS0+c2V0
Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6dXBkYXRlRm9udCgpCi17Ci0gICAgaWYgKCFtX3N0YXRlLmZvbnREaXJ0eSgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjaGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0gICAgUmVuZGVy
U3R5bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOwotICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWls
eUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKLSAgICBjaGVja0Zvclpvb21D
aGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3JPcmllbnRh
dGlvbkNoYW5nZShzdHlsZSk7Ci0gICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0
b3IpOwotICAgIG1fc3RhdGUuc2V0Rm9udERpcnR5KGZhbHNlKTsKLX0KLQotUGFzc1JlZlB0cjxD
U1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCog
ZSwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCi17Ci0gICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVs
ZXNGb3JFbGVtZW50KGUsIE5PUFNFVURPLCBydWxlc1RvSW5jbHVkZSk7Ci19Ci0KLVBhc3NSZWZQ
dHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50
KEVsZW1lbnQqIGUsIFBzZXVkb0lkIHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkK
LXsKLSAgICBpZiAoIWUgfHwgIWUtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNr
ZXI6OkNvbGxlY3RpbmdSdWxlcyk7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLSAgICBtX3N0YXRl
LmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOwotCi0gICAg
TWF0Y2hSZXN1bHQgZHVtbXk7Ci0gICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NT
UnVsZXMpIHsKLSAgICAgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBh
Z2VudCBzaGVldC4KLSAgICAgICAgbWF0Y2hVQVJ1bGVzKGR1bW15KTsKLQotICAgICAgICAvLyBO
b3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KLSAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JB
bmRVc2VyU3R5bGVzKQotICAgICAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9J
bmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0gICAgfQotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JB
bmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAg
ICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09y
aWdpbkNTU1J1bGVzKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBz
aGVldHMuCi0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYg
RW1wdHlDU1NSdWxlcyk7Ci0KLSAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxz
ZSk7Ci0gICAgfQotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2
aW5nU3R5bGUpOwotCi0gICAgcmV0dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlu
bGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxl
RGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRv
LCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkp
Ci17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIGlmIChydWxlRGF0YS5oYXNG
YXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgewotICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0
b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNldWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3Rh
dGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxl
IHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQg
ZnJvbSB0aGUgcnVsZSBoYXNoLgotICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBv
bmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYg
KHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNo
KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlm
ICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9t
YXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMo
c3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2Vs
ZWN0b3JDaGVja2VyRmFzdFBhdGgocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgp
KTsKLSAgICAgICAgaWYgKCFzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0
QXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICByZXR1cm4gc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlcygpOwotICAgIH0KLQotICAg
IC8vIFNsb3cgcGF0aC4KLSAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3Vt
ZW50KCksIHN0YXRlLm1vZGUoKSk7Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNr
aW5nQ29udGV4dCBjb250ZXh0KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwg
U2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1l
bnRTdHlsZSA9IHN0YXRlLnN0eWxlKCk7Ci0gICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAg
IGNvbnRleHQucHNldWRvSWQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsK
LSAgICBjb250ZXh0LnNjcm9sbGJhciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9s
bGJhcjsKLSAgICBjb250ZXh0LnNjcm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVl
c3QoKS5zY3JvbGxiYXJQYXJ0OwotICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVo
YXZpb3JBdEJvdW5kYXJ5OwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxl
Y3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZl
cnNhbFN0cmF0ZWd5KCkpOwotICAgIGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVj
dG9yTWF0Y2hlcykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdGF0ZS5wc2V1ZG9T
dHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJl
cXVlc3QoKS5wc2V1ZG9JZCAhPSBkeW5hbWljUHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25T
ZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lv
bkVsZW1lbnQpCi17Ci0gICAgaWYgKCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hl
Y2tlcihkb2N1bWVudCgpLCBtX3N0YXRlLm1vZGUoKSk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxl
Y3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMp
KSB7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2Vs
ZWN0b3JDaGVja2luZ0NvbnRleHQocywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpW
aXNpdGVkTWF0Y2hEaXNhYmxlZCk7Ci0gICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1
ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3Rv
ckNoZWNraW5nQ29udGV4dCwgaWdub3JlRHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNh
bFN0cmF0ZWd5KCkpID09IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1
ZmYgb24gaG93IHRvIGFwcGx5IGEgY2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgot
Ci1MZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZh
bHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9v
dFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKLXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUg
PyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24g
fCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252
ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwg
bXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKLX0KLQotTGVuZ3RoIFN0eWxlUmVzb2x2
ZXI6OmNvbnZlcnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1
ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVs
dGlwbGllcikKLXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+
Y29udmVydFRvTGVuZ3RoPEZpeGVkRmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24g
fCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVy
Y2VudGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3Ro
KFVuZGVmaW5lZCk7Ci19Ci0KLXRlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0
aW9uUGFzcyBwYXNzPgotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1w
b3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0
eVdoaXRlbGlzdFR5cGUpCi17Ci0gICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0g
UHJvcGVydHlXaGl0ZWxpc3RSZWdpb24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsK
LSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjp3aWxsUHJvY2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0K
LSAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAg
ICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3Bl
cnRpZXMtPnByb3BlcnR5QXQoaSk7Ci0gICAgICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50
LmlzSW1wb3J0YW50KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGluaGVy
aXRlZE9ubHkgJiYgIWN1cnJlbnQuaXNJbmhlcml0ZWQoKSkgewotICAgICAgICAgICAgLy8gSWYg
dGhlIHByb3BlcnR5IHZhbHVlIGlzIGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFw
cGx5IGZ1cnRoZXIgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBhcyB0
aGV5IG1pZ2h0IG92ZXJyaWRlIHRoZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVh
c29uIHdlIGRvbid0IGFsbG93IGRlY2xhcmF0aW9ucyB3aXRoCi0gICAgICAgICAgICAvLyBleHBs
aWNpdGx5IGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIEFT
U0VSVCghY3VycmVudC52YWx1ZSgpLT5pc0luaGVyaXRlZFZhbHVlKCkpOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1
cnJlbnQuaWQoKTsKLQotICAgICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3Bl
cnR5V2hpdGVsaXN0UmVnaW9uICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQ
cm9wZXJ0eShwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSNpZiBFTkFCTEUoVklE
RU9fVFJBQ0spCi0gICAgICAgIGlmIChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlX
aGl0ZWxpc3RDdWUgJiYgIVN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHBy
b3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAo
cGFzcykgewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICBjYXNlIFZhcmlhYmxl
RGVmaW5pdGlvbnM6Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlh
YmxlIDwgZmlyc3RDU1NQcm9wZXJ0eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9w
ZXJ0eSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkK
LSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1
ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgSGlnaFByaW9y
aXR5UHJvcGVydGllczoKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVy
dHkgPT0gQ1NTUHJvcGVydHlDb2xvciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKLSAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNv
bG9yICsgMTgsIENTU196b29tX2lzX2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsKLSAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpv
b20gKyAxLCBDU1NfbGluZV9oZWlnaHRfaXNfYWZ0ZXJfem9vbSk7Ci0jaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJs
ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSNlbmRpZgotICAgICAgICAgICAgLy8gZ2l2
ZSBzcGVjaWFsIHByaW9yaXR5IHRvIGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKLSAg
ICAgICAgICAgIGlmIChwcm9wZXJ0eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAg
ICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAg
ICAgICAgICAgIC8vIHdlIGFwcGx5IGxpbmUtaGVpZ2h0IGxhdGVyCi0gICAgICAgICAgICBlbHNl
IGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAg
bV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIExvd1ByaW9yaXR5UHJvcGVydGllczoKLSAgICAgICAgICAg
IGlmIChwcm9wZXJ0eSA+IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBh
cHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tp
ZSk7Ci19Ci0KLXRlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBw
YXNzPgotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1h
dGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgs
IGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KQotewotICAgIGlmIChzdGFydEluZGV4
ID09IC0xKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwot
ICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgewot
ICAgICAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0g
ICAgICAgICAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBt
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxp
bmtNYXRjaFR5cGUgPSBtYXRjaGVkUHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOwotICAgICAgICAg
ICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRz
IGJ1dCB0aGF0IHJlcXVpcmVzIGNoYW5nZXMgaW4gbWFueSBwbGFjZXMuCi0gICAgICAgICAgICBz
dGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVj
dG9yQ2hlY2tlcjo6TWF0Y2hMaW5rKTsKLSAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVy
dHlUb1Zpc2l0ZWRMaW5rU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0
Y2hWaXNpdGVkKTsKLQotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQ
cm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwg
aXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0
VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOwotICAgICAgICB9Ci0gICAg
ICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsKLSAgICAgICAg
c3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5k
ZXg7ICsraSkgewotICAgICAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3Bl
cnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXTsKLSAgICAgICAgYXBwbHlQ
cm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNo
UmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRp
Y19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0
VHlwZSkpOwotICAgIH0KLX0KLQotdW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNo
ZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5z
aWduZWQgc2l6ZSkKLXsKLSAgICAKLSAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5
KHByb3BlcnRpZXMsIHNpemVvZihNYXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsKLX0KLQotYm9v
bCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBT
dHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKLXsKLSAgICByZXR1cm4gYS5maXJzdFVBUnVs
ZSA9PSBiLmZpcnN0VUFSdWxlCi0gICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1
bGUKLSAgICAgICAgJiYgYS5maXJzdEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKLSAg
ICAgICAgJiYgYS5sYXN0QXV0aG9yUnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCi0gICAgICAgICYm
IGEuZmlyc3RVc2VyUnVsZSA9PSBiLmZpcnN0VXNlclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VXNl
clJ1bGUgPT0gYi5sYXN0VXNlclJ1bGU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHls
ZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5n
ZXMmIGIpCi17Ci0gICAgcmV0dXJuICEoYSA9PSBiKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNv
bnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29s
dmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYikKLXsKLSAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09
IGIucHJvcGVydGllcyAmJiBhLmxpbmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOwotfQot
Ci1ib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQotewotICAgIHJl
dHVybiAhKGEgPT0gYik7Ci19Ci0KLWNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVJdGVtKiBTdHlsZVJlc29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQotewotICAg
IEFTU0VSVChoYXNoKTsKLQotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0
ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmZpbmQoaGFzaCk7Ci0gICAgaWYgKGl0ID09IG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5lbmQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTWF0
Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsKLQotICAgIHNp
emVfdCBzaXplID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlm
IChzaXplICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAg
IGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hl
ZFByb3BlcnRpZXNbaV0pCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNh
Y2hlSXRlbS5yYW5nZXMgIT0gbWF0Y2hSZXN1bHQucmFuZ2VzKQotICAgICAgICByZXR1cm4gMDsK
LSAgICByZXR1cm4gJmNhY2hlSXRlbTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5k
ZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBt
YXRjaFJlc3VsdCkKLXsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0
aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dlZXBzID0gMTAwOwotICAgIGlmICgrK21fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJh
dGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3ZWVwcwotICAgICAgICAmJiAhbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIHN0YXRpYyBjb25z
dCB1bnNpZ25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYw
OwotICAgICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hv
dChtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7Ci0gICAgfQotCi0g
ICAgQVNTRVJUKGhhc2gpOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRl
bTsKLSAgICBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzKTsKLSAgICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFu
Z2VzOwotICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVy
U3R5bGUgaW5zdGFuY2UuIEl0IG1heSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgotICAgIC8vIFRoZSBS
ZW5kZXJTdHlsZSBpbiB0aGUgY2FjaGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBz
dWJzdHJ1Y3R1cmVzIGFuZCBuZXZlciB1c2VkIGFzLWlzLgotICAgIGNhY2hlSXRlbS5yZW5kZXJT
dHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShzdHlsZSk7Ci0gICAgY2FjaGVJdGVtLnBhcmVudFJl
bmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKLSAgICBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUuYWRkKGhhc2gsIGNhY2hlSXRlbSk7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6aW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQotewotICAgIG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZS5jbGVhcigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0NhY2hlYWJs
ZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBS
ZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAg
ICAvLyBGSVhNRTogQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3
aGVuIGFwcGx5aW5nIHRvIGRvY3VtZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5
aW5nIGJ5IGNhY2hpbmcuCi0gICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkgJiYgZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRP
bkRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxl
LT51bmlxdWUoKSB8fCAoc3R5bGUtPnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0
eWxlLT51bmlxdWUoKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPmhh
c0FwcGVhcmFuY2UoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+em9v
bSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3Jp
dGluZ01vZGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIFRoZSBjYWNoZSBhc3N1
bWVzIHN0YXRpYyBrbm93bGVkZ2UgYWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVk
LgotICAgIGlmIChwYXJlbnRTdHlsZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1h
dGNoUmVzdWx0LCBjb25zdCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVChlbGVtZW50
KTsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9
IG1hdGNoUmVzdWx0LmlzQ2FjaGVhYmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaCht
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSkgOiAwOwotICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFs
c2U7Ci0gICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7
Ci0gICAgaWYgKGNhY2hlSGFzaCAmJiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVy
dGllc0NhY2hlKGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpKSkgewotICAgICAgICAvLyBXZSBjYW4g
YnVpbGQgdXAgdGhlIHN0eWxlIGJ5IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZy
b20gYW4gZWFybGllciBzdHlsZSBvYmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKLSAg
ICAgICAgLy8gc3R5bGUgZGVjbGFyYXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0
aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBl
bmQgb24gdGhlIAotICAgICAgICAvLyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQg
c2F2ZXMgbWVtb3J5IGJ5IHJldXNpbmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KLSAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+Y29weU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJT
dHlsZS5nZXQoKSk7Ci0gICAgICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWRE
YXRhU2hhcmVkKGNhY2hlSXRlbS0+cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hh
ZG93Qm91bmRhcnkoZWxlbWVudCkpIHsKLSAgICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0
dXMgPSBzdGF0ZS5zdHlsZSgpLT5pbnNpZGVMaW5rKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUg
Y2FjaGUgaXRlbSBwYXJlbnQgc3R5bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGll
cyB0byB0aGUgY3VycmVudCBwYXJlbnQgc3R5bGUgdGhlbiB0aGUKLSAgICAgICAgICAgIC8vIHJl
c3VsdGluZyBzdHlsZSB3aWxsIGJlIGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRl
ZCBwcm9wZXJ0aWVzIG92ZXIgZnJvbSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQo
KSk7Ci0KLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRy
ZWF0ZWQgbGlrZSBhbiBpbmhlcml0ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSBy
ZXN0b3JlIGl0LgotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5r
U3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhcHBseUlu
aGVyaXRlZE9ubHkgPSB0cnVlOyAKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykK
LSAgICAvLyBGaXJzdCBhcHBseSBhbGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5
IGJlIHVzZWQgZHVyaW5nIGFwcGxpY2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMuCi0gICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFs
c2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5o
ZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRp
b25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkp
OwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hS
ZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1
bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0jZW5kaWYKLQotICAgIC8vIE5vdyB3ZSBoYXZlIGFs
bCBvZiB0aGUgbWF0Y2hlZCBydWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhl
IHJ1bGVzIGFuZCBhcHBseQotICAgIC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwg
aS5lLiwgdGhvc2UgcHJvcGVydGllcyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgot
ICAgIC8vIFRoZSBvcmRlciBpcyAoMSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikg
aGlnaC1wcmlvcml0eSBpbXBvcnRhbnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFudAotICAgIC8v
IGFuZCAoNCkgbm9ybWFsIGltcG9ydGFudC4KLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
MCk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPiht
YXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxI
aWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBh
cHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9y
aXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRl
ZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGll
cz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0KLSAgICBp
ZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAh
PSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0Rm9u
dERpcnR5KHRydWUpOwotICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICB9
Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBp
dCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdo
ZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgotICAgIGlmIChzdGF0
ZS5saW5lSGVpZ2h0VmFsdWUoKSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxp
bmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAgIC8vIE1hbnkgcHJvcGVy
dGllcyBkZXBlbmQgb24gdGhlIGZvbnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwg
cHJvcGVydGllcy4KLSAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUt
PmZvbnREZXNjcmlwdGlvbigpICE9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQot
ICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLQotICAgIC8vIE5vdyBkbyB0aGUg
bm9ybWFsIHByaW9yaXR5IFVBIHByb3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
czxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQu
cmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJ
bmhlcml0ZWRPbmx5KTsKLSAgICAKLSAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3Jv
dW5kIHNvIHRoYXQgd2UgY2FuIGV4YW1pbmUgdGhlbSBsYXRlci4KLSAgICBzdGF0ZS5jYWNoZUJv
cmRlckFuZEJhY2tncm91bmQoKTsKLSAgICAKLSAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQg
dXNlciBub3JtYWwgcHJpb3JpdHkgcHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHBy
b3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRp
ZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAx
LCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRl
ZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJl
c3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0
LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFS
dWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNv
dXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2Vz
KCk7Ci0gICAgCi0gICAgQVNTRVJUKCFzdGF0ZS5mb250RGlydHkoKSk7Ci0gICAgCi0gICAgaWYg
KGNhY2hlSXRlbSB8fCAhY2FjaGVIYXNoKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFpc0Nh
Y2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0
eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCkpKQotICAgICAgICByZXR1cm47Ci0gICAgYWRkVG9N
YXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCks
IGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFy
ZVBhZ2VSdWxlcyhjb25zdCBTdHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSog
cjIpCi17Ci0gICAgcmV0dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNl
bGVjdG9yKCktPnNwZWNpZmljaXR5KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQ
YWdlUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBp
ZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+
IG1hdGNoZWRQYWdlUnVsZXM7Ci0gICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdl
UnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VO
YW1lKTsKLSAgICBpZiAobWF0Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIHN0ZDo6c3RhYmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRj
aGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJlUGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRN
YXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMo
KSk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBD
U1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwg
Y29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBj
b21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRh
Z0hpc3RvcnkoKSkgewotICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVj
dG9yOjpUYWcpIHsKLSAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0g
Y29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2Fs
TmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVk
b1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVudC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAo
KHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdl
KQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0
UGFnZSAmJiBpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAhaXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2Uq
PiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5n
JiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgp
OyArK2kpIHsKLSAgICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAg
ICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlz
TGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhl
biBpZ25vcmUgaXQuCi0gICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMg
PSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0
aWVzLT5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQg
dGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRS
dWxlcy5hcHBlbmQocnVsZSk7Ci0gICAgfQotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVm
dFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKLXsKLSAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9
IGZhbHNlOwotICAgIGlmICghbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSkKLSAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAgIHJl
dHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0g
ICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBp
bmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBhZ2VJ
bmRleCk7Ci19Ci0KLVN0cmluZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUlu
ZGV4ICovKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBw
YWdlIG5hbWUgbWFwcGluZy4KLSAgICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6YXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVl
LCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgaW5pdEVsZW1lbnQoMCk7Ci0gICAgbV9zdGF0
ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIDAsIHN0eWxlKTsKLSAgICBtX3N0YXRl
LnNldFN0eWxlKHN0eWxlKTsKLSAgICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZh
bHVlKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5
bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZSkK
LSAgICAgICAgYXBwbHlQcm9wZXJ0eShpZCwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBpc1Zh
bGlkVmlzaXRlZExpbmtQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAo
aWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uUnVsZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFz
aXNDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yOgotICAgIC8vIEFsc28gYWxsb3cg
c2hvcnRoYW5kcyBzbyB0aGF0IGluaGVyaXQvaW5pdGlhbCBzdGlsbCB3b3JrLgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eU91dGxpbmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGU6Ci0j
aWYgRU5BQkxFKFNWRykKLSAgICBjYXNlIENTU1Byb3BlcnR5RmlsbDoKLSAgICBjYXNlIENTU1By
b3BlcnR5U3Ryb2tlOgotI2VuZGlmCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gaHR0
cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxlLXJ1
bGUKLS8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9uIHN0
eWxpbmcgcHJvcGVydGllcy4KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdp
b25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVh
azsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJB
Q0spCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShD
U1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9z
aXRpb25YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kUmVwZWF0WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9u
dEZhbWlseToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxp
bmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5T3V0bGluZU9mZnNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2li
aWxpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHREZWNvcmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNl
bmRpZgotLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFyZWQg
dG8gQ1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKLS8vIG9mIGVhY2gg
aW5kaXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENTU1By
aW1pdGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigpCi0vLyBtdWx0aXBsaWVzIGVhY2ggcmVzb2x2
ZWQgbGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVlZCB0
byBkaXNhYmxlIHRoYXQuCi0vLyBUaG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBw
bGllZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIvcGFk
ZGluZy4uLikKLS8vIG5lZWQgdG8gcmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0aGUg
cGFyZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCi0vLyB3aWR0
aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZvciBT
VkcgdGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNjYWxlLAotLy8gaWYgd2UnZCBwYXNzIGEgMS4w
IHpvb20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9yIG9m
IDEuMCBmb3Igc3BlY2lmaWMKLS8vIHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQgdG8g
c2NhbGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2luZy9m
b250LXNpemUpLgotYm9vbCBTdHlsZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQotewotICAg
IHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVt
ZW50KCk7Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3Rh
dGUsIExlbmd0aCYgd29ya2luZ0xlbmd0aCkKLXsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5Db250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdM
ZW5ndGggPSBMZW5ndGgoTWluQ29udGVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LQotICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1h
eENvbnRlbnQpIHsKLSAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50KTsK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgd29ya2luZ0xlbmd0aCA9IHByaW1p
dGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNl
bnRDb252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252ZXJz
aW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKSk7Ci0gICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmluZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xl
bmd0aCgpKQotICAgICAgICB3b3JraW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVlLT5p
c1F1aXJrVmFsdWUoKSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3Jl
YXRlR3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29u
c3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1NpemUp
Ci17Ci0gICAgUGFpciogbWluTWF4VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdldFBh
aXJWYWx1ZSgpOwotICAgIGlmICghbWluTWF4VHJhY2tCcmVhZHRoKSB7Ci0gICAgICAgIExlbmd0
aCB3b3JraW5nTGVuZ3RoOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgocHJp
bWl0aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgICAgICB0cmFja1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRoOwot
ICAgIExlbmd0aCBtYXhUcmFja0JyZWFkdGg7Ci0gICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVh
ZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0aCkg
fHwgIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQoKSwg
c3RhdGUsIG1heFRyYWNrQnJlYWR0aCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRy
YWNrU2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwotICAg
IHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChDU1NW
YWx1ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9yPEdy
aWRUcmFja1NpemU+JiB0cmFja1NpemVzKQotewotICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0
b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFs
dWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzUHJp
bWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBHcmlk
VHJhY2tTaXplIHRyYWNrU2l6ZTsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5NYXgo
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJhY2tT
aXplKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cmFja1NpemVzLmFw
cGVuZCh0cmFja1NpemUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJv
b2wgY3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJhY2tT
aXplPiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQotewot
ICAgIC8vIEhhbmRsZSAnbm9uZScuCi0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkp
IHsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNy
ZWF0ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Ci19Ci0KLQotc3Rh
dGljIGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0aW9u
JiBwb3NpdGlvbikKLXsKLSAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVnZXI+
IHwgJ2F1dG8nCi0gICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVlLT5p
c051bWJlcigpKTsKLSAgICBwb3NpdGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZlVmFs
dWUtPmdldEludFZhbHVlKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCi1zdGF0aWMgYm9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1ZSog
dmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFzVmFy
aWFibGVSZWZlcmVuY2UoKTsKLSAgICB9Ci0KLSAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRpb25W
YWx1ZSgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFsdWUp
LT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOwotCi0gICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RWYWx1
ZSgpKSB7Ci0gICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
ZGlyZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKTsKLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7Ci0gICAgICAgIENTU1Zh
bHVlKiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNrKCk7Ci0gICAgICAgIHJldHVybiAoZGlyZWN0
aW9uICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYgaGFz
VmFyaWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZlcmVu
Y2UobWFzaykpOwotICAgIH0KLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZh
bHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgaWYgKGhhc1ZhcmlhYmxl
UmVmZXJlbmNlKGkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZhcmlh
YmxlcyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBhaXI8
Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKQotewotICAgIHN0ZDo6
cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJpYWxp
emVSZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsKLQot
ICAgIGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQotICAgICAgICBy
ZXR1cm47IC8vIGN5Y2xlIGRldGVjdGVkLgotCi0gICAga25vd25FeHByZXNzaW9ucy5hcHBlbmQo
ZXhwcmVzc2lvbik7Ci0KLSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0byBy
ZS1wYXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0aW9u
IGxpdmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdlIGRvIGl0IHRoZXJlLgotICAgIFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKTsK
LSAgICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBleHBy
ZXNzaW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50KCkpKQotICAgICAgICByZXR1cm47IC8vIGV4
cHJlc3Npb24gZmFpbGVkIHRvIHBhcnNlLgotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJlc3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBpKyspIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0
eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5QXQo
aSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYg
aGFzVmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXNv
bHZlVmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhwcmVz
c2lvbnMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3BlcnR5
LmlkKCksIHByb3BlcnR5LnZhbHVlKCkpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVl
KQotewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGlmIChpZCAhPSBDU1NQcm9wZXJ0
eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHZhbHVlKSkgewotICAgICAgICBWZWN0
b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25zOwot
ICAgICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7Ci0gICAgYm9vbCBpc0luaGVyaXQgPSBzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlz
SW5oZXJpdGVkVmFsdWUoKTsKLSAgICBib29sIGlzSW5pdGlhbCA9IHZhbHVlLT5pc0luaXRpYWxW
YWx1ZSgpIHx8ICghc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVl
KCkpOwotCi0gICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgIWlzSW5pdGlhbCk7IC8vIGlzSW5oZXJp
dCAtPiAhaXNJbml0aWFsICYmIGlzSW5pdGlhbCAtPiAhaXNJbmhlcml0Ci0gICAgQVNTRVJUKCFp
c0luaGVyaXQgfHwgKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKSk7
IC8vIGlzSW5oZXJpdCAtPiAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxl
KCkpCi0KLSAgICBpZiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpICYmICgh
c3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIHx8ICFpc1ZhbGlkVmlzaXRl
ZExpbmtQcm9wZXJ0eShpZCkpKSB7Ci0gICAgICAgIC8vIExpbWl0IHRoZSBwcm9wZXJ0aWVzIHRo
YXQgY2FuIGJlIGFwcGxpZWQgdG8gb25seSB0aGUgb25lcyBob25vcmVkIGJ5IDp2aXNpdGVkLgot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGlzSW5oZXJpdCAmJiAhc3RhdGUucGFy
ZW50U3R5bGUoKS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSAmJiAhQ1NTUHJv
cGVydHk6OmlzSW5oZXJpdGVkUHJvcGVydHkoaWQpKQotICAgICAgICBzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5zZXRIYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpOwotCi0jaWYgRU5BQkxF
KENTU19WQVJJQUJMRVMpCi0gICAgaWYgKGlkID09IENTU1Byb3BlcnR5VmFyaWFibGUpIHsKLSAg
ICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04odmFsdWUtPmlzVmFyaWFibGVW
YWx1ZSgpKTsKLSAgICAgICAgQ1NTVmFyaWFibGVWYWx1ZSogdmFyaWFibGUgPSBzdGF0aWNfY2Fz
dDxDU1NWYXJpYWJsZVZhbHVlKj4odmFsdWUpOwotICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT5u
YW1lKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+dmFsdWUoKS5pc0Vt
cHR5KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRWYXJpYWJsZSh2YXJpYWJsZS0+bmFt
ZSgpLCB2YXJpYWJsZS0+dmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYK
LQotICAgIC8vIENoZWNrIGxvb2t1cCB0YWJsZSBmb3IgaW1wbGVtZW50YXRpb25zIGFuZCB1c2Ug
d2hlbiBhdmFpbGFibGUuCi0gICAgY29uc3QgUHJvcGVydHlIYW5kbGVyJiBoYW5kbGVyID0gbV9z
dHlsZUJ1aWxkZXIucHJvcGVydHlIYW5kbGVyKGlkKTsKLSAgICBpZiAoaGFuZGxlci5pc1ZhbGlk
KCkpIHsKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkKLSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJ
bmhlcml0VmFsdWUoaWQsIHRoaXMpOwotICAgICAgICBlbHNlIGlmIChpc0luaXRpYWwpCi0gICAg
ICAgICAgICBoYW5kbGVyLmFwcGx5SW5pdGlhbFZhbHVlKGlkLCB0aGlzKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgaGFuZGxlci5hcHBseVZhbHVlKGlkLCB0aGlzLCB2YWx1ZSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFs
dWUgPSB2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih2YWx1ZSkgOiAwOwotCi0gICAgZmxvYXQgem9vbUZhY3RvciA9IHN0YXRlLnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGxpc3QgdGhh
dCBtYXBzIHRoZSBDU1MgcHJvcGVydGllcyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZnJvbnQt
ZW5kCi0gICAgLy8gUmVuZGVyU3R5bGUgdmFsdWVzLiBTaG9ydGhhbmRzIChlLmcuIGJvcmRlciwg
YmFja2dyb3VuZCkgb2NjdXIgaW4gdGhpcyBsaXN0IGFzIHdlbGwgYW5kCi0gICAgLy8gYXJlIG9u
bHkgaGl0IHdoZW4gbWFwcGluZyAiaW5oZXJpdCIgb3IgImluaXRpYWwiIGludG8gZnJvbnQtZW5k
IHZhbHVlcy4KLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgLy8gbGlzdHMKLSAgICBjYXNlIENTU1By
b3BlcnR5Q29udGVudDoKLSAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwg
YXR0ciwgaQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2ls
bCBiZSBwb3NzaWJsZSB0byBpbmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlz
Ci0gICAgICAgICAgICAvLyBub3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhl
cml0IiBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIGlmIChpc0luaXRpYWwp
IHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghdmFs
dWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAg
ICBib29sIGRpZFNldCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAg
ICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVt
LT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRl
bS0+aXNHcmFkaWVudFZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxD
U1NHcmFkaWVudFZhbHVlKj4oaXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMp
LmdldCgpKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdl
OjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlk
U2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNpZiBFTkFCTEUoQ1NT
X0lNQUdFX1NFVCkKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRW
YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
c2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NT
SW1hZ2VTZXRWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlk
U2V0ID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAg
IGlmIChpdGVtLT5pc0ltYWdlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRDb250ZW50KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNv
bnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQ
cmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAg
ICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRW
YWx1ZS0+aXNTdHJpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRDb250ZW50KGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7
Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChjb250ZW50VmFsdWUtPmlzQXR0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBDYW4gYSBuYW1lc3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BT
RVVETykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgp
OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5wYXJlbnRTdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUXVhbGlm
aWVkTmFtZSBhdHRyKG51bGxBdG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1w
bCgpLCBudWxsQXRvbSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
dmFsdWUgPSBzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5
QXRvbSA6IHZhbHVlLmltcGwoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0
aGUgYXR0cmlidXRlIHZhbHVlIGFmZmVjdHMgdGhlIHN0eWxlCi0gICAgICAgICAgICAgICAgICAg
IG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCku
aW1wbCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3Vu
dGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29u
dGVudFZhbHVlLT5nZXRDb3VudGVyVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRUxpc3RT
dHlsZVR5cGUgbGlzdFN0eWxlVHlwZSA9IE5vbmVMaXN0U3R5bGU7Ci0gICAgICAgICAgICAgICAg
ICAgIGludCBsaXN0U3R5bGVJZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkK
LSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlz
dFN0eWxlVHlwZT4obGlzdFN0eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOwotICAgICAgICAgICAg
ICAgICAgICBPd25QdHI8Q291bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291
bnRlckNvbnRlbnQoY291bnRlclZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNv
dW50ZXJWYWx1ZS0+c2VwYXJhdG9yKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChjb3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKLSAgICAgICAgICAg
ICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlT3BlblF1b3RlOgotICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0Vf
UVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
Q1NTVmFsdWVOb09wZW5RdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldENvbnRlbnQoTk9fT1BFTl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRp
ZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVm
ZmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsgfQotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaWRT
ZXQpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgot
ICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRR
dW90ZXMoc3RhdGUucGFyZW50U3R5bGUoKS0+cXVvdGVzKCkpOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFF1b3RlcygwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgICAgICBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVl
TGlzdCogbGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKLSAgICAgICAg
ICAgIFJlZlB0cjxRdW90ZXNEYXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKLSAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikg
ewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soaSk7Ci0gICAgICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBv
dXQgb2YgYm91bmRzIHNvIHRoaXMgaXMgc2FmZS4KLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSog
c2Vjb25kID0gbGlzdC0+aXRlbShpICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQp
Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEFTU0VSVF9X
SVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOwotICAg
ICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQ
cmltaXRpdmVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOwot
ICAgICAgICAgICAgICAgIFN0cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBxdW90
ZXMtPmFkZFBhaXIoc3RkOjptYWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZSkgewotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlTm9uZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVz
RGF0YTo6Y3JlYXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udEZhbWlseTogewotICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlk
cwotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24g
cGFyZW50Rm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0
aW9uKCk7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3Rh
dGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgp
KTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2Ny
aXB0aW9uLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElz
U3BlY2lmaWVkRm9udChwYXJlbnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOwot
ICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAg
ICAgICAgICBGb250RGVzY3JpcHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsK
LSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHls
ZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0
IHRoZSBzaXplIHRvIGFjY291bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBt
b25vc3BhY2UKLSAgICAgICAgICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCi0gICAgICAgICAgICBp
ZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZp
eGVkRGVmYXVsdFNpemUoKSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3Jp
cHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBm
b250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7Ci0gICAgICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5
KCkpOwotICAgICAgICAgICAgaWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlz
RW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRp
YWxEZXNjLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCk7Ci0gICAgICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2Ny
aXB0aW9uLmZpcnN0RmFtaWx5KCk7Ci0gICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAw
OwotCi0gICAgICAgIC8vIEJlZm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3Bl
cnR5LCB3ZSBzaG91bGQgcmVzZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgotICAgICAgICBib29sIG9s
ZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVm
YXVsdFNpemUoKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAg
Q1NTVmFsdWUqIGl0ZW0gPSBpLnZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJp
bWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KGl0ZW0pOwotICAgICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7Ci0gICAgICAgICAg
ICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBp
ZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKQotICAgICAgICAgICAgICAgIGZhY2UgPSBjb250
ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5n
cykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7
Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6Ci0gICAgICAgICAgICAg
ICAgICAgIGZhY2UgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKLSAg
ICAgICAgICAgICAgICAgICAgZmFjZSA9IHNlcmlmRmFtaWx5OwotICAgICAgICAgICAgICAgICAg
ICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlm
RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVNhbnNTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJp
ZkZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkoRm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1pbHkpOwotICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKLSAgICAg
ICAgICAgICAgICAgICAgZmFjZSA9IGN1cnNpdmVGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2
ZUZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNh
c2UgQ1NTVmFsdWVGYW50YXN5OgotICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZh
bWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoRm9udERlc2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKLSAgICAgICAg
ICAgICAgICAgICAgZmFjZSA9IG1vbm9zcGFjZUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3Bh
Y2VGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlV2Via2l0UGljdG9ncmFwaDoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9
IHBpY3RvZ3JhcGhGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgaWYgKCFmYWNlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlm
ICghY3VyckZhbWlseSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBm
aXJzdCBmYW1pbHkuCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShm
YWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAv
LyBSZW1vdmUgYW55IGluaGVyaXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KLSAgICAgICAgICAg
ICAgICAgICAgY3VyckZhbWlseSA9ICZmaXJzdEZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJp
Y0ZhbWlseSgpID09IEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOwotICAgICAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBu
ZXdGYW1pbHkgPSBTaGFyZWRGb250RmFtaWx5OjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAg
ICAgbmV3RmFtaWx5LT5zZXRGYW1pbHkoZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJG
YW1pbHktPmFwcGVuZEZhbWlseShuZXdGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBjdXJy
RmFtaWx5ID0gbmV3RmFtaWx5LmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0
U2l6ZSgpIHVudGlsIGFsbCBuZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKLSAgICAg
ICAgLy8gSWYgY3VyckZhbWlseSBpcyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUg
ZmFtaWx5IG9uIHRoaXMgZGVzY3JpcHRpb24uCi0gICAgICAgIGlmIChjdXJyRmFtaWx5KSB7Ci0g
ICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2Ny
aXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0
U2l6ZSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRT
aXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRp
b24ua2V5d29yZFNpemUoKSAtIDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOwot
Ci0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAg
ICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotLy8gc2hvcnRoYW5kIHByb3BlcnRpZXMKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICAgICAgaWYgKGlzSW5pdGlhbCkgewot
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJCYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IoKSk7Ci0gICAg
ICAgIH0gZWxzZSBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5p
bmhlcml0QmFja2dyb3VuZExheWVycygqc3RhdGUucGFyZW50U3R5bGUoKS0+YmFja2dyb3VuZExh
eWVycygpKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJhY2tncm91bmRDb2xvcihz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrOgotICAgICAgICBpZiAo
aXNJbml0aWFsKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJNYXNrTGF5ZXJzKCk7
Ci0gICAgICAgIGVsc2UgaWYgKGlzSW5oZXJpdCkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PmluaGVyaXRNYXNrTGF5ZXJzKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5tYXNrTGF5ZXJzKCkpOwot
ICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6Ci0gICAgICAgIGlmIChp
c0luaGVyaXQpIHsKLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24g
PSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoc3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lmaWVk
TGluZUhlaWdodCgpKTsKLSAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsK
LSAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAg
ICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdz
ID0gZG9jdW1lbnRTZXR0aW5ncygpOwotICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8g
SWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3
YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwotICAgICAgICAgICAgaWYg
KCFzZXR0aW5ncykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpbml0aWFs
aXplRm9udFN0eWxlKHNldHRpbmdzKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1
ZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHls
ZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoMCk7Ci0KLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247
Ci0gICAgICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQocHJp
bWl0aXZlVmFsdWUtPmdldElkZW50KCksIGZvbnREZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgICAg
IC8vIERvdWJsZS1jaGVjayBhbmQgc2VlIGlmIHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElmIG5v
dCwgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBmb250LgotICAgICAgICAgICAgaWYgKGZvbnRE
ZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBz
dXJlIHRoZSByZW5kZXJpbmcgbW9kZSBhbmQgcHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1cGRh
dGVkLgotICAgICAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGlu
Z3MoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2lu
ZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBm
cmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5n
cykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsK
LSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1l
bnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFi
bGVkKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4KLSAg
ICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVk
U2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnREZXNj
cmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgp
LCB1c2VTVkdab29tUnVsZXMoKSkpOwotICAgICAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlv
bihmb250RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHZh
bHVlLT5pc0ZvbnRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBzdGF0
aWNfY2FzdDxGb250VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIWZvbnQtPnN0eWxl
IHx8ICFmb250LT52YXJpYW50IHx8ICFmb250LT53ZWlnaHQKLSAgICAgICAgICAgICAgICB8fCAh
Zm9udC0+c2l6ZSB8fCAhZm9udC0+bGluZUhlaWdodCB8fCAhZm9udC0+ZmFtaWx5KQotICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlG
b250U3R5bGUsIGZvbnQtPnN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHko
Q1NTUHJvcGVydHlGb250VmFyaWFudCwgZm9udC0+dmFyaWFudC5nZXQoKSk7Ci0gICAgICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0LmdldCgp
KTsKLSAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIg
Zm9udCBidXQgdGhleSBkb24ndCB0cnkgdG8gcmVhZCB0aGUgZm9udCdzCi0gICAgICAgICAgICAv
LyBwcm9wZXJ0aWVzIGJhY2ssIHdoaWNoIGlzIHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXplIGlz
IHVzaW5nIHRoZSAnZXgnIHVuaXQsIGl0IHdpbGwKLSAgICAgICAgICAgIC8vIG5lZWQgcXVlcnkg
dGhlIGRpcnRpZWQgZm9udCdzIHgtaGVpZ2h0IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8g
YmUgc2FmZSBpbiB0aGlzCi0gICAgICAgICAgICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0
aGUgZm9udCBub3cuCi0gICAgICAgICAgICB1cGRhdGVGb250KCk7Ci0gICAgICAgICAgICBhcHBs
eVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNpemUsIGZvbnQtPnNpemUuZ2V0KCkpOwotCi0gICAg
ICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQoKSk7
Ci0KLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmb250
LT5mYW1pbHkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIENT
UzMgUHJvcGVydGllcwotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3hTaGFkb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRv
dzogewotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQ1NT
UHJvcGVydHlUZXh0U2hhZG93KQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgp
LT5zZXRUZXh0U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSA/IGFkb3B0
UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkpKSA6
IG51bGxwdHIpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRv
dyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dE
YXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSkpIDogbnVsbHB0cik7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKGlzSW5pdGlhbCB8fCBwcmltaXRpdmVWYWx1ZSkgLy8gaW5pdGlh
bCB8IG5vbmUKLSAgICAgICAgICAgIHJldHVybiBpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cg
PyBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KG51bGxwdHIpIDogc3RhdGUuc3R5bGUoKS0+
c2V0Qm94U2hhZG93KG51bGxwdHIpOwotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0
KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAg
Q1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghY3VyclZh
bHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4oY3VyclZh
bHVlKTsKLSAgICAgICAgICAgIGludCB4ID0gaXRlbS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAg
ICAgICAgICBpbnQgeSA9IGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgp
LCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgaW50
IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAg
ICAgICAgICAgaW50IHNwcmVhZCA9IGl0ZW0tPnNwcmVhZCA/IGl0ZW0tPnNwcmVhZC0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9v
bUZhY3RvcikgOiAwOwotICAgICAgICAgICAgU2hhZG93U3R5bGUgc2hhZG93U3R5bGUgPSBpdGVt
LT5zdHlsZSAmJiBpdGVtLT5zdHlsZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluc2V0ID8gSW5z
ZXQgOiBOb3JtYWw7Ci0gICAgICAgICAgICBDb2xvciBjb2xvcjsKLSAgICAgICAgICAgIGlmIChp
dGVtLT5jb2xvcikKLSAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZh
bHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLnN0eWxl
KCkpCi0gICAgICAgICAgICAgICAgY29sb3IgPSBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotCi0g
ICAgICAgICAgICBPd25QdHI8U2hhZG93RGF0YT4gc2hhZG93RGF0YSA9IGFkb3B0UHRyKG5ldyBT
aGFkb3dEYXRhKEludFBvaW50KHgsIHkpLCBibHVyLCBzcHJlYWQsIHNoYWRvd1N0eWxlLCBpZCA9
PSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBD
b2xvcjo6dHJhbnNwYXJlbnQpKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRl
eHRTaGFkb3cpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhz
aGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRo
aXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5p
bmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRy
eQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveFJlZmxlY3Q6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwo
Ym94UmVmbGVjdCwgQm94UmVmbGVjdCkKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7Ci0g
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KFJlbmRlclN0eWxlOjppbml0
aWFsQm94UmVmbGVjdCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICghdmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NS
ZWZsZWN0VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxTdHlsZVJlZmxlY3Rpb24+IHJl
ZmxlY3Rpb24gPSBTdHlsZVJlZmxlY3Rpb246OmNyZWF0ZSgpOwotICAgICAgICByZWZsZWN0aW9u
LT5zZXREaXJlY3Rpb24oKnJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCkpOwotICAgICAgICBpZiAo
cmVmbGVjdFZhbHVlLT5vZmZzZXQoKSkKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE9mZnNl
dChyZWZsZWN0VmFsdWUtPm9mZnNldCgpLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29u
dmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24+KHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikpOwotICAgICAg
ICBOaW5lUGllY2VJbWFnZSBtYXNrOwotICAgICAgICBtYXNrLnNldE1hc2tEZWZhdWx0cygpOwot
ICAgICAgICBtX3N0eWxlTWFwLm1hcE5pbmVQaWVjZUltYWdlKGlkLCByZWZsZWN0VmFsdWUtPm1h
c2soKSwgbWFzayk7Ci0gICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2sobWFzayk7Ci0KLSAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChyZWZsZWN0aW9uLnJlbGVhc2UoKSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNyYzogLy8gT25seSB1
c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCi0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1By
b3BlcnR5VW5pY29kZVJhbmdlOiAvLyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KLSAg
ICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgotICAg
ICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb2x1
bW5SdWxlQ29sb3Ioc3RhdGUucGFyZW50U3R5bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkuaXNWYWxp
ZCgpID8gc3RhdGUucGFyZW50U3R5bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkgOiBzdGF0ZS5wYXJl
bnRTdHlsZSgpLT5jb2xvcigpKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbHVt
blJ1bGVTdHlsZShzdGF0ZS5wYXJlbnRTdHlsZSgpLT5jb2x1bW5SdWxlU3R5bGUoKSk7Ci0gICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb2x1bW5SdWxlV2lkdGgoc3RhdGUucGFyZW50U3R5
bGUoKS0+Y29sdW1uUnVsZVdpZHRoKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkK
LSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnJlc2V0Q29sdW1uUnVsZSgpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWU6Ci0gICAgICAgIGlmICgh
aXNJbmhlcml0KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlRGlyZWN0aW9uKHN0YXRlLnBhcmVudFN0eWxlKCktPm1hcnF1ZWVEaXJlY3Rpb24o
KSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoc3RhdGUucGFy
ZW50U3R5bGUoKS0+bWFycXVlZUluY3JlbWVudCgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZVNwZWVkKHN0YXRlLnBhcmVudFN0eWxlKCktPm1hcnF1ZWVTcGVlZCgpKTsKLSAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudChzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5tYXJxdWVlTG9vcENvdW50KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlQmVoYXZpb3Ioc3RhdGUucGFyZW50U3R5bGUoKS0+bWFycXVlZUJlaGF2aW9yKCkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0aW9u
OiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291bnQs
IE1hcnF1ZWVMb29wQ291bnQpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZUluZmluaXRlKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxv
b3BDb3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVhdCBmb3JldmVyLgotICAgICAgICBlbHNlIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3Bl
ZWQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVkLCBN
YXJxdWVlU3BlZWQpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIGlmIChpbnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQo
KSkgewotICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgewotICAgICAgICAgICAgY2FzZSBDU1NW
YWx1ZVNsb3c6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVk
KDUwMCk7IC8vIDUwMCBtc2VjLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRN
YXJxdWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6Ci0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBTdXBl
ciBmYXN0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9
IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1RpbWUoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50LCBD
U1NQcmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRzPigpKTsKLSAgICAgICAgZWxzZSBpZiAocHJp
bWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4KLSAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+
Z2V0SW50VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5E
X0lOSVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFycXVlZUluY3JlbWVudCkKLSAgICAgICAgaWYg
KCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Ci0gICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMSwg
Rml4ZWQpKTsgLy8gMXB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlSW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZhdWx0
LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxhcmdl
OgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVu
Z3RoKDM2LCBGaXhlZCkpOyAvLyAzNnB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVMZW5n
dGggPSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5ndGgu
aXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVl
SW5jcmVtZW50KG1hcnF1ZWVMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvY2FsZTogewotICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExvY2FsZSk7Ci0gICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRMb2NhbGUobnVsbEF0b20pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwotICAg
ICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9u
dERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxl
VG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkpOwot
ICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNpemVBZGp1c3Q6IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFNpemVBZGp1c3QsIFRleHRT
aXplQWRqdXN0KQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc2V0VGV4dFNpemVB
ZGp1c3QocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoKLSAgICB7Ci0gICAgICAgIEhBTkRM
RV9JTkhFUklUX0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lvbnMp
Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewot
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJTdHls
ZTo6bm9uZURhc2hib2FyZFJlZ2lvbnMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVlLT5n
ZXREYXNoYm9hcmRSZWdpb25WYWx1ZSgpOwotICAgICAgICBpZiAoIXJlZ2lvbikKLSAgICAgICAg
ICAgIHJldHVybjsKLQotICAgICAgICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9uOwot
ICAgICAgICB3aGlsZSAocmVnaW9uKSB7Ci0gICAgICAgICAgICBMZW5ndGggdG9wID0gY29udmVy
dFRvSW50TGVuZ3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRMZW5n
dGgocmVnaW9uLT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxl
KCkpOwotICAgICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdp
b24tPmJvdHRvbSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwot
ICAgICAgICAgICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5sZWZ0
KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICAgICAg
ICAgIGlmICh0b3AuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICB0b3AgPSBMZW5ndGgo
KTsKLSAgICAgICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAg
IHJpZ2h0ID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVkKCkp
Ci0gICAgICAgICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVm
dC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKLQotICAg
ICAgICAgICAgaWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNsZSwg
cmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJz
dCA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNSZWN0
YW5nbGUpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9u
KFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCBy
aWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwotICAg
ICAgICAgICAgcmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0KCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotCi0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSNpZiBFTkFCTEUoRFJBR0dBQkxFX1JFR0lP
TikKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVnaW9uOiB7Ci0gICAgICAgIGlmICgh
cHJpbWl0aXZlVmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25Nb2Rl
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJsZVJl
Z2lvbkRyYWcgOiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOwotICAgICAgICBzdGF0ZS5kb2N1bWVu
dCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDogewot
ICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRleHRT
dHJva2VXaWR0aCkKLSAgICAgICAgZmxvYXQgd2lkdGggPSAwOwotICAgICAgICBzd2l0Y2ggKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGluOgot
ICAgICAgICBjYXNlIENTU1ZhbHVlTWVkaXVtOgotICAgICAgICBjYXNlIENTU1ZhbHVlVGhpY2s6
IHsKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAgLyA0ODsKLSAgICAgICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKLSAgICAgICAg
ICAgICAgICByZXN1bHQgKj0gMzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlVGhpY2spCi0gICAgICAgICAgICAgICAgcmVzdWx0ICo9
IDU7Ci0gICAgICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVzdWx0
LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgd2lk
dGggPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0aCh3
aWR0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFuc2Zv
cm0sIFRyYW5zZm9ybSk7Ci0gICAgICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsK
LSAgICAgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0VHJhbnNmb3JtKG9wZXJhdGlvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZTogewotICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCi0KLSAgICAgICAg
aWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7Ci0gICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFs
dWUgPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgZWxzZSBpZiAo
cHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgIC8vIEZvciBiYWNrd2Fy
ZCBjb21wYXRpYmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KLSAgICAgICAg
ICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1pdGl2
ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+Y29t
cHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LCB6b29tRmFjdG9yKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgaWYgKHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFsdWUpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb246Ci0gICAgICAgIGlm
IChpc0luaXRpYWwpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckFuaW1hdGlvbnMo
KTsKLSAgICAgICAgZWxzZSBpZiAoaXNJbmhlcml0KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+aW5oZXJpdEFuaW1hdGlvbnMoc3RhdGUucGFyZW50U3R5bGUoKS0+YW5pbWF0aW9ucygpKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgot
ICAgICAgICBpZiAoaXNJbml0aWFsKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJU
cmFuc2l0aW9ucygpOwotICAgICAgICBlbHNlIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5pbmhlcml0VHJhbnNpdGlvbnMoc3RhdGUucGFyZW50U3R5bGUoKS0+dHJh
bnNpdGlvbnMoKSk7Ci0gICAgICAgIHJldHVybjsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogewotICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0
Q29sb3IpOwotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgQ29sb3IgY29sID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZl
VmFsdWUpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVE
X09WRVJGTE9XX1NDUk9MTElORykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dT
Y3JvbGxpbmc6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hP
dmVyZmxvd1Njcm9sbGluZywgVXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7Ci0gICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0VXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZVRvdWNoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlJbnZhbGlkOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gRGly
ZWN0aW9uYWwgcHJvcGVydGllcyBhcmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJl
UHJvcGVydHkoKSBiZWZvcmUgdGhlIHN3aXRjaC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyRW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckVuZFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3Jk
ZXJTdGFydDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRTdHlsZToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0
ZXJDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFyZ2luRW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5T
dGFydDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFyZ2luQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNv
bGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFBhZGRpbmdFbmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFy
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0JlZm9yZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0UGFkZGluZ0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRM
b2dpY2FsV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWluTG9naWNhbEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWF4TG9naWNhbFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVp
Z2h0OgotICAgIHsKLSAgICAgICAgQ1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5Ojpy
ZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9u
KCksIHN0YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBBU1NFUlQobmV3SWQg
IT0gaWQpOwotICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOwotICAg
IH0KLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVBhZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRM
aW5lVGhyb3VnaE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dE92ZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dE92ZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVy
bGluZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRV
bmRlcmxpbmVNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Rm9udFNpemVEZWx0YToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERl
Y29yYXRpb25zSW5FZmZlY3Q6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpczoKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gQ1NTIFRleHQgTGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0
aW5nIHN1cHBvcnQKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKLSAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2Rl
KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNl
dFdyaXRpbmdNb2RlKCpwcmltaXRpdmVWYWx1ZSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IEl0IGlz
IG5vdCBvayB0byBtb2RpZnkgZG9jdW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCi0g
ICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRv
Y3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQo
KS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCh0cnVlKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246
IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBU
ZXh0T3JpZW50YXRpb24pOwotCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAg
ICAgIHNldFRleHRPcmllbnRhdGlvbigqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVC
b3hDb250YWluKQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRMaW5lQm94Q29udGFpbihMaW5lQm94Q29udGFpbk5vbmUpOwotICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFp
blZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ1NTTGluZUJveENvbnRh
aW5WYWx1ZSogbGluZUJveENvbnRhaW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250
YWluVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250
YWluKGxpbmVCb3hDb250YWluVmFsdWUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgLy8gQ1NTIEZvbnRzIE1vZHVsZSBMZXZlbCAzCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEZvbnRGZWF0dXJlU2V0dGluZ3M6IHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
ICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7Ci0gICAg
ICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9u
KCkubWFrZU5vcm1hbEZlYXR1cmVTZXR0aW5ncygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0
YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGxp
c3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxG
b250RmVhdHVyZVNldHRpbmdzPiBzZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0
ZSgpOwotICAgICAgICBpbnQgbGVuID0gbGlzdC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlz
dC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKLSAgICAgICAgICAgIGlmICghaXRlbS0+aXNG
b250RmVhdHVyZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICBGb250RmVhdHVyZVZhbHVlKiBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1
ZSo+KGl0ZW0pOwotICAgICAgICAgICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0
dXJlLT50YWcoKSwgZmVhdHVyZS0+dmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRGZWF0dXJlU2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKLSAgICAg
ICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEZpbHRlcjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIs
IEZpbHRlcik7Ci0gICAgICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAg
aWYgKGNyZWF0ZUZpbHRlck9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucykpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRGaWx0ZXIob3BlcmF0aW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbnM6IHsKLSAgICAgICAgVmVjdG9y
PEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNr
TGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKLSAg
ICAgICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3Jl
YXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
U3RhcnQ6Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3Vs
ZCBiZSBhIHNob3J0aGFuZC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjog
ewotICAgICAgICBHcmlkUG9zaXRpb24gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVh
dGVHcmlkUG9zaXRpb24odmFsdWUsIHN0YXJ0UG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24p
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
RW5kOiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBlbmRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFj
cmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGVuZFBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRC
ZWZvcmU6Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3Vs
ZCBiZSBhIHNob3J0aGFuZC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvdzogewot
ICAgICAgICBHcmlkUG9zaXRpb24gYmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRl
R3JpZFBvc2l0aW9uKHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9u
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3Jp
ZEFmdGVyOiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQ
b3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBwcm9wZXJ0
aWVzIGFyZSBhbGlhc2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9w
ZXJ0eSBvbiB0aGUgcHJlZml4ZWQgdmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNp
dGlvbkRlbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5
VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gVGhlc2Ug
cHJvcGVydGllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFi
bGUuCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFJlcGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVh
dFg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRZOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckJvdHRvbUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVz
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckJvdHRvbVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZU91dHNldDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlU2xpY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckxlZnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVm
dFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclJpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFN0eWxlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJSaWdodFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5n
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyVG9wTGVmdFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyVG9wUmlnaHRSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAgICBjYXNlIENTU1By
b3BlcnR5Qm94U2l6aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Q2xlYXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUN1cnNvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlEaXNwbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlGbG9hdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUhl
aWdodDoKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJv
cGVydHlJbWFnZU9yaWVudGF0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdl
UmVuZGVyaW5nOgotI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVTT0xVVElPTikKLSAgICBjYXNlIENT
U1Byb3BlcnR5SW1hZ2VSZXNvbHV0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUxl
ZnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUxpbmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHls
ZVBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXJnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2lu
UmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRvcDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5TWF4SGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5TWluSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNv
bG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlPdXRsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93
V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dYOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlPdmVyZmxvd1k6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVBhZGRpbmdCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nUmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBh
ZGRpbmdUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlQYWdlQnJlYWtCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVh
a0luc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5UG9pbnRlckV2ZW50czoKLSAgICBjYXNlIENT
U1Byb3BlcnR5UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5UmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVNwZWFrOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUYWJsZUxheW91dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dEluZGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJmbG93OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0UmVuZGVyaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNm
b3JtOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNv
ZGVCaWRpOgotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlW
YXJpYWJsZToKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bmltYXRpb25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0
aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlvbjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRmlsbE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRBbmltYXRpb25OYW1lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25Q
bGF5U3RhdGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0
aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBlYXJhbmNlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBc3BlY3RSYXRpbzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFj
a2ZhY2VWaXNpYmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xp
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0ZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QmFja2dyb3VuZFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckZpdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
clZlcnRpY2FsU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246Ci0j
aWYgRU5BQkxFKENTU19CT1hfREVDT1JBVElPTl9CUkVBSykKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm94RGVjb3JhdGlvbkJyZWFrOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJveERpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hMaW5lczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdy
b3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmllbnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveFBhY2s6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29y
cmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Q29sdW1uQnJlYWtCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVt
bkJyZWFrSW5zaWRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uR2FwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRDb2x1bW5Qcm9ncmVzc2lvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1u
UnVsZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Q29sdW1uczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uU3Bh
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGg6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEFsaWduQ29udGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxp
Z25JdGVtczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25TZWxmOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRGbGV4OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFz
aXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZsZXhGbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
R3JvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFNocmluazoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0RmxleFdyYXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3Rp
ZnlDb250ZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPcmRlcjoKLSNpZiBFTkFCTEUo
Q1NTX1JFR0lPTlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRGbG93SW50bzoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRGb250S2VybmluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNtb290
aGluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEhpZ2hsaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0SHlwaGVuYXRlQ2hhcmFjdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBo
ZW5hdGVMaW1pdEFmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1p
dEJlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5lczoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZUFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVDbGFtcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZUdyaWQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXJxdWVlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNsaWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFza0ltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2luOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQ
b3NpdGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrUmVwZWF0WToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE5ic3BNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRQZXJzcGVjdGl2ZU9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3Rp
dmVPcmlnaW5YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6Ci0jaWYgRU5BQkxF
KENTU19SRUdJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVy
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFJlZ2lvbk92ZXJmbG93OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFJ0bE9yZGVyaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRDb21iaW5lOgotI2lmIEVOQUJMRShDU1MzX1RF
WFQpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VGV4dEFsaWduTGFzdDoKLSNlbmRpZiAvLyBDU1MzX1RFWFQKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRleHRFbXBoYXNpc1Bvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RW1waGFzaXNTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybU9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3Jp
Z2luWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VHJhbnNmb3JtU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5z
aXRpb25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9u
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VXNlckRyYWc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJN
b2RpZnk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdENsaXBQYXRoOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
V3JhcEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFdyYXBUaHJvdWdoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRzaWRlOgotI2VuZGlmCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V29yZFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdv
cmRXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVpvb206Ci0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBjYXNlIENTU1By
b3BlcnR5TWF4Wm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3JpZW50YXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgotI2Vu
ZGlmCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAg
ZGVmYXVsdDoKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0
aWVzCi0gICAgICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKLSNlbmRpZgotICAgICAg
ICByZXR1cm47Ci0gICAgfQotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2
ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQot
ewotICAgIGlmICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjYWNoZWRP
clBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2
YWx1ZSkpOwotCi0gICAgaWYgKHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAg
ICAgICBpZiAodmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGdl
bmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGll
bnRWYWx1ZSo+KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkp
OwotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBz
dGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsKLSAgICB9Ci0KLSNp
ZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgp
KQotICAgICAgICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNf
Y2FzdDxDU1NJbWFnZVNldFZhbHVlKj4odmFsdWUpKTsKLSNlbmRpZgotCi0gICAgaWYgKHZhbHVl
LT5pc0N1cnNvckltYWdlVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zy
b21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVl
KSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJl
c29sdmVyOjpjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwg
Q1NTSW1hZ2VWYWx1ZSogdmFsdWUpCi17Ci0gICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0g
dmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5p
c1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQot
Ci1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGlu
Z0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVl
KiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzUGVuZGluZygpKSB7Ci0gICAgICAgIG1fc3Rh
dGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgICAg
ICByZXR1cm4gU3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci0gICAgfQotICAgIHJl
dHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFsdWUpOwotfQotCi0jaWYgRU5BQkxF
KENTU19JTUFHRV9TRVQpCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNl
dE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZh
bHVlKiB2YWx1ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2Fj
aGVkT3JQZW5kaW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdl
LT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRp
ZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwot
fQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29y
T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdl
VmFsdWUqIHZhbHVlKQotewotICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5j
YWNoZWRPclBlbmRpbmdJbWFnZShkb2N1bWVudCgpKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2Ut
PmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGll
cygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JUZXh0U2l6ZUFkanVzdCgpCi17Ci0gICAg
UmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOwotCi0gICAgaWYgKHN0eWxlLT50
ZXh0U2l6ZUFkanVzdCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBGb250RGVzY3JpcHRpb24g
bmV3Rm9udERlc2NyaXB0aW9uKHN0eWxlLT5mb250RGVzY3JpcHRpb24oKSk7Ci0gICAgbmV3Rm9u
dERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShuZXdGb250RGVzY3JpcHRpb24uc3BlY2lmaWVk
U2l6ZSgpKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlv
bik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0
eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIGlmIChzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUt
PmZvbnREZXNjcmlwdGlvbigpOwotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRp
b24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxk
Rm9udC5zcGVjaWZpZWRTaXplKCkpOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3
Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVy
aWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUpCi17Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9u
dERlc2NyaXB0aW9uKCk7Ci0KLSAgICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwg
IXBhcmVudFN0eWxlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRp
b24mIHBhcmVudEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYg
KGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZvciBub3csIGx1bXAgYWxs
IGZhbWlsaWVzIGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCi0gICAgaWYgKGNoaWxkRm9udC5nZW5l
cmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKLSAgICAgICAg
JiYgcGFyZW50Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3Bh
Y2VGYW1pbHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBp
cyBtb25vc3BhY2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAotICAg
IC8vIHNpemUgd2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUg
YXMgYXBwcm9wcmlhdGUuCi0gICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwg
dGhlbiB3ZSByZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFuCi0gICAgLy8gbXVsdGlw
bHlpbmcgYnkgb3VyIHNjYWxlIGZhY3Rvci4KLSAgICBmbG9hdCBzaXplOwotICAgIGlmIChjaGls
ZEZvbnQua2V5d29yZFNpemUoKSkKLSAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChk
b2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEs
IGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpOwotICAgIGVsc2UgewotICAgICAgICBT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgIGZsb2F0IGZp
eGVkU2NhbGVGYWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRT
aXplKCkgJiYgc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQotICAgICAgICAgICAgPyBzdGF0
aWNfY2FzdDxmbG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGlu
Z3MtPmRlZmF1bHRGb250U2l6ZSgpCi0gICAgICAgICAgICA6IDE7Ci0gICAgICAgIHNpemUgPSBw
YXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/Ci0gICAgICAgICAgICAgICAgY2hpbGRG
b250LnNwZWNpZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgotICAgICAgICAgICAgICAg
IGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOwotICAgIH0KLQot
ICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBz
ZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOwotICAgIHN0eWxlLT5zZXRGb250
RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
Ojppbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykKLXsKLSAgICBGb250RGVz
Y3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmlj
RmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwotICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAg
ICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmco
KSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygp
LT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKLSAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5
KHN0YW5kYXJkRm9udEZhbWlseSk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWls
eSgpLmFwcGVuZEZhbWlseSgwKTsKLSAgICB9Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdv
cmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgc2V0Rm9u
dFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NT
VmFsdWVNZWRpdW0sIGZhbHNlKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0
KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLSAgICBtX3N0YXRlLnNldExpbmVI
ZWlnaHRWYWx1ZSgwKTsKLSAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZv
bnREZXNjcmlwdGlvbiwgZmxvYXQgc2l6ZSkKLXsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U3Bl
Y2lmaWVkU2l6ZShzaXplKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdl
dENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUo
KSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxl
cygpKSk7Ci19Ci0KLWZsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVj
aWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlz
QWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykK
LXsKLSAgICBmbG9hdCB6b29tRmFjdG9yID0gMS4wZjsKLSAgICBpZiAoIXVzZVNWR1pvb21SdWxl
cykgewotICAgICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICAg
ICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQotICAgICAgICAgICAgem9v
bUZhY3RvciAqPSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
U3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQs
IHpvb21GYWN0b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKLX0KLQotZmxvYXQg
U3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQq
IGRvY3VtZW50LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBz
cGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9y
Rm9udFNpemUpCi17Ci0gICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90
IGJlIHZpc2libGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQotICAgIC8vIGV4ZW1wdCBmcm9t
IG1pbmltdW0gZm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwt
cGVyZmVjdAotICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBv
dGhlciBicm93c2VycyB0aGF0IGhhdmUgbWluaW11bQotICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5n
cyAoZS5nLiBGaXJlZm94KS4KLSAgICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51
bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQotICAgICAgICByZXR1cm4gMC4wZjsKLQot
ICAgIC8vIFdlIHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmly
c3QgaXMgYSBoYXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bwotICAgIC8vIGFsbCBmb250cy4g
VGhpcyBpcyAibWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBp
cyBhICJzbWFydCBtaW5pbXVtIgotICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhl
IFdlYiBwYWdlIGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4s
Ci0gICAgLy8gd2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJl
c3NlcyB0aGUgZm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgotICAgIC8vIHRoZSB1c2VyJ3Mg
ZGVmYXVsdCBmb250IHNldHRpbmcuCi0KLSAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3
ZSBuZXZlciB3YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRv
IGtlZXAgZm9udHMgcmVhZGFibGUuCi0gICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhl
IHBhZ2UgdG8gc2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAotICAg
IC8vIHNpbmNlIHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93
d3cuZ2FtZXNwb3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCi0KLSAgICBTZXR0aW5ncyogc2V0
dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAg
ICByZXR1cm4gMS4wZjsKLQotICAgIGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250
U2l6ZSgpOwotICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNh
bEZvbnRTaXplKCk7Ci0gICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29t
RmFjdG9yOwotCi0gICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBh
cHBseSB0aGUgaGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNt
YWxsLgotICAgIGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKLSAgICAgICAgem9vbWVkU2l6ZSA9
IG1pblNpemU7Ci0KLSAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBt
aW5pbXVtIGlzIGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAotICAg
IC8vIGFmdGVyIHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUg
dG8gdGhlIHVzZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQotICAgIC8vIG11c3QgaGF2
ZSBiZWVuIGFjY2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFy
dCBtaW5pbXVtIHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCi0gICAgLy8gZG9pbmcgc28gd29uJ3Qg
ZGlzcnVwdCB0aGUgbGF5b3V0LgotICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAm
JiB6b29tZWRTaXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9n
aWNhbFNpemUgfHwgIWlzQWJzb2x1dGVTaXplKSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxv
Z2ljYWxTaXplOwotCi0gICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0
byBwcmV2ZW50IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlv
dXMKLSAgICAvLyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCi0gICAg
cmV0dXJuIG1pbihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKLX0KLQotY29u
c3QgaW50IGZvbnRTaXplVGFibGVNYXggPSAxNjsKLWNvbnN0IGludCBmb250U2l6ZVRhYmxlTWlu
ID0gOTsKLWNvbnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKLQotLy8gV2luSUUvTmF2NCB0YWJs
ZSBmb3IgZm9udCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBp
bmcgc3lzdGVtIG9mIEhUTUwuCi1zdGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVb
Zm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9
Ci17Ci0gICAgICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwg
ICAgMjggfSwKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAg
IDIwLCAgICAzMSB9LAotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAx
NywgICAgMjIsICAgIDM0IH0sCi0gICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQs
ICAgIDE4LCAgICAyNCwgICAgMzcgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAg
ICAxNiwgICAgMjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQot
ICAgICAgeyA5LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQy
IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwg
ICAgNDUgfSwKLSAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAg
IDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQotfTsKLS8vIEhU
TUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNwotLy8g
Q1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCi0vLyAgICAg
ICAgICAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVm
Ci0KLS8vIFN0cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0
aW5ncyBleGFjdGx5Lgotc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRT
aXplVGFibGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQotewot
ICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3
IH0sCi0gICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwg
ICAgMzAgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAg
IDIyLCAgICAzMyB9LAotICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAx
OCwgICAgMjQsICAgIDM2IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYs
ICAgIDIwLCAgICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKLSAgICAg
IHsgOSwgICAxMCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAot
ICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1
IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwg
ICAgNDggfSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBIVE1MICAg
ICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8vIENTUyAg
eHhzICAgeHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAgICAgICAg
ICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgotCi0v
LyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQg
RmFocm5lcidzIHN1Z2dlc3RlZCBzY2FsZQotLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZh
bHVlLgotc3RhdGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9
IHsgMC42MGYsIDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9Owot
Ci1mbG9hdCBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3Vt
ZW50LCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAg
IFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0
dGluZ3MpCi0gICAgICAgIHJldHVybiAxLjBmOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9j
dW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4
ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGlu
Z3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFi
bGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIC8vIExv
b2sgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZS4KLSAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNp
emUgLSBmb250U2l6ZVRhYmxlTWluOwotICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NW
YWx1ZVh4U21hbGwpOwotICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXpl
VGFibGVbcm93XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07Ci0gICAgfQot
Ci0gICAgLy8gVmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0
aGUgc2NhbGUgZmFjdG9yIGluc3RlYWQuCi0gICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgo
c2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7Ci0gICAgcmV0dXJuIG1heChm
b250U2l6ZUZhY3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWlu
TG9naWNhbFNpemUpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGludCBmaW5k
TmVhcmVzdExlZ2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwg
aW50IG11bHRpcGxpZXIpCi17Ci0gICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21h
bGwgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KLSAgICBmb3Ig
KGludCBpID0gMTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKHBp
eGVsRm9udFNpemUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIp
Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIHRvdGFsS2V5d29yZHMg
LSAxOwotfQotCi1pbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRv
Y3VtZW50LCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXpl
KQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAg
IGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgYm9vbCBxdWlya3NNb2Rl
ID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxk
VXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDog
c2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRT
aXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAg
IGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAgcmV0dXJu
IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2Rl
ID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAx
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4o
cGl4ZWxGb250U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXplKTsKLX0KLQotc3RhdGlj
IENvbG9yIGNvbG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCi17Ci0gICAgc3RydWN0IENv
bG9yVmFsdWUgewotICAgICAgICBpbnQgY3NzVmFsdWVJZDsKLSAgICAgICAgUkdCQTMyIGNvbG9y
OwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0g
ewotICAgICAgICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAotICAgICAgICB7IENTU1Zh
bHVlQmxhY2ssIDB4RkYwMDAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAw
RkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZUdyYXksIDB4RkY4MDgwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAw
eEZGMDA4MDAwICB9LAotICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAotICAg
ICAgICB7IENTU1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTWFy
b29uLCAweEZGODAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0s
Ci0gICAgICAgIHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZU9yYW5nZSwgMHhGRkZGQTUwMCB9LAotICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZG
ODAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAotICAgICAgICB7IENTU1ZhbHVlVGVhbCwg
MHhGRjAwODA4MCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAw
IH0sCi0gICAgICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAotICAgICAgICB7IENT
U1ZhbHVlWWVsbG93LCAweEZGRkZGRjAwIH0sCi0gICAgICAgIHsgMCwgMCB9Ci0gICAgfTsKLQot
ICAgIGZvciAoY29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFs
dWVJZDsgKytjb2wpIHsKLSAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlk
KQotICAgICAgICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7Ci0gICAgfQotICAgIHJldHVybiBSZW5k
ZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwotfQotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVs
ZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlKQotewotICAgIGludCBpZGVudCA9IHZhbHVl
LT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIENTU1ZhbHVlV2Vi
a2l0VGV4dDoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKLSAgICBjYXNlIENTU1ZhbHVl
V2Via2l0QWN0aXZlbGluazoKLSAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotfQotCi1Db2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQ
cmltaXRpdmVWYWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Ci17Ci0gICAg
aWYgKHZhbHVlLT5pc1JHQkNvbG9yKCkpCi0gICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0
UkdCQTMyVmFsdWUoKSk7Ci0KLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAg
IGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAg
ICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJr
aXRUZXh0OgotICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7Ci0g
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6Ci0gICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVu
dCgpLT5pc0xpbmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNp
dGVkTGlua0NvbG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKLSAgICBjYXNl
IENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50
KCktPmFjdGl2ZUxpbmtDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdD
b2xvcjoKLSAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOwotICAg
IGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgp
LT5jb2xvcigpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVl
KGlkZW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBl
bmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVz
dWx0KQotewotICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQo
YWRvcHRQdHIobmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKLX0KLQotYm9v
bCBTdHlsZVJlc29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAotewotICAg
IHVuc2lnbmVkIHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLSAgICAgICAgaWYgKG1f
bWVkaXVtLT5ldmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1f
ZXhwcmVzc2lvbikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5t
X3Jlc3VsdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXN0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJh
bnNmb3JtT3BlcmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpTQ0FMRTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpT
Y2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxF
X1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOwotICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9u
OjpTQ0FMRV8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsK
LSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKLSAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKLSAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6VFJBTlNMQVRFXzNEOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9U
QVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOwotICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246OlJPVEFURV9aOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVf
M0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKLSAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6U0tFV19YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNr
ZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7
Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7Ci0gICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJh
dGlvbjo6UEVSU1BFQ1RJVkU7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5r
bm93blRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsK
LSAgICB9Ci0gICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLX0KLQotYm9vbCBT
dHlsZVJlc29sdmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVl
LCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9w
ZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVl
LT5pc1ZhbHVlTGlzdCgpKSB7Ci0gICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/
IHN0eWxlLT5lZmZlY3RpdmVab29tKCkgOiAxOwotICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3Bl
cmF0aW9uczsKLSAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhh
c01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGku
dmFsdWUoKTsKLQotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWUqIHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWUqPihpLnZhbHVlKCkpOwotICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2
ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAg
ICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaGF2ZU5vblBy
aW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLQotICAgICAgICBzd2l0
Y2ggKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0
aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUg
c3kgPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQot
ICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91Ymxl
VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5
cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9u
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vj
b25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3Vi
bGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBk
b3VibGUgc3ogPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0
aW9uKQotICAgICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0g
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAg
ICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkg
IT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgewot
ICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgewot
ICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3Vi
bGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN5ID0gc3g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0
aW9uOjpjcmVhdGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNm
b3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5n
dGggdHggPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3Ro
KDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0
aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1
ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxl
LCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxl
LCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHguaXNVbmRlZmlu
ZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJh
bnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsK
LSAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBM
ZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVu
Z3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3Bl
cmF0aW9uKQotICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0g
Y29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZh
Y3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRU
b0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwot
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9G
bG9hdExlbmd0aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9v
dFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkg
fHwgdHkuaXNVbmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRy
YW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91
YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZSgwLCAwLCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9w
ZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRy
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIHggPSAwOwot
ICAgICAgICAgICAgZG91YmxlIHkgPSAwOwotICAgICAgICAgICAgZG91YmxlIHogPSAwOwotICAg
ICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLQot
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAg
ICAgICAgeCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3Bl
cmF0aW9uKQotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgIHogPSAxOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRU
cmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEpKTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygyKSk7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDMpKTsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdl
dERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+
Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFw
cGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0
VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0g
ICAgICAgICAgICBkb3VibGUgYW5nbGVYID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkg
PSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3Jl
ZXMoKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICBhbmdsZVkgPSBhbmdsZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgICAgIGFuZ2xlWCA9IGFuZ2xlOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNm
b3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGFuZ2xlWSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZShhbmdsZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3Bl
cmF0aW9uOiB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxKSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMikpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0g
em9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAg
ICAgICAgZG91YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0
cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmICh0cmFu
c2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCAxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0
RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFs
dWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDYpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEw
KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVl
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMTMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsK
LSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5z
Zm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1hdHJpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVU
cmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZp
eGVkKTsKLSAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAg
ICAgICAgIHAgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8v
IFRoaXMgaXMgYSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBh
cmUgZmluYWxpemVkLgotICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5n
ZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChj
bGFtcFRvUG9zaXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
I2lmIEVOQUJMRShDU1NfRklMVEVSUykKLXN0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlv
blR5cGUgZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVy
T3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6R1JBWVNDQUxFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlh
RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsK
LSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoK
LSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7Ci0gICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1
cm4gRmlsdGVyT3BlcmF0aW9uOjpIVUVfUk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJh
dGlvbjo6SU5WRVJUOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0
ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoK
LSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKLSAgICBjYXNlIFdl
YktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6Q09OVFJBU1Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlv
bjo6QkxVUjsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVy
T3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsK
LSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpD
VVNUT007Ci0jZW5kaWYKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmls
dGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotICAg
IH0KLSAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotfQotCi0jaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGlu
Z1NWR0RvY3VtZW50cygpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAo
IXN0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMo
KS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVy
KiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNl
TG9hZGVyKCk7Ci0gICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9w
ZXJhdGlvbnMgPSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytp
KSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZp
bHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9w
ZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewotICAgICAgICAg
ICAgUmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2Fz
dDxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotCi0g
ICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRp
bmdTVkdEb2N1bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKLSAgICAgICAgICAg
IGlmICghdmFsdWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDYWNo
ZWRTVkdEb2N1bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJj
ZUxvYWRlcik7Ci0gICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50KQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1l
bnQgb24gdGhlIHJlZmVyZW5jZSBmaWx0ZXIuCi0gICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXIt
PnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1
bWVudFJlZmVyZW5jZShjYWNoZWREb2N1bWVudCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBz
dGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKLX0KLSNlbmRpZgotCi0jaWYgRU5B
QkxFKENTU19TSEFERVJTKQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVy
KENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFs
dWUoKSkKLSAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVl
KHN0YXRpY19jYXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUpKTsKLSAgICByZXR1cm4g
MDsKLX0KLQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxl
U2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBTdHls
ZVNoYWRlciogc2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOwotICAgIGlm
IChzaGFkZXIgJiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKLSAgICAgICAgbV9zdGF0ZS5z
ZXRIYXNQZW5kaW5nU2hhZGVycyh0cnVlKTsKLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi12b2lk
IFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCi17Ci0gICAgaWYgKCFtX3N0YXRl
LnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJj
ZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQot
ICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0g
bV9zdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAg
ICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJh
dGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5
cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgewotICAgICAgICAgICAgQ3VzdG9tRmls
dGVyT3BlcmF0aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVy
YXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotICAgICAgICAgICAgQVNTRVJUKGN1c3Rv
bUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3Jh
bSogcHJvZ3JhbSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3Rv
bUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFk
ZXIoKSAmJiBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKLSAg
ICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNf
Y2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1No
YWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNo
YWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dy
YW0tPmZyYWdtZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAg
ICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQ
ZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVl
KCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFs
dWUtPmNhY2hlZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2Up
OwotfQotCi1zdGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3Qg
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0
ZXJQYXJhbWV0ZXI+JiBiKQotewotICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4o
YS0+bmFtZSgpLCBiLT5uYW1lKCkpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25z
dCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxDdXN0
b21GaWx0ZXJBcnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJh
eVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0
aCA9IHZhbHVlcy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBDU1NWYWx1
ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlm
ICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmlt
aXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5UGFyYW1ldGVy
LnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxl
UmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYg
bmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlck51
bWJlclBhcmFtZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1l
dGVyOjpjcmVhdGUobmFtZSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+
bGVuZ3RoKCk7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFs
dWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsK
LSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0
aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbnVt
YmVyUGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7
Ci0gICAgfQotICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNz
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21G
aWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3Qq
IHZhbHVlcykKLXsKLSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0
cmFuc2Zvcm1QYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0
ZShuYW1lKTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgY3JlYXRl
VHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwotICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0
T3BlcmF0aW9ucyhvcGVyYXRpb25zKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJl
bGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVz
b2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWUqIHBhcmFtZXRlclZhbHVlKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIg
cGFyYW1ldGVycyB0eXBlcyBwYXJzaW5nLgotICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKLSAgICAvLyB0ZXh0dXJlczogaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCi0gICAgLy8gbWF0MiwgbWF0
MywgbWF0NDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0Ci0g
ICAgLy8gTnVtYmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0
IGFuZCBhbGwKLSAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20g
Q1NTVmFsdWVMaXN0LgotICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2Fz
dDxDU1NWYWx1ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7Ci0gICAgaWYgKCF2YWx1ZXMtPmxlbmd0
aCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJL
aXRDU1NBcnJheUZ1bmN0aW9uVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmls
dGVyQXJyYXlQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIElmIHRoZSBmaXJzdCB2
YWx1ZSBvZiB0aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwKLSAgICAvLyB0aGVuIHdl
IGNvdWxkIHNhZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcwotICAgIC8v
IGFyZSB0cmFuc2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxs
Ci0gICAgLy8gcmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KLSAgICBp
ZiAodmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9y
bVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFt
ZXRlcihuYW1lLCB2YWx1ZXMpOwotCi0gICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2Yg
Ym9vbGVhbnMgb3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0
d2VlbiB0aG9zZSB0d28uCi0gICAgLy8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xl
YW5zIG9yIGFsbCBudW1iZXJzKS4KLSAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQotICAg
ICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRp
dmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDApKTsKLSAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0
aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICByZXR1
cm4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCi0g
ICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4Ci0KLSAg
ICByZXR1cm4gMDsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBh
cmFtZXRlckxpc3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1l
dGVyTGlzdCYgcGFyYW1ldGVyTGlzdCkKLXsKLSAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJh
bWV0ZXJOYW1lczsKLSAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihw
YXJhbWV0ZXJzVmFsdWUpOwotICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7
IHBhcmFtZXRlckl0ZXJhdG9yLmFkdmFuY2UoKSkgewotICAgICAgICBpZiAoIXBhcmFtZXRlckl0
ZXJhdG9yLnZhbHVlKCktPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9y
LnZhbHVlKCkpOwotICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1p
dGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1
ZSgpKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NT
UHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdW
YWx1ZSgpOwotICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1l
cy4KLSAgICAgICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5h
bWUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAKLSAg
ICAgICAgaWYgKCFpdGVyYXRvci5oYXNNb3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0
ZXIgPSBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsK
LSAgICAgICAgaWYgKCFwYXJhbWV0ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIHBhcmFtZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOwotICAgIH0KLSAg
ICAKLSAgICAvLyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2lu
ZyB0aGVtIGRvd24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4KLSAgICBzdGQ6OnNvcnQo
cGFyYW1ldGVyTGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVy
c0J5TmFtZUNvbXBhcmF0b3IpOwotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1QYXNzUmVm
UHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmls
dGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1
ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0
aW9uIGZvciB0aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCi0gICAg
VU5VU0VEX1BBUkFNKGZpbHRlclZhbHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0
cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRl
ck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZh
bHVlKQotewotICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygwKTsKLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElP
TihzaGFkZXJzVmFsdWUtPmlzVmFsdWVMaXN0KCkpOwotICAgIENTU1ZhbHVlTGlzdCogc2hhZGVy
c0xpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOwotCi0gICAg
dW5zaWduZWQgc2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7Ci0gICAg
QVNTRVJUKHNoYWRlcnNMaXN0TGVuZ3RoKTsKLQotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVy
dGV4U2hhZGVyID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMCkpOwotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7Ci0gICAgQ3Vz
dG9tRmlsdGVyUHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VM
RU1FTlRfVEVYVFVSRTsKLSAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0
dGluZ3M7Ci0KLSAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7Ci0gICAgICAgIENTU1Zh
bHVlKiBmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxKTsKLQotICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0
aW9uLT5pc1dlYktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgewotICAgICAgICAgICAgV2ViS2l0
Q1NTTWl4RnVuY3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NN
aXhGdW5jdGlvblZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKLSAgICAgICAg
ICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKLQotICAgICAg
ICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBmcmFnbWVu
dFNoYWRlciA9IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaXRl
cmF0b3IuYWR2YW5jZSgpOwotCi0gICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0
aCgpIDw9IDMpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgewotICAg
ICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAg
ICAgaWYgKENTU1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkp
KQotICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZl
VmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9w
ZXJhdG9yKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAgICAgICAg
bWl4U2V0dGluZ3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19F
TEVNRU5UX1RFWFRVUkU7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVy
KGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0g
ICAgdW5zaWduZWQgbWVzaFJvd3MgPSAxOwotICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsK
LSAgICBDdXN0b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7Ci0g
ICAgCi0gICAgQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7Ci0gICAgCi0gICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aXRlcmF0b3IoZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAg
ICAKLSAgICAgICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3Ig
dGhlIGxpc3Qgb2YgcGFyYW1ldGVyczoKLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBu
dW1iZXIgb3IgYW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKLSAgICAgICAg
Ly8gdGhlIG1lc2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVy
cyBsaXN0LgotCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQ
cmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0
aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVl
KCkpOwotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0
IHdpbGwgc2V0IGJvdGgKLSAgICAgICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVt
bnMuCi0gICAgICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZh
bHVlLT5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsK
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhl
ciBudW1iZXIgZm9yIHRoZSByb3dzLgotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNN
b3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
bWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkp
IHsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAg
ICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgewot
ICAgICAgICAgICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKLSAgICAgICAgICAg
ICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgewotICAgICAgICAgICAgLy8gSWYg
bm8gdmFsdWUgd2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVz
dCBhIHBhcmFtZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVwCi0gICAgICAgICAgICAv
LyBoYXZpbmcganVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0
IG9mIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID09IDIpOwotICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKLSAgICAgICAgcGFy
YW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7Ci0g
ICAgCi0gICAgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OwotICAgIGlm
IChwYXJhbWV0ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJh
bWV0ZXJzVmFsdWUsIHBhcmFtZXRlckxpc3QpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAg
ICBSZWZQdHI8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21G
aWx0ZXJQcm9ncmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFk
ZXIucmVsZWFzZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKLSAgICBy
ZXR1cm4gQ3VzdG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBh
cmFtZXRlckxpc3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOwotfQotCi1QYXNz
UmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAg
ICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKLSAgICBib29sIGlzQXRSdWxlUmVmZXJl
bmNlU3ludGF4ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJp
bWl0aXZlVmFsdWUoKTsKLSAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVh
dGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZh
bHVlKSA6IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVy
VmFsdWUpOwotfQotCi0jZW5kaWYKLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJP
cGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0
eWxlKiByb290U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAg
QVNTRVJUKG91dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKLSAgICAKLSAgICBpZiAoIWluVmFsdWUp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7Ci0gICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUg
PyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpIDogMTsKLSAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJh
dGlvbnM7Ci0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNN
b3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZh
bHVlKCk7Ci0gICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSog
ZmlsdGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUo
KSk7Ci0gICAgICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBl
ID0gZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsK
LQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0g
RmlsdGVyT3BlcmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAvLyBWYWxp
ZGF0ZWRDdXN0b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0
aGUgUmVuZGVyU3R5bGUuCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09
IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmls
dGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmls
dGVyVmFsdWUpOwotICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJh
dGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9u
OjpSRUZFUkVOQ0UpIHsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAgICAgaWYgKGZpbHRlclZh
bHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgQ1NTVmFsdWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMCk7Ci0KLSAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1l
bnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBXZWJL
aXRDU1NTVkdEb2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2Vi
S2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKLSAgICAgICAgICAgIEtVUkwgdXJs
ID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwo
KSk7Ci0KLSAgICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJh
dGlvbiA9IFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUt
PnVybCgpLCB1cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOwotICAgICAg
ICAgICAgaWYgKFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1
bWVudFZhbHVlLT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgewotICAgICAgICAgICAgICAg
IGlmICghc3ZnRG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAg
ICAgICBtX3N0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBz
dmdEb2N1bWVudFZhbHVlKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZh
bHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24t
PnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1
bWVudFJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5k
KG9wZXJhdGlvbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVl
cywgd2l0aCB0aGUKLSAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhh
cyBhIFNoYWRvd1ZhbHVlIHBhcmFtZXRlci4KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0g
RmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVykgewotICAgICAgICAgICAgYm9vbCBoYXZlTm9u
UHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7
IGogPCBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgICAgIGlmICgh
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUo
KSkgewotICAgICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZp
cnN0VmFsdWUgPSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7Ci0g
ICAgICAgIHN3aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgewotICAgICAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAg
ICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjog
ewotICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5p
c1BlcmNlbnRhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJh
c2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5
cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAg
ZG91YmxlIGFuZ2xlID0gMDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkg
PT0gMSkKLSAgICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVz
KCk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0Nv
bG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAg
ICAgIGRvdWJsZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKLSAg
ICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAg
ICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAg
ICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQotICAgICAgICAgICAgICAgICAgICBh
bW91bnQgLz0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6
Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJh
dGlvbjogewotICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhl
ZCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCi0gICAgICAg
ICAgICAgICAgc3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwg
c3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBpZiAoc3RkRGV2aWF0
aW9uLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlv
bjo6Y3JlYXRlKHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNo
YWRvd0ZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAg
Q1NTVmFsdWUqIGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MCk7Ci0gICAgICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3Rh
dGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7Ci0gICAgICAgICAgICBJbnRQb2ludCBs
b2NhdGlvbihpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3RvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRl
TGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikpOwotICAgICAgICAgICAg
aW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0
eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAgICAgIENvbG9yIGNvbG9y
OwotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQotICAgICAgICAgICAgICAgIGNvbG9yID0g
Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOwotCi0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlv
bjo6Y3JlYXRlKGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9y
Ojp0cmFuc3BhcmVudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9w
ZXJhdGlvbjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVy
YXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLVBh
c3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHls
ZVBlbmRpbmdJbWFnZSogcGVuZGluZ0ltYWdlKQotewotICAgIENhY2hlZFJlc291cmNlTG9hZGVy
KiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3Vy
Y2VMb2FkZXIoKTsKLQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgewot
ICAgICAgICBDU1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFn
ZVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRS
ZXNvdXJjZUxvYWRlcik7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VH
ZW5lcmF0b3JWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdl
R2VuZXJhdG9yVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsK
LSAgICAgICAgaW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJj
ZUxvYWRlcik7Ci0gICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1h
Z2VHZW5lcmF0b3JWYWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vy
c29ySW1hZ2VWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvcklt
YWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKLSAgICAgICAg
cmV0dXJuIGN1cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVy
KTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAocGVuZGluZ0lt
YWdlLT5jc3NJbWFnZVNldFZhbHVlKCkpIHsKLSAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1h
Z2VTZXRWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOwotICAgICAgICBy
ZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIp
OwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6bG9hZFBlbmRpbmdJbWFnZXMoKQotewotICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVBy
b3BlcnRpZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBlbmRpbmdJbWFn
ZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKS5lbmQoKS5rZXlzKCk7Ci0gICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9w
ZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVBy
b3BlcnRpZXMoKS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIENT
U1Byb3BlcnR5SUQgY3VycmVudFByb3BlcnR5ID0gKml0OwotCi0gICAgICAgIHN3aXRjaCAoY3Vy
cmVudFByb3BlcnR5KSB7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6
IHsKLSAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRl
LnN0eWxlKCktPmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNr
Z3JvdW5kTGF5ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgewotICAgICAgICAgICAgICAg
IGlmIChiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgp
LT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXIt
PnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2Uq
PihiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogewot
ICAgICAgICAgICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENv
bnRlbnREYXRhKj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7
IGNvbnRlbnREYXRhID0gY29udGVudERhdGEtPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlm
IChjb250ZW50RGF0YS0+aXNJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0eWxlSW1h
Z2UqIGltYWdlID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+
aW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1h
Z2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1h
Z2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVu
dERhdGEpLT5zZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogewotICAgICAg
ICAgICAgaWYgKEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNv
cnMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlz
dC0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVu
dEN1cnNvciA9IGN1cnNvckxpc3QtPmF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoU3R5
bGVJbWFnZSogaW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGlj
X2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogewotICAg
ICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRl
LnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAg
ICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdl
KHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5
bGVJbWFnZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0
ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVy
SW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRl
LnN0eWxlKCktPnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nh
c3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNl
KCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm94UmVmbGVjdDogewotICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlv
biogcmVmbGVjdGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7Ci0gICAgICAg
ICAgICAgICAgY29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1h
c2soKTsKLSAgICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdl
LmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmUHRy
PFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxT
dHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIHJlZmxlY3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFz
ZSgpLCBtYXNrSW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdl
LmJvcmRlclNsaWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFs
UnVsZSgpLCBtYXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAo
bV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCkt
Pm1hc2tCb3hJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAg
IG1fc3RhdGUuc3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uo
c3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJ
bWFnZVNvdXJjZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogewotICAgICAgICAgICAgZm9yIChGaWxs
TGF5ZXIqIG1hc2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBt
YXNrTGF5ZXI7IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKG1hc2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGlu
Z0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBl
bmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1h
Z2UoKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFy
KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQotewot
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAg
ICBsb2FkUGVuZGluZ0ltYWdlcygpOwotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIC8v
IFN0YXJ0IGxvYWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAg
IGxvYWRQZW5kaW5nU2hhZGVycygpOwotI2VuZGlmCi0gICAgCi0jaWYgRU5BQkxFKENTU19GSUxU
RVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVu
dHMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRz
KCk7Ci0jZW5kaWYKLX0KLQotaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVz
OjpNYXRjaGVkUHJvcGVydGllcygpCi0gICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQotewot
fQotCi1pbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJv
cGVydGllcygpCi17Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6
OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNv
bnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywg
V2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMs
ICJwcm9wZXJ0aWVzIik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZUl0ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9i
amVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0
SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVy
KG1hdGNoZWRQcm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsKLSAgICBpbmZvLmFkZE1l
bWJlcihyYW5nZXMsICJyYW5nZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwg
InJlbmRlclN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJw
YXJlbnRSZW5kZXJTdHlsZSIpOwotfQotCi12b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0g
ICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1l
bW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJl
c3Npb24iKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNz
SW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NT
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKLSAgICBpbmZv
LmFkZE1lbWJlcihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3
ZWVwVGltZXIsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciIpOwotCi0gICAgaW5m
by5hZGRNZW1iZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Jv
b3REZWZhdWx0U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIo
bV9kb2N1bWVudCwgImRvY3VtZW50Iik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxl
Y3RvciwgImZvbnRTZWxlY3RvciIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBl
bmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3Vs
dHMiKTsKLSAgICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7Ci0gICAgaW5mby5h
ZGRNZW1iZXIobV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKLSAgICBpbmZvLmFkZE1lbWJlciht
X3Njb3BlUmVzb2x2ZXIsICJzY29wZVJlc29sdmVyIik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlciht
X3N0YXRlLCAic3RhdGUiKTsKLQotICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3
aGVyZSBpdCB3b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPwotICAgIGluZm8uYWRkTWVtYmVyKENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUs
ICJkZWZhdWx0UXVpcmtzU3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOwotICAgIGlu
Zm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHls
ZSwgImRlZmF1bHRWaWV3U291cmNlU3R5bGUiKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgJKHJldmlzaW9uIDE0
NDg5MykJKGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaDoxNDQ4OTMpCisr
KyBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDcwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChr
bm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAy
MDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgor
ICovCisKKyNpZm5kZWYgU3R5bGVSZXNvbHZlcl9oCisjZGVmaW5lIFN0eWxlUmVzb2x2ZXJfaAor
CisjaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKKyNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgor
I2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuaCIKKyNpbmNsdWRlICJMaW5rSGFzaC5o
IgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgor
I2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmgiCisjaW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1ZGUg
IlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgorI2lu
Y2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgorI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCisj
aW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCisjaW5jbHVkZSAiU3R5bGVTY29wZVJlc29s
dmVyLmgiCisjaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCisjaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3VtZW50
VmFsdWUuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworZW51bSBFU21h
cnRNaW5pbXVtRm9yRm9udFNpemUgeyBEb05vdFVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplLCBV
c2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSB9OworCitjbGFzcyBDU1NDdXJzb3JJbWFnZVZhbHVl
OworY2xhc3MgQ1NTRm9udFNlbGVjdG9yOworY2xhc3MgQ1NTRm9udEZhY2U7CitjbGFzcyBDU1NG
b250RmFjZVJ1bGU7CitjbGFzcyBDU1NJbWFnZUdlbmVyYXRvclZhbHVlOworY2xhc3MgQ1NTSW1h
Z2VTZXRWYWx1ZTsKK2NsYXNzIENTU0ltYWdlVmFsdWU7CitjbGFzcyBDU1NQYWdlUnVsZTsKK2Ns
YXNzIENTU1ByaW1pdGl2ZVZhbHVlOworY2xhc3MgQ1NTUHJvcGVydHk7CitjbGFzcyBDU1NSdWxl
TGlzdDsKK2NsYXNzIENTU1NlbGVjdG9yOworY2xhc3MgQ1NTU3R5bGVTaGVldDsKK2NsYXNzIENT
U1ZhbHVlOworY2xhc3MgQ29udGFpbmVyTm9kZTsKK2NsYXNzIEN1c3RvbUZpbHRlck9wZXJhdGlv
bjsKK2NsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlcjsKK2NsYXNzIEN1c3RvbUZpbHRlclBhcmFt
ZXRlckxpc3Q7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIEVsZW1lbnQ7CitjbGFzcyBGcmFtZTsK
K2NsYXNzIEZyYW1lVmlldzsKK2NsYXNzIEtVUkw7CitjbGFzcyBLZXlmcmFtZUxpc3Q7CitjbGFz
cyBLZXlmcmFtZVZhbHVlOworY2xhc3MgTWVkaWFRdWVyeUV2YWx1YXRvcjsKK2NsYXNzIE5vZGU7
CitjbGFzcyBSZW5kZXJSZWdpb247CitjbGFzcyBSZW5kZXJTY3JvbGxiYXI7CitjbGFzcyBSdWxl
RGF0YTsKK2NsYXNzIFJ1bGVTZXQ7CitjbGFzcyBTZXR0aW5nczsKK2NsYXNzIFN0YXRpY0NTU1J1
bGVMaXN0OworY2xhc3MgU3R5bGVCdWlsZGVyOworY2xhc3MgU3R5bGVTY29wZVJlc29sdmVyOwor
Y2xhc3MgU3R5bGVJbWFnZTsKK2NsYXNzIFN0eWxlS2V5ZnJhbWU7CitjbGFzcyBTdHlsZVBlbmRp
bmdJbWFnZTsKK2NsYXNzIFN0eWxlUHJvcGVydHlTZXQ7CitjbGFzcyBTdHlsZVJ1bGU7CisjaWYg
RU5BQkxFKFNIQURPV19ET00pCitjbGFzcyBTdHlsZVJ1bGVIb3N0OworI2VuZGlmCitjbGFzcyBT
dHlsZVJ1bGVLZXlmcmFtZXM7CitjbGFzcyBTdHlsZVJ1bGVQYWdlOworY2xhc3MgU3R5bGVSdWxl
UmVnaW9uOworY2xhc3MgU3R5bGVTaGFkZXI7CitjbGFzcyBTdHlsZVNoZWV0OworY2xhc3MgU3R5
bGVTaGVldExpc3Q7CitjbGFzcyBTdHlsZWRFbGVtZW50OworY2xhc3MgVmlld3BvcnRTdHlsZVJl
c29sdmVyOworY2xhc3MgV2ViS2l0Q1NTRmlsdGVyVmFsdWU7CitjbGFzcyBXZWJLaXRDU1NTaGFk
ZXJWYWx1ZTsKK2NsYXNzIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU7CisKK2NsYXNzIE1lZGlh
UXVlcnlSZXN1bHQgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE1lZGlhUXVlcnlSZXN1bHQp
OyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBNZWRpYVF1ZXJ5UmVzdWx0
KGNvbnN0IE1lZGlhUXVlcnlFeHAmIGV4cHIsIGJvb2wgcmVzdWx0KQorICAgICAgICA6IG1fZXhw
cmVzc2lvbihleHByKQorICAgICAgICAsIG1fcmVzdWx0KHJlc3VsdCkKKyAgICB7CisgICAgfQor
ICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworCisg
ICAgTWVkaWFRdWVyeUV4cCBtX2V4cHJlc3Npb247CisgICAgYm9vbCBtX3Jlc3VsdDsKK307CisK
K2VudW0gU3R5bGVTaGFyaW5nQmVoYXZpb3IgeworICAgIEFsbG93U3R5bGVTaGFyaW5nLAorICAg
IERpc2FsbG93U3R5bGVTaGFyaW5nLAorfTsKKworLy8gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMg
aXMgdXNlZCBpbiBtZWRpYSBxdWVyaWVzLCB3aGVyZSByZWxhdGl2ZSB1bml0cworLy8gYXJlIGlu
dGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50IHN0eWxlLCBh
bmQgc3R5bGVkIG9ubHkKKy8vIGZyb20gdGhlIFVzZXIgQWdlbnQgU3R5bGVzaGVldCBydWxlcy4K
KworZW51bSBSdWxlTWF0Y2hpbmdCZWhhdmlvciB7CisgICAgTWF0Y2hBbGxSdWxlcywKKyAgICBN
YXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCwKKyAgICBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcywK
K307CisKK2NsYXNzIFBzZXVkb1N0eWxlUmVxdWVzdCB7CitwdWJsaWM6CisgICAgUHNldWRvU3R5
bGVSZXF1ZXN0KFBzZXVkb0lkIHBzZXVkb0lkLCBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhciA9
IDAsIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydCA9IE5vUGFydCkKKyAgICAgICAgOiBwc2V1
ZG9JZChwc2V1ZG9JZCkKKyAgICAgICAgLCBzY3JvbGxiYXJQYXJ0KHNjcm9sbGJhclBhcnQpCisg
ICAgICAgICwgc2Nyb2xsYmFyKHNjcm9sbGJhcikKKyAgICB7CisgICAgfQorCisgICAgUHNldWRv
SWQgcHNldWRvSWQ7CisgICAgU2Nyb2xsYmFyUGFydCBzY3JvbGxiYXJQYXJ0OworICAgIFJlbmRl
clNjcm9sbGJhciogc2Nyb2xsYmFyOworfTsKKworY2xhc3MgTWF0Y2hSZXF1ZXN0IHsKK3B1Ymxp
YzoKKyAgICBNYXRjaFJlcXVlc3QoUnVsZVNldCogcnVsZVNldCwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcyA9IGZhbHNlLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSA9IDAsIFNlbGVjdG9yQ2hl
Y2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hl
Y2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgICAgIDogcnVsZVNldChydWxlU2V0KQor
ICAgICAgICAsIGluY2x1ZGVFbXB0eVJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKQorICAgICAgICAs
IHNjb3BlKHNjb3BlKQorICAgICAgICAsIGJlaGF2aW9yQXRCb3VuZGFyeShiZWhhdmlvckF0Qm91
bmRhcnkpIHsgfQorICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVTZXQ7CisgICAgY29uc3QgYm9vbCBp
bmNsdWRlRW1wdHlSdWxlczsKKyAgICBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZTsKKyAgICBj
b25zdCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRh
cnk7Cit9OworCisvLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBSZW5kZXJTdHlsZSBmb3IgYSBnaXZl
biBlbGVtZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBzdHlsZXNoZWV0cy4KK2NsYXNzIFN0
eWxlUmVzb2x2ZXIgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0eWxlUmVzb2x2ZXIpOyBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBTdHlsZVJlc29sdmVyKERvY3Vt
ZW50KiwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpOworICAgIH5TdHlsZVJlc29sdmVy
KCk7CisKKyAgICAvLyBVc2luZyB0aGVzZSBkdXJpbmcgdHJlZSB3YWxrIHdpbGwgYWxsb3cgc3R5
bGUgc2VsZWN0b3IgdG8gb3B0aW1pemUgY2hpbGQgYW5kIGRlc2NlbmRhbnQgc2VsZWN0b3IgbG9v
a3Vwcy4KKyAgICB2b2lkIHB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHBv
cFBhcmVudEVsZW1lbnQoRWxlbWVudCopOworICAgIHZvaWQgcHVzaFBhcmVudFNoYWRvd1Jvb3Qo
Y29uc3QgU2hhZG93Um9vdCopOworICAgIHZvaWQgcG9wUGFyZW50U2hhZG93Um9vdChjb25zdCBT
aGFkb3dSb290Kik7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgdm9pZCBhZGRIb3N0UnVs
ZShTdHlsZVJ1bGVIb3N0KiBydWxlLCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIGNv
bnN0IENvbnRhaW5lck5vZGUqIHNjb3BlKSB7IGVuc3VyZVNjb3BlUmVzb2x2ZXIoKS0+YWRkSG9z
dFJ1bGUocnVsZSwgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgc2NvcGUpOyB9CisjZW5kaWYK
KworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRWxlbWVudChFbGVtZW50Kiwg
UmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgU3R5bGVTaGFyaW5nQmVoYXZpb3IgPSBBbGxv
d1N0eWxlU2hhcmluZywKKyAgICAgICAgUnVsZU1hdGNoaW5nQmVoYXZpb3IgPSBNYXRjaEFsbFJ1
bGVzLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKworICAgIHZvaWQga2V5
ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCosIGNvbnN0IFJlbmRlclN0eWxlKiwgS2V5
ZnJhbWVMaXN0Jik7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBwc2V1ZG9TdHlsZUZv
ckVsZW1lbnQoRWxlbWVudCosIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSk7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclBh
Z2UoaW50IHBhZ2VJbmRleCk7CisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gZGVmYXVsdFN0
eWxlRm9yRWxlbWVudCgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yVGV4
dChUZXh0Kik7CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JE
b2N1bWVudChEb2N1bWVudCosIENTU0ZvbnRTZWxlY3RvciogPSAwKTsKKworICAgIFJlbmRlclN0
eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuc3R5bGUoKTsgfQorICAgIFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50U3R5bGUo
KTsgfQorICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCk7IH0KKyAgICBFbGVtZW50KiBlbGVtZW50KCkgeyBy
ZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCk7IH0KKyAgICBEb2N1bWVudCogZG9jdW1lbnQoKSB7IHJl
dHVybiBtX2RvY3VtZW50OyB9CisgICAgU3R5bGVTY29wZVJlc29sdmVyKiBzY29wZVJlc29sdmVy
KCkgY29uc3QgeyByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOyB9CisgICAgYm9vbCBoYXNQ
YXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnROb2RlKCk7IH0KKworICAg
IC8vIEZJWE1FOiBJdCBjb3VsZCBiZSBiZXR0ZXIgdG8gY2FsbCBtX3J1bGVTZXRzLmFwcGVuZEF1
dGhvclN0eWxlU2hlZXRzKCkgZGlyZWN0bHkgYWZ0ZXIgd2UgZmFjdG9yIFN0eWxlUnNvbHZlciBm
dXJ0aGVyLgorICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
MDg4OTAKKyAgICB2b2lkIGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3
LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mKTsKKworICAgIERvY3VtZW50
UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQorICAgIGNvbnN0IERv
Y3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsgfQor
CisjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgU3R5
bGVTY29wZVJlc29sdmVyKiBlbnN1cmVTY29wZVJlc29sdmVyKCkKKyAgICB7CisjaWYgRU5BQkxF
KFNUWUxFX1NDT1BFRCkKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICAgICAgQVNTRVJUKFJ1
bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSB8fCBSdW50aW1lRW5hYmxl
ZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVuYWJsZWQoKSk7CisjZWxzZQorICAgICAgICBBU1NFUlQo
UnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2VuZGlmCisj
ZWxzZQorICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93RE9NRW5h
YmxlZCgpKTsKKyNlbmRpZgorICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAg
ICAgIG1fc2NvcGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVNjb3BlUmVzb2x2ZXIoKSk7
CisgICAgICAgIHJldHVybiBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCk7CisgICAgfQorI2VuZGlmCisK
K3ByaXZhdGU6CisgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7CisgICAgUmVuZGVyU3R5
bGUqIGxvY2F0ZVNoYXJlZFN0eWxlKCk7CisgICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVN
YXRjaGVzUnVsZVNldChSdWxlU2V0Kik7CisgICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVN
YXRjaGVzSG9zdFJ1bGVzKCk7CisgICAgTm9kZSogbG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBw
YXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdDsKKyAgICBTdHlsZWRFbGVt
ZW50KiBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiwgdW5zaWduZWQmIGNvdW50KSBj
b25zdDsKKyAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50Kikg
Y29uc3Q7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvcktleWZyYW1lKGNv
bnN0IFJlbmRlclN0eWxlKiwgY29uc3QgU3R5bGVLZXlmcmFtZSosIEtleWZyYW1lVmFsdWUmKTsK
KworcHVibGljOgorICAgIC8vIFRoZXNlIG1ldGhvZHMgd2lsbCBnaXZlIGJhY2sgdGhlIHNldCBv
ZiBydWxlcyB0aGF0IG1hdGNoZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudCAob3IgYSBwc2V1ZG8tZWxl
bWVudCkuCisgICAgZW51bSBDU1NSdWxlRmlsdGVyIHsKKyAgICAgICAgVUFBbmRVc2VyQ1NTUnVs
ZXMgICA9IDEgPDwgMSwKKyAgICAgICAgQXV0aG9yQ1NTUnVsZXMgICAgICA9IDEgPDwgMiwKKyAg
ICAgICAgRW1wdHlDU1NSdWxlcyAgICAgICA9IDEgPDwgMywKKyAgICAgICAgQ3Jvc3NPcmlnaW5D
U1NSdWxlcyA9IDEgPDwgNCwKKyAgICAgICAgQWxsQnV0RW1wdHlDU1NSdWxlcyA9IFVBQW5kVXNl
ckNTU1J1bGVzIHwgQXV0aG9yQ1NTUnVsZXMgfCBDcm9zc09yaWdpbkNTU1J1bGVzLAorICAgICAg
ICBBbGxDU1NSdWxlcyAgICAgICAgID0gQWxsQnV0RW1wdHlDU1NSdWxlcyB8IEVtcHR5Q1NTUnVs
ZXMsCisgICAgfTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBzdHlsZVJ1bGVzRm9yRWxl
bWVudChFbGVtZW50KiwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1
bGVzKTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxl
bWVudChFbGVtZW50KiwgUHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0
RW1wdHlDU1NSdWxlcyk7CisKKyAgICAvLyBHaXZlbiBhIENTUyBrZXl3b3JkIGluIHRoZSByYW5n
ZSAoeHgtc21hbGwgdG8gLXdlYmtpdC14eHgtbGFyZ2UpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0
dXJuCisgICAgLy8gdGhlIGNvcnJlY3QgZm9udCBzaXplIHNjYWxlZCByZWxhdGl2ZSB0byB0aGUg
dXNlcidzIGRlZmF1bHQgKG1lZGl1bSkuCisgICAgc3RhdGljIGZsb2F0IGZvbnRTaXplRm9yS2V5
d29yZChEb2N1bWVudCosIGludCBrZXl3b3JkLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNp
emUpOworCisgICAgLy8gR2l2ZW4gYSBmb250IHNpemUgaW4gcGl4ZWwsIHRoaXMgZnVuY3Rpb24g
d2lsbCByZXR1cm4gbGVnYWN5IGZvbnQgc2l6ZSBiZXR3ZWVuIDEgYW5kIDcuCisgICAgc3RhdGlj
IGludCBsZWdhY3lGb250U2l6ZShEb2N1bWVudCosIGludCBwaXhlbEZvbnRTaXplLCBib29sIHNo
b3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpOworCitwdWJsaWM6CisgICAgdm9pZCBhcHBseVByb3Bl
cnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFJlbmRlclN0eWxlKik7CisKKyAg
ICB2b2lkIGFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1
ZSopOworCisgICAgdm9pZCB1cGRhdGVGb250KCk7CisgICAgdm9pZCBpbml0aWFsaXplRm9udFN0
eWxlKFNldHRpbmdzKik7CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNw
ZWNpZmllZFNpemUoRG9jdW1lbnQqLCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVT
aXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgPSBVc2VT
bWFydE1pbmltdW1Gb3JGb250Rml6ZSk7CisKKyAgICB2b2lkIHNldEZvbnRTaXplKEZvbnREZXNj
cmlwdGlvbiYsIGZsb2F0IHNpemUpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBmbG9hdCBnZXRD
b21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIFJlbmRlclN0eWxlKiwgYm9v
bCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVs
ZXMpOworCitwdWJsaWM6CisgICAgYm9vbCB1c2VTVkdab29tUnVsZXMoKTsKKworICAgIHN0YXRp
YyBib29sIGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJp
bWl0aXZlVmFsdWUqKTsKKyAgICBDb2xvciBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmlt
aXRpdmVWYWx1ZSosIGJvb2wgZm9yVmlzaXRlZExpbmsgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBi
b29sIGhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7CisgICAgYm9v
bCBoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJv
b2wgaGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7CisK
KyAgICBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZm9u
dFNlbGVjdG9yLmdldCgpOyB9CisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAg
ICBWaWV3cG9ydFN0eWxlUmVzb2x2ZXIqIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpIHsgcmV0dXJu
IG1fdmlld3BvcnRTdHlsZVJlc29sdmVyLmdldCgpOyB9CisjZW5kaWYKKworICAgIHZvaWQgYWRk
Vmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqLCBi
b29sIHJlc3VsdCk7CisgICAgYm9vbCBoYXNWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcmllcygp
IGNvbnN0IHsgcmV0dXJuICFtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuaXNF
bXB0eSgpOyB9CisgICAgYm9vbCBhZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdDsKKwor
ICAgIHZvaWQgYWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4p
OworCisgICAgYm9vbCBjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwor
CisgICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fcnVsZVNldHMu
ZmVhdHVyZXMoKS5zaWJsaW5nUnVsZXMuaXNFbXB0eSgpOyB9CisgICAgYm9vbCB1c2VzRmlyc3RM
aW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0ZpcnN0
TGluZVJ1bGVzOyB9CisgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0IHsgcmV0
dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS51c2VzQmVmb3JlQWZ0ZXJSdWxlczsgfQorCisgICAg
c3RhdGljIGJvb2wgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwg
UmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9w
ZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOworICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZU1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyAgICBib29s
IGNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBp
blN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBvdXRPcGVy
YXRpb25zKTsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgU3R5bGVTaGFkZXIqIHN0eWxl
U2hhZGVyKENTU1ZhbHVlKik7CisgICAgU3R5bGVTaGFkZXIqIGNhY2hlZE9yUGVuZGluZ1N0eWxl
U2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKik7CisgICAgYm9vbCBwYXJzZUN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJM
aXN0Jik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqKTsKKyAgICBQYXNz
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcihj
b25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9t
RmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihjb25z
dCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmls
dGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJl
bmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50
YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9w
ZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVl
Kik7CisgICAgdm9pZCBsb2FkUGVuZGluZ1NoYWRlcnMoKTsKKyNlbmRpZgorI2lmIEVOQUJMRShT
VkcpCisgICAgdm9pZCBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOworI2VuZGlmCisjZW5kaWYg
Ly8gRU5BQkxFKENTU19GSUxURVJTKQorCisgICAgdm9pZCBsb2FkUGVuZGluZ1Jlc291cmNlcygp
OworCitwcml2YXRlOgorICAgIC8vIFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRlZmF1bHQg
Zm9udCBzaXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZvbnQgZmFt
aWx5IGhhcyBjaGFuZ2VkLiAtZHdoCisgICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFu
Z2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hl
Y2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsK
KyAgICB2b2lkIGNoZWNrRm9yVGV4dFNpemVBZGp1c3QoKTsKKworICAgIHZvaWQgYWRqdXN0UmVu
ZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSwgRWxlbWVudCopOworCisgICAgc3RydWN0IFJ1bGVSYW5nZSB7CisgICAgICAgIFJ1bGVS
YW5nZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQmIGxhc3RSdWxlSW5kZXgpOiBmaXJzdFJ1bGVJ
bmRleChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxlSW5kZXgobGFzdFJ1bGVJbmRleCkgeyB9Cisg
ICAgICAgIGludCYgZmlyc3RSdWxlSW5kZXg7CisgICAgICAgIGludCYgbGFzdFJ1bGVJbmRleDsK
KyAgICB9OworCisgICAgc3RydWN0IE1hdGNoUmFuZ2VzIHsKKyAgICAgICAgTWF0Y2hSYW5nZXMo
KSA6IGZpcnN0VUFSdWxlKC0xKSwgbGFzdFVBUnVsZSgtMSksIGZpcnN0QXV0aG9yUnVsZSgtMSks
IGxhc3RBdXRob3JSdWxlKC0xKSwgZmlyc3RVc2VyUnVsZSgtMSksIGxhc3RVc2VyUnVsZSgtMSkg
eyB9CisgICAgICAgIGludCBmaXJzdFVBUnVsZTsKKyAgICAgICAgaW50IGxhc3RVQVJ1bGU7Cisg
ICAgICAgIGludCBmaXJzdEF1dGhvclJ1bGU7CisgICAgICAgIGludCBsYXN0QXV0aG9yUnVsZTsK
KyAgICAgICAgaW50IGZpcnN0VXNlclJ1bGU7CisgICAgICAgIGludCBsYXN0VXNlclJ1bGU7Cisg
ICAgICAgIFJ1bGVSYW5nZSBVQVJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVB
UnVsZSwgbGFzdFVBUnVsZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIGF1dGhvclJ1bGVSYW5nZSgp
IHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdEF1dGhvclJ1bGUsIGxhc3RBdXRob3JSdWxlKTsgfQor
ICAgICAgICBSdWxlUmFuZ2UgdXNlclJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJz
dFVzZXJSdWxlLCBsYXN0VXNlclJ1bGUpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRjaGVk
UHJvcGVydGllcyB7CisgICAgICAgIE1hdGNoZWRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH5NYXRj
aGVkUHJvcGVydGllcygpOworICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKKyAgICAgICAgCisgICAgICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5
U2V0PiBwcm9wZXJ0aWVzOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBzdHJ1Y3Qgewor
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgOiAyOworICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIHdoaXRlbGlzdFR5cGUgOiAyOworICAgICAgICAgICAgfTsKKyAgICAgICAg
ICAgIC8vIFVzZWQgdG8gbWFrZSBzdXJlIGFsbCBtZW1vcnkgaXMgemVyby1pbml0aWFsaXplZCBz
aW5jZSB3ZSBjb21wdXRlIHRoZSBoYXNoIG92ZXIgdGhlIGJ5dGVzIG9mIHRoaXMgb2JqZWN0Lgor
ICAgICAgICAgICAgdm9pZCogcG9zc2libHlQYWRkZWRNZW1iZXI7CisgICAgICAgIH07CisgICAg
fTsKKworICAgIHN0cnVjdCBNYXRjaFJlc3VsdCB7CisgICAgICAgIE1hdGNoUmVzdWx0KCkgOiBp
c0NhY2hlYWJsZSh0cnVlKSB7IH0KKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzLCA2
ND4gbWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0
Y2hlZFJ1bGVzOworICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7CisgICAgICAgIGJvb2wgaXND
YWNoZWFibGU7CisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVz
KE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVS
dWxlKiA9IDAsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBTZWxlY3RvckNoZWNrZXI6Ok1hdGNo
QWxsLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOworICAg
IHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxl
UHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lkIG1hdGNo
QWxsUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisgICAg
dm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcyhN
YXRjaFJlc3VsdCYsIFJ1bGVTZXQqKTsKKyAgICB2b2lkIG1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hS
ZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNlclJ1bGVz
KE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFNj
b3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Cisg
ICAgdm9pZCBtYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpOworCisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNv
bnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKKworICAgIGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVE
YXRhJikgY29uc3Q7CisgICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisgICAgdm9pZCBzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmKTsKKworICAgIGJvb2wgcnVsZU1h
dGNoZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRv
SWQmLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tl
cjo6RG9lc05vdENyb3NzQm91bmRhcnkpOworICAgIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihj
b25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQp
OworICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGNv
bnN0IEVsZW1lbnQqKTsKKyAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKKyNpZiBFTkFC
TEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgVmFyaWFibGVEZWZpbml0aW9ucywKKyNlbmRpZgor
ICAgICAgICBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzLAorICAgICAgICBMb3dQcmlvcml0eVByb3Bl
cnRpZXMKKyAgICB9OworICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgor
ICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGJvb2wg
aW1wb3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9u
bHkpOworICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgorICAgIHZvaWQg
YXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxl
UnVsZSosIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0
ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklB
QkxFUykKKyAgICB2b2lkIHJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUq
LCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNz
aW9ucyk7CisjZW5kaWYKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEKTsKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgc3RhdGljIGJv
b2wgaXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7CisjZW5kaWYKKyAgICB2
b2lkIG1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCosIGJvb2wgaXNMZWZ0UGFn
ZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgdm9pZCBt
YXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVz
LCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlz
Rmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKyAgICBTZXR0aW5ncyogZG9jdW1l
bnRTZXR0aW5ncygpIHsgcmV0dXJuIG1fZG9jdW1lbnQtPnNldHRpbmdzKCk7IH0KKworICAgIGJv
b2wgaXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBib29sIGlzUmlnaHRQYWdl
KGludCBwYWdlSW5kZXgpIGNvbnN0IHsgcmV0dXJuICFpc0xlZnRQYWdlKHBhZ2VJbmRleCk7IH0K
KyAgICBib29sIGlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OworICAgIFN0cmluZyBw
YWdlTmFtZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKworICAgIERvY3VtZW50UnVsZVNldHMgbV9y
dWxlU2V0czsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgUmVmUHRy
PFN0eWxlUnVsZUtleWZyYW1lcz4gPiBLZXlmcmFtZXNSdWxlTWFwOworICAgIEtleWZyYW1lc1J1
bGVNYXAgbV9rZXlmcmFtZXNSdWxlTWFwOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBIYXNoTWFw
PENTU1Byb3BlcnR5SUQsIFJlZlB0cjxDU1NWYWx1ZT4gPiBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1h
cDsKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgdHlwZWRlZiBI
YXNoTWFwPEZpbHRlck9wZXJhdGlvbiosIFJlZlB0cjxXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVl
PiA+IFBlbmRpbmdTVkdEb2N1bWVudE1hcDsKKyNlbmRpZgorCisgICAgY2xhc3MgU3RhdGUgewor
ICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdGF0ZSk7CisgICAgcHVibGljOgorICAgICAg
ICBTdGF0ZSgpCisgICAgICAgIDogbV9lbGVtZW50KDApCisgICAgICAgICwgbV9zdHlsZWRFbGVt
ZW50KDApCisgICAgICAgICwgbV9wYXJlbnROb2RlKDApCisgICAgICAgICwgbV9wYXJlbnRTdHls
ZSgwKQorICAgICAgICAsIG1fcm9vdEVsZW1lbnRTdHlsZSgwKQorICAgICAgICAsIG1fcmVnaW9u
Rm9yU3R5bGluZygwKQorICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCisgICAgICAg
ICwgbV9wc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pCisgICAgICAgICwgbV9lbGVtZW50TGlu
a1N0YXRlKE5vdEluc2lkZUxpbmspCisgICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9u
UG9pbnQoZmFsc2UpCisgICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoZmFs
c2UpCisgICAgICAgICwgbV9tb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpCisg
ICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSkKKyAgICAgICAgLCBt
X2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpCisjaWYgRU5BQkxFKENTU19T
SEFERVJTKQorICAgICAgICAsIG1faGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpCisjZW5kaWYKKyAg
ICAgICAgLCBtX2xpbmVIZWlnaHRWYWx1ZSgwKQorICAgICAgICAsIG1fZm9udERpcnR5KGZhbHNl
KQorICAgICAgICAsIG1faGFzVUFBcHBlYXJhbmNlKGZhbHNlKQorICAgICAgICAsIG1fYmFja2dy
b3VuZERhdGEoQmFja2dyb3VuZEZpbGxMYXllcikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAg
IHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJl
c29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwg
Y29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyks
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lkIGNsZWFy
KCk7CisKKyAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVt
ZW50LT5kb2N1bWVudCgpOyB9CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQoKSBjb25zdCB7IHJl
dHVybiBtX2VsZW1lbnQ7IH0KKyAgICAgICAgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVkRWxlbWVudDsgfQorICAgICAgICB2b2lkIHNldFN0eWxl
KFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlKSB7IG1fc3R5bGUgPSBzdHlsZTsgfQorICAg
ICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9
CisgICAgICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHRha2VTdHlsZSgpIHsgcmV0dXJuIG1f
c3R5bGUucmVsZWFzZSgpOyB9CisKKyAgICAgICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1
bGVMaXN0KCk7CisgICAgICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHRha2VSdWxlTGlzdCgp
IHsgcmV0dXJuIG1fcnVsZUxpc3QucmVsZWFzZSgpOyB9CisKKyAgICAgICAgY29uc3QgQ29udGFp
bmVyTm9kZSogcGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50Tm9kZTsgfQorICAg
ICAgICB2b2lkIHNldFBhcmVudFN0eWxlKFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkgeyBtX3Bh
cmVudFN0eWxlID0gcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnRTdHlsZTsgfQorICAgICAgICBSZW5kZXJTdHls
ZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm9vdEVsZW1lbnRTdHlsZTsg
fQorCisgICAgICAgIGNvbnN0IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZygpIGNvbnN0
IHsgcmV0dXJuIG1fcmVnaW9uRm9yU3R5bGluZzsgfQorICAgICAgICB2b2lkIHNldFNhbWVPcmln
aW5Pbmx5KGJvb2wgaXNTYW1lT3JpZ2luT25seSkgeyBtX3NhbWVPcmlnaW5Pbmx5ID0gaXNTYW1l
T3JpZ2luT25seTsgfQorICAgICAgICBib29sIGlzU2FtZU9yaWdpbk9ubHkoKSBjb25zdCB7IHJl
dHVybiBtX3NhbWVPcmlnaW5Pbmx5OyB9CisgICAgICAgIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVz
dCYgcHNldWRvU3R5bGVSZXF1ZXN0KCkgY29uc3QgeyByZXR1cm4gbV9wc2V1ZG9TdHlsZVJlcXVl
c3Q7IH0KKyAgICAgICAgRUluc2lkZUxpbmsgZWxlbWVudExpbmtTdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fZWxlbWVudExpbmtTdGF0ZTsgfQorICAgICAgICBib29sIGRpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50
OyB9CisgICAgICAgIHZvaWQgc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGJvb2wgaXNB
ZmZlY3RlZCkgeyBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyA9IGlzQWZmZWN0ZWQ7IH0K
KyAgICAgICAgYm9vbCBlbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSBjb25zdCB7IHJldHVy
biBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsgfQorICAgICAgICB2b2lkIHNldE1vZGUo
U2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUpIHsgbV9tb2RlID0gbW9kZTsgfQorICAgICAgICBT
ZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kZTsgfQorICAg
ICAgICAKKyAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBp
c0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsgfQorICAg
ICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5
KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAg
ICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2Fw
cGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsgfQorICAgICAgICBib29sIGFwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0
ZWRMaW5rU3R5bGU7IH0KKyAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAmIHBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKSB7IHJldHVybiBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7IH0KKyNp
ZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdE
b2N1bWVudE1hcCYgcGVuZGluZ1NWR0RvY3VtZW50cygpIHsgcmV0dXJuIG1fcGVuZGluZ1NWR0Rv
Y3VtZW50czsgfQorI2VuZGlmCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICB2b2lk
IHNldEhhc1BlbmRpbmdTaGFkZXJzKGJvb2wgaGFzUGVuZGluZ1NoYWRlcnMpIHsgbV9oYXNQZW5k
aW5nU2hhZGVycyA9IGhhc1BlbmRpbmdTaGFkZXJzOyB9CisgICAgICAgIGJvb2wgaGFzUGVuZGlu
Z1NoYWRlcnMoKSBjb25zdCB7IHJldHVybiBtX2hhc1BlbmRpbmdTaGFkZXJzOyB9CisjZW5kaWYK
KworICAgICAgICB2b2lkIHNldExpbmVIZWlnaHRWYWx1ZShDU1NWYWx1ZSogdmFsdWUpIHsgbV9s
aW5lSGVpZ2h0VmFsdWUgPSB2YWx1ZTsgfQorICAgICAgICBDU1NWYWx1ZSogbGluZUhlaWdodFZh
bHVlKCkgeyByZXR1cm4gbV9saW5lSGVpZ2h0VmFsdWU7IH0KKyAgICAgICAgdm9pZCBzZXRGb250
RGlydHkoYm9vbCBpc0RpcnR5KSB7IG1fZm9udERpcnR5ID0gaXNEaXJ0eTsgfQorICAgICAgICBi
b29sIGZvbnREaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udERpcnR5OyB9CisKKyAgICAgICAg
dm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKKyAgICAgICAgYm9vbCBoYXNVQUFwcGVh
cmFuY2UoKSBjb25zdCB7IHJldHVybiBtX2hhc1VBQXBwZWFyYW5jZTsgfQorICAgICAgICBCb3Jk
ZXJEYXRhIGJvcmRlckRhdGEoKSBjb25zdCB7IHJldHVybiBtX2JvcmRlckRhdGE7IH0KKyAgICAg
ICAgRmlsbExheWVyIGJhY2tncm91bmREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5k
RGF0YTsgfQorICAgICAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7IHJldHVybiBt
X2JhY2tncm91bmRDb2xvcjsgfQorCisgICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAg
ICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7IHJl
dHVybiBtX3BhcmVudFN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQorICAgICAgICB2b2lkIHNl
dEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikg
eyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsgfQorICAgICAgICB2b2lkIHNldFpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBt
X3N0eWxlLT5zZXRab29tKGYpOyB9CisgICAgICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9vbShmbG9h
dCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oZik7IH0KKyAg
ICAgICAgdm9pZCBzZXRUZXh0U2l6ZUFkanVzdChib29sIGIpIHsgbV9mb250RGlydHkgfD0gbV9z
dHlsZS0+c2V0VGV4dFNpemVBZGp1c3QoYik7IH0KKyAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9k
ZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRX
cml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KKyAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRp
b24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0
eWxlLT5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQorCisgICAgICAgIFZl
Y3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRj
aGVkUnVsZXM7IH0KKyAgICAgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSog
cnVsZSkgeyBtX21hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7IH0KKyAgICAgICAgCisgICAgcHJp
dmF0ZToKKyAgICAgICAgLy8gRklYTUUoYnVnIDEwODU2Myk6IHRvIG1ha2UgaXQgZWFzaWVyIHRv
IHJldmlldywgdGhlc2UgbWVtYmVyCisgICAgICAgIC8vIHZhcmlhYmxlcyBhcmUgcHVibGljLiBI
b3dldmVyIHdlIHNob3VsZCBhZGQgbWV0aG9kcyB0byBhY2Nlc3MKKyAgICAgICAgLy8gdGhlc2Ug
dmFyaWFibGVzLgorICAgICAgICBFbGVtZW50KiBtX2VsZW1lbnQ7CisgICAgICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gbV9zdHlsZTsKKyAgICAgICAgU3R5bGVkRWxlbWVudCogbV9zdHlsZWRFbGVt
ZW50OworICAgICAgICBDb250YWluZXJOb2RlKiBtX3BhcmVudE5vZGU7CisgICAgICAgIFJlbmRl
clN0eWxlKiBtX3BhcmVudFN0eWxlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9yb290RWxlbWVu
dFN0eWxlOworICAgICAgICAKKyAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxp
bmc7CisgICAgICAgIGJvb2wgbV9zYW1lT3JpZ2luT25seTsKKyAgICAgICAgUHNldWRvU3R5bGVS
ZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0OworCisgICAgICAgIEVJbnNpZGVMaW5rIG1fZWxl
bWVudExpbmtTdGF0ZTsKKworICAgICAgICBib29sIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBv
aW50OworCisgICAgICAgIGJvb2wgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7CisKKyAg
ICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKworICAgICAgICAvLyBBIGJ1ZmZl
ciB1c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIGZvciBhbiBlbGVtZW50LAor
ICAgICAgICAvLyBhbmQgYSB0ZW1wb3JhcnkgYnVmZmVyIHVzZWQgZm9yIG1lcmdlIHNvcnRpbmcu
CisgICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiBtX21hdGNoZWRSdWxlczsKKyAg
ICAgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OworCisgICAgICAgIGJv
b2wgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7CisgICAgICAgIGJvb2wgbV9hcHBseVBy
b3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOworCisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5
TWFwIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllczsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisg
ICAgICAgIGJvb2wgbV9oYXNQZW5kaW5nU2hhZGVyczsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1Nf
RklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwIG1f
cGVuZGluZ1NWR0RvY3VtZW50czsKKyNlbmRpZgorICAgICAgICBDU1NWYWx1ZSogbV9saW5lSGVp
Z2h0VmFsdWU7CisgICAgICAgIGJvb2wgbV9mb250RGlydHk7CisKKyAgICAgICAgYm9vbCBtX2hh
c1VBQXBwZWFyYW5jZTsKKyAgICAgICAgQm9yZGVyRGF0YSBtX2JvcmRlckRhdGE7CisgICAgICAg
IEZpbGxMYXllciBtX2JhY2tncm91bmREYXRhOworICAgICAgICBDb2xvciBtX2JhY2tncm91bmRD
b2xvcjsKKyAgICB9OworCisgICAgc3RhdGljIFJlbmRlclN0eWxlKiBzdHlsZU5vdFlldEF2YWls
YWJsZSgpIHsgcmV0dXJuIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7IH0KKworICAgIFBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gc3R5bGVJbWFnZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworICAg
IFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3Bl
cnR5SUQsIENTU0ltYWdlVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGdlbmVy
YXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZUdlbmVyYXRvclZh
bHVlKik7CisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisgICAgUGFzc1JlZlB0cjxTdHlsZUlt
YWdlPiBzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VTZXRWYWx1
ZSopOworI2VuZGlmCisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjdXJzb3JPclBlbmRpbmdG
cm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSopOworCisgICAgYm9v
bCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLmFw
cGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpOyB9CisgICAgYm9vbCBhcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlKCk7IH0KKworICAgIHN0YXRpYyBMZW5ndGggY29udmVydFRvSW50TGVu
Z3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0
eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworICAgIHN0YXRpYyBMZW5ndGggY29udmVydFRv
RmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7CisKKyAgICBDU1NUb1N0eWxlTWFw
KiBzdHlsZU1hcCgpIHsgcmV0dXJuICZtX3N0eWxlTWFwOyB9CisgICAgSW5zcGVjdG9yQ1NTT01X
cmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFwcGVycygpIHsgcmV0dXJuIG1faW5zcGVjdG9yQ1NT
T01XcmFwcGVyczsgfQorICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9u
KCkgeyByZXR1cm4gbV9zdGF0ZS5mb250RGVzY3JpcHRpb24oKTsgfQorICAgIGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdGF0ZS5wYXJl
bnRGb250RGVzY3JpcHRpb24oKTsgfQorICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fc3RhdGUuc2V0Rm9udERlc2Ny
aXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAgICB2b2lkIHNldFpvb20oZmxvYXQgZikgeyBt
X3N0YXRlLnNldFpvb20oZik7IH0KKyAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikg
eyBtX3N0YXRlLnNldEVmZmVjdGl2ZVpvb20oZik7IH0KKyAgICB2b2lkIHNldFRleHRTaXplQWRq
dXN0KGJvb2wgYikgeyBtX3N0YXRlLnNldFRleHRTaXplQWRqdXN0KGIpOyB9CisgICAgdm9pZCBz
ZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX3N0YXRlLnNldFdyaXRp
bmdNb2RlKHdyaXRpbmdNb2RlKTsgfQorICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRP
cmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5zZXRUZXh0T3JpZW50YXRpb24o
dGV4dE9yaWVudGF0aW9uKTsgfQorICAgIAorICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVt
b3J5T2JqZWN0SW5mbyopIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgUmVuZGVy
U3R5bGUqIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKKyAgICB2b2lkIGNhY2hlQm9yZGVyQW5k
QmFja2dyb3VuZCgpOworCitwcml2YXRlOgorICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhDb250
cm9sKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZvaWQgYXBwbHlQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUlELCBDU1NWYWx1ZSopOworCisjaWYgRU5BQkxFKFNWRykKKyAgICB2b2lkIGFwcGx5
U1ZHUHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyNlbmRpZgorCisgICAgUGFz
c1JlZlB0cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKik7
CisgICAgdm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNv
bXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqLCB1bnNp
Z25lZCBzaXplKTsKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0geworICAg
ICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKyAg
ICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVkUHJvcGVydGllczsKKyAgICAg
ICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHJlbmRl
clN0eWxlOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBhcmVudFJlbmRlclN0eWxlOwor
ICAgIH07CisgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGZpbmRGcm9tTWF0
Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOwor
ICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiwg
Y29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRj
aFJlc3VsdCYpOworCisgICAgLy8gRXZlcnkgTiBhZGRpdGlvbnMgdG8gdGhlIG1hdGNoZWQgZGVj
bGFyYXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJlIGVudHJpZXMgaG9sZGluZworICAg
IC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRlY2xhcmF0aW9uIGFyZSBnYXJiYWdl
IGNvbGxlY3RlZC4KKyAgICB2b2lkIHN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxT
dHlsZVJlc29sdmVyPiopOworCisgICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNv
bnN0IFNwYWNlU3BsaXRTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVI
YXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0
OworCisgICAgdW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VM
YXN0U3dlZXA7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVJdGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hlOworICAgIE1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOworCisgICAgVGltZXI8U3R5bGVSZXNv
bHZlcj4gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcjsKKworICAgIE93blB0cjxN
ZWRpYVF1ZXJ5RXZhbHVhdG9yPiBtX21lZGl1bTsKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1f
cm9vdERlZmF1bHRTdHlsZTsKKworICAgIERvY3VtZW50KiBtX2RvY3VtZW50OworICAgIFNlbGVj
dG9yRmlsdGVyIG1fc2VsZWN0b3JGaWx0ZXI7CisKKyAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzOworCisgICAgUmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7
CisgICAgVmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRl
bnRNZWRpYVF1ZXJ5UmVzdWx0czsKKworI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04p
CisgICAgUmVmUHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2
ZXI7CisjZW5kaWYKKworICAgIGNvbnN0IFN0eWxlQnVpbGRlciYgbV9zdHlsZUJ1aWxkZXI7CisK
KyAgICBPd25QdHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7CisgICAgQ1NT
VG9TdHlsZU1hcCBtX3N0eWxlTWFwOworICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMgbV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzOworCisgICAgU3RhdGUgbV9zdGF0ZTsKKworICAgIGZyaWVuZCBj
bGFzcyBTdHlsZUJ1aWxkZXI7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRj
aGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7CisgICAgZnJpZW5kIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9w
ZXJ0aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaFJhbmdlcyYs
IGNvbnN0IE1hdGNoUmFuZ2VzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBN
YXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Cit9OworCitpbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcgJmF0
dHJpYnV0ZU5hbWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFhdHRyaWJ1dGVOYW1lLmlzRW1wdHko
KSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuY29udGFp
bnMoYXR0cmlidXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
OjpoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYgY2xhc3NWYWx1ZSkgY29u
c3QKK3sKKyAgICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9y
dWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzVmFsdWUuaW1w
bCgpKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZChj
b25zdCBBdG9taWNTdHJpbmcmIGlkVmFsdWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFpZFZhbHVl
LmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVz
LmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvUGFn
ZVJ1bGVDb2xsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1
bGVDb2xsZWN0b3IuaAkocmV2aXNpb24gMTQ0ODkzKQorKysgU291cmNlL1dlYkNvcmUvY3NzL1Bh
Z2VSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDY4MiArMTksNDIgQEAKICAq
CiAgKi8KIAotI2lmbmRlZiBTdHlsZVJlc29sdmVyX2gKLSNkZWZpbmUgU3R5bGVSZXNvbHZlcl9o
CisjaWZuZGVmIFBhZ2VSdWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgUGFnZVJ1bGVDb2xsZWN0b3Jf
aAogCi0jaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKLSNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgi
Ci0jaW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5o
IgotI2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuaCIKLSNpbmNsdWRlICJMaW5rSGFz
aC5oIgotI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5o
IgotI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmgiCi0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1
ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKLSNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgot
I2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgotI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgi
Ci0jaW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCi0jaW5jbHVkZSAiU3R5bGVTY29wZVJl
c29sdmVyLmgiCi0jaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCi0jaWYgRU5BQkxF
KENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3Vt
ZW50VmFsdWUuaCIKLSNlbmRpZgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8
d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCiAjaW5jbHVkZSA8d3Rm
L1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9B
dG9taWNTdHJpbmdIYXNoLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLWVudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9O
b3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUg
fTsKLQotY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKLWNsYXNzIENTU0ZvbnRTZWxlY3RvcjsK
LWNsYXNzIENTU0ZvbnRGYWNlOwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlOwotY2xhc3MgQ1NTSW1h
Z2VHZW5lcmF0b3JWYWx1ZTsKLWNsYXNzIENTU0ltYWdlU2V0VmFsdWU7Ci1jbGFzcyBDU1NJbWFn
ZVZhbHVlOwotY2xhc3MgQ1NTUGFnZVJ1bGU7Ci1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKLWNs
YXNzIENTU1Byb3BlcnR5OwotY2xhc3MgQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBDU1NTZWxlY3RvcjsK
LWNsYXNzIENTU1N0eWxlU2hlZXQ7Ci1jbGFzcyBDU1NWYWx1ZTsKLWNsYXNzIENvbnRhaW5lck5v
ZGU7Ci1jbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI7Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OwotY2xhc3MgRG9jdW1lbnQ7
Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBGcmFtZVZpZXc7Ci1jbGFzcyBL
VVJMOwotY2xhc3MgS2V5ZnJhbWVMaXN0OwotY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKLWNsYXNzIE1l
ZGlhUXVlcnlFdmFsdWF0b3I7Ci1jbGFzcyBOb2RlOwotY2xhc3MgUmVuZGVyUmVnaW9uOwotY2xh
c3MgUmVuZGVyU2Nyb2xsYmFyOwotY2xhc3MgUnVsZURhdGE7Ci1jbGFzcyBSdWxlU2V0OwotY2xh
c3MgU2V0dGluZ3M7Ci1jbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKLWNsYXNzIFN0eWxlQnVpbGRl
cjsKLWNsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKLWNsYXNzIFN0eWxlSW1hZ2U7Ci1jbGFzcyBT
dHlsZUtleWZyYW1lOwotY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7Ci1jbGFzcyBTdHlsZVByb3Bl
cnR5U2V0OwotY2xhc3MgU3R5bGVSdWxlOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotY2xhc3Mg
U3R5bGVSdWxlSG9zdDsKLSNlbmRpZgotY2xhc3MgU3R5bGVSdWxlS2V5ZnJhbWVzOwogY2xhc3Mg
U3R5bGVSdWxlUGFnZTsKLWNsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKLWNsYXNzIFN0eWxlU2hhZGVy
OwotY2xhc3MgU3R5bGVTaGVldDsKLWNsYXNzIFN0eWxlU2hlZXRMaXN0OwotY2xhc3MgU3R5bGVk
RWxlbWVudDsKLWNsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKLWNsYXNzIFdlYktpdENTU0Zp
bHRlclZhbHVlOwotY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRDU1NT
VkdEb2N1bWVudFZhbHVlOwotCi1jbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0IHsKLSAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
Ci1wdWJsaWM6Ci0gICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHBy
LCBib29sIHJlc3VsdCkKLSAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhwcikKLSAgICAgICAgLCBt
X3Jlc3VsdChyZXN1bHQpCi0gICAgewotICAgIH0KLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdl
KE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKLQotICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNz
aW9uOwotICAgIGJvb2wgbV9yZXN1bHQ7Ci19OwotCi1lbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9y
IHsKLSAgICBBbGxvd1N0eWxlU2hhcmluZywKLSAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKLX07
Ci0KLS8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywg
d2hlcmUgcmVsYXRpdmUgdW5pdHMKLS8vIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhl
IGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBvbmx5Ci0vLyBmcm9tIHRo
ZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCi0KLWVudW0gUnVsZU1hdGNoaW5nQmVoYXZp
b3IgewotICAgIE1hdGNoQWxsUnVsZXMsCi0gICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUws
Ci0gICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCi19OwotCi1jbGFzcyBQc2V1ZG9TdHlsZVJl
cXVlc3QgewotcHVibGljOgotICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9J
ZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJh
clBhcnQgPSBOb1BhcnQpCi0gICAgICAgIDogcHNldWRvSWQocHNldWRvSWQpCi0gICAgICAgICwg
c2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQotICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxi
YXIpCi0gICAgewotICAgIH0KLQotICAgIFBzZXVkb0lkIHBzZXVkb0lkOwotICAgIFNjcm9sbGJh
clBhcnQgc2Nyb2xsYmFyUGFydDsKLSAgICBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKLX07
Ci0KLWNsYXNzIE1hdGNoUmVxdWVzdCB7Ci1wdWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0KFJ1bGVT
ZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFp
bmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBi
ZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5
KQotICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKLSAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxl
cyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAgICAgLCBzY29wZShzY29wZSkKLSAgICAgICAgLCBi
ZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0KLSAgICBjb25zdCBSdWxl
U2V0KiBydWxlU2V0OwotICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXM7Ci0gICAgY29u
c3QgQ29udGFpbmVyTm9kZSogc2NvcGU7Ci0gICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhh
dmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OwotfTsKIAotLy8gVGhpcyBjbGFzcyBz
ZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxl
Y3Rpb24gb2Ygc3R5bGVzaGVldHMuCi1jbGFzcyBTdHlsZVJlc29sdmVyIHsKLSAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citj
bGFzcyBQYWdlUnVsZUNvbGxlY3RvciB7CiBwdWJsaWM6Ci0gICAgU3R5bGVSZXNvbHZlcihEb2N1
bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKLSAgICB+U3R5bGVSZXNvbHZl
cigpOworICAgIFBhZ2VSdWxlQ29sbGVjdG9yKFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwg
RG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAg
ICAgICAgLCBtX3J1bGVTZXRzKHJ1bGVTZXRzKSB7IH0KIAotICAgIC8vIFVzaW5nIHRoZXNlIGR1
cmluZyB0cmVlIHdhbGsgd2lsbCBhbGxvdyBzdHlsZSBzZWxlY3RvciB0byBvcHRpbWl6ZSBjaGls
ZCBhbmQgZGVzY2VuZGFudCBzZWxlY3RvciBsb29rdXBzLgotICAgIHZvaWQgcHVzaFBhcmVudEVs
ZW1lbnQoRWxlbWVudCopOwotICAgIHZvaWQgcG9wUGFyZW50RWxlbWVudChFbGVtZW50Kik7Ci0g
ICAgdm9pZCBwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7Ci0gICAgdm9p
ZCBwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSNpZiBFTkFCTEUoU0hB
RE9XX0RPTSkKLSAgICB2b2lkIGFkZEhvc3RSdWxlKFN0eWxlUnVsZUhvc3QqIHJ1bGUsIGJvb2wg
aGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUpIHsg
ZW5zdXJlU2NvcGVSZXNvbHZlcigpLT5hZGRIb3N0UnVsZShydWxlLCBoYXNEb2N1bWVudFNlY3Vy
aXR5T3JpZ2luLCBzY29wZSk7IH0KLSNlbmRpZgotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gc3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAw
LCBTdHlsZVNoYXJpbmdCZWhhdmlvciA9IEFsbG93U3R5bGVTaGFyaW5nLAotICAgICAgICBSdWxl
TWF0Y2hpbmdCZWhhdmlvciA9IE1hdGNoQWxsUnVsZXMsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9y
U3R5bGluZyA9IDApOwotCi0gICAgdm9pZCBrZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVt
ZW50KiwgY29uc3QgUmVuZGVyU3R5bGUqLCBLZXlmcmFtZUxpc3QmKTsKLQotICAgIFBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IHBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiwgY29uc3QgUHNl
dWRvU3R5bGVSZXF1ZXN0JiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLQotICAgIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KTsKLSAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCk7Ci0gICAgUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JUZXh0KFRleHQqKTsKLQotICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiwgQ1NTRm9udFNl
bGVjdG9yKiA9IDApOwotCi0gICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9zdGF0ZS5zdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29uc3Qg
eyByZXR1cm4gbV9zdGF0ZS5wYXJlbnRTdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHJvb3RF
bGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKTsg
fQotICAgIEVsZW1lbnQqIGVsZW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKTsgfQot
ICAgIERvY3VtZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fZG9jdW1lbnQ7IH0KLSAgICBTdHls
ZVNjb3BlUmVzb2x2ZXIqIHNjb3BlUmVzb2x2ZXIoKSBjb25zdCB7IHJldHVybiBtX3Njb3BlUmVz
b2x2ZXIuZ2V0KCk7IH0KLSAgICBib29sIGhhc1BhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBt
X3N0YXRlLnBhcmVudE5vZGUoKTsgfQotCi0gICAgLy8gRklYTUU6IEl0IGNvdWxkIGJlIGJldHRl
ciB0byBjYWxsIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoKSBkaXJlY3RseSBh
ZnRlciB3ZSBmYWN0b3IgU3R5bGVSc29sdmVyIGZ1cnRoZXIuCi0gICAgLy8gaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwODg5MAotICAgIHZvaWQgYXBwZW5kQXV0aG9y
U3R5bGVTaGVldHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gPiYpOwotCi0gICAgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSB7IHJldHVy
biBtX3J1bGVTZXRzOyB9Ci0gICAgY29uc3QgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSBj
b25zdCB7IHJldHVybiBtX3J1bGVTZXRzOyB9Ci0KLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8
fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIGVuc3VyZVNjb3Bl
UmVzb2x2ZXIoKQotICAgIHsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKQotI2lmIEVOQUJMRShT
SEFET1dfRE9NKQotICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93
RE9NRW5hYmxlZCgpIHx8IFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxl
ZCgpKTsKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzdHls
ZVNjb3BlZEVuYWJsZWQoKSk7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1l
RW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkpOwotI2VuZGlmCi0gICAgICAgIGlm
ICghbV9zY29wZVJlc29sdmVyKQotICAgICAgICAgICAgbV9zY29wZVJlc29sdmVyID0gYWRvcHRQ
dHIobmV3IFN0eWxlU2NvcGVSZXNvbHZlcigpKTsKLSAgICAgICAgcmV0dXJuIG1fc2NvcGVSZXNv
bHZlci5nZXQoKTsKLSAgICB9Ci0jZW5kaWYKKyAgICB2b2lkIG1hdGNoQWxsUGFnZVJ1bGVzKGlu
dCBwYWdlSW5kZXgpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVz
dWx0KCkgeyByZXR1cm4gbV9yZXN1bHQ7IH0KIAogcHJpdmF0ZToKLSAgICB2b2lkIGluaXRFbGVt
ZW50KEVsZW1lbnQqKTsKLSAgICBSZW5kZXJTdHlsZSogbG9jYXRlU2hhcmVkU3R5bGUoKTsKLSAg
ICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqKTsKLSAg
ICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKTsKLSAgICBOb2Rl
KiBsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5zaWduZWQmIHZpc2l0ZWROb2Rl
Q291bnQpIGNvbnN0OwotICAgIFN0eWxlZEVsZW1lbnQqIGZpbmRTaWJsaW5nRm9yU3R5bGVTaGFy
aW5nKE5vZGUqLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0OwotICAgIGJvb2wgY2FuU2hhcmVTdHls
ZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IHN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBTdHls
ZUtleWZyYW1lKiwgS2V5ZnJhbWVWYWx1ZSYpOwotCi1wdWJsaWM6Ci0gICAgLy8gVGhlc2UgbWV0
aG9kcyB3aWxsIGdpdmUgYmFjayB0aGUgc2V0IG9mIHJ1bGVzIHRoYXQgbWF0Y2hlZCBmb3IgYSBn
aXZlbiBlbGVtZW50IChvciBhIHBzZXVkby1lbGVtZW50KS4KLSAgICBlbnVtIENTU1J1bGVGaWx0
ZXIgewotICAgICAgICBVQUFuZFVzZXJDU1NSdWxlcyAgID0gMSA8PCAxLAotICAgICAgICBBdXRo
b3JDU1NSdWxlcyAgICAgID0gMSA8PCAyLAotICAgICAgICBFbXB0eUNTU1J1bGVzICAgICAgID0g
MSA8PCAzLAotICAgICAgICBDcm9zc09yaWdpbkNTU1J1bGVzID0gMSA8PCA0LAotICAgICAgICBB
bGxCdXRFbXB0eUNTU1J1bGVzID0gVUFBbmRVc2VyQ1NTUnVsZXMgfCBBdXRob3JDU1NSdWxlcyB8
IENyb3NzT3JpZ2luQ1NTUnVsZXMsCi0gICAgICAgIEFsbENTU1J1bGVzICAgICAgICAgPSBBbGxC
dXRFbXB0eUNTU1J1bGVzIHwgRW1wdHlDU1NSdWxlcywKLSAgICB9OwotICAgIFBhc3NSZWZQdHI8
Q1NTUnVsZUxpc3Q+IHN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCB1bnNpZ25lZCBydWxl
c1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOwotICAgIFBhc3NSZWZQdHI8Q1NTUnVs
ZUxpc3Q+IHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCBQc2V1ZG9JZCwgdW5z
aWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1bGVzKTsKLQotICAgIC8vIEdp
dmVuIGEgQ1NTIGtleXdvcmQgaW4gdGhlIHJhbmdlICh4eC1zbWFsbCB0byAtd2Via2l0LXh4eC1s
YXJnZSksIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KLSAgICAvLyB0aGUgY29ycmVjdCBmb250
IHNpemUgc2NhbGVkIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgZGVmYXVsdCAobWVkaXVtKS4KLSAg
ICBzdGF0aWMgZmxvYXQgZm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiwgaW50IGtleXdvcmQs
IGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0KLSAgICAvLyBHaXZlbiBhIGZvbnQg
c2l6ZSBpbiBwaXhlbCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBsZWdhY3kgZm9udCBzaXpl
IGJldHdlZW4gMSBhbmQgNy4KLSAgICBzdGF0aWMgaW50IGxlZ2FjeUZvbnRTaXplKERvY3VtZW50
KiwgaW50IHBpeGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0K
LXB1YmxpYzoKLSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQsIENT
U1ZhbHVlKiwgUmVuZGVyU3R5bGUqKTsKLQotICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvQ3VycmVu
dFN0eWxlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0KLSAgICB2b2lkIHVwZGF0ZUZvbnQo
KTsKLSAgICB2b2lkIGluaXRpYWxpemVGb250U3R5bGUoU2V0dGluZ3MqKTsKLQotICAgIHN0YXRp
YyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIGZsb2F0
IHpvb21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVT
bWFydE1pbmltdW1Gb3JGb250U2l6ZSA9IFVzZVNtYXJ0TWluaW11bUZvckZvbnRGaXplKTsKLQot
ICAgIHZvaWQgc2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiwgZmxvYXQgc2l6ZSk7Ci0KLXBy
aXZhdGU6Ci0gICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiwgUmVuZGVyU3R5bGUqLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVj
aWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcyk7Ci0KLXB1YmxpYzoKLSAgICBib29sIHVz
ZVNWR1pvb21SdWxlcygpOwotCi0gICAgc3RhdGljIGJvb2wgY29sb3JGcm9tUHJpbWl0aXZlVmFs
dWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVWYWx1ZSopOwotICAgIENvbG9yIGNv
bG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiwgYm9vbCBmb3JWaXNpdGVk
TGluayA9IGZhbHNlKSBjb25zdDsKLQotICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JJZChjb25zdCBB
dG9taWNTdHJpbmcmKSBjb25zdDsKLSAgICBib29sIGhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3Qg
QXRvbWljU3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShj
b25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLQotICAgIENTU0ZvbnRTZWxlY3RvciogZm9udFNl
bGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mb250U2VsZWN0b3IuZ2V0KCk7IH0KLSNpZiBFTkFC
TEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIFZpZXdwb3J0U3R5bGVSZXNvbHZlciogdmll
d3BvcnRTdHlsZVJlc29sdmVyKCkgeyByZXR1cm4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIuZ2V0
KCk7IH0KLSNlbmRpZgotCi0gICAgdm9pZCBhZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlS
ZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCosIGJvb2wgcmVzdWx0KTsKLSAgICBib29sIGhhc1Zp
ZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyaWVzKCkgY29uc3QgeyByZXR1cm4gIW1fdmlld3BvcnRE
ZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5pc0VtcHR5KCk7IH0KLSAgICBib29sIGFmZmVjdGVk
QnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0OwotCi0gICAgdm9pZCBhZGRLZXlmcmFtZVN0eWxlKFBh
c3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPik7Ci0KLSAgICBib29sIGNoZWNrUmVnaW9uU3R5
bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0KLSAgICBib29sIHVzZXNTaWJsaW5nUnVsZXMo
KSBjb25zdCB7IHJldHVybiAhbV9ydWxlU2V0cy5mZWF0dXJlcygpLnNpYmxpbmdSdWxlcy5pc0Vt
cHR5KCk7IH0KLSAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1f
cnVsZVNldHMuZmVhdHVyZXMoKS51c2VzRmlyc3RMaW5lUnVsZXM7IH0KLSAgICBib29sIHVzZXNC
ZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVz
ZXNCZWZvcmVBZnRlclJ1bGVzOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBjcmVhdGVUcmFuc2Zvcm1P
cGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVy
U3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Ci0g
ICAgCi0gICAgdm9pZCBpbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSgpOwotCi0jaWYg
RU5BQkxFKENTU19GSUxURVJTKQotICAgIGJvb2wgY3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NW
YWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLSAgICBTdHlsZVNoYWRlciogc3R5bGVTaGFkZXIoQ1NTVmFsdWUqKTsKLSAgICBTdHls
ZVNoYWRlciogY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2ViS2l0Q1NTU2hh
ZGVyVmFsdWUqKTsKLSAgICBib29sIHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NW
YWx1ZSosIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmKTsKLSAgICBQYXNzUmVmUHRyPEN1c3Rv
bUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBDU1NWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVy
PiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNl
Q3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVM
aXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9t
RmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0
Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZp
bHRlck9wZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFs
dWUqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwot
ICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJP
cGVyYXRpb24oV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5nU2hh
ZGVycygpOwotI2VuZGlmCi0jaWYgRU5BQkxFKFNWRykKLSAgICB2b2lkIGxvYWRQZW5kaW5nU1ZH
RG9jdW1lbnRzKCk7Ci0jZW5kaWYKLSNlbmRpZiAvLyBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0KLSAg
ICB2b2lkIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhpcyBm
dW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0
IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKLSAgICB2
b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUq
LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3JUZXh0U2l6ZUFk
anVzdCgpOwotCi0gICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGVU
b0FkanVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50Kik7Ci0KLSAgICBzdHJ1
Y3QgUnVsZVJhbmdlIHsKLSAgICAgICAgUnVsZVJhbmdlKGludCYgZmlyc3RSdWxlSW5kZXgsIGlu
dCYgbGFzdFJ1bGVJbmRleCk6IGZpcnN0UnVsZUluZGV4KGZpcnN0UnVsZUluZGV4KSwgbGFzdFJ1
bGVJbmRleChsYXN0UnVsZUluZGV4KSB7IH0KLSAgICAgICAgaW50JiBmaXJzdFJ1bGVJbmRleDsK
LSAgICAgICAgaW50JiBsYXN0UnVsZUluZGV4OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hS
YW5nZXMgewotICAgICAgICBNYXRjaFJhbmdlcygpIDogZmlyc3RVQVJ1bGUoLTEpLCBsYXN0VUFS
dWxlKC0xKSwgZmlyc3RBdXRob3JSdWxlKC0xKSwgbGFzdEF1dGhvclJ1bGUoLTEpLCBmaXJzdFVz
ZXJSdWxlKC0xKSwgbGFzdFVzZXJSdWxlKC0xKSB7IH0KLSAgICAgICAgaW50IGZpcnN0VUFSdWxl
OwotICAgICAgICBpbnQgbGFzdFVBUnVsZTsKLSAgICAgICAgaW50IGZpcnN0QXV0aG9yUnVsZTsK
LSAgICAgICAgaW50IGxhc3RBdXRob3JSdWxlOwotICAgICAgICBpbnQgZmlyc3RVc2VyUnVsZTsK
LSAgICAgICAgaW50IGxhc3RVc2VyUnVsZTsKLSAgICAgICAgUnVsZVJhbmdlIFVBUnVsZVJhbmdl
KCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VUFSdWxlLCBsYXN0VUFSdWxlKTsgfQotICAgICAg
ICBSdWxlUmFuZ2UgYXV0aG9yUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0QXV0
aG9yUnVsZSwgbGFzdEF1dGhvclJ1bGUpOyB9Ci0gICAgICAgIFJ1bGVSYW5nZSB1c2VyUnVsZVJh
bmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VXNlclJ1bGUsIGxhc3RVc2VyUnVsZSk7IH0K
LSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzIHsKLSAgICAgICAgTWF0Y2hl
ZFByb3BlcnRpZXMoKTsKLSAgICAgICAgfk1hdGNoZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHZv
aWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwotICAgICAgICAK
LSAgICAgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHByb3BlcnRpZXM7Ci0gICAgICAgIHVu
aW9uIHsKLSAgICAgICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbGlu
a01hdGNoVHlwZSA6IDI7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgd2hpdGVsaXN0VHlwZSA6
IDI7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gVXNlZCB0byBtYWtlIHN1cmUgYWxs
IG1lbW9yeSBpcyB6ZXJvLWluaXRpYWxpemVkIHNpbmNlIHdlIGNvbXB1dGUgdGhlIGhhc2ggb3Zl
ciB0aGUgYnl0ZXMgb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAgICB2b2lkKiBwb3NzaWJseVBh
ZGRlZE1lbWJlcjsKLSAgICAgICAgfTsKLSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoUmVzdWx0
IHsKLSAgICAgICAgTWF0Y2hSZXN1bHQoKSA6IGlzQ2FjaGVhYmxlKHRydWUpIHsgfQotICAgICAg
ICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXMsIDY0PiBtYXRjaGVkUHJvcGVydGllczsKLSAgICAg
ICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7Ci0gICAgICAgIE1hdGNoUmFu
Z2VzIHJhbmdlczsKLSAgICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKLSAgICB9OwotCi0gICAgc3Rh
dGljIHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVBy
b3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNo
VHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9
IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0
aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFi
bGUgPSB0cnVlKTsKLQotICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wg
aW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRjaFJlc3Vs
dCYpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCopOwotICAg
IHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpOwotICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQm
LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9zdFJ1bGVzKE1hdGNo
UmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0KLSAgICB2b2lkIGNvbGxlY3RNYXRj
aGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdl
Jik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1
bGVEYXRhPiosIGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotCi0gICAgYm9vbCBm
YXN0UmVqZWN0U2VsZWN0b3IoY29uc3QgUnVsZURhdGEmKSBjb25zdDsKLSAgICB2b2lkIHNvcnRN
YXRjaGVkUnVsZXMoKTsKLSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRj
aFJlc3VsdCYpOwotCi0gICAgYm9vbCBydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0
IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZp
b3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSk7Ci0g
ICAgYm9vbCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxl
Y3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0gICAgdm9pZCBhcHBseU1hdGNoZWRQcm9w
ZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgY29uc3QgRWxlbWVudCopOwotICAgIGVudW0gU3R5
bGVBcHBsaWNhdGlvblBhc3MgewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICBW
YXJpYWJsZURlZmluaXRpb25zLAotI2VuZGlmCi0gICAgICAgIEhpZ2hQcmlvcml0eVByb3BlcnRp
ZXMsCi0gICAgICAgIExvd1ByaW9yaXR5UHJvcGVydGllcwotICAgIH07Ci0gICAgdGVtcGxhdGUg
PFN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgYm9vbCBpbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBp
bnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSk7Ci0gICAgdGVtcGxhdGUgPFN0eWxlQXBw
bGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQ
cm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiwgYm9vbCBpc0ltcG9ydGFudCwgYm9v
bCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlz
dE5vbmUpOwotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIHZvaWQgcmVzb2x2ZVZhcmlh
YmxlcyhDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVy
dHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKTsKLSNlbmRpZgotICAgIHN0YXRpYyBi
b29sIGlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOwotI2lmIEVOQUJM
RShWSURFT19UUkFDSykKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShD
U1NQcm9wZXJ0eUlEKTsKLSNlbmRpZgotICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1
bHQmLCBSdWxlU2V0KiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBT
dHJpbmcmIHBhZ2VOYW1lKTsKLSAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8
U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdl
Kj4mLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFn
ZU5hbWUpOwotICAgIFNldHRpbmdzKiBkb2N1bWVudFNldHRpbmdzKCkgeyByZXR1cm4gbV9kb2N1
bWVudC0+c2V0dGluZ3MoKTsgfQotCiAgICAgYm9vbCBpc0xlZnRQYWdlKGludCBwYWdlSW5kZXgp
IGNvbnN0OwogICAgIGJvb2wgaXNSaWdodFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QgeyByZXR1
cm4gIWlzTGVmdFBhZ2UocGFnZUluZGV4KTsgfQogICAgIGJvb2wgaXNGaXJzdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3Q7CiAgICAgU3RyaW5nIHBhZ2VOYW1lKGludCBwYWdlSW5kZXgpIGNvbnN0
OwogCi0gICAgRG9jdW1lbnRSdWxlU2V0cyBtX3J1bGVTZXRzOwotCi0gICAgdHlwZWRlZiBIYXNo
TWFwPEF0b21pY1N0cmluZ0ltcGwqLCBSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiA+IEtleWZy
YW1lc1J1bGVNYXA7Ci0gICAgS2V5ZnJhbWVzUnVsZU1hcCBtX2tleWZyYW1lc1J1bGVNYXA7Ci0K
LXB1YmxpYzoKLSAgICB0eXBlZGVmIEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwgUmVmUHRyPENTU1Zh
bHVlPiA+IFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOwotI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKLSAgICB0eXBlZGVmIEhhc2hNYXA8RmlsdGVyT3BlcmF0aW9uKiwgUmVm
UHRyPFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU+ID4gUGVuZGluZ1NWR0RvY3VtZW50TWFwOwot
I2VuZGlmCi0KLSAgICBjbGFzcyBTdGF0ZSB7Ci0gICAgICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KFN0YXRlKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFN0YXRlKCkKLSAgICAgICAgOiBtX2VsZW1l
bnQoMCkKLSAgICAgICAgLCBtX3N0eWxlZEVsZW1lbnQoMCkKLSAgICAgICAgLCBtX3BhcmVudE5v
ZGUoMCkKLSAgICAgICAgLCBtX3BhcmVudFN0eWxlKDApCi0gICAgICAgICwgbV9yb290RWxlbWVu
dFN0eWxlKDApCi0gICAgICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCi0gICAgICAgICwgbV9z
YW1lT3JpZ2luT25seShmYWxzZSkKLSAgICAgICAgLCBtX3BzZXVkb1N0eWxlUmVxdWVzdChOT1BT
RVVETykKLSAgICAgICAgLCBtX2VsZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRlTGluaykKLSAgICAg
ICAgLCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludChmYWxzZSkKLSAgICAgICAgLCBtX2Vs
ZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxzZSkKLSAgICAgICAgLCBtX21vZGUoU2VsZWN0
b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKLSAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Jl
Z3VsYXJTdHlsZSh0cnVlKQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZShmYWxzZSkKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgICwgbV9oYXNQZW5k
aW5nU2hhZGVycyhmYWxzZSkKLSNlbmRpZgotICAgICAgICAsIG1fbGluZUhlaWdodFZhbHVlKDAp
Ci0gICAgICAgICwgbV9mb250RGlydHkoZmFsc2UpCi0gICAgICAgICwgbV9oYXNVQUFwcGVhcmFu
Y2UoZmFsc2UpCi0gICAgICAgICwgbV9iYWNrZ3JvdW5kRGF0YShCYWNrZ3JvdW5kRmlsbExheWVy
KSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7
Ci0gICAgICAgIHZvaWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1lbnQqLCBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmID0g
UHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKSwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHls
aW5nID0gMCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLQotICAgICAgICBEb2N1bWVudCogZG9j
dW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KLSAgICAgICAg
RWxlbWVudCogZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotICAgICAgICBT
dHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZWRFbGVt
ZW50OyB9Ci0gICAgICAgIHZvaWQgc2V0U3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5
bGUpIHsgbV9zdHlsZSA9IHN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KLSAgICAgICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KLQotICAgICAg
ICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFzc1JlZlB0
cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNl
KCk7IH0KLQotICAgICAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkgY29uc3Qg
eyByZXR1cm4gbV9wYXJlbnROb2RlOyB9Ci0gICAgICAgIHZvaWQgc2V0UGFyZW50U3R5bGUoUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsgfQot
ICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVu
dFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3Qg
eyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxlOyB9Ci0KLSAgICAgICAgY29uc3QgUmVuZGVyUmVn
aW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JTdHlsaW5n
OyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmlnaW5Pbmx5
KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIGJvb2wg
aXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7IH0KLSAg
ICAgICAgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QoKSBjb25z
dCB7IHJldHVybiBtX3BzZXVkb1N0eWxlUmVxdWVzdDsgfQotICAgICAgICBFSW5zaWRlTGluayBl
bGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRlOyB9Ci0g
ICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyByZXR1cm4g
bV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRFbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFmZmVjdGVk
QnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQotICAgICAgICBib29sIGVsZW1lbnRBZmZlY3Rl
ZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1
bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkg
eyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNldEFwcGx5
UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRv
VmlzaXRlZExpbmtTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVk
TGlua1N0eWxlID0gaXNBcHBseTsgfQotICAgICAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3Vs
YXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOyB9
Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsgfQotICAgICAgICBQZW5k
aW5nSW1hZ2VQcm9wZXJ0eU1hcCYgcGVuZGluZ0ltYWdlUHJvcGVydGllcygpIHsgcmV0dXJuIG1f
cGVuZGluZ0ltYWdlUHJvcGVydGllczsgfQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5B
QkxFKFNWRykKLSAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwJiBwZW5kaW5nU1ZHRG9jdW1l
bnRzKCkgeyByZXR1cm4gbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOyB9Ci0jZW5kaWYKLSNpZiBFTkFC
TEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIHZvaWQgc2V0SGFzUGVuZGluZ1NoYWRlcnMoYm9vbCBo
YXNQZW5kaW5nU2hhZGVycykgeyBtX2hhc1BlbmRpbmdTaGFkZXJzID0gaGFzUGVuZGluZ1NoYWRl
cnM7IH0KLSAgICAgICAgYm9vbCBoYXNQZW5kaW5nU2hhZGVycygpIGNvbnN0IHsgcmV0dXJuIG1f
aGFzUGVuZGluZ1NoYWRlcnM7IH0KLSNlbmRpZgotCi0gICAgICAgIHZvaWQgc2V0TGluZUhlaWdo
dFZhbHVlKENTU1ZhbHVlKiB2YWx1ZSkgeyBtX2xpbmVIZWlnaHRWYWx1ZSA9IHZhbHVlOyB9Ci0g
ICAgICAgIENTU1ZhbHVlKiBsaW5lSGVpZ2h0VmFsdWUoKSB7IHJldHVybiBtX2xpbmVIZWlnaHRW
YWx1ZTsgfQotICAgICAgICB2b2lkIHNldEZvbnREaXJ0eShib29sIGlzRGlydHkpIHsgbV9mb250
RGlydHkgPSBpc0RpcnR5OyB9Ci0gICAgICAgIGJvb2wgZm9udERpcnR5KCkgY29uc3QgeyByZXR1
cm4gbV9mb250RGlydHk7IH0KLQotICAgICAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3Vu
ZCgpOwotICAgICAgICBib29sIGhhc1VBQXBwZWFyYW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFz
VUFBcHBlYXJhbmNlOyB9Ci0gICAgICAgIEJvcmRlckRhdGEgYm9yZGVyRGF0YSgpIGNvbnN0IHsg
cmV0dXJuIG1fYm9yZGVyRGF0YTsgfQotICAgICAgICBGaWxsTGF5ZXIgYmFja2dyb3VuZERhdGEo
KSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmREYXRhOyB9Ci0gICAgICAgIENvbG9yIGJhY2tn
cm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9Ci0KLSAgICAg
ICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0
eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQotICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24m
IHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fcGFyZW50U3R5bGUtPmZvbnREZXNj
cmlwdGlvbigpOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNl
dEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgICAgIHZvaWQgc2V0Wm9v
bShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFpvb20oZik7IH0KLSAgICAg
ICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHls
ZS0+c2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldFRleHRTaXplQWRqdXN0
KGJvb2wgYikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0U2l6ZUFkanVzdChiKTsg
fQotICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2RlKSB7
IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2RlKTsgfQot
ICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4dE9yaWVu
dGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRhdGlvbih0ZXh0
T3JpZW50YXRpb24pOyB9Ci0KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBt
YXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxlczsgfQotICAgICAgICB2b2lkIGFk
ZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1bGVzLmFwcGVu
ZChydWxlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRShidWcg
MTA4NTYzKTogdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1iZXIKLSAgICAg
ICAgLy8gdmFyaWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFkZCBtZXRob2Rz
IHRvIGFjY2VzcwotICAgICAgICAvLyB0aGVzZSB2YXJpYWJsZXMuCi0gICAgICAgIEVsZW1lbnQq
IG1fZWxlbWVudDsKLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3N0eWxlOwotICAgICAg
ICBTdHlsZWRFbGVtZW50KiBtX3N0eWxlZEVsZW1lbnQ7Ci0gICAgICAgIENvbnRhaW5lck5vZGUq
IG1fcGFyZW50Tm9kZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7Ci0gICAg
ICAgIFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAgICAgICBS
ZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3NhbWVPcmln
aW5Pbmx5OwotICAgICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7
Ci0KLSAgICAgICAgRUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRlOwotCi0gICAgICAgIGJv
b2wgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7Ci0KLSAgICAgICAgYm9vbCBtX2VsZW1l
bnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsKLQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUg
bV9tb2RlOwotCi0gICAgICAgIC8vIEEgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUgc2V0IG9mIG1h
dGNoZWQgcnVsZXMgZm9yIGFuIGVsZW1lbnQsCi0gICAgICAgIC8vIGFuZCBhIHRlbXBvcmFyeSBi
dWZmZXIgdXNlZCBmb3IgbWVyZ2Ugc29ydGluZy4KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVE
YXRhKiwgMzI+IG1fbWF0Y2hlZFJ1bGVzOwotICAgICAgICBSZWZQdHI8U3RhdGljQ1NTUnVsZUxp
c3Q+IG1fcnVsZUxpc3Q7Ci0KLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJT
dHlsZTsKLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7Ci0K
LSAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVz
OwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFk
ZXJzOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAg
ICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlm
Ci0gICAgICAgIENTU1ZhbHVlKiBtX2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2Zv
bnREaXJ0eTsKLQotICAgICAgICBib29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAgICAgICBCb3Jk
ZXJEYXRhIG1fYm9yZGVyRGF0YTsKLSAgICAgICAgRmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7
Ci0gICAgICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMg
UmVuZGVyU3R5bGUqIHN0eWxlTm90WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFll
dEF2YWlsYWJsZTsgfQotCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENT
U1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNo
ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAg
IFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1By
b3BlcnR5SUQsIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdF
X1NFVCkKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUlELCBDU1NJbWFnZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1ND
dXJzb3JJbWFnZVZhbHVlKik7Ci0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7
IH0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX3N0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAg
c3RhdGljIExlbmd0aCBjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5k
ZXJTdHlsZSosIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7
Ci0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1
ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxp
ZXIgPSAxKTsKLQotICAgIENTU1RvU3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5
bGVNYXA7IH0KLSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBw
ZXJzKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNj
cmlwdGlvbigpOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3Jp
cHRpb24oKSB7IHJldHVybiBtX3N0YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAg
dm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3Jp
cHRpb24pIHsgbV9zdGF0ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQot
ICAgIHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZv
aWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShm
KTsgfQotICAgIHZvaWQgc2V0VGV4dFNpemVBZGp1c3QoYm9vbCBiKSB7IG1fc3RhdGUuc2V0VGV4
dFNpemVBZGp1c3QoYik7IH0KLSAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdy
aXRpbmdNb2RlKSB7IG1fc3RhdGUuc2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAg
dm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikg
eyBtX3N0YXRlLnNldFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9Ci0gICAgCi0g
ICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAg
Ci1wcml2YXRlOgotICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc19zdHlsZU5vdFlldEF2YWlsYWJs
ZTsKLQotICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Ci0KLXByaXZhdGU6Ci0g
ICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCopIGNvbnN0Owot
Ci0gICAgdm9pZCBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0KLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIHZvaWQgYXBwbHlTVkdQcm9wZXJ0eShDU1NQcm9wZXJ0eUlELCBD
U1NWYWx1ZSopOwotI2VuZGlmCi0KLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRQZW5k
aW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5nSW1hZ2Vz
KCk7CisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xlZnRQ
YWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKyAgICB2b2lk
IG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVs
ZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2Us
IGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwogCi0gICAgc3RhdGlj
IHVuc2lnbmVkIGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3Bl
cnRpZXMqLCB1bnNpZ25lZCBzaXplKTsKLSAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZUl0ZW0gewotICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8q
KSBjb25zdDsKLSAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVkUHJvcGVy
dGllczsKLSAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBSZWZQdHI8UmVuZGVy
U3R5bGU+IHJlbmRlclN0eWxlOwotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBhcmVudFJl
bmRlclN0eWxlOwotICAgIH07Ci0gICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0q
IGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRj
aFJlc3VsdCYpOwotICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJl
bmRlclN0eWxlKiwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNo
LCBjb25zdCBNYXRjaFJlc3VsdCYpOworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBt
X3N0YXRlOworICAgIERvY3VtZW50UnVsZVNldHMmIG1fcnVsZVNldHM7CiAKLSAgICAvLyBFdmVy
eSBOIGFkZGl0aW9ucyB0byB0aGUgbWF0Y2hlZCBkZWNsYXJhdGlvbiBjYWNoZSB0cmlnZ2VyIGEg
c3dlZXAgd2hlcmUgZW50cmllcyBob2xkaW5nCi0gICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRv
IGEgc3R5bGUgZGVjbGFyYXRpb24gYXJlIGdhcmJhZ2UgY29sbGVjdGVkLgotICAgIHZvaWQgc3dl
ZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+Kik7Ci0KLSAgICBi
b29sIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYpIGNv
bnN0OwotICAgIGJvb2wgc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5n
QXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB1bnNpZ25lZCBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcDsKLQotICAgIHR5cGVkZWYg
SGFzaE1hcDx1bnNpZ25lZCwgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0+IE1hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGU7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGU7Ci0KLSAgICBUaW1lcjxTdHlsZVJlc29sdmVyPiBtX21hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGVTd2VlcFRpbWVyOwotCi0gICAgT3duUHRyPE1lZGlhUXVlcnlFdmFsdWF0b3I+IG1fbWVk
aXVtOwotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbV9yb290RGVmYXVsdFN0eWxlOwotCi0gICAg
RG9jdW1lbnQqIG1fZG9jdW1lbnQ7Ci0gICAgU2VsZWN0b3JGaWx0ZXIgbV9zZWxlY3RvckZpbHRl
cjsKLQotICAgIGJvb2wgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXM7Ci0KLSAgICBSZWZQdHI8
Q1NTRm9udFNlbGVjdG9yPiBtX2ZvbnRTZWxlY3RvcjsKLSAgICBWZWN0b3I8T3duUHRyPE1lZGlh
UXVlcnlSZXN1bHQ+ID4gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzOwotCi0j
aWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBSZWZQdHI8Vmlld3BvcnRTdHls
ZVJlc29sdmVyPiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKLSNlbmRpZgotCi0gICAgY29uc3Qg
U3R5bGVCdWlsZGVyJiBtX3N0eWxlQnVpbGRlcjsKLQotICAgIE93blB0cjxTdHlsZVNjb3BlUmVz
b2x2ZXI+IG1fc2NvcGVSZXNvbHZlcjsKLSAgICBDU1NUb1N0eWxlTWFwIG1fc3R5bGVNYXA7Ci0g
ICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7Ci0KLSAg
ICBTdGF0ZSBtX3N0YXRlOwotCi0gICAgZnJpZW5kIGNsYXNzIFN0eWxlQnVpbGRlcjsKLSAgICBm
cmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXMmKTsKLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNo
ZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmKTsKLSAgICBmcmllbmQgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsKLSAg
ICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hS
YW5nZXMmKTsKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKIH07CiAK
LWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0
IEF0b21pY1N0cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWF0dHJp
YnV0ZU5hbWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0
dHJzSW5SdWxlcy5jb250YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7Ci19Ci0KLWlubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5n
JiBjbGFzc1ZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkp
OwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFp
bnMoY2xhc3NWYWx1ZS5pbXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpo
YXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKLXsKLSAg
ICBBU1NFUlQoIWlkVmFsdWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0
dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwotfQotCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKKyNlbmRpZiAvLyBQ
YWdlUnVsZUNvbGxlY3Rvcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3Bw
CShyZXZpc2lvbiAxNDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlICJDb3VudGVyQ29u
dGVudC5oIgogI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKICNpbmNsdWRlICJEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCIKICNp
bmNsdWRlICJFbGVtZW50U2hhZG93LmgiCiAjaW5jbHVkZSAiRm9udEZlYXR1cmVWYWx1ZS5oIgog
I2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgpAQCAtODYsNiArODcsNyBAQAogI2luY2x1ZGUgIk5vZGVS
ZW5kZXJTdHlsZS5oIgogI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0LmgiCiAjaW5jbHVk
ZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmgiCiAjaW5jbHVkZSAiUGFp
ci5oIgogI2luY2x1ZGUgIlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCiAjaW5jbHVk
ZSAiUXVvdGVzRGF0YS5oIgpAQCAtMTA3LDcgKzEwOSw2IEBACiAjaW5jbHVkZSAiU2hhZG93RGF0
YS5oIgogI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKICNpbmNsdWRlICJTaGFkb3dWYWx1ZS5oIgot
I2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAiU2tld1Ry
YW5zZm9ybU9wZXJhdGlvbi5oIgogI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5oIgogI2luY2x1ZGUg
IlN0eWxlQ2FjaGVkSW1hZ2UuaCIKQEAgLTIxMCwzMCArMjExLDYgQEAgaWYgKGlzSW5pdGlhbCkg
eyBcCiAKIFJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0eWxlTm90WWV0QXZhaWxhYmxl
OwogCi1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpCi17
Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIGxlZnRU
b1JpZ2h0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKGxlZnRU
b1JpZ2h0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICBsZWZ0VG9SaWdodERlY2wtPnNldFByb3Bl
cnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7Ci0gICAgcmV0dXJuIGxlZnRU
b1JpZ2h0RGVjbC5nZXQoKTsKLX0KLQotc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIHJpZ2h0VG9M
ZWZ0RGVjbGFyYXRpb24oKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxl
UHJvcGVydHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUo
KSkpOwotICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHkoKSkKLSAgICAgICAgcmlnaHRU
b0xlZnREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVSdGwp
OwotICAgIHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Ci19Ci0KLQotaW5saW5lIFN0YXRp
Y0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVsZUxpc3QoKQotewot
ICAgIGlmICghbV9ydWxlTGlzdCkKLSAgICAgICAgbV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVM
aXN0OjpjcmVhdGUoKTsKLSAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsKLX0KLQogaW5saW5l
IHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpCiB7
CiAgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJhbmNlKCk7CkBAIC0y
NTEsOCArMjI4LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKAog
ICAgIG1fcGFyZW50U3R5bGUgPSAwOwogICAgIG1fcGFyZW50Tm9kZSA9IDA7CiAgICAgbV9yZWdp
b25Gb3JTdHlsaW5nID0gMDsKLSAgICBtX3J1bGVMaXN0ID0gMDsKLSAgICBtX21hdGNoZWRSdWxl
cy5jbGVhcigpOwogICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwogI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKICAgICBtX2hhc1BlbmRpbmdTaGFkZXJzID0gZmFsc2U7CkBAIC0y
NjIsNiArMjM3LDE2IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigK
ICNlbmRpZgogfQogCit2b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0OjphZGRNYXRjaGVk
UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUq
IHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9w
ZXJ0eVdoaXRlbGlzdFR5cGUpCit7CisgICAgbWF0Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgKyAxKTsKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVy
dGllcyYgbmV3UHJvcGVydGllcyA9IG1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKKyAgICBuZXdQ
cm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9w
ZXJ0aWVzKTsKKyAgICBuZXdQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBl
OworICAgIG5ld1Byb3BlcnRpZXMud2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlw
ZTsKKyAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworfQorCiBTdHlsZVJlc29sdmVyOjpT
dHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJT
dHlsZXMpCiAgICAgOiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RT
d2VlcCgwKQogICAgICwgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAm
U3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKQpAQCAtNDA1LDE4MiAr
MzkwLDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aQogICAgIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsKIH0KIAot
dm9pZCBTdHlsZVJlc29sdmVyOjphZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgbWF0
Y2hSZXN1bHQsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSog
cnVsZSwgdW5zaWduZWQgbGlua01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3Bl
cnR5V2hpdGVsaXN0VHlwZSkKLXsKLSAgICBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5n
cm93KG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOwotICAgIE1hdGNo
ZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMubGFzdCgpOwotICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5
bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRpZXMpOwotICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNo
VHlwZSA9IGxpbmtNYXRjaFR5cGU7Ci0gICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0g
cHJvcGVydHlXaGl0ZWxpc3RUeXBlOwotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlcy5hcHBl
bmQocnVsZSk7Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCog
cHJvcGVydHlTZXQsIGJvb2wgaXNDYWNoZWFibGUpCi17Ci0gICAgaWYgKCFwcm9wZXJ0eVNldCkK
LSAgICAgICAgcmV0dXJuOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlmIChyZXN1bHQucmFuZ2VzLmZpcnN0
QXV0aG9yUnVsZSA9PSAtMSkKLSAgICAgICAgcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUg
PSByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOwotICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVz
KHJlc3VsdCwgcHJvcGVydHlTZXQpOwotICAgIGlmICghaXNDYWNoZWFibGUpCi0gICAgICAgIHJl
c3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOwotfQotCi1jbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29w
ZSB7Ci1wdWJsaWM6Ci0gICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKLSAgICB+TWF0Y2hpbmdV
QVJ1bGVzU2NvcGUoKTsKLQotICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7Ci0K
LXByaXZhdGU6Ci0gICAgc3RhdGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Ci19OwotCi1NYXRj
aGluZ1VBUnVsZXNTY29wZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQotewotICAgIEFTU0VSVCgh
bV9tYXRjaGluZ1VBUnVsZXMpOwotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKLX0KLQot
TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgbV9t
YXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKLX0KLQotaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVz
U2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKLXsKLSAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVs
ZXM7Ci19Ci0KLWJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0g
ZmFsc2U7Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3Qg
TWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAg
IEFTU0VSVChtYXRjaFJlcXVlc3QucnVsZVNldCk7Ci0gICAgQVNTRVJUKG1fc3RhdGUuZWxlbWVu
dCgpKTsKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgRWxlbWVudCogZWxlbWVu
dCA9IHN0YXRlLmVsZW1lbnQoKTsKLSAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVt
ZW50ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNl
dWRvSWQgPSBlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpOwotICAgIGlmICghcHNldWRvSWQuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChzdHlsZWRFbGVtZW50KTsKLSAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQc2V1ZG9F
bGVtZW50UnVsZXMocHNldWRvSWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwot
ICAgIH0KLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICBpZiAoZWxlbWVudC0+aXNXZWJW
VFRFbGVtZW50KCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+Y3VlUHNldWRvUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OwotI2VuZGlmCi0gICAgLy8gQ2hlY2sgd2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxlcyBhcmUg
YXBwbGljYWJsZSBpbiB0aGUgY3VycmVudCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3IgdGhpczoK
LSAgICAvLyBhKSBpdCdzIGEgVUEgcnVsZQotICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93
cyBhdXRob3IgcnVsZXMKLSAgICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBz
dHlsZSBzaGVldCB3aXRoaW4gdGhlIHNhbWUgdHJlZSBzY29wZQotICAgIFRyZWVTY29wZSogdHJl
ZVNjb3BlID0gZWxlbWVudC0+dHJlZVNjb3BlKCk7Ci0gICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNT
Y29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotICAgICAgICAmJiAhdHJlZVNjb3BlLT5hcHBseUF1
dGhvclN0eWxlcygpCi0gICAgICAgICYmICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1hdGNoUmVx
dWVzdC5zY29wZS0+dHJlZVNjb3BlKCkgIT0gdHJlZVNjb3BlKQotICAgICAgICAmJiBtYXRjaFJl
cXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3Nz
Qm91bmRhcnkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIG5lZWQgdG8gY29sbGVjdCB0
aGUgcnVsZXMgZm9yIGlkLCBjbGFzcywgdGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGludG8gYSBi
dWZmZXIgYW5kCi0gICAgLy8gdGhlbiBzb3J0IHRoZSBidWZmZXIuCi0gICAgaWYgKGVsZW1lbnQt
Pmhhc0lEKCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVl
c3QucnVsZVNldC0+aWRSdWxlcyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwo
KSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBz
dHlsZWRFbGVtZW50LT5oYXNDbGFzcygpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQotICAgICAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1
bGVzKHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQotICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmxpbmtQ
c2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBpZiAoU2Vs
ZWN0b3JDaGVja2VyOjptYXRjaGVzRm9jdXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKLSAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1Bz
ZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVu
dC0+bG9jYWxOYW1lKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2Fs
UnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0
Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBpZiAoIW1fc3RhdGUucmVn
aW9uRm9yU3R5bGluZygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICB1bnNpZ25lZCBzaXplID0g
bWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgY29u
c3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1f
cmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7Ci0gICAgICAgIGlmIChj
aGVja1JlZ2lvblNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
bV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7Ci0gICAgICAgICAgICBSdWxl
U2V0KiByZWdpb25SdWxlcyA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCk7Ci0gICAgICAgICAgICBBU1NFUlQocmVn
aW9uUnVsZXMpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0
KHJlZ2lvblJ1bGVzLCBtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVz
dC5zY29wZSksIHJ1bGVSYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQp
Ci17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBWZWN0b3I8Y29uc3QgUnVsZURh
dGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOwotICAgIGlmICht
YXRjaGVkUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzb3J0TWF0Y2hl
ZFJ1bGVzKCk7Ci0KLSAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29s
bGVjdGluZ1J1bGVzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVk
UnVsZXMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5y
dWxlcygpLmFwcGVuZChtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVy
KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm93IHRyYW5zZmVyIHRoZSBz
ZXQgb2YgbWF0Y2hlZCBydWxlcyBvdmVyIHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7Ci0g
ICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNv
bW1vbkF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRV
bmlxdWUoKTsKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVs
ZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0
Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlX
aGl0ZWxpc3RUeXBlKCkpOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNj
b3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCi17Ci0jaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCi0g
ICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIE1hdGNo
IHNjb3BlZCBhdXRob3IgcnVsZXMgYnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3Rh
Y2sgKHJlYnVpbGQgaXQgaWYgaXQgZ290IGluY29uc2lzdGVudCkuCi0gICAgaWYgKG1fc2NvcGVS
ZXNvbHZlci0+aGFzU2NvcGVkU3R5bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFj
a0NvbnNpc3RlbmN5KG1fc3RhdGUuZWxlbWVudCgpKSkgewotICAgICAgICBib29sIGFwcGx5QXV0
aG9yU3R5bGVzID0gbV9zdGF0ZS5lbGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0
eWxlcygpOwotICAgICAgICBib29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOwotICAgICAgICB1bnNp
Z25lZCBzY29wZVNpemUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2NvcGVTaXplOyArK2kpIHsKLSAgICAgICAgICAgIG1f
c3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgICAgIHJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQot
ICAgICAgICAgICAgY29uc3QgU3R5bGVTY29wZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBmcmFtZSA9
IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tGcmFtZUF0KGkpOwotICAgICAgICAgICAgZG9jdW1lbnRT
Y29wZSA9IGRvY3VtZW50U2NvcGUgJiYgIWZyYW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dUcmVlKCk7
Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRTY29wZSkgewotICAgICAgICAgICAgICAgIGlmICgh
YXBwbHlBdXRob3JTdHlsZXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlci0+bWF0
Y2hlc1N0eWxlQm91bmRzKGZyYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QoZnJh
bWUubV9ydWxlU2V0LCBpbmNsdWRlRW1wdHlSdWxlcywgZnJhbWUubV9zY29wZSk7Ci0gICAgICAg
ICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2Uo
KTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKLSAgICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhyZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWF0Y2hIb3N0UnVsZXMocmVzdWx0
LCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwot
ICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZW5kaWYKLX0KLQogaW5saW5l
IGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxl
cygpCiB7CiAjaWYgRU5BQkxFKFNIQURPV19ET00pCkBAIC01OTAsMTk3ICszOTksNiBAQCBpbmxp
bmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDCiAjZW5kaWYKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIEFTU0VSVCht
X3Njb3BlUmVzb2x2ZXIpOwotCi0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwot
ICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMTsKLQotICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOwotICAg
IG1fc2NvcGVSZXNvbHZlci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNo
ZWRSdWxlcyk7Ci0gICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAt
LWkpIHsKLSAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9y
UnVsZVJhbmdlKCk7Ci0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdCht
YXRjaGVkUnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgp
KSwgcnVsZVJhbmdlKTsKLSAgICB9Ci0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJl
c3VsdCk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwotICAgIFVOVVNFRF9QQVJB
TShpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpt
YXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCi17Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5y
YW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MTsKLQotICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IC8vIE1hdGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVx
dWVzdChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBS
dWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotI2lm
IEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVz
dHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNo
UmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKLSAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKLSNlbmRpZgotCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0KLSAgICBtYXRjaFNjb3Bl
ZEF1dGhvclJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpCi17Ci0gICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0g
ICAgcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMTsKLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNl
clN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
cmVzdWx0LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMo
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVn
aW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcyhyZXN1bHQpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhN
YXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKLXsKLSAgICBtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0g
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVS
YW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25z
dCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0g
ICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHls
ZSBmb3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSBy
ZXNvbHZlLgotICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRv
LWRhdGUgaW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBi
b29sIGNhblVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25z
aXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3Vu
ZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OwotCi0gICAgdW5z
aWduZWQgc2l6ZSA9IHJ1bGVzLT5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHNpemU7ICsraSkgewotICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+
YXQoaSk7Ci0gICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIu
ZmFzdFJlamVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxl
RGF0YS5kZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOwot
ICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOwot
ICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChy
dWxlTWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBt
YXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgewotICAgICAgICAgICAgLy8gSWYgdGhl
IHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBu
b24tZGVidWcgbW9kZS4KLSAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3Bl
cnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMg
fHwgKHByb3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1
bGVzKSkgewotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0
Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQg
Z2V0TWF0Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMg
bmVlZGVkLgotICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVs
ZURhdGEuaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB3
ZSdyZSBtYXRjaGluZyBub3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKLSAgICAgICAg
ICAgIC8vIHdlIHJlYWxseSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KLSAgICAgICAg
ICAgIGlmIChkeW5hbWljUHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVx
dWVzdCgpLnBzZXVkb0lkID09IE5PUFNFVURPKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRl
Lm1vZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAgICAgICAg
ICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUs
IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNF
VURPSUQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0
eWxlKGR5bmFtaWNQc2V1ZG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAvLyBVcGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1
bGVzIGFycmF5LgotICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7Ci0g
ICAgICAgICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKLSAgICAg
ICAgICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RS
dWxlSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0
IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVs
ZSgmcnVsZURhdGEpOwotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
OjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5l
IGJvb2wgY29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIy
KQotewotICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOwotICAg
IHVuc2lnbmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOwotICAgIHJldHVybiAo
c3BlY2lmaWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3Np
dGlvbigpIDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6OnNvcnRNYXRjaGVkUnVsZXMoKQotewotICAgIHN0ZDo6c29ydChtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVS
dWxlcyk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3Vs
dCYgcmVzdWx0LCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKLXsKLSAgICBtYXRjaFVBUnVs
ZXMocmVzdWx0KTsKLQotICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgotICAg
IGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMo
cmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5p
bmcgZmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwu
Ci0gICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgIGFkZEVsZW1lbnRT
dHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0
aW9uQXR0cmlidXRlU3R5bGUoKSk7Ci0KLSAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9u
YWwgbWFwcGVkIGRlY2xhcmF0aW9ucy4KLSAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxs
cyBzaGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0g
ICAgICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUg
ZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCi0gICAgICAgIGFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+
YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIGlmICht
X3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBi
b29sIGlzQXV0bzsKLSAgICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbiA9IHRv
SFRNTEVsZW1lbnQobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFz
RGlyQXV0b0F0dHJpYnV0ZShpc0F1dG8pOwotICAgICAgICAgICAgaWYgKGlzQXV0bykKLSAgICAg
ICAgICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0g
TFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigp
KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0
aG9yIHNoZWV0cyBuZXh0LgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAg
ICAgICAgbWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVj
ayBvdXIgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlubGluZVN0eWxlKCkpIHsKLSAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0
YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCi0gICAgICAgIC8vIEZJ
WE1FOiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0
aCBjYWNoaW5nLgotICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgLy8gRklYTUU6IENv
bnN0aWZ5LgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUp
OwotICAgIH0KLQotI2lmIEVOQUJMRShTVkcpCi0gICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0
aW9uIG92ZXJyaWRlIHN0eWxlLgotICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9t
YXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQotICAgICAgICBhZGRFbGVtZW50
U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8q
IGlzQ2FjaGVhYmxlICovKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJv
cGVydGllcyk7Ci0jZW5kaWYKLX0KLQogYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZm
ZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0CiB7
CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsK
QEAgLTgwOCw5ICs0MjYsOCBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjppbml0RWxlbWVu
dChFCiAgICAgfQogfQogCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZv
clN0eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVl
c3QsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKK2lubGluZSB2b2lkIFN0eWxlUmVz
b2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxl
bWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZv
clN0eWxpbmcpCiB7Ci0gICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJlcXVl
c3Q7CiAgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKIAogICAgIGlm
IChlKSB7CkBAIC04MzIsNyArNDQ5LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3Rh
dGU6OmluaXRGbwogCiAgICAgbV9zdHlsZSA9IDA7CiAgICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9IDA7CiAgICAgbV9mb250RGlydHkgPSBmYWxz
ZTsKIH0KIApAQCAtOTAwLDE3ICs1MTYsOSBAQCBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hh
cmluZ0NhbmRpZGF0CiB7CiAgICAgaWYgKCFydWxlU2V0KQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwogCi0gICAgbV9zdGF0ZS5zZXRN
b2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5k
ZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmly
c3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1h
dGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKLSAgICBtX3N0YXRlLnNldE1vZGUoU2Vs
ZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0gICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1
bGVzKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRj
aGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJldHVybiB0cnVlOworICAgIEVsZW1lbnRSdWxlQ29s
bGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBtX3N0YXRlKTsKKyAgICByZXR1cm4gY29sbGVjdG9yLmhh
c0FueU1hdGNoaW5nUnVsZXMocnVsZVNldCk7CiB9CiAKIGJvb2wgU3R5bGVSZXNvbHZlcjo6Y2Fu
U2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0CkBAIC0x
MTc4LDI2ICs3ODYsNiBAQCBSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hhcmVk
CiAgICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKIH0KIAotdm9pZCBTdHls
ZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBNYXRj
aGluZ1VBUnVsZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZy
b20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZh
bHNlOwotICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21lZGl1bS0+bWVkaWFU
eXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0
czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHls
ZTsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAg
IC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBh
Z2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAg
IG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJr
c1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChp
biB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2gg
cnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50
KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQogc3RhdGljIHZvaWQgc2V0
U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdpbmF0aW9uTW9kZSwg
UmVuZGVyU3R5bGUqIHN0eWxlKQogewogICAgIGlmIChwYWdpbmF0aW9uTW9kZSA9PSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZCkKQEAgLTEzOTUsNyArOTgzLDcgQEAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gU3R5bGVSZXNvbHZlcjo6cwogCiAgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKICAg
ICBpbml0RWxlbWVudChlbGVtZW50KTsKLSAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRv
Y3VtZW50KCksIGVsZW1lbnQsIGRlZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JTdHls
aW5nKTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGVsZW1lbnQs
IGRlZmF1bHRQYXJlbnQsIHJlZ2lvbkZvclN0eWxpbmcpOwogICAgIGlmIChzaGFyaW5nQmVoYXZp
b3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Q
b2ludCgpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJl
ZFN0eWxlKCk7CiAgICAgICAgIGlmIChzaGFyZWRTdHlsZSkKQEAgLTE0MzcsMTMgKzEwMjUsMTYg
QEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cwogICAgIGlmIChuZWVk
c0NvbGxlY3Rpb24pCiAgICAgICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50
KCktPmlzVmlld1NvdXJjZSgpLCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwogCi0gICAgTWF0Y2hS
ZXN1bHQgbWF0Y2hSZXN1bHQ7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRo
aXMsIHN0YXRlKTsKKyAgICBjb2xsZWN0b3Iuc2V0UmVnaW9uRm9yU3R5bGluZyhyZWdpb25Gb3JT
dHlsaW5nKTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVtKG1fbWVkaXVtLmdldCgpKTsKKwogICAg
IGlmIChtYXRjaGluZ0JlaGF2aW9yID09IE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKQotICAgICAg
ICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1
bGVzKCk7CiAgICAgZWxzZQotICAgICAgICBtYXRjaEFsbFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRj
aGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKKyAgICAgICAgY29s
bGVjdG9yLm1hdGNoQWxsUnVsZXMobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIG1hdGNoaW5n
QmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOwogCi0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7CisgICAgYXBwbHlNYXRjaGVkUHJv
cGVydGllcyhjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpLCBlbGVtZW50KTsKIAogICAgIC8vIENs
ZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChh
bW9uZyBvdGhlciBmaXh1cHMpLgogICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCks
IHN0YXRlLnBhcmVudFN0eWxlKCksIGVsZW1lbnQpOwpAQCAtMTQ2MCw3ICsxMDUxLDcgQEAgUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cwogewogICAgIE1hdGNoUmVzdWx0
IHJlc3VsdDsKICAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYWRkTWF0
Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKyAgICAgICAg
cmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwogCiAg
ICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOwogCkBAIC0xNTg0LDcgKzExNzUsNyBAQCBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpwCiAKICAgICBpbml0RWxlbWVudChl
KTsKIAotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50
U3R5bGUsIHBzZXVkb1N0eWxlUmVxdWVzdCk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2
ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHlsZSk7CiAgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVy
U3R5bGU6OmNyZWF0ZSgpKTsKICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRl
LnBhcmVudFN0eWxlKCkpOwogCkBAIC0xNTkyLDIwICsxMTgzLDIyIEBAIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnAKICAgICAvLyB0aG9zZSBydWxlcy4KIAogICAgIC8v
IENoZWNrIFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hS
ZXN1bHQ7Ci0gICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKyAgICBFbGVtZW50UnVsZUNv
bGxlY3RvciBjb2xsZWN0b3IodGhpcywgc3RhdGUpOworICAgIGNvbGxlY3Rvci5zZXRQc2V1ZG9T
dHlsZVJlcXVlc3QocHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVt
KG1fbWVkaXVtLmdldCgpKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAKICAgICBp
ZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMo
bWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRjaFJlc3Vs
dCwgZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVc2VyUnVsZXMoZmFsc2UpOworICAg
ICAgICBjb2xsZWN0b3IubWF0Y2hBdXRob3JSdWxlcyhmYWxzZSk7CiAgICAgfQogCi0gICAgaWYg
KG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICBpZiAoY29sbGVj
dG9yLm1hdGNoZWRSZXN1bHQoKS5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybiAwOwogCiAgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVkb1N0eWxl
UmVxdWVzdC5wc2V1ZG9JZCk7CiAKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVz
dWx0LCBlKTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbGxlY3Rvci5tYXRjaGVkUmVz
dWx0KCksIGUpOwogCiAgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkg
YW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCiAgICAgYWRqdXN0UmVu
ZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKQEAgLTE2
MjYsMTcgKzEyMTksMTIgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6
cwogICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKICAgICBtX3N0
YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKIAot
ICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0
IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgU3RyaW5n
IHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOwotICAgIAotICAgIE1hdGNoUmVzdWx0IHJlc3Vs
dDsKLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVm
YXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbWF0Y2hQYWdlUnVs
ZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2Up
OwotICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBh
Z2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1
bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAg
ICBQYWdlUnVsZUNvbGxlY3RvciBjb2xsZWN0b3IobV9zdGF0ZSwgbV9ydWxlU2V0cyk7CisgICAg
Y29sbGVjdG9yLm1hdGNoQWxsUGFnZVJ1bGVzKHBhZ2VJbmRleCk7CiAgICAgbV9zdGF0ZS5zZXRM
aW5lSGVpZ2h0VmFsdWUoMCk7CiAgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisKKyAg
ICBNYXRjaFJlc3VsdCYgcmVzdWx0ID0gY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKTsKICNpZiBF
TkFCTEUoQ1NTX1ZBUklBQkxFUykKICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxl
RGVmaW5pdGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKICNlbmRpZgpAQCAtMjA2Myw4OSArMTY1MSwzMSBA
QCBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpwCiAgICAgaWYgKCFlIHx8
ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKICAgICAgICAgcmV0dXJu
IDA7CiAKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVs
ZXMpOwotCiAgICAgaW5pdEVsZW1lbnQoZSk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNv
bHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCk7CisKKyAgICBFbGVtZW50UnVsZUNvbGxlY3RvciBj
b2xsZWN0b3IodGhpcywgbV9zdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldE1vZGUoU2VsZWN0b3JD
aGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOworICAgIGNvbGxlY3Rvci5zZXRQc2V1ZG9TdHlsZVJl
cXVlc3QoUHNldWRvU3R5bGVSZXF1ZXN0KHBzZXVkb0lkKSk7CisgICAgY29sbGVjdG9yLnNldE1l
ZGl1bShtX21lZGl1bS5nZXQoKSk7CiAKLSAgICBNYXRjaFJlc3VsdCBkdW1teTsKICAgICBpZiAo
cnVsZXNUb0luY2x1ZGUgJiBVQUFuZFVzZXJDU1NSdWxlcykgewogICAgICAgICAvLyBGaXJzdCB3
ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgotICAgICAgICBtYXRjaFVB
UnVsZXMoZHVtbXkpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAKICAgICAg
ICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCiAgICAgICAgIGlmIChtX21hdGNo
QXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBy
dWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworICAgICAgICAgICAgY29sbGVjdG9yLm1h
dGNoVXNlclJ1bGVzKHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CiAgICAgfQogCiAg
ICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVkZSAmIEF1
dGhvckNTU1J1bGVzKSkgewotICAgICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVs
ZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisgICAgICAgIGNvbGxlY3Rvci5z
ZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykp
OwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgotICAgICAg
ICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMp
OwotCi0gICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOwotICAgIH0KLQot
ICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLQot
ICAgIHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOwotfQotCi1pbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENv
bnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVj
a2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQotewotICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNl
bGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGlu
Y2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxl
UmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBz
ZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUg
aGFzaC4KLSAgICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24n
dCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2UuCi0gICAgICAgIGlmIChydWxlRGF0YS5oYXNS
aWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVs
ZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhh
c011bHRpcGFydFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2Vs
ZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQo
KSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZh
c3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7Ci0gICAgICAgIGlm
ICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVj
dG9yKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGVj
dG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsKKyAgICAgICAgY29sbGVjdG9yLm1hdGNoQXV0
aG9yUnVsZXMocnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKICAgICB9CiAKLSAgICAv
LyBTbG93IHBhdGguCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVu
dCgpLCBzdGF0ZS5tb2RlKCkpOwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2lu
Z0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNl
bGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5lbGVtZW50
U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwotICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKLSAgICBj
b250ZXh0LnBzZXVkb0lkID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7Ci0g
ICAgY29udGV4dC5zY3JvbGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxi
YXI7Ci0gICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2
aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0
b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJz
YWxTdHJhdGVneSgpKTsKLSAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rv
ck1hdGNoZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUucHNldWRvU3R5
bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1
ZXN0KCkucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2Vs
ZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25F
bGVtZW50KQotewotICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNr
ZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5tb2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0
b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkg
ewotICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVj
dG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6Vmlz
aXRlZE1hdGNoRGlzYWJsZWQpOwotICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRv
ID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JD
aGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxT
dHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4g
Y29sbGVjdG9yLm1hdGNoZWRSdWxlTGlzdCgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCkBAIC0yNDI0LDg2ICsxOTU0LDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjphcHBs
eU1hdGNoZWRQcm9wZXJ0aQogICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKIH0K
IAotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFn
ZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2VsZWN0
b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQs
IFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0
IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1hdGNo
UGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlz
TGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdlUnVs
ZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KG1h
dGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBh
Z2VSdWxlcyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxl
cy5zaXplKCk7IGkrKykKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRj
aGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1Bh
Z2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlz
TGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0g
ICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVu
dDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKGNv
bXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5h
bWUoKTsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1l
ICE9IHBhZ2VOYW1lKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQot
Ci0gICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQt
PnBzZXVkb1R5cGUoKTsKLSAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQ
c2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBl
ID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAgICAg
ICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlz
Rmlyc3RQYWdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMs
IGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJv
b2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVsZVBh
Z2UqIHJ1bGUgPSBydWxlc1tpXTsKLQotICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29t
cG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5h
bWUpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFz
IG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAg
ICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRj
aGVkIHJ1bGVzLgotICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0KLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17
Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlzRmly
c3RQYWdlTGVmdCA9IHRydWU7Ci0KLSAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFn
ZUxlZnQgPyAxIDogMCkpICUgMjsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFn
ZShpbnQgcGFnZUluZGV4KSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNl
ZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmly
c3QgcGFnZS4KLSAgICByZXR1cm4gKCFwYWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVSZXNv
bHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBGSVhN
RTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0dXJu
ICIiOwotfQotCiB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1By
b3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQogewogICAg
IGluaXRFbGVtZW50KDApOwpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCShyZXZp
c2lvbiAxNDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKICNp
bmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIKICNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgor
I2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAiU3R5bGVJ
bmhlcml0ZWREYXRhLmgiCiAjaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCiAjaW5jbHVk
ZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCkBAIC0xNTYsMTIgKzE1NywxMCBAQCBwdWJsaWM6
CiAgICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNr
ZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNr
ZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQogICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKICAg
ICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAgICAgLCBz
Y29wZShzY29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5k
YXJ5KSB7IH0KKyAgICAgICAgLCBzY29wZShzY29wZSkgeyB9CiAgICAgY29uc3QgUnVsZVNldCog
cnVsZVNldDsKICAgICBjb25zdCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzOwogICAgIGNvbnN0IENv
bnRhaW5lck5vZGUqIHNjb3BlOwotICAgIGNvbnN0IFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JB
dEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeTsKIH07CiAKIC8vIFRoaXMgY2xhc3Mgc2VsZWN0
cyBhIFJlbmRlclN0eWxlIGZvciBhIGdpdmVuIGVsZW1lbnQgYmFzZWQgb24gYSBjb2xsZWN0aW9u
IG9mIHN0eWxlc2hlZXRzLgpAQCAtMjA3LDYgKzIwNiw3IEBAIHB1YmxpYzoKIAogICAgIERvY3Vt
ZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQogICAgIGNvbnN0
IERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsg
fQorICAgIFNlbGVjdG9yRmlsdGVyJiBzZWxlY3RvckZpbHRlcigpIHsgcmV0dXJuIG1fc2VsZWN0
b3JGaWx0ZXI7IH0KIAogI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1df
RE9NKQogICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCkBAIC0z
MjUsMTQgKzMyNSw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMo
KTsKIAotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0
IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZh
bWlseSBoYXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hh
bmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLSAgICB2b2lkIGNo
ZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7
Ci0gICAgdm9pZCBjaGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0KLSAgICB2b2lkIGFkanVzdFJl
bmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUsIEVsZW1lbnQqKTsKLQogICAgIHN0cnVjdCBSdWxlUmFuZ2UgewogICAgICAgICBSdWxl
UmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxl
SW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQog
ICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OwpAQCAtMzc0LDMwICszNjYsMjIgQEAgcHJpdmF0
ZToKICAgICAgICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7CiAgICAgICAg
IE1hdGNoUmFuZ2VzIHJhbmdlczsKICAgICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKKworICAgICAg
ICB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3Bl
cnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JD
aGVja2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxp
c3ROb25lKTsKICAgICB9OwogCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMo
TWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1
bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hB
bGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAg
dm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQ
cm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKK3ByaXZhdGU6CisgICAgLy8g
VGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0
cyB0aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gK
KyAgICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSk7CisgICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVy
U3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3JUZXh0
U2l6ZUFkanVzdCgpOwogCi0gICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9v
bCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVz
dWx0Jik7Ci0gICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7Ci0g
ICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcyk7Ci0gICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3Vs
dCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0
Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLQotICAgIHZvaWQgY29sbGVjdE1h
dGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFu
Z2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8
UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAgdm9pZCBh
ZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlLCBFbGVtZW50Kik7CiAKICAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihj
b25zdCBSdWxlRGF0YSYpIGNvbnN0OwotICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOwotICAg
IHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CiAKLSAgICBi
b29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2Nv
cGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxl
Y3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9u
U2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdp
b25FbGVtZW50KTsKICAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hS
ZXN1bHQmLCBjb25zdCBFbGVtZW50Kik7CisKICAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNz
IHsKICNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9u
cywKQEAgLTQ0NiwxMiArNDMwLDkgQEAgcHVibGljOgogICAgICAgICAsIG1fcGFyZW50U3R5bGUo
MCkKICAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3JlZ2lvbkZv
clN0eWxpbmcoMCkKLSAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQotICAgICAgICAs
IG1fcHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKQogICAgICAgICAsIG1fZWxlbWVudExpbmtT
dGF0ZShOb3RJbnNpZGVMaW5rKQogICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBv
aW50KGZhbHNlKQogICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNl
KQotICAgICAgICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQogICAg
ICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCiAgICAgICAgICwgbV9h
cHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQogI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKQEAgLTQ2NCw3ICs0NDUsNyBAQCBwdWJsaWM6CiAKICAgICBwdWJsaWM6CiAgICAgICAg
IHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOwotICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJl
c29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwg
Y29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyks
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lkIGluaXRG
b3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlID0gMCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CiAgICAgICAgIHZv
aWQgY2xlYXIoKTsKIAogICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVy
biBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KQEAgLTQ3NCwyNSArNDU1LDE3IEBAIHB1YmxpYzoK
ICAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQo
KTsgfQogICAgICAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVy
biBtX3N0eWxlLnJlbGVhc2UoKTsgfQogCi0gICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1
cmVSdWxlTGlzdCgpOwotICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxp
c3QoKSB7IHJldHVybiBtX3J1bGVMaXN0LnJlbGVhc2UoKTsgfQotCiAgICAgICAgIGNvbnN0IENv
bnRhaW5lck5vZGUqIHBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0K
ICAgICAgICAgdm9pZCBzZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsg
bV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOyB9CiAgICAgICAgIFJlbmRlclN0eWxlKiBwYXJl
bnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KICAgICAgICAgUmVuZGVy
U3R5bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5
bGU7IH0KIAogICAgICAgICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBj
b25zdCB7IHJldHVybiBtX3JlZ2lvbkZvclN0eWxpbmc7IH0KLSAgICAgICAgdm9pZCBzZXRTYW1l
T3JpZ2luT25seShib29sIGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlz
U2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3Qg
eyByZXR1cm4gbV9zYW1lT3JpZ2luT25seTsgfQotICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVS
ZXF1ZXN0OyB9CiAgICAgICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7
IHJldHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KICAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRv
SW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Q
b2ludDsgfQogICAgICAgICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29s
IGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVk
OyB9CiAgICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KLSAgICAgICAgdm9pZCBzZXRN
b2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAg
ICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0K
LSAgICAgICAgCisKICAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUo
Ym9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsg
fQogICAgICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBp
c0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0K
ICAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVy
biBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsgfQpAQCAtNTI2LDkgKzQ5OSw4IEBAIHB1
YmxpYzoKICAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9k
ZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7
IH0KICAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRP
cmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0T3JpZW50YXRpb24o
dGV4dE9yaWVudGF0aW9uKTsgfQogCi0gICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMy
PiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRjaGVkUnVsZXM7IH0KLSAgICAgICAgdm9p
ZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSogcnVsZSkgeyBtX21hdGNoZWRSdWxlcy5h
cHBlbmQocnVsZSk7IH0KLSAgICAgICAgCisgICAgICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCkg
Y29uc3QgeyByZXR1cm4gbV9lbGVtZW50ICYmIG1fZWxlbWVudC0+aXNTVkdFbGVtZW50KCk7IH0K
KwogICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0
IGVhc2llciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgogICAgICAgICAvLyB2YXJpYWJsZXMgYXJl
IHB1YmxpYy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCkBAIC01Mzks
MjQgKzUxMSwxNiBAQCBwdWJsaWM6CiAgICAgICAgIENvbnRhaW5lck5vZGUqIG1fcGFyZW50Tm9k
ZTsKICAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7CiAgICAgICAgIFJlbmRlclN0
eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAgICAgICBSZW5kZXJSZWdpb24q
IG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5OwotICAg
ICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7CiAKKyAgICAgICAg
Ly8gUmVxdWlyZWQgdG8gQVNTRVJUIGluIGFwcGx5UHJvcGVydGllcy4KKyAgICAgICAgUmVuZGVy
UmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7CisgICAgICAgIAogICAgICAgICBFSW5zaWRlTGlu
ayBtX2VsZW1lbnRMaW5rU3RhdGU7CiAKICAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludDsKIAogICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVz
OwogCi0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7Ci0KLSAgICAgICAgLy8g
QSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxl
bWVudCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBz
b3J0aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVs
ZXM7Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKLQogICAg
ICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOwogICAgICAgICBib29sIG1f
YXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsKIApAQCAtNjk1LDYgKzY1OSwyMSBAQCBp
bmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvCiAgICAgcmV0dXJuIG1fcnVs
ZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKIH0K
IAoraW5saW5lIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVn
aW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgaWYgKCFyZWdpb25T
ZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
U2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihyZWdpb25FbGVtZW50LT5kb2N1bWVudCgp
LCBTZWxlY3RvckNoZWNrZXI6OlF1ZXJ5aW5nUnVsZXMpOworICAgIGZvciAoY29uc3QgQ1NTU2Vs
ZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChz
KSkgeworICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNl
bGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6
VmlzaXRlZE1hdGNoRGlzYWJsZWQpOworICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNl
dWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0
b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJz
YWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIFN0eWxlUmVzb2x2ZXJfaApJbmRleDogU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwCShyZXZpc2lv
biAxNDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NTgsMTEgKzk1OCwxMSBAQCBQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpDU1M6OlNlbGVjdG9yUHJvCiAgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CiB9
CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OndpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiBydWxl
LCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6
d2lsbE1hdGNoUnVsZShTdHlsZVJ1bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGlu
c3BlY3RvckNTU09NV3JhcHBlcnMsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxl
U2hlZXRDb2xsZWN0aW9uKQogewogLy8gICAgcHJpbnRmKCJJbnNwZWN0b3JDU1NBZ2VudDo6d2ls
bE1hdGNoUnVsZSAlc1xuIiwgcnVsZS0+c2VsZWN0b3JMaXN0KCkuc2VsZWN0b3JzVGV4dCgpLnV0
ZjgoKS5kYXRhKCkpOwogICAgIGlmIChtX2N1cnJlbnRTZWxlY3RvclByb2ZpbGUpCi0gICAgICAg
IG1fY3VycmVudFNlbGVjdG9yUHJvZmlsZS0+c3RhcnRTZWxlY3RvcihzdHlsZVJlc29sdmVyLT5p
bnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkuZ2V0V3JhcHBlckZvclJ1bGVJblNoZWV0cyhydWxlLCBz
dHlsZVJlc29sdmVyLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKSk7CisgICAg
ICAgIG1fY3VycmVudFNlbGVjdG9yUHJvZmlsZS0+c3RhcnRTZWxlY3RvcihpbnNwZWN0b3JDU1NP
TVdyYXBwZXJzLmdldFdyYXBwZXJGb3JSdWxlSW5TaGVldHMocnVsZSwgc3R5bGVTaGVldENvbGxl
Y3Rpb24pKTsKIH0KIAogdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6ZGlkTWF0Y2hSdWxlKGJvb2wg
bWF0Y2hlZCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2Vu
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NB
Z2VudC5oCShyZXZpc2lvbiAxNDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQ1NTQWdlbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsOSBAQCBjbGFzcyBD
U1NTdHlsZURlY2xhcmF0aW9uOwogY2xhc3MgQ1NTU3R5bGVSdWxlOwogY2xhc3MgQ1NTU3R5bGVT
aGVldDsKIGNsYXNzIERvY3VtZW50OworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjsKIGNsYXNzIEVsZW1lbnQ7CitjbGFzcyBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwogY2xhc3Mg
SW5zcGVjdG9yRnJvbnRlbmQ7CiBjbGFzcyBJbnN0cnVtZW50aW5nQWdlbnRzOwogY2xhc3MgTmFt
ZU5vZGVNYXA7CkBAIC0xMjUsNyArMTI3LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBz
dG9wU2VsZWN0b3JQcm9maWxlcihFcnJvclN0cmluZyosIFJlZlB0cjxUeXBlQnVpbGRlcjo6Q1NT
OjpTZWxlY3RvclByb2ZpbGU+Jik7CiAKICAgICBQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6
OlNlbGVjdG9yUHJvZmlsZT4gc3RvcFNlbGVjdG9yUHJvZmlsZXJJbXBsKEVycm9yU3RyaW5nKiwg
Ym9vbCBuZWVkUHJvZmlsZSk7Ci0gICAgdm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSosIFN0
eWxlUmVzb2x2ZXIqKTsKKyAgICB2b2lkIHdpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiwgSW5zcGVj
dG9yQ1NTT01XcmFwcGVycyYsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsKICAgICB2
b2lkIGRpZE1hdGNoUnVsZShib29sKTsKICAgICB2b2lkIHdpbGxQcm9jZXNzUnVsZShTdHlsZVJ1
bGUqLCBTdHlsZVJlc29sdmVyKik7CiAgICAgdm9pZCBkaWRQcm9jZXNzUnVsZSgpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRh
dGlvbi5jcHAJKHJldmlzaW9uIDE0NTAzMCkKKysrIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OTAsMTEgKzU5
MCwxMSBAQCB2b2lkIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkU2NoZWR1CiAgICAgICAg
IHJlc291cmNlQWdlbnQtPmRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKGRvY3VtZW50KTsK
IH0KIAotSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGlu
Z0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQor
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50
cywgU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NP
TVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzaGVldENvbGxlY3Rpb24p
CiB7CiAgICAgSW5zcGVjdG9yQ1NTQWdlbnQqIGNzc0FnZW50ID0gaW5zdHJ1bWVudGluZ0FnZW50
cy0+aW5zcGVjdG9yQ1NTQWdlbnQoKTsKICAgICBpZiAoY3NzQWdlbnQpIHsKLSAgICAgICAgY3Nz
QWdlbnQtPndpbGxNYXRjaFJ1bGUocnVsZSwgc3R5bGVSZXNvbHZlcik7CisgICAgICAgIGNzc0Fn
ZW50LT53aWxsTWF0Y2hSdWxlKHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIHNoZWV0Q29s
bGVjdGlvbik7CiAgICAgICAgIHJldHVybiBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUo
aW5zdHJ1bWVudGluZ0FnZW50cywgMSk7CiAgICAgfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCShyZXZpc2lvbiAx
NDUwMzApCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTYxLDEwICs2MSwxMiBAQCBjbGFzcyBEb2N1bWVudDsK
IGNsYXNzIEVsZW1lbnQ7CiBjbGFzcyBFdmVudENvbnRleHQ7CiBjbGFzcyBEb2N1bWVudExvYWRl
cjsKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBEZXZpY2VPcmll
bnRhdGlvbkRhdGE7CiBjbGFzcyBHZW9sb2NhdGlvblBvc2l0aW9uOwogY2xhc3MgR3JhcGhpY3ND
b250ZXh0OwogY2xhc3MgSW5zcGVjdG9yQ1NTQWdlbnQ7CitjbGFzcyBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzOwogY2xhc3MgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOwogY2xhc3MgSW5zcGVjdG9y
VGltZWxpbmVBZ2VudDsKIGNsYXNzIEluc3RydW1lbnRpbmdBZ2VudHM7CkBAIC0xNzMsNyArMTc1
LDcgQEAgcHVibGljOgogICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUg
d2lsbFJlY2FsY3VsYXRlU3R5bGUoRG9jdW1lbnQqKTsKICAgICBzdGF0aWMgdm9pZCBkaWRSZWNh
bGN1bGF0ZVN0eWxlKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwogICAg
IHN0YXRpYyB2b2lkIGRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKERvY3VtZW50Kik7Ci0g
ICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlKERv
Y3VtZW50KiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOworICAgIHN0YXRpYyBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZShEb2N1bWVudCosIFN0eWxlUnVs
ZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Kik7CiAgICAgc3RhdGljIHZvaWQgZGlkTWF0Y2hSdWxlKGNvbnN0IEluc3BlY3Rvckluc3RydW1l
bnRhdGlvbkNvb2tpZSYsIGJvb2wgbWF0Y2hlZCk7CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbkNvb2tpZSB3aWxsUHJvY2Vzc1J1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBT
dHlsZVJlc29sdmVyKik7CiAgICAgc3RhdGljIHZvaWQgZGlkUHJvY2Vzc1J1bGUoY29uc3QgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJik7CkBAIC0zNzMsNyArMzc1LDcgQEAgcHJpdmF0
ZToKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxSZWNhbGN1
bGF0ZVN0eWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiwgRnJhbWUqKTsKICAgICBzdGF0aWMg
dm9pZCBkaWRSZWNhbGN1bGF0ZVN0eWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUmKTsKICAgICBzdGF0aWMgdm9pZCBkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlv
bkltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIERvY3VtZW50Kik7Ci0gICAgc3RhdGljIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlSW1wbChJbnN0cnVtZW50aW5n
QWdlbnRzKiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOworICAgIHN0YXRpYyBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0Fn
ZW50cyosIFN0eWxlUnVsZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uKik7CiAgICAgc3RhdGljIHZvaWQgZGlkTWF0Y2hSdWxlSW1wbChjb25z
dCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmLCBib29sIG1hdGNoZWQpOwogICAgIHN0
YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbFByb2Nlc3NSdWxlSW1wbChJ
bnN0cnVtZW50aW5nQWdlbnRzKiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAgIHN0
YXRpYyB2b2lkIGRpZFByb2Nlc3NSdWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUmKTsKQEAgLTExNzUsMTYgKzExNzcsMTcgQEAgaW5saW5lIHZvaWQgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjpkaQogI2VuZGlmCiB9CiAKLWlubGluZSBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKERv
Y3VtZW50KiBkb2N1bWVudCwgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJl
c29sdmVyKQoraW5saW5lIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBTdHlsZVJ1
bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMs
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewog
I2lmIEVOQUJMRShJTlNQRUNUT1IpCiAgICAgRkFTVF9SRVRVUk5fSUZfTk9fRlJPTlRFTkRTKElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSgpKTsKICAgICBpZiAoSW5zdHJ1bWVudGluZ0Fn
ZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cyA9IGluc3RydW1lbnRpbmdBZ2VudHNGb3JEb2N1bWVu
dChkb2N1bWVudCkpCi0gICAgICAgIHJldHVybiB3aWxsTWF0Y2hSdWxlSW1wbChpbnN0cnVtZW50
aW5nQWdlbnRzLCBydWxlLCBzdHlsZVJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIHdpbGxNYXRj
aFJ1bGVJbXBsKGluc3RydW1lbnRpbmdBZ2VudHMsIHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBl
cnMsIHN0eWxlU2hlZXRDb2xsZWN0aW9uKTsKICNlbHNlCiAgICAgVU5VU0VEX1BBUkFNKGRvY3Vt
ZW50KTsKICAgICBVTlVTRURfUEFSQU0ocnVsZSk7Ci0gICAgVU5VU0VEX1BBUkFNKHN0eWxlUmVz
b2x2ZXIpOworICAgIFVOVVNFRF9QQVJBTShpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBV
TlVTRURfUEFSQU0oc3R5bGVTaGVldENvbGxlY3Rpb24pOwogI2VuZGlmCiAgICAgcmV0dXJuIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>191948</attachid>
            <date>2013-03-07 01:40:53 -0800</date>
            <delta_ts>2013-03-08 00:57:21 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130307183657.patch</filename>
            <type>text/plain</type>
            <size>1111307</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTA1MykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBAQAorMjAxMy0wMy0wNyAgVGFrYXNo
aSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5nXSBJ
bXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQW50dGkgS29pdmlz
dG8uCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1lbnQg
YW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4gY2xh
c3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAgYSBz
dHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3RvcmluZy4K
KworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3Qu
YW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAg
ICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNzcy9D
U1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFuZCBQ
YWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1
ZXN0cyk6CisgICAgICAgIFNpbmNlIGJlaGF2aW9yQXRCb3VuZGFyeSBpcyBhIHN0YXRlIG93bmVk
IGJ5IEVsZW1lbnRSdWxlQ29sbGVjdG9yLAorICAgICAgICByZW1vdmVkIGZyb20gaGVyZS4KKyAg
ICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5oOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93
RGlzdHJpYnV0ZWRSdWxlczo6aXNFbXB0eSk6CisgICAgICAgIEFkZGVkIHRvIHF1aWNrbHkgY2hl
Y2sgd2hldGhlciB0aGVyZSBleGlzdCBhbnkgU2hhZG93RGlzdHJpYnV0ZWRSdWxlcworICAgICAg
ICBvciBub3QuCisgICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDogQ29waWVk
IGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJl
c3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1
bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRj
aGVkUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJN
YXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmVu
c3VyZVJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxl
Q29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29w
ZWRBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
bWF0Y2hIb3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoU2hhZG93RGlzdHJpYnV0ZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxl
bWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6cnVsZU1hdGNoZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyk6CisgICAgICAg
IE1vdmVkIHRoZXNlIG1ldGhvZHMgZnJvbSBTdHlsZVJlc29sdmVyIHRvIHRoaXMgY2xhc3MuCisg
ICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxl
cyk6CisgICAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBn
aXZlbiBlbGVtZW50IGNhbiBzaGFyZQorICAgICAgICBhIGNhY2hlLgorICAgICAgICAqIGNzcy9F
bGVtZW50UnVsZUNvbGxlY3Rvci5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5
bGVSZXNvbHZlci5oLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBVc2Ugc3R5
bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFibGVzLCBp
LmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NTT01XcmFw
cGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChFbGVtZW50
UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNl
dWRvU3R5bGVSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpzZXRTYW1lT3JpZ2luT25seSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxl
Y3Rvcjo6c2V0UmVnaW9uRm9yU3R5bGluZyk6CisgICAgICAgIE1vZGUsIFNhbWVPcmlnaW5Pbmx5
LCBSZWdpb25Gb3JTdHlsaW5nIGFyZSBvbmx5IHVzZWQgd2hpbGUgY29sbGVjdGluZworICAgICAg
ICBtYXRjaGVkIHJ1bGVzLgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnNldE1lZGl1bSk6CisgICAgICAgIE5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0IHN0eWxlc2hl
ZXQgc2hvdWxkIGJlIGxvb2tlZCB1cC4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpkb2N1bWVudCk6CisgICAgICAgICogY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcDog
Q29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHls
ZVJlc29sdmVyLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VS
dWxlQ29sbGVjdG9yOjpQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChQYWdlUnVsZUNvbGxl
Y3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3Vs
dCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5
bGVSZXNvbHZlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmlu
Z0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2
ZXI6OnN0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpz
dHlsZUZvcktleWZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnBzZXVk
b1N0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpzdHls
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6YXBwbHlN
YXRjaGVkUHJvcGVydGllcyk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGNoUmVxdWVzdDo6TWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgUmVtb3Zl
ZCBiZWhhdmlvckF0Qm91bmRhcnkuIEluc3RlYWQsIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGhhdmUg
dGhlCisgICAgICAgIHN0YXRlLgorICAgICAgICAoTWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAgICAgICAgQWRkZWQgdG8g
b2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVjdG9yJ3MgY29uc3RydWN0
b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1hdGNoUmVzdWx0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIFRv
IHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcywgbmVlZCB0byBr
ZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAgKFN0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpyZWdpb25Gb3JTdHlsaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjp1c2VTVkdab29tUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZCk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgor
ICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSk6CisgICAgICAgIFJlbW92ZWQg
U3R5bGVSZXNvbHZlciBmcm9tIGl0cyBwYXJhbWV0ZXIgbGlzdC4gSW5zdGVhZCwgYWRkZWQKKyAg
ICAgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBhbmQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaDoKKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9yQ1NTQWdlbnQpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwOgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJ
bXBsKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmg6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEluc3BlY3Rvckluc3RydW1lbnRhdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUp
OgorCiAyMDEzLTAzLTA3ICBWaWN0b3IgQ2FyYnVuZSAgPHZjYXJidW5lQGNocm9taXVtLm9yZz4K
IAogICAgICAgICBUZXh0VHJhY2tSZWdpb24gQ29uc3RydWN0b3IKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlz
dHMudHh0CShyZXZpc2lvbiAxNDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4
dAkod29ya2luZyBjb3B5KQpAQCAtMTA3MCw2ICsxMDcwLDcgQEAgc2V0KFdlYkNvcmVfU09VUkNF
UwogICAgIGNzcy9DU1NWYWx1ZVBvb2wuY3BwCiAgICAgY3NzL0RPTVdpbmRvd0NTUy5jcHAKICAg
ICBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAKKyAgICBjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
Y3BwCiAgICAgY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwCiAgICAgY3NzL0ZvbnRWYWx1ZS5jcHAK
ICAgICBjc3MvSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAKQEAgLTEwODIsNiArMTA4Myw3IEBA
IHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3MvTWVkaWFRdWVyeUxpc3QuY3BwCiAgICAgY3Nz
L01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuY3BwCiAgICAgY3NzL01lZGlhUXVlcnlNYXRjaGVyLmNw
cAorICAgIGNzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKICAgICBjc3MvUHJvcGVydHlTZXRDU1NT
dHlsZURlY2xhcmF0aW9uLmNwcAogICAgIGNzcy9SR0JDb2xvci5jcHAKICAgICBjc3MvUnVsZUZl
YXR1cmUuaApJbmRleDogU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxNDUw
NTMpCisrKyBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkp
CkBAIC0yNjYwLDYgKzI2NjAsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJD
b3JlL2Nzcy9EYXNoYm9hcmRSZWdpb24uaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50
UnVsZVNldHMuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oIFwK
KwlTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIFwKKwlTb3VyY2Uv
V2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvY3Nz
L0ZvbnRGZWF0dXJlVmFsdWUuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udEZlYXR1cmVW
YWx1ZS5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udFZhbHVlLmNwcCBcCkBAIC0yNjg0LDYg
KzI2ODYsOCBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRp
YVF1ZXJ5TGlzdExpc3RlbmVyLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5TWF0
Y2hlci5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5oIFwKKwlT
b3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIFwKKwlTb3VyY2UvV2ViQ29y
ZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL1BhaXIuaCBc
CiAJU291cmNlL1dlYkNvcmUvY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAg
XAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uaCBc
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL1RhcmdldC5wcmkJKHJldmlzaW9uIDE0NTA1MykKKysrIFNvdXJjZS9XZWJDb3JlL1Rh
cmdldC5wcmkJKHdvcmtpbmcgY29weSkKQEAgLTMwNSw2ICszMDUsNyBAQCBTT1VSQ0VTICs9IFwK
ICAgICBjc3MvQ1NTVmFsdWVQb29sLmNwcCBcCiAgICAgY3NzL0RPTVdpbmRvd0NTUy5jcHAgXAog
ICAgIGNzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCBcCisgICAgY3NzL0VsZW1lbnRSdWxlQ29sbGVj
dG9yLmNwcCBcCiAgICAgY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwIFwKICAgICBjc3MvRm9udFZh
bHVlLmNwcCBcCiAgICAgY3NzL0luc3BlY3RvckNTU09NV3JhcHBlcnMuY3BwIFwKQEAgLTMxNyw2
ICszMTgsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBjc3MvTWVkaWFRdWVyeUxpc3QuY3BwIFwKICAg
ICBjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5jcHAgXAogICAgIGNzcy9NZWRpYVF1ZXJ5TWF0
Y2hlci5jcHAgXAorICAgIGNzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAgXAogICAgIGNzcy9Qcm9w
ZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwIFwKICAgICBjc3MvUkdCQ29sb3IuY3BwIFwK
ICAgICBjc3MvUnVsZUZlYXR1cmUuY3BwIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
Z3lwaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9u
IDE0NTA1MykKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpA
QCAtMTY1MSw2ICsxNjUxLDggQEAKICAgICAgICAgICAgICdjc3MvRGFzaGJvYXJkUmVnaW9uLmgn
LAogICAgICAgICAgICAgJ2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCcsCiAgICAgICAgICAgICAn
Y3NzL0RvY3VtZW50UnVsZVNldHMuaCcsCisgICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmNwcCcsCisgICAgICAgICAgICAnY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgnLAog
ICAgICAgICAgICAgJ2Nzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCcsCiAgICAgICAgICAgICAnY3Nz
L0ZvbnRGZWF0dXJlVmFsdWUuaCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRWYWx1ZS5jcHAnLApA
QCAtMTY3NCw2ICsxNjc2LDggQEAKICAgICAgICAgICAgICdjc3MvTWVkaWFRdWVyeUxpc3RMaXN0
ZW5lci5oJywKICAgICAgICAgICAgICdjc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwJywKICAgICAg
ICAgICAgICdjc3MvTWVkaWFRdWVyeU1hdGNoZXIuaCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VS
dWxlQ29sbGVjdG9yLmNwcCcsCisgICAgICAgICAgICAnY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgn
LAogICAgICAgICAgICAgJ2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwJywK
ICAgICAgICAgICAgICdjc3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmgnLAogICAg
ICAgICAgICAgJ2Nzcy9SR0JDb2xvci5jcHAnLApJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTQ1MDUzKQorKysg
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5n
IGNvcHkpCkBAIC02NTQ4LDYgKzY1NDgsMTAgQEAKIAkJRkJENkFGOEIxNUVGMjVFNTAwOEI3MTEw
IC8qIENTU0Jhc2ljU2hhcGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEZCRDZBRjg2MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5j
cHAgKi87IH07CiAJCUZCRDZBRjhDMTVFRjI2MDQwMDhCNzExMCAvKiBCYXNpY1NoYXBlcy5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODMxNUVG
MjFBMzAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMg
PSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRkJENkFGOEQxNUVGMjYwQTAwOEI3MTEwIC8qIEJhc2lj
U2hhcGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZCRDZBRjgyMTVFRjIxQTMwMDhCNzExMCAvKiBCYXNpY1NoYXBlcy5jcHAgKi87IH07CisJCUZC
REI2MTlCMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkRCNjE5QTE2RDYwMzJB
MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwICovOyB9OworCQlGQkRCNjE5RDE2
RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJEQjYxOUMxNkQ2MDM0NjAwQkIzMzk0IC8q
IFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCAqLzsgfTsKKwkJRkJEQjYxOUYxNkQ2MDM2NTAwQkIzMzk0
IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaCAqLzsgfTsKKwkJRkJEQjYxQTExNkQ2MDM3RTAwQkIzMzk0IC8qIFBhZ2VSdWxl
Q29sbGVjdG9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGQkRCNjFBMDE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCAqLzsgfTsK
IAkJRkJGODkwNDUxNjlFOUYxRjAwNTJEODZFIC8qIENTU0dyb3VwaW5nUnVsZS5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkY4OTA0NDE2OUU5RjFG
MDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdSdWxlLmNwcCAqLzsgfTsKIAkJRkM1NEQwNTcxNkE3Njcz
MTAwNTc1RTREIC8qIENTU1N1cHBvcnRzUnVsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRkM2M0JEQjExNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1cHBv
cnRzUnVsZS5oICovOyB9OwogCQlGQzU0RDA1ODE2QTc2NzZFMDA1NzVFNEQgLyogSlNDU1NTdXBw
b3J0c1J1bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZDODQ4MDJFMTY3QUI0NDQwMDhDRDEwMCAvKiBKU0NTU1N1cHBvcnRzUnVsZS5oICovOyB9OwpA
QCAtMTQyOTYsNiArMTQzMDAsMTAgQEAKIAkJRkJENkFGODUxNUVGMjFENDAwOEI3MTEwIC8qIEJh
c2ljU2hhcGVGdW5jdGlvbnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQmFz
aWNTaGFwZUZ1bmN0aW9ucy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQkQ2QUY4
NjE1RUYyMUQ0MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMuY3BwICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTQmFzaWNTaGFwZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlGQkQ2QUY4NzE1RUYyMUQ0MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ1NTQmFzaWNTaGFwZXMuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxOUExNkQ2MDMyQTAwQkIzMzk0IC8qIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJRkJEQjYxOUMxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhZ2VSdWxlQ29sbGVjdG9yLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxOUUxNkQ2MDM2NTAwQkIzMzk0IC8q
IEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEVsZW1lbnRSdWxlQ29sbGVjdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZC
REI2MUEwMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBQYWdlUnVsZUNvbGxlY3Rvci5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlGQkY4OTA0NDE2OUU5RjFGMDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdS
dWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU0dyb3VwaW5n
UnVsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZDNjNCREIwMTY3QUFCQUMw
MEY5MzgwRiAvKiBDU1NTdXBwb3J0c1J1bGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gQ1NTU3VwcG9ydHNSdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJRkM2M0JEQjExNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1cHBvcnRzUnVsZS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NTdXBwb3J0c1J1bGUuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIyMTIwLDYgKzIyMTI4LDggQEAKIAkJCQlGQzlBMEY3MTE2
NDA5NENGMDAzRDZCOEQgLyogRE9NV2luZG93Q1NTLmNwcCAqLywKIAkJCQlGQzlBMEY3MjE2NDA5
NENGMDAzRDZCOEQgLyogRE9NV2luZG93Q1NTLmggKi8sCiAJCQkJRkM5QTBGNzMxNjQwOTRDRjAw
M0Q2QjhEIC8qIERPTVdpbmRvd0NTUy5pZGwgKi8sCisJCQkJRkJEQjYxOUUxNkQ2MDM2NTAwQkIz
Mzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggKi8sCisJCQkJRkJEQjYxOUExNkQ2MDMyQTAw
QkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCAqLywKIAkJCQk0QTZFOUZDMjEzQzE3
RDFEMDA0NkE3RjggLyogRm9udEZlYXR1cmVWYWx1ZS5oICovLAogCQkJCUE4MEU2Q0M3MEExOTg5
Q0EwMDdGQjhDNSAvKiBGb250VmFsdWUuY3BwICovLAogCQkJCUE4MEU2Q0MzMEExOTg5Q0EwMDdG
QjhDNSAvKiBGb250VmFsdWUuaCAqLywKQEAgLTIyMTU1LDYgKzIyMTY1LDggQEAKIAkJCQlEM0E5
NEEzNTEyMkRBQkFDMDBBMzdCQkMgLyogTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5pZGwgKi8sCiAJ
CQkJRDNBQTEwRjExMjNBOThBQTAwOTIxNTJCIC8qIE1lZGlhUXVlcnlNYXRjaGVyLmNwcCAqLywK
IAkJCQlEM0FBMTBGMjEyM0E5OEFBMDA5MjE1MkIgLyogTWVkaWFRdWVyeU1hdGNoZXIuaCAqLywK
KwkJCQlGQkRCNjFBMDE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCAqLywK
KwkJCQlGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICov
LAogCQkJCUE4MEU2Q0QxMEExOTg5Q0EwMDdGQjhDNSAvKiBQYWlyLmggKi8sCiAJCQkJMzE4OUU2
REIxNkIyMTAzNTAwMzg2RUEzIC8qIHBsdWdJbnMuY3NzICovLAogCQkJCUU0QkJFRDBDMTRGNDAy
NUQwMDNGMEI5OCAvKiBQcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwICovLApAQCAt
MjY2ODUsNiArMjY2OTcsOCBAQAogCQkJCTdFNjZFMjM0MTZENkVCNkMwMEY3RTdGRiAvKiBXZWJH
TENvbXByZXNzZWRUZXh0dXJlQVRDLmggaW4gSGVhZGVycyAqLywKIAkJCQk3RUEzMEY2QTE2REZG
RTc1MDAyNTdEMEIgLyogSlNXZWJHTENvbXByZXNzZWRUZXh0dXJlQVRDLmggaW4gSGVhZGVycyAq
LywKICAJCQkJMkQ4Mjg3RjcxNkU0QTAzODAwODZCRDAwIC8qIEhpdFRlc3RMb2NhdGlvbi5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJRkJEQjYxOUYxNkQ2MDM2NTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxl
Q29sbGVjdG9yLmggaW4gSGVhZGVycyAqLywKKwkJCQlGQkRCNjFBMTE2RDYwMzdFMDBCQjMzOTQg
LyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlG
b3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjk4ODcsNiArMjk5MDEs
OCBAQAogCQkJCTdFNjZFMjMzMTZENkVCNkMwMEY3RTdGRiAvKiBXZWJHTENvbXByZXNzZWRUZXh0
dXJlQVRDLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTdFQTMwRjY5MTZERkZFNzUwMDI1N0QwQiAv
KiBKU1dlYkdMQ29tcHJlc3NlZFRleHR1cmVBVEMuY3BwIGluIFNvdXJjZXMgKi8sCiAgCQkJCTJE
ODI4N0Y2MTZFNEEwMzgwMDg2QkQwMCAvKiBIaXRUZXN0TG9jYXRpb24uY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJRkJEQjYxOUIxNkQ2MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9y
LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdl
UnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVw
bG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nz
cy9DU1NBbGxJbk9uZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU0Fs
bEluT25lLmNwcAkocmV2aXNpb24gMTQ1MDUzKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU0Fs
bEluT25lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzEsNyArNzEsOSBAQAogI2luY2x1ZGUgIkNT
U1ZhbHVlUG9vbC5jcHAiCiAjaW5jbHVkZSAiRE9NV2luZG93Q1NTLmNwcCIKICNpbmNsdWRlICJE
b2N1bWVudFJ1bGVTZXRzLmNwcCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAi
CiAjaW5jbHVkZSAiSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAiCisjaW5jbHVkZSAiUGFnZVJ1
bGVDb2xsZWN0b3IuY3BwIgogI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmNwcCIKICNpbmNsdWRlICJS
dWxlU2V0LmNwcCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5jcHAiCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuY3BwCShyZXZpc2lvbiAxNDUwNTMp
CisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUzLDcgKzUzLDcgQEAgdm9pZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjphZGRSdWxl
KFN0eQogdm9pZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1ZXN0cyhi
b29sIGluY2x1ZGVFbXB0eVJ1bGVzLCBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiYgbWF0Y2hSZXF1ZXN0
cykKIHsKICAgICBmb3IgKFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcDo6aXRlcmF0b3IgaXQg
PSBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5iZWdpbigpOyBpdCAhPSBtX3NoYWRvd0Rp
c3RyaWJ1dGVkUnVsZVNldE1hcC5lbmQoKTsgKytpdCkKLSAgICAgICAgbWF0Y2hSZXF1ZXN0cy5h
cHBlbmQoTWF0Y2hSZXF1ZXN0KGl0LT52YWx1ZS5nZXQoKSwgaW5jbHVkZUVtcHR5UnVsZXMsIGl0
LT5rZXksIFNlbGVjdG9yQ2hlY2tlcjo6Q3Jvc3Nlc0JvdW5kYXJ5KSk7CisgICAgICAgIG1hdGNo
UmVxdWVzdHMuYXBwZW5kKE1hdGNoUmVxdWVzdChpdC0+dmFsdWUuZ2V0KCksIGluY2x1ZGVFbXB0
eVJ1bGVzLCBpdC0+a2V5KSk7CiB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYkNvcmUvY3Nz
L0RvY3VtZW50UnVsZVNldHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvRG9j
dW1lbnRSdWxlU2V0cy5oCShyZXZpc2lvbiAxNDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3Mv
RG9jdW1lbnRSdWxlU2V0cy5oCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBAIHB1Ymxp
YzoKICAgICB2b2lkIGFkZFJ1bGUoU3R5bGVSdWxlKiwgc2l6ZV90IHNlbGVjdG9ySW5kZXgsIENv
bnRhaW5lck5vZGUqIHNjb3BlLCBBZGRSdWxlRmxhZ3MpOwogICAgIHZvaWQgY29sbGVjdE1hdGNo
UmVxdWVzdHMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcywgVmVjdG9yPE1hdGNoUmVxdWVzdD4mKTsK
ICAgICB2b2lkIGNsZWFyKCkgeyBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5jbGVhcigp
OyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9zaGFkb3dEaXN0cmlidXRl
ZFJ1bGVTZXRNYXAuaXNFbXB0eSgpOyB9CiBwcml2YXRlOgogICAgIHR5cGVkZWYgSGFzaE1hcDxj
b25zdCBDb250YWluZXJOb2RlKiwgT3duUHRyPFJ1bGVTZXQ+ID4gU2hhZG93RGlzdHJpYnV0ZWRS
dWxlU2V0TWFwOwogICAgIFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcCBtX3NoYWRvd0Rpc3Ry
aWJ1dGVkUnVsZVNldE1hcDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNv
bGxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxl
Q29sbGVjdG9yLmNwcAkocmV2aXNpb24gMTQ0ODkzKQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3Mv
U3R5bGVSZXNvbHZlci5jcHA6MTQ0ODkzKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRS
dWxlQ29sbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUyMDcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAg
ICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRmZWxkIEplbnNlbiAoa2RlQGNhcmV3b2xmLmNv
bSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBOaWNob2xhcyBTaGFua3MgKHdlYmtpdEBu
aWNrc2hhbmtzLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAd2Via2l0
Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJr
aXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5
cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdHlsZVJlc29sdmVy
LmgiCisKKyNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5o
IgorI2luY2x1ZGUgIkNTU0NhbGN1bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NDdXJzb3JJ
bWFnZVZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCisjaW5jbHVk
ZSAiQ1NTRm9udEZhY2VSdWxlLmgiCisjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCisjaW5j
bHVkZSAiQ1NTTGluZUJveENvbnRhaW5WYWx1ZS5oIgorI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgi
CisjaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCisjaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBw
aW5ncy5oIgorI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKKyNpbmNsdWRlICJDU1NSZWZs
ZWN0VmFsdWUuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU1NlbGVj
dG9yTGlzdC5oIgorI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1N1cHBv
cnRzUnVsZS5oIgorI2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKKyNpbmNsdWRl
ICJDU1NWYWx1ZUxpc3QuaCIKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyNpbmNsdWRlICJD
U1NWYXJpYWJsZVZhbHVlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2lu
Y2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDb250ZW50RGF0YS5oIgorI2lu
Y2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRl
ICJDb3VudGVyQ29udGVudC5oIgorI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKKyNpbmNsdWRlICJE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5o
IgorI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKKyNpbmNsdWRlICJGb250VmFsdWUuaCIK
KyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCisjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSFRN
TElGcmFtZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVk
ZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJIVE1MUHJvZ3Jlc3NFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgor
I2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJJbnNlcnRpb25Qb2lu
dC5oIgorI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIktl
eWZyYW1lTGlzdC5oIgorI2luY2x1ZGUgIkxpbmtIYXNoLmgiCisjaW5jbHVkZSAiTG9jYWxlVG9T
Y3JpcHRNYXBwaW5nLmgiCisjaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNYXRy
aXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9ybU9wZXJh
dGlvbi5oIgorI2luY2x1ZGUgIk1lZGlhTGlzdC5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFs
dWF0b3IuaCIKKyNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJOb2RlUmVu
ZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWlyLmgiCisj
aW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJRdW90
ZXNEYXRhLmgiCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgor
I2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhclRo
ZW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGVDb25zdGFudHMuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUaGVtZS5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJSdWxlU2V0LmgiCisjaW5jbHVkZSAiU1ZHRG9j
dW1lbnRFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50LmgiCisjaW5j
bHVkZSAiU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdp
bi5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLmgiCisjaW5jbHVkZSAiU2V0
dGluZ3MuaCIKKyNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCisjaW5jbHVkZSAiU2hhZG93Um9vdC5o
IgorI2luY2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCisjaW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0
cmF0ZWdpZXMuaCIKKyNpbmNsdWRlICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVk
ZSAiU3R5bGVCdWlsZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIlN0eWxlR2VuZXJhdGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZVBlbmRpbmdJbWFnZS5o
IgorI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTZXQuaCIKKyNpbmNsdWRlICJTdHlsZVByb3BlcnR5
U2hvcnRoYW5kLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxl
SW1wb3J0LmgiCisjaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCisjaW5jbHVkZSAiU3R5
bGVTaGVldExpc3QuaCIKKyNpbmNsdWRlICJUZXh0LmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRp
b25NYXRyaXguaCIKKyNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNp
bmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVS
ZXNvbHZlci5oIgorI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKKyNpbmNsdWRlICJXZWJD
b3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVS
dWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1ZGUgIldl
YktpdENTU1JlZ2lvblJ1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZS5o
IgorI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgorI2luY2x1ZGUgIlhNTE5hbWVz
LmgiCisjaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KKyNpbmNs
dWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9N
ZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQor
I2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0ZpbHRlclZh
bHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKKyNpbmNsdWRl
ICJEYXNoYm9hcmRSZWdpb24uaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRl
ICJDYWNoZWRTVkdEb2N1bWVudC5oIgorI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVmZXJl
bmNlLmgiCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJTVkdFbGVtZW50Lmgi
CisjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIKKyNp
bmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJM
RShDU1NfU0hBREVSUykKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5oIgor
I2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRl
ck51bWJlclBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5oIgor
I2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRl
clRyYW5zZm9ybVBhcmFtZXRlci5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgiCisj
aW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5k
aW5nU2hhZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKKyNpbmNsdWRlICJXZWJLaXRD
U1NNaXhGdW5jdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUuaCIK
KyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisjaW5jbHVkZSAiQ1NTSW1hZ2VT
ZXRWYWx1ZS5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKKyNlbmRpZgorCisj
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQorI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKKyNlbmRp
ZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGU8
PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2ViQ29y
ZTo6UnVsZURhdGEqPiB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lkIHJl
cG9ydE1lbW9yeVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5mbyYpIHsgfQorfTsKKworfQorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKyNkZWZp
bmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5oZXJpdCkgeyBcCisgICAg
bV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkp
OyBcCisgICAgcmV0dXJuOyBcCit9CisKKyNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJ
QUwocHJvcCwgUHJvcCkgXAorSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5p
dGlhbCkgeyBcCisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6Omlu
aXRpYWwjI1Byb3AoKSk7IFwKKyAgICByZXR1cm47IFwKK30KKworUmVuZGVyU3R5bGUqIFN0eWxl
UmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKK3N0YXRpYyBTdHlsZVByb3BlcnR5
U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0
eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCisg
ICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24s
IENTU1ZhbHVlTHRyKTsKKyAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOworfQorCitz
dGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0
RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7CisgICAgaWYgKHJpZ2h0VG9MZWZ0
RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENT
U1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7CisgICAgcmV0dXJuIHJpZ2h0VG9MZWZ0
RGVjbC5nZXQoKTsKK30KKworCitpbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0KQorICAg
ICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAgIHJldHVy
biBtX3J1bGVMaXN0LmdldCgpOworfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0
ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKK3sKKyAgICBtX2hhc1VBQXBwZWFyYW5jZSA9
IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKKyAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2UpIHsK
KyAgICAgICAgbV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9yZGVyKCk7CisgICAgICAgIG1fYmFj
a2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExheWVycygpOworICAgICAgICBtX2Jh
Y2tncm91bmRDb2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOworICAgIH0KK30KKwor
aW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKK3sKKyAgICBtX2VsZW1l
bnQgPSAwOworICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7CisgICAgbV9wYXJlbnRTdHlsZSA9IDA7
CisgICAgbV9wYXJlbnROb2RlID0gMDsKKyAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOworICAg
IG1fcnVsZUxpc3QgPSAwOworICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7CisgICAgbV9wZW5k
aW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAg
IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfRklM
VEVSUykgJiYgRU5BQkxFKFNWRykKKyAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIoKTsK
KyNlbmRpZgorfQorCitTdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1
bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgOiBtX21hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgwKQorICAgICwgbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVk
UHJvcGVydGllc0NhY2hlKQorICAgICwgbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAsIG1f
Zm9udFNlbGVjdG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNpZiBFTkFC
TEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIo
Vmlld3BvcnRTdHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1lbnQpKQorI2VuZGlmCisgICAgLCBt
X3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQorICAgICwg
bV9zdHlsZU1hcCh0aGlzKQoreworICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9jdW1l
bnRFbGVtZW50KCk7CisKKyAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0U3R5
bGUocm9vdCk7CisKKyAgICAvLyBjb25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRlZmF1
bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVkCisgICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmll
cyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQgKG1h
eC13aWR0aDogMTBlbSkiCisgICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3RydWN0
b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4sCisgICAgLy8gZG9jdW1lbnQgZG9l
c24ndCBoYXZlIGRvY3VtZW50RWxlbWVudAorICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0
IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKKyAgICAv
LyBpcyBhbHdheXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxlY3Rv
cgorICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52aWV3KCk7CisgICAgaWYgKHZpZXcp
CisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmll
dy0+bWVkaWFUeXBlKCkpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIo
bmV3IE1lZGlhUXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKKworICAgIGlmIChyb290KQorICAgICAg
ICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxsb3dT
dHlsZVNoYXJpbmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKTsKKworICAgIGlmIChtX3Jvb3RE
ZWZhdWx0U3R5bGUgJiYgdmlldykKKyAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVk
aWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9yb290
RGVmYXVsdFN0eWxlLmdldCgpKSk7CisKKyAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5bGUo
KTsKKworICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0
aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCk7CisgICAgbV9ydWxlU2V0cy5p
bml0VXNlclN0eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsKKwor
I2lmIEVOQUJMRShTVkdfRk9OVFMpCisgICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCkp
IHsKKyAgICAgICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9udEZh
Y2VFbGVtZW50cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxlbWVu
dHMoKTsKKyAgICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0
PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNlRWxl
bWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgZm9udFNlbGVjdG9y
KCktPmFkZEZvbnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VSdWxlKCkpOworICAgIH0KKyNlbmRp
ZgorCisgICAgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rpb24t
PmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRzKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFw
cGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVm
UHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQoreworICAgIG1fcnVsZVNldHMuYXBw
ZW5kQXV0aG9yU3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5nZXQo
KSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwg
dGhpcyk7CisgICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+cmVu
ZGVyZXIoKS0+c3R5bGUoKSkKKyAgICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUo
KS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX0RFVklD
RV9BREFQVEFUSU9OKQorICAgIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7Cisj
ZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVtZW50
KiBwYXJlbnQpCit7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9IHBh
cmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOworCisgICAgLy8gV2UgYXJlIG5vdCBh
bHdheXMgaW52b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0aW9u
IGNhbiBjYXVzZSB1cyB0byBlbnRlcgorICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlkZGxl
IG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hlcmUg
d2l0aGluIHRoZSB0cmVlLgorICAgIC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2UsIG9y
IGlmIHdlIHNlZSBhIG5ldyByb290IGVsZW1lbnQuCisgICAgLy8gT3RoZXJ3aXNlIGp1c3QgcHVz
aCB0aGUgbmV3IHBhcmVudC4KKyAgICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3RvckZp
bHRlci5wYXJlbnRTdGFja0lzRW1wdHkoKSkKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5zZXR1
cFBhcmVudFN0YWNrKHBhcmVudCk7CisgICAgZWxzZQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVy
LnB1c2hQYXJlbnQocGFyZW50KTsKKworICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBTaGFk
b3dSb290IG5vZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCisgICAgaWYgKG1fc2NvcGVSZXNvbHZl
cikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJlbnRP
clNoYWRvd0hvc3ROb2RlKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudEVs
ZW1lbnQoRWxlbWVudCogcGFyZW50KQoreworICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0IGlu
dm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVyaW5n
IHN0eWxlIHJlc29sdmUuCisgICAgLy8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGluIHRo
aXMgY2FzZS4KKyAgICBpZiAobV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVu
dChwYXJlbnQpKQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOworICAgIGlm
IChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVudCk7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hh
ZG93Um9vdCogc2hhZG93Um9vdCkKK3sKKyAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsK
KyAgICBpZiAobV9zY29wZVJlc29sdmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2go
c2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
Ojpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCit7Cisg
ICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikK
KyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7Cit9CisKKy8vIFRoaXMg
aXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0eWxl
cwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVS
dWxlS2V5ZnJhbWVzPiBydWxlKQoreworICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUoKSk7
CisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7Cit9CisKK1N0eWxl
UmVzb2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKK3sKKyAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xlYXJE
b2N1bWVudCgpOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBtX3Zp
ZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOworI2VuZGlmCit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVz
b2x2ZXI+KikKK3sKKyAgICAvLyBMb29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcgYSBz
dHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCisgICAg
Ly8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24gY2F1
c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxlKCkKKyAgICAvLyBvciBwcmVzZW50
YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUgd2l0
aCB0aGUgbGFzdCByZWYgb24gdGhlIG9sZCBvbmUuCisgICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4g
dG9SZW1vdmU7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hl
OjppdGVyYXRvciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7CisgICAgZm9y
ICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+
JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsraSkg
eworICAgICAgICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhhc09u
ZVJlZigpKSB7CisgICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCisgICAgICAgIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1vdmVbaV0pOworCisgICAgbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJl
c3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxl
LCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlX
aGl0ZWxpc3RUeXBlKQoreworICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3co
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7CisgICAgTWF0Y2hlZFBy
b3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5s
YXN0KCk7CisgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVBy
b3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBl
ID0gbGlua01hdGNoVHlwZTsKKyAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9w
ZXJ0eVdoaXRlbGlzdFR5cGU7CisgICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChy
dWxlKTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJv
cGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0KQorICAg
ICAgICByZXR1cm47CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCk7CisgICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRo
b3JSdWxlID09IC0xKQorICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJl
c3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7CisgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVz
dWx0LCBwcm9wZXJ0eVNldCk7CisgICAgaWYgKCFpc0NhY2hlYWJsZSkKKyAgICAgICAgcmVzdWx0
LmlzQ2FjaGVhYmxlID0gZmFsc2U7Cit9CisKK2NsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsK
K3B1YmxpYzoKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOworICAgIH5NYXRjaGluZ1VBUnVs
ZXNTY29wZSgpOworCisgICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKKworcHJp
dmF0ZToKKyAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKK307CisKK01hdGNoaW5n
VUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgQVNTRVJUKCFtX21h
dGNoaW5nVUFSdWxlcyk7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOworfQorCitNYXRj
aGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKK3sKKyAgICBtX21hdGNo
aW5nVUFSdWxlcyA9IGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29w
ZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQoreworICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsK
K30KKworYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxz
ZTsKKwordm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRj
aFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgQVNT
RVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKKyAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkp
OworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0g
c3RhdGUuZWxlbWVudCgpOworICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQg
PSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9J
ZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7CisgICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOworICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1l
bnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
fQorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVs
ZW1lbnQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cisj
ZW5kaWYKKyAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBs
aWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgorICAg
IC8vIGEpIGl0J3MgYSBVQSBydWxlCisgICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1
dGhvciBydWxlcworICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxl
IHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCisgICAgVHJlZVNjb3BlKiB0cmVlU2Nv
cGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKKyAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3Bl
Ojppc01hdGNoaW5nVUFSdWxlcygpCisgICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9y
U3R5bGVzKCkKKyAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0
LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCisgICAgICAgICYmIG1hdGNoUmVxdWVz
dC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3Vu
ZGFyeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBy
dWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZl
ciBhbmQKKyAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KKyAgICBpZiAoZWxlbWVudC0+aGFz
SUQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxl
ZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
dHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMo
c3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCisgICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVk
b0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChTZWxlY3Rv
ckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQorICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRv
Q2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5s
b2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJl
cXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghbV9zdGF0ZS5yZWdpb25G
b3JTdHlsaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIHNpemUgPSBtYXRj
aFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBD
U1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdp
b25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKKyAgICAgICAgaWYgKGNoZWNr
UmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0
YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKKyAgICAgICAgICAgIFJ1bGVTZXQq
IHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5k
UnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKKyAgICAgICAgICAgIEFTU0VSVChyZWdpb25S
dWxlcyk7CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVn
aW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNj
b3BlKSwgcnVsZVJhbmdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29s
dmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3sK
KyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSos
IDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7CisgICAgaWYgKG1hdGNo
ZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNvcnRNYXRjaGVkUnVs
ZXMoKTsKKworICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0
aW5nUnVsZXMpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxl
cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVz
KCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBv
ZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgorICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAg
ICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9u
QXR0cmlidXRlU2VsZWN0b3IoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1
ZSgpOworICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tp
XS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVk
UnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRl
bGlzdFR5cGUoKSk7CisgICAgfQorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVk
QXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykK
K3sKKyNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBp
ZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggc2Nv
cGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAo
cmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KKyAgICBpZiAobV9zY29wZVJlc29s
dmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29u
c2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7CisgICAgICAgIGJvb2wgYXBwbHlBdXRob3JT
dHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVz
KCk7CisgICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7CisgICAgICAgIHVuc2lnbmVk
IHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgeworICAgICAgICAgICAgbV9zdGF0
ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAg
ICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9z
Y29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7CisgICAgICAgICAgICBkb2N1bWVudFNjb3Bl
ID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKKyAg
ICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBs
eUF1dGhvclN0eWxlcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVz
U3R5bGVCb3VuZHMoZnJhbWUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5t
X3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAgICAgICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwor
ICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OworICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOworICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJl
c3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAg
VU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCitpbmxpbmUgYm9v
bCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkK
K3sKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYm
IG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyht
X3N0YXRlLmVsZW1lbnQoKSk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQs
IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAg
QVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7CisKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNs
ZWFyKCk7CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVs
ZXM7CisgICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQo
KSwgbWF0Y2hlZFJ1bGVzKTsKKyAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsg
aSA+IDA7IC0taSkgeworICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdl
cy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hS
ZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5l
bGVtZW50KCkpLCBydWxlUmFuZ2UpOworICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMocmVzdWx0KTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAgVU5V
U0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKK3sKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAg
cmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxOworCisgICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlcXVlc3Qg
bWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMp
OworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5n
ZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
KyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgVmVjdG9yPE1hdGNoUmVxdWVzdD4gbWF0
Y2hSZXF1ZXN0czsKKyAgICBtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5jb2xs
ZWN0TWF0Y2hSZXF1ZXN0cyhpbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQorICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOworI2Vu
ZGlmCisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKworICAgIG1h
dGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Cit9CisKK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkp
CisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFy
KCk7CisKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOworICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxl
U2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxl
UmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hV
QVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQoreworICAgIG1fc3Rh
dGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICAKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBSdWxlUmFu
Z2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
Ojpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVs
ZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5n
ZSkKK3sKKyAgICBpZiAoIXJ1bGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBTdGF0ZSYgc3Rh
dGUgPSBtX3N0YXRlOworICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5n
IHVwIHN0eWxlIGZvciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2
ZSB0cmVlIHJlc29sdmUuCisgICAgLy8gQW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3Qg
YmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRo
LgorICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3Rh
Y2tJc0NvbnNpc3RlbnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZp
b3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnk7CisK
KyAgICB1bnNpZ25lZCBzaXplID0gcnVsZXMtPnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9
IHJ1bGVzLT5hdChpKTsKKyAgICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3Rv
ckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291
bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5y
dWxlKCk7CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoZG9jdW1lbnQoKSwgcnVsZSwg
dGhpcyk7CisgICAgICAgIFBzZXVkb0lkIGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAg
ICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQ
c2V1ZG8sIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkpKSB7CisgICAgICAgICAgICAv
LyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQg
aW4gdGhlIG5vbi1kZWJ1ZyBtb2RlLgorICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNl
dCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmICghcHJv
cGVydGllcyB8fCAocHJvcGVydGllcy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVk
ZUVtcHR5UnVsZXMpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
OjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1z
dGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMgQVBJIHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24g
dGhpcyBpcyBuZWVkZWQuCisgICAgICAgICAgICBpZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgp
ICYmICFydWxlRGF0YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKKyAgICAgICAgICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNl
KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IC8vIElmIHdlJ3JlIG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgor
ICAgICAgICAgICAgLy8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50Lgor
ICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRv
U3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKKyAgICAgICAgICAgICAgICBp
ZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7Cisg
ICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJTVF9JTlRF
Uk5BTF9QU0VVRE9JRCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SGFz
UHNldWRvU3R5bGUoZHluYW1pY1BzZXVkbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4gdGhlIG1h
dGNoZWQgcnVsZXMgYXJyYXkuCisgICAgICAgICAgICAgICAgKytydWxlUmFuZ2UubGFzdFJ1bGVJ
bmRleDsKKyAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID09IC0x
KQorICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBydWxlUmFu
Z2UubGFzdFJ1bGVJbmRleDsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8g
b3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KKyAgICAgICAgICAgICAgICBtX3N0YXRlLmFkZE1h
dGNoZWRSdWxlKCZydWxlRGF0YSk7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29uc3QgUnVsZURhdGEqIHIxLCBjb25zdCBSdWxl
RGF0YSogcjIpCit7CisgICAgdW5zaWduZWQgc3BlY2lmaWNpdHkxID0gcjEtPnNwZWNpZmljaXR5
KCk7CisgICAgdW5zaWduZWQgc3BlY2lmaWNpdHkyID0gcjItPnNwZWNpZmljaXR5KCk7CisgICAg
cmV0dXJuIChzcGVjaWZpY2l0eTEgPT0gc3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlvbigpIDwg
cjItPnBvc2l0aW9uKCkgOiBzcGVjaWZpY2l0eTEgPCBzcGVjaWZpY2l0eTI7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6c29ydE1hdGNoZWRSdWxlcygpCit7CisgICAgc3RkOjpzb3J0KG1fc3Rh
dGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwg
Y29tcGFyZVJ1bGVzKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQoreworICAgIG1h
dGNoVUFSdWxlcyhyZXN1bHQpOworCisgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVs
ZXMuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaFVz
ZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBhdXRob3IgcnVsZXMs
IGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMgbWFwcGVkIGZy
b20gSFRNTC4KKyAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgYWRk
RWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5w
cmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKworICAgICAgICAvLyBOb3cgd2UgY2hlY2sg
YWRkaXRpb25hbCBtYXBwZWQgZGVjbGFyYXRpb25zLgorICAgICAgICAvLyBUYWJsZXMgYW5kIHRh
YmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFw
cGxpZWQKKyAgICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBl
ZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KKyAg
ICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAg
ICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAg
ICAgICAgIGJvb2wgaXNBdXRvOworICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0
aW9uID0gdG9IVE1MRWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFs
aXR5SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlzQXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRv
KQorICAgICAgICAgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVj
dGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xh
cmF0aW9uKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRoZSBydWxl
cyBpbiBhdXRob3Igc2hlZXRzIG5leHQuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzKQorICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworCisgICAgLy8g
Tm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgorICAgIGlmIChtX21hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgeworICAgICAgICAvLyBJbmxpbmUgc3R5bGUg
aXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KKyAgICAg
ICAgLy8gRklYTUU6IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9i
bGVtcyB3aXRoIGNhY2hpbmcuCisgICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9
ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxlKCkgJiYg
IW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgpOworICAgICAgICAvLyBG
SVhNRTogQ29uc3RpZnkuCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0
LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNh
Y2hlYWJsZSk7CisgICAgfQorCisjaWYgRU5BQkxFKFNWRykKKyAgICAvLyBOb3cgY2hlY2sgU01J
TCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5bGUuCisgICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGll
cyAmJiBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIGFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4o
bV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwg
ZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVk
ZVNNSUxQcm9wZXJ0aWVzKTsKKyNlbmRpZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNsYXNz
TmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NOYW1lcykg
Y29uc3QKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7
ICsraSkgeworICAgICAgICBpZiAobV9ydWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVz
LmNvbnRhaW5zKGNsYXNzTmFtZXNbaV0uaW1wbCgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQoreworICAgIG1fZWxlbWVudCA9IGU7
CisgICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRp
Y19jYXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7CisgICAgbV9lbGVtZW50TGlua1N0YXRlID0g
ZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRl
KGUpIDogTm90SW5zaWRlTGluazsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6aW5p
dEVsZW1lbnQoRWxlbWVudCogZSkKK3sKKyAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkg
eworICAgICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOworICAgICAgICBpZiAoZSAmJiBlID09
IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBlLT5kb2N1
bWVudCgpLT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAg
ICAgICBlLT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZh
bHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6
U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50KiBl
LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNl
dWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7CisgICAg
bV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJlcXVlc3Q7CisgICAgbV9yZWdpb25G
b3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKKworICAgIGlmIChlKSB7CisgICAgICAgIE5v
ZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQoZSk7CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IGNv
bnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CisgICAgICAgIG1fcGFyZW50
U3R5bGUgPSBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpID8gMCA6CisgICAgICAgICAg
ICBwYXJlbnRTdHlsZSA/IHBhcmVudFN0eWxlIDoKKyAgICAgICAgICAgIG1fcGFyZW50Tm9kZSA/
IG1fcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA6IDA7CisgICAgICAgIG1fZGlzdHJpYnV0ZWRU
b0luc2VydGlvblBvaW50ID0gY29udGV4dC5pbnNlcnRpb25Qb2ludCgpOworICAgIH0gZWxzZSB7
CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IDA7CisgICAgICAgIG1fcGFyZW50U3R5bGUgPSBwYXJl
bnRTdHlsZTsKKyAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBmYWxzZTsK
KyAgICB9CisKKyAgICBOb2RlKiBkb2NFbGVtZW50ID0gZSA/IGUtPmRvY3VtZW50KCktPmRvY3Vt
ZW50RWxlbWVudCgpIDogMDsKKyAgICBSZW5kZXJTdHlsZSogZG9jU3R5bGUgPSBkb2N1bWVudC0+
cmVuZGVyU3R5bGUoKTsKKyAgICBtX3Jvb3RFbGVtZW50U3R5bGUgPSBkb2NFbGVtZW50ICYmIGUg
IT0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlclN0eWxlKCkgOiBkb2NTdHlsZTsKKwor
ICAgIG1fc3R5bGUgPSAwOworICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwor
ICAgIG1fcnVsZUxpc3QgPSAwOworICAgIG1fZm9udERpcnR5ID0gZmFsc2U7Cit9CisKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgPSAxMDsKK3N0YXRpYyBjb25z
dCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCA9IDEwOworCitzdGF0aWMgaW5s
aW5lIGJvb2wgcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhjb25zdCBFbGVtZW50KiBwYXJl
bnRFbGVtZW50KQoreworICAgIGlmICghcGFyZW50RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIHJldHVybiBwYXJlbnRFbGVtZW50LT5oYXNGbGFnc1NldER1cmluZ1N0eWxpbmdP
ZkNoaWxkcmVuKCk7Cit9CisKK05vZGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZUNvdXNpbkxpc3Qo
RWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3QKK3sKKyAg
ICBpZiAodmlzaXRlZE5vZGVDb3VudCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgKiBjU3R5bGVT
ZWFyY2hMZXZlbFRocmVzaG9sZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwYXJlbnQg
fHwgIXBhcmVudC0+aXNTdHlsZWRFbGVtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlm
IChwYXJlbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIFN0eWxlZEVsZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4ocGFyZW50
KTsKKyAgICBpZiAocC0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgRU5B
QkxFKFNWRykKKyAgICBpZiAocC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxl
bWVudCo+KHApLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisjZW5kaWYKKyAgICBpZiAocC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCku
aWRzSW5SdWxlcy5jb250YWlucyhwLT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gcC0+cmVu
ZGVyU3R5bGUoKTsKKyAgICB1bnNpZ25lZCBzdWJjb3VudCA9IDA7CisgICAgTm9kZSogdGhpc0Nv
dXNpbiA9IHA7CisgICAgTm9kZSogY3VycmVudE5vZGUgPSBwLT5wcmV2aW91c1NpYmxpbmcoKTsK
KworICAgIC8vIFJlc2VydmUgdGhlIHRyaWVzIGZvciB0aGlzIGxldmVsLiBUaGlzIGVmZmVjdGl2
ZWx5IG1ha2VzIHN1cmUgdGhhdCB0aGUgYWxnb3JpdGhtCisgICAgLy8gd2lsbCBuZXZlciBnbyBk
ZWVwZXIgdGhhbiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCBsZXZlbHMgaW50byByZWN1cnNp
b24uCisgICAgdmlzaXRlZE5vZGVDb3VudCArPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQ7CisgICAg
d2hpbGUgKHRoaXNDb3VzaW4pIHsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7CisgICAg
ICAgICAgICArK3N1YmNvdW50OworICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLT5yZW5kZXJT
dHlsZSgpID09IHBhcmVudFN0eWxlICYmIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKQorICAgICAg
ICAgICAgICAgICYmIGN1cnJlbnROb2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgIXBhcmVudEVsZW1l
bnRQcmV2ZW50c1NoYXJpbmcodG9FbGVtZW50KGN1cnJlbnROb2RlKSkKKyNpZiBFTkFCTEUoU0hB
RE9XX0RPTSkKKyAgICAgICAgICAgICAgICAmJiAhdG9FbGVtZW50KGN1cnJlbnROb2RlKS0+c2hh
ZG93KCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIC8vIEFk
anVzdCBmb3IgdW51c2VkIHJlc2VydmVkIHRyaWVzLgorICAgICAgICAgICAgICAgIHZpc2l0ZWRO
b2RlQ291bnQgLT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkIC0gc3ViY291bnQ7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChzdWJjb3VudCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2Rl
LT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50Tm9kZSA9IGxv
Y2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNv
dW50KTsKKyAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnROb2RlOworICAgIH0KKworICAgIHJl
dHVybiAwOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1h
dGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCit7CisgICAgaWYgKCFydWxlU2V0KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwor
CisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKKyAg
ICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOworICAgIFJ1bGVS
YW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOworICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKKyAgICBt
X3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgaWYg
KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRF
bGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7CisgICAgSFRNTElucHV0RWxlbWVudCogdGhpc0lucHV0RWxlbWVudCA9IGVsZW1lbnQtPnRv
SW5wdXRFbGVtZW50KCk7CisgICAgSFRNTElucHV0RWxlbWVudCogb3RoZXJJbnB1dEVsZW1lbnQg
PSBzdGF0ZS5lbGVtZW50KCktPnRvSW5wdXRFbGVtZW50KCk7CisKKyAgICBpZiAoIXRoaXNJbnB1
dEVsZW1lbnQgfHwgIW90aGVySW5wdXRFbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSAhPSBvdGhlcklucHV0RWxl
bWVudC0+ZWxlbWVudERhdGEoKSkgeworICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFz
dEdldEF0dHJpYnV0ZSh0eXBlQXR0cikgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRy
aWJ1dGUodHlwZUF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAo
dGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0cikpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzQXV0
b2ZpbGxlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVj
a2VkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNoZWNrZWQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5h
dGUoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpICE9IG90
aGVySW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmIChlbGVtZW50LT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKGVsZW1lbnQtPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSAhPSBzdGF0ZS5lbGVtZW50KCkt
PmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKHN0YXRlLmRvY3VtZW50KCktPmNvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKCkpIHsKKyAg
ICAgICAgYm9vbCB3aWxsVmFsaWRhdGUgPSBlbGVtZW50LT53aWxsVmFsaWRhdGUoKTsKKworICAg
ICAgICBpZiAod2lsbFZhbGlkYXRlICE9IHN0YXRlLmVsZW1lbnQoKS0+d2lsbFZhbGlkYXRlKCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAm
JiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpZiAoZWxlbWVudC0+aXNJblJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgp
LT5pc0luUmFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAo
ZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2Uo
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworc3RhdGljIGlubGluZSBib29sIGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKEVsZW1lbnQq
IGVsZW1lbnQpCit7CisgICAgLy8gRklYTUU6IFRoaXMgbGluZSBpcyBzdXJwcmlzaW5nbHkgaG90
LCB3ZSBtYXkgd2lzaCB0byBpbmxpbmUgaGFzRGlyZWN0aW9uQXV0byBpbnRvIFN0eWxlUmVzb2x2
ZXIuCisgICAgcmV0dXJuIGVsZW1lbnQtPmlzSFRNTEVsZW1lbnQoKSAmJiB0b0hUTUxFbGVtZW50
KGVsZW1lbnQpLT5oYXNEaXJlY3Rpb25BdXRvKCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6
c2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHls
ZWRFbGVtZW50KiBzaGFyaW5nQ2FuZGlkYXRlKSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZWxlbWVudERhdGEoKSA9
PSBzaGFyaW5nQ2FuZGlkYXRlLT5lbGVtZW50RGF0YSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5n
QXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFu
Z0F0dHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+
ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0
dHJpYnV0ZShsYW5nQXR0cikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghc3Rh
dGUuZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkpIHsKKyAgICAgICAgaWYgKHNoYXJpbmdD
YW5kaWRhdGUtPmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzaGFyaW5n
Q2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0gZWxzZSBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSkgeworI2lmIEVOQUJMRShT
VkcpCisgICAgICAgIC8vIFNWRyBlbGVtZW50cyByZXF1aXJlIGEgKHNsb3chKSBnZXRBdHRyaWJ1
dGUgY29tcGFyaXNpb24gYmVjYXVzZSAiY2xhc3MiIGlzIGFuIGFuaW1hdGFibGUgYXR0cmlidXRl
IGZvciBTVkcuCisgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKSB7
CisgICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRy
KSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAg
ICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSAhPSBzaGFyaW5nQ2FuZGlkYXRl
LT5jbGFzc05hbWVzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworI2lmIEVOQUJM
RShTVkcpCisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1
dGVTdHlsZSgpICE9IHNoYXJpbmdDYW5kaWRhdGUtPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5U
KQorICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmhhc1RhZ05hbWUocHJvZ3Jlc3NUYWcpKSB7Cisg
ICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc3RhdGUuZWxlbWVu
dCgpKS0+aXNEZXRlcm1pbmF0ZSgpICE9IHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQq
PihzaGFyaW5nQ2FuZGlkYXRlKS0+aXNEZXRlcm1pbmF0ZSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5
bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqIGVsZW1l
bnQpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gZWxlbWVudC0+cmVuZGVyU3R5
bGUoKTsKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKCFzdHls
ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPmhhc1VuaXF1ZVBzZXVkb1N0eWxlKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+dGFnUU5hbWUoKSAhPSBz
dGF0ZS5lbGVtZW50KCktPnRhZ1FOYW1lKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoZWxlbWVudC0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
IChlbGVtZW50LT5uZWVkc1N0eWxlUmVjYWxjKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgIGlmIChlbGVtZW50LT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNf
Y2FzdDxTVkdFbGVtZW50Kj4oZWxlbWVudCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5r
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT5ob3ZlcmVkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5ob3ZlcmVkKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+YWN0aXZlKCkgIT0gc3Rh
dGUuZWxlbWVudCgpLT5hY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChl
bGVtZW50LT5mb2N1c2VkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5mb2N1c2VkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPnNoYWRvd1BzZXVkb0lkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0
eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAh
PSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVT
dHlsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aGFzSUQo
KSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhlbGVtZW50LT5p
ZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoZWxlbWVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBzaGFyZSBzdHlsZSBmb3Igb3B0aW9u
IGFuZCBvcHRncm91cCB3aGVuZXZlciBwb3NzaWJsZS4KKyAgICAvLyBCZWZvcmUgZG9pbmcgc28s
IHdlIG5lZWQgdG8gcmVzb2x2ZSBpc3N1ZXMgaW4gSFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xp
c3RJdGVtcworICAgIC8vIGFuZCBSZW5kZXJNZW51TGlzdDo6c2V0VGV4dC4gU2VlIGFsc28gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg4NDA1CisgICAgaWYgKGVsZW1l
bnQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGdyb3Vw
VGFnKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBpc0NvbnRyb2wgPSBlbGVt
ZW50LT5pc0Zvcm1Db250cm9sRWxlbWVudCgpOworCisgICAgaWYgKGlzQ29udHJvbCAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzRm9ybUNvbnRyb2xFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChpc0NvbnRyb2wgJiYgIWNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChlbGVt
ZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0eWxlLT50cmFuc2l0aW9u
cygpIHx8IHN0eWxlLT5hbmltYXRpb25zKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBUdXJuIG9mZiBzdHlsZSBzaGFy
aW5nIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnYWluIGxheWVycyBmb3IgcmVhc29ucyBvdXRzaWRl
IG9mIHRoZSBzdHlsZSBzeXN0ZW0uCisgICAgLy8gU2VlIGNvbW1lbnRzIGluIFJlbmRlck9iamVj
dDo6c2V0U3R5bGUoKS4KKyAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVUYWcpIHx8
IGVsZW1lbnQtPmhhc1RhZ05hbWUoZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZW1i
ZWRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGFwcGxldFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShjYW52YXNUYWcpCisjaWYg
RU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8pCisgICAgICAgIC8vIFdpdGggcHJveHlpbmcs
IHRoZSBtZWRpYSBlbGVtZW50cyBhcmUgYmFja2VkIGJ5IGEgUmVuZGVyRW1iZWRkZWRPYmplY3Qu
CisgICAgICAgIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUodmlkZW9UYWcpIHx8IGVsZW1lbnQtPmhh
c1RhZ05hbWUoYXVkaW9UYWcpCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisjZW5kaWYKKworICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhlbGVtZW50KSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICYmIHN0
YXRlLmVsZW1lbnRMaW5rU3RhdGUoKSAhPSBzdHlsZS0+aW5zaWRlTGluaygpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgLy8gRGVueSBzaGFy
aW5nIHN0eWxlcyBiZXR3ZWVuIFdlYlZUVCBhbmQgbm9uLVdlYlZUVCBub2Rlcy4KKyAgICBpZiAo
ZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVs
ZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzV2Vi
VlRURWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkgJiYgdG9X
ZWJWVFRFbGVtZW50KGVsZW1lbnQpLT5pc1Bhc3ROb2RlKCkgIT0gdG9XZWJWVFRFbGVtZW50KHN0
YXRlLmVsZW1lbnQoKSktPmlzUGFzdE5vZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2Vu
ZGlmCisKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgaWYgKGVsZW1lbnQgPT0gZWxl
bWVudC0+ZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkgfHwgc3Rh
dGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVu
RWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworaW5saW5lIFN0eWxlZEVsZW1lbnQqIFN0eWxlUmVzb2x2ZXI6OmZpbmRTaWJsaW5n
Rm9yU3R5bGVTaGFyaW5nKE5vZGUqIG5vZGUsIHVuc2lnbmVkJiBjb3VudCkgY29uc3QKK3sKKyAg
ICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPnByZXZpb3VzU2libGluZygpKSB7CisgICAgICAg
IGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgaWYgKGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChzdGF0aWNfY2FzdDxTdHlsZWRFbGVt
ZW50Kj4obm9kZSkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjb3VudCsrID09
IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOworfQorCitSZW5kZXJT
dHlsZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hhcmVkU3R5bGUoKQoreworICAgIFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKCFzdGF0ZS5zdHlsZWRFbGVtZW50KCkgfHwgIXN0YXRl
LnBhcmVudFN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gSWYgdGhlIGVsZW1l
bnQgaGFzIGlubGluZSBzdHlsZSBpdCBpcyBwcm9iYWJseSB1bmlxdWUuCisgICAgaWYgKHN0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYg
RU5BQkxFKFNWRykKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQo
KSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5p
bWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisg
ICAgLy8gSWRzIHN0b3Agc3R5bGUgc2hhcmluZyBpZiB0aGV5IHNob3cgdXAgaW4gdGhlIHN0eWxl
c2hlZXRzLgorICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc0lEKCkgJiYgbV9ydWxl
U2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiAwOworICAg
IGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50
RWxlbWVudCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
aWYgKHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKHN0YXRlLmVs
ZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQ2FjaGUgd2hldGhlciBzdGF0
ZS5lbGVtZW50IGlzIGFmZmVjdGVkIGJ5IGFueSBrbm93biBjbGFzcyBzZWxlY3RvcnMuCisgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkbid0IGJlIGEgbWVtYmVyIHZhcmlhYmxlLiBUaGUgc3R5bGUg
c2hhcmluZyBjb2RlIGNvdWxkIGJlIGZhY3RvcmVkIG91dCBvZiBTdHlsZVJlc29sdmVyLgorICAg
IHN0YXRlLnNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhzdGF0ZS5lbGVtZW50KCkgJiYg
c3RhdGUuZWxlbWVudCgpLT5oYXNDbGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMo
c3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkpKTsKKworICAgIC8vIENoZWNrIHByZXZpb3Vz
IHNpYmxpbmdzIGFuZCB0aGVpciBjb3VzaW5zLgorICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAg
ICB1bnNpZ25lZCB2aXNpdGVkTm9kZUNvdW50ID0gMDsKKyAgICBTdHlsZWRFbGVtZW50KiBzaGFy
ZUVsZW1lbnQgPSAwOworICAgIE5vZGUqIGNvdXNpbkxpc3QgPSBzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPnByZXZpb3VzU2libGluZygpOworICAgIHdoaWxlIChjb3VzaW5MaXN0KSB7CisgICAgICAg
IHNoYXJlRWxlbWVudCA9IGZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKGNvdXNpbkxpc3QsIGNv
dW50KTsKKyAgICAgICAgaWYgKHNoYXJlRWxlbWVudCkKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjb3VzaW5MaXN0ID0gbG9jYXRlQ291c2luTGlzdChjb3VzaW5MaXN0LT5wYXJlbnRFbGVt
ZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZXho
YXVzdGVkIGFsbCBvdXIgYnVkZ2V0IG9yIG91ciBjb3VzaW5zLgorICAgIGlmICghc2hhcmVFbGVt
ZW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIENhbid0IHNoYXJlIGlmIHNpYmxpbmcg
cnVsZXMgYXBwbHkuIFRoaXMgaXMgY2hlY2tlZCBhdCB0aGUgZW5kIGFzIGl0IHNob3VsZCByYXJl
bHkgZmFpbC4KKyAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9y
dWxlU2V0cy5zaWJsaW5nKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBDYW4ndCBzaGFy
ZSBpZiBhdHRyaWJ1dGUgcnVsZXMgYXBwbHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0
ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMudW5jb21tb25BdHRyaWJ1dGUoKSkpCisgICAgICAg
IHJldHVybiAwOworICAgIC8vIENhbid0IHNoYXJlIGlmIEBob3N0IEAtcnVsZXMgYXBwbHkuCisg
ICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgLy8gVHJhY2tpbmcgY2hpbGQgaW5kZXggcmVxdWlyZXMgdW5pcXVlIHN0
eWxlIGZvciBlYWNoIG5vZGUuIFRoaXMgbWF5IGdldCBzZXQgYnkgdGhlIHNpYmxpbmcgcnVsZSBt
YXRjaCBhYm92ZS4KKyAgICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5l
bGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVy
biBzaGFyZUVsZW1lbnQtPnJlbmRlclN0eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgTWF0Y2hpbmdVQVJ1bGVz
U2NvcGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2Vy
IGFnZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1
bHRTdHlsZVNoZWV0KQorICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICBS
dWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3Bl
Y2lmaWMoInByaW50IikKKyAgICAgICAgPyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQ
cmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7CisgICAgbWF0
Y2hVQVJ1bGVzKHJlc3VsdCwgdXNlckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWly
a3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQu
CisgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVs
ZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7CisK
KyAgICAvLyBJZiBkb2N1bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3Vy
Y2UgbW9kZSBvciBpbiB4bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20g
dGhlIHZpZXcgc291cmNlIHN0eWxlIHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdT
b3VyY2UoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBh
Z2luYXRpb25Nb2RlKFBhZ2luYXRpb246Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxl
KiBzdHlsZSkKK3sKKyAgICBpZiAocGFnaW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdp
bmF0ZWQpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgc3dpdGNoIChwYWdpbmF0aW9u
TW9kZSkgeworICAgIGNhc2UgUGFnaW5hdGlvbjo6TGVmdFRvUmlnaHRQYWdpbmF0ZWQ6CisgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUt
PnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBO
b3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+
aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6
IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdp
bmF0aW9uOjpSaWdodFRvTGVmdFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4
aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24o
c3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lv
biA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
c3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5n
TW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Np
b24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlRvcFRvQm90dG9tUGFn
aW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMp
OworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dy
aXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9n
cmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9n
cmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFBhZ2luYXRpb246OkJvdHRvbVRvVG9wUGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+
c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJv
Z3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1u
UHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlVucGFn
aW5hdGVkOgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihjb25zdCBS
ZW5kZXJTdHlsZSogc3R5bGUsIEZvbnRPcmllbnRhdGlvbiYgZm9udE9yaWVudGF0aW9uLCBOb25D
SktHbHlwaE9yaWVudGF0aW9uJiBnbHlwaE9yaWVudGF0aW9uKQoreworICAgIGlmIChzdHlsZS0+
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgeworICAgICAgICBmb250T3JpZW50YXRpb24gPSBI
b3Jpem9udGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRh
dGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2gg
KHN0eWxlLT50ZXh0T3JpZW50YXRpb24oKSkgeworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVmVy
dGljYWxSaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAg
IGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsK
KyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVXByaWdodDoKKyAgICAg
ICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24g
PSBOb25DSktHbHlwaE9yaWVudGF0aW9uVXByaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXM6CisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01v
ZGUoKSA9PSBMZWZ0VG9SaWdodFdyaXRpbmdNb2RlKSB7CisgICAgICAgICAgICAvLyBGSVhNRTog
VGhpcyBzaG91bGQgbWFwIHRvIHNpZGV3YXlzLWxlZnQsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQg
eWV0LgorICAgICAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgICAg
ICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9udE9yaWVudGF0aW9u
ID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0T3Jp
ZW50YXRpb25TaWRld2F5c1JpZ2h0OgorICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9u
dGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZl
cnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsK
KyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNh
bFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiBkb2N1bWVudCwg
Q1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZG9j
dW1lbnQtPmZyYW1lKCk7CisKKyAgICAvLyBIVE1MNSBzdGF0ZXMgdGhhdCBzZWFtbGVzcyBpZnJh
bWVzIHNob3VsZCByZXBsYWNlIGRlZmF1bHQgQ1NTIHZhbHVlcworICAgIC8vIHdpdGggdmFsdWVz
IGluaGVyaXRlZCBmcm9tIHRoZSBjb250YWluaW5nIGlmcmFtZSBlbGVtZW50LiBIb3dldmVyLAor
ICAgIC8vIHNvbWUgdmFsdWVzIChzdWNoIGFzIHRoZSBjYXNlIG9mIGRlc2lnbk1vZGUgPSAib24i
KSBzdGlsbCBuZWVkIHRvCisgICAgLy8gYmUgc2V0IGJ5IHRoaXMgImRvY3VtZW50IHN0eWxlIi4K
KyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3Jl
YXRlKCk7CisgICAgYm9vbCBzZWFtbGVzc1dpdGhQYXJlbnQgPSBkb2N1bWVudC0+c2hvdWxkRGlz
cGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCk7CisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkg
eworICAgICAgICBSZW5kZXJTdHlsZSogaWZyYW1lU3R5bGUgPSBkb2N1bWVudC0+c2VhbWxlc3NQ
YXJlbnRJRnJhbWUoKS0+cmVuZGVyU3R5bGUoKTsKKyAgICAgICAgaWYgKGlmcmFtZVN0eWxlKQor
ICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+aW5oZXJpdEZyb20oaWZyYW1lU3R5bGUpOworICAg
IH0KKworICAgIC8vIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB3aGljaCB2YWx1ZXMgYmVsb3cgd2Ug
d2FudCB0byBvdmVycmlkZSBpbiB0aGUgc2VhbWxlc3MgY2FzZSEKKyAgICBkb2N1bWVudFN0eWxl
LT5zZXREaXNwbGF5KEJMT0NLKTsKKyAgICBpZiAoIXNlYW1sZXNzV2l0aFBhcmVudCkgeworICAg
ICAgICBkb2N1bWVudFN0eWxlLT5zZXRSVExPcmRlcmluZyhkb2N1bWVudC0+dmlzdWFsbHlPcmRl
cmVkKCkgPyBWaXN1YWxPcmRlciA6IExvZ2ljYWxPcmRlcik7CisgICAgICAgIGRvY3VtZW50U3R5
bGUtPnNldFpvb20oZnJhbWUgJiYgIWRvY3VtZW50LT5wcmludGluZygpID8gZnJhbWUtPnBhZ2Va
b29tRmFjdG9yKCkgOiAxKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UGFnZVNjYWxlVHJh
bnNmb3JtKGZyYW1lID8gZnJhbWUtPmZyYW1lU2NhbGVGYWN0b3IoKSA6IDEpOworICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRMb2NhbGUoZG9jdW1lbnQtPmNvbnRlbnRMYW5ndWFnZSgpKTsKKyAg
ICB9CisgICAgLy8gVGhpcyBvdmVycmlkZXMgYW55IC13ZWJraXQtdXNlci1tb2RpZnkgaW5oZXJp
dGVkIGZyb20gdGhlIHBhcmVudCBpZnJhbWUuCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0VXNlck1v
ZGlmeShkb2N1bWVudC0+aW5EZXNpZ25Nb2RlKCkgPyBSRUFEX1dSSVRFIDogUkVBRF9PTkxZKTsK
KworICAgIEVsZW1lbnQqIGRvY0VsZW1lbnQgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7
CisgICAgUmVuZGVyT2JqZWN0KiBkb2NFbGVtZW50UmVuZGVyZXIgPSBkb2NFbGVtZW50ID8gZG9j
RWxlbWVudC0+cmVuZGVyZXIoKSA6IDA7CisgICAgaWYgKGRvY0VsZW1lbnRSZW5kZXJlcikgewor
ICAgICAgICAvLyBVc2UgdGhlIGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIG9mIHRoZSBib2R5
IHRvIHNldCB0aGUKKyAgICAgICAgLy8gdmlld3BvcnQncyBkaXJlY3Rpb24gYW5kIHdyaXRpbmct
bW9kZSB1bmxlc3MgdGhlIHByb3BlcnR5IGlzIHNldCBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4K
KyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYm9keSwgdGhlbiB1c2UgdGhlIGRvY3VtZW50IGVs
ZW1lbnQuCisgICAgICAgIFJlbmRlck9iamVjdCogYm9keVJlbmRlcmVyID0gZG9jdW1lbnQtPmJv
ZHkoKSA/IGRvY3VtZW50LT5ib2R5KCktPnJlbmRlcmVyKCkgOiAwOworICAgICAgICBpZiAoYm9k
eVJlbmRlcmVyICYmICFkb2N1bWVudC0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgp
KQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoYm9keVJlbmRlcmVy
LT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9j
dW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT53
cml0aW5nTW9kZSgpKTsKKyAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPmRp
cmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgICAgICBkb2N1bWVudFN0eWxl
LT5zZXREaXJlY3Rpb24oYm9keVJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihkb2NFbGVt
ZW50UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKKyAgICB9CisKKyAgICBpZiAoZnJh
bWUpIHsKKyAgICAgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKSkg
eworICAgICAgICAgICAgY29uc3QgUGFnaW5hdGlvbiYgcGFnaW5hdGlvbiA9IGZyYW1lVmlldy0+
cGFnaW5hdGlvbigpOworICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24ubW9kZSAhPSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRp
b25Nb2RlKHBhZ2luYXRpb24ubW9kZSwgZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAgICAg
ICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Q29sdW1uR2FwKHBhZ2luYXRpb24uZ2FwKTsKKyAgICAg
ICAgICAgICAgICBpZiAoUmVuZGVyVmlldyogdmlldyA9IGRvY3VtZW50LT5yZW5kZXJWaWV3KCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXctPmhhc0NvbHVtbnMoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHZpZXctPnVwZGF0ZUNvbHVtbkluZm9Gcm9tU3R5bGUoZG9jdW1lbnRT
dHlsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorCisgICAgLy8gU2VhbWxlc3MgaWZyYW1lcyB3YW50IHRvIGluaGVyaXQgdGhlaXIg
Zm9udCBmcm9tIHRoZWlyIHBhcmVudCBpZnJhbWUsIHNvIGVhcmx5IHJldHVybiBiZWZvcmUgc2V0
dGluZyB0aGUgZm9udC4KKyAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50KQorICAgICAgICByZXR1
cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7CisKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERl
c2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRD
b2RlRm9yRm9udFNlbGVjdGlvbihkb2N1bWVudFN0eWxlLT5sb2NhbGUoKSkpOworICAgIGlmIChT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKSkgeworICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkgfHwgIXNl
dHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkp
OworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0YW5kYXJkRm9udCA9IHNldHRpbmdzLT5z
dGFuZGFyZEZvbnRGYW1pbHkoZm9udERlc2NyaXB0aW9uLnNjcmlwdCgpKTsKKyAgICAgICAgaWYg
KCFzdGFuZGFyZEZvbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsKKyAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZv
bnQpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFt
aWx5KDApOworICAgICAgICB9CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6
ZShDU1NWYWx1ZU1lZGl1bSAtIENTU1ZhbHVlWHhTbWFsbCArIDEpOworICAgICAgICBpbnQgc2l6
ZSA9IFN0eWxlUmVzb2x2ZXI6OmZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCwgQ1NTVmFsdWVN
ZWRpdW0sIGZhbHNlKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUo
c2l6ZSk7CisgICAgICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzID0gZG9jdW1lbnQtPmlzU1ZHRG9j
dW1lbnQoKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShTdHlsZVJl
c29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgZG9jdW1l
bnRTdHlsZS5nZXQoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVz
ZVNWR1pvb21SdWxlcykpOworICAgIH0gZWxzZQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkpOworCisgICAgRm9udE9yaWVudGF0
aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3Jp
ZW50YXRpb247CisgICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oZG9jdW1lbnRTdHlsZS5n
ZXQoKSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3Jp
cHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3JpcHRp
b24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKKworICAgIGRv
Y3VtZW50U3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIGRv
Y3VtZW50U3R5bGUtPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKTsKKworICAgIHJldHVybiBk
b2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQXRTaGFk
b3dCb3VuZGFyeShjb25zdCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmICghZWxlbWVudCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUgPSBl
bGVtZW50LT5wYXJlbnROb2RlKCk7CisgICAgcmV0dXJuIHBhcmVudE5vZGUgJiYgcGFyZW50Tm9k
ZS0+aXNTaGFkb3dSb290KCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCBSZW5kZXJTdHlsZSogZGVm
YXVsdFBhcmVudCwKKyAgICBTdHlsZVNoYXJpbmdCZWhhdmlvciBzaGFyaW5nQmVoYXZpb3IsIFJ1
bGVNYXRjaGluZ0JlaGF2aW9yIG1hdGNoaW5nQmVoYXZpb3IsIFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZykKK3sKKyAgICAvLyBPbmNlIGFuIGVsZW1lbnQgaGFzIGEgcmVuZGVyZXIsIHdl
IGRvbid0IHRyeSB0byBkZXN0cm95IGl0LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlbmRlcmVyCisg
ICAgLy8gd2lsbCB2YW5pc2ggaWYgYSBzdHlsZSByZWNhbGMgaGFwcGVucyBkdXJpbmcgbG9hZGlu
Zy4KKyAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFlbGVt
ZW50LT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiAhZWxlbWVudC0+cmVu
ZGVyZXIoKSkgeworICAgICAgICBpZiAoIXNfc3R5bGVOb3RZZXRBdmFpbGFibGUpIHsKKyAgICAg
ICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCkubGVh
a1JlZigpOworICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+c2V0RGlzcGxheShO
T05FKTsKKyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPmZvbnQoKS51cGRhdGUo
bV9mb250U2VsZWN0b3IpOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnQtPmRvY3VtZW50KCkt
PnNldEhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKTsKKyAgICAgICAgcmV0dXJuIHNfc3R5
bGVOb3RZZXRBdmFpbGFibGU7CisgICAgfQorCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
KyAgICBpbml0RWxlbWVudChlbGVtZW50KTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIGVsZW1lbnQsIGRlZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JT
dHlsaW5nKTsKKyAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYm
ICFzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBSZW5kZXJT
dHlsZSogc2hhcmVkU3R5bGUgPSBsb2NhdGVTaGFyZWRTdHlsZSgpOworICAgICAgICBpZiAoc2hh
cmVkU3R5bGUpCisgICAgICAgICAgICByZXR1cm4gc2hhcmVkU3R5bGU7CisgICAgfQorCisgICAg
UmVmUHRyPFJlbmRlclN0eWxlPiBjbG9uZUZvclBhcmVudDsKKworICAgIGlmIChzdGF0ZS5wYXJl
bnRTdHlsZSgpKSB7CisgICAgICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUo
KSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKHN0YXRlLnBhcmVudFN0eWxl
KCksIGlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSA/IFJlbmRlclN0eWxlOjpBdFNoYWRvd0Jv
dW5kYXJ5IDogUmVuZGVyU3R5bGU6Ok5vdEF0U2hhZG93Qm91bmRhcnkpOworICAgIH0gZWxzZSB7
CisgICAgICAgIHN0YXRlLnNldFN0eWxlKGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSk7CisgICAg
ICAgIGNsb25lRm9yUGFyZW50ID0gUmVuZGVyU3R5bGU6OmNsb25lKHN0YXRlLnN0eWxlKCkpOwor
ICAgICAgICBzdGF0ZS5zZXRQYXJlbnRTdHlsZShjbG9uZUZvclBhcmVudC5nZXQoKSk7CisgICAg
fQorICAgIC8vIGNvbnRlbnRlZGl0YWJsZSBhdHRyaWJ1dGUgKGltcGxlbWVudGVkIGJ5IC13ZWJr
aXQtdXNlci1tb2RpZnkpIHNob3VsZAorICAgIC8vIGJlIHByb3BhZ2F0ZWQgZnJvbSBzaGFkb3cg
aG9zdCB0byBkaXN0cmlidXRlZCBub2RlLgorICAgIGlmIChzdGF0ZS5kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBpZiAoRWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+
cGFyZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoUmVuZGVyU3R5bGUqIHN0eWxlT2ZT
aGFkb3dIb3N0ID0gcGFyZW50LT5yZW5kZXJTdHlsZSgpKQorICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFVzZXJNb2RpZnkoc3R5bGVPZlNoYWRvd0hvc3QtPnVzZXJNb2RpZnkoKSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpIHsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0SXNMaW5rKHRydWUpOworICAgICAgICBFSW5zaWRlTGluayBs
aW5rU3RhdGUgPSBzdGF0ZS5lbGVtZW50TGlua1N0YXRlKCk7CisgICAgICAgIGlmIChsaW5rU3Rh
dGUgIT0gTm90SW5zaWRlTGluaykgeworICAgICAgICAgICAgYm9vbCBmb3JjZVZpc2l0ZWQgPSBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmZvcmNlUHNldWRvU3RhdGUoZWxlbWVudCwgQ1NTU2Vs
ZWN0b3I6OlBzZXVkb1Zpc2l0ZWQpOworICAgICAgICAgICAgaWYgKGZvcmNlVmlzaXRlZCkKKyAg
ICAgICAgICAgICAgICBsaW5rU3RhdGUgPSBJbnNpZGVWaXNpdGVkTGluazsKKyAgICAgICAgfQor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0ZSk7CisgICAgfQor
CisgICAgYm9vbCBuZWVkc0NvbGxlY3Rpb24gPSBmYWxzZTsKKyAgICBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OmVuc3VyZURlZmF1bHRTdHlsZVNoZWV0c0ZvckVsZW1lbnQoZWxlbWVudCwgbmVlZHND
b2xsZWN0aW9uKTsKKyAgICBpZiAobmVlZHNDb2xsZWN0aW9uKQorICAgICAgICBtX3J1bGVTZXRz
LmNvbGxlY3RGZWF0dXJlcyhkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29s
dmVyLmdldCgpKTsKKworICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OworICAgIGlmIChtYXRj
aGluZ0JlaGF2aW9yID09IE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKQorICAgICAgICBtYXRjaFVB
UnVsZXMobWF0Y2hSZXN1bHQpOworICAgIGVsc2UKKyAgICAgICAgbWF0Y2hBbGxSdWxlcyhtYXRj
aFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7
CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKKwor
ICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29y
YXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgorICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRl
LnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGVsZW1lbnQpOworCisgICAgc3RhdGUuY2xl
YXIoKTsgLy8gQ2xlYXIgb3V0IGZvciB0aGUgbmV4dCByZXNvbHZlLgorCisgICAgZG9jdW1lbnQo
KS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5
bGUuCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxl
KiBlbGVtZW50U3R5bGUsIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lLCBLZXlmcmFtZVZh
bHVlJiBrZXlmcmFtZVZhbHVlKQoreworICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKKyAgICBpZiAo
a2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVz
dWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKworICAgIEFTU0VSVCghbV9zdGF0ZS5zdHls
ZSgpKTsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICAvLyBDcmVhdGUgdGhl
IHN0eWxlCisgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNsb25lKGVsZW1lbnRTdHls
ZSkpOworICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKworICAgIC8vIFdlIGRvbid0
IG5lZWQgdG8gYm90aGVyIHdpdGggIWltcG9ydGFudC4gU2luY2UgdGhlcmUgaXMgb25seSBldmVy
IG9uZQorICAgIC8vIGRlY2wsIHRoZXJlJ3Mgbm90aGluZyB0byBvdmVycmlkZS4gU28ganVzdCBh
ZGQgdGhlIGZpcnN0IHByb3BlcnRpZXMuCisgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7
CisgICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCisgICAgICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8g
SWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAg
IHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBz
dXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZQorICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0
YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKKworICAgIC8vIE5vdyBkbyByZXN0IG9mIHRoZSBwcm9w
ZXJ0aWVzLgorICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwg
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisg
ICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQgYnkgb25lIG9mIHRoZSBub24tZXNzZW50aWFs
IGZvbnQgcHJvcHMsCisgICAgLy8gZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBhIHNlY29uZCB0aW1l
LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJl
ZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAg
IAorICAgIC8vIEFkZCBhbGwgdGhlIGFuaW1hdGluZyBwcm9wZXJ0aWVzIHRvIHRoZSBrZXlmcmFt
ZS4KKyAgICBpZiAoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogc3R5bGVEZWNsYXJhdGlvbiA9IGtl
eWZyYW1lLT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9
IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5Q291bnQoKTsKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHByb3BlcnR5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgQ1NTUHJvcGVy
dHlJRCBwcm9wZXJ0eSA9IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5QXQoaSkuaWQoKTsKKyAg
ICAgICAgICAgIC8vIFRpbWluZy1mdW5jdGlvbiB3aXRoaW4ga2V5ZnJhbWVzIGlzIHNwZWNpYWws
IGJlY2F1c2UgaXQgaXMgbm90IGFuaW1hdGVkOyBpdCBqdXN0CisgICAgICAgICAgICAvLyBkZXNj
cmliZXMgdGhlIHRpbWluZyBmdW5jdGlvbiBiZXR3ZWVuIHRoaXMga2V5ZnJhbWUgYW5kIHRoZSBu
ZXh0LgorICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0
aW9uVGltaW5nRnVuY3Rpb24pCisgICAgICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5hZGRQcm9w
ZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkb2N1bWVudCgpLT5kaWRB
Y2Nlc3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Cit9
CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6a2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVu
dCogZSwgY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgS2V5ZnJhbWVMaXN0JiBsaXN0
KQoreworICAgIGxpc3QuY2xlYXIoKTsKKworICAgIC8vIEdldCB0aGUga2V5ZnJhbWVzUnVsZSBm
b3IgdGhpcyBuYW1lCisgICAgaWYgKCFlIHx8IGxpc3QuYW5pbWF0aW9uTmFtZSgpLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLmNoZWNrQ29uc2lz
dGVuY3koKTsKKworICAgIEtleWZyYW1lc1J1bGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9rZXlmcmFt
ZXNSdWxlTWFwLmZpbmQobGlzdC5hbmltYXRpb25OYW1lKCkuaW1wbCgpKTsKKyAgICBpZiAoaXQg
PT0gbV9rZXlmcmFtZXNSdWxlTWFwLmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25z
dCBTdHlsZVJ1bGVLZXlmcmFtZXMqIGtleWZyYW1lc1J1bGUgPSBpdC0+dmFsdWUuZ2V0KCk7CisK
KyAgICAvLyBDb25zdHJ1Y3QgYW5kIHBvcHVsYXRlIHRoZSBzdHlsZSBmb3IgZWFjaCBrZXlmcmFt
ZQorICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVLZXlmcmFtZT4gPiYga2V5ZnJhbWVzID0g
a2V5ZnJhbWVzUnVsZS0+a2V5ZnJhbWVzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGtleWZyYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBBcHBseSB0aGUgZGVjbGFyYXRp
b24gdG8gdGhlIHN0eWxlLiBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBsb2dp
YyBpbiBzdHlsZUZvckVsZW1lbnQKKyAgICAgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgICAgIG1f
c3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlKTsKKworICAgICAgICBjb25z
dCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSA9IGtleWZyYW1lc1tpXS5nZXQoKTsKKworICAgICAg
ICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7CisgICAgICAgIGtleWZyYW1lVmFs
dWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIGtleWZyYW1lLCBrZXlm
cmFtZVZhbHVlKSk7CisKKyAgICAgICAgLy8gQWRkIHRoaXMga2V5ZnJhbWUgc3R5bGUgdG8gYWxs
IHRoZSBpbmRpY2F0ZWQga2V5IHRpbWVzCisgICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5czsKKyAg
ICAgICAga2V5ZnJhbWUtPmdldEtleXMoa2V5cyk7CisgICAgICAgIGZvciAoc2l6ZV90IGtleUlu
ZGV4ID0gMDsga2V5SW5kZXggPCBrZXlzLnNpemUoKTsgKytrZXlJbmRleCkgeworICAgICAgICAg
ICAga2V5ZnJhbWVWYWx1ZS5zZXRLZXkoa2V5c1trZXlJbmRleF0pOworICAgICAgICAgICAgbGlz
dC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0
aGUgMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBp
cyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCisgICAgaW50IGluaXRpYWxMaXN0U2l6ZSA9
IGxpc3Quc2l6ZSgpOworICAgIGlmIChpbml0aWFsTGlzdFNpemUgPiAwICYmIGxpc3RbMF0ua2V5
KCkpIHsKKyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIHplcm9QZXJjZW50S2V5ZnJhbWU7
CisgICAgICAgIGlmICghemVyb1BlcmNlbnRLZXlmcmFtZSkgeworICAgICAgICAgICAgemVyb1Bl
cmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAg
ICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUtPnNldEtleVRleHQoIjAlIik7CisgICAgICAgIH0K
KyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlm
cmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCB6ZXJvUGVy
Y2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZy
YW1lVmFsdWUpOworICAgIH0KKworICAgIC8vIElmIHRoZSAxMDAlIGtleWZyYW1lIGlzIG1pc3Np
bmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtl
eWZyYW1lKQorICAgIGlmIChpbml0aWFsTGlzdFNpemUgPiAwICYmIChsaXN0W2xpc3Quc2l6ZSgp
IC0gMV0ua2V5KCkgIT0gMSkpIHsKKyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIGh1bmRy
ZWRQZXJjZW50S2V5ZnJhbWU7CisgICAgICAgIGlmICghaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSkg
eworICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNy
ZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUtPnNl
dEtleVRleHQoIjEwMCUiKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZy
YW1lVmFsdWUoMSwgMCk7CisgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JL
ZXlmcmFtZShlbGVtZW50U3R5bGUsIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFs
dWUpKTsKKyAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgfQorfQorCitQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1l
bnQoRWxlbWVudCogZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVl
c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICBBU1NFUlQocGFyZW50U3R5bGUp
OworICAgIGlmICghZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOworCisgICAgaW5pdEVsZW1lbnQoZSk7CisKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVS
ZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlLCBwc2V1ZG9TdHlsZVJlcXVlc3QpOwor
ICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgc3RhdGUuc3R5
bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKKworICAgIC8vIFNpbmNl
IHdlIGRvbid0IHVzZSBwc2V1ZG8tZWxlbWVudHMgaW4gYW55IG9mIG91ciBxdWlyay9wcmludCB1
c2VyIGFnZW50IHJ1bGVzLCBkb24ndCB3YXN0ZSB0aW1lIHdhbGtpbmcKKyAgICAvLyB0aG9zZSBy
dWxlcy4KKworICAgIC8vIENoZWNrIFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCisgICAgTWF0
Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7CisgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKwor
ICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykgeworICAgICAgICBtYXRjaFVzZXJS
dWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOworICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKG1hdGNo
UmVzdWx0LCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRTdHlsZVR5cGUocHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkKTsKKworICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGUpOworCisgICAgLy8gQ2xlYW4gdXAgb3Vy
IHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVy
IGZpeHVwcykuCisgICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5w
YXJlbnRTdHlsZSgpLCAwKTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVy
ZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAg
ZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVy
biB0aGUgc3R5bGUuCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRl
eCkKK3sKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZG9jdW1l
bnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpOyAvLyBtX3Jvb3RFbGVtZW50U3R5bGUgd2lsbCBiZSBz
ZXQgdG8gdGhlIGRvY3VtZW50IHN0eWxlLgorCisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJT
dHlsZTo6Y3JlYXRlKCkpOworICAgIG1fc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0
ZS5yb290RWxlbWVudFN0eWxlKCkpOworCisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQ
YWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFn
ZUluZGV4KTsKKyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7Cisg
ICAgCisgICAgTWF0Y2hSZXN1bHQgcmVzdWx0OworICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwg
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0
LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxl
KCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xv
YmFsIGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVj
LgorICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBp
c0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDAp
OworICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOworI2lmIEVOQUJMRShDU1NfVkFSSUFC
TEVTKQorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVz
dWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVy
aXRlZE9ubHkpOworI2VuZGlmCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3Jp
dHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGly
dGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgpOworCisg
ICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0
aGUgZm9udC1zaXplLgorICAgIGlmIChtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgbV9zdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVy
dGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAt
IDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVm
ZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisKKyAg
ICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBOb3cgcmV0
dXJuIHRoZSBzdHlsZS4KKyAgICByZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6ZGVmYXVsdFN0eWxlRm9yRWxlbWVu
dCgpCit7CisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAg
IC8vIE1ha2Ugc3VyZSBvdXIgZm9udHMgYXJlIGluaXRpYWxpemVkIGlmIHdlIGRvbid0IGluaGVy
aXQgdGhlbSBmcm9tIG91ciBwYXJlbnQgc3R5bGUuCisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5n
cyA9IGRvY3VtZW50U2V0dGluZ3MoKSkgeworICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNl
dHRpbmdzKTsKKyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxl
Y3RvcigpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBk
YXRlKDApOworCisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yVGV4dChUZXh0KiB0ZXh0Tm9k
ZSkKK3sKKyAgICBBU1NFUlQodGV4dE5vZGUpOworCisgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQg
Y29udGV4dCh0ZXh0Tm9kZSk7CisgICAgTm9kZSogcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50
Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CisgICAgcmV0dXJuIGNvbnRleHQucmVzZXRTdHls
ZUluaGVyaXRhbmNlKCkgfHwgIXBhcmVudE5vZGUgPworICAgICAgICBkZWZhdWx0U3R5bGVGb3JF
bGVtZW50KCkgOiBwYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpOworfQorCitzdGF0aWMgdm9pZCBh
ZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICAvLyBJbnRyaW5z
aWMgbWFyZ2luIHZhbHVlLgorICAgIGNvbnN0IGludCBpbnRyaW5zaWNNYXJnaW4gPSAyICogc3R5
bGUtPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9oZWlnaHQg
YWxvbmUgYW5kIG5vdCBhbHNvIGRlYWxpbmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRoIGlzIGZs
YXdlZC4KKyAgICAvLyBGSVhNRTogVXNpbmcgInF1aXJrIiB0byBkZWNpZGUgdGhlIG1hcmdpbiB3
YXNuJ3Qgc2V0IGlzIGtpbmQgb2YgbGFtZS4KKyAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRy
aW5zaWNPckF1dG8oKSkgeworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygp
KQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpbkxlZnQoTGVuZ3RoKGludHJpbnNpY01hcmdp
biwgRml4ZWQpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luUmlnaHQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwg
Rml4ZWQpKTsKKyAgICB9CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7Cisg
ICAgICAgIGlmIChzdHlsZS0+bWFyZ2luVG9wKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5tYXJnaW5Cb3R0b20oKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dE1hcmdpbkJvdHRvbShMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgIH0KK30K
Kworc3RhdGljIEVEaXNwbGF5IGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoRURpc3BsYXkgZGlzcGxh
eSwgYm9vbCBpc0Zsb2F0aW5nLCBib29sIHN0cmljdFBhcnNpbmcpCit7CisgICAgc3dpdGNoIChk
aXNwbGF5KSB7CisgICAgY2FzZSBCTE9DSzoKKyAgICBjYXNlIFRBQkxFOgorICAgIGNhc2UgQk9Y
OgorICAgIGNhc2UgRkxFWDoKKyAgICBjYXNlIEdSSUQ6CisgICAgICAgIHJldHVybiBkaXNwbGF5
OworCisgICAgY2FzZSBMSVNUX0lURU06CisgICAgICAgIC8vIEl0IGlzIGEgV2luSUUgYnVnIHRo
YXQgZmxvYXRlZCBsaXN0IGl0ZW1zIGxvc2UgdGhlaXIgYnVsbGV0cywgc28gd2UnbGwgZW11bGF0
ZSB0aGUgcXVpcmssIGJ1dCBvbmx5IGluIHF1aXJrcyBtb2RlLgorICAgICAgICBpZiAoIXN0cmlj
dFBhcnNpbmcgJiYgaXNGbG9hdGluZykKKyAgICAgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICAg
ICAgcmV0dXJuIGRpc3BsYXk7CisgICAgY2FzZSBJTkxJTkVfVEFCTEU6CisgICAgICAgIHJldHVy
biBUQUJMRTsKKyAgICBjYXNlIElOTElORV9CT1g6CisgICAgICAgIHJldHVybiBCT1g7CisgICAg
Y2FzZSBJTkxJTkVfRkxFWDoKKyAgICAgICAgcmV0dXJuIEZMRVg7CisgICAgY2FzZSBJTkxJTkVf
R1JJRDoKKyAgICAgICAgcmV0dXJuIEdSSUQ7CisKKyAgICBjYXNlIElOTElORToKKyAgICBjYXNl
IFJVTl9JTjoKKyAgICBjYXNlIENPTVBBQ1Q6CisgICAgY2FzZSBJTkxJTkVfQkxPQ0s6CisgICAg
Y2FzZSBUQUJMRV9ST1dfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9IRUFERVJfR1JPVVA6CisgICAg
Y2FzZSBUQUJMRV9GT09URVJfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9ST1c6CisgICAgY2FzZSBU
QUJMRV9DT0xVTU5fR1JPVVA6CisgICAgY2FzZSBUQUJMRV9DT0xVTU46CisgICAgY2FzZSBUQUJM
RV9DRUxMOgorICAgIGNhc2UgVEFCTEVfQ0FQVElPTjoKKyAgICAgICAgcmV0dXJuIEJMT0NLOwor
ICAgIGNhc2UgTk9ORToKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJl
dHVybiBOT05FOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4g
QkxPQ0s7Cit9CisKKy8vIENTUyByZXF1aXJlcyB0ZXh0LWRlY29yYXRpb24gdG8gYmUgcmVzZXQg
YXQgZWFjaCBET00gZWxlbWVudCBmb3IgdGFibGVzLCAKKy8vIGlubGluZSBibG9ja3MsIGlubGlu
ZSB0YWJsZXMsIHJ1bi1pbnMsIHNoYWRvdyBET00gY3Jvc3NpbmdzLCBmbG9hdGluZyBlbGVtZW50
cywKKy8vIGFuZCBhYnNvbHV0ZSBvciByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMuCitz
dGF0aWMgYm9vbCBkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0aW9uKFJlbmRlclN0eWxlKiBzdHls
ZSwgRWxlbWVudCogZSkKK3sKKyAgICByZXR1cm4gc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8
fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09
IFJVTl9JTgorICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CTE9DSyB8fCBz
dHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1ggfHwgaXNBdFNoYWRvd0JvdW5kYXJ5KGUpCisg
ICAgICAgIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0
aW9uKCk7Cit9CisKK3N0YXRpYyBib29sIGlzRGlzcGxheUZsZXhpYmxlQm94KEVEaXNwbGF5IGRp
c3BsYXkpCit7CisgICAgcmV0dXJuIGRpc3BsYXkgPT0gRkxFWCB8fCBkaXNwbGF5ID09IElOTElO
RV9GTEVYOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkanVzdFJlbmRlclN0eWxlKFJlbmRl
clN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50ICplKQorewor
ICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7CisKKyAgICAvLyBDYWNoZSBvdXIgb3JpZ2luYWwgZGlz
cGxheS4KKyAgICBzdHlsZS0+c2V0T3JpZ2luYWxEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCkpOwor
CisgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORSkgeworICAgICAgICAvLyBJZiB3ZSBo
YXZlIGEgPHRkPiB0aGF0IHNwZWNpZmllcyBhIGZsb2F0IHByb3BlcnR5LCBpbiBxdWlya3MgbW9k
ZSB3ZSBqdXN0IGRyb3AgdGhlIGZsb2F0CisgICAgICAgIC8vIHByb3BlcnR5LgorICAgICAgICAv
LyBTaXRlcyBhbHNvIGNvbW1vbmx5IHVzZSBkaXNwbGF5OmlubGluZS9ibG9jayBvbiA8dGQ+cyBh
bmQgPHRhYmxlPnMuIEluIHF1aXJrcyBtb2RlIHdlIGZvcmNlCisgICAgICAgIC8vIHRoZXNlIHRh
Z3MgdG8gcmV0YWluIHRoZWlyIGRpc3BsYXkgdHlwZXMuCisgICAgICAgIGlmIChkb2N1bWVudCgp
LT5pblF1aXJrc01vZGUoKSAmJiBlKSB7CisgICAgICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZSh0
ZFRhZykpIHsKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsK
KyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAg
ICB9IGVsc2UgaWYgKGUtPmhhc1RhZ05hbWUodGFibGVUYWcpKQorICAgICAgICAgICAgICAgIHN0
eWxlLT5zZXREaXNwbGF5KHN0eWxlLT5pc0Rpc3BsYXlJbmxpbmVUeXBlKCkgPyBJTkxJTkVfVEFC
TEUgOiBUQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFt
ZSh0ZFRhZykgfHwgZS0+aGFzVGFnTmFtZSh0aFRhZykpKSB7CisgICAgICAgICAgICBpZiAoc3R5
bGUtPndoaXRlU3BhY2UoKSA9PSBLSFRNTF9OT1dSQVApIHsKKyAgICAgICAgICAgICAgICAvLyBG
aWd1cmUgb3V0IGlmIHdlIGFyZSByZWFsbHkgbm93cmFwcGluZyBvciBpZiB3ZSBzaG91bGQganVz
dAorICAgICAgICAgICAgICAgIC8vIHVzZSBub3JtYWwgaW5zdGVhZC4gSWYgdGhlIHdpZHRoIG9m
IHRoZSBjZWxsIGlzIGZpeGVkLCB0aGVuCisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0
dWFsbHkgdXNlIE5PV1JBUC4KKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNG
aXhlZCgpKQorICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwp
OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdo
aXRlU3BhY2UoTk9XUkFQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8v
IFRhYmxlcyBuZXZlciBzdXBwb3J0IHRoZSAtd2Via2l0LSogdmFsdWVzIGZvciB0ZXh0LWFsaWdu
IGFuZCB3aWxsIHJlc2V0IGJhY2sgdG8gdGhlIGRlZmF1bHQuCisgICAgICAgIGlmIChlICYmIGUt
Pmhhc1RhZ05hbWUodGFibGVUYWcpICYmIChzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0xF
RlQgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9DRU5URVIgfHwgc3R5bGUtPnRleHRB
bGlnbigpID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWdu
KFRBU1RBUlQpOworCisgICAgICAgIC8vIEZyYW1lcyBhbmQgZnJhbWVzZXRzIG5ldmVyIGhvbm9y
IHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOmFic29sdXRlLiBUaGlzIGlzIG5lY2Vzc2Fy
eSB0bworICAgICAgICAvLyBmaXggYSBjcmFzaCB3aGVyZSBhIHNpdGUgdHJpZXMgdG8gcG9zaXRp
b24gdGhlc2Ugb2JqZWN0cy4gVGhleSBhbHNvIG5ldmVyIGhvbm9yIGRpc3BsYXkuCisgICAgICAg
IGlmIChlICYmIChlLT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGZyYW1l
c2V0VGFnKSkpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlv
bik7CisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBSdWJ5IHRleHQgZG9lcyBub3Qgc3VwcG9ydCBmbG9hdCBvciBwb3NpdGlvbi4g
VGhpcyBtaWdodCBjaGFuZ2Ugd2l0aCBldm9sdXRpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uCisg
ICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUocnRUYWcpKSB7CisgICAgICAgICAgICBzdHls
ZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldEZs
b2F0aW5nKE5vRmxvYXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3Vs
ZG4ndCBiZSBvdmVycmlkaW5nIHN0YXJ0Ly13ZWJraXQtYXV0byBsaWtlIHRoaXMuIERvIGl0IGlu
IGh0bWwuY3NzIGluc3RlYWQuCisgICAgICAgIC8vIFRhYmxlIGhlYWRlcnMgd2l0aCBhIHRleHQt
YWxpZ24gb2YgLXdlYmtpdC1hdXRvIHdpbGwgY2hhbmdlIHRoZSB0ZXh0LWFsaWduIHRvIGNlbnRl
ci4KKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0aFRhZykgJiYgc3R5bGUtPnRleHRB
bGlnbigpID09IFRBU1RBUlQpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKENFTlRF
Uik7CisKKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQorICAgICAg
ICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworCisgICAgICAgIC8vIEFic29sdXRlL2Zp
eGVkIHBvc2l0aW9uZWQgZWxlbWVudHMsIGZsb2F0aW5nIGVsZW1lbnRzIGFuZCB0aGUgZG9jdW1l
bnQgZWxlbWVudCBuZWVkIGJsb2NrLWxpa2Ugb3V0c2lkZSBkaXNwbGF5LgorICAgICAgICBpZiAo
c3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCkgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCAo
ZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXko
KSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7CisK
KyAgICAgICAgLy8gRklYTUU6IERvbid0IHN1cHBvcnQgdGhpcyBtdXRhdGlvbiBmb3IgcHNldWRv
IHN0eWxlcyBsaWtlIGZpcnN0LWxldHRlciBvciBmaXJzdC1saW5lLCBzaW5jZSBpdCdzIG5vdCBj
b21wbGV0ZWx5CisgICAgICAgIC8vIGNsZWFyIGhvdyB0aGF0IHNob3VsZCB3b3JrLgorICAgICAg
ICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgJiYgc3R5bGUtPnN0eWxlVHlwZSgpID09
IE5PUFNFVURPICYmIHN0eWxlLT53cml0aW5nTW9kZSgpICE9IHBhcmVudFN0eWxlLT53cml0aW5n
TW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKwor
ICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRoZSBkaXNwbGF5IG11dGF0aW9uLCBjaGVjayB0
YWJsZSByb3dzLiBXZSBkbyBub3QgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246
c3RpY2t5IG9uCisgICAgICAgIC8vIHRhYmxlIHJvd3Mgb3IgY2VsbHMuIFRoaXMgaGFzIGJlZW4g
ZXN0YWJsaXNoZWQgZm9yIHBvc2l0aW9uOnJlbGF0aXZlIGluIENTUzIuMSAoYW5kIGNhdXNlZCBh
IGNyYXNoIGluIGNvbnRhaW5pbmdCbG9jaygpCisgICAgICAgIC8vIG9uIHNvbWUgc2l0ZXMpLgor
ICAgICAgICBpZiAoKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0
eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPVykKKyAgICAgICAgICAgICYmIHN0eWxlLT5oYXNJbkZsb3dQb3NpdGlvbigpKQorICAg
ICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKworICAgICAgICAv
LyB3cml0aW5nLW1vZGUgZG9lcyBub3QgYXBwbHkgdG8gdGFibGUgcm93IGdyb3VwcywgdGFibGUg
Y29sdW1uIGdyb3VwcywgdGFibGUgcm93cywgYW5kIHRhYmxlIGNvbHVtbnMuCisgICAgICAgIC8v
IEZJWE1FOiBUYWJsZSBjZWxscyBzaG91bGQgYmUgYWxsb3dlZCB0byBiZSBwZXJwZW5kaWN1bGFy
IG9yIGZsaXBwZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB0YWJsZSwgdGhvdWdoLgorICAgICAgICBp
ZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU4gfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9DT0xVTU5fR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJf
R1JPVVAKKyAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dS
T1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX0NFTEwpCisgICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUocGFyZW50U3R5bGUt
PndyaXRpbmdNb2RlKCkpOworCisgICAgICAgIC8vIEZJWE1FOiBTaW5jZSB3ZSBkb24ndCBzdXBw
b3J0IGJsb2NrLWZsb3cgb24gZmxleGlibGUgYm94ZXMgeWV0LCBkaXNhbGxvdyBzZXR0aW5nCisg
ICAgICAgIC8vIG9mIGJsb2NrLWZsb3cgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBUb3BUb0JvdHRv
bVdyaXRpbmdNb2RlLgorICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NDY0MTggLSBGbGV4aWJsZSBib3ggc3VwcG9ydC4KKyAgICAgICAgaWYgKHN0eWxl
LT53cml0aW5nTW9kZSgpICE9IFRvcFRvQm90dG9tV3JpdGluZ01vZGUgJiYgKHN0eWxlLT5kaXNw
bGF5KCkgPT0gQk9YIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCkpCisgICAgICAg
ICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUoVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSk7CisKKyAg
ICAgICAgaWYgKGlzRGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKSB7
CisgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAgICBz
dHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCks
IHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworICAg
ICAgICB9CisKKyNpZiBFTkFCTEUoRElBTE9HX0VMRU1FTlQpCisgICAgICAgIC8vIFBlciB0aGUg
c3BlYywgcG9zaXRpb24gJ3N0YXRpYycgYW5kICdyZWxhdGl2ZScgaW4gdGhlIHRvcCBsYXllciBj
b21wdXRlIHRvICdhYnNvbHV0ZScuCisgICAgICAgIGlmIChlICYmIGUtPmlzSW5Ub3BMYXllcigp
ICYmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiB8fCBzdHlsZS0+cG9zaXRp
b24oKSA9PSBSZWxhdGl2ZVBvc2l0aW9uKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0
aW9uKEFic29sdXRlUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxP
Q0spOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgb3VyIHot
aW5kZXggdmFsdWUgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBvYmplY3QgaXMgcG9zaXRpb25lZC4K
KyAgICBpZiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gJiYgIWlzRGlzcGxh
eUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKQorICAgICAgICBzdHlsZS0+c2V0
SGFzQXV0b1pJbmRleCgpOworCisgICAgLy8gQXV0byB6LWluZGV4IGJlY29tZXMgMCBmb3IgdGhl
IHJvb3QgZWxlbWVudCBhbmQgdHJhbnNwYXJlbnQgb2JqZWN0cy4gVGhpcyBwcmV2ZW50cworICAg
IC8vIGNhc2VzIHdoZXJlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgYmxlbmRlZCBhcyBhIHNpbmds
ZSB1bml0IGVuZCB1cCB3aXRoIGEgbm9uLXRyYW5zcGFyZW50CisgICAgLy8gb2JqZWN0IHdlZGdl
ZCBpbiBiZXR3ZWVuIHRoZW0uIEF1dG8gei1pbmRleCBhbHNvIGJlY29tZXMgMCBmb3Igb2JqZWN0
cyB0aGF0IHNwZWNpZnkgdHJhbnNmb3Jtcy9tYXNrcy9yZWZsZWN0aW9ucy4KKyAgICBpZiAoc3R5
bGUtPmhhc0F1dG9aSW5kZXgoKSAmJiAoKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVt
ZW50KCkgPT0gZSkKKyAgICAgICAgfHwgc3R5bGUtPm9wYWNpdHkoKSA8IDEuMGYKKyAgICAgICAg
fHwgc3R5bGUtPmhhc1RyYW5zZm9ybVJlbGF0ZWRQcm9wZXJ0eSgpCisgICAgICAgIHx8IHN0eWxl
LT5oYXNNYXNrKCkKKyAgICAgICAgfHwgc3R5bGUtPmNsaXBQYXRoKCkKKyAgICAgICAgfHwgc3R5
bGUtPmJveFJlZmxlY3QoKQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkKKyAgICAgICAg
fHwgc3R5bGUtPmhhc0JsZW5kTW9kZSgpCisgICAgICAgIHx8IHN0eWxlLT5wb3NpdGlvbigpID09
IFN0aWNreVBvc2l0aW9uCisgICAgICAgIHx8IChzdHlsZS0+cG9zaXRpb24oKSA9PSBGaXhlZFBv
c2l0aW9uICYmIGUgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpICYmIGUtPmRvY3VtZW50KCktPnBh
Z2UoKS0+c2V0dGluZ3MoKS0+Zml4ZWRQb3NpdGlvbkNyZWF0ZXNTdGFja2luZ0NvbnRleHQoKSkK
KyNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1dfU0NST0xMSU5HKQorICAgICAgICAvLyBU
b3VjaCBvdmVyZmxvdyBzY3JvbGxpbmcgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHQuCisgICAg
ICAgIHx8ICgoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURERU4gfHwgc3R5bGUtPm92ZXJmbG93
WSgpICE9IE9ISURERU4pICYmIHN0eWxlLT51c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKCkpCisj
ZW5kaWYKKyNpZiBFTkFCTEUoRElBTE9HX0VMRU1FTlQpCisgICAgICAgIHx8IChlICYmIGUtPmlz
SW5Ub3BMYXllcigpKQorI2VuZGlmCisgICAgICAgICkpCisgICAgICAgIHN0eWxlLT5zZXRaSW5k
ZXgoMCk7CisKKyAgICAvLyBUZXh0YXJlYSBjb25zaWRlcnMgb3ZlcmZsb3cgdmlzaWJsZSBhcyBh
dXRvLgorICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGV4dGFyZWFUYWcpKSB7CisgICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1goc3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFID8gT0FV
VE8gOiBzdHlsZS0+b3ZlcmZsb3dYKCkpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKHN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WSgp
KTsKKyAgICB9CisKKyAgICBpZiAoZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihzdHlsZSwg
ZSkpCisgICAgICAgIHN0eWxlLT5zZXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4
dERlY29yYXRpb24oKSk7CisgICAgZWxzZQorICAgICAgICBzdHlsZS0+YWRkVG9UZXh0RGVjb3Jh
dGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29yYXRpb24oKSk7CisKKyAgICAvLyBJZiBlaXRo
ZXIgb3ZlcmZsb3cgdmFsdWUgaXMgbm90IHZpc2libGUsIGNoYW5nZSB0byBhdXRvLgorICAgIGlm
IChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9
IE9NQVJRVUVFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9NQVJRVUVFKTsKKyAgICBl
bHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93
WCgpICE9IE9NQVJRVUVFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9NQVJRVUVFKTsK
KyAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92
ZXJmbG93WSgpICE9IE9WSVNJQkxFKSB7CisgICAgICAgIC8vIEZJWE1FOiBPbmNlIHdlIGltcGxl
bWVudCBwYWdpbmF0aW9uIGNvbnRyb2xzLCBvdmVyZmxvdy14IHNob3VsZCBkZWZhdWx0IHRvIGhp
ZGRlbgorICAgICAgICAvLyBpZiBvdmVyZmxvdy15IGlzIHNldCB0byAtd2Via2l0LXBhZ2VkLXgg
b3IgLXdlYmtpdC1wYWdlLXkuIEZvciBub3csIHdlJ2xsIGxldCBpdAorICAgICAgICAvLyBkZWZh
dWx0IHRvIGF1dG8gc28gd2UgY2FuIGF0IGxlYXN0IHNjcm9sbCB0aHJvdWdoIHRoZSBwYWdlcy4K
KyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPQVVUTyk7CisgICAgfSBlbHNlIGlmIChzdHls
ZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJ
QkxFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9BVVRPKTsKKworICAgIC8vIENhbGwg
c2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoKSBpZiBhIHBhZ2luYXRpb24gbW9kZSBpcyBzZXQg
Zm9yIGFueSBub24tcm9vdCBlbGVtZW50cy4gSWYgdGhlc2UKKyAgICAvLyBzdHlsZXMgYXJlIHNw
ZWNpZmllZCBvbiBhIHJvb3QgZWxlbWVudCwgdGhlbiB0aGV5IHdpbGwgYmUgaW5jb3Jwb3JhdGVk
IGluCisgICAgLy8gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVudCgpLgorICAgIGlmICgo
c3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFggfHwgc3R5bGUtPm92ZXJmbG93WSgpID09IE9Q
QUdFRFkpICYmICEoZSAmJiAoZS0+aGFzVGFnTmFtZShodG1sVGFnKSB8fCBlLT5oYXNUYWdOYW1l
KGJvZHlUYWcpKSkpCisgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFdlYkNvcmU6
OnBhZ2luYXRpb25Nb2RlRm9yUmVuZGVyU3R5bGUoc3R5bGUpLCBzdHlsZSk7CisKKyAgICAvLyBU
YWJsZSByb3dzLCBzZWN0aW9ucyBhbmQgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIHN1cHBvcnQgb3Zl
cmZsb3c6aGlkZGVuIGFuZCB3aWxsIGlnbm9yZSBzY3JvbGwvYXV0by4KKyAgICAvLyBGSVhNRTog
RXZlbnR1YWxseSB0YWJsZSBzZWN0aW9ucyB3aWxsIHN1cHBvcnQgYXV0byBhbmQgc2Nyb2xsLgor
ICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0g
SU5MSU5FX1RBQkxFCisgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dS
T1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKSB7CisgICAgICAgIGlmIChzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURE
RU4pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkg
IT0gT0hJRERFTikKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwor
ICAgIH0KKworICAgIC8vIE1lbnVsaXN0cyBzaG91bGQgaGF2ZSB2aXNpYmxlIG92ZXJmbG93Cisg
ICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KSB7CisgICAgICAgIHN0
eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZ
KE9WSVNJQkxFKTsKKyAgICB9CisKKyAgICAvLyBDdWxsIG91dCBhbnkgdXNlbGVzcyBsYXllcnMg
YW5kIGFsc28gcmVwZWF0IHBhdHRlcm5zIGludG8gYWRkaXRpb25hbCBsYXllcnMuCisgICAgc3R5
bGUtPmFkanVzdEJhY2tncm91bmRMYXllcnMoKTsKKyAgICBzdHlsZS0+YWRqdXN0TWFza0xheWVy
cygpOworCisgICAgLy8gRG8gdGhlIHNhbWUgZm9yIGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25z
LgorICAgIHN0eWxlLT5hZGp1c3RBbmltYXRpb25zKCk7CisgICAgc3R5bGUtPmFkanVzdFRyYW5z
aXRpb25zKCk7CisKKyAgICAvLyBJbXBvcnRhbnQ6IEludHJpbnNpYyBtYXJnaW5zIGdldCBhZGRl
ZCB0byBjb250cm9scyBiZWZvcmUgdGhlIHRoZW1lIGhhcyBhZGp1c3RlZCB0aGUgc3R5bGUsIHNp
bmNlIHRoZSB0aGVtZSB3aWxsCisgICAgLy8gYWx0ZXIgZm9udHMgYW5kIGhlaWdodHMvd2lkdGhz
LgorICAgIGlmIChlICYmIGUtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCkgJiYgc3R5bGUtPmZvbnRT
aXplKCkgPj0gMTEpIHsKKyAgICAgICAgLy8gRG9uJ3QgYXBwbHkgaW50cmluc2ljIG1hcmdpbnMg
dG8gaW1hZ2UgYnV0dG9ucy4gVGhlIGRlc2lnbmVyIGtub3dzIGhvdyBiaWcgdGhlIGltYWdlcyBh
cmUsCisgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gdHJlYXQgYWxsIGltYWdlIGJ1dHRvbnMgYXMg
dGhvdWdoIHRoZXkgd2VyZSBleHBsaWNpdGx5IHNpemVkLgorICAgICAgICBpZiAoIWUtPmhhc1Rh
Z05hbWUoaW5wdXRUYWcpIHx8ICFzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZSktPmlz
SW1hZ2VCdXR0b24oKSkKKyAgICAgICAgICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOwor
ICAgIH0KKworICAgIC8vIExldCB0aGUgdGhlbWUgYWxzbyBoYXZlIGEgY3JhY2sgYXQgYWRqdXN0
aW5nIHRoZSBzdHlsZS4KKyAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAgICAgICAg
UmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5hZGp1c3RTdHlsZSh0aGlzLCBzdHlsZSwgZSwg
bV9zdGF0ZS5oYXNVQUFwcGVhcmFuY2UoKSwgbV9zdGF0ZS5ib3JkZXJEYXRhKCksIG1fc3RhdGUu
YmFja2dyb3VuZERhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICAvLyBJ
ZiB3ZSBoYXZlIGZpcnN0LWxldHRlciBwc2V1ZG8gc3R5bGUsIGRvIG5vdCBzaGFyZSB0aGlzIHN0
eWxlLgorICAgIGlmIChzdHlsZS0+aGFzUHNldWRvU3R5bGUoRklSU1RfTEVUVEVSKSkKKyAgICAg
ICAgc3R5bGUtPnNldFVuaXF1ZSgpOworCisgICAgLy8gRklYTUU6IHdoZW4gZHJvcHBpbmcgdGhl
IC13ZWJraXQgcHJlZml4IG9uIHRyYW5zZm9ybS1zdHlsZSwgd2Ugc2hvdWxkIGFsc28gaGF2ZSBv
cGFjaXR5IDwgMSBjYXVzZSBmbGF0dGVuaW5nLgorICAgIGlmIChzdHlsZS0+cHJlc2VydmVzM0Qo
KSAmJiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFCisgICAgICAgIHx8IHN0eWxlLT5v
dmVyZmxvd1koKSAhPSBPVklTSUJMRQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkpKQor
ICAgICAgICBzdHlsZS0+c2V0VHJhbnNmb3JtU3R5bGUzRChUcmFuc2Zvcm1TdHlsZTNERmxhdCk7
CisKKyAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIGJlaGF2ZSBsaWtlIGJsb2Nrcy4gTWFwIHRoZWly
IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrIHdoZW4gbWFya2VkIGlubGluZS4KKyAgICBpZiAoZSAm
JiBlLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUg
JiYgc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQqPihlKS0+c2hvdWxkRGlzcGxheVNlYW1s
ZXNzbHkoKSkKKyAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKworI2lm
IEVOQUJMRShTVkcpCisgICAgaWYgKGUgJiYgZS0+aXNTVkdFbGVtZW50KCkpIHsKKyAgICAgICAg
Ly8gU3BlYzogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL21hc2tpbmcuaHRtbCNPdmVyZmxvd1By
b3BlcnR5CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1NDUk9MTCkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0hJRERFTik7CisgICAgICAgIGVsc2UgaWYgKHN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1koT1ZJU0lCTEUpOworCisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1NDUk9M
TCkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT0hJRERFTik7CisgICAgICAgIGVs
c2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4g
ZWxlbWVudCBpbiBhbiBTVkcgZG9jdW1lbnQgZnJhZ21lbnQgdHJlZSBob25vcnMgY3NzIHBvc2l0
aW9uCisgICAgICAgIGlmICghKGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZykgJiYgZS0+
cGFyZW50Tm9kZSgpICYmICFlLT5wYXJlbnROb2RlKCktPmlzU1ZHRWxlbWVudCgpKSkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihSZW5kZXJTdHlsZTo6aW5pdGlhbFBvc2l0aW9uKCkp
OworCisgICAgICAgIC8vIFJlbmRlclNWR1Jvb3QgaGFuZGxlcyB6b29taW5nIGZvciB0aGUgd2hv
bGUgU1ZHIHN1YnRyZWUsIHNvIGZvcmVpZ25PYmplY3QgY29udGVudCBzaG91bGQKKyAgICAgICAg
Ly8gbm90IGJlIHNjYWxlZCBhZ2Fpbi4KKyAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUoU1ZHTmFt
ZXM6OmZvcmVpZ25PYmplY3RUYWcpKQorICAgICAgICAgICAgc3R5bGUtPnNldEVmZmVjdGl2ZVpv
b20oUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkpOworICAgIH0KKyNlbmRpZgorfQorCitib29s
IFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU3R5bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCkK
K3sKKyAgICAvLyBGSVhNRSAoQlVHIDcyNDcyKTogV2UgZG9uJ3QgYWRkIEAtd2Via2l0LXJlZ2lv
biBydWxlcyBvZiBzY29wZWQgc3R5bGUgc2hlZXRzIGZvciB0aGUgbW9tZW50LAorICAgIC8vIHNv
IGFsbCByZWdpb24gcnVsZXMgYXJlIGdsb2JhbCBieSBkZWZhdWx0LiBWZXJpZnkgd2hldGhlciB0
aGF0IGNhbiBzdGFuZCBvciBuZWVkcyBjaGFuZ2luZy4KKworICAgIHVuc2lnbmVkIHJ1bGVzU2l6
ZSA9IG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0
cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7
CisgICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0
b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7CisgICAgICAgIGlmIChjaGVja1Jl
Z2lvblNlbGVjdG9yKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNB
bmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9ydWxlU2V0cy51c2VyU3R5bGUoKSkgewor
ICAgICAgICBydWxlc1NpemUgPSBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVj
dG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJ1bGVzU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy51c2VyU3R5
bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsK
KyAgICAgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMudXNlclN0eWxl
KCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVs
ZW1lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjaGVja0Zvck9yaWVudGF0aW9u
Q2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBGb250T3JpZW50YXRpb24gZm9udE9y
aWVudGF0aW9uOworICAgIE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsK
KyAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihzdHlsZSwgZm9udE9yaWVudGF0aW9uLCBn
bHlwaE9yaWVudGF0aW9uKTsKKworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2Ny
aXB0aW9uID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIGlmIChmb250RGVzY3JpcHRp
b24ub3JpZW50YXRpb24oKSA9PSBmb250T3JpZW50YXRpb24gJiYgZm9udERlc2NyaXB0aW9uLm5v
bkNKS0dseXBoT3JpZW50YXRpb24oKSA9PSBnbHlwaE9yaWVudGF0aW9uKQorICAgICAgICByZXR1
cm47CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24o
Z2x5cGhPcmllbnRhdGlvbik7CisgICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9u
KGZvbnRPcmllbnRhdGlvbik7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250
RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnVwZGF0ZUZvbnQoKQorewor
ICAgIGlmICghbV9zdGF0ZS5mb250RGlydHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY2hl
Y2tGb3JUZXh0U2l6ZUFkanVzdCgpOworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fc3RhdGUu
c3R5bGUoKTsKKyAgICBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2Uoc3R5bGUsIG1fc3RhdGUu
cGFyZW50U3R5bGUoKSk7CisgICAgY2hlY2tGb3Jab29tQ2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBh
cmVudFN0eWxlKCkpOworICAgIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2Uoc3R5bGUpOworICAg
IHN0eWxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKKyAgICBtX3N0YXRlLnNldEZv
bnREaXJ0eShmYWxzZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2
ZXI6OnN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIHVuc2lnbmVkIHJ1bGVzVG9JbmNs
dWRlKQoreworICAgIHJldHVybiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChlLCBOT1BTRVVE
TywgcnVsZXNUb0luY2x1ZGUpOworfQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJl
c29sdmVyOjpwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCBQc2V1ZG9JZCBw
c2V1ZG9JZCwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCit7CisgICAgaWYgKCFlIHx8ICFlLT5k
b2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOwor
CisgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRv
Y3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKworICAgIE1hdGNoUmVzdWx0IGR1bW15OworICAg
IGlmIChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVzKSB7CisgICAgICAgIC8vIEZp
cnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgICAgIG1h
dGNoVUFSdWxlcyhkdW1teSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQg
cnVsZXMuCisgICAgICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAg
ICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMp
OworICAgIH0KKworICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNU
b0luY2x1ZGUgJiBBdXRob3JDU1NSdWxlcykpIHsKKyAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3Jp
Z2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOworCisgICAg
ICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgorICAgICAgICBtYXRjaEF1
dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworCisgICAg
ICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOworICAgIH0KKworICAgIG1fc3Rh
dGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKworICAgIHJldHVy
biBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
OjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5v
ZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhh
dmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQoreworICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7CisKKyAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkp
IHsKKyAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55
IHBzZXVkbyBlbGVtZW50cy4KKyAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgp
LnBzZXVkb0lkICE9IE5PUFNFVURPKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBt
YXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KKyAg
ICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRv
IGNoZWNrIHRoZSBuYW1lc3BhY2UuCisgICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RT
ZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+
aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFy
dFNlbGVjdG9yKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRh
ZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURh
dGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1
bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAgICAgIGlmICghc2VsZWN0
b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tl
ckZhc3RQYXRoLm1hdGNoZXMoKTsKKyAgICB9CisKKyAgICAvLyBTbG93IHBhdGguCisgICAgU2Vs
ZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwor
ICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxl
RGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRl
ZE1hdGNoRW5hYmxlZCk7CisgICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgp
OworICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVkb0lkID0gc3Rh
dGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7CisgICAgY29udGV4dC5zY3JvbGxiYXIg
PSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXI7CisgICAgY29udGV4dC5zY3Jv
bGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKKyAg
ICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBT
ZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRl
eHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKKyAgICBp
ZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQg
IT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHlu
YW1pY1BzZXVkbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQor
Citib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0
b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQoreworICAgIGlmICgh
cmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0
ZS5tb2RlKCkpOworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3Rv
cjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkgeworICAgICAgICBTZWxlY3RvckNo
ZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMs
IHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwor
ICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAg
IGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9y
ZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorLy8gdGhpcyBpcyBtb3N0bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBhcHBseSBhIGNl
cnRhaW4gcnVsZSB0byB0aGUgcmVuZGVyc3R5bGUuLi4KKworTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6
OmNvbnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJl
bmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxp
ZXIpCit7CisgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZl
cnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBD
YWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2Vu
dGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVu
ZGVmaW5lZCk7Cit9CisKK0xlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9GbG9hdExlbmd0
aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwg
UmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCit7CisgICAgcmV0dXJu
IHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEZs
b2F0Q29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24g
fCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHls
ZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOworfQorCit0ZW1w
bGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3Bl
cnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRP
bmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAg
IEFTU0VSVCgocHJvcGVydHlXaGl0ZWxpc3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9u
KSB8fCBtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSk7CisgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nl
c3NSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworCisgICAgdW5zaWduZWQgcHJvcGVydHlD
b3VudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5Q291bnQoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6
OlByb3BlcnR5UmVmZXJlbmNlIGN1cnJlbnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUF0KGkpOwor
ICAgICAgICBpZiAoaXNJbXBvcnRhbnQgIT0gY3VycmVudC5pc0ltcG9ydGFudCgpKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIGlmIChpbmhlcml0ZWRPbmx5ICYmICFjdXJyZW50Lmlz
SW5oZXJpdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBl
eHBsaWNpdGx5IGluaGVyaXRlZCwgd2UgbmVlZCB0byBhcHBseSBmdXJ0aGVyIG5vbi1pbmhlcml0
ZWQgcHJvcGVydGllcworICAgICAgICAgICAgLy8gYXMgdGhleSBtaWdodCBvdmVycmlkZSB0aGUg
dmFsdWUgaW5oZXJpdGVkIGhlcmUuIEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBhbGxvdyBkZWNs
YXJhdGlvbnMgd2l0aAorICAgICAgICAgICAgLy8gZXhwbGljaXRseSBpbmhlcml0ZWQgcHJvcGVy
dGllcyB0byBiZSBjYWNoZWQuCisgICAgICAgICAgICBBU1NFUlQoIWN1cnJlbnQudmFsdWUoKS0+
aXNJbmhlcml0ZWRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9Cisg
ICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBjdXJyZW50LmlkKCk7CisKKyAgICAgICAg
aWYgKHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbiAmJiAh
U3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkocHJvcGVydHkpKQorICAg
ICAgICAgICAgY29udGludWU7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgICAgICBpZiAo
cHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0Q3VlICYmICFTdHlsZVJl
c29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAgICAgICBj
b250aW51ZTsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKHBhc3MpIHsKKyNpZiBFTkFCTEUoQ1NT
X1ZBUklBQkxFUykKKyAgICAgICAgY2FzZSBWYXJpYWJsZURlZmluaXRpb25zOgorICAgICAgICAg
ICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlWYXJpYWJsZSA8IGZpcnN0Q1NTUHJvcGVydHks
IENTU192YXJpYWJsZV9pc19iZWZvcmVfZmlyc3RfcHJvcGVydHkpOworICAgICAgICAgICAgaWYg
KHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAgYXBwbHlQ
cm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICBicmVh
azsKKyNlbmRpZgorICAgICAgICBjYXNlIEhpZ2hQcmlvcml0eVByb3BlcnRpZXM6CisgICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChmaXJzdENTU1Byb3BlcnR5ID09IENTU1Byb3BlcnR5Q29sb3Is
IENTU19jb2xvcl9pc19maXJzdF9wcm9wZXJ0eSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChDU1NQcm9wZXJ0eVpvb20gPT0gQ1NTUHJvcGVydHlDb2xvciArIDE4LCBDU1Nfem9vbV9pc19l
bmRfb2ZfZmlyc3RfcHJvcF9yYW5nZSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQgPT0gQ1NTUHJvcGVydHlab29tICsgMSwgQ1NTX2xpbmVfaGVpZ2h0
X2lzX2FmdGVyX3pvb20pOworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgICAgICAgICAg
aWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGdpdmUgc3BlY2lhbCBwcmlvcml0eSB0byBm
b250LXh4eCwgY29sb3IgcHJvcGVydGllcywgZXRjCisgICAgICAgICAgICBpZiAocHJvcGVydHkg
PCBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShj
dXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICAvLyB3ZSBhcHBseSBs
aW5lLWhlaWdodCBsYXRlcgorICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0gQ1NTUHJv
cGVydHlMaW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBM
b3dQcmlvcml0eVByb3BlcnRpZXM6CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPiBDU1NQcm9w
ZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50Lmlk
KCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjpkaWRQcm9jZXNzUnVsZShjb29raWUpOworfQorCit0ZW1wbGF0ZSA8U3R5
bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQs
IGJvb2wgaXNJbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5o
ZXJpdGVkT25seSkKK3sKKyAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAoc3RhdGUuc3R5bGUoKS0+
aW5zaWRlTGluaygpICE9IE5vdEluc2lkZUxpbmspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0
YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgeworICAgICAgICAgICAgY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXNbaV07CisgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gbWF0Y2hlZFBy
b3BlcnRpZXMubGlua01hdGNoVHlwZTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBi
ZSBuaWNlciB0byBwYXNzIHRoZXNlIGFzIGFyZ3VtZW50cyBidXQgdGhhdCByZXF1aXJlcyBjaGFu
Z2VzIGluIG1hbnkgcGxhY2VzLgorICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRv
UmVndWxhclN0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoTGluayk7
CisgICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGxp
bmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoVmlzaXRlZCk7CisKKyAgICAgICAg
ICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdl
dCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRP
bmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVz
LndoaXRlbGlzdFR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSk7CisgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZv
ciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKKyAgICAgICAgY29u
c3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXNbaV07CisgICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVk
UHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0s
IGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlz
dFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKKyAgICB9Cit9CisKK3Vu
c2lnbmVkIFN0eWxlUmVzb2x2ZXI6OmNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3Qg
TWF0Y2hlZFByb3BlcnRpZXMqIHByb3BlcnRpZXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgCisg
ICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6aGFzaE1lbW9yeShwcm9wZXJ0aWVzLCBzaXplb2YoTWF0
Y2hlZFByb3BlcnRpZXMpICogc2l6ZSk7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHls
ZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5n
ZXMmIGIpCit7CisgICAgcmV0dXJuIGEuZmlyc3RVQVJ1bGUgPT0gYi5maXJzdFVBUnVsZQorICAg
ICAgICAmJiBhLmxhc3RVQVJ1bGUgPT0gYi5sYXN0VUFSdWxlCisgICAgICAgICYmIGEuZmlyc3RB
dXRob3JSdWxlID09IGIuZmlyc3RBdXRob3JSdWxlCisgICAgICAgICYmIGEubGFzdEF1dGhvclJ1
bGUgPT0gYi5sYXN0QXV0aG9yUnVsZQorICAgICAgICAmJiBhLmZpcnN0VXNlclJ1bGUgPT0gYi5m
aXJzdFVzZXJSdWxlCisgICAgICAgICYmIGEubGFzdFVzZXJSdWxlID09IGIubGFzdFVzZXJSdWxl
OworfQorCitib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMm
IGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQoreworICAgIHJldHVybiAh
KGEgPT0gYik7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRj
aGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGIpCit7CisgICAgcmV0dXJuIGEucHJvcGVydGllcyA9PSBiLnByb3BlcnRpZXMgJiYgYS5saW5r
TWF0Y2hUeXBlID09IGIubGlua01hdGNoVHlwZTsKK30KKworYm9vbCBvcGVyYXRvciE9KGNvbnN0
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVy
OjpNYXRjaGVkUHJvcGVydGllcyYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOworfQorCitj
b25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogU3R5bGVSZXNv
bHZlcjo6ZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0
IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKK3sKKyAgICBBU1NFUlQoaGFzaCk7CisKKyAgICBN
YXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZS5maW5kKGhhc2gpOworICAgIGlmIChpdCA9PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUu
ZW5kKCkpCisgICAgICAgIHJldHVybiAwOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVt
JiBjYWNoZUl0ZW0gPSBpdC0+dmFsdWU7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBpZiAoc2l6ZSAhPSBjYWNoZUl0ZW0ubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXNbaV0gIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzW2ldKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjYWNoZUl0ZW0ucmFuZ2VzICE9IG1hdGNo
UmVzdWx0LnJhbmdlcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICZjYWNoZUl0ZW07
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNv
bnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1
bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCit7CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2Vl
blN3ZWVwcyA9IDEwMDsKKyAgICBpZiAoKyttX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlv
bnNTaW5jZUxhc3RTd2VlcCA+PSBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdl
ZW5Td2VlcHMKKyAgICAgICAgJiYgIW1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIu
aXNBY3RpdmUoKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xh
cmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMgPSA2MDsKKyAgICAgICAgbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lci5zdGFydE9uZVNob3QobWF0Y2hlZERlY2xhcmF0aW9uQ2Fj
aGVTd2VlcFRpbWVJblNlY29uZHMpOworICAgIH0KKworICAgIEFTU0VSVChoYXNoKTsKKyAgICBN
YXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSBjYWNoZUl0ZW07CisgICAgY2FjaGVJdGVtLm1hdGNo
ZWRQcm9wZXJ0aWVzLmFwcGVuZChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcyk7CisgICAg
Y2FjaGVJdGVtLnJhbmdlcyA9IG1hdGNoUmVzdWx0LnJhbmdlczsKKyAgICAvLyBOb3RlIHRoYXQg
d2UgZG9uJ3QgY2FjaGUgdGhlIG9yaWdpbmFsIFJlbmRlclN0eWxlIGluc3RhbmNlLiBJdCBtYXkg
YmUgZnVydGhlciBtb2RpZmllZC4KKyAgICAvLyBUaGUgUmVuZGVyU3R5bGUgaW4gdGhlIGNhY2hl
IGlzIHJlYWxseSBqdXN0IGEgaG9sZGVyIGZvciB0aGUgc3Vic3RydWN0dXJlcyBhbmQgbmV2ZXIg
dXNlZCBhcy1pcy4KKyAgICBjYWNoZUl0ZW0ucmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xv
bmUoc3R5bGUpOworICAgIGNhY2hlSXRlbS5wYXJlbnRSZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxl
OjpjbG9uZShwYXJlbnRTdHlsZSk7CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmFkZCho
YXNoLCBjYWNoZUl0ZW0pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmludmFsaWRhdGVNYXRj
aGVkUHJvcGVydGllc0NhY2hlKCkKK3sKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuY2xl
YXIoKTsKK30KKworc3RhdGljIGJvb2wgaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUoY29uc3QgRWxlbWVudCogZWxlbWVudCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25z
dCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgLy8gRklYTUU6IENTU1Byb3BlcnR5
V2Via2l0V3JpdGluZ01vZGUgbW9kaWZpZXMgc3RhdGUgd2hlbiBhcHBseWluZyB0byBkb2N1bWVu
dCBlbGVtZW50LiBXZSBjYW4ndCBza2lwIHRoZSBhcHBseWluZyBieSBjYWNoaW5nLgorICAgIGlm
IChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpICYmIGVs
ZW1lbnQtPmRvY3VtZW50KCktPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkgfHwgKHN0eWxlLT5z
dHlsZVR5cGUoKSAhPSBOT1BTRVVETyAmJiBwYXJlbnRTdHlsZS0+dW5pcXVlKCkpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnpvb20oKSAhPSBSZW5kZXJTdHlsZTo6aW5p
dGlhbFpvb20oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+d3JpdGlu
Z01vZGUoKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAvLyBUaGUgY2FjaGUgYXNzdW1lcyBzdGF0aWMga25vd2xlZGdlIGFi
b3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZC4KKyAgICBpZiAocGFyZW50U3R5bGUt
Pmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgRWxlbWVu
dCogZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKKyAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBtYXRjaFJlc3VsdC5pc0NhY2hlYWJs
ZSA/IGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2gobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuZGF0YSgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpIDogMDsK
KyAgICBib29sIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIGNvbnN0IE1hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVJdGVtKiBjYWNoZUl0ZW0gPSAwOworICAgIGlmIChjYWNoZUhhc2ggJiYg
KGNhY2hlSXRlbSA9IGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjYWNoZUhhc2gsIG1h
dGNoUmVzdWx0KSkpIHsKKyAgICAgICAgLy8gV2UgY2FuIGJ1aWxkIHVwIHRoZSBzdHlsZSBieSBj
b3B5aW5nIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tIGFuIGVhcmxpZXIgc3R5bGUgb2Jq
ZWN0IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGV4YWN0CisgICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0
aW9ucy4gV2UgdGhlbiBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVz
LCBpZiBhbnksIGFzIHRoZWlyIHZhbHVlcyBjYW4gZGVwZW5kIG9uIHRoZSAKKyAgICAgICAgLy8g
ZWxlbWVudCBjb250ZXh0LiBUaGlzIGlzIGZhc3QgYW5kIHNhdmVzIG1lbW9yeSBieSByZXVzaW5n
IHRoZSBzdHlsZSBkYXRhIHN0cnVjdHVyZXMuCisgICAgICAgIHN0YXRlLnN0eWxlKCktPmNvcHlO
b25Jbmhlcml0ZWRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworICAgICAgICBp
ZiAoc3RhdGUucGFyZW50U3R5bGUoKS0+aW5oZXJpdGVkRGF0YVNoYXJlZChjYWNoZUl0ZW0tPnBh
cmVudFJlbmRlclN0eWxlLmdldCgpKSAmJiAhaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpKSB7
CisgICAgICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdHVzID0gc3RhdGUuc3R5bGUoKS0+aW5z
aWRlTGluaygpOworICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGl0ZW0gcGFyZW50IHN0eWxl
IGhhcyBpZGVudGljYWwgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgcGFyZW50
IHN0eWxlIHRoZW4gdGhlCisgICAgICAgICAgICAvLyByZXN1bHRpbmcgc3R5bGUgd2lsbCBiZSBp
ZGVudGljYWwgdG9vLiBXZSBjb3B5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcyBvdmVyIGZyb20g
dGhlIGNhY2hlIGFuZCBhcmUgZG9uZS4KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVy
aXRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworCisgICAgICAgICAgICAvLyBV
bmZvcnR1bmF0ZWx5IHRoZSBsaW5rIHN0YXR1cyBpcyB0cmVhdGVkIGxpa2UgYW4gaW5oZXJpdGVk
IHByb3BlcnR5LiBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVzdG9yZSBpdC4KKyAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXR1cyk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gdHJ1ZTsgCisg
ICAgfQorCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgLy8gRmlyc3QgYXBwbHkgYWxs
IHZhcmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5IG1heSBiZSB1c2VkIGR1cmluZyBhcHBsaWNh
dGlvbiBvZiBsYXRlciBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFy
aWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUs
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5s
YXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9w
ZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxl
RGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RV
QVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkp
OworI2VuZGlmCisKKyAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgb2YgdGhlIG1hdGNoZWQgcnVsZXMg
aW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyLiBXYWxrIHRoZSBydWxlcyBhbmQgYXBwbHkKKyAgICAv
LyBoaWdoLXByaW9yaXR5IHByb3BlcnRpZXMgZmlyc3QsIGkuZS4sIHRob3NlIHByb3BlcnRpZXMg
dGhhdCBvdGhlciBwcm9wZXJ0aWVzIGRlcGVuZCBvbi4KKyAgICAvLyBUaGUgb3JkZXIgaXMgKDEp
IGhpZ2gtcHJpb3JpdHkgbm90IGltcG9ydGFudCwgKDIpIGhpZ2gtcHJpb3JpdHkgaW1wb3J0YW50
LCAoMykgbm9ybWFsIG5vdCBpbXBvcnRhbnQKKyAgICAvLyBhbmQgKDQpIG5vcm1hbCBpbXBvcnRh
bnQuCisgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBt
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9u
bHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4o
bWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAg
ICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVz
dWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQu
cmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFS
dWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworCisgICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0
ZW0tPnJlbmRlclN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0
aXZlWm9vbSgpKSB7CisgICAgICAgIHN0YXRlLnNldEZvbnREaXJ0eSh0cnVlKTsKKyAgICAgICAg
YXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgb3VyIGZvbnQg
Z290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQo
KTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lk
ZWQgb24gdGhlIGZvbnQtc2l6ZS4KKyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisg
ICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVp
Z2h0VmFsdWUoKSk7CisKKyAgICAvLyBNYW55IHByb3BlcnRpZXMgZGVwZW5kIG9uIHRoZSBmb250
LiBJZiBpdCBjaGFuZ2VzIHdlIGp1c3QgYXBwbHkgYWxsIHByb3BlcnRpZXMuCisgICAgaWYgKGNh
Y2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5mb250RGVzY3JpcHRpb24oKSAhPSBz
dGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKSkKKyAgICAgICAgYXBwbHlJbmhlcml0ZWRP
bmx5ID0gZmFsc2U7CisKKyAgICAvLyBOb3cgZG8gdGhlIG5vcm1hbCBwcmlvcml0eSBVQSBwcm9w
ZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgCisg
ICAgLy8gQ2FjaGUgb3VyIGJvcmRlciBhbmQgYmFja2dyb3VuZCBzbyB0aGF0IHdlIGNhbiBleGFt
aW5lIHRoZW0gbGF0ZXIuCisgICAgc3RhdGUuY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Cisg
ICAgCisgICAgLy8gTm93IGRvIHRoZSBhdXRob3IgYW5kIHVzZXIgbm9ybWFsIHByaW9yaXR5IHBy
b3BlcnRpZXMgYW5kIGFsbCB0aGUgIWltcG9ydGFudCBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2Us
IG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlICsgMSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0
LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBh
cHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3Jp
dHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0
VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5
KTsKKyAgIAorICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhp
cyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAgIAorICAgIEFTU0VSVCgh
c3RhdGUuZm9udERpcnR5KCkpOworICAgIAorICAgIGlmIChjYWNoZUl0ZW0gfHwgIWNhY2hlSGFz
aCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUoc3RhdGUuZWxlbWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHls
ZSgpKSkKKyAgICAgICAgcmV0dXJuOworICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0
KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVS
dWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQoreworICAgIHJldHVybiByMS0+
c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgp
OworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAgICAgcmV0
dXJuOworCisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOworICAg
IG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVz
KCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1hdGNoZWRQ
YWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzdGQ6OnN0YWJsZV9z
b3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29t
cGFyZVBhZ2VSdWxlcyk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBh
Z2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0
LCBtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOworfQorCitzdGF0aWMgYm9vbCBj
aGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBi
b29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUp
Cit7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNv
bXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKKyAgICAgICAg
aWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7CisgICAgICAgICAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5s
b2NhbE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9j
YWxOYW1lICE9IHBhZ2VOYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorCisgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21w
b25lbnQtPnBzZXVkb1R5cGUoKTsKKyAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVj
dG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1
ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKKyAg
ICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2Ug
JiYgIWlzRmlyc3RQYWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVk
UnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBh
Z2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0eWxl
UnVsZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKKworICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVj
dG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwg
cGFnZU5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgdGhlIHJ1
bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgorICAgICAgICBj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwor
ICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworICAg
IH0KK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNv
bnN0Cit7CisgICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKKyAgICBpZiAoIW1fc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAg
IGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7CisKKyAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0Zp
cnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjppc0Zp
cnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9m
IGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0
aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4gKCFwYWdlSW5kZXgpOworfQorCitTdHJpbmcgU3R5
bGVSZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKK3sKKyAgICAv
LyBGSVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCisgICAg
cmV0dXJuICIiOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxl
KENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQor
eworICAgIGluaXRFbGVtZW50KDApOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShk
b2N1bWVudCgpLCAwLCBzdHlsZSk7CisgICAgbV9zdGF0ZS5zZXRTdHlsZShzdHlsZSk7CisgICAg
YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKGlkLCB2YWx1ZSk7Cit9CisKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENT
U1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUpCisgICAgICAgIGFwcGx5UHJvcGVydHko
aWQsIHZhbHVlKTsKK30KKworaW5saW5lIGJvb2wgaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHko
Q1NTUHJvcGVydHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJUb3BDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29s
b3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRTdHJva2VDb2xvcjoKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGNhc2UgQ1NTUHJvcGVydHlGaWxs
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTdHJva2U6CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworfQorCisvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MzLXJlZ2lvbnMvI3RoZS1h
dC1yZWdpb24tc3R5bGUtcnVsZQorLy8gRklYTUU6IGFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZv
ciBvdGhlciByZWdpb24gc3R5bGluZyBwcm9wZXJ0aWVzLgoraW5saW5lIGJvb2wgU3R5bGVSZXNv
bHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sKKyAg
ICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1
bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lm
IEVOQUJMRShWSURFT19UUkFDSykKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRD
dWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkgewor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQXR0YWNobWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZEltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQ
b3NpdGlvblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlGb250RmFtaWx5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250
VmFyaWFudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKKyAgICBjYXNlIENTU1By
b3BlcnR5TGluZUhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAgICBjYXNl
IENTU1Byb3BlcnR5T3V0bGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRTaGFkb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworfQorI2VuZGlmCisvLyBTVkcgaGFuZGxlcyB6b29taW5nIGluIGEgZGlmZmVy
ZW50IHdheSBjb21wYXJlZCB0byBDU1MuIFRoZSB3aG9sZSBkb2N1bWVudCBpcyBzY2FsZWQgaW5z
dGVhZAorLy8gb2YgZWFjaCBpbmRpdmlkdWFsIGxlbmd0aCB2YWx1ZSBpbiB0aGUgcmVuZGVyIHN0
eWxlIC8gdHJlZS4gQ1NTUHJpbWl0aXZlVmFsdWU6OmNvbXB1dGVMZW5ndGgqKCkKKy8vIG11bHRp
cGxpZXMgZWFjaCByZXNvbHZlZCBsZW5ndGggd2l0aCB0aGUgem9vbSBtdWx0aXBsaWVyIC0gc28g
Zm9yIFNWRyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhhdC4KKy8vIFRob3VnaCBhbGwgQ1NTIHZhbHVl
cyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG91dGVybW9zdCA8c3ZnPiBlbGVtZW50cyAod2lkdGgv
aGVpZ2h0L2JvcmRlci9wYWRkaW5nLi4uKQorLy8gbmVlZCB0byByZXNwZWN0IHRoZSBzY2FsaW5n
LiBSZW5kZXJCb3ggKHRoZSBwYXJlbnQgY2xhc3Mgb2YgUmVuZGVyU1ZHUm9vdCkgZ3JhYnMgdmFs
dWVzIGxpa2UKKy8vIHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy8uLi4gZnJvbSB0aGUgUmVu
ZGVyU3R5bGUgLT4gZm9yIFNWRyB0aGVzZSB2YWx1ZXMgd291bGQgbmV2ZXIgc2NhbGUsCisvLyBp
ZiB3ZSdkIHBhc3MgYSAxLjAgem9vbSBmYWN0b3IgZXZlcnlod2VyZS4gU28gd2Ugb25seSBwYXNz
IGEgem9vbSBmYWN0b3Igb2YgMS4wIGZvciBzcGVjaWZpYworLy8gcHJvcGVydGllcyB0aGF0IGFy
ZSBOT1QgYWxsb3dlZCB0byBzY2FsZSB3aXRoaW4gYSB6b29tZWQgU1ZHIGRvY3VtZW50IChsZXR0
ZXIvd29yZC1zcGFjaW5nL2ZvbnQtc2l6ZSkuCitib29sIFN0eWxlUmVzb2x2ZXI6OnVzZVNWR1pv
b21SdWxlcygpCit7CisgICAgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpICYmIG1fc3RhdGUuZWxl
bWVudCgpLT5pc1NWR0VsZW1lbnQoKTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNr
QnJlYWR0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVz
b2x2ZXI6OlN0YXRlJiBzdGF0ZSwgTGVuZ3RoJiB3b3JraW5nTGVuZ3RoKQoreworICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1pbkNvbnRlbnQpIHsK
KyAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNaW5Db250ZW50KTsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09
IENTU1ZhbHVlV2Via2l0TWF4Q29udGVudCkgeworICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVu
Z3RoKE1heENvbnRlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3b3Jr
aW5nTGVuZ3RoID0gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJD
b252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJz
aW9uIHwgQXV0b0NvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5
bGUoKSwgc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICBpZiAod29ya2luZ0xl
bmd0aC5pc1VuZGVmaW5lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocHJp
bWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgIHdvcmtpbmdMZW5ndGguc2V0UXVpcmso
cHJpbWl0aXZlVmFsdWUtPmlzUXVpcmtWYWx1ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQor
CitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tNaW5NYXgoQ1NTUHJpbWl0aXZlVmFsdWUqIHBy
aW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIEdyaWRUcmFj
a1NpemUmIHRyYWNrU2l6ZSkKK3sKKyAgICBQYWlyKiBtaW5NYXhUcmFja0JyZWFkdGggPSBwcmlt
aXRpdmVWYWx1ZS0+Z2V0UGFpclZhbHVlKCk7CisgICAgaWYgKCFtaW5NYXhUcmFja0JyZWFkdGgp
IHsKKyAgICAgICAgTGVuZ3RoIHdvcmtpbmdMZW5ndGg7CisgICAgICAgIGlmICghY3JlYXRlR3Jp
ZFRyYWNrQnJlYWR0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUsIHdvcmtpbmdMZW5ndGgpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyYWNrU2l6ZS5zZXRMZW5ndGgod29y
a2luZ0xlbmd0aCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIExlbmd0aCBt
aW5UcmFja0JyZWFkdGg7CisgICAgTGVuZ3RoIG1heFRyYWNrQnJlYWR0aDsKKyAgICBpZiAoIWNy
ZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5maXJzdCgpLCBzdGF0ZSwg
bWluVHJhY2tCcmVhZHRoKSB8fCAhY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0Jy
ZWFkdGgtPnNlY29uZCgpLCBzdGF0ZSwgbWF4VHJhY2tCcmVhZHRoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgdHJhY2tTaXplLnNldE1pbk1heChtaW5UcmFja0JyZWFkdGgsIG1heFRy
YWNrQnJlYWR0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdy
aWRUcmFja0dyb3VwKENTU1ZhbHVlKiB2YWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUm
IHN0YXRlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMpCit7CisgICAgaWYgKCF2
YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChD
U1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkg
eworICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICBpZiAo
IWN1cnJWYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIEdyaWRUcmFja1NpemUgdHJhY2tTaXplOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRUcmFja01pbk1heChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGN1cnJWYWx1
ZSksIHN0YXRlLCB0cmFja1NpemUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIHRyYWNrU2l6ZXMuYXBwZW5kKHRyYWNrU2l6ZSk7CisgICAgfQorICAgIHJldHVybiB0cnVl
OworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tMaXN0KENTU1ZhbHVlKiB2YWx1ZSwg
VmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzLCBjb25zdCBTdHlsZVJlc29sdmVyOjpT
dGF0ZSYgc3RhdGUpCit7CisgICAgLy8gSGFuZGxlICdub25lJy4KKyAgICBpZiAodmFsdWUtPmlz
UHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZl
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
cmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZTsKKyAgICB9
CisKKyAgICByZXR1cm4gY3JlYXRlR3JpZFRyYWNrR3JvdXAodmFsdWUsIHN0YXRlLCB0cmFja1Np
emVzKTsKK30KKworCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkUG9zaXRpb24oQ1NTVmFsdWUqIHZh
bHVlLCBHcmlkUG9zaXRpb24mIHBvc2l0aW9uKQoreworICAgIC8vIEZvciBub3csIHdlIG9ubHkg
YWNjZXB0OiA8aW50ZWdlcj4gfCAnYXV0bycKKyAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwor
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04o
cHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpOworICAgIHBvc2l0aW9uLnNldEludGVnZXJQb3Np
dGlvbihwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKK3N0YXRpYyBib29sIGhhc1ZhcmlhYmxlUmVm
ZXJlbmNlKENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFs
dWUoKSkgeworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHByaW1p
dGl2ZVZhbHVlLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOworICAgIH0KKworICAgIGlmICh2YWx1
ZS0+aXNDYWxjdWxhdGlvblZhbHVlKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1ND
YWxjVmFsdWUqPih2YWx1ZSktPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7CisKKyAgICBpZiAodmFs
dWUtPmlzUmVmbGVjdFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7CisgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBkaXJlY3Rpb24gPSByZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpOwor
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogb2Zmc2V0ID0gcmVmbGVjdFZhbHVlLT5vZmZzZXQo
KTsKKyAgICAgICAgQ1NTVmFsdWUqIG1hc2sgPSByZWZsZWN0VmFsdWUtPm1hc2soKTsKKyAgICAg
ICAgcmV0dXJuIChkaXJlY3Rpb24gJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UoZGlyZWN0aW9uKSkg
fHwgKG9mZnNldCAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShvZmZzZXQpKSB8fCAobWFzayAmJiBo
YXNWYXJpYWJsZVJlZmVyZW5jZShtYXNrKSk7CisgICAgfQorCisgICAgZm9yIChDU1NWYWx1ZUxp
c3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAg
ICBpZiAoaGFzVmFyaWFibGVSZWZlcmVuY2UoaS52YWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTdHlsZVJlc29s
dmVyOjpyZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwg
VmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lv
bnMpCit7CisgICAgc3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gZXhwcmVzc2lvbihp
ZCwgdmFsdWUtPnNlcmlhbGl6ZVJlc29sdmluZ1ZhcmlhYmxlcygqbV9zdGF0ZS5zdHlsZSgpLT52
YXJpYWJsZXMoKSkpOworCisgICAgaWYgKGtub3duRXhwcmVzc2lvbnMuY29udGFpbnMoZXhwcmVz
c2lvbikpCisgICAgICAgIHJldHVybjsgLy8gY3ljbGUgZGV0ZWN0ZWQuCisKKyAgICBrbm93bkV4
cHJlc3Npb25zLmFwcGVuZChleHByZXNzaW9uKTsKKworICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBi
ZSBmYXN0ZXIgbm90IHRvIHJlLXBhcnNlIGZyb20gc3RyaW5ncywgYnV0IGZvciBub3cgQ1NTIHBy
b3BlcnR5IHZhbGlkYXRpb24gbGl2ZXMgaW5zaWRlIHRoZSBwYXJzZXIgc28gd2UgZG8gaXQgdGhl
cmUuCisgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHJlc3VsdFNldCA9IFN0eWxlUHJvcGVy
dHlTZXQ6OmNyZWF0ZSgpOworICAgIGlmICghQ1NTUGFyc2VyOjpwYXJzZVZhbHVlKHJlc3VsdFNl
dC5nZXQoKSwgaWQsIGV4cHJlc3Npb24uc2Vjb25kLCBmYWxzZSwgZG9jdW1lbnQoKSkpCisgICAg
ICAgIHJldHVybjsgLy8gZXhwcmVzc2lvbiBmYWlsZWQgdG8gcGFyc2UuCisKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcmVzdWx0U2V0LT5wcm9wZXJ0eUNvdW50KCk7IGkrKykgeworICAg
ICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVyZW5jZSBwcm9wZXJ0eSA9IHJlc3Vs
dFNldC0+cHJvcGVydHlBdChpKTsKKyAgICAgICAgaWYgKHByb3BlcnR5LmlkKCkgIT0gQ1NTUHJv
cGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShwcm9wZXJ0eS52YWx1ZSgpKSkK
KyAgICAgICAgICAgIHJlc29sdmVWYXJpYWJsZXMocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFs
dWUoKSwga25vd25FeHByZXNzaW9ucyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFwcGx5
UHJvcGVydHkocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSk7CisgICAgfQorfQorI2Vu
ZGlmCisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlk
LCBDU1NWYWx1ZSogdmFsdWUpCit7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgaWYg
KGlkICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UodmFsdWUp
KSB7CisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+IGtu
b3duRXhwcmVzc2lvbnM7CisgICAgICAgIHJlc29sdmVWYXJpYWJsZXMoaWQsIHZhbHVlLCBrbm93
bkV4cHJlc3Npb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLy8g
Q1NTIHZhcmlhYmxlcyBkb24ndCByZXNvbHZlIHNob3J0aGFuZHMgYXQgcGFyc2luZyB0aW1lLCBz
byB0aGlzIHNob3VsZCBiZSAqYWZ0ZXIqIGhhbmRsaW5nIHZhcmlhYmxlcy4KKyAgICBBU1NFUlRf
V0lUSF9NRVNTQUdFKCFpc0V4cGFuZGVkU2hvcnRoYW5kKGlkKSwgIlNob3J0aGFuZCBwcm9wZXJ0
eSBpZCA9ICVkIHdhc24ndCBleHBhbmRlZCBhdCBwYXJzaW5nIHRpbWUiLCBpZCk7CisKKyAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGJvb2wgaXNJbmhlcml0ID0gc3RhdGUucGFyZW50
Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCk7CisgICAgYm9vbCBpc0luaXRpYWwg
PSB2YWx1ZS0+aXNJbml0aWFsVmFsdWUoKSB8fCAoIXN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1
ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsKKworICAgIEFTU0VSVCghaXNJbmhlcml0IHx8ICFpc0lu
aXRpYWwpOyAvLyBpc0luaGVyaXQgLT4gIWlzSW5pdGlhbCAmJiBpc0luaXRpYWwgLT4gIWlzSW5o
ZXJpdAorICAgIEFTU0VSVCghaXNJbmhlcml0IHx8IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3Rh
dGUucGFyZW50U3R5bGUoKSkpOyAvLyBpc0luaGVyaXQgLT4gKHN0YXRlLnBhcmVudE5vZGUoKSAm
JiBzdGF0ZS5wYXJlbnRTdHlsZSgpKQorCisgICAgaWYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGUoKSAmJiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUo
KSB8fCAhaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoaWQpKSkgeworICAgICAgICAvLyBMaW1p
dCB0aGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG9ubHkgdGhlIG9uZXMgaG9u
b3JlZCBieSA6dmlzaXRlZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0lu
aGVyaXQgJiYgIXN0YXRlLnBhcmVudFN0eWxlKCktPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9w
ZXJ0aWVzKCkgJiYgIUNTU1Byb3BlcnR5Ojppc0luaGVyaXRlZFByb3BlcnR5KGlkKSkKKyAgICAg
ICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0SGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRp
ZXMoKTsKKworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGlmIChpZCA9PSBDU1NQcm9w
ZXJ0eVZhcmlhYmxlKSB7CisgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9O
KHZhbHVlLT5pc1ZhcmlhYmxlVmFsdWUoKSk7CisgICAgICAgIENTU1ZhcmlhYmxlVmFsdWUqIHZh
cmlhYmxlID0gc3RhdGljX2Nhc3Q8Q1NTVmFyaWFibGVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
QVNTRVJUKCF2YXJpYWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCghdmFy
aWFibGUtPnZhbHVlKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VmFy
aWFibGUodmFyaWFibGUtPm5hbWUoKSwgdmFyaWFibGUtPnZhbHVlKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBDaGVjayBsb29rdXAgdGFibGUgZm9yIGltcGxl
bWVudGF0aW9ucyBhbmQgdXNlIHdoZW4gYXZhaWxhYmxlLgorICAgIGNvbnN0IFByb3BlcnR5SGFu
ZGxlciYgaGFuZGxlciA9IG1fc3R5bGVCdWlsZGVyLnByb3BlcnR5SGFuZGxlcihpZCk7CisgICAg
aWYgKGhhbmRsZXIuaXNWYWxpZCgpKSB7CisgICAgICAgIGlmIChpc0luaGVyaXQpCisgICAgICAg
ICAgICBoYW5kbGVyLmFwcGx5SW5oZXJpdFZhbHVlKGlkLCB0aGlzKTsKKyAgICAgICAgZWxzZSBp
ZiAoaXNJbml0aWFsKQorICAgICAgICAgICAgaGFuZGxlci5hcHBseUluaXRpYWxWYWx1ZShpZCwg
dGhpcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlWYWx1ZShpZCwg
dGhpcywgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSA/IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpIDogMDsKKworICAgIGZsb2F0IHpvb21G
YWN0b3IgPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisKKyAgICAvLyBXaGF0IGZv
bGxvd3MgaXMgYSBsaXN0IHRoYXQgbWFwcyB0aGUgQ1NTIHByb3BlcnRpZXMgaW50byB0aGVpciBj
b3JyZXNwb25kaW5nIGZyb250LWVuZAorICAgIC8vIFJlbmRlclN0eWxlIHZhbHVlcy4KKyAgICBz
d2l0Y2ggKGlkKSB7CisgICAgLy8gbGlzdHMKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoK
KyAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQorICAgICAg
ICB7CisgICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0
byBpbmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlzCisgICAgICAgICAgICAv
LyBub3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBi
ZSBzdXBwb3J0ZWQuCisKKyAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBib29sIGRpZFNldCA9
IGZhbHNlOworICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBp
dGVtID0gaS52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJh
dG9yVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZh
bHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50
KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVl
Kj4oaXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0
KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGlj
X2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAg
ICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7CisgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJv
bVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+
KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyNl
bmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0lt
YWdlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250
ZW50KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19j
YXN0PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAg
IGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KGl0ZW0pOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmco
KSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRl
bnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7CisgICAgICAgICAgICAg
ICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50
VmFsdWUtPmlzQXR0cigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBu
YW1lc3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/CisgICAgICAgICAgICAgICAg
ICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgp
LT5zZXRVbmlxdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51
bGxBdG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7
CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5l
bGVtZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmlt
cGwoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZh
bHVlIGFmZmVjdHMgdGhlIHN0eWxlCisgICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVh
dHVyZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRD
b3VudGVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0
eWxlVHlwZSA9IE5vbmVMaXN0U3R5bGU7CisgICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5
bGVJZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlz
dFN0eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOworICAgICAgICAgICAgICAgICAgICBPd25QdHI8
Q291bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291
bnRlclZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2Vw
YXJhdG9yKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVu
dChjb3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBz
d2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlT3BlblF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7
CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5R
dW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
Tk9fT1BFTl9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAg
ICAgICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KKyAgICAgICAg
ICAgICAgICAgICAgICAgIHsgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkaWRTZXQpCisgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgorICAgICAgICBpZiAoaXNJ
bmhlcml0KSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFy
ZW50U3R5bGUoKS0+cXVvdGVzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1
b3RlcygwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFs
dWUtPmlzVmFsdWVMaXN0KCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0
YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKKyAgICAgICAgICAgIFJlZlB0cjxRdW90
ZXNEYXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikgeworICAgICAgICAgICAg
ICAgIENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Cisg
ICAgICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNv
IHRoaXMgaXMgc2FmZS4KKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+
aXRlbShpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQpCisgICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIEFT
U0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgp
KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAg
IFN0cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25k
KS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3Rk
OjptYWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICAg
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKKyAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkp
OworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZh
bWlseTogeworICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlkcworICAgICAgICBpZiAo
aXNJbmhlcml0KSB7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2Ny
aXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAg
ICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9u
dERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0Zh
bWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFt
aWx5KCkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChw
YXJlbnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOworICAgICAgICAgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBGb250RGVz
Y3JpcHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3Jp
cHRpb24oKTsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFj
Y291bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKKyAgICAg
ICAgICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCisgICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0
aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUo
KSkKKyAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXpl
Rm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24u
a2V5d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOworICAgICAgICAg
ICAgaWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFt
aWx5KCkpOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5p
c1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGb250RGVzY3JpcHRp
b24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Cisg
ICAgICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFt
aWx5KCk7CisgICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAwOworCisgICAgICAgIC8v
IEJlZm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQg
cmVzZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgorICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhl
ZERlZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKKyAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpO
b0ZhbWlseSk7CisKKyAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0g
PSBpLnZhbHVlKCk7CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwor
ICAgICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7CisgICAgICAgICAgICBTZXR0aW5ncyogc2V0
dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICBpZiAoY29udGVudFZhbHVl
LT5pc1N0cmluZygpKQorICAgICAgICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0
cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncykgeworICAgICAgICAg
ICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBz
ZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKKyAgICAgICAgICAgICAgICAg
ICAgZmFjZSA9IHNlcmlmRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNT
ZXJpZjoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKKyAgICAg
ICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2Ny
aXB0aW9uOjpTYW5zU2VyaWZGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKKyAgICAgICAgICAgICAgICAgICAg
ZmFjZSA9IGN1cnNpdmVGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50
YXN5OgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKKyAgICAgICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpGYW50YXN5RmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKKyAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IG1vbm9zcGFjZUZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Vi
a2l0UGljdG9ncmFwaDoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1p
bHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5
KEZvbnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKCFmYWNlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkg
eworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCisg
ICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKKyAgICAgICAg
ICAgICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGlu
aGVyaXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgY3VyckZh
bWlseSA9ICZmaXJzdEZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldElzU3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZv
bnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFy
ZWRGb250RmFtaWx5OjpjcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5z
ZXRGYW1pbHkoZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZh
bWlseShuZXdGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFt
aWx5LmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFs
bCBuZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgICAgLy8gSWYgY3VyckZh
bWlseSBpcyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMg
ZGVzY3JpcHRpb24uCisgICAgICAgIGlmIChjdXJyRmFtaWx5KSB7CisgICAgICAgICAgICBpZiAo
Zm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVk
RGVmYXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKKyAgICAgICAg
ICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChk
b2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUo
KSAtIDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOworCisgICAgICAgICAgICBz
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIC8vIFNob3J0aGFuZCBwcm9wZXJ0aWVzLgorICAgIGNhc2UgQ1NT
UHJvcGVydHlGb250OgorICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAgICBGb250
RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KHN0
YXRlLnBhcmVudFN0eWxlKCktPnNwZWNpZmllZExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICBz
dGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRp
b24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0luaXRpYWwpIHsKKyAg
ICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAg
ICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRp
b24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhh
dmUgc2V0dGluZ3MKKyAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7CisgICAg
ICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworICAg
ICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworCisgICAgICAgICAgICBGb250
RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgICAgICAgICAgUmVuZGVyVGhlbWU6OmRl
ZmF1bHRUaGVtZSgpLT5zeXN0ZW1Gb250KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpLCBmb250
RGVzY3JpcHRpb24pOworCisgICAgICAgICAgICAvLyBEb3VibGUtY2hlY2sgYW5kIHNlZSBpZiB0
aGUgdGhlbWUgZGlkIGFueXRoaW5nLiBJZiBub3QsIGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUg
Zm9udC4KKyAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSkg
eworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHBy
aW50ZXIgZm9udCBzZXR0aW5ncyBhcmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBTZXR0aW5n
cyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgQVNTRVJU
KHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1
bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwor
ICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0
aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0
aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdz
LT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKworICAgICAgICAgICAgICAgIC8v
IEhhbmRsZSB0aGUgem9vbSBmYWN0b3IuCisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVu
dCgpLCBzdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgZm9u
dERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKKyAgICAg
ICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+aXNGb250VmFsdWUoKSkgeworICAgICAg
ICAgICAgRm9udFZhbHVlKiBmb250ID0gc3RhdGljX2Nhc3Q8Rm9udFZhbHVlKj4odmFsdWUpOwor
ICAgICAgICAgICAgaWYgKCFmb250LT5zdHlsZSB8fCAhZm9udC0+dmFyaWFudCB8fCAhZm9udC0+
d2VpZ2h0CisgICAgICAgICAgICAgICAgfHwgIWZvbnQtPnNpemUgfHwgIWZvbnQtPmxpbmVIZWln
aHQgfHwgIWZvbnQtPmZhbWlseSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFN0eWxlLCBmb250LT5zdHlsZS5nZXQoKSk7
CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFZhcmlhbnQsIGZvbnQt
PnZhcmlhbnQuZ2V0KCkpOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZv
bnRXZWlnaHQsIGZvbnQtPndlaWdodC5nZXQoKSk7CisgICAgICAgICAgICAvLyBUaGUgcHJldmlv
dXMgcHJvcGVydGllcyBjYW4gZGlydHkgb3VyIGZvbnQgYnV0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJl
YWQgdGhlIGZvbnQncworICAgICAgICAgICAgLy8gcHJvcGVydGllcyBiYWNrLCB3aGljaCBpcyBz
YWZlLiBIb3dldmVyIGlmIGZvbnQtc2l6ZSBpcyB1c2luZyB0aGUgJ2V4JyB1bml0LCBpdCB3aWxs
CisgICAgICAgICAgICAvLyBuZWVkIHF1ZXJ5IHRoZSBkaXJ0aWVkIGZvbnQncyB4LWhlaWdodCB0
byBnZXQgdGhlIGNvbXB1dGVkIHNpemUuIFRvIGJlIHNhZmUgaW4gdGhpcworICAgICAgICAgICAg
Ly8gY2FzZSwgbGV0J3MganVzdCB1cGRhdGUgdGhlIGZvbnQgbm93LgorICAgICAgICAgICAgdXBk
YXRlRm9udCgpOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTaXpl
LCBmb250LT5zaXplLmdldCgpKTsKKworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKGZvbnQtPmxpbmVIZWlnaHQuZ2V0KCkpOworCisgICAgICAgICAgICBhcHBseVByb3BlcnR5
KENTU1Byb3BlcnR5Rm9udEZhbWlseSwgZm9udC0+ZmFtaWx5LmdldCgpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXI6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclJpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5n
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyVG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJXaWR0aDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5TGlzdFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9u
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJC
ZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
RmxleDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEZsb3c6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRS
b3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkNvbGxhcHNlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJxdWVlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNr
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRF
bXBoYXNpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luOgorI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0V3JhcDoKKyNlbmRpZgorICAgICAgICBBU1NFUlQoaXNFeHBhbmRlZFNo
b3J0aGFuZChpZCkpOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJl
YWs7CisKKyAgICAvLyBDU1MzIFByb3BlcnRpZXMKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNo
YWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hTaGFkb3c6IHsKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAgICAgICAg
ICAgaWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAgICByZXR1
cm4gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0
U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+
dGV4dFNoYWRvdygpKSkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHls
ZSgpLT5zZXRCb3hTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkgPyBhZG9w
dFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkpKSA6
IG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luaXRpYWwgfHwgcHJpbWl0aXZl
VmFsdWUpIC8vIGluaXRpYWwgfCBub25lCisgICAgICAgICAgICByZXR1cm4gaWQgPT0gQ1NTUHJv
cGVydHlUZXh0U2hhZG93ID8gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhudWxscHRyKSA6
IHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhudWxscHRyKTsKKworICAgICAgICBpZiAoIXZh
bHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAo
Q1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAg
ICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFk
b3dWYWx1ZSo+KGN1cnJWYWx1ZSk7CisgICAgICAgICAgICBpbnQgeCA9IGl0ZW0tPngtPmNvbXB1
dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgaW50IHkgPSBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGlu
dD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsK
KyAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVM
ZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21G
YWN0b3IpIDogMDsKKyAgICAgICAgICAgIGludCBzcHJlYWQgPSBpdGVtLT5zcHJlYWQgPyBpdGVt
LT5zcHJlYWQtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxl
bWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIFNoYWRvd1N0eWxlIHNo
YWRvd1N0eWxlID0gaXRlbS0+c3R5bGUgJiYgaXRlbS0+c3R5bGUtPmdldElkZW50KCkgPT0gQ1NT
VmFsdWVJbnNldCA/IEluc2V0IDogTm9ybWFsOworICAgICAgICAgICAgQ29sb3IgY29sb3I7Cisg
ICAgICAgICAgICBpZiAoaXRlbS0+Y29sb3IpCisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7CisgICAgICAgICAgICBlbHNl
IGlmIChzdGF0ZS5zdHlsZSgpKQorICAgICAgICAgICAgICAgIGNvbG9yID0gc3RhdGUuc3R5bGUo
KS0+Y29sb3IoKTsKKworICAgICAgICAgICAgT3duUHRyPFNoYWRvd0RhdGE+IHNoYWRvd0RhdGEg
PSBhZG9wdFB0cihuZXcgU2hhZG93RGF0YShJbnRQb2ludCh4LCB5KSwgYmx1ciwgc3ByZWFkLCBz
aGFkb3dTdHlsZSwgaWQgPT0gQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csIGNvbG9yLmlzVmFs
aWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50KSk7CisgICAgICAgICAgICBpZiAoaWQg
PT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFRleHRTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0
byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc2hhZG93RGF0
YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5v
dCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZsZWN0OiB7CisgICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKGJveFJlZmxlY3QsIEJveFJlZmxlY3QpCisgICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChS
ZW5kZXJTdHlsZTo6aW5pdGlhbEJveFJlZmxlY3QoKSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOworICAgICAgICBSZWZQdHI8U3R5
bGVSZWZsZWN0aW9uPiByZWZsZWN0aW9uID0gU3R5bGVSZWZsZWN0aW9uOjpjcmVhdGUoKTsKKyAg
ICAgICAgcmVmbGVjdGlvbi0+c2V0RGlyZWN0aW9uKCpyZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigp
KTsKKyAgICAgICAgaWYgKHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCkpCisgICAgICAgICAgICByZWZs
ZWN0aW9uLT5zZXRPZmZzZXQocmVmbGVjdFZhbHVlLT5vZmZzZXQoKS0+Y29udmVydFRvTGVuZ3Ro
PEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRD
b252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21G
YWN0b3IpKTsKKyAgICAgICAgTmluZVBpZWNlSW1hZ2UgbWFzazsKKyAgICAgICAgbWFzay5zZXRN
YXNrRGVmYXVsdHMoKTsKKyAgICAgICAgbV9zdHlsZU1hcC5tYXBOaW5lUGllY2VJbWFnZShpZCwg
cmVmbGVjdFZhbHVlLT5tYXNrKCksIG1hc2spOworICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNr
KG1hc2spOworCisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QocmVmbGVjdGlv
bi5yZWxlYXNlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVy
dHlTcmM6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgorICAgICAgICByZXR1cm47
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVSYW5nZTogLy8gT25seSB1c2VkIGluIEBmb250
LWZhY2UgcnVsZXMuCisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFycXVlZVJlcGV0aXRpb246IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwo
bWFycXVlZUxvb3BDb3VudCwgTWFycXVlZUxvb3BDb3VudCkKKyAgICAgICAgaWYgKCFwcmltaXRp
dmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5maW5pdGUpCisgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KC0xKTsgLy8gLTEgbWVhbnMgcmVwZWF0IGZvcmV2ZXIu
CisgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKQorICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudChwcmltaXRpdmVWYWx1ZS0+Z2V0
SW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hcnF1ZWVTcGVlZDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElB
TChtYXJxdWVlU3BlZWQsIE1hcnF1ZWVTcGVlZCkKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1
ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGludCBpZGVudCA9IHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGlkZW50KSB7CisgICAg
ICAgICAgICBjYXNlIENTU1ZhbHVlU2xvdzoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRNYXJxdWVlU3BlZWQoNTAwKTsgLy8gNTAwIG1zZWMuCisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg4NSk7IC8vIDg1bXNlYy4gVGhlIFdpbklFIGRl
ZmF1bHQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVl
RmFzdDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoMTAp
OyAvLyAxMG1zZWMuIFN1cGVyIGZhc3QuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzVGltZSgpKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5j
b21wdXRlVGltZTxpbnQsIENTU1ByaW1pdGl2ZVZhbHVlOjpNaWxsaXNlY29uZHM+KCkpOworICAg
ICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgLy8gRm9yIHNjcm9sbGFt
b3VudCBzdXBwb3J0LgorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVk
KHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZUluY3JlbWVudDogeworICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlSW5jcmVtZW50LCBNYXJxdWVlSW5jcmVt
ZW50KQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIHN3
aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ1NT
VmFsdWVTbWFsbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5j
cmVtZW50KExlbmd0aCgxLCBGaXhlZCkpOyAvLyAxcHguCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDYsIEZpeGVkKSk7IC8vIDZweC4g
VGhlIFdpbklFIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlTGFyZ2U6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFy
cXVlZUluY3JlbWVudChMZW5ndGgoMzYsIEZpeGVkKSk7IC8vIDM2cHguCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBM
ZW5ndGggbWFycXVlZUxlbmd0aCA9IGNvbnZlcnRUb0ludExlbmd0aChwcmltaXRpdmVWYWx1ZSwg
c3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIGlm
ICghbWFycXVlZUxlbmd0aC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQobWFycXVlZUxlbmd0aCk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9jYWxlOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxvY2FsZSwgTG9jYWxlKTsKKyAg
ICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKKyAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShudWxsQXRvbSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShwcmltaXRpdmVWYWx1ZS0+Z2V0U3Ry
aW5nVmFsdWUoKSk7CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBz
dGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKHN0YXRlLnN0eWxl
KCktPmxvY2FsZSgpKSk7CisgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRp
b24pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0U2l6ZUFkanVzdDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0
U2l6ZUFkanVzdCwgVGV4dFNpemVBZGp1c3QpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUg
fHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICBzZXRUZXh0U2l6ZUFkanVzdChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZUF1dG8pOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmIEVOQUJMRShEQVNIQk9BUkRf
U1VQUE9SVCkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RGFzaGJvYXJkUmVnaW9uOgorICAg
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZGFzaGJvYXJkUmVnaW9ucywg
RGFzaGJvYXJkUmVnaW9ucykKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0g
Q1NTVmFsdWVOb25lKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRS
ZWdpb25zKFJlbmRlclN0eWxlOjpub25lRGFzaGJvYXJkUmVnaW9ucygpKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiogcmVnaW9uID0g
cHJpbWl0aXZlVmFsdWUtPmdldERhc2hib2FyZFJlZ2lvblZhbHVlKCk7CisgICAgICAgIGlmICgh
cmVnaW9uKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiog
Zmlyc3QgPSByZWdpb247CisgICAgICAgIHdoaWxlIChyZWdpb24pIHsKKyAgICAgICAgICAgIExl
bmd0aCB0b3AgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT50b3AoKSwgc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCByaWdodCA9
IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnJpZ2h0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggYm90dG9tID0gY29udmVy
dFRvSW50TGVuZ3RoKHJlZ2lvbi0+Ym90dG9tKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggbGVmdCA9IGNvbnZlcnRUb0ludExl
bmd0aChyZWdpb24tPmxlZnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpKTsKKworICAgICAgICAgICAgaWYgKHRvcC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAg
ICAgIHRvcCA9IExlbmd0aCgpOworICAgICAgICAgICAgaWYgKHJpZ2h0LmlzVW5kZWZpbmVkKCkp
CisgICAgICAgICAgICAgICAgcmlnaHQgPSBMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChib3R0
b20uaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBib3R0b20gPSBMZW5ndGgoKTsKKyAg
ICAgICAgICAgIGlmIChsZWZ0LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgbGVmdCA9
IExlbmd0aCgpOworCisgICAgICAgICAgICBpZiAocmVnaW9uLT5tX2lzQ2lyY2xlKQorICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2Fy
ZFJlZ2lvbjo6Q2lyY2xlLCByZWdpb24tPm1fbGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVm
dCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2UgOiB0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgaWYg
KHJlZ2lvbi0+bV9pc1JlY3RhbmdsZSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OlJlY3RhbmdsZSwgcmVnaW9u
LT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZh
bHNlIDogdHJ1ZSk7CisgICAgICAgICAgICByZWdpb24gPSByZWdpb24tPm1fbmV4dC5nZXQoKTsK
KyAgICAgICAgfQorCisgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJl
Z2lvbnModHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJM
RShEUkFHR0FCTEVfUkVHSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBSZWdpb246
IHsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSB8fCAhcHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERy
YWdnYWJsZVJlZ2lvbk1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVE
cmFnID8gRHJhZ2dhYmxlUmVnaW9uRHJhZyA6IERyYWdnYWJsZVJlZ2lvbk5vRHJhZyk7CisgICAg
ICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dFN0cm9rZVdpZHRoOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRT
dHJva2VXaWR0aCwgVGV4dFN0cm9rZVdpZHRoKQorICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Cisg
ICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVRoaW46CisgICAgICAgIGNhc2UgQ1NTVmFsdWVNZWRpdW06CisgICAgICAgIGNh
c2UgQ1NTVmFsdWVUaGljazogeworICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDEuMCAvIDQ4
OworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVl
TWVkaXVtKQorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAzOworICAgICAgICAgICAgZWxzZSBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUaGljaykKKyAgICAgICAg
ICAgICAgICByZXN1bHQgKj0gNTsKKyAgICAgICAgICAgIHdpZHRoID0gQ1NTUHJpbWl0aXZlVmFs
dWU6OmNyZWF0ZShyZXN1bHQsIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfRU1TKS0+Y29tcHV0ZUxl
bmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29t
RmFjdG9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6
CisgICAgICAgICAgICB3aWR0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VGV4dFN0cm9rZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHRyYW5zZm9ybSwgVHJhbnNmb3JtKTsKKyAgICAgICAgVHJhbnNmb3JtT3BlcmF0
aW9ucyBvcGVyYXRpb25zOworICAgICAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVl
LCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUcmFuc2Zvcm0ob3BlcmF0aW9ucyk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHBlcnNwZWN0aXZlLCBQZXJzcGVj
dGl2ZSkKKworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5v
bmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKDApOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVW
YWx1ZTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAg
ICAgcGVyc3BlY3RpdmVWYWx1ZSA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwor
ICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAg
ICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRyZWF0IHZhbHVlbGVzcyBudW1iZXJz
IGFzIHB4LgorICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVl
OjpjcmVhdGUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCksIENTU1ByaW1pdGl2ZVZh
bHVlOjpDU1NfUFgpLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBpZiAocGVyc3BlY3RpdmVWYWx1ZSA+PSAwLjBmKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVWYWx1ZSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I6IHsKKyAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwodGFwSGlnaGxpZ2h0Q29sb3IsIFRhcEhpZ2hsaWdodENvbG9y
KTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIENvbG9yIGNvbCA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKHByaW1pdGl2ZVZhbHVl
KTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGFwSGlnaGxpZ2h0Q29sb3IoY29sKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVS
RkxPV19TQ1JPTExJTkcpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE92ZXJmbG93U2Nyb2xs
aW5nOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHVzZVRvdWNoT3ZlcmZs
b3dTY3JvbGxpbmcsIFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcpOworICAgICAgICBpZiAoIXBy
aW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkg
PT0gQ1NTVmFsdWVUb3VjaCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBj
YXNlIENTU1Byb3BlcnR5SW52YWxpZDoKKyAgICAgICAgcmV0dXJuOworICAgIC8vIERpcmVjdGlv
bmFsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVkIGJ5IHJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3Bl
cnR5KCkgYmVmb3JlIHRoZSBzd2l0Y2guCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckVuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kV2lkdGg6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlclN0YXJ0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclN0YXJ0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0V2lk
dGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZUNvbG9yOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyQmVmb3JlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckFmdGVyQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyU3R5
bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkVuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFyZ2luU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXJnaW5Ub3BDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJD
b2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdFbmQ6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGlu
Z0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0FmdGVyOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExvZ2ljYWxIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbEhlaWdodDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0OgorICAgIHsKKyAgICAgICAgQ1NTUHJvcGVydHlJRCBu
ZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3Rh
dGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwor
ICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQpOworICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0
eShuZXdJZCwgdmFsdWUpOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5l
VGhyb3VnaDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRMaW5lVGhyb3VnaFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91
Z2hXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJs
aW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
VW5kZXJsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0VW5kZXJsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNpemVEZWx0YToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3Q6CisgICAgICAgIHJldHVybjsK
KworICAgIC8vIENTUyBUZXh0IExheW91dCBNb2R1bGUgTGV2ZWwgMzogVmVydGljYWwgd3JpdGlu
ZyBzdXBwb3J0CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdNb2RlOiB7CisgICAg
ICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHdyaXRpbmdNb2RlLCBXcml0aW5nTW9kZSk7
CisgICAgICAgIAorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBzZXRX
cml0aW5nTW9kZSgqcHJpbWl0aXZlVmFsdWUpOworCisgICAgICAgIC8vIEZJWE1FOiBJdCBpcyBu
b3Qgb2sgdG8gbW9kaWZ5IGRvY3VtZW50IHN0YXRlIHdoaWxlIGFwcGx5aW5nIHN0eWxlLgorICAg
ICAgICBpZiAoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgICAgIHN0YXRlLmRvY3VtZW50KCkt
PnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQodHJ1ZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dE9yaWVudGF0aW9uOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRPcmllbnRhdGlvbiwgVGV4
dE9yaWVudGF0aW9uKTsKKworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAg
ICBzZXRUZXh0T3JpZW50YXRpb24oKnByaW1pdGl2ZVZhbHVlKTsKKworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVCb3hDb250YWluOiB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxpbmVCb3hDb250YWluLCBMaW5lQm94
Q29udGFpbikKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TGluZUJveENvbnRhaW4oTGluZUJveENvbnRhaW5Ob25lKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzQ1NTTGluZUJveENvbnRhaW5W
YWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENTU0xpbmVCb3hDb250YWlu
VmFsdWUqIGxpbmVCb3hDb250YWluVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NMaW5lQm94Q29udGFp
blZhbHVlKj4odmFsdWUpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFp
bihsaW5lQm94Q29udGFpblZhbHVlLT52YWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIENTUyBGb250cyBNb2R1bGUgTGV2ZWwgMworICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRGb250RmVhdHVyZVNldHRpbmdzOiB7CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAm
JiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vcm1hbCkgeworICAgICAg
ICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigp
Lm1ha2VOb3JtYWxGZWF0dXJlU2V0dGluZ3MoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0
ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0
ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOworICAgICAgICBSZWZQdHI8Rm9u
dEZlYXR1cmVTZXR0aW5ncz4gc2V0dGluZ3MgPSBGb250RmVhdHVyZVNldHRpbmdzOjpjcmVhdGUo
KTsKKyAgICAgICAgaW50IGxlbiA9IGxpc3QtPmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGxpc3Qt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzRm9u
dEZlYXR1cmVWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
Rm9udEZlYXR1cmVWYWx1ZSogZmVhdHVyZSA9IHN0YXRpY19jYXN0PEZvbnRGZWF0dXJlVmFsdWUq
PihpdGVtKTsKKyAgICAgICAgICAgIHNldHRpbmdzLT5hcHBlbmQoRm9udEZlYXR1cmUoZmVhdHVy
ZS0+dGFnKCksIGZlYXR1cmUtPnZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0RmVhdHVyZVNldHRpbmdzKHNldHRpbmdzLnJlbGVhc2UoKSk7CisgICAgICAg
IHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRGaWx0ZXI6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZmlsdGVyLCBG
aWx0ZXIpOworICAgICAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgICAgIGlm
IChjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0RmlsdGVyKG9wZXJhdGlvbnMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW5zOiB7CisgICAgICAgIFZlY3RvcjxH
cmlkVHJhY2tTaXplPiB0cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xp
c3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZENvbHVtbnModHJhY2tTaXplcyk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3dzOiB7CisgICAg
ICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZFJvd3ModHJhY2tTaXplcyk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFN0
YXJ0OiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBzdGFydFBvc2l0aW9uOworICAgICAgICBpZiAo
IWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgc3RhcnRQb3NpdGlvbikpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtU3RhcnQoc3RhcnRQb3Np
dGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEdyaWRFbmQ6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIGVuZFBvc2l0aW9uOworICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUVuZChlbmRQb3NpdGlv
bik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
R3JpZEJlZm9yZTogeworICAgICAgICBHcmlkUG9zaXRpb24gYmVmb3JlUG9zaXRpb247CisgICAg
ICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3Jl
KGJlZm9yZVBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0
aW9uOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlv
bikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJ
dGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBh
cHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQgdmVyc2lvbi4KKyAgICBjYXNlIENT
U1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9u
RHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKKyAgICBj
YXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgorICAgICAgICByZXR1cm47
CisgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVp
bGRlciBsb29rdXAgdGFibGUuCisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2ht
ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1h
Z2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRQb3NpdGlvblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyQm90dG9tU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVySW1hZ2VPdXRzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlUmVwZWF0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJJbWFnZVNvdXJjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyUmlnaHRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmln
aHRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclRvcExlZnRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clRvcFJpZ2h0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJv
dHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5nOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlDYXB0aW9uU2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2xlYXI6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUNsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlDb3VudGVySW5jcmVtZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlF
bXB0eUNlbGxzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9hdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Rm9udFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFZhcmlhbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFU
SU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVudGF0aW9uOgorI2VuZGlmCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVyaW5nOgorI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVT
T0xVVElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZXNvbHV0aW9uOgorI2VuZGlmCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNp
bmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUxpc3RTdHlsZUltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVQb3NpdGlvbjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlVHlwZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
TWFyZ2luQm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5MZWZ0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXJnaW5SaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luVG9wOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5IZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU1pbldpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPcnBoYW5zOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVT
dHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPdmVyZmxvd1dyYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93WDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nQm90
dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nTGVmdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5UGFkZGluZ1JpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nVG9wOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJy
ZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtJbnNpZGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBvaW50ZXJFdmVudHM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBvc2l0aW9u
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlSZXNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVJpZ2h0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlTcGVhazoK
KyAgICBjYXNlIENTU1Byb3BlcnR5VGFiU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGFibGVM
YXlvdXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRBbGlnbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRJbmRlbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVyZmxvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFJl
bmRlcmluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFRyYW5zZm9ybToKKyAgICBjYXNlIENT
U1Byb3BlcnR5VG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlQmlkaToKKyNpZiBFTkFC
TEUoQ1NTX1ZBUklBQkxFUykKKyAgICBjYXNlIENTU1Byb3BlcnR5VmFyaWFibGU6CisjZW5kaWYK
KyAgICBjYXNlIENTU1Byb3BlcnR5VmVydGljYWxBbGlnbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGVsYXk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRpcmVjdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvbkZpbGxNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRp
b25JdGVyYXRpb25Db3VudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uTmFt
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uUGxheVN0YXRlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QXBwZWFyYW5jZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXNw
ZWN0UmF0aW86CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91
bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJGaXQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
VmVydGljYWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hBbGlnbjoKKyNp
ZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9OX0JSRUFLKQorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3hEZWNvcmF0aW9uQnJlYWs6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94RGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4R3JvdXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveExpbmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmRpbmFsR3Jv
dXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yaWVudDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm94UGFjazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sb3JDb3Jy
ZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5BeGlzOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRDb2x1bW5CcmVha0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1u
QnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5HYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblByb2dyZXNzaW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5S
dWxlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRDb2x1bW5TcGFuOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5X
aWR0aDoKKyNpZiBFTkFCTEUoQ1VSU09SX1ZJU0lCSUxJVFkpCisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEN1cnNvclZpc2liaWxpdHk6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QWxpZ25Db250ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnbkl0ZW1zOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnblNlbGY6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEZsZXhCYXNpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleERpcmVjdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEdyb3c6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZsZXhTaHJpbms6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhXcmFw
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRKdXN0aWZ5Q29udGVudDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0T3JkZXI6CisjaWYgRU5BQkxFKENTU19SRUdJT05TKQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRGbG93RnJvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxv
d0ludG86CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEtlcm5pbmc6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRTbW9vdGhpbmc6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZvbnRWYXJpYW50TGlnYXR1cmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRIaWdobGlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUNoYXJhY3Rl
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRBZnRlcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRCZWZvcmU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0TGluZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEh5cGhlbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVBbGlnbjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJyZWFrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRMaW5lQ2xhbXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVHcmlkOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lU25hcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFycXVlZURpcmVjdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2U6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZU91dHNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza0NsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza09yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza1Bvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9u
WToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdFg6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNr
U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TmJzcE1vZGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRQZXJzcGVjdGl2ZU9yaWdpblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0
aXZlT3JpZ2luWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UHJpbnRDb2xvckFkanVzdDoK
KyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lv
bkJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQmVmb3Jl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0luc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UmVnaW9uT3ZlcmZsb3c6CisjZW5kaWYKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UnRsT3JkZXJpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ1YnlQ
b3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dENvbWJpbmU6CisjaWYgRU5B
QkxFKENTUzNfVEVYVCkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25M
aW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvblN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0QWxpZ25MYXN0OgorI2VuZGlmIC8vIENTUzNfVEVY
VAorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1N0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U2VjdXJpdHk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3Jp
Z2luWjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1p
bmdGdW5jdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlckRyYWc6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2RpZnk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFVzZXJTZWxlY3Q6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENsaXBQYXRoOgorI2lmIEVO
QUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRTaGFwZVBhZGRpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBU
aHJvdWdoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRzaWRlOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdoaXRlU3BhY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V29yZFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Cisj
aWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5TWF4
Wm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3JpZW50YXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgorI2VuZGlmCisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCisgICAg
ICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKKyNlbmRpZgorICAgICAgICByZXR1cm47
CisgICAgfQorfQorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxl
SW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlm
ICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCisgICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdG
cm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwor
CisgICAgaWYgKHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgeworICAgICAgICBpZiAo
dmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9y
UGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+
KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpOworICAgICAg
ICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2Fz
dDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsKKyAgICB9CisKKyNpZiBFTkFCTEUo
Q1NTX0lNQUdFX1NFVCkKKyAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQorICAgICAg
ICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJ
bWFnZVNldFZhbHVlKj4odmFsdWUpKTsKKyNlbmRpZgorCisgICAgaWYgKHZhbHVlLT5pc0N1cnNv
ckltYWdlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShw
cm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisKKyAg
ICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpj
YWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VW
YWx1ZSogdmFsdWUpCit7CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNh
Y2hlZE9yUGVuZGluZ0ltYWdlKCk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJ
bWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJv
cGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCitQYXNzUmVm
UHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1
ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkK
K3sKKyAgICBpZiAodmFsdWUtPmlzUGVuZGluZygpKSB7CisgICAgICAgIG1fc3RhdGUucGVuZGlu
Z0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICByZXR1cm4g
U3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBTdHls
ZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFsdWUpOworfQorCisjaWYgRU5BQkxFKENTU19JTUFH
RV9TRVQpCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGlu
Z0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1
ZSkKK3sKKyAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5k
aW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRp
bmdJbWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQo
cHJvcGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorI2VuZGlm
CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5n
RnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZh
bHVlKQoreworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBl
bmRpbmdJbWFnZShkb2N1bWVudCgpKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGlu
Z0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChw
cm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JUZXh0U2l6ZUFkanVzdCgpCit7CisgICAgUmVuZGVyU3R5
bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOworCisgICAgaWYgKHN0eWxlLT50ZXh0U2l6ZUFk
anVzdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERl
c2NyaXB0aW9uKHN0eWxlLT5mb250RGVzY3JpcHRpb24oKSk7CisgICAgbmV3Rm9udERlc2NyaXB0
aW9uLnNldENvbXB1dGVkU2l6ZShuZXdGb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpKTsK
KyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHls
ZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZl
Wm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNj
cmlwdGlvbigpOworICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRG
b250KTsKKyAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxkRm9udC5zcGVj
aWZpZWRTaXplKCkpOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2Ny
aXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVyaWNGYW1pbHlD
aGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7Cisg
ICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0
aW9uKCk7CisKKyAgICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwgIXBhcmVudFN0
eWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVu
dEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgaWYgKGNoaWxkRm9u
dC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXpl
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZvciBub3csIGx1bXAgYWxsIGZhbWlsaWVz
IGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCisgICAgaWYgKGNoaWxkRm9udC5nZW5lcmljRmFtaWx5
KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKKyAgICAgICAgJiYgcGFyZW50
Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBpcyBtb25vc3Bh
Y2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAorICAgIC8vIHNpemUg
d2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUgYXMgYXBwcm9w
cmlhdGUuCisgICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSBy
ZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFuCisgICAgLy8gbXVsdGlwbHlpbmcgYnkg
b3VyIHNjYWxlIGZhY3Rvci4KKyAgICBmbG9hdCBzaXplOworICAgIGlmIChjaGlsZEZvbnQua2V5
d29yZFNpemUoKSkKKyAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgp
LCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEsIGNoaWxkRm9u
dC51c2VGaXhlZERlZmF1bHRTaXplKCkpOworICAgIGVsc2UgeworICAgICAgICBTZXR0aW5ncyog
c2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgIGZsb2F0IGZpeGVkU2NhbGVG
YWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYg
c2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQorICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxm
bG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1
bHRGb250U2l6ZSgpCisgICAgICAgICAgICA6IDE7CisgICAgICAgIHNpemUgPSBwYXJlbnRGb250
LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/CisgICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNp
ZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgorICAgICAgICAgICAgICAgIGNoaWxkRm9u
dC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOworICAgIH0KKworICAgIEZvbnRE
ZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKKyAgICBzZXRGb250U2l6
ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24obmV3Rm9udERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjppbml0aWFs
aXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykKK3sKKyAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRS
ZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICBmb250RGVz
Y3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0
dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOworICAgIGNvbnN0IEF0b21p
Y1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygpLT5zdGFuZGFy
ZEZvbnRGYW1pbHkoKTsKKyAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0VtcHR5KCkpIHsK
KyAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJk
Rm9udEZhbWlseSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVu
ZEZhbWlseSgwKTsKKyAgICB9CisgICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENT
U1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7CisgICAgc2V0Rm9udFNpemUoZm9u
dERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRp
dW0sIGZhbHNlKSk7CisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0
eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1
ZSgwKTsKKyAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKK30KKwordm9p
ZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlw
dGlvbiwgZmxvYXQgc2l6ZSkKK3sKKyAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6
ZShzaXplKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVk
U2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUoKSwgZm9udERl
c2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcygpKSk7Cit9
CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlzQWJzb2x1dGVT
aXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykKK3sKKyAgICBm
bG9hdCB6b29tRmFjdG9yID0gMS4wZjsKKyAgICBpZiAoIXVzZVNWR1pvb21SdWxlcykgeworICAg
ICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICAgICAgaWYgKEZy
YW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQorICAgICAgICAgICAgem9vbUZhY3RvciAq
PSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3R5bGVSZXNv
bHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0
b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKK30KKworZmxvYXQgU3R5bGVSZXNv
bHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50
LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRT
aXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUp
Cit7CisgICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90IGJlIHZpc2li
bGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQorICAgIC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0g
Zm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAor
ICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBvdGhlciBicm93
c2VycyB0aGF0IGhhdmUgbWluaW11bQorICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBG
aXJlZm94KS4KKyAgICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGlt
aXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQorICAgICAgICByZXR1cm4gMC4wZjsKKworICAgIC8vIFdl
IHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmlyc3QgaXMgYSBo
YXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bworICAgIC8vIGFsbCBmb250cy4gVGhpcyBpcyAi
bWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFy
dCBtaW5pbXVtIgorICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdl
IGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4sCisgICAgLy8g
d2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJlc3NlcyB0aGUg
Zm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgorICAgIC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBm
b250IHNldHRpbmcuCisKKyAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3
YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIGtlZXAgZm9u
dHMgcmVhZGFibGUuCisgICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8g
c2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAorICAgIC8vIHNpbmNl
IHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNw
b3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCisKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICByZXR1cm4g
MS4wZjsKKworICAgIGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOwor
ICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXpl
KCk7CisgICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29tRmFjdG9yOwor
CisgICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBhcHBseSB0aGUg
aGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNtYWxsLgorICAg
IGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKKyAgICAgICAgem9vbWVkU2l6ZSA9IG1pblNpemU7
CisKKyAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlz
IGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAorICAgIC8vIGFmdGVy
IHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVz
ZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQorICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFj
Y2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVt
IHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCisgICAgLy8gZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0
aGUgbGF5b3V0LgorICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAmJiB6b29tZWRT
aXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9naWNhbFNpemUg
fHwgIWlzQWJzb2x1dGVTaXplKSkKKyAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXpl
OworCisgICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0byBwcmV2ZW50
IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlvdXMKKyAgICAv
LyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCisgICAgcmV0dXJuIG1p
bihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKK30KKworY29uc3QgaW50IGZv
bnRTaXplVGFibGVNYXggPSAxNjsKK2NvbnN0IGludCBmb250U2l6ZVRhYmxlTWluID0gOTsKK2Nv
bnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKKworLy8gV2luSUUvTmF2NCB0YWJsZSBmb3IgZm9u
dCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBpbmcgc3lzdGVt
IG9mIEhUTUwuCitzdGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVbZm9udFNpemVU
YWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Cit7CisgICAg
ICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjggfSwK
KyAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAz
MSB9LAorICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIs
ICAgIDM0IH0sCisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAg
ICAyNCwgICAgMzcgfSwKKyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNiwgICAg
MjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQorICAgICAgeyA5
LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCisgICAg
ICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwgICAgNDUgfSwK
KyAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0
OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQorfTsKKy8vIEhUTUwgICAgICAg
MSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNworLy8gQ1NTICB4eHMg
ICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCisvLyAgICAgICAgICAgICAg
ICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCisKKy8vIFN0
cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0aW5ncyBleGFj
dGx5Lgorc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVN
YXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQoreworICAgICAgeyA5
LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3IH0sCisgICAg
ICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzAgfSwK
KyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAz
MyB9LAorICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQs
ICAgIDM2IH0sCisgICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYsICAgIDIwLCAg
ICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKKyAgICAgIHsgOSwgICAx
MCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAorICAgICAgeyA5
LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCisgICAg
ICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAv
LyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKK307CisvLyBIVE1MICAgICAgIDEgICAg
ICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKKy8vIENTUyAgeHhzICAgeHMg
ICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAorLy8gICAgICAgICAgICAgICAgICAg
ICAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgorCisvLyBGb3IgdmFs
dWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQgRmFocm5lcidz
IHN1Z2dlc3RlZCBzY2FsZQorLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZhbHVlLgorc3Rh
dGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9IHsgMC42MGYs
IDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9OworCitmbG9hdCBT
dHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQg
a2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQoreworICAgIFNldHRpbmdz
KiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3MpCisg
ICAgICAgIHJldHVybiAxLjBmOworCisgICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmlu
UXVpcmtzTW9kZSgpOworICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0
U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1
bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYg
bWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7CisgICAgICAgIC8vIExvb2sgdXAgdGhl
IGVudHJ5IGluIHRoZSB0YWJsZS4KKyAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250
U2l6ZVRhYmxlTWluOworICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NWYWx1ZVh4U21h
bGwpOworICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93
XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07CisgICAgfQorCisgICAgLy8g
VmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0aGUgc2NhbGUg
ZmFjdG9yIGluc3RlYWQuCisgICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgoc2V0dGluZ3Mt
Pm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7CisgICAgcmV0dXJuIG1heChmb250U2l6ZUZh
Y3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWluTG9naWNhbFNp
emUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGludCBmaW5kTmVhcmVzdExl
Z2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwgaW50IG11bHRp
cGxpZXIpCit7CisgICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21hbGwgZG9lcyBu
b3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KKyAgICBmb3IgKGludCBpID0g
MTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKHBpeGVsRm9udFNp
emUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIpCisgICAgICAg
ICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsS2V5d29yZHMgLSAxOworfQor
CitpbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBp
bnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQoreworICAg
IFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0
dGluZ3MpCisgICAgICAgIHJldHVybiAxOworCisgICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1l
bnQtPmluUXVpcmtzTW9kZSgpOworICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWRE
ZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3Mt
PmRlZmF1bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVN
aW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7CisgICAgICAgIGludCByb3cg
PSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKKyAgICAgICAgcmV0dXJuIGZpbmROZWFy
ZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2RlID8gcXVpcmtz
Rm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAxKTsKKyAgICB9
CisKKyAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4ocGl4ZWxGb250
U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXplKTsKK30KKworc3RhdGljIENvbG9yIGNv
bG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCit7CisgICAgc3RydWN0IENvbG9yVmFsdWUg
eworICAgICAgICBpbnQgY3NzVmFsdWVJZDsKKyAgICAgICAgUkdCQTMyIGNvbG9yOworICAgIH07
CisKKyAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0geworICAgICAg
ICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAorICAgICAgICB7IENTU1ZhbHVlQmxhY2ss
IDB4RkYwMDAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAwRkYgfSwKKyAg
ICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1
ZUdyYXksIDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAw
ICB9LAorICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAorICAgICAgICB7IENT
U1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAorICAgICAgICB7IENTU1ZhbHVlTWFyb29uLCAweEZG
ODAwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0sCisgICAgICAg
IHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU9yYW5n
ZSwgMHhGRkZGQTUwMCB9LAorICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZGODAwMDgwIH0s
CisgICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1
ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAorICAgICAgICB7IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4
MCAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAwIH0sCisgICAg
ICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAorICAgICAgICB7IENTU1ZhbHVlWWVs
bG93LCAweEZGRkZGRjAwIH0sCisgICAgICAgIHsgMCwgMCB9CisgICAgfTsKKworICAgIGZvciAo
Y29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytj
b2wpIHsKKyAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlkKQorICAgICAg
ICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7CisgICAgfQorICAgIHJldHVybiBSZW5kZXJUaGVtZTo6
ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworfQorCitib29sIFN0eWxl
UmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NT
UHJpbWl0aXZlVmFsdWUqIHZhbHVlKQoreworICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVu
dCgpOworICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoK
KyAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0
aXZlbGluazoKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitD
b2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVW
YWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Cit7CisgICAgaWYgKHZhbHVl
LT5pc1JHQkNvbG9yKCkpCisgICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFs
dWUoKSk7CisKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGludCBpZGVu
dCA9IHZhbHVlLT5nZXRJZGVudCgpOworICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBjYXNlIDA6
CisgICAgICAgIHJldHVybiBDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0Ogor
ICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7CisgICAgY2FzZSBD
U1NWYWx1ZVdlYmtpdExpbms6CisgICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVudCgpLT5pc0xp
bmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNpdGVkTGlua0Nv
bG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVl
V2Via2l0QWN0aXZlbGluazoKKyAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPmFjdGl2
ZUxpbmtDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcjoKKyAg
ICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOworICAgIGNhc2UgQ1NT
VmFsdWVDdXJyZW50Y29sb3I6CisgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5jb2xvcigp
OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVlKGlkZW50KTsK
KyAgICB9Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBlbmRlbnRNZWRp
YVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVzdWx0KQorewor
ICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIo
bmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKK30KKworYm9vbCBTdHlsZVJl
c29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAoreworICAgIHVuc2lnbmVk
IHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgpOworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1fbWVkaXVtLT5l
dmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lv
bikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3N0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpTQ0FMRTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g7CisgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6U0NBTEVfWjsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2Fs
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8z
RDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsKKyAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKKyAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpUUkFOU0xBVEVfWjsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6
VFJBTlNMQVRFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOworICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlJPVEFURV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJP
VEFURV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfM0Q7CisgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6U0tFV19YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7CisgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246Ok1BVFJJWF8zRDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJz
cGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVS
U1BFQ1RJVkU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5z
Zm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKKyAgICB9Cisg
ICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKK30KKworYm9vbCBTdHlsZVJlc29s
dmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJT
dHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMm
IG91dE9wZXJhdGlvbnMpCit7CisgICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVl
TGlzdCgpKSB7CisgICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5l
ZmZlY3RpdmVab29tKCkgOiAxOworICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsK
KyAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsg
aS5hZHZhbmNlKCkpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsK
KworICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUq
IHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihp
LnZhbHVlKCkpOworICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0g
ZmFsc2U7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAg
ICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZh
bHVlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKworICAgICAgICBzd2l0Y2ggKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7
CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAg
ICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAg
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgICAgICAgICAgICAgc3kgPSBzeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVa
VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgc3ggPSAx
LjA7CisgICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3og
PSAxLjA7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9
PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uKQorICAg
ICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAg
ICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAg
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAg
ICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgeworICAgICAgICAg
ICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5
ID0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Bl
cmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVh
dGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+
b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0
aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJh
bnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGggdHggPSBM
ZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVk
KTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAg
ICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUs
IHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5
bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNm
b3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5
bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0
eS5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAg
ICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHkg
PSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZp
eGVkKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uKQor
ICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5
bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRv
RmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVu
Z3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMikpOworICAgICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0
aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0
aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNl
Y29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0
eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6
b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNV
bmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5z
bGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRyYW5zZm9ybU9w
ZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFuZ2xl
ID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSgwLCAw
LCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoK
KyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9w
ZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRy
YW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIHggPSAwOworICAgICAgICAg
ICAgZG91YmxlIHkgPSAwOworICAgICAgICAgICAgZG91YmxlIHogPSAwOworICAgICAgICAgICAg
ZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeCA9
IDE7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
ID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQor
ICAgICAgICAgICAgICAgIHkgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IHogPSAxOworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0
ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1P
cGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKHRyYW5z
Zm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsK
KyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygyKSk7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDMpKTsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZh
bHVlKCk7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURl
Z3JlZXMoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3Rh
dGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3Jt
T3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAg
ICBkb3VibGUgYW5nbGVYID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkgPSAwOworICAg
ICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICBhbmdsZVkgPSBhbmdsZTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFu
Z2xlWCA9IGFuZ2xlOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0
aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkg
PiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25k
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xl
WSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BlcmF0aW9u
cy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhbmds
ZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7
CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdl
dERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikp
LT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gem9vbUZhY3Rv
ciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91
YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4VHJhbnNm
b3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0
cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+bGVuZ3RoKCkgPCAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0RG91YmxlVmFs
dWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDYp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEwKSktPmdldERv
dWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVlKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsKKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJh
dGlvbjo6Y3JlYXRlKG1hdHJpeCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1P
cGVyYXRpb246IHsKKyAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAg
ICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAgICAgICAgIHAg
PSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29t
RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMg
YSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBhcmUgZmluYWxp
emVkLgorICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVW
YWx1ZSgpOworICAgICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChjbGFtcFRvUG9z
aXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRP
cGVyYXRpb25zID0gb3BlcmF0aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEVOQUJM
RShDU1NfRklMVEVSUykKK3N0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZmls
dGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9u
VHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6UkVGRVJFTkNFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okdy
YXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
R1JBWVNDQUxFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3Bl
cmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsKKyAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVy
T3BlcmF0aW9uOjpIVUVfUk9UQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Oklu
dmVydEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5W
RVJUOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRp
b246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7CisgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKKyAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6Q09OVFJBU1Q7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1
ckZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QkxVUjsK
KyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9u
OgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsKKyNpZiBFTkFC
TEUoQ1NTX1NIQURFUlMpCisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmls
dGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT007Cisj
ZW5kaWYKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0
aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOworICAgIH0KKyAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOworfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJT
KSAmJiBFTkFCTEUoU1ZHKQordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NWR0RvY3Vt
ZW50cygpCit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAoIXN0YXRlLnN0
eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRS
ZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7
CisgICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMg
PSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAg
ICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJh
dGlvbnMuYXQoaSk7CisgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5
cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgeworICAgICAgICAgICAgUmVmZXJl
bmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVu
Y2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOworCisgICAgICAgICAg
ICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1
bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICghdmFs
dWUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDYWNoZWRTVkdEb2N1
bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7
CisgICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50KQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhl
IHJlZmVyZW5jZSBmaWx0ZXIuCisgICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXItPnNldENhY2hl
ZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVy
ZW5jZShjYWNoZWREb2N1bWVudCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0ZS5wZW5k
aW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19T
SEFERVJTKQorU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVl
KiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFsdWUoKSkKKyAg
ICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKHN0YXRpY19j
YXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUpKTsKKyAgICByZXR1cm4gMDsKK30KKwor
U3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJv
bVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKK3sKKyAgICBTdHlsZVNoYWRlciog
c2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOworICAgIGlmIChzaGFkZXIg
JiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKKyAgICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5k
aW5nU2hhZGVycyh0cnVlKTsKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCit7CisgICAgaWYgKCFtX3N0YXRlLnN0eWxlKCkt
Pmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9
IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKworICAgIFZlY3Rv
cjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5z
dHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0
cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQo
aSk7CisgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBG
aWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgeworICAgICAgICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVyYXRpb24qPihm
aWx0ZXJPcGVyYXRpb24uZ2V0KCkpOworICAgICAgICAgICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+
cHJvZ3JhbSgpKTsKKyAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3Jh
bSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+
cHJvZ3JhbSgpKTsKKyAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBw
cm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKKyAgICAgICAgICAg
ICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHls
ZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVl
KCk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNoYWRlclZhbHVl
LT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dyYW0tPmZyYWdt
ZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7CisgICAgICAgICAgICAgICAgV2ViS2l0
Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hh
ZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7CisgICAg
ICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hl
ZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfQorICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpOworfQorCitz
dGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0
ZXI+JiBiKQoreworICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4oYS0+bmFtZSgp
LCBiLT5uYW1lKCkpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5
bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcm
IG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJB
cnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
cjo6Y3JlYXRlKG5hbWUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVl
cy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBDU1NWYWx1ZSogdmFsdWUg
PSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgIGlmICghdmFsdWUt
PmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBl
KCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXRE
b3VibGVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGFycmF5UGFyYW1ldGVyLnJlbGVhc2Uo
KTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6
OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRyPEN1c3RvbUZpbHRlck51bWJlclBhcmFt
ZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVh
dGUobmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7
ICsraSkgeworICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soaSk7CisgICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZl
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6
OkNTU19OVU1CRVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbnVtYmVyUGFyYW1l
dGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7CisgICAgfQor
ICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFu
c2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykK
K3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1Q
YXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsK
KyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgY3JlYXRlVHJhbnNmb3Jt
T3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIG9wZXJhdGlvbnMpOworICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0T3BlcmF0aW9u
cyhvcGVyYXRpb25zKTsKKyAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsK
K30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBh
cnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBh
cmFtZXRlclZhbHVlKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVy
cyB0eXBlcyBwYXJzaW5nLgorICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKKyAgICAvLyB0ZXh0dXJlczogaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCisgICAgLy8gbWF0MiwgbWF0MywgbWF0NDog
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0CisgICAgLy8gTnVt
YmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwK
KyAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20gQ1NTVmFsdWVM
aXN0LgorICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1
ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7CisgICAgaWYgKCF2YWx1ZXMtPmxlbmd0aCgpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJh
eUZ1bmN0aW9uVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQ
YXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8vIElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0
aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwKKyAgICAvLyB0aGVuIHdlIGNvdWxkIHNh
ZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcworICAgIC8vIGFyZSB0cmFu
c2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxsCisgICAgLy8g
cmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KKyAgICBpZiAodmFsdWVz
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkp
CisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihuYW1l
LCB2YWx1ZXMpOworCisgICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2YgYm9vbGVhbnMg
b3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9z
ZSB0d28uCisgICAgLy8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFs
bCBudW1iZXJzKS4KKyAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+
aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQorICAgICAgICByZXR1
cm4gMDsKKyAgICAKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDApKTsKKyAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgp
ID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQorICAgICAgICByZXR1cm4gcGFyc2VD
dXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8vIEZJWE1F
OiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCisgICAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4CisKKyAgICByZXR1cm4g
MDsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxp
c3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYg
cGFyYW1ldGVyTGlzdCkKK3sKKyAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJhbWV0ZXJOYW1l
czsKKyAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJz
VmFsdWUpOworICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7IHBhcmFtZXRl
ckl0ZXJhdG9yLmFkdmFuY2UoKSkgeworICAgICAgICBpZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZh
bHVlKCktPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkp
OworICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZl
VmFsdWU6OkNTU19TVFJJTkcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAor
ICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwor
ICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KKyAgICAg
ICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5hbWUpOworICAg
ICAgICAKKyAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAKKyAgICAgICAgaWYg
KCFpdGVyYXRvci5oYXNNb3JlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IAorICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJz
ZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAg
aWYgKCFwYXJhbWV0ZXIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHBhcmFt
ZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOworICAgIH0KKyAgICAKKyAgICAv
LyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIGRv
d24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4KKyAgICBzdGQ6OnNvcnQocGFyYW1ldGVy
TGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNv
bXBhcmF0b3IpOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPEN1c3Rv
bUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVy
VmFsdWUpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0aW9uIGZvciB0
aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCisgICAgVU5VU0VEX1BB
UkFNKGZpbHRlclZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlv
bldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQorewor
ICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygwKTsKKyAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzaGFkZXJz
VmFsdWUtPmlzVmFsdWVMaXN0KCkpOworICAgIENTU1ZhbHVlTGlzdCogc2hhZGVyc0xpc3QgPSBz
dGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOworCisgICAgdW5zaWduZWQg
c2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7CisgICAgQVNTRVJUKHNo
YWRlcnNMaXN0TGVuZ3RoKTsKKworICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVydGV4U2hhZGVy
ID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOwor
ICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7CisgICAgQ3VzdG9tRmlsdGVy
UHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVY
VFVSRTsKKyAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0dGluZ3M7CisK
KyAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7CisgICAgICAgIENTU1ZhbHVlKiBmcmFn
bWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygxKTsKKworICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uLT5pc1dl
YktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgeworICAgICAgICAgICAgV2ViS2l0Q1NTTWl4RnVu
Y3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlv
blZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKKyAgICAgICAgICAgIENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKKworICAgICAgICAgICAgQVNT
RVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9
IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaXRlcmF0b3IuYWR2
YW5jZSgpOworCisgICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMp
OworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgeworICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKENT
U1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQorICAgICAg
ICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZlVmFsdWU7Cisg
ICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9wZXJhdG9yKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGlu
Z3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7CisgICAgICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19FTEVNRU5UX1RF
WFRVUkU7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50
U2hhZGVyT3JNaXhGdW5jdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdW5zaWdu
ZWQgbWVzaFJvd3MgPSAxOworICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsKKyAgICBDdXN0
b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7CisgICAgCisgICAg
Q1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7CisgICAgCisgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3Io
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAKKyAgICAg
ICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qg
b2YgcGFyYW1ldGVyczoKKyAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgb3Ig
YW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKKyAgICAgICAgLy8gdGhlIG1l
c2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVycyBsaXN0Lgor
CisgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVW
YWx1ZSgpKSB7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAg
ICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAg
ICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0
IGJvdGgKKyAgICAgICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMuCisgICAg
ICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJ
bnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhlciBudW1iZXIg
Zm9yIHRoZSByb3dzLgorICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYg
aXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzaFJvd3Mg
PSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGl0
ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAg
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgeworICAgICAgICAg
ICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKKyAgICAgICAgICAgICAgICBpdGVy
YXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAg
ICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgeworICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUg
d2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVzdCBhIHBhcmFt
ZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVwCisgICAgICAgICAgICAvLyBoYXZpbmcg
anVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFt
ZXRlcnMuCisgICAgICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDIpOwor
ICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKKyAgICAgICAgcGFyYW1ldGVyc1Zh
bHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7CisgICAgCisgICAg
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OworICAgIGlmIChwYXJhbWV0
ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFs
dWUsIHBhcmFtZXRlckxpc3QpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBSZWZQdHI8
U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9n
cmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFkZXIucmVsZWFz
ZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKKyAgICByZXR1cm4gQ3Vz
dG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBhcmFtZXRlckxp
c3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOworfQorCitQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3Bl
cmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICBBU1NFUlQo
ZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKKyAgICBib29sIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4
ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFs
dWUoKTsKKyAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVhdGVDdXN0b21G
aWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZhbHVlKSA6IGNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVyVmFsdWUpOwor
fQorCisjZW5kaWYKKworYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25z
KENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290
U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCit7CisgICAgQVNTRVJUKG91
dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKKyAgICAKKyAgICBpZiAoIWluVmFsdWUpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgp
KSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgCisgICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpIDogMTsKKyAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7Cisg
ICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGku
YWR2YW5jZSgpKSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Cisg
ICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFs
dWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUoKSk7CisgICAg
ICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gZmlsdGVy
T3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsKKworI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3Bl
cmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0
b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVy
U3R5bGUuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9w
ZXJhdGlvbjo6Q1VTVE9NKSB7CisgICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUp
OworICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5h
cHBlbmQob3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5k
aWYKKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVO
Q0UpIHsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ1NTVmFs
dWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7CisK
KyAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBXZWJLaXRDU1NTVkdE
b2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZH
RG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKKyAgICAgICAgICAgIEtVUkwgdXJsID0gbV9zdGF0
ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwoKSk7CisKKyAg
ICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IFJl
ZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1
cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOworICAgICAgICAgICAgaWYg
KFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVl
LT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgeworICAgICAgICAgICAgICAgIGlmICghc3Zn
RG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgICAgICBtX3N0
YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBzdmdEb2N1bWVu
dFZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZhbHVlLT5jYWNo
ZWRTVkdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24tPnNldENhY2hl
ZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVy
ZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlv
bik7CisjZW5kaWYKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0
aGUKKyAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhhcyBhIFNoYWRv
d1ZhbHVlIHBhcmFtZXRlci4KKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gRmlsdGVyT3Bl
cmF0aW9uOjpEUk9QX1NIQURPVykgeworICAgICAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZl
VmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBmaWx0
ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgICAgIGlmICghZmlsdGVyVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAg
ICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CisKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUg
PSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7CisgICAgICAgIHN3
aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgeworICAgICAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjogeworICAgICAg
ICAgICAgZG91YmxlIGFtb3VudCA9IDE7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxl
bmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXRE
b3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRh
Z2UoKSkKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JN
YXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFu
Z2xlID0gMDsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkKKyAg
ICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisKKyAg
ICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4
RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OkludmVydEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJs
ZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKKyAgICAgICAgICAg
IGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFtb3Vu
dCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZp
cnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQorICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0g
MTAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMo
KS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFt
b3VudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjogewor
ICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAg
ICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCisgICAgICAgICAgICAgICAg
c3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5k
ZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRl
KHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRl
ck9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAx
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgQ1NTVmFsdWUq
IGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7CisgICAg
ICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8
U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7CisgICAgICAgICAgICBJbnRQb2ludCBsb2NhdGlvbihp
dGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvciks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGlu
dD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikpOworICAgICAgICAgICAgaW50IGJsdXIg
PSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290
U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAg
ICAgICAgaWYgKGl0ZW0tPmNvbG9yKQorICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9t
UHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOworCisgICAgICAgICAgICBvcGVyYXRp
b25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRl
KGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3Bh
cmVudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRPcGVyYXRpb25zID0g
b3BlcmF0aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKK1Bhc3NSZWZQdHI8
U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJ
bWFnZSogcGVuZGluZ0ltYWdlKQoreworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRS
ZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIo
KTsKKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgeworICAgICAgICBD
U1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7
CisgICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxv
YWRlcik7CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JW
YWx1ZSgpKSB7CisgICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdlR2VuZXJhdG9y
VmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsKKyAgICAgICAg
aW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7
CisgICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0
b3JWYWx1ZSk7CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VW
YWx1ZSgpKSB7CisgICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvckltYWdlVmFsdWUg
PSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGN1
cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9
CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJ
bWFnZVNldFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1
ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gaW1h
Z2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0K
KyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBl
bmRpbmdJbWFnZXMoKQoreworICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5
TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3Bl
cnRpZXMoKS5lbmQoKS5rZXlzKCk7CisgICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6
Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIENTU1Byb3BlcnR5
SUQgY3VycmVudFByb3BlcnR5ID0gKml0OworCisgICAgICAgIHN3aXRjaCAoY3VycmVudFByb3Bl
cnR5KSB7CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6IHsKKyAgICAg
ICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCkt
PmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5
ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChiYWNr
Z3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgpLT5pc1BlbmRp
bmdJbWFnZSgpKQorICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXItPnNldEltYWdl
KGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3Jv
dW5kTGF5ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogeworICAgICAgICAg
ICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENvbnRlbnREYXRh
Kj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7IGNvbnRlbnRE
YXRhID0gY29udGVudERhdGEtPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZW50
RGF0YS0+aXNJbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0eWxlSW1hZ2UqIGltYWdl
ID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2Fk
UGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5z
ZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogeworICAgICAgICAgICAgaWYg
KEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNvcnMoKSkgewor
ICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVudEN1cnNvciA9
IGN1cnNvckxpc3QtPmF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoU3R5bGVJbWFnZSog
aW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5
bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogeworICAgICAgICAgICAg
aWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRlLnN0eWxlKCkt
Pmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9z
dGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19j
YXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgp
KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckltYWdlU291cmNlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgp
LT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3Vy
Y2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCkt
PnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQ
ZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkpKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94UmVmbGVjdDogeworICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlvbiogcmVmbGVj
dGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7CisgICAgICAgICAgICAgICAg
Y29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1hc2soKTsKKyAg
ICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdlLmltYWdlKCkt
PmlzUGVuZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1h
Z2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRp
bmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJlZmxl
Y3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNr
SW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdlLmJvcmRlclNs
aWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFsUnVsZSgpLCBt
YXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5z
dHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJ
bWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUu
c3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nh
c3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJj
ZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogeworICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIG1h
c2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBtYXNrTGF5ZXI7
IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1h
c2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkp
CisgICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFyKCk7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQoreworICAgIC8vIFN0
YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVu
ZGluZ0ltYWdlcygpOworCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIC8vIFN0YXJ0IGxv
YWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5k
aW5nU2hhZGVycygpOworI2VuZGlmCisgICAgCisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQorICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVudHMgcmVmZXJl
bmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7CisjZW5k
aWYKK30KKworaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVk
UHJvcGVydGllcygpCisgICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQoreworfQorCitpbmxp
bmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJvcGVydGllcygp
Cit7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7Cisg
ICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1l
bW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0
aWVzIik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0
ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8p
IGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhp
cywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQ
cm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihyYW5n
ZXMsICJyYW5nZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwgInJlbmRlclN0
eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5k
ZXJTdHlsZSIpOworfQorCit2b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdl
KE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5
Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVz
OjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJlc3Npb24iKTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJ
bmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZv
KG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBp
bmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKKyAgICBpbmZvLmFkZE1lbWJl
cihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7CisgICAgaW5mby5hZGRN
ZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIp
OworICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIs
ICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciIpOworCisgICAgaW5mby5hZGRNZW1i
ZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0
U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVu
dCwgImRvY3VtZW50Iik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxlY3RvciwgImZv
bnRTZWxlY3RvciIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBlbmRlbnRNZWRp
YVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMiKTsKKyAg
ICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3Njb3BlUmVz
b2x2ZXIsICJzY29wZVJlc29sdmVyIik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX3N0YXRlLCAi
c3RhdGUiKTsKKworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3
b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7CisgICAgaW5mby5hZGRN
ZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0
UXVpcmtzU3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6
OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOworICAgIGluZm8uYWRkTWVt
YmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1
bHRWaWV3U291cmNlU3R5bGUiKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
U291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCShyZXZpc2lvbiAx
NDQ4OTMpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNywxODggKzI3LDI2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNv
bGxlY3Rvci5oIgogCi0jaW5jbHVkZSAiQXR0cmlidXRlLmgiCi0jaW5jbHVkZSAiQ1NTQm9yZGVy
SW1hZ2UuaCIKLSNpbmNsdWRlICJDU1NDYWxjdWxhdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NT
Q3Vyc29ySW1hZ2VWYWx1ZS5oIgogI2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgot
I2luY2x1ZGUgIkNTU0ZvbnRGYWNlUnVsZS5oIgotI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5o
IgotI2luY2x1ZGUgIkNTU0xpbmVCb3hDb250YWluVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NQYWdl
UnVsZS5oIgotI2luY2x1ZGUgIkNTU1BhcnNlci5oIgotI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZh
bHVlTWFwcGluZ3MuaCIKLSNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0jaW5jbHVkZSAi
Q1NTUmVmbGVjdFZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTUnVsZS5oIgorI2luY2x1ZGUgIkNTU1J1
bGVMaXN0LmgiCiAjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKICNpbmNsdWRlICJDU1NTZWxlY3Rv
ckxpc3QuaCIKLSNpbmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NTdXBwb3J0
c1J1bGUuaCIKLSNpbmNsdWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAi
Q1NTVmFsdWVMaXN0LmgiCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0jaW5jbHVkZSAiQ1NT
VmFyaWFibGVWYWx1ZS5oIgotI2VuZGlmCi0jaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKLSNpbmNs
dWRlICJDYWxjdWxhdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ29udGVudERhdGEuaCIKLSNpbmNs
dWRlICJDb250ZXh0RmVhdHVyZXMuaCIKLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAi
Q291bnRlckNvbnRlbnQuaCIKLSNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCi0jaW5jbHVkZSAiRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIK
LSNpbmNsdWRlICJGb250RmVhdHVyZVZhbHVlLmgiCi0jaW5jbHVkZSAiRm9udFZhbHVlLmgiCi0j
aW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgotI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgotI2luY2x1ZGUgIkhUTUxJ
RnJhbWVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxOYW1lcy5oIgotI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTFByb2dyZXNzRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKLSNp
bmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCi0jaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQu
aCIKLSNpbmNsdWRlICJJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJLZXlm
cmFtZUxpc3QuaCIKLSNpbmNsdWRlICJMaW5rSGFzaC5oIgotI2luY2x1ZGUgIkxvY2FsZVRvU2Ny
aXB0TWFwcGluZy5oIgotI2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCi0jaW5jbHVkZSAiTWF0cml4
M0RUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRp
b24uaCIKLSNpbmNsdWRlICJNZWRpYUxpc3QuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVh
dG9yLmgiCi0jaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiTm9kZVJlbmRl
cmluZ0NvbnRleHQuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGFpci5oIgotI2lu
Y2x1ZGUgIlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiUXVvdGVz
RGF0YS5oIgotI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgi
CisjaW5jbHVkZSAiSFRNTEVsZW1lbnQuaCIKICNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKLSNp
bmNsdWRlICJSZW5kZXJTY3JvbGxiYXIuaCIKLSNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVt
ZS5oIgotI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiUmVuZGVy
VGhlbWUuaCIKLSNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiUm90YXRlVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlNWR0RvY3Vt
ZW50RXh0ZW5zaW9ucy5oIgotI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgotI2luY2x1
ZGUgIlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4u
aCIKKyNpbmNsdWRlICJTVkdFbGVtZW50LmgiCiAjaW5jbHVkZSAiU2VsZWN0b3JDaGVja2VyRmFz
dFBhdGguaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1ZGUgIlNoYWRvd0RhdGEuaCIK
LSNpbmNsdWRlICJTaGFkb3dSb290LmgiCi0jaW5jbHVkZSAiU2hhZG93VmFsdWUuaCIKICNpbmNs
dWRlICJTaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ2llcy5oIgotI2luY2x1ZGUgIlNrZXdUcmFuc2Zv
cm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJTdHlsZUJ1aWxkZXIuaCIKLSNpbmNsdWRlICJTdHls
ZUNhY2hlZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVHZW5lcmF0ZWRJbWFnZS5oIgotI2luY2x1
ZGUgIlN0eWxlUGVuZGluZ0ltYWdlLmgiCiAjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0eVNldC5oIgot
I2luY2x1ZGUgIlN0eWxlUnVsZS5oIgotI2luY2x1ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgotI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgotI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
Ci0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCi0j
aW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiVXNlckFn
ZW50U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKLSNp
bmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCi0jaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3Ry
dW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lUnVsZS5oIgotI2luY2x1
ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25S
dWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuaCIKLSNpbmNsdWRlICJX
ZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKLSNpbmNsdWRlICJYTUxOYW1lcy5oIgotI2luY2x1ZGUg
PHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL01lbW9y
eUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KLSNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVu
dGF0aW9uVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLSNpbmNsdWRlICJGaWx0
ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NGaWx0ZXJWYWx1ZS5oIgotI2VuZGlm
Ci0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0jaW5jbHVkZSAiRGFzaGJvYXJkUmVn
aW9uLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiQ2FjaGVkU1ZHRG9j
dW1lbnQuaCIKLSNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgotI2luY2x1
ZGUgIlNWR0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgotI2luY2x1ZGUgIlNW
R05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCi0jaW5jbHVkZSAiV2ViS2l0
Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
Ci0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0
b21GaWx0ZXJDb25zdGFudHMuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJDdXN0
b21GaWx0ZXJQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJh
bWV0ZXIuaCIKLSNpbmNsdWRlICJTdHlsZUNhY2hlZFNoYWRlci5oIgotI2luY2x1ZGUgIlN0eWxl
Q3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgotI2luY2x1ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgot
I2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1NoYWRlclZhbHVlLmgiCi0jZW5kaWYKLQotI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQotI2luY2x1ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKLSNp
bmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShWSURF
T19UUkFDSykKLSNpbmNsdWRlICJXZWJWVFRFbGVtZW50LmgiCi0jZW5kaWYKKyNpbmNsdWRlICJT
dHlsZWRFbGVtZW50LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBXVEYg
ewotCi10ZW1wbGF0ZTw+IHN0cnVjdCBTZXF1ZW5jZU1lbW9yeUluc3RydW1lbnRhdGlvblRyYWl0
czxjb25zdCBXZWJDb3JlOjpSdWxlRGF0YSo+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgST4g
c3RhdGljIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoSSwgSSwgTWVtb3J5Q2xhc3NJbmZvJikgeyB9
Ci19OwotCi19CisjaW5jbHVkZSA8d3RmL1RlbXBvcmFyeUNoYW5nZS5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLSNkZWZpbmUgSEFORExF
X0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5oZXJpdCkgeyBcCi0gICAgbV9zdGF0ZS5z
dHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCi0gICAg
cmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwg
UHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5pdGlhbCkgeyBc
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1By
b3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6
OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KIHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0
VG9SaWdodERlY2xhcmF0aW9uKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3Jl
YXRlKCkpKTsKQEAgLTIyNSwyNDIgKzYzLDU3IEBAIHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBy
aWdodFRvTGVmdERlY2wKICAgICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgpOwogfQogCi0K
LWlubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmVuc3VyZVJ1
bGVMaXN0KCkKLXsKLSAgICBpZiAoIW1fcnVsZUxpc3QpCi0gICAgICAgIG1fcnVsZUxpc3QgPSBT
dGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7
Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjYWNoZUJvcmRlckFuZEJh
Y2tncm91bmQoKQotewotICAgIG1faGFzVUFBcHBlYXJhbmNlID0gbV9zdHlsZS0+aGFzQXBwZWFy
YW5jZSgpOwotICAgIGlmIChtX2hhc1VBQXBwZWFyYW5jZSkgewotICAgICAgICBtX2JvcmRlckRh
dGEgPSBtX3N0eWxlLT5ib3JkZXIoKTsKLSAgICAgICAgbV9iYWNrZ3JvdW5kRGF0YSA9ICptX3N0
eWxlLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0gbV9z
dHlsZS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJl
c29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQotewotICAgIG1fZWxlbWVudCA9IDA7Ci0gICAgbV9zdHls
ZWRFbGVtZW50ID0gMDsKLSAgICBtX3BhcmVudFN0eWxlID0gMDsKLSAgICBtX3BhcmVudE5vZGUg
PSAwOwotICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0g
ICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKLSAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMu
Y2xlYXIoKTsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgbV9oYXNQZW5kaW5nU2hhZGVy
cyA9IGZhbHNlOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZH
KQotICAgIG1fcGVuZGluZ1NWR0RvY3VtZW50cy5jbGVhcigpOwotI2VuZGlmCi19Ci0KLVN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcykKLSAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9u
c1NpbmNlTGFzdFN3ZWVwKDApCi0gICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRp
bWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCi0g
ICAgLCBtX2RvY3VtZW50KGRvY3VtZW50KQotICAgICwgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICwgbV9mb250U2VsZWN0b3IoQ1NTRm9u
dFNlbGVjdG9yOjpjcmVhdGUoZG9jdW1lbnQpKQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBU
QVRJT04pCi0gICAgLCBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcihWaWV3cG9ydFN0eWxlUmVzb2x2
ZXI6OmNyZWF0ZShkb2N1bWVudCkpCi0jZW5kaWYKLSAgICAsIG1fc3R5bGVCdWlsZGVyKFN0eWxl
QnVpbGRlcjo6c2hhcmVkU3R5bGVCdWlsZGVyKCkpCi0gICAgLCBtX3N0eWxlTWFwKHRoaXMpCi17
Ci0gICAgRWxlbWVudCogcm9vdCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKLQotICAg
IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6aW5pdERlZmF1bHRTdHlsZShyb290KTsKLQotICAgIC8v
IGNvbnN0cnVjdCBkb2N1bWVudCByb290IGVsZW1lbnQgZGVmYXVsdCBzdHlsZS4gdGhpcyBpcyBu
ZWVkZWQKLSAgICAvLyB0byBldmFsdWF0ZSBtZWRpYSBxdWVyaWVzIHRoYXQgY29udGFpbiByZWxh
dGl2ZSBjb25zdHJhaW50cywgbGlrZSAic2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMGVtKSIKLSAg
ICAvLyBUaGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciwgYmVjYXVzZSB3aGVuIGNv
bnN0cnVjdG9yIGlzIHJ1biwKLSAgICAvLyBkb2N1bWVudCBkb2Vzbid0IGhhdmUgZG9jdW1lbnRF
bGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgZWxlbWVudCB0aGF0IGdldHMg
cGFzc2VkIHRvIHN0eWxlRm9yRWxlbWVudCAtY2FsbAotICAgIC8vIGlzIGFsd2F5cyBmcm9tIHRo
ZSBkb2N1bWVudCB0aGF0IG93bnMgdGhlIHN0eWxlIHNlbGVjdG9yCi0gICAgRnJhbWVWaWV3KiB2
aWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsKLSAgICBpZiAodmlldykKLSAgICAgICAgbV9tZWRpdW0g
PSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSkpOwot
ICAgIGVsc2UKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1
YXRvcigiYWxsIikpOwotCi0gICAgaWYgKHJvb3QpCi0gICAgICAgIG1fcm9vdERlZmF1bHRTdHls
ZSA9IHN0eWxlRm9yRWxlbWVudChyb290LCAwLCBEaXNhbGxvd1N0eWxlU2hhcmluZywgTWF0Y2hP
bmx5VXNlckFnZW50UnVsZXMpOwotCi0gICAgaWYgKG1fcm9vdERlZmF1bHRTdHlsZSAmJiB2aWV3
KQotICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZp
ZXctPm1lZGlhVHlwZSgpLCB2aWV3LT5mcmFtZSgpLCBtX3Jvb3REZWZhdWx0U3R5bGUuZ2V0KCkp
KTsKLQotICAgIG1fcnVsZVNldHMucmVzZXRBdXRob3JTdHlsZSgpOwotCi0gICAgRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKTsKLSAgICBtX3J1bGVTZXRzLmluaXRVc2VyU3R5bGUoc3R5bGVT
aGVldENvbGxlY3Rpb24sICptX21lZGl1bSwgKnRoaXMpOwotCi0jaWYgRU5BQkxFKFNWR19GT05U
UykKLSAgICBpZiAoZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKSkgewotICAgICAgICBjb25zdCBI
YXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+JiBzdmdGb250RmFjZUVsZW1lbnRzID0gZG9jdW1l
bnQtPnN2Z0V4dGVuc2lvbnMoKS0+c3ZnRm9udEZhY2VFbGVtZW50cygpOwotICAgICAgICBIYXNo
U2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBzdmdGb250RmFj
ZUVsZW1lbnRzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3ZnRm9udEZhY2VFbGVtZW50cy5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpCi0gICAgICAgICAgICBmb250U2VsZWN0b3IoKS0+YWRkRm9udEZhY2VSdWxl
KCgqaXQpLT5mb250RmFjZVJ1bGUoKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcHBlbmRBdXRo
b3JTdHlsZVNoZWV0cygwLCBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+YWN0aXZlQXV0aG9yU3R5bGVT
aGVldHMoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwZW5kQXV0aG9yU3R5bGVTaGVl
dHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
PiYgc3R5bGVTaGVldHMpCi17Ci0gICAgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0
cyhmaXJzdE5ldywgc3R5bGVTaGVldHMsIG1fbWVkaXVtLmdldCgpLCBtX2luc3BlY3RvckNTU09N
V3JhcHBlcnMsIGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCB0aGlzKTsKLSAgICBpZiAoZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSAmJiBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpKQot
ICAgICAgICBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZv
bnRTZWxlY3RvcigpKTsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAg
dmlld3BvcnRTdHlsZVJlc29sdmVyKCktPnJlc29sdmUoKTsKLSNlbmRpZgotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkKLXsKLSAgICBj
b25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRzUGFyZW50ID0gcGFyZW50LT5wYXJlbnRPclNoYWRv
d0hvc3RFbGVtZW50KCk7Ci0KLSAgICAvLyBXZSBhcmUgbm90IGFsd2F5cyBpbnZva2VkIGNvbnNp
c3RlbnRseS4gRm9yIGV4YW1wbGUsIHNjcmlwdCBleGVjdXRpb24gY2FuIGNhdXNlIHVzIHRvIGVu
dGVyCi0gICAgLy8gc3R5bGUgcmVjYWxjIGluIHRoZSBtaWRkbGUgb2YgdHJlZSBidWlsZGluZy4g
V2UgbWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHNvbWV3aGVyZSB3aXRoaW4gdGhlIHRyZWUuCi0g
ICAgLy8gUmVzZXQgdGhlIHN0YWNrIGluIHRoaXMgY2FzZSwgb3IgaWYgd2Ugc2VlIGEgbmV3IHJv
b3QgZWxlbWVudC4KLSAgICAvLyBPdGhlcndpc2UganVzdCBwdXNoIHRoZSBuZXcgcGFyZW50Lgot
ICAgIGlmICghcGFyZW50c1BhcmVudCB8fCBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNF
bXB0eSgpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnNldHVwUGFyZW50U3RhY2socGFyZW50
KTsKLSAgICBlbHNlCi0gICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucHVzaFBhcmVudChwYXJlbnQp
OwotCi0gICAgLy8gTm90ZTogV2UgbXVzdG4ndCBza2lwIFNoYWRvd1Jvb3Qgbm9kZXMgZm9yIHRo
ZSBzY29wZSBzdGFjay4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3Bl
UmVzb2x2ZXItPnB1c2gocGFyZW50LCBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9zdE5vZGUoKSk7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJl
bnQpCi17Ci0gICAgLy8gTm90ZSB0aGF0IHdlIG1heSBnZXQgaW52b2tlZCBmb3Igc29tZSByYW5k
b20gZWxlbWVudHMgaW4gc29tZSB3YWNreSBjYXNlcyBkdXJpbmcgc3R5bGUgcmVzb2x2ZS4KLSAg
ICAvLyBQYXVzZSBtYWludGFpbmluZyB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLgotICAgIGlmICht
X3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHBhcmVudCkpCi0gICAgICAg
IG1fc2VsZWN0b3JGaWx0ZXIucG9wUGFyZW50KCk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikK
LSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3AocGFyZW50KTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjpwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290
KQotewotICAgIEFTU0VSVChzaGFkb3dSb290LT5ob3N0KCkpOwotICAgIGlmIChtX3Njb3BlUmVz
b2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cHVzaChzaGFkb3dSb290LCBzaGFkb3dS
b290LT5ob3N0KCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudFNoYWRvd1Jv
b3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKK1N0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVz
dWx0JiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3VsdCgpCiB7Ci0gICAgQVNTRVJU
KHNoYWRvd1Jvb3QtPmhvc3QoKSk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAg
bV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7CisgICAgQVNTRVJUKG1fbW9kZSA9PSBT
ZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKyAgICByZXR1cm4gbV9yZXN1bHQ7CiB9
CiAKLS8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtl
eWZyYW1lIHN0eWxlcwotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NS
ZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQorUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoZWRSdWxlTGlzdCgpCiB7Ci0gICAgQXRvbWljU3Ry
aW5nIHMocnVsZS0+bmFtZSgpKTsKLSAgICBtX2tleWZyYW1lc1J1bGVNYXAuc2V0KHMuaW1wbCgp
LCBydWxlKTsKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGlu
Z1J1bGVzKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7CiB9CiAKLVN0eWxlUmVz
b2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjphZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSogcnVsZSkKIHsKLSAgICBtX2ZvbnRTZWxl
Y3Rvci0+Y2xlYXJEb2N1bWVudCgpOwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElP
TikKLSAgICBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOwotI2VuZGlm
CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAgICAgICAgbV9tYXRjaGVkUnVsZXMgPSBhZG9w
dFB0cihuZXcgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+KTsKKyAgICBtX21hdGNoZWRSdWxl
cy0+YXBwZW5kKHJ1bGUpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCitpbmxpbmUgdm9pZCBFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6Y2xlYXJNYXRjaGVkUnVsZXMoKQogewotICAgIC8vIExvb2sgZm9yIGNh
Y2hlIGVudHJpZXMgY29udGFpbmluZyBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggYSBzaW5nbGUg
cmVmIGFuZCByZW1vdmUgdGhlbS4KLSAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBhbiBlbGVt
ZW50IGF0dHJpYnV0ZSBtdXRhdGlvbiBjYXVzZXMgaXQgdG8gZ2VuZXJhdGUgYSBuZXcgaW5saW5l
U3R5bGUoKQotICAgIC8vIG9yIHByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCksIHBvdGVudGlh
bGx5IGxlYXZpbmcgdGhpcyBjYWNoZSB3aXRoIHRoZSBsYXN0IHJlZiBvbiB0aGUgb2xkIG9uZS4K
LSAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiB0b1JlbW92ZTsKLSAgICBNYXRjaGVkUHJvcGVydGll
c0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5iZWdpbigpOwot
ICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGVuZCA9IG1fbWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZS5lbmQoKTsKLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcz4mIG1hdGNoZWRQcm9wZXJ0aWVzID0gaXQtPnZhbHVl
Lm1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlZFByb3Bl
cnRpZXNbaV0ucHJvcGVydGllcy0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgICAgICB0b1Jl
bW92ZS5hcHBlbmQoaXQtPmtleSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b1JlbW92
ZS5zaXplKCk7ICsraSkKLSAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLnJlbW92ZSh0
b1JlbW92ZVtpXSk7Ci0KLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5j
ZUxhc3RTd2VlcCA9IDA7CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAgICAgICAgcmV0dXJu
OworICAgIG1fbWF0Y2hlZFJ1bGVzLT5jbGVhcigpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5
bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5r
TWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQor
aW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5zdXJlUnVs
ZUxpc3QoKQogewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRp
ZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7
Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5
U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlu
a01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdo
aXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsK
KyAgICBpZiAoIW1fcnVsZUxpc3QpCisgICAgICAgIG1fcnVsZUxpc3QgPSBTdGF0aWNDU1NSdWxl
TGlzdDo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7CiB9CiAKLWlubGlu
ZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXND
YWNoZWFibGUpCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6YWRkRWxlbWVudFN0
eWxlUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBp
c0NhY2hlYWJsZSkKIHsKICAgICBpZiAoIXByb3BlcnR5U2V0KQogICAgICAgICByZXR1cm47Ci0g
ICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQot
ICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNl
dCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JS
dWxlID09IC0xKQorICAgICAgICBtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gbV9y
ZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOworICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKHByb3BlcnR5U2V0KTsKICAgICBpZiAoIWlzQ2FjaGVhYmxlKQotICAgICAgICByZXN1
bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLX0KLQotY2xhc3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUg
ewotcHVibGljOgotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0gICAgfk1hdGNoaW5nVUFS
dWxlc1Njb3BlKCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBpc01hdGNoaW5nVUFSdWxlcygpOwotCi1w
cml2YXRlOgotICAgIHN0YXRpYyBib29sIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfTsKLQotTWF0Y2hp
bmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBBU1NFUlQoIW1f
bWF0Y2hpbmdVQVJ1bGVzKTsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9IHRydWU7CisgICAgICAg
IG1fcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7CiB9CiAKLU1hdGNoaW5nVUFSdWxlc1Njb3Bl
Ojp+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQotewotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFs
c2U7Ci19Ci0KLWlubGluZSBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFS
dWxlcygpCi17Ci0gICAgcmV0dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfQotCi1ib29sIE1hdGNo
aW5nVUFSdWxlc1Njb3BlOjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hS
ZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBT
dHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsKICAgICBBU1NFUlQobWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQpOwogICAgIEFTU0VSVChtX3N0YXRlLmVsZW1lbnQoKSk7CiAKLSAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CiAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKTsK
ICAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVkRWxl
bWVudCgpOwogICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5zaGFk
b3dQc2V1ZG9JZCgpOwpAQCAtNDc4LDEwICsxMzEsMTAgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpj
b2xsZWN0TWF0Y2hpbmdSdWxlcwogICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93cyBhdXRo
b3IgcnVsZXMKICAgICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBzdHlsZSBz
aGVldCB3aXRoaW4gdGhlIHNhbWUgdHJlZSBzY29wZQogICAgIFRyZWVTY29wZSogdHJlZVNjb3Bl
ID0gZWxlbWVudC0+dHJlZVNjb3BlKCk7Ci0gICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNTY29wZTo6
aXNNYXRjaGluZ1VBUnVsZXMoKQorICAgIGlmICghbV9tYXRjaGluZ1VBUnVsZXMKICAgICAgICAg
JiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQogICAgICAgICAmJiAoIW1hdGNoUmVx
dWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29w
ZSkKLSAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICAmJiBtX2JlaGF2aW9yQXRC
b3VuZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQogICAgICAg
ICByZXR1cm47CiAKICAgICAvLyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwg
Y2xhc3MsIHRhZywgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZApAQCAtNTAx
LDE1ICsxNTQsMTUgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcwog
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5p
dmVyc2FsUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogfQogCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVD
b2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsK
LSAgICBpZiAoIW1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKQorICAgIGlmICghbV9yZWdpb25G
b3JTdHlsaW5nKQogICAgICAgICByZXR1cm47CiAKICAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwogICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgY29uc3QgQ1NT
U2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7Ci0gICAgICAgIGlmIChjaGVja1Jl
Z2lvblNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9zdGF0
ZS5yZWdpb25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7CisgICAgICAgIGlmIChjaGVja1JlZ2lv
blNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZWdpb25G
b3JTdHlsaW5nLT5ub2RlKCkpKSkgewogICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMg
PSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChp
KS5ydWxlU2V0LmdldCgpOwogICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKICAgICAg
ICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0
Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFu
Z2UpOwpAQCAtNTE3LDE4ICsxNzAsMTkgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0
Y2hpbmdSdWxlcwogICAgIH0KIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNm
ZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xs
ZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcygpCiB7Ci0gICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLSAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxl
cyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOwotICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgp
KQorICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAg
ICBpZiAoIW1fbWF0Y2hlZFJ1bGVzIHx8IG1fbWF0Y2hlZFJ1bGVzLT5pc0VtcHR5KCkpCiAgICAg
ICAgIHJldHVybjsKIAogICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKIAotICAgIGlmIChzdGF0ZS5t
b2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICBWZWN0b3I8
Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9ICptX21hdGNoZWRSdWxlczsKKyAg
ICBpZiAobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CiAgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kpCi0g
ICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRjaGVk
UnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOworICAgICAgICAgICAgZW5z
dXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNy
ZWF0ZUNTU09NV3JhcHBlcigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTM2LDEx
ICsxOTAsMTEgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaAogICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKICAg
ICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29t
bW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVu
aXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxl
c1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRj
aGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdo
aXRlbGlzdFR5cGUoKSk7CisgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKG1h
dGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVs
ZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5w
cm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7CiAgICAgfQogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoU2NvcGVkQXV0aG9y
UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICNpZiBFTkFCTEUoU1RZTEVfU0NPUEVE
KSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKQEAgLTU1
Miw4ICsyMDYsOCBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsCiAg
ICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7CiAgICAgICAgIHVuc2lnbmVkIHNjb3Bl
U2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7CiAgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9zdGF0ZS5tYXRj
aGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9y
UnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgICAgICAgICAg
Y2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICAgICAgICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0
aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CiAKICAgICAg
ICAgICAgIGNvbnN0IFN0eWxlU2NvcGVSZXNvbHZlcjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Nj
b3BlUmVzb2x2ZXItPnN0YWNrRnJhbWVBdChpKTsKICAgICAgICAgICAgIGRvY3VtZW50U2NvcGUg
PSBkb2N1bWVudFNjb3BlICYmICFmcmFtZS5tX3Njb3BlLT5pc0luU2hhZG93VHJlZSgpOwpAQCAt
NTY2LDM2ICsyMjAsMjYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1
bAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0
KGZyYW1lLm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVsZXMsIGZyYW1lLm1fc2NvcGUpOwotICAg
ICAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJh
bmdlKCk7CisgICAgICAgICAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
bV9yZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwogICAgICAgICAgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogICAgICAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAg
ICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgICAgICAgICBz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1h
dGNoSG9zdFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIG1hdGNoSG9zdFJ1
bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKTsKICNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7
CiAgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKICNlbmRpZgogfQogCi1pbmxp
bmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1
bGVzKCkKLXsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICByZXR1cm4gbV9zY29wZVJlc29s
dmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RS
dWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRp
ZgotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjptYXRjaEhvc3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQogewogI2lmIEVOQUJMRShT
SEFET1dfRE9NKQogICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2ZXIpOwogCi0gICAgbV9zdGF0ZS5t
YXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUg
PSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBjbGVhck1hdGNoZWRS
dWxlcygpOworICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CiAKICAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNo
ZWRSdWxlczsKICAgICBtX3Njb3BlUmVzb2x2ZXItPm1hdGNoSG9zdFJ1bGVzKG1fc3RhdGUuZWxl
bWVudCgpLCBtYXRjaGVkUnVsZXMpOwpAQCAtNjAzLDg4ICsyNDcsMTU2IEBAIHZvaWQgU3R5bGVS
ZXNvbHZlcjo6bWF0Y2hIb3N0UnVsZXMoTWF0Y2gKICAgICAgICAgcmV0dXJuOwogCiAgICAgZm9y
ICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAg
ICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsK
KyAgICAgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJh
bmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0
Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0
ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwogICAgIH0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRj
aGVkUnVsZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKICNl
bHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CiAgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVF
bXB0eVJ1bGVzKTsKICNlbmRpZgogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9y
UnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKKyNpZiBF
TkFCTEUoU0hBRE9XX0RPTSkKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRj
aFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcywgU3R5bGVSZXNv
bHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYgKG1fcnVsZVNldHMuc2hhZG93
RGlzdHJpYnV0ZWRSdWxlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGVt
cG9yYXJ5Q2hhbmdlPGJvb2w+IGNhblVzZUZhc3RSZWplY3QobV9jYW5Vc2VGYXN0UmVqZWN0LCBm
YWxzZSk7CisgICAgVGVtcG9yYXJ5Q2hhbmdlPFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJv
dW5kYXJ5PiBiZWhhdmlvckF0Qm91bmRhcnkobV9iZWhhdmlvckF0Qm91bmRhcnksIFNlbGVjdG9y
Q2hlY2tlcjo6Q3Jvc3Nlc0JvdW5kYXJ5KTsKKworICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1h
dGNoUmVxdWVzdHM7CisgICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29s
bGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKKyAgICAg
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKK30K
KyNlbmRpZgorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhvclJ1bGVzKGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMpCiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVh
cigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBjbGVhck1hdGNoZWRSdWxlcygpOworICAgIG1fcmVz
dWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKSAtIDE7CiAKICAgICBpZiAoIW1fc3RhdGUuZWxlbWVudCgpKQogICAgICAgICByZXR1cm47
CiAKICAgICAvLyBNYXRjaCBnbG9iYWwgYXV0aG9yIHJ1bGVzLgogICAgIE1hdGNoUmVxdWVzdCBt
YXRjaFJlcXVlc3QobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7
Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdl
KCk7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJh
bmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7CiAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0
Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3Rv
cjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0
cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1h
dGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5z
aXplKCk7ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tp
XSwgcnVsZVJhbmdlKTsKKyAgICBtYXRjaFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoaW5jbHVkZUVt
cHR5UnVsZXMsIHJ1bGVSYW5nZSk7CiAjZW5kaWYKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMoKTsKIAotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOwotCi0g
ICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAg
ICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKTsKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVs
ZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0
eWxlKCkpCiAgICAgICAgIHJldHVybjsKICAgICAKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygp
LmNsZWFyKCk7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKIAotICAgIHJlc3VsdC5yYW5nZXMu
bGFzdFVzZXJSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAg
bV9yZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
LnNpemUoKSAtIDE7CiAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLnVz
ZXJTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9
IHJlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVS
YW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOwogICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CiAKLSAgICBz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJN
YXRjaGVkUnVsZXMoKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0
Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVj
dG9yOjptYXRjaFVBUnVsZXMoKQogewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIo
KTsKKyAgICBUZW1wb3JhcnlDaGFuZ2U8Ym9vbD4gc2NvcGUobV9tYXRjaGluZ1VBUnVsZXMsIHRy
dWUpOworCisgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBz
aGVldC4KKyAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVT
aGVldCkKKyAgICAgICAgbV9yZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICBSdWxlU2V0
KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9pc1ByaW50U3R5bGUKKyAgICAgICAgPyBDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0U3R5bGU7CisgICAgbWF0Y2hVQVJ1bGVzKHVzZXJBZ2VudFN0eWxlU2hlZXQpOwor
CisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1
c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkKKyAg
ICAgICAgbWF0Y2hVQVJ1bGVzKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0
eWxlKTsKKworICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChpbiB2
aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2ggcnVs
ZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCisgICAgaWYgKGRvY3VtZW50KCkt
PmlzVmlld1NvdXJjZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoVUFSdWxlcyhSdWxlU2V0KiBydWxlcykKK3sKKyAgICBjbGVhck1hdGNoZWRSdWxlcygp
OwogICAgIAotICAgIHJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFu
Z2VzLlVBUnVsZVJhbmdlKCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgPSBtX3Jl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1
bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwogCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKCk7Cit9CisKK2lubGluZSBib29sIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5v
ZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbykKK3sKKyAgICBjb25zdCBTdHlsZVJl
c29sdmVyOjpTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKHJ1bGVEYXRhLmhhc0Zh
c3RDaGVja2FibGVTZWxlY3RvcigpKSB7CisgICAgICAgIC8vIFdlIGtub3cgdGhpcyBzZWxlY3Rv
ciBkb2VzIG5vdCBpbmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVudHMuCisgICAgICAgIGlmIChtX3Bz
ZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCAhPSBOT1BTRVVETykKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgLy8gV2Uga25vdyBhIHN1ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xl
IHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkgYmVjYXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRo
ZSBydWxlIGhhc2guCisgICAgICAgIC8vIFRoaXMgaXMgbGltaXRlZCB0byBIVE1MIG9ubHkgc28g
d2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFtZXNwYWNlLgorICAgICAgICBpZiAocnVsZURh
dGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGluZ0hUTUxCYXNlZE9uUnVsZUhhc2goKSAmJiBz
dGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKCFydWxl
RGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisgICAgICAgIGlmIChydWxlRGF0YS5zZWxlY3RvcigpLT5tX21hdGNoID09
IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9yQ2hlY2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5l
bGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCktPnRhZ1FOYW1lKCkpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBTZWxlY3RvckNoZWNrZXJGYXN0UGF0aCBzZWxlY3RvckNo
ZWNrZXJGYXN0UGF0aChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCkpOworICAg
ICAgICBpZiAoIXNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXNSaWdodG1vc3RBdHRyaWJ1
dGVTZWxlY3RvcigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVy
biBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzKCk7CisgICAgfQorCisgICAgLy8gU2xv
dyBwYXRoLgorICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwg
bV9tb2RlKTsKKyAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNv
bnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNr
ZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOworICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3Rh
dGUuc3R5bGUoKTsKKyAgICBjb250ZXh0LnNjb3BlID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1
ZG9JZCA9IG1fcHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkOworICAgIGNvbnRleHQuc2Nyb2xs
YmFyID0gbV9wc2V1ZG9TdHlsZVJlcXVlc3Quc2Nyb2xsYmFyOworICAgIGNvbnRleHQuc2Nyb2xs
YmFyUGFydCA9IG1fcHNldWRvU3R5bGVSZXF1ZXN0LnNjcm9sbGJhclBhcnQ7CisgICAgY29udGV4
dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBtX2JlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBTZWxlY3Rv
ckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5
bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKKyAgICBpZiAobWF0
Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAobV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQgIT0gTk9QU0VVRE8g
JiYgbV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBy
dWxlcywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJh
bmdlKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1h
dGNoUmVxdWVzdCwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCiB7CiAgICAg
aWYgKCFydWxlcykKICAgICAgICAgcmV0dXJuOwogCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLSAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBm
b3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNv
bHZlLgotICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRh
dGUgaW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBib29s
IGNhblVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0
ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFy
eSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OworICAgIGNvbnN0IFN0
eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CiAKICAgICB1bnNpZ25lZCBzaXpl
ID0gcnVsZXMtPnNpemUoKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytp
KSB7CiAgICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChpKTsKLSAg
ICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0
U2VsZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2Nl
bmRhbnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCisgICAgICAgIGlmIChtX2NhblVzZUZh
c3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6
Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3RvcklkZW50
aWZpZXJIYXNoZXMoKSkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBTdHlsZVJ1
bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxlKCk7Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1
bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1
bGUoZG9jdW1lbnQoKSwgcnVsZSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgp
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKTsKICAgICAgICAgUHNldWRvSWQgZHluYW1pY1BzZXVk
byA9IE5PUFNFVURPOwotICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVx
dWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFy
eSkpIHsKKyAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2Nv
cGUsIGR5bmFtaWNQc2V1ZG8pKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8g
cHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2Rl
LgogICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUt
PnByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIGlmICghcHJvcGVydGllcyB8fCAocHJvcGVydGll
cy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMpKSB7CkBAIC02
OTIsMTQgKzQwNCwxNCBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVz
CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAv
LyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMgQVBJ
IHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVkZWQuCi0gICAgICAgICAgICBp
ZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgpICYmICFydWxlRGF0YS5oYXNEb2N1bWVudFNlY3Vy
aXR5T3JpZ2luKCkpIHsKKyAgICAgICAgICAgIGlmIChtX3NhbWVPcmlnaW5Pbmx5ICYmICFydWxl
RGF0YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKICAgICAgICAgICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIHdl
J3JlIG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgogICAgICAgICAg
ICAgLy8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50LgotICAgICAgICAg
ICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1
ZXN0KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUu
bW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAgICAg
ICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBtX3BzZXVkb1N0eWxlUmVxdWVzdC5w
c2V1ZG9JZCA9PSBOT1BTRVVETykgeworICAgICAgICAgICAgICAgIGlmIChtX21vZGUgPT0gU2Vs
ZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CiAgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTcxMiw3ICs0
MjQsNyBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzCiAgICAgICAg
ICAgICAgICAgICAgIHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVs
ZUluZGV4OwogCiAgICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICAgICAgICAgIG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUo
JnJ1bGVEYXRhKTsKKyAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEpOwog
ICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNv
b2tpZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBA
IC03MjgsNDUxNSArNDQwLDY5IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29u
c3QgUnUKICAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBv
c2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsK
IH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKK3ZvaWQgRWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OnNvcnRNYXRjaGVkUnVsZXMoKQogewotICAgIHN0ZDo6c29ydChtX3N0
YXRlLm1hdGNoZWRSdWxlcygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCks
IGNvbXBhcmVSdWxlcyk7CisgICAgQVNTRVJUKG1fbWF0Y2hlZFJ1bGVzKTsKKyAgICBzdGQ6OnNv
cnQobV9tYXRjaGVkUnVsZXMtPmJlZ2luKCksIG1fbWF0Y2hlZFJ1bGVzLT5lbmQoKSwgY29tcGFy
ZVJ1bGVzKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQordm9pZCBFbGVtZW50UnVs
ZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyhib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywg
Ym9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCiB7Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCk7
CisgICAgbWF0Y2hVQVJ1bGVzKCk7CiAKICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBy
dWxlcy4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNo
VXNlclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMpCisgICAgICAgIG1hdGNoVXNlclJ1bGVzKGZhbHNlKTsKIAogICAgIC8vIE5vdyBjaGVjayBh
dXRob3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0
ZXMgbWFwcGVkIGZyb20gSFRNTC4KICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsK
LSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKyAgICAgICAgYWRkRWxl
bWVudFN0eWxlUHJvcGVydGllcyhtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9u
QXR0cmlidXRlU3R5bGUoKSk7CiAKICAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwg
bWFwcGVkIGRlY2xhcmF0aW9ucy4KICAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBz
aGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCiAgICAg
ICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVw
ZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCi0gICAgICAgIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRk
aXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworICAgICAgICBhZGRFbGVtZW50
U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2Vu
dGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CiAKICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKICAgICAgICAgICAgIGJvb2wgaXNBdXRvOwogICAg
ICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0
YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRl
KGlzQXV0byk7CiAgICAgICAgICAgICBpZiAoaXNBdXRvKQotICAgICAgICAgICAgICAgIGFkZE1h
dGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdo
dERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOworICAgICAgICAgICAg
ICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHRleHREaXJlY3Rpb24gPT0gTFRSID8g
bGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKICAg
ICAgICAgfQogICAgIH0KICAgICAKICAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNo
ZWV0cyBuZXh0LgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAg
bWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKyAgICBpZiAobWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzKQorICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGZhbHNlKTsKIAogICAgIC8vIE5v
dyBjaGVjayBvdXIgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KLSAgICBpZiAobV9tYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsKKyAgICBpZiAobWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpKSB7CiAgICAgICAgIC8vIElubGluZSBzdHlsZSBpcyBpbW11dGFi
bGUgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVyLgogICAgICAgICAvLyBGSVhN
RTogTWVkaWEgY29udHJvbCBzaGFkb3cgdHJlZXMgc2VlbSB0byBoYXZlIHByb2JsZW1zIHdpdGgg
Y2FjaGluZy4KICAgICAgICAgYm9vbCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAmJiAhbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7CiAgICAgICAgIC8vIEZJWE1FOiBDb25z
dGlmeS4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsK
KyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7CiAgICAgfQogCiAjaWYg
RU5BQkxFKFNWRykKICAgICAvLyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5
bGUuCi0gICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aXNTVkdFbGVtZW50KCkpCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMo
cmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkp
LT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8p
OworICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbWF0Y2hBdXRob3JBbmRVc2VyU3R5
bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pc1NWR0VsZW1lbnQoKSkKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhzdGF0
aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNN
SUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOwogI2Vsc2UKICAg
ICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKICNlbmRpZgogfQogCi1ib29s
IFN0eWxlUmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxp
dFN0cmluZyYgY2xhc3NOYW1lcykgY29uc3QKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgY2xhc3NOYW1lcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobV9ydWxlU2V0cy5mZWF0
dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzTmFtZXNbaV0uaW1wbCgpKSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlu
bGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQot
ewotICAgIG1fZWxlbWVudCA9IGU7Ci0gICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0
eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7Ci0gICAg
bV9lbGVtZW50TGlua1N0YXRlID0gZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUo
KS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUpIDogTm90SW5zaWRlTGluazsKLX0KLQotaW5saW5lIHZv
aWQgU3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKLXsKLSAgICBpZiAobV9z
dGF0ZS5lbGVtZW50KCkgIT0gZSkgewotICAgICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOwot
ICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7
Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxl
bWVudChmYWxzZSk7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNl
dE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW5saW5l
IHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQq
IGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIGNvbnN0IFBz
ZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcpCi17Ci0gICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJl
cXVlc3Q7Ci0gICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKLQotICAg
IGlmIChlKSB7Ci0gICAgICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQoZSk7Ci0gICAg
ICAgIG1fcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxl
KCk7Ci0gICAgICAgIG1fcGFyZW50U3R5bGUgPSBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5j
ZSgpID8gMCA6Ci0gICAgICAgICAgICBwYXJlbnRTdHlsZSA/IHBhcmVudFN0eWxlIDoKLSAgICAg
ICAgICAgIG1fcGFyZW50Tm9kZSA/IG1fcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA6IDA7Ci0g
ICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gY29udGV4dC5pbnNlcnRpb25Q
b2ludCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcGFyZW50Tm9kZSA9IDA7Ci0gICAgICAg
IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsKLSAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBOb2RlKiBkb2NFbGVtZW50ID0gZSA/
IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpIDogMDsKLSAgICBSZW5kZXJTdHlsZSog
ZG9jU3R5bGUgPSBkb2N1bWVudC0+cmVuZGVyU3R5bGUoKTsKLSAgICBtX3Jvb3RFbGVtZW50U3R5
bGUgPSBkb2NFbGVtZW50ICYmIGUgIT0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlclN0
eWxlKCkgOiBkb2NTdHlsZTsKLQotICAgIG1fc3R5bGUgPSAwOwotICAgIG1fcGVuZGluZ0ltYWdl
UHJvcGVydGllcy5jbGVhcigpOwotICAgIG1fcnVsZUxpc3QgPSAwOwotICAgIG1fZm9udERpcnR5
ID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hUaHJlc2hv
bGQgPSAxMDsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9s
ZCA9IDEwOwotCi1zdGF0aWMgaW5saW5lIGJvb2wgcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmlu
Zyhjb25zdCBFbGVtZW50KiBwYXJlbnRFbGVtZW50KQotewotICAgIGlmICghcGFyZW50RWxlbWVu
dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBwYXJlbnRFbGVtZW50LT5oYXNG
bGFnc1NldER1cmluZ1N0eWxpbmdPZkNoaWxkcmVuKCk7Ci19Ci0KLU5vZGUqIFN0eWxlUmVzb2x2
ZXI6OmxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5v
ZGVDb3VudCkgY29uc3QKLXsKLSAgICBpZiAodmlzaXRlZE5vZGVDb3VudCA+PSBjU3R5bGVTZWFy
Y2hUaHJlc2hvbGQgKiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+aXNTdHlsZWRFbGVtZW50KCkpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIGlmIChwYXJlbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIFN0eWxlZEVsZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxT
dHlsZWRFbGVtZW50Kj4ocGFyZW50KTsKLSAgICBpZiAocC0+aW5saW5lU3R5bGUoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAocC0+aXNTVkdFbGVtZW50KCkg
JiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHApLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRp
ZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICBpZiAocC0+aGFzSUQoKSAmJiBt
X3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhwLT5pZEZvclN0eWxlUmVz
b2x1dGlvbigpLmltcGwoKSkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlID0gcC0+cmVuZGVyU3R5bGUoKTsKLSAgICB1bnNpZ25lZCBzdWJjb3VudCA9
IDA7Ci0gICAgTm9kZSogdGhpc0NvdXNpbiA9IHA7Ci0gICAgTm9kZSogY3VycmVudE5vZGUgPSBw
LT5wcmV2aW91c1NpYmxpbmcoKTsKLQotICAgIC8vIFJlc2VydmUgdGhlIHRyaWVzIGZvciB0aGlz
IGxldmVsLiBUaGlzIGVmZmVjdGl2ZWx5IG1ha2VzIHN1cmUgdGhhdCB0aGUgYWxnb3JpdGhtCi0g
ICAgLy8gd2lsbCBuZXZlciBnbyBkZWVwZXIgdGhhbiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9s
ZCBsZXZlbHMgaW50byByZWN1cnNpb24uCi0gICAgdmlzaXRlZE5vZGVDb3VudCArPSBjU3R5bGVT
ZWFyY2hUaHJlc2hvbGQ7Ci0gICAgd2hpbGUgKHRoaXNDb3VzaW4pIHsKLSAgICAgICAgd2hpbGUg
KGN1cnJlbnROb2RlKSB7Ci0gICAgICAgICAgICArK3N1YmNvdW50OwotICAgICAgICAgICAgaWYg
KGN1cnJlbnROb2RlLT5yZW5kZXJTdHlsZSgpID09IHBhcmVudFN0eWxlICYmIGN1cnJlbnROb2Rl
LT5sYXN0Q2hpbGQoKQotICAgICAgICAgICAgICAgICYmIGN1cnJlbnROb2RlLT5pc0VsZW1lbnRO
b2RlKCkgJiYgIXBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcodG9FbGVtZW50KGN1cnJlbnRO
b2RlKSkKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICAgICAgICAgICAgICAmJiAhdG9FbGVt
ZW50KGN1cnJlbnROb2RlKS0+c2hhZG93KCkKLSNlbmRpZgotICAgICAgICAgICAgICAgICkgewot
ICAgICAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdW51c2VkIHJlc2VydmVkIHRyaWVzLgotICAg
ICAgICAgICAgICAgIHZpc2l0ZWROb2RlQ291bnQgLT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkIC0g
c3ViY291bnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQo
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdWJjb3VudCA+PSBjU3R5bGVTZWFy
Y2hUaHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBjdXJy
ZW50Tm9kZSA9IGN1cnJlbnROb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgfQotICAg
ICAgICBjdXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxl
bWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnRO
b2RlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnN0
eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCitib29s
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpoYXNBbnlNYXRjaGluZ1J1bGVzKFJ1bGVTZXQqIHJ1bGVT
ZXQpCiB7Ci0gICAgaWYgKCFydWxlU2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9z
dGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CiAK
LSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMpOworICAg
IG1fbW9kZSA9IFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzOwogICAgIGludCBmaXJzdFJ1
bGVJbmRleCA9IC0xLCBsYXN0UnVsZUluZGV4ID0gLTE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5n
ZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVs
ZVJhbmdlIHJ1bGVSYW5nZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7CiAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOwotICAg
IG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLSAgICBp
ZiAobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxl
ZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiB0aGlzSW5wdXRFbGVtZW50ID0gZWxlbWVudC0+
dG9JbnB1dEVsZW1lbnQoKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBvdGhlcklucHV0RWxlbWVu
dCA9IHN0YXRlLmVsZW1lbnQoKS0+dG9JbnB1dEVsZW1lbnQoKTsKLQotICAgIGlmICghdGhpc0lu
cHV0RWxlbWVudCB8fCAhb3RoZXJJbnB1dEVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5lbGVtZW50RGF0YSgpICE9IG90aGVySW5wdXRF
bGVtZW50LT5lbGVtZW50RGF0YSgpKSB7Ci0gICAgICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5m
YXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0
dHJpYnV0ZSh0eXBlQXR0cikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlm
ICh0aGlzSW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0cikgIT0gb3Ro
ZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNB
dXRvZmlsbGVkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzQXV0b2ZpbGxlZCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNo
ZWNrZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1p
bmF0ZSgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5hdGUoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkgIT0g
b3RoZXJJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgaWYgKGVsZW1lbnQtPmlzRW5hYmxlZEZvcm1Db250cm9sKCkgIT0gc3RhdGUuZWxlbWVu
dCgpLT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoZWxlbWVudC0+aXNEZWZhdWx0QnV0dG9uRm9yRm9ybSgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNEZWZhdWx0QnV0dG9uRm9yRm9ybSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoc3RhdGUuZG9jdW1lbnQoKS0+Y29udGFpbnNWYWxpZGl0eVN0eWxlUnVsZXMoKSkgewot
ICAgICAgICBib29sIHdpbGxWYWxpZGF0ZSA9IGVsZW1lbnQtPndpbGxWYWxpZGF0ZSgpOwotCi0g
ICAgICAgIGlmICh3aWxsVmFsaWRhdGUgIT0gc3RhdGUuZWxlbWVudCgpLT53aWxsVmFsaWRhdGUo
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAod2lsbFZhbGlkYXRl
ICYmIChlbGVtZW50LT5pc1ZhbGlkRm9ybUNvbnRyb2xFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVu
dCgpLT5pc1ZhbGlkRm9ybUNvbnRyb2xFbGVtZW50KCkpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgICAgIGlmIChlbGVtZW50LT5pc0luUmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50
KCktPmlzSW5SYW5nZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlm
IChlbGVtZW50LT5pc091dE9mUmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzT3V0T2ZSYW5n
ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVl
OwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oRWxlbWVu
dCogZWxlbWVudCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBsaW5lIGlzIHN1cnByaXNpbmdseSBo
b3QsIHdlIG1heSB3aXNoIHRvIGlubGluZSBoYXNEaXJlY3Rpb25BdXRvIGludG8gU3R5bGVSZXNv
bHZlci4KLSAgICByZXR1cm4gZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpICYmIHRvSFRNTEVsZW1l
bnQoZWxlbWVudCktPmhhc0RpcmVjdGlvbkF1dG8oKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVy
OjpzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0
eWxlZEVsZW1lbnQqIHNoYXJpbmdDYW5kaWRhdGUpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5lbGVtZW50RGF0YSgp
ID09IHNoYXJpbmdDYW5kaWRhdGUtPmVsZW1lbnREYXRhKCkpCi0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6Omxh
bmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjps
YW5nQXR0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgp
LT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0
QXR0cmlidXRlKGxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFz
dGF0ZS5lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSkgewotICAgICAgICBpZiAoc2hhcmlu
Z0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHNoYXJp
bmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfSBlbHNlIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpKSB7Ci0jaWYgRU5BQkxF
KFNWRykKLSAgICAgICAgLy8gU1ZHIGVsZW1lbnRzIHJlcXVpcmUgYSAoc2xvdyEpIGdldEF0dHJp
YnV0ZSBjb21wYXJpc2lvbiBiZWNhdXNlICJjbGFzcyIgaXMgYW4gYW5pbWF0YWJsZSBhdHRyaWJ1
dGUgZm9yIFNWRy4KLSAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkp
IHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShjbGFzc0F0
dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSNlbmRpZgotICAgICAg
ICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygpICE9IHNoYXJpbmdDYW5kaWRh
dGUtPmNsYXNzTmFtZXMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0jaWYgRU5B
QkxFKFNWRykKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiBm
YWxzZTsKIAotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJp
YnV0ZVN0eWxlKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1F
TlQpCi0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aGFzVGFnTmFtZShwcm9ncmVzc1RhZykpIHsK
LSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihzdGF0ZS5lbGVt
ZW50KCkpLT5pc0RldGVybWluYXRlKCkgIT0gc3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVu
dCo+KHNoYXJpbmdDYW5kaWRhdGUpLT5pc0RldGVybWluYXRlKCkpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBT
dHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCogZWxl
bWVudCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBlbGVtZW50LT5yZW5kZXJT
dHlsZSgpOwotICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAoIXN0
eWxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlxdWUoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+aGFzVW5pcXVlUHNldWRvU3R5bGUo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT50YWdRTmFtZSgpICE9
IHN0YXRlLmVsZW1lbnQoKS0+dGFnUU5hbWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGlmIChlbGVtZW50LT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
I2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKGVsZW1lbnQtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRp
Y19jYXN0PFNWR0VsZW1lbnQqPihlbGVtZW50KS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVz
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIGlmIChlbGVtZW50LT5pc0xp
bmsoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKGVsZW1lbnQtPmhvdmVyZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmhvdmVyZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5hY3RpdmUoKSAhPSBz
dGF0ZS5lbGVtZW50KCktPmFjdGl2ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYg
KGVsZW1lbnQtPmZvY3VzZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmZvY3VzZWQoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpICE9IHN0
YXRlLmVsZW1lbnQoKS0+c2hhZG93UHNldWRvSWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2Fs
U3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKGVsZW1lbnQtPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgp
ICE9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5oYXNJ
RCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGVsZW1lbnQt
PmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChlbGVtZW50LT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHNoYXJlIHN0eWxlIGZvciBvcHRp
b24gYW5kIG9wdGdyb3VwIHdoZW5ldmVyIHBvc3NpYmxlLgotICAgIC8vIEJlZm9yZSBkb2luZyBz
bywgd2UgbmVlZCB0byByZXNvbHZlIGlzc3VlcyBpbiBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxj
TGlzdEl0ZW1zCi0gICAgLy8gYW5kIFJlbmRlck1lbnVMaXN0OjpzZXRUZXh0LiBTZWUgYWxzbyBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg0MDUKLSAgICBpZiAoZWxl
bWVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0Z3Jv
dXBUYWcpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGlzQ29udHJvbCA9IGVs
ZW1lbnQtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCk7Ci0KLSAgICBpZiAoaXNDb250cm9sICE9IHN0
YXRlLmVsZW1lbnQoKS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKGlzQ29udHJvbCAmJiAhY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKGVs
ZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoc3R5bGUtPnRyYW5zaXRp
b25zKCkgfHwgc3R5bGUtPmFuaW1hdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0j
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIC8vIFR1cm4gb2ZmIHN0eWxlIHNo
YXJpbmcgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdhaW4gbGF5ZXJzIGZvciByZWFzb25zIG91dHNp
ZGUgb2YgdGhlIHN0eWxlIHN5c3RlbS4KLSAgICAvLyBTZWUgY29tbWVudHMgaW4gUmVuZGVyT2Jq
ZWN0OjpzZXRTdHlsZSgpLgotICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKGlmcmFtZVRhZykg
fHwgZWxlbWVudC0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShl
bWJlZFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvYmplY3RUYWcpIHx8IGVsZW1lbnQtPmhh
c1RhZ05hbWUoYXBwbGV0VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGNhbnZhc1RhZykKLSNp
ZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAgICAgICAgLy8gV2l0aCBwcm94eWlu
ZywgdGhlIG1lZGlhIGVsZW1lbnRzIGFyZSBiYWNrZWQgYnkgYSBSZW5kZXJFbWJlZGRlZE9iamVj
dC4KLSAgICAgICAgfHwgZWxlbWVudC0+aGFzVGFnTmFtZSh2aWRlb1RhZykgfHwgZWxlbWVudC0+
aGFzVGFnTmFtZShhdWRpb1RhZykKLSNlbmRpZgotICAgICAgICApCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSNlbmRpZgotCi0gICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKGVsZW1lbnQp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgJiYg
c3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpICE9IHN0eWxlLT5pbnNpZGVMaW5rKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICAvLyBEZW55IHNo
YXJpbmcgc3R5bGVzIGJldHdlZW4gV2ViVlRUIGFuZCBub24tV2ViVlRUIG5vZGVzLgotICAgIGlm
IChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRU
RWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNX
ZWJWVFRFbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSAmJiB0
b1dlYlZUVEVsZW1lbnQoZWxlbWVudCktPmlzUGFzdE5vZGUoKSAhPSB0b1dlYlZUVEVsZW1lbnQo
c3RhdGUuZWxlbWVudCgpKS0+aXNQYXN0Tm9kZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0j
ZW5kaWYKLQotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKLSAgICBpZiAoZWxlbWVudCA9PSBl
bGVtZW50LT5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSB8fCBz
dGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3Jl
ZW5FbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIHJldHVybiB0
cnVlOwotfQotCi1pbmxpbmUgU3R5bGVkRWxlbWVudCogU3R5bGVSZXNvbHZlcjo6ZmluZFNpYmxp
bmdGb3JTdHlsZVNoYXJpbmcoTm9kZSogbm9kZSwgdW5zaWduZWQmIGNvdW50KSBjb25zdAotewot
ICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAg
ICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICBpZiAoY2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KHN0YXRpY19jYXN0PFN0eWxlZEVs
ZW1lbnQqPihub2RlKSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGNvdW50Kysg
PT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSk7Ci19Ci0KLVJlbmRl
clN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWRTdHlsZSgpCi17Ci0gICAgU3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlZEVsZW1lbnQoKSB8fCAhc3Rh
dGUucGFyZW50U3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJZiB0aGUgZWxl
bWVudCBoYXMgaW5saW5lIHN0eWxlIGl0IGlzIHByb2JhYmx5IHVuaXF1ZS4KLSAgICBpZiAoc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVu
dCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihzdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5h
bmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYK
LSAgICAvLyBJZHMgc3RvcCBzdHlsZSBzaGFyaW5nIGlmIHRoZXkgc2hvdyB1cCBpbiB0aGUgc3R5
bGVzaGVldHMuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzSUQoKSAmJiBtX3J1
bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJl
bnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBpZiAoc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oc3RhdGUu
ZWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDYWNoZSB3aGV0aGVyIHN0
YXRlLmVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkgYW55IGtub3duIGNsYXNzIHNlbGVjdG9ycy4KLSAg
ICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1iZXIgdmFyaWFibGUuIFRoZSBzdHls
ZSBzaGFyaW5nIGNvZGUgY291bGQgYmUgZmFjdG9yZWQgb3V0IG9mIFN0eWxlUmVzb2x2ZXIuCi0g
ICAgc3RhdGUuc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKHN0YXRlLmVsZW1lbnQoKSAm
JiBzdGF0ZS5lbGVtZW50KCktPmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxl
cyhzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSkpOwotCi0gICAgLy8gQ2hlY2sgcHJldmlv
dXMgc2libGluZ3MgYW5kIHRoZWlyIGNvdXNpbnMuCi0gICAgdW5zaWduZWQgY291bnQgPSAwOwot
ICAgIHVuc2lnbmVkIHZpc2l0ZWROb2RlQ291bnQgPSAwOwotICAgIFN0eWxlZEVsZW1lbnQqIHNo
YXJlRWxlbWVudCA9IDA7Ci0gICAgTm9kZSogY291c2luTGlzdCA9IHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKGNvdXNpbkxpc3QpIHsKLSAgICAg
ICAgc2hhcmVFbGVtZW50ID0gZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoY291c2luTGlzdCwg
Y291bnQpOwotICAgICAgICBpZiAoc2hhcmVFbGVtZW50KQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNvdXNpbkxpc3QgPSBsb2NhdGVDb3VzaW5MaXN0KGNvdXNpbkxpc3QtPnBhcmVudEVs
ZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgaGF2ZSBl
eGhhdXN0ZWQgYWxsIG91ciBidWRnZXQgb3Igb3VyIGNvdXNpbnMuCi0gICAgaWYgKCFzaGFyZUVs
ZW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgc2libGlu
ZyBydWxlcyBhcHBseS4gVGhpcyBpcyBjaGVja2VkIGF0IHRoZSBlbmQgYXMgaXQgc2hvdWxkIHJh
cmVseSBmYWlsLgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldCht
X3J1bGVTZXRzLnNpYmxpbmcoKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8vIENhbid0IHNo
YXJlIGlmIGF0dHJpYnV0ZSBydWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy51bmNvbW1vbkF0dHJpYnV0ZSgpKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgQGhvc3QgQC1ydWxlcyBhcHBseS4K
LSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAvLyBUcmFja2luZyBjaGlsZCBpbmRleCByZXF1aXJlcyB1bmlxdWUg
c3R5bGUgZm9yIGVhY2ggbm9kZS4gVGhpcyBtYXkgZ2V0IHNldCBieSB0aGUgc2libGluZyBydWxl
IG1hdGNoIGFib3ZlLgotICAgIGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRl
LmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0
dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
OjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBNYXRjaGluZ1VBUnVs
ZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVz
ZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6c2ltcGxlRGVm
YXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOwotICAg
IFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21lZGl1bS0+bWVkaWFUeXBlTWF0Y2hT
cGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKLSAgICBt
YXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAgIC8vIEluIHF1
aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVl
dC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAgIG1hdGNoVUFS
dWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlKTsK
LQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChpbiB2aWV3IHNv
dXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2ggcnVsZXMgZnJv
bSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50KCktPmlzVmll
d1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0U3R5bGVzRm9y
UGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdpbmF0aW9uTW9kZSwgUmVuZGVyU3R5
bGUqIHN0eWxlKQotewotICAgIGlmIChwYWdpbmF0aW9uTW9kZSA9PSBQYWdpbmF0aW9uOjpVbnBh
Z2luYXRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBzd2l0Y2ggKHBhZ2luYXRp
b25Nb2RlKSB7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpMZWZ0VG9SaWdodFBhZ2luYXRlZDoKLSAg
ICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOwotICAgICAg
ICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHls
ZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/
IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxl
LT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9u
IDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBh
Z2luYXRpb246OlJpZ2h0VG9MZWZ0UGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29sdW1u
QXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lv
bihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNz
aW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRp
bmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVz
c2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VG9wVG9Cb3R0b21Q
YWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhp
cyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tz
V3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblBy
b2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblBy
b2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Q
cm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgUGFnaW5hdGlvbjo6Qm90dG9tVG9Ub3BQYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxl
LT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Q
cm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENv
bHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VW5w
YWdpbmF0ZWQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsK
LSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGNvbnN0
IFJlbmRlclN0eWxlKiBzdHlsZSwgRm9udE9yaWVudGF0aW9uJiBmb250T3JpZW50YXRpb24sIE5v
bkNKS0dseXBoT3JpZW50YXRpb24mIGdseXBoT3JpZW50YXRpb24pCi17Ci0gICAgaWYgKHN0eWxl
LT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9
IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVu
dGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRj
aCAoc3R5bGUtPnRleHRPcmllbnRhdGlvbigpKSB7Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25W
ZXJ0aWNhbFJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAg
ICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0
OwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25VcHJpZ2h0OgotICAg
ICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlv
biA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25VcHJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAg
Y2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5czoKLSAgICAgICAgaWYgKHN0eWxlLT53cml0aW5n
TW9kZSgpID09IExlZnRUb1JpZ2h0V3JpdGluZ01vZGUpIHsKLSAgICAgICAgICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCBtYXAgdG8gc2lkZXdheXMtbGVmdCwgd2hpY2ggaXMgbm90IHN1cHBvcnRl
ZCB5ZXQuCi0gICAgICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAg
ICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdo
dDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb250T3JpZW50YXRp
b24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhP
cmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRleHRP
cmllbnRhdGlvblNpZGV3YXlzUmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6
b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9u
VmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFs
OwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRp
Y2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50
LCBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcikKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKTsKLQotICAgIC8vIEhUTUw1IHN0YXRlcyB0aGF0IHNlYW1sZXNzIGlm
cmFtZXMgc2hvdWxkIHJlcGxhY2UgZGVmYXVsdCBDU1MgdmFsdWVzCi0gICAgLy8gd2l0aCB2YWx1
ZXMgaW5oZXJpdGVkIGZyb20gdGhlIGNvbnRhaW5pbmcgaWZyYW1lIGVsZW1lbnQuIEhvd2V2ZXIs
Ci0gICAgLy8gc29tZSB2YWx1ZXMgKHN1Y2ggYXMgdGhlIGNhc2Ugb2YgZGVzaWduTW9kZSA9ICJv
biIpIHN0aWxsIG5lZWQgdG8KLSAgICAvLyBiZSBzZXQgYnkgdGhpcyAiZG9jdW1lbnQgc3R5bGUi
LgotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gZG9jdW1lbnRTdHlsZSA9IFJlbmRlclN0eWxlOjpj
cmVhdGUoKTsKLSAgICBib29sIHNlYW1sZXNzV2l0aFBhcmVudCA9IGRvY3VtZW50LT5zaG91bGRE
aXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKTsKLSAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50
KSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBpZnJhbWVTdHlsZSA9IGRvY3VtZW50LT5zZWFtbGVz
c1BhcmVudElGcmFtZSgpLT5yZW5kZXJTdHlsZSgpOwotICAgICAgICBpZiAoaWZyYW1lU3R5bGUp
Ci0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5pbmhlcml0RnJvbShpZnJhbWVTdHlsZSk7Ci0g
ICAgfQotCi0gICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHdoaWNoIHZhbHVlcyBiZWxvdyB3
ZSB3YW50IHRvIG92ZXJyaWRlIGluIHRoZSBzZWFtbGVzcyBjYXNlIQotICAgIGRvY3VtZW50U3R5
bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgIGlmICghc2VhbWxlc3NXaXRoUGFyZW50KSB7Ci0g
ICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFJUTE9yZGVyaW5nKGRvY3VtZW50LT52aXN1YWxseU9y
ZGVyZWQoKSA/IFZpc3VhbE9yZGVyIDogTG9naWNhbE9yZGVyKTsKLSAgICAgICAgZG9jdW1lbnRT
dHlsZS0+c2V0Wm9vbShmcmFtZSAmJiAhZG9jdW1lbnQtPnByaW50aW5nKCkgPyBmcmFtZS0+cGFn
ZVpvb21GYWN0b3IoKSA6IDEpOwotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRQYWdlU2NhbGVU
cmFuc2Zvcm0oZnJhbWUgPyBmcmFtZS0+ZnJhbWVTY2FsZUZhY3RvcigpIDogMSk7Ci0gICAgICAg
IGRvY3VtZW50U3R5bGUtPnNldExvY2FsZShkb2N1bWVudC0+Y29udGVudExhbmd1YWdlKCkpOwot
ICAgIH0KLSAgICAvLyBUaGlzIG92ZXJyaWRlcyBhbnkgLXdlYmtpdC11c2VyLW1vZGlmeSBpbmhl
cml0ZWQgZnJvbSB0aGUgcGFyZW50IGlmcmFtZS4KLSAgICBkb2N1bWVudFN0eWxlLT5zZXRVc2Vy
TW9kaWZ5KGRvY3VtZW50LT5pbkRlc2lnbk1vZGUoKSA/IFJFQURfV1JJVEUgOiBSRUFEX09OTFkp
OwotCi0gICAgRWxlbWVudCogZG9jRWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQo
KTsKLSAgICBSZW5kZXJPYmplY3QqIGRvY0VsZW1lbnRSZW5kZXJlciA9IGRvY0VsZW1lbnQgPyBk
b2NFbGVtZW50LT5yZW5kZXJlcigpIDogMDsKLSAgICBpZiAoZG9jRWxlbWVudFJlbmRlcmVyKSB7
Ci0gICAgICAgIC8vIFVzZSB0aGUgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgb2YgdGhlIGJv
ZHkgdG8gc2V0IHRoZQotICAgICAgICAvLyB2aWV3cG9ydCdzIGRpcmVjdGlvbiBhbmQgd3JpdGlu
Zy1tb2RlIHVubGVzcyB0aGUgcHJvcGVydHkgaXMgc2V0IG9uIHRoZSBkb2N1bWVudCBlbGVtZW50
LgotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBib2R5LCB0aGVuIHVzZSB0aGUgZG9jdW1lbnQg
ZWxlbWVudC4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBib2R5UmVuZGVyZXIgPSBkb2N1bWVudC0+
Ym9keSgpID8gZG9jdW1lbnQtPmJvZHkoKS0+cmVuZGVyZXIoKSA6IDA7Ci0gICAgICAgIGlmIChi
b2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50
KCkpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShib2R5UmVuZGVy
ZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCkt
PndyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+
ZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5
bGUtPnNldERpcmVjdGlvbihib2R5UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGRvY0Vs
ZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOwotICAgIH0KLQotICAgIGlmIChm
cmFtZSkgewotICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygp
KSB7Ci0gICAgICAgICAgICBjb25zdCBQYWdpbmF0aW9uJiBwYWdpbmF0aW9uID0gZnJhbWVWaWV3
LT5wYWdpbmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFnaW5hdGlvbi5tb2RlICE9IFBhZ2lu
YXRpb246OlVucGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5h
dGlvbk1vZGUocGFnaW5hdGlvbi5tb2RlLCBkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAgICAgICAg
ICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRDb2x1bW5HYXAocGFnaW5hdGlvbi5nYXApOwotICAg
ICAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3KiB2aWV3ID0gZG9jdW1lbnQtPnJlbmRlclZpZXco
KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmlldy0+aGFzQ29sdW1ucygpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgdmlldy0+dXBkYXRlQ29sdW1uSW5mb0Zyb21TdHlsZShkb2N1bWVu
dFN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIHdhbnQgdG8gaW5oZXJpdCB0aGVp
ciBmb250IGZyb20gdGhlaXIgcGFyZW50IGlmcmFtZSwgc28gZWFybHkgcmV0dXJuIGJlZm9yZSBz
ZXR0aW5nIHRoZSBmb250LgotICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpCi0gICAgICAgIHJl
dHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBmb250
RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1Njcmlw
dENvZGVGb3JGb250U2VsZWN0aW9uKGRvY3VtZW50U3R5bGUtPmxvY2FsZSgpKSk7Ci0gICAgaWYg
KFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpKSB7Ci0gICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSB8fCAh
c2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUo
KSk7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250ID0gc2V0dGluZ3Mt
PnN0YW5kYXJkRm9udEZhbWlseShmb250RGVzY3JpcHRpb24uc2NyaXB0KCkpOwotICAgICAgICBp
ZiAoIXN0YW5kYXJkRm9udC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwotICAg
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJk
Rm9udCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRG
YW1pbHkoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRT
aXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgICAgIGludCBz
aXplID0gU3R5bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50LCBDU1NWYWx1
ZU1lZGl1bSwgZmFsc2UpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6
ZShzaXplKTsKLSAgICAgICAgYm9vbCB1c2VTVkdab29tUnVsZXMgPSBkb2N1bWVudC0+aXNTVkdE
b2N1bWVudCgpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKFN0eWxl
UmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCBkb2N1
bWVudFN0eWxlLmdldCgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwg
dXNlU1ZHWm9vbVJ1bGVzKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSk7Ci0KLSAgICBGb250T3JpZW50
YXRpb24gZm9udE9yaWVudGF0aW9uOwotICAgIE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhP
cmllbnRhdGlvbjsKLSAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihkb2N1bWVudFN0eWxl
LmdldCgpLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOwotICAgIGZvbnREZXNjcmlw
dGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOwotCi0gICAg
ZG9jdW1lbnRTdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAg
ZG9jdW1lbnRTdHlsZS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IpOwotCi0gICAgcmV0dXJu
IGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdFNo
YWRvd0JvdW5kYXJ5KGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKCFlbGVtZW50
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSA9
IGVsZW1lbnQtPnBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSAmJiBwYXJlbnRO
b2RlLT5pc1NoYWRvd1Jvb3QoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVS
ZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIFJlbmRlclN0eWxlKiBk
ZWZhdWx0UGFyZW50LAotICAgIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHNoYXJpbmdCZWhhdmlvciwg
UnVsZU1hdGNoaW5nQmVoYXZpb3IgbWF0Y2hpbmdCZWhhdmlvciwgUmVuZGVyUmVnaW9uKiByZWdp
b25Gb3JTdHlsaW5nKQotewotICAgIC8vIE9uY2UgYW4gZWxlbWVudCBoYXMgYSByZW5kZXJlciwg
d2UgZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgaXQsIHNpbmNlIG90aGVyd2lzZSB0aGUgcmVuZGVyZXIK
LSAgICAvLyB3aWxsIHZhbmlzaCBpZiBhIHN0eWxlIHJlY2FsYyBoYXBwZW5zIGR1cmluZyBsb2Fk
aW5nLgotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIWVs
ZW1lbnQtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpICYmICFlbGVtZW50LT5y
ZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICghc19zdHlsZU5vdFlldEF2YWlsYWJsZSkgewotICAg
ICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKS5s
ZWFrUmVmKCk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5zZXREaXNwbGF5
KE5PTkUpOwotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+Zm9udCgpLnVwZGF0
ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC0+ZG9jdW1lbnQo
KS0+c2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgpOwotICAgICAgICByZXR1cm4gc19z
dHlsZU5vdFlldEF2YWlsYWJsZTsKLSAgICB9Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29s
dmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZv
clN0eWxpbmcpOwotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcg
JiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIFJlbmRl
clN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJlZFN0eWxlKCk7Ci0gICAgICAgIGlmIChz
aGFyZWRTdHlsZSkKLSAgICAgICAgICAgIHJldHVybiBzaGFyZWRTdHlsZTsKLSAgICB9Ci0KLSAg
ICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNsb25lRm9yUGFyZW50OwotCi0gICAgaWYgKHN0YXRlLnBh
cmVudFN0eWxlKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0
ZSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oc3RhdGUucGFyZW50U3R5
bGUoKSwgaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpID8gUmVuZGVyU3R5bGU6OkF0U2hhZG93
Qm91bmRhcnkgOiBSZW5kZXJTdHlsZTo6Tm90QXRTaGFkb3dCb3VuZGFyeSk7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpKTsKLSAg
ICAgICAgY2xvbmVGb3JQYXJlbnQgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3RhdGUuc3R5bGUoKSk7
Ci0gICAgICAgIHN0YXRlLnNldFBhcmVudFN0eWxlKGNsb25lRm9yUGFyZW50LmdldCgpKTsKLSAg
ICB9Ci0gICAgLy8gY29udGVudGVkaXRhYmxlIGF0dHJpYnV0ZSAoaW1wbGVtZW50ZWQgYnkgLXdl
YmtpdC11c2VyLW1vZGlmeSkgc2hvdWxkCi0gICAgLy8gYmUgcHJvcGFnYXRlZCBmcm9tIHNoYWRv
dyBob3N0IHRvIGRpc3RyaWJ1dGVkIG5vZGUuCi0gICAgaWYgKHN0YXRlLmRpc3RyaWJ1dGVkVG9J
bnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIGlmIChFbGVtZW50KiBwYXJlbnQgPSBlbGVtZW50
LT5wYXJlbnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJTdHlsZSogc3R5bGVP
ZlNoYWRvd0hvc3QgPSBwYXJlbnQtPnJlbmRlclN0eWxlKCkpCi0gICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0VXNlck1vZGlmeShzdHlsZU9mU2hhZG93SG9zdC0+dXNlck1vZGlmeSgp
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSkgewotICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJc0xpbmsodHJ1ZSk7Ci0gICAgICAgIEVJbnNpZGVMaW5r
IGxpbmtTdGF0ZSA9IHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUoKTsKLSAgICAgICAgaWYgKGxpbmtT
dGF0ZSAhPSBOb3RJbnNpZGVMaW5rKSB7Ci0gICAgICAgICAgICBib29sIGZvcmNlVmlzaXRlZCA9
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6Zm9yY2VQc2V1ZG9TdGF0ZShlbGVtZW50LCBDU1NT
ZWxlY3Rvcjo6UHNldWRvVmlzaXRlZCk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VWaXNpdGVkKQot
ICAgICAgICAgICAgICAgIGxpbmtTdGF0ZSA9IEluc2lkZVZpc2l0ZWRMaW5rOwotICAgICAgICB9
Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXRlKTsKLSAgICB9
Ci0KLSAgICBib29sIG5lZWRzQ29sbGVjdGlvbiA9IGZhbHNlOwotICAgIENTU0RlZmF1bHRTdHls
ZVNoZWV0czo6ZW5zdXJlRGVmYXVsdFN0eWxlU2hlZXRzRm9yRWxlbWVudChlbGVtZW50LCBuZWVk
c0NvbGxlY3Rpb24pOwotICAgIGlmIChuZWVkc0NvbGxlY3Rpb24pCi0gICAgICAgIG1fcnVsZVNl
dHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCBtX3Njb3BlUmVz
b2x2ZXIuZ2V0KCkpOwotCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7Ci0gICAgaWYgKG1h
dGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1hdGNo
VUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0gICAgZWxzZQotICAgICAgICBtYXRjaEFsbFJ1bGVzKG1h
dGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlM
KTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGVsZW1lbnQpOwot
Ci0gICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVj
b3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCi0gICAgYWRqdXN0UmVuZGVyU3R5bGUoc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxlbWVudCk7Ci0KLSAgICBzdGF0ZS5j
bGVhcigpOyAvLyBDbGVhciBvdXQgZm9yIHRoZSBuZXh0IHJlc29sdmUuCi0KLSAgICBkb2N1bWVu
dCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBz
dHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5
bGUqIGVsZW1lbnRTdHlsZSwgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUsIEtleWZyYW1l
VmFsdWUmIGtleWZyYW1lVmFsdWUpCi17Ci0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwotICAgIGlm
IChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhy
ZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwotCi0gICAgQVNTRVJUKCFtX3N0YXRlLnN0
eWxlKCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIC8vIENyZWF0ZSB0
aGUgc3R5bGUKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y2xvbmUoZWxlbWVudFN0
eWxlKSk7Ci0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotCi0gICAgLy8gV2UgZG9u
J3QgbmVlZCB0byBib3RoZXIgd2l0aCAhaW1wb3J0YW50LiBTaW5jZSB0aGVyZSBpcyBvbmx5IGV2
ZXIgb25lCi0gICAgLy8gZGVjbCwgdGhlcmUncyBub3RoaW5nIHRvIG92ZXJyaWRlLiBTbyBqdXN0
IGFkZCB0aGUgZmlyc3QgcHJvcGVydGllcy4KLSAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxz
ZTsKLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAv
LyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCi0g
ICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJl
IHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplCi0gICAgaWYgKHN0YXRlLmxpbmVIZWln
aHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwg
c3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgLy8gTm93IGRvIHJlc3Qgb2YgdGhlIHBy
b3BlcnRpZXMuCi0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAgICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAw
LCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0K
LSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCBieSBvbmUgb2YgdGhlIG5vbi1lc3NlbnRp
YWwgZm9udCBwcm9wcywKLSAgICAvLyBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IGEgc2Vjb25kIHRp
bWUuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMg
cmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0g
ICAgCi0gICAgLy8gQWRkIGFsbCB0aGUgYW5pbWF0aW5nIHByb3BlcnRpZXMgdG8gdGhlIGtleWZy
YW1lLgotICAgIGlmIChjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBzdHlsZURlY2xhcmF0aW9uID0g
a2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkgewotICAgICAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50
ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlDb3VudCgpOwotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBDU1NQcm9w
ZXJ0eUlEIHByb3BlcnR5ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlBdChpKS5pZCgpOwot
ICAgICAgICAgICAgLy8gVGltaW5nLWZ1bmN0aW9uIHdpdGhpbiBrZXlmcmFtZXMgaXMgc3BlY2lh
bCwgYmVjYXVzZSBpdCBpcyBub3QgYW5pbWF0ZWQ7IGl0IGp1c3QKLSAgICAgICAgICAgIC8vIGRl
c2NyaWJlcyB0aGUgdGltaW5nIGZ1bmN0aW9uIGJldHdlZW4gdGhpcyBrZXlmcmFtZSBhbmQgdGhl
IG5leHQuCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gQ1NTUHJvcGVydHlXZWJraXRBbmlt
YXRpb25UaW1pbmdGdW5jdGlvbikKLSAgICAgICAgICAgICAgICBrZXlmcmFtZVZhbHVlLmFkZFBy
b3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRvY3VtZW50KCktPmRp
ZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjprZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVt
ZW50KiBlLCBjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBLZXlmcmFtZUxpc3QmIGxp
c3QpCi17Ci0gICAgbGlzdC5jbGVhcigpOwotCi0gICAgLy8gR2V0IHRoZSBrZXlmcmFtZXNSdWxl
IGZvciB0aGlzIG5hbWUKLSAgICBpZiAoIWUgfHwgbGlzdC5hbmltYXRpb25OYW1lKCkuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2tleWZyYW1lc1J1bGVNYXAuY2hlY2tDb25z
aXN0ZW5jeSgpOwotCi0gICAgS2V5ZnJhbWVzUnVsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2tleWZy
YW1lc1J1bGVNYXAuZmluZChsaXN0LmFuaW1hdGlvbk5hbWUoKS5pbXBsKCkpOwotICAgIGlmIChp
dCA9PSBtX2tleWZyYW1lc1J1bGVNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNv
bnN0IFN0eWxlUnVsZUtleWZyYW1lcyoga2V5ZnJhbWVzUnVsZSA9IGl0LT52YWx1ZS5nZXQoKTsK
LQotICAgIC8vIENvbnN0cnVjdCBhbmQgcG9wdWxhdGUgdGhlIHN0eWxlIGZvciBlYWNoIGtleWZy
YW1lCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZUtleWZyYW1lPiA+JiBrZXlmcmFtZXMg
PSBrZXlmcmFtZXNSdWxlLT5rZXlmcmFtZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwga2V5ZnJhbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIC8vIEFwcGx5IHRoZSBkZWNsYXJh
dGlvbiB0byB0aGUgc3R5bGUuIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGxv
Z2ljIGluIHN0eWxlRm9yRWxlbWVudAotICAgICAgICBpbml0RWxlbWVudChlKTsKLSAgICAgICAg
bV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUpOwotCi0gICAgICAgIGNv
bnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lID0ga2V5ZnJhbWVzW2ldLmdldCgpOwotCi0gICAg
ICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKLSAgICAgICAga2V5ZnJhbWVW
YWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwga2V5ZnJhbWUsIGtl
eWZyYW1lVmFsdWUpKTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBrZXlmcmFtZSBzdHlsZSB0byBh
bGwgdGhlIGluZGljYXRlZCBrZXkgdGltZXMKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBrZXlzOwot
ICAgICAgICBrZXlmcmFtZS0+Z2V0S2V5cyhrZXlzKTsKLSAgICAgICAgZm9yIChzaXplX3Qga2V5
SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMuc2l6ZSgpOyArK2tleUluZGV4KSB7Ci0gICAgICAg
ICAgICBrZXlmcmFtZVZhbHVlLnNldEtleShrZXlzW2tleUluZGV4XSk7Ci0gICAgICAgICAgICBs
aXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElm
IHRoZSAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJl
IGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKLSAgICBpbnQgaW5pdGlhbExpc3RTaXpl
ID0gbGlzdC5zaXplKCk7Ci0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgbGlzdFswXS5r
ZXkoKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogemVyb1BlcmNlbnRLZXlmcmFt
ZTsKLSAgICAgICAgaWYgKCF6ZXJvUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAgICAgICB6ZXJv
UGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAg
ICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMCUiKTsKLSAgICAgICAg
fQotICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7Ci0gICAgICAgIGtl
eWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIHplcm9Q
ZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLSAgICAgICAgbGlzdC5pbnNlcnQoa2V5
ZnJhbWVWYWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIDEwMCUga2V5ZnJhbWUgaXMgbWlz
c2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIg
a2V5ZnJhbWUpCi0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgKGxpc3RbbGlzdC5zaXpl
KCkgLSAxXS5rZXkoKSAhPSAxKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogaHVu
ZHJlZFBlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCFodW5kcmVkUGVyY2VudEtleWZyYW1l
KSB7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6
Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZS0+
c2V0S2V5VGV4dCgiMTAwJSIpOwotICAgICAgICB9Ci0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5
ZnJhbWVWYWx1ZSgxLCAwKTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZv
cktleWZyYW1lKGVsZW1lbnRTdHlsZSwgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVW
YWx1ZSkpOwotICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICB9Ci19Ci0K
LVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxl
bWVudChFbGVtZW50KiBlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVx
dWVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIEFTU0VSVChwYXJlbnRTdHls
ZSk7Ci0gICAgaWYgKCFlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLQotICAgIHN0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUsIHBzZXVkb1N0eWxlUmVxdWVzdCk7
Ci0gICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICBzdGF0ZS5z
dHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotCi0gICAgLy8gU2lu
Y2Ugd2UgZG9uJ3QgdXNlIHBzZXVkby1lbGVtZW50cyBpbiBhbnkgb2Ygb3VyIHF1aXJrL3ByaW50
IHVzZXIgYWdlbnQgcnVsZXMsIGRvbid0IHdhc3RlIHRpbWUgd2Fsa2luZwotICAgIC8vIHRob3Nl
IHJ1bGVzLgotCi0gICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5kIGF1dGhvciBydWxlcy4KLSAgICBN
YXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOwot
Ci0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSB7Ci0gICAgICAgIG1hdGNoVXNl
clJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMobWF0
Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN0YXRlLnN0eWxl
KCktPnNldFN0eWxlVHlwZShwc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQpOwotCi0gICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZSk7Ci0KLSAgICAvLyBDbGVhbiB1cCBv
dXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3Ro
ZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBtX3N0YXRl
LnBhcmVudFN0eWxlKCksIDApOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVm
ZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLSAg
ICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0
dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUlu
ZGV4KQotewotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBkb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSk7IC8vIG1fcm9vdEVsZW1lbnRTdHlsZSB3aWxsIGJl
IHNldCB0byB0aGUgZG9jdW1lbnQgc3R5bGUuCi0KLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRl
clN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICBjb25zdCBib29sIGlzTGVmdCA9IGlzTGVm
dFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShw
YWdlSW5kZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsK
LSAgICAKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0
LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmly
c3QsIHBhZ2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy51c2VyU3R5
bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBn
bG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNw
ZWMuCi0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCks
IGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
MCk7Ci0gICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0jaWYgRU5BQkxFKENTU19WQVJJ
QUJMRVMpCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihy
ZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5o
ZXJpdGVkT25seSk7Ci0jZW5kaWYKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlv
cml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIElmIG91ciBmb250IGdvdCBk
aXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1cGRhdGVGb250KCk7Ci0K
LSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9u
IHRoZSBmb250LXNpemUuCi0gICAgaWYgKG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBtX3N0YXRlLmxpbmVIZWln
aHRWYWx1ZSgpKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9w
ZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyBy
ZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLQot
ICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIE5vdyBy
ZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOwotfQotCi1Q
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpkZWZhdWx0U3R5bGVGb3JFbGVt
ZW50KCkKLXsKLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0g
ICAgLy8gTWFrZSBzdXJlIG91ciBmb250cyBhcmUgaW5pdGlhbGl6ZWQgaWYgd2UgZG9uJ3QgaW5o
ZXJpdCB0aGVtIGZyb20gb3VyIHBhcmVudCBzdHlsZS4KLSAgICBpZiAoU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnRTZXR0aW5ncygpKSB7Ci0gICAgICAgIGluaXRpYWxpemVGb250U3R5bGUo
c2V0dGluZ3MpOwotICAgICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9udFNl
bGVjdG9yKCkpOwotICAgIH0gZWxzZQotICAgICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51
cGRhdGUoMCk7Ci0KLSAgICByZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JUZXh0KFRleHQqIHRleHRO
b2RlKQotewotICAgIEFTU0VSVCh0ZXh0Tm9kZSk7Ci0KLSAgICBOb2RlUmVuZGVyaW5nQ29udGV4
dCBjb250ZXh0KHRleHROb2RlKTsKLSAgICBOb2RlKiBwYXJlbnROb2RlID0gY29udGV4dC5wYXJl
bnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICByZXR1cm4gY29udGV4dC5yZXNldFN0
eWxlSW5oZXJpdGFuY2UoKSB8fCAhcGFyZW50Tm9kZSA/Ci0gICAgICAgIGRlZmF1bHRTdHlsZUZv
ckVsZW1lbnQoKSA6IHBhcmVudE5vZGUtPnJlbmRlclN0eWxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lk
IGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIC8vIEludHJp
bnNpYyBtYXJnaW4gdmFsdWUuCi0gICAgY29uc3QgaW50IGludHJpbnNpY01hcmdpbiA9IDIgKiBz
dHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdo
dCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMg
Zmxhd2VkLgotICAgIC8vIEZJWE1FOiBVc2luZyAicXVpcmsiIHRvIGRlY2lkZSB0aGUgbWFyZ2lu
IHdhc24ndCBzZXQgaXMga2luZCBvZiBsYW1lLgotICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0lu
dHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luTGVmdCgpLnF1aXJr
KCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVmdChMZW5ndGgoaW50cmluc2ljTWFy
Z2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkK
LSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChMZW5ndGgoaW50cmluc2ljTWFyZ2lu
LCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpIHsK
LSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Ub3AoKS5xdWlyaygpKQotICAgICAgICAgICAgc3R5
bGUtPnNldE1hcmdpblRvcChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgICAg
ICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+
c2V0TWFyZ2luQm90dG9tKExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgfQot
fQotCi1zdGF0aWMgRURpc3BsYXkgZXF1aXZhbGVudEJsb2NrRGlzcGxheShFRGlzcGxheSBkaXNw
bGF5LCBib29sIGlzRmxvYXRpbmcsIGJvb2wgc3RyaWN0UGFyc2luZykKLXsKLSAgICBzd2l0Y2gg
KGRpc3BsYXkpIHsKLSAgICBjYXNlIEJMT0NLOgotICAgIGNhc2UgVEFCTEU6Ci0gICAgY2FzZSBC
T1g6Ci0gICAgY2FzZSBGTEVYOgotICAgIGNhc2UgR1JJRDoKLSAgICAgICAgcmV0dXJuIGRpc3Bs
YXk7Ci0KLSAgICBjYXNlIExJU1RfSVRFTToKLSAgICAgICAgLy8gSXQgaXMgYSBXaW5JRSBidWcg
dGhhdCBmbG9hdGVkIGxpc3QgaXRlbXMgbG9zZSB0aGVpciBidWxsZXRzLCBzbyB3ZSdsbCBlbXVs
YXRlIHRoZSBxdWlyaywgYnV0IG9ubHkgaW4gcXVpcmtzIG1vZGUuCi0gICAgICAgIGlmICghc3Ry
aWN0UGFyc2luZyAmJiBpc0Zsb2F0aW5nKQotICAgICAgICAgICAgcmV0dXJuIEJMT0NLOwotICAg
ICAgICByZXR1cm4gZGlzcGxheTsKLSAgICBjYXNlIElOTElORV9UQUJMRToKLSAgICAgICAgcmV0
dXJuIFRBQkxFOwotICAgIGNhc2UgSU5MSU5FX0JPWDoKLSAgICAgICAgcmV0dXJuIEJPWDsKLSAg
ICBjYXNlIElOTElORV9GTEVYOgotICAgICAgICByZXR1cm4gRkxFWDsKLSAgICBjYXNlIElOTElO
RV9HUklEOgotICAgICAgICByZXR1cm4gR1JJRDsKLQotICAgIGNhc2UgSU5MSU5FOgotICAgIGNh
c2UgUlVOX0lOOgotICAgIGNhc2UgQ09NUEFDVDoKLSAgICBjYXNlIElOTElORV9CTE9DSzoKLSAg
ICBjYXNlIFRBQkxFX1JPV19HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDoKLSAg
ICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX1JPVzoKLSAgICBjYXNl
IFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTjoKLSAgICBjYXNlIFRB
QkxFX0NFTEw6Ci0gICAgY2FzZSBUQUJMRV9DQVBUSU9OOgotICAgICAgICByZXR1cm4gQkxPQ0s7
Ci0gICAgY2FzZSBOT05FOgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAg
cmV0dXJuIE5PTkU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVy
biBCTE9DSzsKLX0KLQotLy8gQ1NTIHJlcXVpcmVzIHRleHQtZGVjb3JhdGlvbiB0byBiZSByZXNl
dCBhdCBlYWNoIERPTSBlbGVtZW50IGZvciB0YWJsZXMsIAotLy8gaW5saW5lIGJsb2NrcywgaW5s
aW5lIHRhYmxlcywgcnVuLWlucywgc2hhZG93IERPTSBjcm9zc2luZ3MsIGZsb2F0aW5nIGVsZW1l
bnRzLAotLy8gYW5kIGFic29sdXRlIG9yIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBlbGVtZW50cy4K
LXN0YXRpYyBib29sIGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oUmVuZGVyU3R5bGUqIHN0
eWxlLCBFbGVtZW50KiBlKQotewotICAgIHJldHVybiBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxF
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gUlVOX0lOCi0gICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCB8fCBpc0F0U2hhZG93Qm91bmRhcnkoZSkK
LSAgICAgICAgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCBzdHlsZS0+aGFzT3V0T2ZGbG93UG9z
aXRpb24oKTsKLX0KLQotc3RhdGljIGJvb2wgaXNEaXNwbGF5RmxleGlibGVCb3goRURpc3BsYXkg
ZGlzcGxheSkKLXsKLSAgICByZXR1cm4gZGlzcGxheSA9PSBGTEVYIHx8IGRpc3BsYXkgPT0gSU5M
SU5FX0ZMRVg7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRqdXN0UmVuZGVyU3R5bGUoUmVu
ZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQgKmUpCi17
Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKLQotICAgIC8vIENhY2hlIG91ciBvcmlnaW5hbCBk
aXNwbGF5LgotICAgIHN0eWxlLT5zZXRPcmlnaW5hbERpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSk7
Ci0KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FKSB7Ci0gICAgICAgIC8vIElmIHdl
IGhhdmUgYSA8dGQ+IHRoYXQgc3BlY2lmaWVzIGEgZmxvYXQgcHJvcGVydHksIGluIHF1aXJrcyBt
b2RlIHdlIGp1c3QgZHJvcCB0aGUgZmxvYXQKLSAgICAgICAgLy8gcHJvcGVydHkuCi0gICAgICAg
IC8vIFNpdGVzIGFsc28gY29tbW9ubHkgdXNlIGRpc3BsYXk6aW5saW5lL2Jsb2NrIG9uIDx0ZD5z
IGFuZCA8dGFibGU+cy4gSW4gcXVpcmtzIG1vZGUgd2UgZm9yY2UKLSAgICAgICAgLy8gdGhlc2Ug
dGFncyB0byByZXRhaW4gdGhlaXIgZGlzcGxheSB0eXBlcy4KLSAgICAgICAgaWYgKGRvY3VtZW50
KCktPmluUXVpcmtzTW9kZSgpICYmIGUpIHsKLSAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1l
KHRkVGFnKSkgewotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX0NFTEwp
OwotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAg
ICAgIH0gZWxzZSBpZiAoZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykpCi0gICAgICAgICAgICAgICAg
c3R5bGUtPnNldERpc3BsYXkoc3R5bGUtPmlzRGlzcGxheUlubGluZVR5cGUoKSA/IElOTElORV9U
QUJMRSA6IFRBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdO
YW1lKHRkVGFnKSB8fCBlLT5oYXNUYWdOYW1lKHRoVGFnKSkpIHsKLSAgICAgICAgICAgIGlmIChz
dHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1MX05PV1JBUCkgewotICAgICAgICAgICAgICAgIC8v
IEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxseSBub3dyYXBwaW5nIG9yIGlmIHdlIHNob3VsZCBq
dXN0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIG5vcm1hbCBpbnN0ZWFkLiBJZiB0aGUgd2lkdGgg
b2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBh
Y3R1YWxseSB1c2UgTk9XUkFQLgotICAgICAgICAgICAgICAgIGlmIChzdHlsZS0+d2lkdGgoKS5p
c0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PUk1B
TCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0
V2hpdGVTcGFjZShOT1dSQVApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gVGFibGVzIG5ldmVyIHN1cHBvcnQgdGhlIC13ZWJraXQtKiB2YWx1ZXMgZm9yIHRleHQtYWxp
Z24gYW5kIHdpbGwgcmVzZXQgYmFjayB0byB0aGUgZGVmYXVsdC4KLSAgICAgICAgaWYgKGUgJiYg
ZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykgJiYgKHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRf
TEVGVCB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0NFTlRFUiB8fCBzdHlsZS0+dGV4
dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxp
Z24oVEFTVEFSVCk7Ci0KLSAgICAgICAgLy8gRnJhbWVzIGFuZCBmcmFtZXNldHMgbmV2ZXIgaG9u
b3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246YWJzb2x1dGUuIFRoaXMgaXMgbmVjZXNz
YXJ5IHRvCi0gICAgICAgIC8vIGZpeCBhIGNyYXNoIHdoZXJlIGEgc2l0ZSB0cmllcyB0byBwb3Np
dGlvbiB0aGVzZSBvYmplY3RzLiBUaGV5IGFsc28gbmV2ZXIgaG9ub3IgZGlzcGxheS4KLSAgICAg
ICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUoZnJhbWVUYWcpIHx8IGUtPmhhc1RhZ05hbWUoZnJh
bWVzZXRUYWcpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0
aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIFJ1YnkgdGV4dCBkb2VzIG5vdCBzdXBwb3J0IGZsb2F0IG9yIHBvc2l0aW9u
LiBUaGlzIG1pZ2h0IGNoYW5nZSB3aXRoIGV2b2x1dGlvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4K
LSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShydFRhZykpIHsKLSAgICAgICAgICAgIHN0
eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0
RmxvYXRpbmcoTm9GbG9hdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhNRTogV2Ugc2hv
dWxkbid0IGJlIG92ZXJyaWRpbmcgc3RhcnQvLXdlYmtpdC1hdXRvIGxpa2UgdGhpcy4gRG8gaXQg
aW4gaHRtbC5jc3MgaW5zdGVhZC4KLSAgICAgICAgLy8gVGFibGUgaGVhZGVycyB3aXRoIGEgdGV4
dC1hbGlnbiBvZiAtd2Via2l0LWF1dG8gd2lsbCBjaGFuZ2UgdGhlIHRleHQtYWxpZ24gdG8gY2Vu
dGVyLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRoVGFnKSAmJiBzdHlsZS0+dGV4
dEFsaWduKCkgPT0gVEFTVEFSVCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oQ0VO
VEVSKTsKLQotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgLy8gQWJzb2x1dGUv
Zml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywgZmxvYXRpbmcgZWxlbWVudHMgYW5kIHRoZSBkb2N1
bWVudCBlbGVtZW50IG5lZWQgYmxvY2stbGlrZSBvdXRzaWRlIGRpc3BsYXkuCi0gICAgICAgIGlm
IChzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8
IChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpKQotICAgICAgICAg
ICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxh
eSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsK
LQotICAgICAgICAvLyBGSVhNRTogRG9uJ3Qgc3VwcG9ydCB0aGlzIG11dGF0aW9uIGZvciBwc2V1
ZG8gc3R5bGVzIGxpa2UgZmlyc3QtbGV0dGVyIG9yIGZpcnN0LWxpbmUsIHNpbmNlIGl0J3Mgbm90
IGNvbXBsZXRlbHkKLSAgICAgICAgLy8gY2xlYXIgaG93IHRoYXQgc2hvdWxkIHdvcmsuCi0gICAg
ICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdHlsZS0+c3R5bGVUeXBlKCkg
PT0gTk9QU0VVRE8gJiYgc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gcGFyZW50U3R5bGUtPndyaXRp
bmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOwot
Ci0gICAgICAgIC8vIEFmdGVyIHBlcmZvcm1pbmcgdGhlIGRpc3BsYXkgbXV0YXRpb24sIGNoZWNr
IHRhYmxlIHJvd3MuIFdlIGRvIG5vdCBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlv
bjpzdGlja3kgb24KLSAgICAgICAgLy8gdGFibGUgcm93cyBvciBjZWxscy4gVGhpcyBoYXMgYmVl
biBlc3RhYmxpc2hlZCBmb3IgcG9zaXRpb246cmVsYXRpdmUgaW4gQ1NTMi4xIChhbmQgY2F1c2Vk
IGEgY3Jhc2ggaW4gY29udGFpbmluZ0Jsb2NrKCkKLSAgICAgICAgLy8gb24gc29tZSBzaXRlcyku
Ci0gICAgICAgIGlmICgoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxl
LT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0g
VEFCTEVfUk9XKQotICAgICAgICAgICAgJiYgc3R5bGUtPmhhc0luRmxvd1Bvc2l0aW9uKCkpCi0g
ICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOwotCi0gICAgICAg
IC8vIHdyaXRpbmctbW9kZSBkb2VzIG5vdCBhcHBseSB0byB0YWJsZSByb3cgZ3JvdXBzLCB0YWJs
ZSBjb2x1bW4gZ3JvdXBzLCB0YWJsZSByb3dzLCBhbmQgdGFibGUgY29sdW1ucy4KLSAgICAgICAg
Ly8gRklYTUU6IFRhYmxlIGNlbGxzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGJlIHBlcnBlbmRpY3Vs
YXIgb3IgZmxpcHBlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHRhYmxlLCB0aG91Z2guCi0gICAgICAg
IGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTiB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX0NPTFVNTl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RF
Ul9HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJf
R1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cgfHwgc3R5bGUtPmRpc3BsYXko
KSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0g
VEFCTEVfQ0VMTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShwYXJlbnRTdHls
ZS0+d3JpdGluZ01vZGUoKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFNpbmNlIHdlIGRvbid0IHN1
cHBvcnQgYmxvY2stZmxvdyBvbiBmbGV4aWJsZSBib3hlcyB5ZXQsIGRpc2FsbG93IHNldHRpbmcK
LSAgICAgICAgLy8gb2YgYmxvY2stZmxvdyB0byBhbnl0aGluZyBvdGhlciB0aGFuIFRvcFRvQm90
dG9tV3JpdGluZ01vZGUuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD00NjQxOCAtIEZsZXhpYmxlIGJveCBzdXBwb3J0LgotICAgICAgICBpZiAoc3R5
bGUtPndyaXRpbmdNb2RlKCkgIT0gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSAmJiAoc3R5bGUtPmRp
c3BsYXkoKSA9PSBCT1ggfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9YKSkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShUb3BUb0JvdHRvbVdyaXRpbmdNb2RlKTsKLQot
ICAgICAgICBpZiAoaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkp
IHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXko
KSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7Ci0g
ICAgICAgIH0KLQotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgLy8gUGVyIHRo
ZSBzcGVjLCBwb3NpdGlvbiAnc3RhdGljJyBhbmQgJ3JlbGF0aXZlJyBpbiB0aGUgdG9wIGxheWVy
IGNvbXB1dGUgdG8gJ2Fic29sdXRlJy4KLSAgICAgICAgaWYgKGUgJiYgZS0+aXNJblRvcExheWVy
KCkgJiYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uIHx8IHN0eWxlLT5wb3Np
dGlvbigpID09IFJlbGF0aXZlUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0UG9z
aXRpb24oQWJzb2x1dGVQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShC
TE9DSyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSBvdXIg
ei1pbmRleCB2YWx1ZSBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIG9iamVjdCBpcyBwb3NpdGlvbmVk
LgotICAgIGlmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiAmJiAhaXNEaXNw
bGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkpCi0gICAgICAgIHN0eWxlLT5z
ZXRIYXNBdXRvWkluZGV4KCk7Ci0KLSAgICAvLyBBdXRvIHotaW5kZXggYmVjb21lcyAwIGZvciB0
aGUgcm9vdCBlbGVtZW50IGFuZCB0cmFuc3BhcmVudCBvYmplY3RzLiBUaGlzIHByZXZlbnRzCi0g
ICAgLy8gY2FzZXMgd2hlcmUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBibGVuZGVkIGFzIGEgc2lu
Z2xlIHVuaXQgZW5kIHVwIHdpdGggYSBub24tdHJhbnNwYXJlbnQKLSAgICAvLyBvYmplY3Qgd2Vk
Z2VkIGluIGJldHdlZW4gdGhlbS4gQXV0byB6LWluZGV4IGFsc28gYmVjb21lcyAwIGZvciBvYmpl
Y3RzIHRoYXQgc3BlY2lmeSB0cmFuc2Zvcm1zL21hc2tzL3JlZmxlY3Rpb25zLgotICAgIGlmIChz
dHlsZS0+aGFzQXV0b1pJbmRleCgpICYmICgoZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVs
ZW1lbnQoKSA9PSBlKQotICAgICAgICB8fCBzdHlsZS0+b3BhY2l0eSgpIDwgMS4wZgotICAgICAg
ICB8fCBzdHlsZS0+aGFzVHJhbnNmb3JtUmVsYXRlZFByb3BlcnR5KCkKLSAgICAgICAgfHwgc3R5
bGUtPmhhc01hc2soKQotICAgICAgICB8fCBzdHlsZS0+Y2xpcFBhdGgoKQotICAgICAgICB8fCBz
dHlsZS0+Ym94UmVmbGVjdCgpCi0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKQotICAgICAg
ICB8fCBzdHlsZS0+aGFzQmxlbmRNb2RlKCkKLSAgICAgICAgfHwgc3R5bGUtPnBvc2l0aW9uKCkg
PT0gU3RpY2t5UG9zaXRpb24KLSAgICAgICAgfHwgKHN0eWxlLT5wb3NpdGlvbigpID09IEZpeGVk
UG9zaXRpb24gJiYgZSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCkgJiYgZS0+ZG9jdW1lbnQoKS0+
cGFnZSgpLT5zZXR0aW5ncygpLT5maXhlZFBvc2l0aW9uQ3JlYXRlc1N0YWNraW5nQ29udGV4dCgp
KQotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCi0gICAgICAgIC8v
IFRvdWNoIG92ZXJmbG93IHNjcm9sbGluZyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dC4KLSAg
ICAgICAgfHwgKChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTiB8fCBzdHlsZS0+b3ZlcmZs
b3dZKCkgIT0gT0hJRERFTikgJiYgc3R5bGUtPnVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcoKSkK
LSNlbmRpZgotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgfHwgKGUgJiYgZS0+
aXNJblRvcExheWVyKCkpCi0jZW5kaWYKLSAgICAgICAgKSkKLSAgICAgICAgc3R5bGUtPnNldFpJ
bmRleCgwKTsKLQotICAgIC8vIFRleHRhcmVhIGNvbnNpZGVycyBvdmVyZmxvdyB2aXNpYmxlIGFz
IGF1dG8uCi0gICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0ZXh0YXJlYVRhZykpIHsKLSAgICAg
ICAgc3R5bGUtPnNldE92ZXJmbG93WChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgPyBP
QVVUTyA6IHN0eWxlLT5vdmVyZmxvd1goKSk7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1ko
c3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dZ
KCkpOwotICAgIH0KLQotICAgIGlmIChkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0aW9uKHN0eWxl
LCBlKSkKLSAgICAgICAgc3R5bGUtPnNldFRleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50
ZXh0RGVjb3JhdGlvbigpKTsKLSAgICBlbHNlCi0gICAgICAgIHN0eWxlLT5hZGRUb1RleHREZWNv
cmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLQotICAgIC8vIElmIGVp
dGhlciBvdmVyZmxvdyB2YWx1ZSBpcyBub3QgdmlzaWJsZSwgY2hhbmdlIHRvIGF1dG8uCi0gICAg
aWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkg
IT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT01BUlFVRUUpOwotICAg
IGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZs
b3dYKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT01BUlFVRUUp
OwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+
b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUpIHsKLSAgICAgICAgLy8gRklYTUU6IE9uY2Ugd2UgaW1w
bGVtZW50IHBhZ2luYXRpb24gY29udHJvbHMsIG92ZXJmbG93LXggc2hvdWxkIGRlZmF1bHQgdG8g
aGlkZGVuCi0gICAgICAgIC8vIGlmIG92ZXJmbG93LXkgaXMgc2V0IHRvIC13ZWJraXQtcGFnZWQt
eCBvciAtd2Via2l0LXBhZ2UteS4gRm9yIG5vdywgd2UnbGwgbGV0IGl0Ci0gICAgICAgIC8vIGRl
ZmF1bHQgdG8gYXV0byBzbyB3ZSBjYW4gYXQgbGVhc3Qgc2Nyb2xsIHRocm91Z2ggdGhlIHBhZ2Vz
LgotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9BVVRPKTsKLSAgICB9IGVsc2UgaWYgKHN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJ
U0lCTEUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0FVVE8pOwotCi0gICAgLy8gQ2Fs
bCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZSgpIGlmIGEgcGFnaW5hdGlvbiBtb2RlIGlzIHNl
dCBmb3IgYW55IG5vbi1yb290IGVsZW1lbnRzLiBJZiB0aGVzZQotICAgIC8vIHN0eWxlcyBhcmUg
c3BlY2lmaWVkIG9uIGEgcm9vdCBlbGVtZW50LCB0aGVuIHRoZXkgd2lsbCBiZSBpbmNvcnBvcmF0
ZWQgaW4KLSAgICAvLyBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KCkuCi0gICAgaWYg
KChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWCB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgPT0g
T1BBR0VEWSkgJiYgIShlICYmIChlLT5oYXNUYWdOYW1lKGh0bWxUYWcpIHx8IGUtPmhhc1RhZ05h
bWUoYm9keVRhZykpKSkKLSAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoV2ViQ29y
ZTo6cGFnaW5hdGlvbk1vZGVGb3JSZW5kZXJTdHlsZShzdHlsZSksIHN0eWxlKTsKLQotICAgIC8v
IFRhYmxlIHJvd3MsIHNlY3Rpb25zIGFuZCB0aGUgdGFibGUgaXRzZWxmIHdpbGwgc3VwcG9ydCBv
dmVyZmxvdzpoaWRkZW4gYW5kIHdpbGwgaWdub3JlIHNjcm9sbC9hdXRvLgotICAgIC8vIEZJWE1F
OiBFdmVudHVhbGx5IHRhYmxlIHNlY3Rpb25zIHdpbGwgc3VwcG9ydCBhdXRvIGFuZCBzY3JvbGwu
Ci0gICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBJTkxJTkVfVEFCTEUKLSAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1df
R1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpIHsKLSAgICAgICAgaWYgKHN0
eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJ
RERFTikKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOwotICAgICAg
ICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1ko
KSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7
Ci0gICAgfQotCi0gICAgLy8gTWVudWxpc3RzIHNob3VsZCBoYXZlIHZpc2libGUgb3ZlcmZsb3cK
LSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpIHsKLSAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1koT1ZJU0lCTEUpOwotICAgIH0KLQotICAgIC8vIEN1bGwgb3V0IGFueSB1c2VsZXNzIGxheWVy
cyBhbmQgYWxzbyByZXBlYXQgcGF0dGVybnMgaW50byBhZGRpdGlvbmFsIGxheWVycy4KLSAgICBz
dHlsZS0+YWRqdXN0QmFja2dyb3VuZExheWVycygpOwotICAgIHN0eWxlLT5hZGp1c3RNYXNrTGF5
ZXJzKCk7Ci0KLSAgICAvLyBEbyB0aGUgc2FtZSBmb3IgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlv
bnMuCi0gICAgc3R5bGUtPmFkanVzdEFuaW1hdGlvbnMoKTsKLSAgICBzdHlsZS0+YWRqdXN0VHJh
bnNpdGlvbnMoKTsKLQotICAgIC8vIEltcG9ydGFudDogSW50cmluc2ljIG1hcmdpbnMgZ2V0IGFk
ZGVkIHRvIGNvbnRyb2xzIGJlZm9yZSB0aGUgdGhlbWUgaGFzIGFkanVzdGVkIHRoZSBzdHlsZSwg
c2luY2UgdGhlIHRoZW1lIHdpbGwKLSAgICAvLyBhbHRlciBmb250cyBhbmQgaGVpZ2h0cy93aWR0
aHMuCi0gICAgaWYgKGUgJiYgZS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSAmJiBzdHlsZS0+Zm9u
dFNpemUoKSA+PSAxMSkgewotICAgICAgICAvLyBEb24ndCBhcHBseSBpbnRyaW5zaWMgbWFyZ2lu
cyB0byBpbWFnZSBidXR0b25zLiBUaGUgZGVzaWduZXIga25vd3MgaG93IGJpZyB0aGUgaW1hZ2Vz
IGFyZSwKLSAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB0cmVhdCBhbGwgaW1hZ2UgYnV0dG9ucyBh
cyB0aG91Z2ggdGhleSB3ZXJlIGV4cGxpY2l0bHkgc2l6ZWQuCi0gICAgICAgIGlmICghZS0+aGFz
VGFnTmFtZShpbnB1dFRhZykgfHwgIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihlKS0+
aXNJbWFnZUJ1dHRvbigpKQotICAgICAgICAgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7
Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSB0aGVtZSBhbHNvIGhhdmUgYSBjcmFjayBhdCBhZGp1
c3RpbmcgdGhlIHN0eWxlLgotICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAg
ICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFkanVzdFN0eWxlKHRoaXMsIHN0eWxlLCBl
LCBtX3N0YXRlLmhhc1VBQXBwZWFyYW5jZSgpLCBtX3N0YXRlLmJvcmRlckRhdGEoKSwgbV9zdGF0
ZS5iYWNrZ3JvdW5kRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmRDb2xvcigpKTsKLQotICAgIC8v
IElmIHdlIGhhdmUgZmlyc3QtbGV0dGVyIHBzZXVkbyBzdHlsZSwgZG8gbm90IHNoYXJlIHRoaXMg
c3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNQc2V1ZG9TdHlsZShGSVJTVF9MRVRURVIpKQotICAg
ICAgICBzdHlsZS0+c2V0VW5pcXVlKCk7Ci0KLSAgICAvLyBGSVhNRTogd2hlbiBkcm9wcGluZyB0
aGUgLXdlYmtpdCBwcmVmaXggb24gdHJhbnNmb3JtLXN0eWxlLCB3ZSBzaG91bGQgYWxzbyBoYXZl
IG9wYWNpdHkgPCAxIGNhdXNlIGZsYXR0ZW5pbmcuCi0gICAgaWYgKHN0eWxlLT5wcmVzZXJ2ZXMz
RCgpICYmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUKLSAgICAgICAgfHwgc3R5bGUt
Pm92ZXJmbG93WSgpICE9IE9WSVNJQkxFCi0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKSkp
Ci0gICAgICAgIHN0eWxlLT5zZXRUcmFuc2Zvcm1TdHlsZTNEKFRyYW5zZm9ybVN0eWxlM0RGbGF0
KTsKLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgYmVoYXZlIGxpa2UgYmxvY2tzLiBNYXAgdGhl
aXIgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sgd2hlbiBtYXJrZWQgaW5saW5lLgotICAgIGlmIChl
ICYmIGUtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSAmJiBzdHlsZS0+ZGlzcGxheSgpID09IElOTElO
RSAmJiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+KGUpLT5zaG91bGREaXNwbGF5U2Vh
bWxlc3NseSgpKQotICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOwotCi0j
aWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZSAmJiBlLT5pc1NWR0VsZW1lbnQoKSkgewotICAgICAg
ICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvbWFza2luZy5odG1sI092ZXJmbG93
UHJvcGVydHkKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPU0NST0xMKQotICAg
ICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPSElEREVOKTsKLSAgICAgICAgZWxzZSBpZiAo
c3R5bGUtPm92ZXJmbG93WSgpID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJm
bG93WShPVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPU0NS
T0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPSElEREVOKTsKLSAgICAgICAg
ZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUt
PnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0KLSAgICAgICAgLy8gT25seSB0aGUgcm9vdCA8c3Zn
PiBlbGVtZW50IGluIGFuIFNWRyBkb2N1bWVudCBmcmFnbWVudCB0cmVlIGhvbm9ycyBjc3MgcG9z
aXRpb24KLSAgICAgICAgaWYgKCEoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3ZnVGFnKSAmJiBl
LT5wYXJlbnROb2RlKCkgJiYgIWUtPnBhcmVudE5vZGUoKS0+aXNTVkdFbGVtZW50KCkpKQotICAg
ICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFJlbmRlclN0eWxlOjppbml0aWFsUG9zaXRpb24o
KSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyU1ZHUm9vdCBoYW5kbGVzIHpvb21pbmcgZm9yIHRoZSB3
aG9sZSBTVkcgc3VidHJlZSwgc28gZm9yZWlnbk9iamVjdCBjb250ZW50IHNob3VsZAotICAgICAg
ICAvLyBub3QgYmUgc2NhbGVkIGFnYWluLgotICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZShTVkdO
YW1lczo6Zm9yZWlnbk9iamVjdFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RWZmZWN0aXZl
Wm9vbShSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLWJv
b2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50
KQotewotICAgIC8vIEZJWE1FIChCVUcgNzI0NzIpOiBXZSBkb24ndCBhZGQgQC13ZWJraXQtcmVn
aW9uIHJ1bGVzIG9mIHNjb3BlZCBzdHlsZSBzaGVldHMgZm9yIHRoZSBtb21lbnQsCi0gICAgLy8g
c28gYWxsIHJlZ2lvbiBydWxlcyBhcmUgZ2xvYmFsIGJ5IGRlZmF1bHQuIFZlcmlmeSB3aGV0aGVy
IHRoYXQgY2FuIHN0YW5kIG9yIG5lZWRzIGNoYW5naW5nLgotCi0gICAgdW5zaWduZWQgcnVsZXNT
aXplID0gbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVT
ZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kp
IHsKLSAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxl
Y3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsKLSAgICAgICAgaWYgKGNoZWNr
UmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKSB7
Ci0gICAgICAgIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2Vs
ZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLnVzZXJT
dHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkp
OwotICAgICAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy51c2VyU3R5
bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9u
RWxlbWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRm9yT3JpZW50YXRp
b25DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIEZvbnRPcmllbnRhdGlvbiBmb250
T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9u
OwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKHN0eWxlLCBmb250T3JpZW50YXRpb24s
IGdseXBoT3JpZW50YXRpb24pOwotCi0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
Y3JpcHRpb24gPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGZvbnREZXNjcmlw
dGlvbi5vcmllbnRhdGlvbigpID09IGZvbnRPcmllbnRhdGlvbiAmJiBmb250RGVzY3JpcHRpb24u
bm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09IGdseXBoT3JpZW50YXRpb24pCi0gICAgICAgIHJl
dHVybjsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oZm9udERlc2Ny
aXB0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlv
bihnbHlwaE9yaWVudGF0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRp
b24oZm9udE9yaWVudGF0aW9uKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0Zv
bnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6dXBkYXRlRm9udCgpCi17
Ci0gICAgaWYgKCFtX3N0YXRlLmZvbnREaXJ0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBj
aGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0
ZS5zdHlsZSgpOwotICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShzdHlsZSwgbV9zdGF0
ZS5wYXJlbnRTdHlsZSgpKTsKLSAgICBjaGVja0Zvclpvb21DaGFuZ2Uoc3R5bGUsIG1fc3RhdGUu
cGFyZW50U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShzdHlsZSk7Ci0g
ICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOwotICAgIG1fc3RhdGUuc2V0
Rm9udERpcnR5KGZhbHNlKTsKLX0KLQotUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgdW5zaWduZWQgcnVsZXNUb0lu
Y2x1ZGUpCi17Ci0gICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KGUsIE5PUFNF
VURPLCBydWxlc1RvSW5jbHVkZSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxl
UmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzZXVkb0lk
IHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKLXsKLSAgICBpZiAoIWUgfHwgIWUt
PmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7
Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUo
ZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOwotCi0gICAgTWF0Y2hSZXN1bHQgZHVtbXk7Ci0g
ICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMpIHsKLSAgICAgICAgLy8g
Rmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICAgICAg
bWF0Y2hVQVJ1bGVzKGR1bW15KTsKLQotICAgICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVl
dCBydWxlcy4KLSAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAg
ICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxl
cyk7Ci0gICAgfQotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxl
c1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAgICAgICBtX3N0YXRlLnNldFNhbWVP
cmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7Ci0KLSAg
ICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCi0gICAgICAgIG1hdGNo
QXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0KLSAg
ICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxzZSk7Ci0gICAgfQotCi0gICAgbV9z
dGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwotCi0gICAgcmV0
dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2
ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVy
Tm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJl
aGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCi17Ci0gICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLQotICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3Io
KSkgewotICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBh
bnkgcHNldWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9y
IG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgot
ICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQg
dG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9z
dFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgp
LT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlw
YXJ0U2VsZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6
VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxl
RGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgo
cnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFzZWxl
Y3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVj
a2VyRmFzdFBhdGgubWF0Y2hlcygpOwotICAgIH0KLQotICAgIC8vIFNsb3cgcGF0aC4KLSAgICBT
ZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUoKSk7
Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1
bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNp
dGVkTWF0Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxl
KCk7Ci0gICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAgIGNvbnRleHQucHNldWRvSWQgPSBz
dGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsKLSAgICBjb250ZXh0LnNjcm9sbGJh
ciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhcjsKLSAgICBjb250ZXh0LnNj
cm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0Owot
ICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OwotICAg
IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29u
dGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOwotICAg
IGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9J
ZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBk
eW5hbWljUHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxl
Y3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCi17Ci0gICAgaWYg
KCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX3N0
YXRlLm1vZGUoKSk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVj
dG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKSB7Ci0gICAgICAgIFNlbGVjdG9y
Q2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRleHQo
cywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxlZCk7
Ci0gICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAg
ICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwgaWdu
b3JlRHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNlbGVj
dG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0vLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1ZmYgb24gaG93IHRvIGFwcGx5IGEg
Y2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgotCi1MZW5ndGggU3R5bGVSZXNvbHZl
cjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlw
bGllcikKLXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29u
dmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8
IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJj
ZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgo
VW5kZWZpbmVkKTsKLX0KLQotTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0TGVu
Z3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKLXsKLSAgICByZXR1
cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVk
RmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lv
biB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0
eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Ci19Ci0KLXRl
bXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotdm9pZCBT
dHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJv
cGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRl
ZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCi17Ci0g
ICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdp
b24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsKLSAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUHJv
Y2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0KLSAgICB1bnNpZ25lZCBwcm9wZXJ0
eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNl
dDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5QXQoaSk7
Ci0gICAgICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50LmlzSW1wb3J0YW50KCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGluaGVyaXRlZE9ubHkgJiYgIWN1cnJlbnQu
aXNJbmhlcml0ZWQoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlz
IGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFwcGx5IGZ1cnRoZXIgbm9uLWluaGVy
aXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBhcyB0aGV5IG1pZ2h0IG92ZXJyaWRlIHRo
ZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvbid0IGFsbG93IGRl
Y2xhcmF0aW9ucyB3aXRoCi0gICAgICAgICAgICAvLyBleHBsaWNpdGx5IGluaGVyaXRlZCBwcm9w
ZXJ0aWVzIHRvIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIEFTU0VSVCghY3VycmVudC52YWx1ZSgp
LT5pc0luaGVyaXRlZFZhbHVlKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LSAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1cnJlbnQuaWQoKTsKLQotICAgICAg
ICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uICYm
ICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgICAgIGlm
IChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RDdWUgJiYgIVN0eWxl
UmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAocGFzcykgewotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgICAgICBjYXNlIFZhcmlhYmxlRGVmaW5pdGlvbnM6Ci0gICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlhYmxlIDwgZmlyc3RDU1NQcm9wZXJ0
eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9wZXJ0eSk7Ci0gICAgICAgICAgICBp
ZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKLSAgICAgICAgICAgICAgICBhcHBs
eVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgSGlnaFByaW9yaXR5UHJvcGVydGllczoKLSAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVydHkgPT0gQ1NTUHJvcGVydHlDb2xv
ciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKLSAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNvbG9yICsgMTgsIENTU196b29tX2lz
X2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENT
U1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpvb20gKyAxLCBDU1NfbGluZV9oZWln
aHRfaXNfYWZ0ZXJfem9vbSk7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAgICAg
ICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSNlbmRpZgotICAgICAgICAgICAgLy8gZ2l2ZSBzcGVjaWFsIHByaW9yaXR5IHRv
IGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0
eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5
KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIHdlIGFwcGx5
IGxpbmUtaGVpZ2h0IGxhdGVyCi0gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IExvd1ByaW9yaXR5UHJvcGVydGllczoKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA+IENTU1By
b3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQu
aWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tpZSk7Ci19Ci0KLXRlbXBsYXRlIDxT
dHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotdm9pZCBTdHlsZVJlc29s
dmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3Vs
dCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBp
bmhlcml0ZWRPbmx5KQotewotICAgIGlmIChzdGFydEluZGV4ID09IC0xKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmIChzdGF0ZS5zdHlsZSgp
LT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgewotICAgICAgICBmb3IgKGludCBpID0g
c3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBNYXRj
aGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllc1tpXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBtYXRjaGVk
UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOwotICAgICAgICAgICAgLy8gRklYTUU6IEl0IHdvdWxk
IGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRzIGJ1dCB0aGF0IHJlcXVpcmVzIGNo
YW5nZXMgaW4gbWFueSBwbGFjZXMuCi0gICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hMaW5r
KTsKLSAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUo
bGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hWaXNpdGVkKTsKLQotICAgICAg
ICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMu
Z2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRl
ZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRp
ZXMud2hpdGVsaXN0VHlwZSkpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnNldEFwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsKLSAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
Zm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgewotICAgICAgICBj
b25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5t
YXRjaGVkUHJvcGVydGllc1tpXTsKLSAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNo
ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tp
XSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVs
aXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOwotICAgIH0KLX0KLQot
dW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25z
dCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICAK
LSAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KHByb3BlcnRpZXMsIHNpemVvZihN
YXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0
eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJh
bmdlcyYgYikKLXsKLSAgICByZXR1cm4gYS5maXJzdFVBUnVsZSA9PSBiLmZpcnN0VUFSdWxlCi0g
ICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1bGUKLSAgICAgICAgJiYgYS5maXJz
dEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0QXV0aG9y
UnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCi0gICAgICAgICYmIGEuZmlyc3RVc2VyUnVsZSA9PSBi
LmZpcnN0VXNlclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VXNlclJ1bGUgPT0gYi5sYXN0VXNlclJ1
bGU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdl
cyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCi17Ci0gICAgcmV0dXJu
ICEoYSA9PSBiKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGll
cyYgYikKLXsKLSAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09IGIucHJvcGVydGllcyAmJiBhLmxp
bmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOwotfQotCi1ib29sIG9wZXJhdG9yIT0oY29u
c3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQotewotICAgIHJldHVybiAhKGEgPT0gYik7Ci19Ci0K
LWNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBTdHlsZVJl
c29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29u
c3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQotewotICAgIEFTU0VSVChoYXNoKTsKLQotICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlLmZpbmQoaGFzaCk7Ci0gICAgaWYgKGl0ID09IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZS5lbmQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0
ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsKLQotICAgIHNpemVfdCBzaXplID0gbWF0Y2hSZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlmIChzaXplICE9IGNhY2hlSXRlbS5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmIChtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXNbaV0pCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNhY2hlSXRlbS5yYW5nZXMgIT0gbWF0
Y2hSZXN1bHQucmFuZ2VzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gJmNhY2hlSXRl
bTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUo
Y29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUs
IHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKLXsKLSAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3
ZWVuU3dlZXBzID0gMTAwOwotICAgIGlmICgrK21fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0
aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0
d2VlblN3ZWVwcwotICAgICAgICAmJiAhbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVj
bGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYwOwotICAgICAgICBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hvdChtYXRjaGVkRGVjbGFyYXRpb25D
YWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7Ci0gICAgfQotCi0gICAgQVNTRVJUKGhhc2gpOwotICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRlbTsKLSAgICBjYWNoZUl0ZW0ubWF0
Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzKTsKLSAg
ICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFuZ2VzOwotICAgIC8vIE5vdGUgdGhh
dCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVyU3R5bGUgaW5zdGFuY2UuIEl0IG1h
eSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgotICAgIC8vIFRoZSBSZW5kZXJTdHlsZSBpbiB0aGUgY2Fj
aGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBzdWJzdHJ1Y3R1cmVzIGFuZCBuZXZl
ciB1c2VkIGFzLWlzLgotICAgIGNhY2hlSXRlbS5yZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpj
bG9uZShzdHlsZSk7Ci0gICAgY2FjaGVJdGVtLnBhcmVudFJlbmRlclN0eWxlID0gUmVuZGVyU3R5
bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYWRk
KGhhc2gsIGNhY2hlSXRlbSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6aW52YWxpZGF0ZU1h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQotewotICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5j
bGVhcigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXND
YWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNv
bnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAgICAvLyBGSVhNRTogQ1NTUHJvcGVy
dHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3aGVuIGFwcGx5aW5nIHRvIGRvY3Vt
ZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5aW5nIGJ5IGNhY2hpbmcuCi0gICAg
aWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgJiYg
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlxdWUoKSB8fCAoc3R5bGUt
PnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0eWxlLT51bmlxdWUoKSkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+em9vbSgpICE9IFJlbmRlclN0eWxlOjpp
bml0aWFsWm9vbSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT53cml0
aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIC8vIFRoZSBjYWNoZSBhc3N1bWVzIHN0YXRpYyBrbm93bGVkZ2Ug
YWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkLgotICAgIGlmIChwYXJlbnRTdHls
ZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBFbGVt
ZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOwotICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IG1hdGNoUmVzdWx0LmlzQ2FjaGVh
YmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkgOiAw
OwotICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0gICAgY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7Ci0gICAgaWYgKGNhY2hlSGFzaCAm
JiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNhY2hlSGFzaCwg
bWF0Y2hSZXN1bHQpKSkgewotICAgICAgICAvLyBXZSBjYW4gYnVpbGQgdXAgdGhlIHN0eWxlIGJ5
IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gYW4gZWFybGllciBzdHlsZSBv
YmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKLSAgICAgICAgLy8gc3R5bGUgZGVjbGFy
YXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0aGUgaW5oZXJpdGVkIHByb3BlcnRp
ZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBlbmQgb24gdGhlIAotICAgICAgICAv
LyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQgc2F2ZXMgbWVtb3J5IGJ5IHJldXNp
bmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y29w
eU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7Ci0gICAgICAg
IGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWREYXRhU2hhcmVkKGNhY2hlSXRlbS0+
cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkp
IHsKLSAgICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0dXMgPSBzdGF0ZS5zdHlsZSgpLT5p
bnNpZGVMaW5rKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgY2FjaGUgaXRlbSBwYXJlbnQgc3R5
bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwYXJl
bnQgc3R5bGUgdGhlbiB0aGUKLSAgICAgICAgICAgIC8vIHJlc3VsdGluZyBzdHlsZSB3aWxsIGJl
IGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG92ZXIgZnJv
bSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5o
ZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7Ci0KLSAgICAgICAgICAgIC8v
IFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmhlcml0
ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSByZXN0b3JlIGl0LgotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdHVzKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSB0cnVlOyAK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAvLyBGaXJzdCBhcHBseSBh
bGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5IGJlIHVzZWQgZHVyaW5nIGFwcGxp
Y2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxW
YXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVz
dWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxl
LCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFi
bGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25s
eSk7Ci0jZW5kaWYKLQotICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgbWF0Y2hlZCBydWxl
cyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhlIHJ1bGVzIGFuZCBhcHBseQotICAg
IC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwgaS5lLiwgdGhvc2UgcHJvcGVydGll
cyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgotICAgIC8vIFRoZSBvcmRlciBpcyAo
MSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikgaGlnaC1wcmlvcml0eSBpbXBvcnRh
bnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFudAotICAgIC8vIGFuZCAoNCkgbm9ybWFsIGltcG9y
dGFudC4KLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAs
IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVk
T25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hS
ZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUs
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0KLSAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hl
SXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSBzdGF0ZS5zdHlsZSgpLT5lZmZl
Y3RpdmVab29tKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0Rm9udERpcnR5KHRydWUpOwotICAgICAg
ICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiBvdXIgZm9u
dCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCi0gICAgdXBkYXRlRm9u
dCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVj
aWRlZCBvbiB0aGUgZm9udC1zaXplLgotICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkK
LSAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVI
ZWlnaHRWYWx1ZSgpKTsKLQotICAgIC8vIE1hbnkgcHJvcGVydGllcyBkZXBlbmQgb24gdGhlIGZv
bnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwgcHJvcGVydGllcy4KLSAgICBpZiAo
Y2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmZvbnREZXNjcmlwdGlvbigpICE9
IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQotICAgICAgICBhcHBseUluaGVyaXRl
ZE9ubHkgPSBmYWxzZTsKLQotICAgIC8vIE5vdyBkbyB0aGUgbm9ybWFsIHByaW9yaXR5IFVBIHBy
b3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRp
ZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBt
YXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICAK
LSAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3JvdW5kIHNvIHRoYXQgd2UgY2FuIGV4
YW1pbmUgdGhlbSBsYXRlci4KLSAgICBzdGF0ZS5jYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsK
LSAgICAKLSAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQgdXNlciBub3JtYWwgcHJpb3JpdHkg
cHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHByb3BlcnRpZXMuCi0gICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxz
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAxLCBtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1
bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlv
cml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmly
c3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9u
bHkpOwotICAgCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0
aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0gICAgCi0gICAgQVNTRVJU
KCFzdGF0ZS5mb250RGlydHkoKSk7Ci0gICAgCi0gICAgaWYgKGNhY2hlSXRlbSB8fCAhY2FjaGVI
YXNoKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0
eWxlKCkpKQotICAgICAgICByZXR1cm47Ci0gICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hl
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1
bHQpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBTdHls
ZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCi17Ci0gICAgcmV0dXJuIHIx
LT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5
KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFn
ZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBpZiAoIXJ1bGVzKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7Ci0g
ICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVs
ZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKLSAgICBpZiAobWF0Y2hl
ZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN0ZDo6c3RhYmxl
X3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBj
b21wYXJlUGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVk
UGFnZVJ1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1
bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Ci19Ci0KLXN0YXRpYyBib29s
IGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3Is
IGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFt
ZSkKLXsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3Rvcjsg
Y29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgewotICAgICAg
ICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKLSAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgp
LmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBs
b2NhbE5hbWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICB9Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNv
bXBvbmVudC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBz
ZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQot
ICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFn
ZSAmJiAhaXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNo
ZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3R5
bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAgICAgIGlmICghY2hlY2tQYWdlU2Vs
ZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdl
LCBwYWdlTmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBJZiB0aGUg
cnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCi0gICAgICAg
IGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7
Ci0gICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0
IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Ci0g
ICAgfQotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkg
Y29uc3QKLXsKLSAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9IGZhbHNlOwotICAgIGlmICghbV9z
dGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAg
ICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlz
Rmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6Omlz
Rmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IEluIGNhc2Ug
b2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJl
IHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBhZ2VJbmRleCk7Ci19Ci0KLVN0cmluZyBT
dHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAotewotICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KLSAg
ICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvU3R5
bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUp
Ci17Ci0gICAgaW5pdEVsZW1lbnQoMCk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIDAsIHN0eWxlKTsKLSAgICBtX3N0YXRlLnNldFN0eWxlKHN0eWxlKTsKLSAg
ICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZhbHVlKTsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwg
Q1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0
eShpZCwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29s
b3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclRvcENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21D
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91
dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dFN0cm9rZUNvbG9yOgotICAgIC8vIEFsc28gYWxsb3cgc2hvcnRoYW5kcyBzbyB0aGF0IGlu
aGVyaXQvaW5pdGlhbCBzdGlsbCB3b3JrLgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGU6Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBj
YXNlIENTU1Byb3BlcnR5RmlsbDoKLSAgICBjYXNlIENTU1Byb3BlcnR5U3Ryb2tlOgotI2VuZGlm
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAg
IH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cv
Y3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxlLXJ1bGUKLS8vIEZJWE1FOiBhZGQgaW5j
cmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9uIHN0eWxpbmcgcHJvcGVydGllcy4KLWlu
bGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1By
b3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi1pbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQotewot
ICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9u
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25YOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5Rm9udDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWln
aHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eU9wYWNpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZU9mZnNldDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJTdHlsZToKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotLy8gU1ZHIGhhbmRsZXMg
em9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFyZWQgdG8gQ1NTLiBUaGUgd2hvbGUgZG9j
dW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKLS8vIG9mIGVhY2ggaW5kaXZpZHVhbCBsZW5ndGggdmFs
dWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENTU1ByaW1pdGl2ZVZhbHVlOjpjb21wdXRl
TGVuZ3RoKigpCi0vLyBtdWx0aXBsaWVzIGVhY2ggcmVzb2x2ZWQgbGVuZ3RoIHdpdGggdGhlIHpv
b20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVlZCB0byBkaXNhYmxlIHRoYXQuCi0vLyBU
aG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvdXRlcm1vc3QgPHN2
Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy4uLikKLS8vIG5lZWQgdG8g
cmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0aGUgcGFyZW50IGNsYXNzIG9mIFJlbmRl
clNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCi0vLyB3aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRp
bmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZvciBTVkcgdGhlc2UgdmFsdWVzIHdvdWxk
IG5ldmVyIHNjYWxlLAotLy8gaWYgd2UnZCBwYXNzIGEgMS4wIHpvb20gZmFjdG9yIGV2ZXJ5aHdl
cmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9yIG9mIDEuMCBmb3Igc3BlY2lmaWMKLS8v
IHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQgdG8gc2NhbGUgd2l0aGluIGEgem9vbWVk
IFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2luZy9mb250LXNpemUpLgotYm9vbCBTdHls
ZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQotewotICAgIHJldHVybiBtX3N0YXRlLmVsZW1l
bnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCk7Ci19Ci0KLXN0YXRpYyBi
b29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZh
bHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIExlbmd0aCYgd29ya2luZ0xl
bmd0aCkKLXsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVX
ZWJraXRNaW5Db250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdMZW5ndGggPSBMZW5ndGgoTWluQ29u
dGVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1heENvbnRlbnQpIHsKLSAgICAgICAg
d29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgd29ya2luZ0xlbmd0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9M
ZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgVmlld3Bv
cnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBz
dGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7
Ci0gICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmluZWQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICB3b3Jr
aW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVlLT5pc1F1aXJrVmFsdWUoKSk7Ci0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTWluTWF4KENT
U1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3Rh
dGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1NpemUpCi17Ci0gICAgUGFpciogbWluTWF4
VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdldFBhaXJWYWx1ZSgpOwotICAgIGlmICgh
bWluTWF4VHJhY2tCcmVhZHRoKSB7Ci0gICAgICAgIExlbmd0aCB3b3JraW5nTGVuZ3RoOwotICAg
ICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLCB3
b3JraW5nTGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cmFj
a1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRoOwotICAgIExlbmd0aCBtYXhUcmFja0Jy
ZWFkdGg7Ci0gICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0
aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0aCkgfHwgIWNyZWF0ZUdyaWRUcmFja0Jy
ZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQoKSwgc3RhdGUsIG1heFRyYWNrQnJlYWR0
aCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRyYWNrU2l6ZS5zZXRNaW5NYXgobWlu
VHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1z
dGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChDU1NWYWx1ZSogdmFsdWUsIGNvbnN0IFN0
eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1Np
emVzKQotewotICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01v
cmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFs
dWUoKTsKLSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBHcmlkVHJhY2tTaXplIHRyYWNrU2l6ZTsK
LSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5NYXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJhY2tTaXplKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICB0cmFja1NpemVzLmFwcGVuZCh0cmFja1NpemUpOwotICAg
IH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTGlz
dChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcywgY29u
c3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQotewotICAgIC8vIEhhbmRsZSAnbm9uZScu
Ci0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZU5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0ZUdyaWRUcmFja0dyb3VwKHZh
bHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Ci19Ci0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFBv
c2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0aW9uJiBwb3NpdGlvbikKLXsKLSAgICAv
LyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVnZXI+IHwgJ2F1dG8nCi0gICAgaWYgKCF2
YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHZhbHVlKTsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0g
Q1NTVmFsdWVBdXRvKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEFTU0VSVF9XSVRIX1NF
Q1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKTsKLSAgICBwb3Np
dGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi1zdGF0aWMg
Ym9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZh
bHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHBy
aW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0g
ICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKLSAg
ICB9Ci0KLSAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRpb25WYWx1ZSgpKQotICAgICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFsdWUpLT5oYXNWYXJpYWJsZVJlZmVyZW5j
ZSgpOwotCi0gICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1Jl
ZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4o
dmFsdWUpOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZGlyZWN0aW9uID0gcmVmbGVjdFZh
bHVlLT5kaXJlY3Rpb24oKTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIG9mZnNldCA9IHJl
ZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7Ci0gICAgICAgIENTU1ZhbHVlKiBtYXNrID0gcmVmbGVjdFZh
bHVlLT5tYXNrKCk7Ci0gICAgICAgIHJldHVybiAoZGlyZWN0aW9uICYmIGhhc1ZhcmlhYmxlUmVm
ZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uob2Zm
c2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UobWFzaykpOwotICAgIH0KLQot
ICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5h
ZHZhbmNlKCkpIHsKLSAgICAgICAgaWYgKGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGkudmFsdWUoKSkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0eUlEIGlk
LCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5n
PiA+JiBrbm93bkV4cHJlc3Npb25zKQotewotICAgIHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBT
dHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJpYWxpemVSZXNvbHZpbmdWYXJpYWJsZXMo
Km1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsKLQotICAgIGlmIChrbm93bkV4cHJlc3Np
b25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQotICAgICAgICByZXR1cm47IC8vIGN5Y2xlIGRldGVj
dGVkLgotCi0gICAga25vd25FeHByZXNzaW9ucy5hcHBlbmQoZXhwcmVzc2lvbik7Ci0KLSAgICAv
LyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0byByZS1wYXJzZSBmcm9tIHN0cmluZ3Ms
IGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0aW9uIGxpdmVzIGluc2lkZSB0aGUgcGFy
c2VyIHNvIHdlIGRvIGl0IHRoZXJlLgotICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiByZXN1
bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKTsKLSAgICBpZiAoIUNTU1BhcnNlcjo6
cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBleHByZXNzaW9uLnNlY29uZCwgZmFsc2Us
IGRvY3VtZW50KCkpKQotICAgICAgICByZXR1cm47IC8vIGV4cHJlc3Npb24gZmFpbGVkIHRvIHBh
cnNlLgotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNldC0+cHJvcGVydHlD
b3VudCgpOyBpKyspIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVu
Y2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5QXQoaSk7Ci0gICAgICAgIGlmIChwcm9w
ZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uo
cHJvcGVydHkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXNvbHZlVmFyaWFibGVzKHByb3BlcnR5
LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhwcmVzc2lvbnMpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVl
KCkpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVy
dHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQotewotI2lmIEVOQUJMRShDU1Nf
VkFSSUFCTEVTKQotICAgIGlmIChpZCAhPSBDU1NQcm9wZXJ0eVZhcmlhYmxlICYmIGhhc1Zhcmlh
YmxlUmVmZXJlbmNlKHZhbHVlKSkgewotICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3Bl
cnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25zOwotICAgICAgICByZXNvbHZlVmFyaWFi
bGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0jZW5kaWYKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgYm9vbCBpc0luaGVy
aXQgPSBzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUoKTsKLSAg
ICBib29sIGlzSW5pdGlhbCA9IHZhbHVlLT5pc0luaXRpYWxWYWx1ZSgpIHx8ICghc3RhdGUucGFy
ZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpOwotCi0gICAgQVNTRVJUKCFp
c0luaGVyaXQgfHwgIWlzSW5pdGlhbCk7IC8vIGlzSW5oZXJpdCAtPiAhaXNJbml0aWFsICYmIGlz
SW5pdGlhbCAtPiAhaXNJbmhlcml0Ci0gICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgKHN0YXRlLnBh
cmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKSk7IC8vIGlzSW5oZXJpdCAtPiAoc3Rh
dGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpCi0KLSAgICBpZiAoIXN0YXRl
LmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpICYmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRv
VmlzaXRlZExpbmtTdHlsZSgpIHx8ICFpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShpZCkpKSB7
Ci0gICAgICAgIC8vIExpbWl0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8g
b25seSB0aGUgb25lcyBob25vcmVkIGJ5IDp2aXNpdGVkLgotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKGlzSW5oZXJpdCAmJiAhc3RhdGUucGFyZW50U3R5bGUoKS0+aGFzRXhwbGlj
aXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSAmJiAhQ1NTUHJvcGVydHk6OmlzSW5oZXJpdGVkUHJv
cGVydHkoaWQpKQotICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRIYXNFeHBsaWNpdGx5
SW5oZXJpdGVkUHJvcGVydGllcygpOwotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAg
aWYgKGlkID09IENTU1Byb3BlcnR5VmFyaWFibGUpIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfU0VD
VVJJVFlfSU1QTElDQVRJT04odmFsdWUtPmlzVmFyaWFibGVWYWx1ZSgpKTsKLSAgICAgICAgQ1NT
VmFyaWFibGVWYWx1ZSogdmFyaWFibGUgPSBzdGF0aWNfY2FzdDxDU1NWYXJpYWJsZVZhbHVlKj4o
dmFsdWUpOwotICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsKLSAg
ICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+dmFsdWUoKS5pc0VtcHR5KCkpOwotICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRWYXJpYWJsZSh2YXJpYWJsZS0+bmFtZSgpLCB2YXJpYWJsZS0+dmFsdWUo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIENoZWNrIGxvb2t1
cCB0YWJsZSBmb3IgaW1wbGVtZW50YXRpb25zIGFuZCB1c2Ugd2hlbiBhdmFpbGFibGUuCi0gICAg
Y29uc3QgUHJvcGVydHlIYW5kbGVyJiBoYW5kbGVyID0gbV9zdHlsZUJ1aWxkZXIucHJvcGVydHlI
YW5kbGVyKGlkKTsKLSAgICBpZiAoaGFuZGxlci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgaWYgKGlz
SW5oZXJpdCkKLSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbmhlcml0VmFsdWUoaWQsIHRoaXMp
OwotICAgICAgICBlbHNlIGlmIChpc0luaXRpYWwpCi0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5
SW5pdGlhbFZhbHVlKGlkLCB0aGlzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGFuZGxl
ci5hcHBseVZhbHVlKGlkLCB0aGlzLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSB2YWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSkgOiAwOwot
Ci0gICAgZmxvYXQgem9vbUZhY3RvciA9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsK
LQotICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGxpc3QgdGhhdCBtYXBzIHRoZSBDU1MgcHJvcGVy
dGllcyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZnJvbnQtZW5kCi0gICAgLy8gUmVuZGVyU3R5
bGUgdmFsdWVzLiBTaG9ydGhhbmRzIChlLmcuIGJvcmRlciwgYmFja2dyb3VuZCkgb2NjdXIgaW4g
dGhpcyBsaXN0IGFzIHdlbGwgYW5kCi0gICAgLy8gYXJlIG9ubHkgaGl0IHdoZW4gbWFwcGluZyAi
aW5oZXJpdCIgb3IgImluaXRpYWwiIGludG8gZnJvbnQtZW5kIHZhbHVlcy4KLSAgICBzd2l0Y2gg
KGlkKSB7Ci0gICAgLy8gbGlzdHMKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoKLSAgICAg
ICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQotICAgICAgICB7Ci0g
ICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBpbmhl
cml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlzCi0gICAgICAgICAgICAvLyBub3Rl
IGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBiZSBzdXBw
b3J0ZWQuCi0KLSAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBib29sIGRpZFNldCA9IGZhbHNl
OwotICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFz
TW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0g
aS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJhdG9yVmFs
dWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZhbHVlKCkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxl
R2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4oaXRl
bSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0KTsKLSAg
ICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8
Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICAgICAg
ICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJvbVZhbHVl
KENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KGl0ZW0p
KSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNlbmRpZgot
ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlVmFs
dWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNh
Y2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENT
U0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNl
dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0
ZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkgewot
ICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRlbnRWYWx1
ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAg
IGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUt
PmlzQXR0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBuYW1lc3Bh
Y2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICAgICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRV
bmlxdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51bGxBdG9t
LCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5lbGVtZW50
KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmltcGwoKSwg
ZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGFm
ZmVjdHMgdGhlIHN0eWxlCi0gICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRDb3VudGVy
VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0eWxlVHlw
ZSA9IE5vbmVMaXN0U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5bGVJZGVu
dCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlzdFN0eWxl
SWRlbnQgLSBDU1NWYWx1ZURpc2MpOwotICAgICAgICAgICAgICAgICAgICBPd25QdHI8Q291bnRl
ckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291bnRlclZh
bHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2VwYXJhdG9y
KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb3Vu
dGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gg
KGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlT3BlblF1b3RlOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAg
ZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5RdW90ZToK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fT1BF
Tl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KLSAgICAgICAgICAgICAg
ICAgICAgICAgIHsgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaWRTZXQpCi0gICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgotICAgICAgICBpZiAoaXNJbmhlcml0
KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFyZW50U3R5
bGUoKS0+cXVvdGVzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAg
IGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3Rlcygw
KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUtPmlz
VmFsdWVMaXN0KCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19j
YXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKLSAgICAgICAgICAgIFJlZlB0cjxRdW90ZXNEYXRh
PiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIENT
U1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAg
ICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNvIHRoaXMg
aXMgc2FmZS4KLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+aXRlbShp
ICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQpCi0gICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FU
SU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9X
SVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKLSAg
ICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmlu
ZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0
U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3RkOjptYWtl
X3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseTog
ewotICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlkcwotICAgICAgICBpZiAoaXNJbmhl
cml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2NyaXB0aW9u
ID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBG
b250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2Ny
aXB0aW9uKCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShw
YXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKLSAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkp
OwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChwYXJlbnRG
b250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOwotICAgICAgICAgICAgc2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRp
b24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KTsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFjY291bnQg
Zm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKLSAgICAgICAgICAg
IC8vIHRvIG5vbi1tb25vc3BhY2UuCi0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtl
eXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKLSAg
ICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5
d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29y
ZFNpemUoKSAtIDEsIGZhbHNlKSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2Vu
ZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOwotICAgICAgICAgICAgaWYg
KCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKLSAgICAgICAgICAg
ICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkp
OwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVl
TGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9u
dERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAg
IEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCk7
Ci0gICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAwOwotCi0gICAgICAgIC8vIEJlZm9y
ZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQgcmVzZXQg
dGhlIGdlbmVyaWMgZmFtaWx5LgotICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhlZERlZmF1
bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKLSAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWls
eSk7Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFz
TW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBpLnZh
bHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250
ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotICAgICAg
ICAgICAgQXRvbWljU3RyaW5nIGZhY2U7Ci0gICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3Mg
PSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0
cmluZygpKQotICAgICAgICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0cmluZ1Zh
bHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncykgewotICAgICAgICAgICAgICAg
IHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVdlYmtpdEJvZHk6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXR0aW5n
cy0+c3RhbmRhcmRGb250RmFtaWx5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IHNlcmlmRmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNTZXJpZjoK
LSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKLSAgICAgICAgICAg
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9u
OjpTYW5zU2VyaWZGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9
IGN1cnNpdmVGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRH
ZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50YXN5Ogot
ICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKLSAgICAgICAgICAgICAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpG
YW50YXN5RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG1v
bm9zcGFjZUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdl
bmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0UGlj
dG9ncmFwaDoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1pbHk7Ci0g
ICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnRE
ZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFm
YWNlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkgewotICAg
ICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCi0gICAgICAg
ICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKLSAgICAgICAgICAgICAg
ICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGluaGVyaXRl
ZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9
ICZmaXJzdEZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElz
U3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZvbnREZXNj
cmlwdGlvbjo6Tm9GYW1pbHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFyZWRGb250
RmFtaWx5OjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5zZXRGYW1p
bHkoZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZhbWlseShu
ZXdGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFtaWx5Lmdl
dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAg
ICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFsbCBuZXcg
Zm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKLSAgICAgICAgLy8gSWYgY3VyckZhbWlseSBp
cyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMgZGVzY3Jp
cHRpb24uCi0gICAgICAgIGlmIChjdXJyRmFtaWx5KSB7Ci0gICAgICAgICAgICBpZiAoZm9udERl
c2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVs
dFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKLSAgICAgICAgICAgICAg
ICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVu
dCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEs
ICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOwotCi0gICAgICAgICAgICBzZXRGb250
RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47
Ci0gICAgfQotLy8gc2hvcnRoYW5kIHByb3BlcnRpZXMKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZDoKLSAgICAgICAgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+Y2xlYXJCYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNJbmhl
cml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0QmFja2dyb3VuZExheWVy
cygqc3RhdGUucGFyZW50U3R5bGUoKS0+YmFja2dyb3VuZExheWVycygpKTsKLSAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldEJhY2tncm91bmRDb2xvcihzdGF0ZS5wYXJlbnRTdHlsZSgpLT5i
YWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrOgotICAgICAgICBpZiAoaXNJbml0aWFsKQotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJNYXNrTGF5ZXJzKCk7Ci0gICAgICAgIGVsc2UgaWYgKGlz
SW5oZXJpdCkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRNYXNrTGF5ZXJzKCpz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5tYXNrTGF5ZXJzKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnQ6Ci0gICAgICAgIGlmIChpc0luaGVyaXQpIHsKLSAgICAgICAg
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgp
LT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVI
ZWlnaHQoc3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lmaWVkTGluZUhlaWdodCgpKTsKLSAgICAg
ICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICAgICAgICAgIHNldEZvbnRE
ZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlh
bCkgewotICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygp
OwotICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUg
cmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5k
IHRodXMgaGF2ZSBzZXR0aW5ncwotICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdz
KTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQo
KSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0KLSAgICAgICAg
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgICAgICAgICBSZW5kZXJU
aGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCksIGZvbnREZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIERvdWJsZS1jaGVjayBhbmQg
c2VlIGlmIHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElmIG5vdCwgZG9uJ3QgYm90aGVyIHVwZGF0
aW5nIHRoZSBmb250LgotICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRl
U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZW5kZXJpbmcgbW9k
ZSBhbmQgcHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1cGRhdGVkLgotICAgICAgICAgICAgICAg
IFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAg
ICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0
aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNl
dHRpbmdzCi0gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdN
b2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICAgICAgICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAh
c2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotCi0gICAgICAgICAg
ICAgICAgLy8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4KLSAgICAgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KGRvY3VtZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6
ZSgpLCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpLCB1c2VTVkdab29tUnVsZXMoKSkp
OwotICAgICAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwot
ICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5pc0ZvbnRWYWx1ZSgpKSB7
Ci0gICAgICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBzdGF0aWNfY2FzdDxGb250VmFsdWUqPih2
YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIWZvbnQtPnN0eWxlIHx8ICFmb250LT52YXJpYW50IHx8
ICFmb250LT53ZWlnaHQKLSAgICAgICAgICAgICAgICB8fCAhZm9udC0+c2l6ZSB8fCAhZm9udC0+
bGluZUhlaWdodCB8fCAhZm9udC0+ZmFtaWx5KQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U3R5bGUsIGZvbnQtPnN0eWxl
LmdldCgpKTsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250VmFyaWFu
dCwgZm9udC0+dmFyaWFudC5nZXQoKSk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1By
b3BlcnR5Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0LmdldCgpKTsKLSAgICAgICAgICAgIC8vIFRo
ZSBwcmV2aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIgZm9udCBidXQgdGhleSBkb24ndCB0
cnkgdG8gcmVhZCB0aGUgZm9udCdzCi0gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGJhY2ssIHdo
aWNoIGlzIHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXplIGlzIHVzaW5nIHRoZSAnZXgnIHVuaXQs
IGl0IHdpbGwKLSAgICAgICAgICAgIC8vIG5lZWQgcXVlcnkgdGhlIGRpcnRpZWQgZm9udCdzIHgt
aGVpZ2h0IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8gYmUgc2FmZSBpbiB0aGlzCi0gICAg
ICAgICAgICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0aGUgZm9udCBub3cuCi0gICAgICAg
ICAgICB1cGRhdGVGb250KCk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5
Rm9udFNpemUsIGZvbnQtPnNpemUuZ2V0KCkpOwotCi0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5l
SGVpZ2h0VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQoKSk7Ci0KLSAgICAgICAgICAgIGFwcGx5
UHJvcGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmb250LT5mYW1pbHkuZ2V0KCkpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIENTUzMgUHJvcGVydGllcwotICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaGFkb3c6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdzogewotICAgICAgICBpZiAoaXNJ
bmhlcml0KSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQot
ICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHN0YXRl
LnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpz
dGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkpKSA6IG51bGxwdHIpOwotICAgICAgICAg
ICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgp
LT5ib3hTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5ib3hTaGFkb3coKSkpIDogbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlz
SW5pdGlhbCB8fCBwcmltaXRpdmVWYWx1ZSkgLy8gaW5pdGlhbCB8IG5vbmUKLSAgICAgICAgICAg
IHJldHVybiBpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cgPyBzdGF0ZS5zdHlsZSgpLT5zZXRU
ZXh0U2hhZG93KG51bGxwdHIpIDogc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KG51bGxwdHIp
OwotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1
cm47Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFz
TW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9
IGkudmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkp
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRl
bSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4oY3VyclZhbHVlKTsKLSAgICAgICAgICAgIGlu
dCB4ID0gaXRlbS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBpbnQgeSA9IGl0ZW0t
PnktPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8g
aXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAgICAgICAgICAgaW50IHNwcmVhZCA9
IGl0ZW0tPnNwcmVhZCA/IGl0ZW0tPnNwcmVhZC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAgICAg
ICAgICAgU2hhZG93U3R5bGUgc2hhZG93U3R5bGUgPSBpdGVtLT5zdHlsZSAmJiBpdGVtLT5zdHls
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluc2V0ID8gSW5zZXQgOiBOb3JtYWw7Ci0gICAgICAg
ICAgICBDb2xvciBjb2xvcjsKLSAgICAgICAgICAgIGlmIChpdGVtLT5jb2xvcikKLSAgICAgICAg
ICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgp
KTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLnN0eWxlKCkpCi0gICAgICAgICAgICAgICAg
Y29sb3IgPSBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotCi0gICAgICAgICAgICBPd25QdHI8U2hh
ZG93RGF0YT4gc2hhZG93RGF0YSA9IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKEludFBvaW50KHgs
IHkpLCBibHVyLCBzcHJlYWQsIHNoYWRvd1N0eWxlLCBpZCA9PSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eFNoYWRvdywgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQpKTsK
LSAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cpCi0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwg
aS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBl
bnRyeQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dEJveFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRo
ZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICB9Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoYm94UmVmbGVjdCwgQm94UmVmbGVj
dCkKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRCb3hSZWZsZWN0KFJlbmRlclN0eWxlOjppbml0aWFsQm94UmVmbGVjdCgpKTsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzUmVm
bGVjdFZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ1NTUmVmbGVjdFZh
bHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7
Ci0gICAgICAgIFJlZlB0cjxTdHlsZVJlZmxlY3Rpb24+IHJlZmxlY3Rpb24gPSBTdHlsZVJlZmxl
Y3Rpb246OmNyZWF0ZSgpOwotICAgICAgICByZWZsZWN0aW9uLT5zZXREaXJlY3Rpb24oKnJlZmxl
Y3RWYWx1ZS0+ZGlyZWN0aW9uKCkpOwotICAgICAgICBpZiAocmVmbGVjdFZhbHVlLT5vZmZzZXQo
KSkKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE9mZnNldChyZWZsZWN0VmFsdWUtPm9mZnNl
dCgpLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252
ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikpOwotICAgICAgICBOaW5lUGllY2VJbWFnZSBtYXNr
OwotICAgICAgICBtYXNrLnNldE1hc2tEZWZhdWx0cygpOwotICAgICAgICBtX3N0eWxlTWFwLm1h
cE5pbmVQaWVjZUltYWdlKGlkLCByZWZsZWN0VmFsdWUtPm1hc2soKSwgbWFzayk7Ci0gICAgICAg
IHJlZmxlY3Rpb24tPnNldE1hc2sobWFzayk7Ci0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
Qm94UmVmbGVjdChyZWZsZWN0aW9uLnJlbGVhc2UoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNyYzogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVs
ZXMuCi0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZVJhbmdlOiAv
LyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KLSAgICAgICAgcmV0dXJuOwotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgotICAgICAgICBpZiAoaXNJbmhlcml0KSB7
Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb2x1bW5SdWxlQ29sb3Ioc3RhdGUucGFy
ZW50U3R5bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkuaXNWYWxpZCgpID8gc3RhdGUucGFyZW50U3R5
bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkgOiBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5jb2xvcigpKTsK
LSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbHVtblJ1bGVTdHlsZShzdGF0ZS5wYXJl
bnRTdHlsZSgpLT5jb2x1bW5SdWxlU3R5bGUoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRDb2x1bW5SdWxlV2lkdGgoc3RhdGUucGFyZW50U3R5bGUoKS0+Y29sdW1uUnVsZVdpZHRo
KCkpOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnJlc2V0Q29sdW1uUnVsZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcnF1ZWU6Ci0gICAgICAgIGlmICghaXNJbmhlcml0KQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlRGlyZWN0aW9uKHN0
YXRlLnBhcmVudFN0eWxlKCktPm1hcnF1ZWVEaXJlY3Rpb24oKSk7Ci0gICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoc3RhdGUucGFyZW50U3R5bGUoKS0+bWFycXVlZUlu
Y3JlbWVudCgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHN0YXRl
LnBhcmVudFN0eWxlKCktPm1hcnF1ZWVTcGVlZCgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZUxvb3BDb3VudChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5tYXJxdWVlTG9vcENvdW50
KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlQmVoYXZpb3Ioc3RhdGUucGFy
ZW50U3R5bGUoKS0+bWFycXVlZUJlaGF2aW9yKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0aW9uOiB7Ci0gICAgICAgIEhBTkRMRV9J
TkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291bnQsIE1hcnF1ZWVMb29wQ291bnQpCi0g
ICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluZmluaXRlKQotICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudCgtMSk7IC8vIC0xIG1l
YW5zIHJlcGVhdCBmb3JldmVyLgotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNO
dW1iZXIoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQo
cHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3BlZWQ6IHsKLSAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVkLCBNYXJxdWVlU3BlZWQpCi0gICAgICAg
IGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChp
bnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgc3dp
dGNoIChpZGVudCkgewotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNsb3c6Ci0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDUwMCk7IC8vIDUwMCBtc2VjLgot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoK
LSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoODUpOyAvLyA4
NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBTdXBlciBmYXN0LgotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZh
bHVlLT5pc1RpbWUoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVl
ZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50LCBDU1NQcmltaXRpdmVWYWx1ZTo6TWls
bGlzZWNvbmRzPigpKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVy
KCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVJbmNy
ZW1lbnQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUluY3Jl
bWVudCwgTWFycXVlZUluY3JlbWVudCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0g
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMSwgRml4ZWQpKTsgLy8gMXB4LgotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKLSAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCg2
LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxhcmdlOgotICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDM2LCBGaXhlZCkpOyAvLyAz
NnB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVMZW5ndGggPSBjb252ZXJ0VG9JbnRMZW5n
dGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KSk7Ci0gICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5ndGguaXNVbmRlZmluZWQoKSkKLSAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KG1hcnF1ZWVMZW5n
dGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdExvY2FsZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChs
b2NhbGUsIExvY2FsZSk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZUF1dG8pCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUobnVsbEF0b20p
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUocHJp
bWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwotICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNl
bGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkpOwotICAgICAgICBzZXRGb250RGVzY3Jp
cHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dFNpemVBZGp1c3Q6IHsKLSAgICAgICAgSEFORExFX0lOSEVS
SVRfQU5EX0lOSVRJQUwodGV4dFNpemVBZGp1c3QsIFRleHRTaXplQWRqdXN0KQotICAgICAgICBp
ZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgc2V0VGV4dFNpemVBZGp1c3QocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNp
ZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdERh
c2hib2FyZFJlZ2lvbjoKLSAgICB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lvbnMpCi0gICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJTdHlsZTo6bm9uZURhc2hib2FyZFJlZ2lv
bnMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEYXNoYm9h
cmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVlLT5nZXREYXNoYm9hcmRSZWdpb25WYWx1
ZSgpOwotICAgICAgICBpZiAoIXJlZ2lvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAg
ICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9uOwotICAgICAgICB3aGlsZSAocmVnaW9u
KSB7Ci0gICAgICAgICAgICBMZW5ndGggdG9wID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+
dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAg
ICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5yaWdodCgpLCBz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVu
Z3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPmJvdHRvbSgpLCBzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVuZ3RoIGxl
ZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5sZWZ0KCksIHN0YXRlLnN0eWxlKCksIHN0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmICh0b3AuaXNVbmRlZmlu
ZWQoKSkKLSAgICAgICAgICAgICAgICB0b3AgPSBMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChy
aWdodC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJpZ2h0ID0gTGVuZ3RoKCk7Ci0g
ICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgYm90
dG9tID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVmdC5pc1VuZGVmaW5lZCgpKQotICAg
ICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKHJlZ2lvbi0+
bV9pc0NpcmNsZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRS
ZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3As
IHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7Ci0g
ICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNSZWN0YW5nbGUpCi0gICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9u
OjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBy
ZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwotICAgICAgICAgICAgcmVnaW9uID0gcmVn
aW9uLT5tX25leHQuZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5kb2N1bWVudCgp
LT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0jZW5kaWYKLSNpZiBFTkFCTEUoRFJBR0dBQkxFX1JFR0lPTikKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QXBwUmVnaW9uOiB7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUgfHwgIXBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25Nb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJ
ZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJsZVJlZ2lvbkRyYWcgOiBEcmFnZ2FibGVS
ZWdpb25Ob0RyYWcpOwotICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRS
ZWdpb25zKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDogewotICAgICAgICBIQU5ETEVfSU5IRVJJ
VF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRleHRTdHJva2VXaWR0aCkKLSAgICAgICAg
ZmxvYXQgd2lkdGggPSAwOwotICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpKSB7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGluOgotICAgICAgICBjYXNlIENTU1ZhbHVl
TWVkaXVtOgotICAgICAgICBjYXNlIENTU1ZhbHVlVGhpY2s6IHsKLSAgICAgICAgICAgIGRvdWJs
ZSByZXN1bHQgPSAxLjAgLyA0ODsKLSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0
SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKLSAgICAgICAgICAgICAgICByZXN1bHQgKj0gMzsK
LSAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlVGhpY2spCi0gICAgICAgICAgICAgICAgcmVzdWx0ICo9IDU7Ci0gICAgICAgICAgICB3aWR0
aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVzdWx0LCBDU1NQcmltaXRpdmVWYWx1ZTo6
Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
fQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgd2lkdGggPSBwcmltaXRpdmVWYWx1ZS0+
Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0aCh3aWR0aCk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybTogewotICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFuc2Zvcm0sIFRyYW5zZm9ybSk7Ci0gICAg
ICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgY3JlYXRlVHJhbnNm
b3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCBvcGVyYXRpb25zKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VHJhbnNmb3JtKG9w
ZXJhdGlvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRQZXJzcGVjdGl2ZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChw
ZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCi0KLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkK
LSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQ
ZXJzcGVjdGl2ZSgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAg
IGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNM
ZW5ndGgoKSkKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBwcmltaXRpdmVWYWx1ZS0+
Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVt
YmVyKCkpIHsKLSAgICAgICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVh
dCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUg
PSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBlcnNwZWN0aXZl
VmFsdWUgPj0gMC4wZikKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZl
KHBlcnNwZWN0aXZlVmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBbmltYXRpb246Ci0gICAgICAgIGlmIChpc0luaXRpYWwpCi0gICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckFuaW1hdGlvbnMoKTsKLSAgICAgICAgZWxzZSBpZiAo
aXNJbmhlcml0KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEFuaW1hdGlvbnMo
c3RhdGUucGFyZW50U3R5bGUoKS0+YW5pbWF0aW9ucygpKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgotICAgICAgICBpZiAoaXNJbml0aWFs
KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJUcmFuc2l0aW9ucygpOwotICAgICAg
ICBlbHNlIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0
VHJhbnNpdGlvbnMoc3RhdGUucGFyZW50U3R5bGUoKS0+dHJhbnNpdGlvbnMoKSk7Ci0gICAgICAg
IHJldHVybjsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUYXBIaWdobGlnaHRDb2xvcjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0Q29sb3IpOwotICAgICAgICBpZiAo
IXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgQ29sb3IgY29s
ID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZlVmFsdWUpOwotICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotI2VuZGlmCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6IHsKLSAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZywgVXNl
VG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlVG91Y2hPdmVy
Zmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVRvdWNo
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlJ
bnZhbGlkOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gRGlyZWN0aW9uYWwgcHJvcGVydGllcyBh
cmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoKSBiZWZvcmUgdGhl
IHN3aXRjaC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyRW5kU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFdp
ZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyU3RhcnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3Rh
cnRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckJlZm9yZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJDb2xvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luRW5k
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5TdGFydDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJn
aW5BZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQ29sbGFwc2U6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2lu
Qm90dG9tQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdFbmQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UGFkZGluZ0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGlu
Z0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsV2lkdGg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNh
bEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0OgotICAgIHsKLSAgICAgICAg
Q1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQ
cm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxlKCktPndy
aXRpbmdNb2RlKCkpOwotICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQpOwotICAgICAgICByZXR1
cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3Bl
cnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJv
dWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0TGluZVRocm91Z2hXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5l
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5l
U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdpZHRoOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJs
aW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHRVbmRlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNpemVEZWx0
YToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3Q6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRleHRFbXBoYXNpczoKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gQ1NTIFRleHQg
TGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0aW5nIHN1cHBvcnQKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2RlKTsKLSAgICAgICAgCi0gICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNldFdyaXRpbmdNb2RlKCpwcmltaXRp
dmVWYWx1ZSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IEl0IGlzIG5vdCBvayB0byBtb2RpZnkgZG9j
dW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCi0gICAgICAgIGlmIChzdGF0ZS5lbGVt
ZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmRvY3VtZW50RWxl
bWVudCgpKQotICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0V3JpdGluZ01vZGVTZXRP
bkRvY3VtZW50RWxlbWVudCh0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246IHsKLSAgICAgICAgSEFORExFX0lO
SEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBUZXh0T3JpZW50YXRpb24pOwotCi0g
ICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNldFRleHRPcmllbnRhdGlv
bigqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsKLSAgICAgICAgSEFORExFX0lOSEVS
SVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVCb3hDb250YWluKQotICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFpbihM
aW5lQm94Q29udGFpbk5vbmUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFpblZhbHVlKCkpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgQ1NTTGluZUJveENvbnRhaW5WYWx1ZSogbGluZUJveENvbnRh
aW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250YWluVmFsdWUqPih2YWx1ZSk7Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250YWluKGxpbmVCb3hDb250YWluVmFs
dWUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ1NTIEZvbnRz
IE1vZHVsZSBMZXZlbCAzCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRGZWF0dXJlU2V0
dGluZ3M6IHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7Ci0gICAgICAgICAgICBzZXRGb250RGVzY3Jp
cHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkubWFrZU5vcm1hbEZlYXR1cmVT
ZXR0aW5ncygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAg
Rm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNj
cmlwdGlvbigpOwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NW
YWx1ZUxpc3QqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxGb250RmVhdHVyZVNldHRpbmdzPiBz
ZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0ZSgpOwotICAgICAgICBpbnQgbGVu
ID0gbGlzdC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kp
IHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlzdC0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjayhpKTsKLSAgICAgICAgICAgIGlmICghaXRlbS0+aXNGb250RmVhdHVyZVZhbHVlKCkpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBGb250RmVhdHVyZVZhbHVlKiBm
ZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1ZSo+KGl0ZW0pOwotICAgICAgICAg
ICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0dXJlLT50YWcoKSwgZmVhdHVyZS0+
dmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGZWF0dXJl
U2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKLSAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9u
KGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZiBFTkFCTEUo
Q1NTX0ZJTFRFUlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZpbHRlcjogewotICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIsIEZpbHRlcik7Ci0gICAgICAgIEZp
bHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgaWYgKGNyZWF0ZUZpbHRlck9wZXJh
dGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3Bl
cmF0aW9ucykpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRGaWx0ZXIob3BlcmF0aW9u
cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0R3JpZENvbHVtbnM6IHsKLSAgICAgICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNr
U2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXpl
cywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKLSAgICAgICAgVmVjdG9yPEdyaWRUcmFj
a1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1
ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkU3RhcnQ6Ci0gICAgLy8gRklYTUU6
IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhIHNob3J0aGFuZC4KLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjogewotICAgICAgICBHcmlkUG9zaXRp
b24gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUs
IHN0YXJ0UG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkRW5kOiB7Ci0gICAgICAgIEdyaWRQ
b3NpdGlvbiBlbmRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFs
dWUsIGVuZFBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRCZWZvcmU6Ci0gICAgLy8gRklYTUU6
IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBhIHNob3J0aGFuZC4KLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvdzogewotICAgICAgICBHcmlkUG9zaXRpb24g
YmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBi
ZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9uKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7Ci0gICAgICAgIEdy
aWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlv
bih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBT
dHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQg
dmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0
aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVt
ZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFibGUuCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRP
cmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZFBvc2l0aW9uWToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRSZXBlYXRZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90
dG9tU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJJbWFnZU91dHNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VS
ZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU2xpY2U6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJ
bWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRT
dHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRoOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJSaWdodFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRo
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
TGVmdFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wUmlnaHRSYWRpdXM6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJUb3BXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5nOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Q2xlYXI6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlDb3VudGVyUmVzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9hdDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHls
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoKLSNpZiBFTkFCTEUoQ1NT
X0lNQUdFX09SSUVOVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVudGF0aW9u
OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVyaW5nOgotI2lmIEVOQUJM
RShDU1NfSU1BR0VfUkVTT0xVVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZXNvbHV0
aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxl
SW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVBvc2l0aW9uOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFy
Z2luTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luUmlnaHQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eU1hcmdpblRvcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4SGVpZ2h0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluSGVpZ2h0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0
eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0
bGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlPdXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3Zl
cmZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93V3JhcDoKLSAgICBjYXNlIENTU1By
b3BlcnR5T3ZlcmZsb3dYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1k6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0b206
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQ
YWRkaW5nUmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdUb3A6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtC
ZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0luc2lkZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5UG9pbnRlckV2ZW50czoKLSAgICBjYXNlIENTU1Byb3BlcnR5UG9zaXRpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5UmlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNwZWFrOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJsZUxheW91
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0RGVjb3JhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEluZGVudDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dE92ZXJmbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0UmVuZGVy
aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNmb3JtOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpOgotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlWYXJpYWJsZToKLSNlbmRpZgotICAg
IGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlWaXNp
YmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EZWxheToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QW5pbWF0aW9uRmlsbE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkl0
ZXJhdGlvbkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25OYW1lOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25QbGF5U3RhdGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBcHBlYXJhbmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBc3BlY3RS
YXRpbzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZFNp
emU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckZpdDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJSYWRp
dXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2luZzoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246Ci0jaWYgRU5BQkxFKENTU19CT1hfREVD
T1JBVElPTl9CUkVBSykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGVjb3JhdGlvbkJy
ZWFrOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERpcmVjdGlvbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94RmxleEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hMaW5lczoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdyb3VwOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3hPcmllbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFBhY2s6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29ycmVjdGlvbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uQnJlYWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtCZWZv
cmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrSW5zaWRlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uR2FwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Qcm9ncmVzc2lv
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblJ1bGVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uU3BhbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduQ29u
dGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVtczoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QWxpZ25TZWxmOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFzaXM6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhG
bG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4R3JvdzoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0RmxleFNocmluazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFdy
YXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3RpZnlDb250ZW50OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRPcmRlcjoKLSNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRG
bG93SW50bzoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250S2VybmluZzoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNtb290aGluZzoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEhpZ2hsaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlQ2hhcmFj
dGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEFmdGVyOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEJlZm9yZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5lczoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0SHlwaGVuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUFsaWduOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExpbmVDbGFtcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUdyaWQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXJxdWVlRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3R5
bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXNrQm94SW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZVNsaWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTb3Vy
Y2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVdpZHRoOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFza0NvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0ltYWdlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlv
blg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblk6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE5ic3BNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW5YOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6Ci0jaWYgRU5BQkxFKENTU19SRUdJT05TKQotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVn
aW9uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbk92ZXJmbG93
OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ0bE9yZGVyaW5nOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRleHRDb21iaW5lOgotI2lmIEVOQUJMRShDU1MzX1RFWFQpCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dERlY29yYXRpb25TdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEFsaWdu
TGFzdDoKLSNlbmRpZiAvLyBDU1MzX1RFWFQKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1Bv
c2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNTdHlsZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dFNlY3VyaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ry
b2tlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luWjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtU3R5
bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRy
YW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlckRy
YWc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2RpZnk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENsaXBQ
YXRoOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRT
aGFwZVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBUaHJvdWdoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0U2hhcGVPdXRzaWRlOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3Bh
Y2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2lk
dGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V29yZFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlaSW5kZXg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Ci0jaWYgRU5BQkxFKENT
U19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4Wm9vbToKLSAgICBj
YXNlIENTU1Byb3BlcnR5TWluWm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JpZW50YXRpb246
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgotI2VuZGlmCi0gICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSNpZiBFTkFCTEUo
U1ZHKQotICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCi0gICAgICAgIGFwcGx5U1ZH
UHJvcGVydHkoaWQsIHZhbHVlKTsKLSNlbmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQotfQot
Ci1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJv
cGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS0+aXNJ
bWFnZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUocHJv
cGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwotCi0gICAgaWYgKHZh
bHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICBpZiAodmFsdWUtPmlzR3Jh
ZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21W
YWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KHZhbHVlKS0+Z3Jh
ZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpOwotICAgICAgICByZXR1cm4gZ2Vu
ZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZUdl
bmVyYXRvclZhbHVlKj4odmFsdWUpKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NF
VCkKLSAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQotICAgICAgICByZXR1cm4gc2V0
T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVl
Kj4odmFsdWUpKTsKLSNlbmRpZgotCi0gICAgaWYgKHZhbHVlLT5pc0N1cnNvckltYWdlVmFsdWUo
KSkKLSAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3Rh
dGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7Ci0KLSAgICByZXR1cm4gMDsK
LX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VWYWx1ZSogdmFsdWUp
Ci17Ci0gICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGlu
Z0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAg
ICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVl
KTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0
eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAo
dmFsdWUtPmlzUGVuZGluZygpKSB7Ci0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVy
dGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gU3R5bGVQZW5kaW5n
SW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZElt
YWdlOjpjcmVhdGUodmFsdWUpOwotfQotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi1QYXNz
UmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1ZSkKLXsKLSAgICBS
ZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2VTZXQo
ZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZh
bHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotI2VuZGlmCi0KLVBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENT
U1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZhbHVlKQotewotICAg
IFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZShk
b2N1bWVudCgpKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0g
ICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFs
dWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y2hlY2tGb3JUZXh0U2l6ZUFkanVzdCgpCi17Ci0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0g
bV9zdGF0ZS5zdHlsZSgpOwotCi0gICAgaWYgKHN0eWxlLT50ZXh0U2l6ZUFkanVzdCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKHN0
eWxlLT5mb250RGVzY3JpcHRpb24oKSk7Ci0gICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldENvbXB1
dGVkU2l6ZShuZXdGb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpKTsKLSAgICBzdHlsZS0+
c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5
bGUqIHBhcmVudFN0eWxlKQotewotICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpID09IHBh
cmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwot
ICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBz
ZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkp
OwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVy
U3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0KLSAg
ICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwgIXBhcmVudFN0eWxlKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnQgPSBwYXJl
bnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGNoaWxkRm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIC8vIEZvciBub3csIGx1bXAgYWxsIGZhbWlsaWVzIGJ1dCBtb25vc3Bh
Y2UgdG9nZXRoZXIuCi0gICAgaWYgKGNoaWxkRm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERl
c2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKLSAgICAgICAgJiYgcGFyZW50Rm9udC5nZW5lcmlj
RmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBpcyBtb25vc3BhY2Ugb3IgdGhlIGNo
aWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAotICAgIC8vIHNpemUgd2FzIHVuc3BlY2lm
aWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUgYXMgYXBwcm9wcmlhdGUuCi0gICAg
Ly8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSByZWZldGNoIGZyb20g
dGhlIHRhYmxlIHJhdGhlciB0aGFuCi0gICAgLy8gbXVsdGlwbHlpbmcgYnkgb3VyIHNjYWxlIGZh
Y3Rvci4KLSAgICBmbG9hdCBzaXplOwotICAgIGlmIChjaGlsZEZvbnQua2V5d29yZFNpemUoKSkK
LSAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4
U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEsIGNoaWxkRm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkpOwotICAgIGVsc2UgewotICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgIGZsb2F0IGZpeGVkU2NhbGVGYWN0b3IgPSAoc2V0
dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYgc2V0dGluZ3MtPmRl
ZmF1bHRGb250U2l6ZSgpKQotICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxmbG9hdD4oc2V0dGlu
Z3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgp
Ci0gICAgICAgICAgICA6IDE7Ci0gICAgICAgIHNpemUgPSBwYXJlbnRGb250LnVzZUZpeGVkRGVm
YXVsdFNpemUoKSA/Ci0gICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAv
IGZpeGVkU2NhbGVGYWN0b3IgOgotICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRT
aXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOwotICAgIH0KLQotICAgIEZvbnREZXNjcmlwdGlvbiBu
ZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVz
Y3JpcHRpb24sIHNpemUpOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERl
c2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjppbml0aWFsaXplRm9udFN0eWxl
KFNldHRpbmdzKiBzZXR0aW5ncykKLXsKLSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0
aW9uOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlv
bjo6U3RhbmRhcmRGYW1pbHkpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2Rl
KHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0
VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVl
bkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3Rh
bmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygpLT5zdGFuZGFyZEZvbnRGYW1pbHko
KTsKLSAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9u
dERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udEZhbWlseSk7
Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsK
LSAgICB9Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVt
IC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9u
LCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKSk7
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFs
TGluZUhlaWdodCgpKTsKLSAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBz
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgZmxvYXQg
c2l6ZSkKLXsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAg
ICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVj
aWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlz
QWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcygpKSk7Ci19Ci0KLWZsb2F0IFN0
eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBk
b2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBz
cGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykKLXsKLSAgICBmbG9hdCB6b29tRmFj
dG9yID0gMS4wZjsKLSAgICBpZiAoIXVzZVNWR1pvb21SdWxlcykgewotICAgICAgICB6b29tRmFj
dG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9
IGRvY3VtZW50LT5mcmFtZSgpKQotICAgICAgICAgICAgem9vbUZhY3RvciAqPSBmcmFtZS0+dGV4
dFpvb21GYWN0b3IoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3R5bGVSZXNvbHZlcjo6Z2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0b3IsIGlzQWJzb2x1
dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKLX0KLQotZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBmbG9hdCB6b29t
RmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRN
aW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUpCi17Ci0gICAgLy8g
VGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90IGJlIHZpc2libGUgYW5kIHRoZXJl
Zm9yZSBuZWVkcyB0byBiZQotICAgIC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0gZm9udCBzaXplIHJ1
bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAotICAgIC8vIHJlbmRl
cmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBvdGhlciBicm93c2VycyB0aGF0IGhh
dmUgbWluaW11bQotICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBGaXJlZm94KS4KLSAg
ICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6
ZXBzaWxvbigpKQotICAgICAgICByZXR1cm4gMC4wZjsKLQotICAgIC8vIFdlIHN1cHBvcnQgdHdv
IHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmlyc3QgaXMgYSBoYXJkIG92ZXJyaWRl
IHRoYXQgYXBwbGllcyB0bwotICAgIC8vIGFsbCBmb250cy4gVGhpcyBpcyAibWluU2l6ZS4iIFRo
ZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFydCBtaW5pbXVtIgot
ICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdlIGNhbid0IGtub3cg
d2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4sCi0gICAgLy8gd2hlbiBpdCB1c2Vz
IGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJlc3NlcyB0aGUgZm9udC1zaXplIGFz
IGEgcGVyY2VudGFnZSBvZgotICAgIC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBmb250IHNldHRpbmcu
Ci0KLSAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3YW50IHRvIGdldCBz
bWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIGtlZXAgZm9udHMgcmVhZGFibGUu
Ci0gICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8gc2V0IGFuIGV4cGxp
Y2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAotICAgIC8vIHNpbmNlIHNpdGVzIHdpbGwg
bWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNwb3QuY29tIHdpdGgg
YSA5cHggbWluaW11bSkuCi0KLSAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0
dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICByZXR1cm4gMS4wZjsKLQotICAg
IGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOwotICAgIGludCBtaW5M
b2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7Ci0gICAgZmxv
YXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29tRmFjdG9yOwotCi0gICAgLy8gQXBw
bHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBhcHBseSB0aGUgaGFyZCBtaW5pbXVt
IGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNtYWxsLgotICAgIGlmICh6b29tZWRT
aXplIDwgbWluU2l6ZSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pblNpemU7Ci0KLSAgICAvLyBO
b3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlzIGFsc28gb25seSBh
cHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAotICAgIC8vIGFmdGVyIHpvb21pbmcuIFRo
ZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIgZGVmYXVsdCBv
ciB0aGUgb3JpZ2luYWwgc2l6ZQotICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGFibGUuIElu
IG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVtIHdoZW5ldmVyIHdl
J3JlIHBvc2l0aXZlCi0gICAgLy8gZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0aGUgbGF5b3V0Lgot
ICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAmJiB6b29tZWRTaXplIDwgbWluTG9n
aWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9naWNhbFNpemUgfHwgIWlzQWJzb2x1
dGVTaXplKSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXplOwotCi0gICAgLy8g
QWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0byBwcmV2ZW50IGluc2FuZSBmb250
IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlvdXMKLSAgICAvLyBwbGF0Zm9ybXMg
KEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCi0gICAgcmV0dXJuIG1pbihtYXhpbXVtQWxs
b3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKLX0KLQotY29uc3QgaW50IGZvbnRTaXplVGFibGVN
YXggPSAxNjsKLWNvbnN0IGludCBmb250U2l6ZVRhYmxlTWluID0gOTsKLWNvbnN0IGludCB0b3Rh
bEtleXdvcmRzID0gODsKLQotLy8gV2luSUUvTmF2NCB0YWJsZSBmb3IgZm9udCBzaXplcy4gRGVz
aWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBpbmcgc3lzdGVtIG9mIEhUTUwuCi1z
dGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZv
bnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Ci17Ci0gICAgICB7IDksICAgIDks
ICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjggfSwKLSAgICAgIHsgOSwg
ICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMSB9LAotICAgICAg
eyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDM0IH0sCi0g
ICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzcg
fSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAg
ICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQotICAgICAgeyA5LCAgICA5LCAgICAx
MSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCi0gICAgICB7IDksICAgMTAs
ICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKLSAgICAgIHsgOSwg
ICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3Bv
cnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQotfTsKLS8vIEhUTUwgICAgICAgMSAgICAgIDIgICAg
ICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNwotLy8gQ1NTICB4eHMgICB4cyAgICAgcyAg
ICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAg
fAotLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCi0KLS8vIFN0cmljdCBtb2RlIHRh
YmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0aW5ncyBleGFjdGx5Lgotc3RhdGlj
IGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6
ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQotewotICAgICAgeyA5LCAgICA5LCAgICAg
OSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3IH0sCi0gICAgICB7IDksICAgIDks
ICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzAgfSwKLSAgICAgIHsgOSwg
ICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzMyB9LAotICAgICAg
eyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM2IH0sCi0g
ICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAgMzkg
fSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKLSAgICAgIHsgOSwgICAxMCwgICAgMTIsICAg
IDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAx
MywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCi0gICAgICB7IDksICAgMTAs
ICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9u
YWwgZm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBIVE1MICAgICAgIDEgICAgICAyICAgICAgMyAg
ICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8vIENTUyAgeHhzICAgeHMgICAgIHMgICAgICBt
ICAgICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8v
ICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgotCi0vLyBGb3IgdmFsdWVzIG91dHNpZGUg
dGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQgRmFocm5lcidzIHN1Z2dlc3RlZCBz
Y2FsZQotLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZhbHVlLgotc3RhdGljIGNvbnN0IGZs
b2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9IHsgMC42MGYsIDAuNzVmLCAwLjg5
ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9OwotCi1mbG9hdCBTdHlsZVJlc29sdmVy
Ojpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQga2V5d29yZCwgYm9v
bCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9
IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVy
biAxLjBmOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgp
OwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRp
bmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgp
OwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8
PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIC8vIExvb2sgdXAgdGhlIGVudHJ5IGluIHRo
ZSB0YWJsZS4KLSAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWlu
OwotICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGwpOwotICAgICAg
ICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XVtjb2xdIDogc3Ry
aWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07Ci0gICAgfQotCi0gICAgLy8gVmFsdWUgaXMgb3V0
c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0aGUgc2NhbGUgZmFjdG9yIGluc3Rl
YWQuCi0gICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgoc2V0dGluZ3MtPm1pbmltdW1Mb2dp
Y2FsRm9udFNpemUoKSwgMSk7Ci0gICAgcmV0dXJuIG1heChmb250U2l6ZUZhY3RvcnNba2V5d29y
ZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWluTG9naWNhbFNpemUpOwotfQotCi10
ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGludCBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXpl
KGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwgaW50IG11bHRpcGxpZXIpCi17Ci0g
ICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21hbGwgZG9lcyBub3QgY29ycmVzcG9u
ZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IHRvdGFs
S2V5d29yZHMgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKHBpeGVsRm9udFNpemUgKiAyIDwgKHRh
YmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIpCi0gICAgICAgICAgICByZXR1cm4g
aTsKLSAgICB9Ci0gICAgcmV0dXJuIHRvdGFsS2V5d29yZHMgLSAxOwotfQotCi1pbnQgU3R5bGVS
ZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQgcGl4ZWxGb250
U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAg
ICAgIHJldHVybiAxOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtz
TW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/
IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250
U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVt
U2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIGludCByb3cgPSBtZWRpdW1TaXpl
IC0gZm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9u
dFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJs
ZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4ocGl4ZWxGb250U2l6ZSwgZm9udFNp
emVGYWN0b3JzLCBtZWRpdW1TaXplKTsKLX0KLQotc3RhdGljIENvbG9yIGNvbG9yRm9yQ1NTVmFs
dWUoaW50IGNzc1ZhbHVlSWQpCi17Ci0gICAgc3RydWN0IENvbG9yVmFsdWUgewotICAgICAgICBp
bnQgY3NzVmFsdWVJZDsKLSAgICAgICAgUkdCQTMyIGNvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0
aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0gewotICAgICAgICB7IENTU1ZhbHVl
QXF1YSwgMHhGRjAwRkZGRiB9LAotICAgICAgICB7IENTU1ZhbHVlQmxhY2ssIDB4RkYwMDAwMDAg
fSwKLSAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAwRkYgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyYXksIDB4RkY4
MDgwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAwICB9LAotICAgICAg
ICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAotICAgICAgICB7IENTU1ZhbHVlTGltZSwg
MHhGRjAwRkYwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTWFyb29uLCAweEZGODAwMDAwIH0sCi0g
ICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVP
bGl2ZSwgMHhGRjgwODAwMCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZU9yYW5nZSwgMHhGRkZGQTUw
MCB9LAotICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZGODAwMDgwIH0sCi0gICAgICAgIHsg
Q1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVNpbHZlciwgMHhG
RkMwQzBDMCB9LAotICAgICAgICB7IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4MCAgfSwKLSAgICAg
ICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFs
dWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAotICAgICAgICB7IENTU1ZhbHVlWWVsbG93LCAweEZGRkZG
RjAwIH0sCi0gICAgICAgIHsgMCwgMCB9Ci0gICAgfTsKLQotICAgIGZvciAoY29uc3QgQ29sb3JW
YWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytjb2wpIHsKLSAgICAg
ICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlkKQotICAgICAgICAgICAgcmV0dXJu
IGNvbC0+Y29sb3I7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1l
KCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNv
bG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFs
dWUqIHZhbHVlKQotewotICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3
aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKLSAgICBjYXNlIENT
U1ZhbHVlV2Via2l0TGluazoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAg
ICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBk
ZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1Db2xvciBTdHlsZVJl
c29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUs
IGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Ci17Ci0gICAgaWYgKHZhbHVlLT5pc1JHQkNvbG9y
KCkpCi0gICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7Ci0KLSAg
ICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGludCBpZGVudCA9IHZhbHVlLT5n
ZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJl
dHVybiBDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgotICAgICAgICByZXR1
cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dExpbms6Ci0gICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSAmJiBmb3JW
aXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNpdGVkTGlua0NvbG9yKCkgOiBzdGF0
ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZl
bGluazoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPmFjdGl2ZUxpbmtDb2xvcigp
OwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcjoKLSAgICAgICAgcmV0dXJu
IFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50
Y29sb3I6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotICAgIGRlZmF1
bHQ6Ci0gICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVlKGlkZW50KTsKLSAgICB9Ci19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0
KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVzdWx0KQotewotICAgIG1fdmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIobmV3IE1lZGlhUXVl
cnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjphZmZl
Y3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAotewotICAgIHVuc2lnbmVkIHMgPSBtX3ZpZXdw
b3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzOyBpKyspIHsKLSAgICAgICAgaWYgKG1fbWVkaXVtLT5ldmFsKCZtX3ZpZXdw
b3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lvbikgIT0gbV92aWV3
cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkKLSAgICAgICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBUcmFu
c2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZShX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSB0eXBlKQotewot
ICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNj
YWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRTsK
LSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g7Ci0gICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NB
TEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3Jt
T3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8zRDsKLSAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJl
dHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpUUkFOU0xBVEVfWTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFO
U0xBVEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRy
YW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFXzNE
OwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOwotICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
OlJPVEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9aOwotICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfM0Q7Ci0gICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6U0tFVzsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3
WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19YOwot
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpNQVRSSVg7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0
cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJ
WF8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5z
Zm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVSU1BFQ1RJVkU7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVU
cmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUs
IFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlv
bnMpCi17Ci0gICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7Ci0g
ICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29t
KCkgOiAxOwotICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICBmb3IgKENT
U1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLQotICAgICAgICBp
ZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqIHRyYW5zZm9ybVZh
bHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihpLnZhbHVlKCkpOwot
ICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCk7ICsr
aikgewotICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaGF2ZU5vblBy
aW1pdGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAg
ICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDApKTsKLQotICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybVZhbHVlLT5v
cGVyYXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBk
b3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN5ID0g
Zmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEp
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZh
bHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAg
ICAgc3kgPSBzeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246
OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3Bl
cmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJh
bnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAg
ICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3ogPSAxLjA7Ci0gICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYg
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzeSA9IGZpcnN0
VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
ICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3Jt
VmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAg
ICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCBz
eiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0
aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJh
bnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4
ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwg
em9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNv
bnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
ICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9u
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29u
dmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5l
ZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0
aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3Jl
YXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRl
WlRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCB0
eCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwg
Rml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAg
ICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHls
ZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNm
b3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgo
Zmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFs
dWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aCh0aGlyZFZhbHVl
LCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRU
b0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSB8
fCB0ei5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
ICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9y
bU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1
ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCAxLCBhbmdsZSwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJh
dGlvbjogewotICAgICAgICAgICAgZG91YmxlIHggPSAwOwotICAgICAgICAgICAgZG91YmxlIHkg
PSAwOwotICAgICAgICAgICAgZG91YmxlIHogPSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xl
ID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLQotICAgICAgICAgICAgaWYgKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAg
ICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAg
ICAgIHkgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHogPSAxOwotICAg
ICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUz
RFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5s
ZW5ndGgoKSA8IDQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMp
KTsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0g
ICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAg
ICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAg
ICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1P
cGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1Ry
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5n
bGVYID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkgPSAwOwotICAgICAgICAgICAgZG91
YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBhbmdsZVkgPSBh
bmdsZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFuZ2xlWCA9IGFuZ2xl
OwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlWSA9IHNlY29uZFZh
bHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhbmdsZVgsIGFuZ2xlWSwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikKLSAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVW
YWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91
YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gem9vbUZhY3RvciAqIHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGYgPSB6b29t
RmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9u
OjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zv
cm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkg
PCAxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9u
TWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFs
dWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDYpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDcp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEwKSktPmdldERvdWJsZVZhbHVlKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMSkpLT5nZXRE
b3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3Ig
KiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE0
KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlv
bnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRl
KG1hdHJpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHsK
LSAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlm
IChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAgICAgICAgIHAgPSBjb252ZXJ0VG9G
bG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAg
ICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdWlyayB0aGF0
IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBhcmUgZmluYWxpemVkLgotICAgICAg
ICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAg
ICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChjbGFtcFRvUG9zaXRpdmVJbnRlZ2Vy
KHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOwotICAgICAgICAgICAgfQotCi0gICAg
ICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFBlcnNwZWN0
aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRy
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0g
b3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVS
UykKLXN0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZmlsdGVyT3BlcmF0aW9u
Rm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9uVHlwZSB0eXBlKQot
ewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlJl
ZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
UkVGRVJFTkNFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRl
ck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOwot
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAg
ICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsKLSAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6U0FUVVJBVEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVl
Um90YXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpI
VUVfUk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9w
ZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOwotICAgIGNh
c2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAg
IHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpD
b250cmFzdEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
Q09OVFJBU1Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJh
dGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QkxVUjsKLSAgICBjYXNlIFdl
YktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsKLSNpZiBFTkFCTEUoQ1NTX1NIQURF
UlMpCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT007Ci0jZW5kaWYKLSAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgotICAgICAg
ICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotICAgIH0KLSAgICByZXR1cm4gRmlsdGVy
T3BlcmF0aW9uOjpOT05FOwotfQotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUo
U1ZHKQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpCi17Ci0g
ICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlKCktPmhhc0Zp
bHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRl
ciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7Ci0gICAgVmVjdG9y
PFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBzdGF0ZS5zdHls
ZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxG
aWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7
Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0
ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewotICAgICAgICAgICAgUmVmZXJlbmNlRmlsdGVyT3Bl
cmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVuY2VGaWx0ZXJPcGVy
YXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NT
VkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5nZXQo
cmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKLSAgICAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDYWNoZWRTVkdEb2N1bWVudCogY2FjaGVk
RG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgICAg
ICBpZiAoIWNhY2hlZERvY3VtZW50KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhlIHJlZmVyZW5jZSBm
aWx0ZXIuCi0gICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXItPnNldENhY2hlZFNWR0RvY3VtZW50
UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShjYWNoZWRE
b2N1bWVudCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1l
bnRzKCkuY2xlYXIoKTsKLX0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotU3R5
bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVlKiB2YWx1ZSkKLXsK
LSAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFsdWUoKSkKLSAgICAgICAgcmV0dXJu
IGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKHN0YXRpY19jYXN0PFdlYktpdENT
U1NoYWRlclZhbHVlKj4odmFsdWUpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotU3R5bGVTaGFkZXIq
IFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktp
dENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBTdHlsZVNoYWRlciogc2hhZGVyID0gdmFs
dWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOwotICAgIGlmIChzaGFkZXIgJiYgc2hhZGVyLT5p
c1BlbmRpbmdTaGFkZXIoKSkKLSAgICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyh0
cnVlKTsKLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQ
ZW5kaW5nU2hhZGVycygpCi17Ci0gICAgaWYgKCFtX3N0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigp
IHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9j
dW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIFZlY3RvcjxSZWZQdHI8Rmls
dGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5zdHlsZSgpLT5tdXRh
YmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBm
aWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVy
YXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAg
IGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRp
b246OkNVU1RPTSkgewotICAgICAgICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKiBjdXN0b21G
aWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRp
b24uZ2V0KCkpOwotICAgICAgICAgICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsK
LSAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3JhbSA9IHN0YXRpY19j
YXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsK
LSAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBwcm9ncmFtLT52ZXJ0
ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBXZWJLaXRD
U1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFk
ZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAg
ICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFk
ZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlm
IChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkt
PmlzUGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFs
dWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3Jh
bS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAg
cHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNo
ZWRSZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAg
IG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBz
b3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBiKQotewot
ICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4oYS0+bmFtZSgpLCBiLT5uYW1lKCkp
OwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6
cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1Zh
bHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
cj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcjo6Y3JlYXRlKG5h
bWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlcy0+bGVuZ3RoKCk7
IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZl
VmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVl
KTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJp
bWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAg
YXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
KTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5UGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFz
c1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9t
RmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2
YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcj4gbnVtYmVy
UGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7ICsraSkgewotICAg
ICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7
Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJl
dHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIp
Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbnVtYmVyUGFyYW1ldGVyLT5hZGRWYWx1
ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBu
dW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0
ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKLXsKLSAgICBSZWZQ
dHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1QYXJhbWV0ZXIgPSBD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKLSAgICBUcmFuc2Zv
cm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2
YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJh
dGlvbnMpOwotICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0T3BlcmF0aW9ucyhvcGVyYXRpb25z
KTsKLSAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmls
dGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBhcmFtZXRlclZhbHVl
KQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVycyB0eXBlcyBwYXJz
aW5nLgotICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzY0MzgKLSAgICAvLyB0ZXh0dXJlczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTcxNDQyCi0gICAgLy8gbWF0MiwgbWF0MywgbWF0NDogaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0Ci0gICAgLy8gTnVtYmVyIHBhcmFtZXRl
cnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwKLSAgICAvLyB0aGUg
b3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20gQ1NTVmFsdWVMaXN0LgotICAgIGlm
ICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0g
ICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihwYXJh
bWV0ZXJWYWx1ZSk7Ci0gICAgaWYgKCF2YWx1ZXMtPmxlbmd0aCgpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJheUZ1bmN0aW9uVmFs
dWUoKSkKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIobmFt
ZSwgdmFsdWVzKTsKLQotICAgIC8vIElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbGlzdCBpcyBh
IHRyYW5zZm9ybSBmdW5jdGlvbiwKLSAgICAvLyB0aGVuIHdlIGNvdWxkIHNhZmVseSBhc3N1bWUg
dGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcwotICAgIC8vIGFyZSB0cmFuc2Zvcm1zLiBwYXJz
ZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxsCi0gICAgLy8gcmV0dXJuIDAgaWYg
dGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KLSAgICBpZiAodmFsdWVzLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCi0gICAgICAgIHJl
dHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOwot
Ci0gICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2YgYm9vbGVhbnMgb3IgbnVtYmVycywg
c28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9zZSB0d28uCi0gICAg
Ly8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFsbCBudW1iZXJzKS4K
LSAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVW
YWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQotICAgICAgICByZXR1cm4gMDsKLSAgICAK
LSAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsK
LSAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJO
dW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQg
dGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9v
bCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUq
IHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYgcGFyYW1ldGVyTGlz
dCkKLXsKLSAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJhbWV0ZXJOYW1lczsKLSAgICBDU1NW
YWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJzVmFsdWUpOwotICAg
IGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7IHBhcmFtZXRlckl0ZXJhdG9yLmFk
dmFuY2UoKSkgewotICAgICAgICBpZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCktPmlzVmFs
dWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIENTU1ZhbHVlTGlz
dEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBp
ZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19T
VFJJTkcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBTdHJp
bmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAvLyBE
byBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KLSAgICAgICAgaWYgKGtub3du
UGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAKLSAgICAg
ICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFpdGVyYXRvci5o
YXNNb3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJzZUN1c3RvbUZpbHRl
clBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0
ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHBhcmFtZXRlckxpc3QuYXBw
ZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBNYWtlIHN1cmUg
d2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIGRvd24gdG8gdGhlIEN1
c3RvbUZpbHRlck9wZXJhdGlvbi4KLSAgICBzdGQ6OnNvcnQocGFyYW1ldGVyTGlzdC5iZWdpbigp
LCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IpOwot
ICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJh
dGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVs
ZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0g
ICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0aW9uIGZvciB0aGUgY3VzdG9tIGZp
bHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCi0gICAgVU5VU0VEX1BBUkFNKGZpbHRlclZh
bHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRp
b24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVT
eW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQotewotICAgIENTU1ZhbHVl
KiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsK
LSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzaGFkZXJzVmFsdWUtPmlzVmFs
dWVMaXN0KCkpOwotICAgIENTU1ZhbHVlTGlzdCogc2hhZGVyc0xpc3QgPSBzdGF0aWNfY2FzdDxD
U1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOwotCi0gICAgdW5zaWduZWQgc2hhZGVyc0xpc3RM
ZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7Ci0gICAgQVNTRVJUKHNoYWRlcnNMaXN0TGVu
Z3RoKTsKLQotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVydGV4U2hhZGVyID0gc3R5bGVTaGFk
ZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOwotICAgIFJlZlB0cjxT
dHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7Ci0gICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbVR5cGUg
cHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVYVFVSRTsKLSAgICBD
dXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0dGluZ3M7Ci0KLSAgICBpZiAoc2hh
ZGVyc0xpc3RMZW5ndGggPiAxKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBmcmFnbWVudFNoYWRlck9y
TWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKLQot
ICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uLT5pc1dlYktpdENTU01peEZ1
bmN0aW9uVmFsdWUoKSkgewotICAgICAgICAgICAgV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSog
bWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKj4oZnJh
Z21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJh
dG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKLQotICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0
aW9uLT5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVy
KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotCi0g
ICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMpOwotICAgICAgICAg
ICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgewotICAgICAgICAgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKENTU1BhcnNlcjo6aXNC
bGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQotICAgICAgICAgICAgICAgICAg
ICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAg
ICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9wZXJhdG9yKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuY29tcG9zaXRl
T3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgICAgICBpdGVy
YXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19FTEVNRU5UX1RFWFRVUkU7Ci0gICAg
ICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyT3JNaXhG
dW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdW5zaWduZWQgbWVzaFJvd3Mg
PSAxOwotICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsKLSAgICBDdXN0b21GaWx0ZXJNZXNo
VHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7Ci0gICAgCi0gICAgQ1NTVmFsdWUqIHBh
cmFtZXRlcnNWYWx1ZSA9IDA7Ci0gICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+
IDEpIHsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IoZmlsdGVyVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHNl
Y29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qgb2YgcGFyYW1ldGVy
czoKLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgb3IgYW55IG9mIHRoZSBt
ZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKLSAgICAgICAgLy8gdGhlIG1lc2gtYm94IGxpc3Qs
IGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVycyBsaXN0LgotCi0gICAgICAgIGlm
IChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0g
ICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgb25s
eSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0IGJvdGgKLSAgICAg
ICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMuCi0gICAgICAgICAgICAgICAg
bWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOwot
ICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAKLSAg
ICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhlciBudW1iZXIgZm9yIHRoZSByb3dz
LgotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQ
cmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0
b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNO
dW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVzaFJvd3MgPSBwcmltaXRpdmVW
YWx1ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFk
dmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01v
cmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgewotICAgICAgICAgICAgICAgIG1lc2hU
eXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNl
KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXRl
cmF0b3IuaW5kZXgoKSkgewotICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUgd2FzIGNvbnN1bWVk
IGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVzdCBhIHBhcmFtZXRlciBsaXN0LCBt
ZWFuaW5nIHRoYXQgd2UgZW5kIHVwCi0gICAgICAgICAgICAvLyBoYXZpbmcganVzdCB0d28gQ1NT
TGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gICAg
ICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDIpOwotICAgICAgICAgICAg
cGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+
IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKLSAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVy
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7Ci0gICAgCi0gICAgQ3VzdG9tRmlsdGVy
UGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OwotICAgIGlmIChwYXJhbWV0ZXJzVmFsdWUgJiYg
IXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFsdWUsIHBhcmFtZXRl
ckxpc3QpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZWZQdHI8U3R5bGVDdXN0b21G
aWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtOjpjcmVhdGUo
dmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFkZXIucmVsZWFzZSgpLCBwcm9ncmFt
VHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKLSAgICByZXR1cm4gQ3VzdG9tRmlsdGVyT3Bl
cmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBhcmFtZXRlckxpc3QsIG1lc2hSb3dz
LCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9w
ZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktp
dENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAgICBBU1NFUlQoZmlsdGVyVmFsdWUt
Pmxlbmd0aCgpKTsKLSAgICBib29sIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID0gZmlsdGVyVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKTsKLSAgICBy
ZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRp
b25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZhbHVlKSA6IGNyZWF0ZUN1c3RvbUZp
bHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVyVmFsdWUpOwotfQotCi0jZW5kaWYK
LQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBp
blZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRl
ck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgQVNTRVJUKG91dE9wZXJhdGlvbnMu
aXNFbXB0eSgpKTsKLSAgICAKLSAgICBpZiAoIWluVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAKLSAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4oaW5WYWx1ZSk7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgCi0gICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpIDogMTsKLSAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7
Ci0gICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgIGlmICgh
Y3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkpCi0gICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUgPSBzdGF0aWNf
Y2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUoKSk7Ci0gICAgICAgIEZpbHRlck9w
ZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gZmlsdGVyT3BlcmF0aW9uRm9y
VHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsKLQotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpWQUxJ
REFURURfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0b21GaWx0ZXJPcGVy
YXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVyU3R5bGUuCi0gICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6Q1VT
VE9NKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRp
b24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUpOwotICAgICAgICAg
ICAgaWYgKCFvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0
aW9uKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAg
aWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKLSNpZiBF
TkFCTEUoU1ZHKQotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQot
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ1NTVmFsdWUqIGFyZ3VtZW50
ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0KLSAgICAgICAgICAg
IGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgpKQotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVl
KiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1
ZSo+KGFyZ3VtZW50KTsKLSAgICAgICAgICAgIEtVUkwgdXJsID0gbV9zdGF0ZS5kb2N1bWVudCgp
LT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwoKSk7Ci0KLSAgICAgICAgICAgIFJl
ZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IFJlZmVyZW5jZUZpbHRl
ck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1cmwuZnJhZ21lbnRJ
ZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOwotICAgICAgICAgICAgaWYgKFNWR1VSSVJlZmVy
ZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgbV9z
dGF0ZS5kb2N1bWVudCgpKSkgewotICAgICAgICAgICAgICAgIGlmICghc3ZnRG9jdW1lbnRWYWx1
ZS0+bG9hZFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnBlbmRpbmdT
VkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBzdmdEb2N1bWVudFZhbHVlKTsKLSAg
ICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVu
dCgpKQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24tPnNldENhY2hlZFNWR0RvY3VtZW50
UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShzdmdEb2N1
bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7Ci0jZW5kaWYK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhh
dCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0aGUKLSAgICAgICAg
Ly8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhhcyBhIFNoYWRvd1ZhbHVlIHBhcmFt
ZXRlci4KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gRmlsdGVyT3BlcmF0aW9uOjpEUk9Q
X1NIQURPVykgewotICAgICAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxz
ZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBmaWx0ZXJWYWx1ZS0+bGVu
Z3RoKCk7ICsraikgewotICAgICAgICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAg
ICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAo
aGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBmaWx0ZXJWYWx1
ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpbHRlclZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7Ci0gICAgICAgIHN3aXRjaCAoZmlsdGVy
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgewotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91Ymxl
IGFtb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEp
IHsKLSAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAg
ICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJP
cGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJv
dGF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gMDsKLSAg
ICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAg
ICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0KLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0
aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRl
ck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVz
c0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29u
dHJhc3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAo
ZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJp
Z2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJW
YWx1ZS0+bGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFs
dWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlz
UGVyY2VudGFnZSgpKQotICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFz
aWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0
aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAg
TGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAo
ZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCi0gICAgICAgICAgICAgICAgc3RkRGV2aWF0aW9u
ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7Ci0gICAgICAgICAgICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5kZWZpbmVkKCkpCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN0ZERldmlhdGlv
biwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjog
ewotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgQ1NTVmFsdWUqIGNzc1ZhbHVlID0g
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0gICAgICAgICAgICBpZiAo
IWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0K
LSAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUq
Pihjc3NWYWx1ZSk7Ci0gICAgICAgICAgICBJbnRQb2ludCBsb2NhdGlvbihpdGVtLT54LT5jb21w
dXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvciksCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3RvcikpOwotICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVy
ID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21G
YWN0b3IpIDogMDsKLSAgICAgICAgICAgIENvbG9yIGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0
ZW0tPmNvbG9yKQotICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFs
dWUoaXRlbS0+Y29sb3IuZ2V0KCkpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGxvY2F0aW9uLCBi
bHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCwgb3BlcmF0
aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgZGVm
YXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4g
U3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSogcGVuZGlu
Z0ltYWdlKQotewotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRl
ciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIGlm
IChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgewotICAgICAgICBDU1NJbWFnZVZhbHVl
KiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7Ci0gICAgICAgIHJl
dHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAg
fQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7Ci0g
ICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdlR2VuZXJhdG9yVmFsdWUgPSBwZW5k
aW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsKLSAgICAgICAgaW1hZ2VHZW5lcmF0
b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgIHJl
dHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0b3JWYWx1ZSk7Ci0g
ICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpKSB7Ci0g
ICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvckltYWdlVmFsdWUgPSBwZW5kaW5nSW1h
Z2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGN1cnNvckltYWdlVmFs
dWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0KLSNpZiBFTkFC
TEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVl
KCkpIHsKLSAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1ZSA9IHBlbmRpbmdJ
bWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+
Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIH0KLSNlbmRpZgotCi0g
ICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZXMo
KQotewotICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5pc0VtcHR5KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9p
dGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5lbmQo
KS5rZXlzKCk7Ci0gICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0
b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5iZWdpbigpLmtl
eXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIENTU1Byb3BlcnR5SUQgY3VycmVudFBy
b3BlcnR5ID0gKml0OwotCi0gICAgICAgIHN3aXRjaCAoY3VycmVudFByb3BlcnR5KSB7Ci0gICAg
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6IHsKLSAgICAgICAgICAgIGZvciAo
RmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vzc0JhY2tn
cm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5ZXIgPSBiYWNrZ3Jv
dW5kTGF5ZXItPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kTGF5ZXIt
PmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5n
SW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3JvdW5kTGF5ZXItPmlt
YWdlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogewotICAgICAgICAgICAgZm9yIChDb250
ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENvbnRlbnREYXRhKj4obV9zdGF0ZS5z
dHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7IGNvbnRlbnREYXRhID0gY29udGVu
dERhdGEtPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50RGF0YS0+aXNJbWFn
ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0eWxlSW1hZ2UqIGltYWdlID0gc3RhdGljX2Nh
c3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdl
KHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5zZXRJbWFnZShsb2Fk
ZWRJbWFnZS5yZWxlYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogewotICAgICAgICAgICAgaWYgKEN1cnNvckxpc3Qq
IGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNvcnMoKSkgewotICAgICAgICAgICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVudEN1cnNvciA9IGN1cnNvckxpc3Qt
PmF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoU3R5bGVJbWFnZSogaW1hZ2UgPSBjdXJy
ZW50Q3Vyc29yLmltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+
aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3Vy
c29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1h
Z2UqPihpbWFnZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogewotICAgICAgICAgICAgaWYgKG1fc3RhdGUu
c3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUlt
YWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgp
LT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVu
ZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpKSkpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFn
ZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+aXNQZW5k
aW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldEJvcmRlcklt
YWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2Uq
PihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkpKSk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVj
dDogewotICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1fc3Rh
dGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTmluZVBp
ZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1hc2soKTsKLSAgICAgICAgICAgICAg
ICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdlLmltYWdlKCktPmlzUGVuZGluZ0lt
YWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZElt
YWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1h
c2tJbWFnZS5pbWFnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE1h
c2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNrSW1hZ2UuaW1hZ2VT
bGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdlLmJvcmRlclNsaWNlcygpLCBtYXNr
SW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFsUnVsZSgpLCBtYXNrSW1hZ2UudmVy
dGljYWxSdWxlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
a0JveEltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5tYXNr
Qm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgp
LT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0
TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5k
aW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpKSkpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE1hc2tJbWFnZTogewotICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIG1hc2tMYXllciA9IG1f
c3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBtYXNrTGF5ZXI7IG1hc2tMYXllciA9
IG1hc2tMYXllci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hc2tMYXllci0+aW1h
Z2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAg
ICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2Fz
dDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1f
c3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQotewotICAgIC8vIFN0YXJ0IGxvYWRpbmcg
aW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ0ltYWdlcygp
OwotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIHNo
YWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU2hhZGVycygp
OwotI2VuZGlmCi0gICAgCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQot
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlz
IHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7Ci0jZW5kaWYKLX0KLQotaW5s
aW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVkUHJvcGVydGllcygp
Ci0gICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQotewotfQotCi1pbmxpbmUgU3R5bGVSZXNv
bHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJvcGVydGllcygpCi17Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1l
bW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xh
c3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpD
U1MpOwotICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0aWVzIik7Ci19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW06OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0g
ICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1l
bW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQcm9wZXJ0aWVzLCAi
bWF0Y2hlZFByb3BlcnRpZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihyYW5nZXMsICJyYW5nZXMi
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwgInJlbmRlclN0eWxlIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5kZXJTdHlsZSIpOwot
fQotCi12b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGlu
Zm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAg
IGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJlc3Npb24iKTsKLX0KLQotdm9pZCBT
dHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlP
YmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVj
dEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2tleWZyYW1l
c1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIpOwotICAgIGluZm8u
YWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIsICJtYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lciIpOwotCi0gICAgaW5mby5hZGRNZW1iZXIobV9tZWRpdW0s
ICJtZWRpdW0iKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0U3R5bGUsICJyb290
RGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVudCwgImRvY3VtZW50
Iik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxlY3RvciwgImZvbnRTZWxlY3RvciIp
OwotICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0
cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMiKTsKLSAgICBpbmZvLmlnbm9y
ZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9pbnNwZWN0b3JD
U1NPTVdyYXBwZXJzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Njb3BlUmVzb2x2ZXIsICJzY29w
ZVJlc29sdmVyIik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX3N0YXRlLCAic3RhdGUiKTsKLQot
ICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3b3VsZCBiZSBjYWxs
ZWQgb25seSBvbmNlPwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0UXVpcmtzU3R5bGUi
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmlu
dFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1bHRWaWV3U291cmNl
U3R5bGUiKTsKKyAgICByZXR1cm4gbV9tYXRjaGVkUnVsZXMgJiYgIW1fbWF0Y2hlZFJ1bGVzLT5p
c0VtcHR5KCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCShyZXZpc2lvbiAxNDQ4OTMpCShmcm9tIFNv
dXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmg6MTQ0ODkzKQorKysgU291cmNlL1dlYkNv
cmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3
MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9y
ZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZu
ZGVmIFN0eWxlUmVzb2x2ZXJfaAorI2RlZmluZSBTdHlsZVJlc29sdmVyX2gKKworI2luY2x1ZGUg
IkNTU1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NTVG9TdHlsZU1hcC5oIgorI2luY2x1ZGUgIkNT
U1ZhbHVlTGlzdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzLmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRl
ICJNZWRpYVF1ZXJ5RXhwLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJS
dWxlRmVhdHVyZS5oIgorI2luY2x1ZGUgIlJ1bGVTZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5h
YmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKKyNpbmNsdWRlICJTZWxl
Y3RvckNoZWNrZXIuaCIKKyNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlN0
eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUgIlN0eWxlU2NvcGVSZXNvbHZlci5oIgorI2lu
Y2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisj
ZW5kaWYKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3Ry
aW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0gRVNtYXJ0TWluaW11bUZv
ckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5p
bXVtRm9yRm9udEZpemUgfTsKKworY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKK2NsYXNzIENT
U0ZvbnRTZWxlY3RvcjsKK2NsYXNzIENTU0ZvbnRGYWNlOworY2xhc3MgQ1NTRm9udEZhY2VSdWxl
OworY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsKK2NsYXNzIENTU0ltYWdlU2V0VmFsdWU7
CitjbGFzcyBDU1NJbWFnZVZhbHVlOworY2xhc3MgQ1NTUGFnZVJ1bGU7CitjbGFzcyBDU1NQcmlt
aXRpdmVWYWx1ZTsKK2NsYXNzIENTU1Byb3BlcnR5OworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFz
cyBDU1NTZWxlY3RvcjsKK2NsYXNzIENTU1N0eWxlU2hlZXQ7CitjbGFzcyBDU1NWYWx1ZTsKK2Ns
YXNzIENvbnRhaW5lck5vZGU7CitjbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247CitjbGFzcyBD
dXN0b21GaWx0ZXJQYXJhbWV0ZXI7CitjbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0Owor
Y2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBFbGVtZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFt
ZVZpZXc7CitjbGFzcyBLVVJMOworY2xhc3MgS2V5ZnJhbWVMaXN0OworY2xhc3MgS2V5ZnJhbWVW
YWx1ZTsKK2NsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7CitjbGFzcyBOb2RlOworY2xhc3MgUmVu
ZGVyUmVnaW9uOworY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOworY2xhc3MgUnVsZURhdGE7CitjbGFz
cyBSdWxlU2V0OworY2xhc3MgU2V0dGluZ3M7CitjbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKK2Ns
YXNzIFN0eWxlQnVpbGRlcjsKK2NsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKK2NsYXNzIFN0eWxl
SW1hZ2U7CitjbGFzcyBTdHlsZUtleWZyYW1lOworY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7Citj
bGFzcyBTdHlsZVByb3BlcnR5U2V0OworY2xhc3MgU3R5bGVSdWxlOworI2lmIEVOQUJMRShTSEFE
T1dfRE9NKQorY2xhc3MgU3R5bGVSdWxlSG9zdDsKKyNlbmRpZgorY2xhc3MgU3R5bGVSdWxlS2V5
ZnJhbWVzOworY2xhc3MgU3R5bGVSdWxlUGFnZTsKK2NsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKK2Ns
YXNzIFN0eWxlU2hhZGVyOworY2xhc3MgU3R5bGVTaGVldDsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0
OworY2xhc3MgU3R5bGVkRWxlbWVudDsKK2NsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKK2Ns
YXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOworY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7Citj
bGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOworCitjbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRp
YVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKKyAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhw
cikKKyAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCisgICAgeworICAgIH0KKyAgICB2b2lkIHJl
cG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKworICAgIE1lZGlhUXVl
cnlFeHAgbV9leHByZXNzaW9uOworICAgIGJvb2wgbV9yZXN1bHQ7Cit9OworCitlbnVtIFN0eWxl
U2hhcmluZ0JlaGF2aW9yIHsKKyAgICBBbGxvd1N0eWxlU2hhcmluZywKKyAgICBEaXNhbGxvd1N0
eWxlU2hhcmluZywKK307CisKKy8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4g
bWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKKy8vIGFyZSBpbnRlcnByZXRlZCBh
Y2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBv
bmx5CisvLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCisKK2VudW0gUnVs
ZU1hdGNoaW5nQmVoYXZpb3IgeworICAgIE1hdGNoQWxsUnVsZXMsCisgICAgTWF0Y2hBbGxSdWxl
c0V4Y2x1ZGluZ1NNSUwsCisgICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCit9OworCitjbGFz
cyBQc2V1ZG9TdHlsZVJlcXVlc3QgeworcHVibGljOgorICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQ
c2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxi
YXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCisgICAgICAgIDogcHNldWRvSWQocHNldWRv
SWQpCisgICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQorICAgICAgICAsIHNj
cm9sbGJhcihzY3JvbGxiYXIpCisgICAgeworICAgIH0KKworICAgIFBzZXVkb0lkIHBzZXVkb0lk
OworICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKKyAgICBSZW5kZXJTY3JvbGxiYXIq
IHNjcm9sbGJhcjsKK307CisKK2NsYXNzIE1hdGNoUmVxdWVzdCB7CitwdWJsaWM6CisgICAgTWF0
Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxz
ZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2
aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNO
b3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKKyAgICAgICAgLCBp
bmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKKyAgICAgICAgLCBzY29wZShzY29w
ZSkKKyAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0K
KyAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OworICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXM7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7CisgICAgY29uc3QgU2VsZWN0
b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OworfTsKKwor
Ly8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBi
YXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCitjbGFzcyBTdHlsZVJlc29sdmVy
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3R5bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wg
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKKyAgICB+U3R5bGVSZXNvbHZlcigpOworCisgICAg
Ly8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9y
IHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9yIGxvb2t1cHMuCisgICAg
dm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50Kik7CisgICAgdm9pZCBwb3BQYXJlbnRFbGVt
ZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRv
d1Jvb3QqKTsKKyAgICB2b2lkIHBvcFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCop
OworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxl
SG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWlu
ZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJlc29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUs
IGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNjb3BlKTsgfQorI2VuZGlmCisKKyAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmluZ0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJp
bmcsCisgICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVy
UmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CisKKyAgICB2b2lkIGtleWZyYW1lU3R5bGVz
Rm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBSZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYp
OworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVs
ZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdl
SW5kZXgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1l
bnQoKTsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOwor
CisgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9j
dW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxlKCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudFN0eWxlKCk7IH0KKyAgICBS
ZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpOyB9CisgICAgRWxlbWVudCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3Rh
dGUuZWxlbWVudCgpOyB9CisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1
bWVudDsgfQorICAgIFN0eWxlU2NvcGVSZXNvbHZlciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsg
cmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsgfQorICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Tm9kZSgpOyB9CisKKyAgICAvLyBGSVhNRTog
SXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNo
ZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3RvciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KKyAg
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCisgICAg
dm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVj
dG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBy
dWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKyAgICBjb25zdCBEb2N1bWVudFJ1bGVT
ZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKworI2lmIEVOQUJM
RShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIFN0eWxlU2NvcGVSZXNv
bHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCisgICAgeworI2lmIEVOQUJMRShTVFlMRV9TQ09Q
RUQpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxl
ZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkgfHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6
c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFi
bGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAg
ICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7Cisj
ZW5kaWYKKyAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgICAgICBtX3Njb3Bl
UmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVTY29wZVJlc29sdmVyKCkpOworICAgICAgICBy
ZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOworICAgIH0KKyNlbmRpZgorCitwcml2YXRlOgor
ICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgIFJlbmRlclN0eWxlKiBsb2NhdGVT
aGFyZWRTdHlsZSgpOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVT
ZXQoUnVsZVNldCopOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RS
dWxlcygpOworICAgIE5vZGUqIGxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNp
Z25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7CisgICAgU3R5bGVkRWxlbWVudCogZmluZFNp
YmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVuc2lnbmVkJiBjb3VudCkgY29uc3Q7CisgICAg
Ym9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisg
ICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJT
dHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBLZXlmcmFtZVZhbHVlJik7CisKK3B1YmxpYzoK
KyAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhh
dCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgKG9yIGEgcHNldWRvLWVsZW1lbnQpLgorICAg
IGVudW0gQ1NTUnVsZUZpbHRlciB7CisgICAgICAgIFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8
IDEsCisgICAgICAgIEF1dGhvckNTU1J1bGVzICAgICAgPSAxIDw8IDIsCisgICAgICAgIEVtcHR5
Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCisgICAgICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAx
IDw8IDQsCisgICAgICAgIEFsbEJ1dEVtcHR5Q1NTUnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8
IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5DU1NSdWxlcywKKyAgICAgICAgQWxsQ1NTUnVs
ZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMgfCBFbXB0eUNTU1J1bGVzLAorICAgIH07
CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gc3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVu
dCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7CisgICAg
UGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVu
dCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVs
ZXMpOworCisgICAgLy8gR2l2ZW4gYSBDU1Mga2V5d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxs
IHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICAgIC8v
IHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZh
dWx0IChtZWRpdW0pLgorICAgIHN0YXRpYyBmbG9hdCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1l
bnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKKworICAg
IC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJu
IGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFuZCA3LgorICAgIHN0YXRpYyBpbnQgbGVnYWN5
Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhl
ZERlZmF1bHRTaXplKTsKKworcHVibGljOgorICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUo
Q1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5kZXJTdHlsZSopOworCisgICAgdm9pZCBhcHBs
eVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKworICAg
IHZvaWQgdXBkYXRlRm9udCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5n
cyopOworCisgICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQg
c3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVt
Rm9yRm9udEZpemUpOworCisgICAgdm9pZCBzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mLCBm
bG9hdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXpl
RnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBSZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0
ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKTsKKworcHVi
bGljOgorICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCk7CisKKyAgICBzdGF0aWMgYm9vbCBjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVl
Kik7CisgICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUq
LCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2UpIGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxl
Y3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0
b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIGhhc1NlbGVj
dG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworCisgICAgQ1NTRm9u
dFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5n
ZXQoKTsgfQorI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgVmlld3BvcnRT
dHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0
U3R5bGVSZXNvbHZlci5nZXQoKTsgfQorI2VuZGlmCisKKyAgICB2b2lkIGFkZFZpZXdwb3J0RGVw
ZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQp
OworICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJl
dHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQor
ICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFk
ZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+KTsKKworICAgIGJv
b2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKworICAgIGJvb2wg
dXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCku
c2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQorICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkg
Y29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsg
fQorICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVT
ZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KKworICAgIHN0YXRpYyBib29s
IGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxl
KiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBv
dXRPcGVyYXRpb25zKTsKKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGll
c0NhY2hlKCk7CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisgICAgYm9vbCBjcmVhdGVGaWx0
ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Cisj
aWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIFN0eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NW
YWx1ZSopOworICAgIFN0eWxlU2hhZGVyKiBjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21W
YWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOworICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYpOworICAg
IFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3Qg
U3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRl
clBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBu
YW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlv
bj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KFdlYktpdENT
U0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIHZv
aWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5kaWYKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZv
aWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKKyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShD
U1NfRklMVEVSUykKKworICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworcHJpdmF0
ZToKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBp
ZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hh
bmdlZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0
eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNo
YW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7CisgICAgdm9pZCBj
aGVja0ZvclRleHRTaXplQWRqdXN0KCk7CisKKyAgICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJl
bmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1l
bnQqKTsKKworICAgIHN0cnVjdCBSdWxlUmFuZ2UgeworICAgICAgICBSdWxlUmFuZ2UoaW50JiBm
aXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RS
dWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQorICAgICAgICBpbnQm
IGZpcnN0UnVsZUluZGV4OworICAgICAgICBpbnQmIGxhc3RSdWxlSW5kZXg7CisgICAgfTsKKwor
ICAgIHN0cnVjdCBNYXRjaFJhbmdlcyB7CisgICAgICAgIE1hdGNoUmFuZ2VzKCkgOiBmaXJzdFVB
UnVsZSgtMSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUoLTEpLCBsYXN0QXV0aG9y
UnVsZSgtMSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUoLTEpIHsgfQorICAgICAg
ICBpbnQgZmlyc3RVQVJ1bGU7CisgICAgICAgIGludCBsYXN0VUFSdWxlOworICAgICAgICBpbnQg
Zmlyc3RBdXRob3JSdWxlOworICAgICAgICBpbnQgbGFzdEF1dGhvclJ1bGU7CisgICAgICAgIGlu
dCBmaXJzdFVzZXJSdWxlOworICAgICAgICBpbnQgbGFzdFVzZXJSdWxlOworICAgICAgICBSdWxl
UmFuZ2UgVUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVQVJ1bGUsIGxhc3RV
QVJ1bGUpOyB9CisgICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFuZ2UoKSB7IHJldHVybiBS
dWxlUmFuZ2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7IH0KKyAgICAgICAgUnVs
ZVJhbmdlIHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVc2VyUnVsZSwg
bGFzdFVzZXJSdWxlKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXMg
eworICAgICAgICBNYXRjaGVkUHJvcGVydGllcygpOworICAgICAgICB+TWF0Y2hlZFByb3BlcnRp
ZXMoKTsKKyAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikg
Y29uc3Q7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcHJvcGVy
dGllczsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAg
ICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKKyAgICAgICAgICAgICAgICB1bnNpZ25l
ZCB3aGl0ZWxpc3RUeXBlIDogMjsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBVc2Vk
IHRvIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6ZWQgc2luY2Ugd2UgY29t
cHV0ZSB0aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICAg
IHZvaWQqIHBvc3NpYmx5UGFkZGVkTWVtYmVyOworICAgICAgICB9OworICAgIH07CisKKyAgICBz
dHJ1Y3QgTWF0Y2hSZXN1bHQgeworICAgICAgICBNYXRjaFJlc3VsdCgpIDogaXNDYWNoZWFibGUo
dHJ1ZSkgeyB9CisgICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcywgNjQ+IG1hdGNoZWRQ
cm9wZXJ0aWVzOworICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1hdGNoZWRSdWxlczsK
KyAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBib29sIGlzQ2FjaGVhYmxlOwor
ICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3Vs
dCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1
bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVy
dHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyAgICB2b2lkIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworCisgICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1h
dGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOworICAgIHZvaWQgbWF0Y2hV
QVJ1bGVzKE1hdGNoUmVzdWx0Jik7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQm
LCBSdWxlU2V0Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3Vs
dCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JS
dWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0
Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKworICAg
IHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdl
Jik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJl
cXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlz
dChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdl
Jik7CisKKyAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYpIGNvbnN0
OworICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZvaWQgc29ydEFuZFRyYW5zZmVy
TWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CisKKyAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0
IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0
b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RD
cm9zc0JvdW5kYXJ5KTsKKyAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2Vs
ZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKyAgICB2b2lk
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBjb25zdCBFbGVtZW50
Kik7CisgICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7CisjaWYgRU5BQkxFKENTU19WQVJJ
QUJMRVMpCisgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCisjZW5kaWYKKyAgICAgICAgSGln
aFByaW9yaXR5UHJvcGVydGllcywKKyAgICAgICAgTG93UHJpb3JpdHlQcm9wZXJ0aWVzCisgICAg
fTsKKyAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFw
cGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBib29sIGltcG9ydGFudCwg
aW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KTsKKyAgICB0
ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5UHJvcGVy
dGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqLCBib29s
IGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9
IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAg
dm9pZCByZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwgVmVjdG9yPHN0
ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpOworI2Vu
ZGlmCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVy
dHlJRCk7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIHN0YXRpYyBib29sIGlzVmFsaWRD
dWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOworI2VuZGlmCisgICAgdm9pZCBtYXRjaFBh
Z2VSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNG
aXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVs
ZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVj
dG9yPFN0eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwg
Y29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgU2V0dGluZ3MqIGRvY3VtZW50U2V0dGluZ3Mo
KSB7IHJldHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9CisKKyAgICBib29sIGlzTGVmdFBh
Z2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBpc1JpZ2h0UGFnZShpbnQgcGFnZUlu
ZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgpOyB9CisgICAgYm9vbCBp
c0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBTdHJpbmcgcGFnZU5hbWUoaW50
IHBhZ2VJbmRleCkgY29uc3Q7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzIG1fcnVsZVNldHM7CisK
KyAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJlZlB0cjxTdHlsZVJ1bGVL
ZXlmcmFtZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKKyAgICBLZXlmcmFtZXNSdWxlTWFwIG1fa2V5
ZnJhbWVzUnVsZU1hcDsKKworcHVibGljOgorICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NQcm9wZXJ0
eUlELCBSZWZQdHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA7CisjaWYgRU5B
QkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgIHR5cGVkZWYgSGFzaE1hcDxGaWx0
ZXJPcGVyYXRpb24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZT4gPiBQZW5kaW5n
U1ZHRG9jdW1lbnRNYXA7CisjZW5kaWYKKworICAgIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgV1RG
X01BS0VfTk9OQ09QWUFCTEUoU3RhdGUpOworICAgIHB1YmxpYzoKKyAgICAgICAgU3RhdGUoKQor
ICAgICAgICA6IG1fZWxlbWVudCgwKQorICAgICAgICAsIG1fc3R5bGVkRWxlbWVudCgwKQorICAg
ICAgICAsIG1fcGFyZW50Tm9kZSgwKQorICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKKyAgICAg
ICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmco
MCkKKyAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQorICAgICAgICAsIG1fcHNldWRv
U3R5bGVSZXF1ZXN0KE5PUFNFVURPKQorICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShOb3RJ
bnNpZGVMaW5rKQorICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZhbHNl
KQorICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQorICAgICAg
ICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQorICAgICAgICAsIG1f
YXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCisgICAgICAgICwgbV9hcHBseVByb3Bl
cnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAg
ICAgICAgLCBtX2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQorI2VuZGlmCisgICAgICAgICwgbV9s
aW5lSGVpZ2h0VmFsdWUoMCkKKyAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxzZSkKKyAgICAgICAg
LCBtX2hhc1VBQXBwZWFyYW5jZShmYWxzZSkKKyAgICAgICAgLCBtX2JhY2tncm91bmREYXRhKEJh
Y2tncm91bmRGaWxsTGF5ZXIpIHsgfQorCisgICAgcHVibGljOgorICAgICAgICB2b2lkIGluaXRF
bGVtZW50KEVsZW1lbnQqKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3Vt
ZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVk
b1N0eWxlUmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdp
b24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAg
ICAgIERvY3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC0+ZG9jdW1l
bnQoKTsgfQorICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVt
ZW50OyB9CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJl
dHVybiBtX3N0eWxlZEVsZW1lbnQ7IH0KKyAgICAgICAgdm9pZCBzZXRTdHlsZShQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KKyAgICAgICAgUmVuZGVy
U3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQorICAgICAgICBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVh
c2UoKTsgfQorCisgICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOwor
ICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBt
X3J1bGVMaXN0LnJlbGVhc2UoKTsgfQorCisgICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBh
cmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KKyAgICAgICAgdm9pZCBz
ZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9
IHBhcmVudFN0eWxlOyB9CisgICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVt
ZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KKworICAgICAg
ICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBt
X3JlZ2lvbkZvclN0eWxpbmc7IH0KKyAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29s
IGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7
IH0KKyAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1l
T3JpZ2luT25seTsgfQorICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0
eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9CisgICAg
ICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1l
bnRMaW5rU3RhdGU7IH0KKyAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQo
KSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQorICAgICAg
ICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsg
bV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CisgICAgICAgIGJv
b2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KKyAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hl
Y2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICAgICAgU2VsZWN0b3JDaGVj
a2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KKyAgICAgICAgCisgICAg
ICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBt
X2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAgICAgdm9pZCBz
ZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5
UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9CisgICAgICAgIGJvb2wgYXBw
bHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGU7IH0KKyAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlu
a1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxl
OyB9CisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzKCkgeyByZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9CisjaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAm
IHBlbmRpbmdTVkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdEb2N1bWVudHM7IH0K
KyNlbmRpZgorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgdm9pZCBzZXRIYXNQZW5k
aW5nU2hhZGVycyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVuZGluZ1NoYWRlcnMg
PSBoYXNQZW5kaW5nU2hhZGVyczsgfQorICAgICAgICBib29sIGhhc1BlbmRpbmdTaGFkZXJzKCkg
Y29uc3QgeyByZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQorI2VuZGlmCisKKyAgICAgICAg
dm9pZCBzZXRMaW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1fbGluZUhlaWdodFZh
bHVlID0gdmFsdWU7IH0KKyAgICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRWYWx1ZSgpIHsgcmV0
dXJuIG1fbGluZUhlaWdodFZhbHVlOyB9CisgICAgICAgIHZvaWQgc2V0Rm9udERpcnR5KGJvb2wg
aXNEaXJ0eSkgeyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KKyAgICAgICAgYm9vbCBmb250RGly
dHkoKSBjb25zdCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQorCisgICAgICAgIHZvaWQgY2FjaGVC
b3JkZXJBbmRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGJvb2wgaGFzVUFBcHBlYXJhbmNlKCkgY29u
c3QgeyByZXR1cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KKyAgICAgICAgQm9yZGVyRGF0YSBib3Jk
ZXJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9CisgICAgICAgIEZpbGxMYXll
ciBiYWNrZ3JvdW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZERhdGE7IH0KKyAg
ICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5k
Q29sb3I7IH0KKworICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlv
bigpIHsgcmV0dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9CisgICAgICAgIGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9wYXJl
bnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAgICAgdm9pZCBzZXRGb250RGVzY3Jp
cHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9mb250RGly
dHkgfD0gbV9zdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAg
ICAgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0
Wm9vbShmKTsgfQorICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX2Zv
bnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgICAgIHZvaWQg
c2V0VGV4dFNpemVBZGp1c3QoYm9vbCBiKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRl
eHRTaXplQWRqdXN0KGIpOyB9CisgICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01v
ZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGluZ01vZGUo
d3JpdGluZ01vZGUpOyB9CisgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmll
bnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4
dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KKworICAgICAgICBWZWN0b3I8Y29uc3Qg
UnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9
CisgICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9t
YXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAg
ICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZpZXcsIHRo
ZXNlIG1lbWJlcgorICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZlciB3ZSBz
aG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCisgICAgICAgIC8vIHRoZXNlIHZhcmlhYmxlcy4K
KyAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IG1fc3R5bGU7CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVkRWxlbWVudDsKKyAgICAg
ICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9w
YXJlbnRTdHlsZTsKKyAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHlsZTsKKyAg
ICAgICAgCisgICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgICAg
ICBib29sIG1fc2FtZU9yaWdpbk9ubHk7CisgICAgICAgIFBzZXVkb1N0eWxlUmVxdWVzdCBtX3Bz
ZXVkb1N0eWxlUmVxdWVzdDsKKworICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3Rh
dGU7CisKKyAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKKworICAg
ICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOworCisgICAgICAgIFNlbGVj
dG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7CisKKyAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBo
b2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKKyAgICAgICAgLy8g
YW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgorICAgICAgICBW
ZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7CisgICAgICAgIFJlZlB0
cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKworICAgICAgICBib29sIG1fYXBwbHlQ
cm9wZXJ0eVRvUmVndWxhclN0eWxlOworICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlz
aXRlZExpbmtTdHlsZTsKKworICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCBtX3BlbmRp
bmdJbWFnZVByb3BlcnRpZXM7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICBib29s
IG1faGFzUGVuZGluZ1NoYWRlcnM7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYm
IEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCBtX3BlbmRpbmdTVkdE
b2N1bWVudHM7CisjZW5kaWYKKyAgICAgICAgQ1NTVmFsdWUqIG1fbGluZUhlaWdodFZhbHVlOwor
ICAgICAgICBib29sIG1fZm9udERpcnR5OworCisgICAgICAgIGJvb2wgbV9oYXNVQUFwcGVhcmFu
Y2U7CisgICAgICAgIEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOworICAgICAgICBGaWxsTGF5ZXIg
bV9iYWNrZ3JvdW5kRGF0YTsKKyAgICAgICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CisgICAg
fTsKKworICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRBdmFpbGFibGUoKSB7IHJl
dHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOyB9CisKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IHN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJ
bWFnZVZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBnZW5lcmF0ZWRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSopOworI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gc2V0T3JQ
ZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0VmFsdWUqKTsKKyNlbmRp
ZgorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENT
U1Byb3BlcnR5SUQsIENTU0N1cnNvckltYWdlVmFsdWUqKTsKKworICAgIGJvb2wgYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUoKTsgfQorICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZSgpOyB9CisKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0ludExlbmd0aChDU1NQcmlt
aXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91Ymxl
IG11bHRpcGxpZXIgPSAxKTsKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0Zsb2F0TGVuZ3Ro
KENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxl
LCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworCisgICAgQ1NTVG9TdHlsZU1hcCogc3R5bGVNYXAo
KSB7IHJldHVybiAmbV9zdHlsZU1hcDsgfQorICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGlu
c3BlY3RvckNTU09NV3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7
IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJu
IG1fc3RhdGUuZm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24m
IHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Rm9udERlc2Ny
aXB0aW9uKCk7IH0KKyAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnREZXNjcmlwdGlvbihmb250
RGVzY3JpcHRpb24pOyB9CisgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5zZXRa
b29tKGYpOyB9CisgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5z
ZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgdm9pZCBzZXRUZXh0U2l6ZUFkanVzdChib29sIGIp
IHsgbV9zdGF0ZS5zZXRUZXh0U2l6ZUFkanVzdChiKTsgfQorICAgIHZvaWQgc2V0V3JpdGluZ01v
ZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9zdGF0ZS5zZXRXcml0aW5nTW9kZSh3cml0
aW5nTW9kZSk7IH0KKyAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24g
dGV4dE9yaWVudGF0aW9uKSB7IG1fc3RhdGUuc2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRh
dGlvbik7IH0KKyAgICAKKyAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdElu
Zm8qKSBjb25zdDsKKyAgICAKK3ByaXZhdGU6CisgICAgc3RhdGljIFJlbmRlclN0eWxlKiBzX3N0
eWxlTm90WWV0QXZhaWxhYmxlOworCisgICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQo
KTsKKworcHJpdmF0ZToKKyAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRF
bGVtZW50KikgY29uc3Q7CisKKyAgICB2b2lkIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCwg
Q1NTVmFsdWUqKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgdm9pZCBhcHBseVNWR1Byb3BlcnR5
KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7CisjZW5kaWYKKworICAgIFBhc3NSZWZQdHI8U3R5
bGVJbWFnZT4gbG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSopOworICAgIHZvaWQg
bG9hZFBlbmRpbmdJbWFnZXMoKTsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlTWF0Y2hl
ZFByb3BlcnRpZXNIYXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzKiwgdW5zaWduZWQgc2l6ZSk7
CisgICAgc3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIHsKKyAgICAgICAgdm9pZCBy
ZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7CisgICAgICAgIFZlY3Rv
cjxNYXRjaGVkUHJvcGVydGllcz4gbWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIE1hdGNoUmFu
Z2VzIHJhbmdlczsKKyAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiByZW5kZXJTdHlsZTsKKyAg
ICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBwYXJlbnRSZW5kZXJTdHlsZTsKKyAgICB9OworICAg
IGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsKKyAgICB2b2lkIGFk
ZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSwgdW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsK
KworICAgIC8vIEV2ZXJ5IE4gYWRkaXRpb25zIHRvIHRoZSBtYXRjaGVkIGRlY2xhcmF0aW9uIGNh
Y2hlIHRyaWdnZXIgYSBzd2VlcCB3aGVyZSBlbnRyaWVzIGhvbGRpbmcKKyAgICAvLyB0aGUgbGFz
dCByZWZlcmVuY2UgdG8gYSBzdHlsZSBkZWNsYXJhdGlvbiBhcmUgZ2FyYmFnZSBjb2xsZWN0ZWQu
CisgICAgdm9pZCBzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZl
cj4qKTsKKworICAgIGJvb2wgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNw
bGl0U3RyaW5nJikgY29uc3Q7CisgICAgYm9vbCBzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2Fs
U3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHVu
c2lnbmVkIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwOwor
CisgICAgdHlwZWRlZiBIYXNoTWFwPHVuc2lnbmVkLCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRl
bT4gTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKKworICAgIFRpbWVyPFN0eWxlUmVzb2x2ZXI+IG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXI7CisKKyAgICBPd25QdHI8TWVkaWFRdWVyeUV2
YWx1YXRvcj4gbV9tZWRpdW07CisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3Jvb3REZWZhdWx0
U3R5bGU7CisKKyAgICBEb2N1bWVudCogbV9kb2N1bWVudDsKKyAgICBTZWxlY3RvckZpbHRlciBt
X3NlbGVjdG9yRmlsdGVyOworCisgICAgYm9vbCBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlczsK
KworICAgIFJlZlB0cjxDU1NGb250U2VsZWN0b3I+IG1fZm9udFNlbGVjdG9yOworICAgIFZlY3Rv
cjxPd25QdHI8TWVkaWFRdWVyeVJlc3VsdD4gPiBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHM7CisKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIFJlZlB0
cjxWaWV3cG9ydFN0eWxlUmVzb2x2ZXI+IG1fdmlld3BvcnRTdHlsZVJlc29sdmVyOworI2VuZGlm
CisKKyAgICBjb25zdCBTdHlsZUJ1aWxkZXImIG1fc3R5bGVCdWlsZGVyOworCisgICAgT3duUHRy
PFN0eWxlU2NvcGVSZXNvbHZlcj4gbV9zY29wZVJlc29sdmVyOworICAgIENTU1RvU3R5bGVNYXAg
bV9zdHlsZU1hcDsKKyAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzIG1faW5zcGVjdG9yQ1NTT01X
cmFwcGVyczsKKworICAgIFN0YXRlIG1fc3RhdGU7CisKKyAgICBmcmllbmQgY2xhc3MgU3R5bGVC
dWlsZGVyOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hlZFByb3BlcnRp
ZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9y
IT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOwor
ICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRj
aFJhbmdlcyYpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hSYW5nZXMm
LCBjb25zdCBNYXRjaFJhbmdlcyYpOworfTsKKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6
aGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nICZhdHRyaWJ1dGVOYW1l
KSBjb25zdAoreworICAgIEFTU0VSVCghYXR0cmlidXRlTmFtZS5pc0VtcHR5KCkpOworICAgIHJl
dHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJblJ1bGVzLmNvbnRhaW5zKGF0dHJpYnV0
ZU5hbWUuaW1wbCgpKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0
b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmIGNsYXNzVmFsdWUpIGNvbnN0Cit7CisgICAg
QVNTRVJUKCFjbGFzc1ZhbHVlLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVh
dHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFzc1ZhbHVlLmltcGwoKSk7Cit9CisK
K2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWlj
U3RyaW5nJiBpZFZhbHVlKSBjb25zdAoreworICAgIEFTU0VSVCghaWRWYWx1ZS5pc0VtcHR5KCkp
OworICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhp
ZFZhbHVlLmltcGwoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IFN0eWxlUmVzb2x2ZXJfaApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29s
bGVjdG9yLmgJKHJldmlzaW9uIDE0NDg5MykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50
UnVsZUNvbGxlY3Rvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOSw2ODIgKzE5LDEwNiBAQAogICoK
ICAqLwogCi0jaWZuZGVmIFN0eWxlUmVzb2x2ZXJfaAotI2RlZmluZSBTdHlsZVJlc29sdmVyX2gK
KyNpZm5kZWYgRWxlbWVudFJ1bGVDb2xsZWN0b3JfaAorI2RlZmluZSBFbGVtZW50UnVsZUNvbGxl
Y3Rvcl9oCiAKLSNpbmNsdWRlICJDU1NSdWxlTGlzdC5oIgotI2luY2x1ZGUgIkNTU1RvU3R5bGVN
YXAuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudFJ1bGVT
ZXRzLmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5oIgotI2luY2x1ZGUgIkxp
bmtIYXNoLmgiCi0jaW5jbHVkZSAiTWVkaWFRdWVyeUV4cC5oIgotI2luY2x1ZGUgIlJlbmRlclN0
eWxlLmgiCi0jaW5jbHVkZSAiUnVsZUZlYXR1cmUuaCIKLSNpbmNsdWRlICJSdWxlU2V0LmgiCi0j
aW5jbHVkZSAiUnVudGltZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlNjcm9sbFR5cGVz
LmgiCisjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgogI2luY2x1ZGUgIlNlbGVjdG9y
Q2hlY2tlci5oIgotI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVJ
bmhlcml0ZWREYXRhLmgiCi0jaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCi0jaW5jbHVk
ZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQotI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3VtZW50VmFsdWUuaCIKLSNlbmRp
ZgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNp
bmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCiAjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgogI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+
Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKLWVudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1G
b3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUgfTsKLQotY2xhc3MgQ1NTQ3Vy
c29ySW1hZ2VWYWx1ZTsKLWNsYXNzIENTU0ZvbnRTZWxlY3RvcjsKLWNsYXNzIENTU0ZvbnRGYWNl
OwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlOwotY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsK
LWNsYXNzIENTU0ltYWdlU2V0VmFsdWU7Ci1jbGFzcyBDU1NJbWFnZVZhbHVlOwotY2xhc3MgQ1NT
UGFnZVJ1bGU7Ci1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKLWNsYXNzIENTU1Byb3BlcnR5Owog
Y2xhc3MgQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBDU1NTZWxlY3RvcjsKLWNsYXNzIENTU1N0eWxlU2hl
ZXQ7Ci1jbGFzcyBDU1NWYWx1ZTsKLWNsYXNzIENvbnRhaW5lck5vZGU7Ci1jbGFzcyBDdXN0b21G
aWx0ZXJPcGVyYXRpb247Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXI7Ci1jbGFzcyBDdXN0
b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OwotY2xhc3MgRG9jdW1lbnQ7Ci1jbGFzcyBFbGVtZW50Owot
Y2xhc3MgRnJhbWU7Ci1jbGFzcyBGcmFtZVZpZXc7Ci1jbGFzcyBLVVJMOwotY2xhc3MgS2V5ZnJh
bWVMaXN0OwotY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKLWNsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7
Ci1jbGFzcyBOb2RlOworY2xhc3MgRG9jdW1lbnRSdWxlU2V0czsKIGNsYXNzIFJlbmRlclJlZ2lv
bjsKLWNsYXNzIFJlbmRlclNjcm9sbGJhcjsKIGNsYXNzIFJ1bGVEYXRhOwogY2xhc3MgUnVsZVNl
dDsKLWNsYXNzIFNldHRpbmdzOwotY2xhc3MgU3RhdGljQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBTdHls
ZUJ1aWxkZXI7CitjbGFzcyBTZWxlY3RvckZpbHRlcjsKIGNsYXNzIFN0eWxlU2NvcGVSZXNvbHZl
cjsKLWNsYXNzIFN0eWxlSW1hZ2U7Ci1jbGFzcyBTdHlsZUtleWZyYW1lOwotY2xhc3MgU3R5bGVQ
ZW5kaW5nSW1hZ2U7Ci1jbGFzcyBTdHlsZVByb3BlcnR5U2V0OwotY2xhc3MgU3R5bGVSdWxlOwot
I2lmIEVOQUJMRShTSEFET1dfRE9NKQotY2xhc3MgU3R5bGVSdWxlSG9zdDsKLSNlbmRpZgotY2xh
c3MgU3R5bGVSdWxlS2V5ZnJhbWVzOwotY2xhc3MgU3R5bGVSdWxlUGFnZTsKLWNsYXNzIFN0eWxl
UnVsZVJlZ2lvbjsKLWNsYXNzIFN0eWxlU2hhZGVyOwotY2xhc3MgU3R5bGVTaGVldDsKLWNsYXNz
IFN0eWxlU2hlZXRMaXN0OwotY2xhc3MgU3R5bGVkRWxlbWVudDsKLWNsYXNzIFZpZXdwb3J0U3R5
bGVSZXNvbHZlcjsKLWNsYXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOwotY2xhc3MgV2ViS2l0Q1NT
U2hhZGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOwotCi1jbGFzcyBN
ZWRpYVF1ZXJ5UmVzdWx0IHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVz
dWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgTWVkaWFRdWVyeVJl
c3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKLSAgICAgICAgOiBt
X2V4cHJlc3Npb24oZXhwcikKLSAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCi0gICAgewotICAg
IH0KLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsK
LQotICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNzaW9uOwotICAgIGJvb2wgbV9yZXN1bHQ7Ci19
OwotCi1lbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHsKLSAgICBBbGxvd1N0eWxlU2hhcmluZywK
LSAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKLX07Ci0KLS8vIE1hdGNoT25seVVzZXJBZ2VudFJ1
bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKLS8vIGFy
ZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHls
ZSwgYW5kIHN0eWxlZCBvbmx5Ci0vLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVs
ZXMuCi0KLWVudW0gUnVsZU1hdGNoaW5nQmVoYXZpb3IgewotICAgIE1hdGNoQWxsUnVsZXMsCi0g
ICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwsCi0gICAgTWF0Y2hPbmx5VXNlckFnZW50UnVs
ZXMsCi19OwotCi1jbGFzcyBQc2V1ZG9TdHlsZVJlcXVlc3QgewotcHVibGljOgotICAgIFBzZXVk
b1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxi
YXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCi0gICAgICAgIDog
cHNldWRvSWQocHNldWRvSWQpCi0gICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0
KQotICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxiYXIpCi0gICAgewotICAgIH0KLQotICAgIFBz
ZXVkb0lkIHBzZXVkb0lkOwotICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKLSAgICBS
ZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKLX07Ci0KLWNsYXNzIE1hdGNoUmVxdWVzdCB7Ci1w
dWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVt
cHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3Rv
ckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAgICA6IHJ1bGVTZXQocnVsZVNl
dCkKLSAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAg
ICAgLCBzY29wZShzY29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JB
dEJvdW5kYXJ5KSB7IH0KLSAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OwotICAgIGNvbnN0IGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXM7Ci0gICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7Ci0g
ICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJv
dW5kYXJ5OwotfTsKLQotLy8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEg
Z2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCi1jbGFz
cyBTdHlsZVJlc29sdmVyIHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVy
KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgU3R5bGVSZXNvbHZlcihE
b2N1bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKLSAgICB+U3R5bGVSZXNv
bHZlcigpOwotCi0gICAgLy8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93
IHN0eWxlIHNlbGVjdG9yIHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9y
IGxvb2t1cHMuCi0gICAgdm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50Kik7Ci0gICAgdm9p
ZCBwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICB2b2lkIHB1c2hQYXJlbnRTaGFkb3dS
b290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSAgICB2b2lkIHBvcFBhcmVudFNoYWRvd1Jvb3QoY29u
c3QgU2hhZG93Um9vdCopOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIHZvaWQgYWRkSG9z
dFJ1bGUoU3R5bGVSdWxlSG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2lu
LCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJlc29sdmVyKCktPmFk
ZEhvc3RSdWxlKHJ1bGUsIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNjb3BlKTsgfQotI2Vu
ZGlmCi0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVu
dCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmluZ0JlaGF2aW9yID0g
QWxsb3dTdHlsZVNoYXJpbmcsCi0gICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2aW9yID0gTWF0Y2hB
bGxSdWxlcywgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7Ci0KLSAgICB2b2lk
IGtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBSZW5kZXJTdHlsZSos
IEtleWZyYW1lTGlzdCYpOwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5
bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVG
b3JQYWdlKGludCBwYWdlSW5kZXgpOwotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGRlZmF1
bHRTdHlsZUZvckVsZW1lbnQoKTsKLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZv
clRleHQoVGV4dCopOwotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxl
Rm9yRG9jdW1lbnQoRG9jdW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7Ci0KLSAgICBSZW5k
ZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxlKCk7IH0KLSAgICBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudFN0
eWxlKCk7IH0KLSAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0
dXJuIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpOyB9Ci0gICAgRWxlbWVudCogZWxlbWVudCgp
IHsgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpOyB9Ci0gICAgRG9jdW1lbnQqIGRvY3VtZW50KCkg
eyByZXR1cm4gbV9kb2N1bWVudDsgfQotICAgIFN0eWxlU2NvcGVSZXNvbHZlciogc2NvcGVSZXNv
bHZlcigpIGNvbnN0IHsgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsgfQotICAgIGJvb2wg
aGFzUGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Tm9kZSgpOyB9Ci0K
LSAgICAvLyBGSVhNRTogSXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9ydWxlU2V0cy5hcHBl
bmRBdXRob3JTdHlsZVNoZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3RvciBTdHlsZVJzb2x2
ZXIgZnVydGhlci4KLSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTA4ODkwCi0gICAgdm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJz
dE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7Ci0KLSAgICBEb2N1
bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KLSAgICBjb25z
dCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7
IH0KLQotI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQotICAg
IFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCi0gICAgewotI2lmIEVO
QUJMRShTVFlMRV9TQ09QRUQpCi0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgICAgIEFTU0VS
VChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkgfHwgUnVudGltZUVu
YWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOwotI2Vsc2UKLSAgICAgICAgQVNT
RVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKLSNlbmRp
ZgotI2Vsc2UKLSAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RP
TUVuYWJsZWQoKSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCi0gICAg
ICAgICAgICBtX3Njb3BlUmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVTY29wZVJlc29sdmVy
KCkpOwotICAgICAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOwotICAgIH0KLSNlbmRp
ZgotCi1wcml2YXRlOgotICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOwotICAgIFJlbmRl
clN0eWxlKiBsb2NhdGVTaGFyZWRTdHlsZSgpOwotICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCopOwotICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc0hvc3RSdWxlcygpOwotICAgIE5vZGUqIGxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVu
dCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7Ci0gICAgU3R5bGVk
RWxlbWVudCogZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVuc2lnbmVkJiBjb3Vu
dCkgY29uc3Q7Ci0gICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVu
dCopIGNvbnN0OwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JLZXlmcmFt
ZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBLZXlmcmFtZVZhbHVl
Jik7Ci0KLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2ZSBiYWNrIHRoZSBz
ZXQgb2YgcnVsZXMgdGhhdCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgKG9yIGEgcHNldWRv
LWVsZW1lbnQpLgotICAgIGVudW0gQ1NTUnVsZUZpbHRlciB7Ci0gICAgICAgIFVBQW5kVXNlckNT
U1J1bGVzICAgPSAxIDw8IDEsCi0gICAgICAgIEF1dGhvckNTU1J1bGVzICAgICAgPSAxIDw8IDIs
Ci0gICAgICAgIEVtcHR5Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCi0gICAgICAgIENyb3NzT3Jp
Z2luQ1NTUnVsZXMgPSAxIDw8IDQsCi0gICAgICAgIEFsbEJ1dEVtcHR5Q1NTUnVsZXMgPSBVQUFu
ZFVzZXJDU1NSdWxlcyB8IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5DU1NSdWxlcywKLSAg
ICAgICAgQWxsQ1NTUnVsZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMgfCBFbXB0eUNT
U1J1bGVzLAotICAgIH07Ci0gICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gc3R5bGVSdWxlc0Zv
ckVsZW1lbnQoRWxlbWVudCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlD
U1NSdWxlcyk7Ci0gICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRvU3R5bGVSdWxlc0Zv
ckVsZW1lbnQoRWxlbWVudCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFs
bEJ1dEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgLy8gR2l2ZW4gYSBDU1Mga2V5d29yZCBpbiB0aGUg
cmFuZ2UgKHh4LXNtYWxsIHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBmdW5jdGlvbiB3aWxs
IHJldHVybgotICAgIC8vIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQgcmVsYXRpdmUgdG8g
dGhlIHVzZXIncyBkZWZhdWx0IChtZWRpdW0pLgotICAgIHN0YXRpYyBmbG9hdCBmb250U2l6ZUZv
cktleXdvcmQoRG9jdW1lbnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1
bHRTaXplKTsKLQotICAgIC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVsLCB0aGlzIGZ1bmN0
aW9uIHdpbGwgcmV0dXJuIGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFuZCA3LgotICAgIHN0
YXRpYyBpbnQgbGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9v
bCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKLQotcHVibGljOgotICAgIHZvaWQgYXBwbHlQ
cm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5kZXJTdHlsZSopOwot
Ci0gICAgdm9pZCBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NT
VmFsdWUqKTsKLQotICAgIHZvaWQgdXBkYXRlRm9udCgpOwotICAgIHZvaWQgaW5pdGlhbGl6ZUZv
bnRTdHlsZShTZXR0aW5ncyopOwotCi0gICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZy
b21TcGVjaWZpZWRTaXplKERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29s
dXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplID0g
VXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUpOwotCi0gICAgdm9pZCBzZXRGb250U2l6ZShGb250
RGVzY3JpcHRpb24mLCBmbG9hdCBzaXplKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgZmxvYXQg
Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBSZW5kZXJTdHlsZSos
IGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9v
bVJ1bGVzKTsKLQotcHVibGljOgotICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCk7Ci0KLSAgICBz
dGF0aWMgYm9vbCBjb2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENT
U1ByaW1pdGl2ZVZhbHVlKik7Ci0gICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NT
UHJpbWl0aXZlVmFsdWUqLCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2UpIGNvbnN0OwotCi0g
ICAgYm9vbCBoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OwotICAg
IGJvb2wgaGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLSAg
ICBib29sIGhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0
OwotCi0gICAgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBt
X2ZvbnRTZWxlY3Rvci5nZXQoKTsgfQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04p
Ci0gICAgVmlld3BvcnRTdHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKSB7IHJl
dHVybiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci5nZXQoKTsgfQotI2VuZGlmCi0KLSAgICB2b2lk
IGFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhw
KiwgYm9vbCByZXN1bHQpOwotICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJp
ZXMoKSBjb25zdCB7IHJldHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRz
LmlzRW1wdHkoKTsgfQotICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7
Ci0KLSAgICB2b2lkIGFkZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFt
ZXM+KTsKLQotICAgIGJvb2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50
KTsKLQotICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bGVT
ZXRzLmZlYXR1cmVzKCkuc2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQotICAgIGJvb2wgdXNlc0Zp
cnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNG
aXJzdExpbmVSdWxlczsgfQotICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7
IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KLQot
ICAgIHN0YXRpYyBib29sIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFs
dWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zv
cm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKLSAgICAKLSAgICB2b2lkIGludmFsaWRhdGVN
YXRjaGVkUHJvcGVydGllc0NhY2hlKCk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0gICAg
Ym9vbCBjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHls
ZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0
T3BlcmF0aW9ucyk7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIFN0eWxlU2hhZGVyKiBz
dHlsZVNoYWRlcihDU1NWYWx1ZSopOwotICAgIFN0eWxlU2hhZGVyKiBjYWNoZWRPclBlbmRpbmdT
dHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOwotICAgIGJvb2wgcGFy
c2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9tRmlsdGVyUGFyYW1l
dGVyTGlzdCYpOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1
c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKik7Ci0gICAg
UGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQ
YXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQYXNzUmVm
UHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIo
Y29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3Rv
bUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJl
ZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3Vz
dG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5l
U3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0
ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJW
YWx1ZSopOwotICAgIHZvaWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7Ci0jZW5kaWYKLSNpZiBFTkFC
TEUoU1ZHKQotICAgIHZvaWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKLSNlbmRpZgotI2Vu
ZGlmIC8vIEVOQUJMRShDU1NfRklMVEVSUykKLQotICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJj
ZXMoKTsKLQotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZh
dWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250
IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5
Q2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLSAgICB2b2lk
IGNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSk7Ci0gICAgdm9pZCBjaGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0KLSAgICB2b2lkIGFkanVz
dFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUsIEVsZW1lbnQqKTsKLQotICAgIHN0cnVjdCBSdWxlUmFuZ2UgewotICAgICAgICBS
dWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RS
dWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsg
fQotICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OwotICAgICAgICBpbnQmIGxhc3RSdWxlSW5k
ZXg7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNYXRjaFJhbmdlcyB7Ci0gICAgICAgIE1hdGNoUmFu
Z2VzKCkgOiBmaXJzdFVBUnVsZSgtMSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUo
LTEpLCBsYXN0QXV0aG9yUnVsZSgtMSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUo
LTEpIHsgfQotICAgICAgICBpbnQgZmlyc3RVQVJ1bGU7Ci0gICAgICAgIGludCBsYXN0VUFSdWxl
OwotICAgICAgICBpbnQgZmlyc3RBdXRob3JSdWxlOwotICAgICAgICBpbnQgbGFzdEF1dGhvclJ1
bGU7Ci0gICAgICAgIGludCBmaXJzdFVzZXJSdWxlOwotICAgICAgICBpbnQgbGFzdFVzZXJSdWxl
OwotICAgICAgICBSdWxlUmFuZ2UgVUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmly
c3RVQVJ1bGUsIGxhc3RVQVJ1bGUpOyB9Ci0gICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFu
Z2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7
IH0KLSAgICAgICAgUnVsZVJhbmdlIHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2Uo
Zmlyc3RVc2VyUnVsZSwgbGFzdFVzZXJSdWxlKTsgfQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0
Y2hlZFByb3BlcnRpZXMgewotICAgICAgICBNYXRjaGVkUHJvcGVydGllcygpOwotICAgICAgICB+
TWF0Y2hlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8U3R5bGVQcm9w
ZXJ0eVNldD4gcHJvcGVydGllczsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgc3RydWN0
IHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKLSAgICAgICAg
ICAgICAgICB1bnNpZ25lZCB3aGl0ZWxpc3RUeXBlIDogMjsKLSAgICAgICAgICAgIH07Ci0gICAg
ICAgICAgICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6
ZWQgc2luY2Ugd2UgY29tcHV0ZSB0aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVj
dC4KLSAgICAgICAgICAgIHZvaWQqIHBvc3NpYmx5UGFkZGVkTWVtYmVyOwotICAgICAgICB9Owot
ICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hSZXN1bHQgewotICAgICAgICBNYXRjaFJlc3VsdCgp
IDogaXNDYWNoZWFibGUodHJ1ZSkgeyB9Ci0gICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGll
cywgNjQ+IG1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+
IG1hdGNoZWRSdWxlczsKLSAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBib29s
IGlzQ2FjaGVhYmxlOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVy
dGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0
eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpN
YXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsK
LSAgICB2b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOwotCi0gICAgdm9pZCBt
YXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwot
ICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBtYXRjaFVBUnVs
ZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7Ci0gICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1h
dGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFVzZXJS
dWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0
Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
OwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKLQotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1
ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lv
bihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1
ZXN0JiwgUnVsZVJhbmdlJik7Ci0KLSAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBS
dWxlRGF0YSYpIGNvbnN0OwotICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOwotICAgIHZvaWQg
c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7Ci0KLSAgICBib29sIHJ1
bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBz
ZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNo
ZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0
b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVt
ZW50KTsKLSAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQm
LCBjb25zdCBFbGVtZW50Kik7Ci0gICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7Ci0jaWYg
RU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCi0jZW5k
aWYKLSAgICAgICAgSGlnaFByaW9yaXR5UHJvcGVydGllcywKLSAgICAgICAgTG93UHJpb3JpdHlQ
cm9wZXJ0aWVzCi0gICAgfTsKLSAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFz
cz4KLSAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBi
b29sIGltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0
ZWRPbmx5KTsKLSAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLSAgICB2
b2lkIGFwcGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBT
dHlsZVJ1bGUqLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5
V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0jaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCi0gICAgdm9pZCByZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1Zh
bHVlKiwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhw
cmVzc2lvbnMpOwotI2VuZGlmCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJv
cGVydHkoQ1NTUHJvcGVydHlJRCk7Ci0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIHN0YXRp
YyBib29sIGlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOwotI2VuZGlmCi0g
ICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVm
dFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwotICAgIHZv
aWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRS
dWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9v
bCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7Ci0gICAgU2V0dGluZ3MqIGRv
Y3VtZW50U2V0dGluZ3MoKSB7IHJldHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9Ci0KLSAg
ICBib29sIGlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7Ci0gICAgYm9vbCBpc1JpZ2h0
UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgp
OyB9Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKLSAgICBTdHJp
bmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRleCkgY29uc3Q7Ci0KLSAgICBEb2N1bWVudFJ1bGVTZXRz
IG1fcnVsZVNldHM7Ci0KLSAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJl
ZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKLSAgICBLZXlmcmFt
ZXNSdWxlTWFwIG1fa2V5ZnJhbWVzUnVsZU1hcDsKK2NsYXNzIFN0YXRpY0NTU1J1bGVMaXN0Owog
CitjbGFzcyBFbGVtZW50UnVsZUNvbGxlY3RvciB7CiBwdWJsaWM6Ci0gICAgdHlwZWRlZiBIYXNo
TWFwPENTU1Byb3BlcnR5SUQsIFJlZlB0cjxDU1NWYWx1ZT4gPiBQZW5kaW5nSW1hZ2VQcm9wZXJ0
eU1hcDsKLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCi0gICAgdHlwZWRl
ZiBIYXNoTWFwPEZpbHRlck9wZXJhdGlvbiosIFJlZlB0cjxXZWJLaXRDU1NTVkdEb2N1bWVudFZh
bHVlPiA+IFBlbmRpbmdTVkdEb2N1bWVudE1hcDsKLSNlbmRpZgotCi0gICAgY2xhc3MgU3RhdGUg
ewotICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdGF0ZSk7Ci0gICAgcHVibGljOgotICAg
ICAgICBTdGF0ZSgpCi0gICAgICAgIDogbV9lbGVtZW50KDApCi0gICAgICAgICwgbV9zdHlsZWRF
bGVtZW50KDApCi0gICAgICAgICwgbV9wYXJlbnROb2RlKDApCi0gICAgICAgICwgbV9wYXJlbnRT
dHlsZSgwKQotICAgICAgICAsIG1fcm9vdEVsZW1lbnRTdHlsZSgwKQorICAgIEVsZW1lbnRSdWxl
Q29sbGVjdG9yKFN0eWxlUmVzb2x2ZXIqIHN0eWxlUmVzb2x2ZXIsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6OlN0YXRlJiBzdGF0ZSkKKyAgICAgICAgOiBtX3N0YXRlKHN0YXRlKQorICAgICAgICAsIG1f
cnVsZVNldHMoc3R5bGVSZXNvbHZlci0+cnVsZVNldHMoKSkKKyAgICAgICAgLCBtX3NlbGVjdG9y
RmlsdGVyKHN0eWxlUmVzb2x2ZXItPnNlbGVjdG9yRmlsdGVyKCkpCisgICAgICAgICwgbV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzKHN0eWxlUmVzb2x2ZXItPmluc3BlY3RvckNTU09NV3JhcHBlcnMo
KSkKKyAgICAgICAgLCBtX3Njb3BlUmVzb2x2ZXIoc3R5bGVSZXNvbHZlci0+c2NvcGVSZXNvbHZl
cigpKQorICAgICAgICAsIG1faXNQcmludFN0eWxlKGZhbHNlKQogICAgICAgICAsIG1fcmVnaW9u
Rm9yU3R5bGluZygwKQotICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCiAgICAgICAg
ICwgbV9wc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pCi0gICAgICAgICwgbV9lbGVtZW50TGlu
a1N0YXRlKE5vdEluc2lkZUxpbmspCi0gICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9u
UG9pbnQoZmFsc2UpCi0gICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoZmFs
c2UpCisgICAgICAgICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkKICAgICAgICAgLCBtX21vZGUo
U2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKLSAgICAgICAgLCBtX2FwcGx5UHJvcGVy
dHlUb1JlZ3VsYXJTdHlsZSh0cnVlKQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRl
ZExpbmtTdHlsZShmYWxzZSkKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgICwgbV9o
YXNQZW5kaW5nU2hhZGVycyhmYWxzZSkKLSNlbmRpZgotICAgICAgICAsIG1fbGluZUhlaWdodFZh
bHVlKDApCi0gICAgICAgICwgbV9mb250RGlydHkoZmFsc2UpCi0gICAgICAgICwgbV9oYXNVQUFw
cGVhcmFuY2UoZmFsc2UpCi0gICAgICAgICwgbV9iYWNrZ3JvdW5kRGF0YShCYWNrZ3JvdW5kRmls
bExheWVyKSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVt
ZW50Kik7Ci0gICAgICAgIHZvaWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1l
bnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVl
c3QmID0gUHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKSwgUmVuZGVyUmVnaW9uKiByZWdpb25G
b3JTdHlsaW5nID0gMCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLQotICAgICAgICBEb2N1bWVu
dCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KLSAg
ICAgICAgRWxlbWVudCogZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotICAg
ICAgICBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9zdHls
ZWRFbGVtZW50OyB9Ci0gICAgICAgIHZvaWQgc2V0U3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gc3R5bGUpIHsgbV9zdHlsZSA9IHN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KLSAgICAgICAgUGFzc1JlZlB0cjxS
ZW5kZXJTdHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KLQot
ICAgICAgICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFz
c1JlZlB0cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5y
ZWxlYXNlKCk7IH0KLQotICAgICAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9wYXJlbnROb2RlOyB9Ci0gICAgICAgIHZvaWQgc2V0UGFyZW50U3R5
bGUoUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHls
ZTsgfQotICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBt
X3BhcmVudFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkg
Y29uc3QgeyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxlOyB9Ci0KLSAgICAgICAgY29uc3QgUmVu
ZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JT
dHlsaW5nOyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmln
aW5Pbmx5KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAg
IGJvb2wgaXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7
IH0KLSAgICAgICAgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3Qo
KSBjb25zdCB7IHJldHVybiBtX3BzZXVkb1N0eWxlUmVxdWVzdDsgfQotICAgICAgICBFSW5zaWRl
TGluayBlbGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRl
OyB9Ci0gICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRF
bGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFm
ZmVjdGVkQnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQotICAgICAgICBib29sIGVsZW1lbnRB
ZmZlY3RlZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlD
bGFzc1J1bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUg
bW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBt
b2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNl
dEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIHZvaWQgc2V0QXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlID0gaXNBcHBseTsgfQotICAgICAgICBib29sIGFwcGx5UHJvcGVydHlU
b1JlZ3VsYXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0
eWxlOyB9Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsgfQotICAgICAg
ICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCYgcGVuZGluZ0ltYWdlUHJvcGVydGllcygpIHsgcmV0
dXJuIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllczsgfQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKLSAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwJiBwZW5kaW5nU1ZH
RG9jdW1lbnRzKCkgeyByZXR1cm4gbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOyB9Ci0jZW5kaWYKLSNp
ZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIHZvaWQgc2V0SGFzUGVuZGluZ1NoYWRlcnMo
Ym9vbCBoYXNQZW5kaW5nU2hhZGVycykgeyBtX2hhc1BlbmRpbmdTaGFkZXJzID0gaGFzUGVuZGlu
Z1NoYWRlcnM7IH0KLSAgICAgICAgYm9vbCBoYXNQZW5kaW5nU2hhZGVycygpIGNvbnN0IHsgcmV0
dXJuIG1faGFzUGVuZGluZ1NoYWRlcnM7IH0KLSNlbmRpZgotCi0gICAgICAgIHZvaWQgc2V0TGlu
ZUhlaWdodFZhbHVlKENTU1ZhbHVlKiB2YWx1ZSkgeyBtX2xpbmVIZWlnaHRWYWx1ZSA9IHZhbHVl
OyB9Ci0gICAgICAgIENTU1ZhbHVlKiBsaW5lSGVpZ2h0VmFsdWUoKSB7IHJldHVybiBtX2xpbmVI
ZWlnaHRWYWx1ZTsgfQotICAgICAgICB2b2lkIHNldEZvbnREaXJ0eShib29sIGlzRGlydHkpIHsg
bV9mb250RGlydHkgPSBpc0RpcnR5OyB9Ci0gICAgICAgIGJvb2wgZm9udERpcnR5KCkgY29uc3Qg
eyByZXR1cm4gbV9mb250RGlydHk7IH0KLQotICAgICAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFj
a2dyb3VuZCgpOwotICAgICAgICBib29sIGhhc1VBQXBwZWFyYW5jZSgpIGNvbnN0IHsgcmV0dXJu
IG1faGFzVUFBcHBlYXJhbmNlOyB9Ci0gICAgICAgIEJvcmRlckRhdGEgYm9yZGVyRGF0YSgpIGNv
bnN0IHsgcmV0dXJuIG1fYm9yZGVyRGF0YTsgfQotICAgICAgICBGaWxsTGF5ZXIgYmFja2dyb3Vu
ZERhdGEoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmREYXRhOyB9Ci0gICAgICAgIENvbG9y
IGJhY2tncm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9Ci0K
LSAgICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVy
biBtX3N0eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQotICAgICAgICBjb25zdCBGb250RGVzY3Jp
cHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fcGFyZW50U3R5bGUtPmZv
bnREZXNjcmlwdGlvbigpOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5
bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgICAgIHZvaWQg
c2V0Wm9vbShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFpvb20oZik7IH0K
LSAgICAgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldFRleHRTaXpl
QWRqdXN0KGJvb2wgYikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0U2l6ZUFkanVz
dChiKTsgfQotICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdN
b2RlKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2Rl
KTsgfQotICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4
dE9yaWVudGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRhdGlv
bih0ZXh0T3JpZW50YXRpb24pOyB9Ci0KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwg
MzI+JiBtYXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxlczsgfQotICAgICAgICB2
b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1bGVz
LmFwcGVuZChydWxlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhN
RShidWcgMTA4NTYzKTogdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1iZXIK
LSAgICAgICAgLy8gdmFyaWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFkZCBt
ZXRob2RzIHRvIGFjY2VzcwotICAgICAgICAvLyB0aGVzZSB2YXJpYWJsZXMuCi0gICAgICAgIEVs
ZW1lbnQqIG1fZWxlbWVudDsKLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3N0eWxlOwot
ICAgICAgICBTdHlsZWRFbGVtZW50KiBtX3N0eWxlZEVsZW1lbnQ7Ci0gICAgICAgIENvbnRhaW5l
ck5vZGUqIG1fcGFyZW50Tm9kZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7
Ci0gICAgICAgIFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAg
ICAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3Nh
bWVPcmlnaW5Pbmx5OwotICAgICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJl
cXVlc3Q7Ci0KLSAgICAgICAgRUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRlOwotCi0gICAg
ICAgIGJvb2wgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7Ci0KLSAgICAgICAgYm9vbCBt
X2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsKLQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6
Ok1vZGUgbV9tb2RlOworICAgICAgICAsIG1fY2FuVXNlRmFzdFJlamVjdChtX3NlbGVjdG9yRmls
dGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkpCisgICAgICAg
ICwgbV9iZWhhdmlvckF0Qm91bmRhcnkoU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3Vu
ZGFyeSkKKyAgICAgICAgLCBtX21hdGNoaW5nVUFSdWxlcyhmYWxzZSkgeyB9CisKKyAgICB2b2lk
IG1hdGNoQWxsUnVsZXMoYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIGJvb2wgaW5jbHVk
ZVNNSUxQcm9wZXJ0aWVzKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcygpOworICAgIHZvaWQgbWF0
Y2hBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNl
clJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworCisgICAgdm9pZCBzZXRNb2RlKFNlbGVj
dG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICB2b2lkIHNldFBz
ZXVkb1N0eWxlUmVxdWVzdChjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHJlcXVlc3QpIHsgbV9w
c2V1ZG9TdHlsZVJlcXVlc3QgPSByZXF1ZXN0OyB9CisgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25s
eShib29sIGYpIHsgbV9zYW1lT3JpZ2luT25seSA9IGY7IH0gCisgICAgdm9pZCBzZXRSZWdpb25G
b3JTdHlsaW5nKFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykgeyBtX3JlZ2lvbkZvclN0
eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOyB9CisgICAgdm9pZCBzZXRNZWRpdW0oY29uc3QgTWVk
aWFRdWVyeUV2YWx1YXRvciogbWVkaXVtKSB7IG1faXNQcmludFN0eWxlID0gbWVkaXVtLT5tZWRp
YVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpOyB9CiAKLSAgICAgICAgLy8gQSBidWZmZXIgdXNl
ZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKLSAgICAg
ICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgotICAg
ICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7Ci0gICAgICAg
IFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKyAgICBib29sIGhhc0FueU1h
dGNoaW5nUnVsZXMoUnVsZVNldCopOwogCi0gICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGU7Ci0gICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVzdWx0KCk7Cisg
ICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gbWF0Y2hlZFJ1bGVMaXN0KCk7CiAKLSAgICAgICAg
UGVuZGluZ0ltYWdlUHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOwotI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFkZXJzOwotI2Vu
ZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgICAgICBQZW5k
aW5nU1ZHRG9jdW1lbnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlmCi0gICAgICAg
IENTU1ZhbHVlKiBtX2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2ZvbnREaXJ0eTsK
LQotICAgICAgICBib29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAgICAgICBCb3JkZXJEYXRhIG1f
Ym9yZGVyRGF0YTsKLSAgICAgICAgRmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7Ci0gICAgICAg
IENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMgUmVuZGVyU3R5
bGUqIHN0eWxlTm90WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJs
ZTsgfQotCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENTU1Byb3BlcnR5
SUQsIENTU1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNoZWRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAgIFBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQs
IENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAg
ICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0
eUlELCBDU1NJbWFnZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NDdXJzb3JJbWFn
ZVZhbHVlKik7Ci0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7IH0KLSAgICBi
b29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0
YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAgc3RhdGljIExl
bmd0aCBjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSos
IFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7Ci0gICAgc3Rh
dGljIExlbmd0aCBjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRl
clN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsK
LQotICAgIENTU1RvU3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5bGVNYXA7IH0K
LSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkgeyBy
ZXR1cm4gbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0
aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNjcmlwdGlvbigp
OyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7
IHJldHVybiBtX3N0YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgdm9pZCBzZXRG
b250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsg
bV9zdGF0ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQotICAgIHZvaWQg
c2V0Wm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZvaWQgc2V0RWZm
ZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAg
IHZvaWQgc2V0VGV4dFNpemVBZGp1c3QoYm9vbCBiKSB7IG1fc3RhdGUuc2V0VGV4dFNpemVBZGp1
c3QoYik7IH0KLSAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2Rl
KSB7IG1fc3RhdGUuc2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAgdm9pZCBzZXRU
ZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX3N0YXRl
LnNldFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9Ci0gICAgCi0gICAgdm9pZCBy
ZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAgCiBwcml2YXRl
OgotICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKKyAgICBE
b2N1bWVudCogZG9jdW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmRvY3VtZW50KCk7IH0KKyAgICB2
b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJv
b2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKIAotICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3Jv
dW5kKCk7Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5
bGVkRWxlbWVudCopIGNvbnN0OwotCi0gICAgdm9pZCBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5
SUQsIENTU1ZhbHVlKik7Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIHZvaWQgYXBwbHlTVkdQcm9w
ZXJ0eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQor
ICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKFJ1bGVTZXQqKTsKKyAgICB2b2lkIG1hdGNoU2hhZG93RGlz
dHJpYnV0ZWRSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzLCBTdHlsZVJlc29sdmVyOjpSdWxl
UmFuZ2UmKTsKKyAgICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaEhvc3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVz
KTsKICNlbmRpZgogCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdl
KFN0eWxlUGVuZGluZ0ltYWdlKik7Ci0gICAgdm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOwotCi0g
ICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXMqLCB1bnNpZ25lZCBzaXplKTsKLSAgICBzdHJ1Y3QgTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZUl0ZW0gewotICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKLSAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRj
aGVkUHJvcGVydGllczsKLSAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHJlbmRlclN0eWxlOwotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IHBhcmVudFJlbmRlclN0eWxlOwotICAgIH07Ci0gICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXND
YWNoZUl0ZW0qIGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBj
b25zdCBNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hl
KGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNp
Z25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOwotCi0gICAgLy8gRXZlcnkgTiBhZGRpdGlv
bnMgdG8gdGhlIG1hdGNoZWQgZGVjbGFyYXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJl
IGVudHJpZXMgaG9sZGluZwotICAgIC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRl
Y2xhcmF0aW9uIGFyZSBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgICB2b2lkIHN3ZWVwTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopOworICAgIHZvaWQgY29sbGVjdE1h
dGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdl
Jik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJl
cXVlc3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1
ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7CisgICAgYm9vbCBydWxlTWF0Y2hlcyhj
b25zdCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYpOwog
Ci0gICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJp
bmcmKSBjb25zdDsKLSAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFm
ZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0OwotCi0gICAgdW5zaWduZWQg
bV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXA7Ci0KLSAgICB0
eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtPiBNYXRj
aGVkUHJvcGVydGllc0NhY2hlOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUgbV9tYXRjaGVk
UHJvcGVydGllc0NhY2hlOwotCi0gICAgVGltZXI8U3R5bGVSZXNvbHZlcj4gbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lcjsKLQotICAgIE93blB0cjxNZWRpYVF1ZXJ5RXZhbHVhdG9y
PiBtX21lZGl1bTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fcm9vdERlZmF1bHRTdHlsZTsK
LQotICAgIERvY3VtZW50KiBtX2RvY3VtZW50OwotICAgIFNlbGVjdG9yRmlsdGVyIG1fc2VsZWN0
b3JGaWx0ZXI7Ci0KLSAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzOwotCi0gICAg
UmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7Ci0gICAgVmVjdG9yPE93blB0
cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0
czsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAgUmVmUHRyPFZpZXdw
b3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXI7Ci0jZW5kaWYKKyAgICB2
b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKKyAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcygpOwogCi0gICAgY29uc3QgU3R5bGVCdWlsZGVyJiBtX3N0eWxlQnVpbGRlcjsKKyAgICB2
b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKik7CisgICAgdm9pZCBjbGVhck1hdGNo
ZWRSdWxlcygpOwogCi0gICAgT3duUHRyPFN0eWxlU2NvcGVSZXNvbHZlcj4gbV9zY29wZVJlc29s
dmVyOwotICAgIENTU1RvU3R5bGVNYXAgbV9zdHlsZU1hcDsKLSAgICBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKLQotICAgIFN0YXRlIG1fc3RhdGU7Ci0K
LSAgICBmcmllbmQgY2xhc3MgU3R5bGVCdWlsZGVyOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9y
PT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOwot
ICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25z
dCBNYXRjaGVkUHJvcGVydGllcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qg
TWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdlcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJh
dG9yIT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdlcyYpOworICAgIFN0YXRp
Y0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICAKK3ByaXZhdGU6CisgICAg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9jdW1lbnRSdWxlU2V0
cyYgbV9ydWxlU2V0czsKKyAgICBTZWxlY3RvckZpbHRlciYgbV9zZWxlY3RvckZpbHRlcjsKKyAg
ICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7CisgICAg
U3R5bGVTY29wZVJlc29sdmVyKiBtX3Njb3BlUmVzb2x2ZXI7CisKKyAgICBib29sIG1faXNQcmlu
dFN0eWxlOworICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgIFBzZXVk
b1N0eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKKyAgICBib29sIG1fc2FtZU9yaWdp
bk9ubHk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKyAgICBib29sIG1fY2Fu
VXNlRmFzdFJlamVjdDsKKyAgICBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBt
X2JlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBib29sIG1fbWF0Y2hpbmdVQVJ1bGVzOworCisgICAg
T3duUHRyPFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiA+IG1fbWF0Y2hlZFJ1bGVzOworCisg
ICAgLy8gT3V0cHV0LgorICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsK
KyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKIH07CiAKLWlubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0
cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWF0dHJpYnV0ZU5hbWUu
aXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxl
cy5jb250YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxl
UmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5nJiBjbGFzc1Zh
bHVlKSBjb25zdAotewotICAgIEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkpOwotICAgIHJl
dHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NW
YWx1ZS5pbXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3Rv
ckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKLXsKLSAgICBBU1NFUlQo
IWlkVmFsdWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlk
c0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAKLSNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKKyNlbmRpZiAvLyBFbGVtZW50UnVs
ZUNvbGxlY3Rvcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3Iu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5j
cHAJKHJldmlzaW9uIDE0NDg5MykJKGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2
ZXIuY3BwOjE0NDg5MykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MjA3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDQt
MjAwNSBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gKGtkZUBjYXJld29sZi5jb20pCisgKiBDb3B5cmln
aHQgKEMpIDIwMDYsIDIwMDcgTmljaG9sYXMgU2hhbmtzICh3ZWJraXRAbmlja3NoYW5rcy5jb20p
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIw
MTEsIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDA3IEFsZXhleSBQcm9za3VyeWFrb3YgPGFwQHdlYmtpdC5vcmc+CisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcsIDIwMDggRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KKyAqIENv
cHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJpZ2h0IChjKSAyMDEx
LCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorCisjaW5jbHVk
ZSAiQXR0cmlidXRlLmgiCisjaW5jbHVkZSAiQ1NTQm9yZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJD
U1NDYWxjdWxhdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oIgor
I2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIkNTU0ZvbnRGYWNl
UnVsZS5oIgorI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU0xpbmVC
b3hDb250YWluVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NQYWdlUnVsZS5oIgorI2luY2x1ZGUgIkNT
U1BhcnNlci5oIgorI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZhbHVlTWFwcGluZ3MuaCIKKyNpbmNs
dWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCisjaW5jbHVkZSAiQ1NTUmVmbGVjdFZhbHVlLmgiCisj
aW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKKyNp
bmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NTdXBwb3J0c1J1bGUuaCIKKyNp
bmNsdWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVMaXN0
LmgiCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisjaW5jbHVkZSAiQ1NTVmFyaWFibGVWYWx1
ZS5oIgorI2VuZGlmCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJDYWxjdWxh
dGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ29udGVudERhdGEuaCIKKyNpbmNsdWRlICJDb250ZXh0
RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiQ291bnRlckNvbnRl
bnQuaCIKKyNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKKyNpbmNsdWRlICJG
b250RmVhdHVyZVZhbHVlLmgiCisjaW5jbHVkZSAiRm9udFZhbHVlLmgiCisjaW5jbHVkZSAiRnJh
bWUuaCIKKyNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5o
IgorI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgorI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFByb2dyZXNz
RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1M
VGV4dEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQuaCIKKyNpbmNsdWRl
ICJJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJLZXlmcmFtZUxpc3QuaCIK
KyNpbmNsdWRlICJMaW5rSGFzaC5oIgorI2luY2x1ZGUgIkxvY2FsZVRvU2NyaXB0TWFwcGluZy5o
IgorI2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCisjaW5jbHVkZSAiTWF0cml4M0RUcmFuc2Zvcm1P
cGVyYXRpb24uaCIKKyNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNs
dWRlICJNZWRpYUxpc3QuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCisjaW5j
bHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQu
aCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGFpci5oIgorI2luY2x1ZGUgIlBlcnNw
ZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgorI2lu
Y2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKKyNpbmNsdWRlICJSZW5k
ZXJTY3JvbGxiYXIuaCIKKyNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVtZS5oIgorI2luY2x1
ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNp
bmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAiUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9u
LmgiCisjaW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9u
cy5oIgorI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgorI2luY2x1ZGUgIlNjYWxlVHJh
bnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRl
ICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5j
bHVkZSAiU2hhZG93RGF0YS5oIgorI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKKyNpbmNsdWRlICJT
aGFkb3dWYWx1ZS5oIgorI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCisj
aW5jbHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIlN0eWxlQnVpbGRl
ci5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZUdlbmVy
YXRlZEltYWdlLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5kaW5nSW1hZ2UuaCIKKyNpbmNsdWRlICJT
dHlsZVByb3BlcnR5U2V0LmgiCisjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0eVNob3J0aGFuZC5oIgor
I2luY2x1ZGUgIlN0eWxlUnVsZS5oIgorI2luY2x1ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgorI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
CisjaW5jbHVkZSAiVGV4dC5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisj
aW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiVXNlckFn
ZW50U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKKyNp
bmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCisjaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3Ry
dW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lUnVsZS5oIgorI2luY2x1
ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25S
dWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuaCIKKyNpbmNsdWRlICJX
ZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKKyNpbmNsdWRlICJYTUxOYW1lcy5oIgorI2luY2x1ZGUg
PHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL01lbW9y
eUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVu
dGF0aW9uVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyNpbmNsdWRlICJGaWx0
ZXJPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NGaWx0ZXJWYWx1ZS5oIgorI2VuZGlm
CisKKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCisjaW5jbHVkZSAiRGFzaGJvYXJkUmVn
aW9uLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiQ2FjaGVkU1ZHRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgorI2luY2x1
ZGUgIlNWR0RvY3VtZW50LmgiCisjaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgorI2luY2x1ZGUgIlNW
R05hbWVzLmgiCisjaW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiV2ViS2l0
Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
CisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0
b21GaWx0ZXJDb25zdGFudHMuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJDdXN0
b21GaWx0ZXJQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJh
bWV0ZXIuaCIKKyNpbmNsdWRlICJTdHlsZUNhY2hlZFNoYWRlci5oIgorI2luY2x1ZGUgIlN0eWxl
Q3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgor
I2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZS5oIgorI2luY2x1ZGUgIldlYktpdENTU1NoYWRlclZhbHVlLmgiCisjZW5kaWYKKworI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQorI2luY2x1ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKKyNp
bmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShWSURF
T19UUkFDSykKKyNpbmNsdWRlICJXZWJWVFRFbGVtZW50LmgiCisjZW5kaWYKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlPD4gc3RydWN0IFNlcXVl
bmNlTWVtb3J5SW5zdHJ1bWVudGF0aW9uVHJhaXRzPGNvbnN0IFdlYkNvcmU6OlJ1bGVEYXRhKj4g
eworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJPiBzdGF0aWMgdm9pZCByZXBvcnRNZW1vcnlVc2Fn
ZShJLCBJLCBNZW1vcnlDbGFzc0luZm8mKSB7IH0KK307CisKK30KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCisjZGVmaW5lIEhBTkRMRV9JTkhF
UklUKHByb3AsIFByb3ApIFwKK2lmIChpc0luaGVyaXQpIHsgXAorICAgIG1fc3RhdGUuc3R5bGUo
KS0+c2V0IyNQcm9wKG1fc3RhdGUucGFyZW50U3R5bGUoKS0+cHJvcCgpKTsgXAorICAgIHJldHVy
bjsgXAorfQorCisjZGVmaW5lIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHByb3AsIFByb3Ap
IFwKK0hBTkRMRV9JTkhFUklUKHByb3AsIFByb3ApIFwKK2lmIChpc0luaXRpYWwpIHsgXAorICAg
IG1fc3RhdGUuc3R5bGUoKS0+c2V0IyNQcm9wKFJlbmRlclN0eWxlOjppbml0aWFsIyNQcm9wKCkp
OyBcCisgICAgcmV0dXJuOyBcCit9CisKK1JlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0
eWxlTm90WWV0QXZhaWxhYmxlOworCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmln
aHREZWNsYXJhdGlvbigpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQ
cm9wZXJ0eVNldD4sIGxlZnRUb1JpZ2h0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgp
KSk7CisgICAgaWYgKGxlZnRUb1JpZ2h0RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICBsZWZ0VG9S
aWdodERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7
CisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0RGVjbC5nZXQoKTsKK30KKworc3RhdGljIFN0eWxlUHJv
cGVydHlTZXQqIHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKQoreworICAgIERFRklORV9TVEFUSUNf
TE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVBy
b3BlcnR5U2V0OjpjcmVhdGUoKSkpOworICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHko
KSkKKyAgICAgICAgcmlnaHRUb0xlZnREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVj
dGlvbiwgQ1NTVmFsdWVSdGwpOworICAgIHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Cit9
CisKKworaW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5z
dXJlUnVsZUxpc3QoKQoreworICAgIGlmICghbV9ydWxlTGlzdCkKKyAgICAgICAgbV9ydWxlTGlz
dCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5n
ZXQoKTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVy
QW5kQmFja2dyb3VuZCgpCit7CisgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNB
cHBlYXJhbmNlKCk7CisgICAgaWYgKG1faGFzVUFBcHBlYXJhbmNlKSB7CisgICAgICAgIG1fYm9y
ZGVyRGF0YSA9IG1fc3R5bGUtPmJvcmRlcigpOworICAgICAgICBtX2JhY2tncm91bmREYXRhID0g
Km1fc3R5bGUtPmJhY2tncm91bmRMYXllcnMoKTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3Ig
PSBtX3N0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIFN0
eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigpCit7CisgICAgbV9lbGVtZW50ID0gMDsKKyAgICBt
X3N0eWxlZEVsZW1lbnQgPSAwOworICAgIG1fcGFyZW50U3R5bGUgPSAwOworICAgIG1fcGFyZW50
Tm9kZSA9IDA7CisgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gMDsKKyAgICBtX3J1bGVMaXN0ID0g
MDsKKyAgICBtX21hdGNoZWRSdWxlcy5jbGVhcigpOworICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVy
dGllcy5jbGVhcigpOworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICBtX2hhc1BlbmRpbmdT
aGFkZXJzID0gZmFsc2U7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJM
RShTVkcpCisgICAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzLmNsZWFyKCk7CisjZW5kaWYKK30KKwor
U3R5bGVSZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZG9jdW1lbnQsIGJvb2wgbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgIDogbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRk
aXRpb25zU2luY2VMYXN0U3dlZXAoMCkKKyAgICAsIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3
ZWVwVGltZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZSkKKyAgICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCisgICAgLCBtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcyhtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgLCBtX2ZvbnRTZWxlY3RvcihD
U1NGb250U2VsZWN0b3I6OmNyZWF0ZShkb2N1bWVudCkpCisjaWYgRU5BQkxFKENTU19ERVZJQ0Vf
QURBUFRBVElPTikKKyAgICAsIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyKFZpZXdwb3J0U3R5bGVS
ZXNvbHZlcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNlbmRpZgorICAgICwgbV9zdHlsZUJ1aWxkZXIo
U3R5bGVCdWlsZGVyOjpzaGFyZWRTdHlsZUJ1aWxkZXIoKSkKKyAgICAsIG1fc3R5bGVNYXAodGhp
cykKK3sKKyAgICBFbGVtZW50KiByb290ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOwor
CisgICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjppbml0RGVmYXVsdFN0eWxlKHJvb3QpOworCisg
ICAgLy8gY29uc3RydWN0IGRvY3VtZW50IHJvb3QgZWxlbWVudCBkZWZhdWx0IHN0eWxlLiB0aGlz
IGlzIG5lZWRlZAorICAgIC8vIHRvIGV2YWx1YXRlIG1lZGlhIHF1ZXJpZXMgdGhhdCBjb250YWlu
IHJlbGF0aXZlIGNvbnN0cmFpbnRzLCBsaWtlICJzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwZW0p
IgorICAgIC8vIFRoaXMgaXMgaGVyZSBpbnN0ZWFkIG9mIGNvbnN0cnVjdG9yLCBiZWNhdXNlIHdo
ZW4gY29uc3RydWN0b3IgaXMgcnVuLAorICAgIC8vIGRvY3VtZW50IGRvZXNuJ3QgaGF2ZSBkb2N1
bWVudEVsZW1lbnQKKyAgICAvLyBOT1RFOiB0aGlzIGFzc3VtZXMgdGhhdCBlbGVtZW50IHRoYXQg
Z2V0cyBwYXNzZWQgdG8gc3R5bGVGb3JFbGVtZW50IC1jYWxsCisgICAgLy8gaXMgYWx3YXlzIGZy
b20gdGhlIGRvY3VtZW50IHRoYXQgb3ducyB0aGUgc3R5bGUgc2VsZWN0b3IKKyAgICBGcmFtZVZp
ZXcqIHZpZXcgPSBkb2N1bWVudC0+dmlldygpOworICAgIGlmICh2aWV3KQorICAgICAgICBtX21l
ZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZpZXctPm1lZGlhVHlwZSgp
KSk7CisgICAgZWxzZQorICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5
RXZhbHVhdG9yKCJhbGwiKSk7CisKKyAgICBpZiAocm9vdCkKKyAgICAgICAgbV9yb290RGVmYXVs
dFN0eWxlID0gc3R5bGVGb3JFbGVtZW50KHJvb3QsIDAsIERpc2FsbG93U3R5bGVTaGFyaW5nLCBN
YXRjaE9ubHlVc2VyQWdlbnRSdWxlcyk7CisKKyAgICBpZiAobV9yb290RGVmYXVsdFN0eWxlICYm
IHZpZXcpCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0
b3Iodmlldy0+bWVkaWFUeXBlKCksIHZpZXctPmZyYW1lKCksIG1fcm9vdERlZmF1bHRTdHlsZS5n
ZXQoKSkpOworCisgICAgbV9ydWxlU2V0cy5yZXNldEF1dGhvclN0eWxlKCk7CisKKyAgICBEb2N1
bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbiA9IGRvY3VtZW50
LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpOworICAgIG1fcnVsZVNldHMuaW5pdFVzZXJTdHlsZShz
dHlsZVNoZWV0Q29sbGVjdGlvbiwgKm1fbWVkaXVtLCAqdGhpcyk7CisKKyNpZiBFTkFCTEUoU1ZH
X0ZPTlRTKQorICAgIGlmIChkb2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpKSB7CisgICAgICAgIGNv
bnN0IEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj4mIHN2Z0ZvbnRGYWNlRWxlbWVudHMgPSBk
b2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpLT5zdmdGb250RmFjZUVsZW1lbnRzKCk7CisgICAgICAg
IEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHN2Z0Zv
bnRGYWNlRWxlbWVudHMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxTVkdGb250RmFjZUVs
ZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdmdGb250RmFjZUVsZW1lbnRzLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgIGZvbnRTZWxlY3RvcigpLT5hZGRGb250RmFj
ZVJ1bGUoKCppdCktPmZvbnRGYWNlUnVsZSgpKTsKKyAgICB9CisjZW5kaWYKKworICAgIGFwcGVu
ZEF1dGhvclN0eWxlU2hlZXRzKDAsIHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hY3RpdmVBdXRob3JT
dHlsZVNoZWV0cygpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBlbmRBdXRob3JTdHls
ZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNo
ZWV0PiA+JiBzdHlsZVNoZWV0cykKK3sKKyAgICBtX3J1bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxl
U2hlZXRzKGZpcnN0TmV3LCBzdHlsZVNoZWV0cywgbV9tZWRpdW0uZ2V0KCksIG1faW5zcGVjdG9y
Q1NTT01XcmFwcGVycywgZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIHRoaXMpOworICAgIGlm
IChkb2N1bWVudCgpLT5yZW5kZXJlcigpICYmIGRvY3VtZW50KCktPnJlbmRlcmVyKCktPnN0eWxl
KCkpCisgICAgICAgIGRvY3VtZW50KCktPnJlbmRlcmVyKCktPnN0eWxlKCktPmZvbnQoKS51cGRh
dGUoZm9udFNlbGVjdG9yKCkpOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikK
KyAgICB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKS0+cmVzb2x2ZSgpOworI2VuZGlmCit9CisKK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQorewor
ICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudHNQYXJlbnQgPSBwYXJlbnQtPnBhcmVudE9y
U2hhZG93SG9zdEVsZW1lbnQoKTsKKworICAgIC8vIFdlIGFyZSBub3QgYWx3YXlzIGludm9rZWQg
Y29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgc2NyaXB0IGV4ZWN1dGlvbiBjYW4gY2F1c2UgdXMg
dG8gZW50ZXIKKyAgICAvLyBzdHlsZSByZWNhbGMgaW4gdGhlIG1pZGRsZSBvZiB0cmVlIGJ1aWxk
aW5nLiBXZSBtYXkgYWxzbyBiZSBpbnZva2VkIGZyb20gc29tZXdoZXJlIHdpdGhpbiB0aGUgdHJl
ZS4KKyAgICAvLyBSZXNldCB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLCBvciBpZiB3ZSBzZWUgYSBu
ZXcgcm9vdCBlbGVtZW50LgorICAgIC8vIE90aGVyd2lzZSBqdXN0IHB1c2ggdGhlIG5ldyBwYXJl
bnQuCisgICAgaWYgKCFwYXJlbnRzUGFyZW50IHx8IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3Rh
Y2tJc0VtcHR5KCkpCisgICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIuc2V0dXBQYXJlbnRTdGFjayhw
YXJlbnQpOworICAgIGVsc2UKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5wdXNoUGFyZW50KHBh
cmVudCk7CisKKyAgICAvLyBOb3RlOiBXZSBtdXN0bid0IHNraXAgU2hhZG93Um9vdCBub2RlcyBm
b3IgdGhlIHNjb3BlIHN0YWNrLgorICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1f
c2NvcGVSZXNvbHZlci0+cHVzaChwYXJlbnQsIHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0Tm9k
ZSgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQq
IHBhcmVudCkKK3sKKyAgICAvLyBOb3RlIHRoYXQgd2UgbWF5IGdldCBpbnZva2VkIGZvciBzb21l
IHJhbmRvbSBlbGVtZW50cyBpbiBzb21lIHdhY2t5IGNhc2VzIGR1cmluZyBzdHlsZSByZXNvbHZl
LgorICAgIC8vIFBhdXNlIG1haW50YWluaW5nIHRoZSBzdGFjayBpbiB0aGlzIGNhc2UuCisgICAg
aWYgKG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQocGFyZW50KSkKKyAg
ICAgICAgbV9zZWxlY3RvckZpbHRlci5wb3BQYXJlbnQoKTsKKyAgICBpZiAobV9zY29wZVJlc29s
dmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnBvcChwYXJlbnQpOworfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRv
d1Jvb3QpCit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7CisgICAgaWYgKG1fc2Nv
cGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHNoYWRvd1Jvb3QsIHNo
YWRvd1Jvb3QtPmhvc3QoKSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50U2hh
ZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290KQoreworICAgIEFTU0VSVChzaGFk
b3dSb290LT5ob3N0KCkpOworICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2Nv
cGVSZXNvbHZlci0+cG9wKHNoYWRvd1Jvb3QpOworfQorCisvLyBUaGlzIGlzIGEgc2ltcGxpZmll
ZCBzdHlsZSBzZXR0aW5nIGZ1bmN0aW9uIGZvciBrZXlmcmFtZSBzdHlsZXMKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6YWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4g
cnVsZSkKK3sKKyAgICBBdG9taWNTdHJpbmcgcyhydWxlLT5uYW1lKCkpOworICAgIG1fa2V5ZnJh
bWVzUnVsZU1hcC5zZXQocy5pbXBsKCksIHJ1bGUpOworfQorCitTdHlsZVJlc29sdmVyOjp+U3R5
bGVSZXNvbHZlcigpCit7CisgICAgbV9mb250U2VsZWN0b3ItPmNsZWFyRG9jdW1lbnQoKTsKKwor
I2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgbV92aWV3cG9ydFN0eWxlUmVz
b2x2ZXItPmNsZWFyRG9jdW1lbnQoKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCit7Cisg
ICAgLy8gTG9vayBmb3IgY2FjaGUgZW50cmllcyBjb250YWluaW5nIGEgc3R5bGUgZGVjbGFyYXRp
b24gd2l0aCBhIHNpbmdsZSByZWYgYW5kIHJlbW92ZSB0aGVtLgorICAgIC8vIFRoaXMgbWF5IGhh
cHBlbiB3aGVuIGFuIGVsZW1lbnQgYXR0cmlidXRlIG11dGF0aW9uIGNhdXNlcyBpdCB0byBnZW5l
cmF0ZSBhIG5ldyBpbmxpbmVTdHlsZSgpCisgICAgLy8gb3IgcHJlc2VudGF0aW9uQXR0cmlidXRl
U3R5bGUoKSwgcG90ZW50aWFsbHkgbGVhdmluZyB0aGlzIGNhY2hlIHdpdGggdGhlIGxhc3QgcmVm
IG9uIHRoZSBvbGQgb25lLgorICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+IHRvUmVtb3ZlOworICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlLmJlZ2luKCk7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgZW5k
ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpOworICAgIGZvciAoOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiYgbWF0Y2hlZFByb3Bl
cnRpZXMgPSBpdC0+dmFsdWUubWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAg
IGlmIChtYXRjaGVkUHJvcGVydGllc1tpXS5wcm9wZXJ0aWVzLT5oYXNPbmVSZWYoKSkgeworICAg
ICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChpdC0+a2V5KTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgKytpKQorICAgICAgICBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUucmVtb3ZlKHRvUmVtb3ZlW2ldKTsKKworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
OjphZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IFN0
eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgdW5zaWduZWQgbGlu
a01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkK
K3sKKyAgICBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5ncm93KG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzJiBuZXdQ
cm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMubGFzdCgpOworICAgIG5l
d1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0eVNldCo+KHBy
b3BlcnRpZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNoVHlwZSA9IGxpbmtNYXRjaFR5
cGU7CisgICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0gcHJvcGVydHlXaGl0ZWxpc3RU
eXBlOworICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Cit9CisKK2lu
bGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hS
ZXN1bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydHlTZXQsIGJvb2wg
aXNDYWNoZWFibGUpCit7CisgICAgaWYgKCFwcm9wZXJ0eVNldCkKKyAgICAgICAgcmV0dXJuOwor
ICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpOworICAgIGlmIChyZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9PSAtMSkK
KyAgICAgICAgcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPSByZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlOworICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgcHJvcGVydHlT
ZXQpOworICAgIGlmICghaXNDYWNoZWFibGUpCisgICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9
IGZhbHNlOworfQorCitjbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29wZSB7CitwdWJsaWM6CisgICAg
TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKyAgICB+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKwor
ICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7CisKK3ByaXZhdGU6CisgICAgc3Rh
dGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Cit9OworCitNYXRjaGluZ1VBUnVsZXNTY29wZTo6
TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQoreworICAgIEFTU0VSVCghbV9tYXRjaGluZ1VBUnVsZXMp
OworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKK30KKworTWF0Y2hpbmdVQVJ1bGVzU2Nv
cGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSBm
YWxzZTsKK30KKworaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdV
QVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVsZXM7Cit9CisKK2Jvb2wgTWF0
Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRj
aFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIEFTU0VSVChtYXRjaFJlcXVl
c3QucnVsZVNldCk7CisgICAgQVNTRVJUKG1fc3RhdGUuZWxlbWVudCgpKTsKKworICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQo
KTsKKyAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVk
RWxlbWVudCgpOworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5z
aGFkb3dQc2V1ZG9JZCgpOworICAgIGlmICghcHNldWRvSWQuaXNFbXB0eSgpKSB7CisgICAgICAg
IEFTU0VSVChzdHlsZWRFbGVtZW50KTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQc2V1ZG9FbGVtZW50UnVsZXMocHNldWRv
SWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworI2lmIEVOQUJM
RShWSURFT19UUkFDSykKKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkpCisgICAg
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+Y3Vl
UHNldWRvUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2VuZGlmCisgICAgLy8g
Q2hlY2sgd2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxlcyBhcmUgYXBwbGljYWJsZSBpbiB0aGUg
Y3VycmVudCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3IgdGhpczoKKyAgICAvLyBhKSBpdCdzIGEg
VUEgcnVsZQorICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93cyBhdXRob3IgcnVsZXMKKyAg
ICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBzdHlsZSBzaGVldCB3aXRoaW4g
dGhlIHNhbWUgdHJlZSBzY29wZQorICAgIFRyZWVTY29wZSogdHJlZVNjb3BlID0gZWxlbWVudC0+
dHJlZVNjb3BlKCk7CisgICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VB
UnVsZXMoKQorICAgICAgICAmJiAhdHJlZVNjb3BlLT5hcHBseUF1dGhvclN0eWxlcygpCisgICAg
ICAgICYmICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1hdGNoUmVxdWVzdC5zY29wZS0+dHJlZVNj
b3BlKCkgIT0gdHJlZVNjb3BlKQorICAgICAgICAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJv
dW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFdlIG5lZWQgdG8gY29sbGVjdCB0aGUgcnVsZXMgZm9yIGlkLCBj
bGFzcywgdGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGludG8gYSBidWZmZXIgYW5kCisgICAgLy8g
dGhlbiBzb3J0IHRoZSBidWZmZXIuCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkpCisgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+aWRSdWxl
cyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSksIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKKyAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBzdHlsZWRFbGVtZW50LT5oYXND
bGFzcygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3R5bGVkRWxlbWVudC0+
Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQorICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1bGVzKHN0eWxlZEVsZW1lbnQt
PmNsYXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
fQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmxpbmtQc2V1ZG9DbGFzc1J1bGVzKCks
IG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjptYXRj
aGVzRm9jdXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1BzZXVkb0NsYXNzUnVsZXMoKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlz
dChtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVudC0+bG9jYWxOYW1lKCkuaW1w
bCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2FsUnVsZXMoKSwgbWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGlu
Z1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFu
Z2UmIHJ1bGVSYW5nZSkKK3sKKyAgICBpZiAoIW1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKQor
ICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hSZXF1ZXN0LnJ1bGVT
ZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ1NTU2VsZWN0b3IqIHJl
Z2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5k
UnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9y
KHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9zdGF0ZS5yZWdpb25Gb3JT
dHlsaW5nKCktPm5vZGUoKSkpKSB7CisgICAgICAgICAgICBSdWxlU2V0KiByZWdpb25SdWxlcyA9
IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkp
LnJ1bGVTZXQuZ2V0KCk7CisgICAgICAgICAgICBBU1NFUlQocmVnaW9uUnVsZXMpOworICAgICAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJlZ2lvblJ1bGVzLCBtYXRj
aFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdC5zY29wZSksIHJ1bGVSYW5n
ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydEFuZFRy
YW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgU3RhdGUmIHN0
YXRlID0gbV9zdGF0ZTsKKyAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRS
dWxlcyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOworICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBp
ZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7Cisg
ICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kp
CisgICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRj
aGVkUnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gTm93IHRyYW5zZmVyIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxl
cyBvdmVyIHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdGF0ZS5z
dHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0dHJpYnV0ZVNlbGVj
dG9yKCkpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAg
YWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJv
cGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5r
TWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOwor
ICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxF
KFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgaWYgKCFtX3Njb3BlUmVz
b2x2ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIHNjb3BlZCBhdXRob3IgcnVs
ZXMgYnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3RhY2sgKHJlYnVpbGQgaXQgaWYg
aXQgZ290IGluY29uc2lzdGVudCkuCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlci0+aGFzU2NvcGVk
U3R5bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFja0NvbnNpc3RlbmN5KG1fc3Rh
dGUuZWxlbWVudCgpKSkgeworICAgICAgICBib29sIGFwcGx5QXV0aG9yU3R5bGVzID0gbV9zdGF0
ZS5lbGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0eWxlcygpOworICAgICAgICBi
b29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUgPSBt
X3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgc2NvcGVTaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVz
KCkuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBy
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgICAgICAgICAgY29uc3Qg
U3R5bGVTY29wZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBmcmFtZSA9IG1fc2NvcGVSZXNvbHZlci0+
c3RhY2tGcmFtZUF0KGkpOworICAgICAgICAgICAgZG9jdW1lbnRTY29wZSA9IGRvY3VtZW50U2Nv
cGUgJiYgIWZyYW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dUcmVlKCk7CisgICAgICAgICAgICBpZiAo
ZG9jdW1lbnRTY29wZSkgeworICAgICAgICAgICAgICAgIGlmICghYXBwbHlBdXRob3JTdHlsZXMp
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlci0+bWF0Y2hlc1N0eWxlQm91bmRzKGZy
YW1lKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QoZnJhbWUubV9ydWxlU2V0LCBpbmNs
dWRlRW1wdHlSdWxlcywgZnJhbWUubV9zY29wZSk7CisgICAgICAgICAgICBSdWxlUmFuZ2UgcnVs
ZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICAgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
KyAgICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAgICAg
ICB9CisgICAgfQorCisgICAgbWF0Y2hIb3N0UnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxl
cyk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOworICAgIFVOVVNFRF9QQVJBTShp
bmNsdWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZl
cjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpCit7CisjaWYgRU5BQkxF
KFNIQURPV19ET00pCisgICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlciAmJiBtX3Njb3BlUmVzb2x2
ZXItPnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50
KCkpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIEFTU0VSVChtX3Njb3Bl
UmVzb2x2ZXIpOworCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJl
c3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpIC0gMTsKKworICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOworICAgIG1fc2Nv
cGVSZXNvbHZlci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxl
cyk7CisgICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGZvciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsK
KyAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJh
bmdlKCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChtYXRjaGVk
UnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgpKSwgcnVs
ZVJhbmdlKTsKKyAgICB9CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7
CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOworICAgIFVOVVNFRF9QQVJBTShpbmNs
dWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEF1
dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7
CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKwor
ICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1h
dGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCisgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdCht
X3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFu
Z2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2lmIEVOQUJM
RShTSEFET1dfRE9NKQorICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Cisg
ICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVz
dHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKKyAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKKyNlbmRpZgorCisgICAgc29y
dEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisKKyAgICBtYXRjaFNjb3BlZEF1dGhv
clJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpCit7CisgICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQorICAgICAgICByZXR1
cm47CisgICAgCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworCisgICAgcmVz
dWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMTsKKyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxl
KCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0
LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1h
dGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKworICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhyZXN1bHQpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJl
c3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKK3sKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmNsZWFyKCk7CisgICAgCisgICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9
IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhN
YXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0
Y2hlZFJ1bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRj
aFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYg
KCFydWxlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
KyAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3Ig
cmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZl
LgorICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUg
aW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICBib29sIGNh
blVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50
KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9
PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OworCisgICAgdW5zaWduZWQg
c2l6ZSA9IHJ1bGVzLT5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7
ICsraSkgeworICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7
CisgICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJl
amVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5k
ZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOworICAgICAg
ICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworICAgICAg
ICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChydWxlTWF0
Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJl
cXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUg
aGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVi
dWcgbW9kZS4KKyAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMg
PSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHBy
b3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkg
eworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0
Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVk
LgorICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVsZURhdGEu
aGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBt
YXRjaGluZyBub3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKKyAgICAgICAgICAgIC8v
IHdlIHJlYWxseSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KKyAgICAgICAgICAgIGlm
IChkeW5hbWljUHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgp
LnBzZXVkb0lkID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUo
KSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICAgICAgICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNl
KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQp
CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5
bmFtaWNQc2V1ZG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBV
cGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFy
cmF5LgorICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisgICAgICAg
ICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKKyAgICAgICAgICAg
ICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5k
ZXg7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1h
dGNoZWQgcnVsZXMuCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVs
ZURhdGEpOworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0
Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRN
YXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wg
Y29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIyKQorewor
ICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOworICAgIHVuc2ln
bmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOworICAgIHJldHVybiAoc3BlY2lm
aWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigp
IDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OnNvcnRNYXRjaGVkUnVsZXMoKQoreworICAgIHN0ZDo6c29ydChtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVSdWxlcyk7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYgcmVz
dWx0LCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKK3sKKyAgICBtYXRjaFVBUnVsZXMocmVz
dWx0KTsKKworICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgorICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMocmVzdWx0
LCBmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmly
c3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwuCisgICAg
aWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVBy
b3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0
cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwgbWFw
cGVkIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBzaGFy
ZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCisgICAgICAg
IC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVwZW5k
cyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCisgICAgICAgIGFkZEVsZW1l
bnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRp
b25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworCisgICAgICAgIGlmIChtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBib29sIGlz
QXV0bzsKKyAgICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbiA9IHRvSFRNTEVs
ZW1lbnQobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFzRGlyQXV0
b0F0dHJpYnV0ZShpc0F1dG8pOworICAgICAgICAgICAgaWYgKGlzQXV0bykKKyAgICAgICAgICAg
ICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0gTFRSID8g
bGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNo
ZWV0cyBuZXh0LgorICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAg
bWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBvdXIg
aW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KKyAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmlubGluZVN0eWxlKCkpIHsKKyAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBh
cyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCisgICAgICAgIC8vIEZJWE1FOiBN
ZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNo
aW5nLgorICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5
LgorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOworICAg
IH0KKworI2lmIEVOQUJMRShTVkcpCisgICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92
ZXJyaWRlIHN0eWxlLgorICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9tYXRjaEF1
dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQorICAgICAgICBhZGRFbGVtZW50U3R5bGVQ
cm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2Fj
aGVhYmxlICovKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVydGll
cyk7CisjZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZmZWN0ZWRC
eVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0Cit7CisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgaWYgKG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFz
c05hbWVzW2ldLmltcGwoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5p
dEVsZW1lbnQoRWxlbWVudCogZSkKK3sKKyAgICBtX2VsZW1lbnQgPSBlOworICAgIG1fc3R5bGVk
RWxlbWVudCA9IGUgJiYgZS0+aXNTdHlsZWRFbGVtZW50KCkgPyBzdGF0aWNfY2FzdDxTdHlsZWRF
bGVtZW50Kj4oZSkgOiAwOworICAgIG1fZWxlbWVudExpbmtTdGF0ZSA9IGUgPyBlLT5kb2N1bWVu
dCgpLT52aXNpdGVkTGlua1N0YXRlKCktPmRldGVybWluZUxpbmtTdGF0ZShlKSA6IE5vdEluc2lk
ZUxpbms7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KEVsZW1l
bnQqIGUpCit7CisgICAgaWYgKG1fc3RhdGUuZWxlbWVudCgpICE9IGUpIHsKKyAgICAgICAgbV9z
dGF0ZS5pbml0RWxlbWVudChlKTsKKyAgICAgICAgaWYgKGUgJiYgZSA9PSBlLT5kb2N1bWVudCgp
LT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICAgICAgZS0+ZG9jdW1lbnQoKS0+c2V0RGly
ZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOworICAgICAgICAgICAgZS0+ZG9jdW1l
bnQoKS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAg
IH0KKyAgICB9Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9y
U3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVz
dCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQoreworICAgIG1fcHNldWRvU3R5bGVS
ZXF1ZXN0ID0gcHNldWRvU3R5bGVSZXF1ZXN0OworICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IHJl
Z2lvbkZvclN0eWxpbmc7CisKKyAgICBpZiAoZSkgeworICAgICAgICBOb2RlUmVuZGVyaW5nQ29u
dGV4dCBjb250ZXh0KGUpOworICAgICAgICBtX3BhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5v
ZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOworICAgICAgICBtX3BhcmVudFN0eWxlID0gY29udGV4
dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSA/IDAgOgorICAgICAgICAgICAgcGFyZW50U3R5bGUg
PyBwYXJlbnRTdHlsZSA6CisgICAgICAgICAgICBtX3BhcmVudE5vZGUgPyBtX3BhcmVudE5vZGUt
PnJlbmRlclN0eWxlKCkgOiAwOworICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2lu
dCA9IGNvbnRleHQuaW5zZXJ0aW9uUG9pbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3Bh
cmVudE5vZGUgPSAwOworICAgICAgICBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7CisgICAg
ICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gZmFsc2U7CisgICAgfQorCisgICAg
Tm9kZSogZG9jRWxlbWVudCA9IGUgPyBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA6
IDA7CisgICAgUmVuZGVyU3R5bGUqIGRvY1N0eWxlID0gZG9jdW1lbnQtPnJlbmRlclN0eWxlKCk7
CisgICAgbV9yb290RWxlbWVudFN0eWxlID0gZG9jRWxlbWVudCAmJiBlICE9IGRvY0VsZW1lbnQg
PyBkb2NFbGVtZW50LT5yZW5kZXJTdHlsZSgpIDogZG9jU3R5bGU7CisKKyAgICBtX3N0eWxlID0g
MDsKKyAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKKyAgICBtX3J1bGVMaXN0
ID0gMDsKKyAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOworfQorCitzdGF0aWMgY29uc3QgdW5zaWdu
ZWQgY1N0eWxlU2VhcmNoVGhyZXNob2xkID0gMTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY1N0
eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgPSAxMDsKKworc3RhdGljIGlubGluZSBib29sIHBhcmVu
dEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoY29uc3QgRWxlbWVudCogcGFyZW50RWxlbWVudCkKK3sK
KyAgICBpZiAoIXBhcmVudEVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gcGFyZW50RWxlbWVudC0+aGFzRmxhZ3NTZXREdXJpbmdTdHlsaW5nT2ZDaGlsZHJlbigpOwor
fQorCitOb2RlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVu
dCwgdW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNvbnN0Cit7CisgICAgaWYgKHZpc2l0ZWRO
b2RlQ291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkICogY1N0eWxlU2VhcmNoTGV2ZWxUaHJl
c2hvbGQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQtPmlz
U3R5bGVkRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGFyZW50LT5oYXNT
Y29wZWRIVE1MU3R5bGVDaGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBTdHlsZWRFbGVt
ZW50KiBwID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KHBhcmVudCk7CisgICAgaWYgKHAt
PmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworI2lmIEVOQUJMRShTVkcpCisgICAg
aWYgKHAtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihwKS0+YW5p
bWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisg
ICAgaWYgKHAtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29u
dGFpbnMocC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IHAtPnJlbmRlclN0eWxlKCk7Cisg
ICAgdW5zaWduZWQgc3ViY291bnQgPSAwOworICAgIE5vZGUqIHRoaXNDb3VzaW4gPSBwOworICAg
IE5vZGUqIGN1cnJlbnROb2RlID0gcC0+cHJldmlvdXNTaWJsaW5nKCk7CisKKyAgICAvLyBSZXNl
cnZlIHRoZSB0cmllcyBmb3IgdGhpcyBsZXZlbC4gVGhpcyBlZmZlY3RpdmVseSBtYWtlcyBzdXJl
IHRoYXQgdGhlIGFsZ29yaXRobQorICAgIC8vIHdpbGwgbmV2ZXIgZ28gZGVlcGVyIHRoYW4gY1N0
eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgbGV2ZWxzIGludG8gcmVjdXJzaW9uLgorICAgIHZpc2l0
ZWROb2RlQ291bnQgKz0gY1N0eWxlU2VhcmNoVGhyZXNob2xkOworICAgIHdoaWxlICh0aGlzQ291
c2luKSB7CisgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkgeworICAgICAgICAgICAgKytzdWJj
b3VudDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA9PSBwYXJl
bnRTdHlsZSAmJiBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCkKKyAgICAgICAgICAgICAgICAmJiBj
dXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmICFwYXJlbnRFbGVtZW50UHJldmVudHNTaGFy
aW5nKHRvRWxlbWVudChjdXJyZW50Tm9kZSkpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAg
ICAgICAgICAgICAgJiYgIXRvRWxlbWVudChjdXJyZW50Tm9kZSktPnNoYWRvdygpCisjZW5kaWYK
KyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHVudXNl
ZCByZXNlcnZlZCB0cmllcy4KKyAgICAgICAgICAgICAgICB2aXNpdGVkTm9kZUNvdW50IC09IGNT
dHlsZVNlYXJjaFRocmVzaG9sZCAtIHN1YmNvdW50OworICAgICAgICAgICAgICAgIHJldHVybiBj
dXJyZW50Tm9kZS0+bGFzdENoaWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
c3ViY291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQorICAgICAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS0+cHJldmlvdXNTaWJs
aW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudE5vZGUgPSBsb2NhdGVDb3VzaW5MaXN0
KHRoaXNDb3VzaW4tPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7CisgICAgICAg
IHRoaXNDb3VzaW4gPSBjdXJyZW50Tm9kZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwor
Ym9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChS
dWxlU2V0KiBydWxlU2V0KQoreworICAgIGlmICghcnVsZVNldCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKworICAgIG1fc3RhdGUu
c2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxlcyk7CisgICAgaW50IGZpcnN0UnVs
ZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
KGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
cyhNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7CisgICAgbV9zdGF0ZS5zZXRNb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOworICAgIGlmIChtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fc3RhdGUu
bWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHls
ZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCogZWxlbWVu
dCkgY29uc3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIEhUTUxJ
bnB1dEVsZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgp
OworICAgIEhUTUxJbnB1dEVsZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVu
dCgpLT50b0lucHV0RWxlbWVudCgpOworCisgICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFv
dGhlcklucHV0RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRoaXNJ
bnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnRE
YXRhKCkpIHsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUo
dHlwZUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRy
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1l
bnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+
ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBv
dGhlcklucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJ
bnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVu
dC0+aXNSZXF1aXJlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVu
dC0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZv
cm1Db250cm9sKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5p
c0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0
b25Gb3JGb3JtKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdGF0ZS5kb2N1
bWVudCgpLT5jb250YWluc1ZhbGlkaXR5U3R5bGVSdWxlcygpKSB7CisgICAgICAgIGJvb2wgd2ls
bFZhbGlkYXRlID0gZWxlbWVudC0+d2lsbFZhbGlkYXRlKCk7CisKKyAgICAgICAgaWYgKHdpbGxW
YWxpZGF0ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICh3aWxsVmFsaWRhdGUgJiYgKGVsZW1lbnQtPmlz
VmFsaWRGb3JtQ29udHJvbEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzVmFsaWRGb3Jt
Q29udHJvbEVsZW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
aWYgKGVsZW1lbnQtPmlzSW5SYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNJblJhbmdlKCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGVsZW1lbnQtPmlzT3V0
T2ZSYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNPdXRPZlJhbmdlKCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBp
bmxpbmUgYm9vbCBlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhFbGVtZW50KiBlbGVtZW50KQorewor
ICAgIC8vIEZJWE1FOiBUaGlzIGxpbmUgaXMgc3VycHJpc2luZ2x5IGhvdCwgd2UgbWF5IHdpc2gg
dG8gaW5saW5lIGhhc0RpcmVjdGlvbkF1dG8gaW50byBTdHlsZVJlc29sdmVyLgorICAgIHJldHVy
biBlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgdG9IVE1MRWxlbWVudChlbGVtZW50KS0+aGFz
RGlyZWN0aW9uQXV0bygpOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnNoYXJpbmdDYW5kaWRh
dGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCogc2hh
cmluZ0NhbmRpZGF0ZSkgY29uc3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmVsZW1lbnREYXRhKCkgPT0gc2hhcmluZ0NhbmRp
ZGF0ZS0+ZWxlbWVudERhdGEoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKHN0YXRl
LmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpICE9IHNoYXJp
bmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1
dGUobGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0
dHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIXN0YXRlLmVsZW1lbnRBZmZl
Y3RlZEJ5Q2xhc3NSdWxlcygpKSB7CisgICAgICAgIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXND
bGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc2hhcmluZ0NhbmRpZGF0ZS0+Y2xh
c3NOYW1lcygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHNo
YXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkpIHsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAv
LyBTVkcgZWxlbWVudHMgcmVxdWlyZSBhIChzbG93ISkgZ2V0QXR0cmlidXRlIGNvbXBhcmlzaW9u
IGJlY2F1c2UgImNsYXNzIiBpcyBhbiBhbmltYXRhYmxlIGF0dHJpYnV0ZSBmb3IgU1ZHLgorICAg
ICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkgeworICAgICAgICAgICAg
aWYgKHN0YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikgIT0gc2hhcmluZ0Nh
bmRpZGF0ZS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICBpZiAoc3RhdGUu
ZWxlbWVudCgpLT5jbGFzc05hbWVzKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAg
ICB9CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBz
aGFyaW5nQ2FuZGlkYXRlLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKKyAgICBpZiAoc3Rh
dGUuZWxlbWVudCgpLT5oYXNUYWdOYW1lKHByb2dyZXNzVGFnKSkgeworICAgICAgICBpZiAoc3Rh
dGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHN0YXRlLmVsZW1lbnQoKSktPmlzRGV0ZXJt
aW5hdGUoKSAhPSBzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc2hhcmluZ0NhbmRp
ZGF0ZSktPmlzRGV0ZXJtaW5hdGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNh
blNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAorewor
ICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IGVsZW1lbnQtPnJlbmRlclN0eWxlKCk7CisgICAgY29u
c3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGlmICghc3R5bGUpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKHN0eWxlLT5oYXNVbmlxdWVQc2V1ZG9TdHlsZSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPnRhZ1FOYW1lKCkgIT0gc3RhdGUuZWxlbWVudCgp
LT50YWdRTmFtZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmlu
bGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+bmVl
ZHNTdHlsZVJlY2FsYygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjaWYgRU5BQkxFKFNWRykK
KyAgICBpZiAoZWxlbWVudC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVu
dCo+KGVsZW1lbnQpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworI2VuZGlmCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICE9IHN0YXRlLmVs
ZW1lbnQoKS0+aXNMaW5rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVu
dC0+aG92ZXJlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aG92ZXJlZCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmFjdGl2ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
YWN0aXZlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+Zm9jdXNl
ZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+Zm9jdXNlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5z
aGFkb3dQc2V1ZG9JZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQg
PT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoIXNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0
dHJpYnV0ZXMoZWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVu
dC0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkgJiYgbV9ydWxlU2V0
cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoZWxlbWVudC0+aWRGb3JTdHlsZVJlc29s
dXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQt
Pmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIEZJWE1FOiBXZSBzaG91bGQgc2hhcmUgc3R5bGUgZm9yIG9wdGlvbiBhbmQgb3B0Z3JvdXAg
d2hlbmV2ZXIgcG9zc2libGUuCisgICAgLy8gQmVmb3JlIGRvaW5nIHNvLCB3ZSBuZWVkIHRvIHJl
c29sdmUgaXNzdWVzIGluIEhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMKKyAgICAv
LyBhbmQgUmVuZGVyTWVudUxpc3Q6OnNldFRleHQuIFNlZSBhbHNvIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODQwNQorICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1l
KG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgaXNDb250cm9sID0gZWxlbWVudC0+aXNGb3JtQ29u
dHJvbEVsZW1lbnQoKTsKKworICAgIGlmIChpc0NvbnRyb2wgIT0gc3RhdGUuZWxlbWVudCgpLT5p
c0Zvcm1Db250cm9sRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAo
aXNDb250cm9sICYmICFjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woZWxlbWVudCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdHlsZS0+dHJhbnNpdGlvbnMoKSB8fCBzdHlsZS0+
YW5pbWF0aW9ucygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgLy8gVHVybiBvZmYgc3R5bGUgc2hhcmluZyBmb3IgZWxlbWVu
dHMgdGhhdCBjYW4gZ2FpbiBsYXllcnMgZm9yIHJlYXNvbnMgb3V0c2lkZSBvZiB0aGUgc3R5bGUg
c3lzdGVtLgorICAgIC8vIFNlZSBjb21tZW50cyBpbiBSZW5kZXJPYmplY3Q6OnNldFN0eWxlKCku
CisgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGVtYmVkVGFnKSB8fCBlbGVt
ZW50LT5oYXNUYWdOYW1lKG9iamVjdFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhcHBsZXRU
YWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoY2FudmFzVGFnKQorI2lmIEVOQUJMRShQTFVHSU5f
UFJPWFlfRk9SX1ZJREVPKQorICAgICAgICAvLyBXaXRoIHByb3h5aW5nLCB0aGUgbWVkaWEgZWxl
bWVudHMgYXJlIGJhY2tlZCBieSBhIFJlbmRlckVtYmVkZGVkT2JqZWN0LgorICAgICAgICB8fCBl
bGVtZW50LT5oYXNUYWdOYW1lKHZpZGVvVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGF1ZGlv
VGFnKQorI2VuZGlmCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisK
KyAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oZWxlbWVudCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAmJiBzdGF0ZS5lbGVtZW50TGlu
a1N0YXRlKCkgIT0gc3R5bGUtPmluc2lkZUxpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIC8vIERlbnkgc2hhcmluZyBzdHlsZXMgYmV0
d2VlbiBXZWJWVFQgYW5kIG5vbi1XZWJWVFQgbm9kZXMuCisgICAgaWYgKGVsZW1lbnQtPmlzV2Vi
VlRURWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAm
JiBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpICYmIHRvV2ViVlRURWxlbWVudChl
bGVtZW50KS0+aXNQYXN0Tm9kZSgpICE9IHRvV2ViVlRURWxlbWVudChzdGF0ZS5lbGVtZW50KCkp
LT5pc1Bhc3ROb2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisjaWYgRU5B
QkxFKEZVTExTQ1JFRU5fQVBJKQorICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50
KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpIHx8IHN0YXRlLmVsZW1lbnQoKSA9
PSBzdGF0ZS5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGlu
ZSBTdHlsZWRFbGVtZW50KiBTdHlsZVJlc29sdmVyOjpmaW5kU2libGluZ0ZvclN0eWxlU2hhcmlu
ZyhOb2RlKiBub2RlLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0Cit7CisgICAgZm9yICg7IG5vZGU7
IG5vZGUgPSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW5vZGUtPmlz
U3R5bGVkRWxlbWVudCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjYW5T
aGFyZVN0eWxlV2l0aEVsZW1lbnQoc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpKSkK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY291bnQrKyA9PSBjU3R5bGVTZWFyY2hU
aHJlc2hvbGQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKK30KKworUmVuZGVyU3R5bGUqIFN0eWxlUmVz
b2x2ZXI6OmxvY2F0ZVNoYXJlZFN0eWxlKCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIGlmICghc3RhdGUuc3R5bGVkRWxlbWVudCgpIHx8ICFzdGF0ZS5wYXJlbnRTdHlsZSgp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBpbmxpbmUg
c3R5bGUgaXQgaXMgcHJvYmFibHkgdW5pcXVlLgorICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworI2lmIEVOQUJMRShTVkcpCisg
ICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nh
c3Q8U1ZHRWxlbWVudCo+KHN0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxl
UHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIC8vIElkcyBzdG9w
IHN0eWxlIHNoYXJpbmcgaWYgdGhleSBzaG93IHVwIGluIHRoZSBzdHlsZXNoZWV0cy4KKyAgICBp
ZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5pZHNJblJ1bGVzLmNvbnRhaW5zKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aWRGb3JTdHlsZVJl
c29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGFyZW50RWxl
bWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCisg
ICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc1Njb3Bl
ZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGF0ZS5lbGVt
ZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCisgICAgICAgIHJldHVybiAw
OworICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhzdGF0ZS5lbGVtZW50KCkpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIC8vIENhY2hlIHdoZXRoZXIgc3RhdGUuZWxlbWVudCBpcyBh
ZmZlY3RlZCBieSBhbnkga25vd24gY2xhc3Mgc2VsZWN0b3JzLgorICAgIC8vIEZJWE1FOiBUaGlz
IHNob3VsZG4ndCBiZSBhIG1lbWJlciB2YXJpYWJsZS4gVGhlIHN0eWxlIHNoYXJpbmcgY29kZSBj
b3VsZCBiZSBmYWN0b3JlZCBvdXQgb2YgU3R5bGVSZXNvbHZlci4KKyAgICBzdGF0ZS5zZXRFbGVt
ZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQo
KS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHN0YXRlLmVsZW1lbnQo
KS0+Y2xhc3NOYW1lcygpKSk7CisKKyAgICAvLyBDaGVjayBwcmV2aW91cyBzaWJsaW5ncyBhbmQg
dGhlaXIgY291c2lucy4KKyAgICB1bnNpZ25lZCBjb3VudCA9IDA7CisgICAgdW5zaWduZWQgdmlz
aXRlZE5vZGVDb3VudCA9IDA7CisgICAgU3R5bGVkRWxlbWVudCogc2hhcmVFbGVtZW50ID0gMDsK
KyAgICBOb2RlKiBjb3VzaW5MaXN0ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmV2aW91c1Np
YmxpbmcoKTsKKyAgICB3aGlsZSAoY291c2luTGlzdCkgeworICAgICAgICBzaGFyZUVsZW1lbnQg
PSBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhjb3VzaW5MaXN0LCBjb3VudCk7CisgICAgICAg
IGlmIChzaGFyZUVsZW1lbnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY291c2luTGlz
dCA9IGxvY2F0ZUNvdXNpbkxpc3QoY291c2luTGlzdC0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVk
Tm9kZUNvdW50KTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGV4aGF1c3RlZCBhbGwgb3Vy
IGJ1ZGdldCBvciBvdXIgY291c2lucy4KKyAgICBpZiAoIXNoYXJlRWxlbWVudCkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAvLyBDYW4ndCBzaGFyZSBpZiBzaWJsaW5nIHJ1bGVzIGFwcGx5LiBU
aGlzIGlzIGNoZWNrZWQgYXQgdGhlIGVuZCBhcyBpdCBzaG91bGQgcmFyZWx5IGZhaWwuCisgICAg
aWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMuc2libGlu
ZygpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgYXR0cmlidXRl
IHJ1bGVzIGFwcGx5LgorICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNl
dChtX3J1bGVTZXRzLnVuY29tbW9uQXR0cmlidXRlKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICAvLyBDYW4ndCBzaGFyZSBpZiBAaG9zdCBALXJ1bGVzIGFwcGx5LgorICAgIGlmIChzdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkpCisgICAgICAgIHJldHVybiAwOworICAg
IC8vIFRyYWNraW5nIGNoaWxkIGluZGV4IHJlcXVpcmVzIHVuaXF1ZSBzdHlsZSBmb3IgZWFjaCBu
b2RlLiBUaGlzIG1heSBnZXQgc2V0IGJ5IHRoZSBzaWJsaW5nIHJ1bGUgbWF0Y2ggYWJvdmUuCisg
ICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJl
bnRFbGVtZW50KCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2hhcmVFbGVtZW50
LT5yZW5kZXJTdHlsZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhN
YXRjaFJlc3VsdCYgcmVzdWx0KQoreworICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNjb3BlOwor
CisgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4K
KyAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVTaGVldCkK
KyAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7CisgICAgUnVsZVNldCogdXNlckFn
ZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIp
CisgICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSA6IENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOworICAgIG1hdGNoVUFSdWxlcyhyZXN1
bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQpOworCisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1h
dGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChkb2N1
bWVudCgpLT5pblF1aXJrc01vZGUoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9j
dW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4g
eG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJj
ZSBzdHlsZSBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAg
ICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJj
ZVN0eWxlKCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQ
YWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHlsZSogc3R5bGUpCit7Cisg
ICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKQorICAgICAg
ICByZXR1cm47CisgICAgICAgIAorICAgIHN3aXRjaCAocGFnaW5hdGlvbk1vZGUpIHsKKyAgICBj
YXNlIFBhZ2luYXRpb246OkxlZnRUb1JpZ2h0UGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0
Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7CisgICAgICAgIGlmIChzdHlsZS0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9n
cmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nr
c1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Q
cm9ncmVzc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGFnaW5hdGlvbjo6UmlnaHRU
b0xlZnRQYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxD
b2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1
bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1h
bENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpUb3BUb0JvdHRvbVBhZ2luYXRlZDoKKyAgICAg
ICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYg
KHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8g
UmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2
ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0
aW9uOjpCb3R0b21Ub1RvcFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMo
VmVydGljYWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0
aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxl
LT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24g
OiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBz
dHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZDoKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3Rh
dGljIHZvaWQgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oY29uc3QgUmVuZGVyU3R5bGUqIHN0
eWxlLCBGb250T3JpZW50YXRpb24mIGZvbnRPcmllbnRhdGlvbiwgTm9uQ0pLR2x5cGhPcmllbnRh
dGlvbiYgZ2x5cGhPcmllbnRhdGlvbikKK3sKKyAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCkpIHsKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAg
ICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJp
Z2h0OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChzdHlsZS0+dGV4dE9y
aWVudGF0aW9uKCkpIHsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ6Cisg
ICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9yaWVudGF0
aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVy
bjsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblVwcmlnaHQ6CisgICAgICAgIGZvbnRPcmllbnRh
dGlvbiA9IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhP
cmllbnRhdGlvblVwcmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHRPcmllbnRh
dGlvblNpZGV3YXlzOgorICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgPT0gTGVmdFRv
UmlnaHRXcml0aW5nTW9kZSkgeworICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG1h
cCB0byBzaWRld2F5cy1sZWZ0LCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKyAgICAgICAg
ICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICAgICAgZ2x5cGhPcmllbnRh
dGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7
CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGlj
YWxSaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdh
eXNSaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAg
Z2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0Owor
ICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAgICAgIGdseXBo
T3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQsIENTU0ZvbnRTZWxlY3Rv
ciogZm9udFNlbGVjdG9yKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgp
OworCisgICAgLy8gSFRNTDUgc3RhdGVzIHRoYXQgc2VhbWxlc3MgaWZyYW1lcyBzaG91bGQgcmVw
bGFjZSBkZWZhdWx0IENTUyB2YWx1ZXMKKyAgICAvLyB3aXRoIHZhbHVlcyBpbmhlcml0ZWQgZnJv
bSB0aGUgY29udGFpbmluZyBpZnJhbWUgZWxlbWVudC4gSG93ZXZlciwKKyAgICAvLyBzb21lIHZh
bHVlcyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBkZXNpZ25Nb2RlID0gIm9uIikgc3RpbGwgbmVlZCB0
bworICAgIC8vIGJlIHNldCBieSB0aGlzICJkb2N1bWVudCBzdHlsZSIuCisgICAgUmVmUHRyPFJl
bmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgIGJv
b2wgc2VhbWxlc3NXaXRoUGFyZW50ID0gZG9jdW1lbnQtPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5
V2l0aFBhcmVudCgpOworICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpIHsKKyAgICAgICAgUmVu
ZGVyU3R5bGUqIGlmcmFtZVN0eWxlID0gZG9jdW1lbnQtPnNlYW1sZXNzUGFyZW50SUZyYW1lKCkt
PnJlbmRlclN0eWxlKCk7CisgICAgICAgIGlmIChpZnJhbWVTdHlsZSkKKyAgICAgICAgICAgIGRv
Y3VtZW50U3R5bGUtPmluaGVyaXRGcm9tKGlmcmFtZVN0eWxlKTsKKyAgICB9CisKKyAgICAvLyBG
SVhNRTogSXQncyBub3QgY2xlYXIgd2hpY2ggdmFsdWVzIGJlbG93IHdlIHdhbnQgdG8gb3ZlcnJp
ZGUgaW4gdGhlIHNlYW1sZXNzIGNhc2UhCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlzcGxheShC
TE9DSyk7CisgICAgaWYgKCFzZWFtbGVzc1dpdGhQYXJlbnQpIHsKKyAgICAgICAgZG9jdW1lbnRT
dHlsZS0+c2V0UlRMT3JkZXJpbmcoZG9jdW1lbnQtPnZpc3VhbGx5T3JkZXJlZCgpID8gVmlzdWFs
T3JkZXIgOiBMb2dpY2FsT3JkZXIpOworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRab29tKGZy
YW1lICYmICFkb2N1bWVudC0+cHJpbnRpbmcoKSA/IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpIDog
MSk7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFBhZ2VTY2FsZVRyYW5zZm9ybShmcmFtZSA/
IGZyYW1lLT5mcmFtZVNjYWxlRmFjdG9yKCkgOiAxKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+
c2V0TG9jYWxlKGRvY3VtZW50LT5jb250ZW50TGFuZ3VhZ2UoKSk7CisgICAgfQorICAgIC8vIFRo
aXMgb3ZlcnJpZGVzIGFueSAtd2Via2l0LXVzZXItbW9kaWZ5IGluaGVyaXRlZCBmcm9tIHRoZSBw
YXJlbnQgaWZyYW1lLgorICAgIGRvY3VtZW50U3R5bGUtPnNldFVzZXJNb2RpZnkoZG9jdW1lbnQt
PmluRGVzaWduTW9kZSgpID8gUkVBRF9XUklURSA6IFJFQURfT05MWSk7CisKKyAgICBFbGVtZW50
KiBkb2NFbGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOworICAgIFJlbmRlck9i
amVjdCogZG9jRWxlbWVudFJlbmRlcmVyID0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRl
cmVyKCkgOiAwOworICAgIGlmIChkb2NFbGVtZW50UmVuZGVyZXIpIHsKKyAgICAgICAgLy8gVXNl
IHRoZSBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSBvZiB0aGUgYm9keSB0byBzZXQgdGhlCisg
ICAgICAgIC8vIHZpZXdwb3J0J3MgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgdW5sZXNzIHRo
ZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuCisgICAgICAgIC8vIElm
IHRoZXJlIGlzIG5vIGJvZHksIHRoZW4gdXNlIHRoZSBkb2N1bWVudCBlbGVtZW50LgorICAgICAg
ICBSZW5kZXJPYmplY3QqIGJvZHlSZW5kZXJlciA9IGRvY3VtZW50LT5ib2R5KCkgPyBkb2N1bWVu
dC0+Ym9keSgpLT5yZW5kZXJlcigpIDogMDsKKyAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAh
ZG9jdW1lbnQtPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgICAg
IGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+d3Jp
dGluZ01vZGUoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNl
dFdyaXRpbmdNb2RlKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7
CisgICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT5kaXJlY3Rpb25TZXRPbkRv
Y3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9u
KGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oZG9jRWxlbWVudFJlbmRlcmVyLT5z
dHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAgfQorCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAg
IGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgICAg
IGNvbnN0IFBhZ2luYXRpb24mIHBhZ2luYXRpb24gPSBmcmFtZVZpZXctPnBhZ2luYXRpb24oKTsK
KyAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uLm1vZGUgIT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0
ZWQpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShwYWdpbmF0
aW9uLm1vZGUsIGRvY3VtZW50U3R5bGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIGRvY3VtZW50
U3R5bGUtPnNldENvbHVtbkdhcChwYWdpbmF0aW9uLmdhcCk7CisgICAgICAgICAgICAgICAgaWYg
KFJlbmRlclZpZXcqIHZpZXcgPSBkb2N1bWVudC0+cmVuZGVyVmlldygpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmICh2aWV3LT5oYXNDb2x1bW5zKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICB2aWV3LT51cGRhdGVDb2x1bW5JbmZvRnJvbVN0eWxlKGRvY3VtZW50U3R5bGUuZ2V0KCkpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIFNlYW1sZXNzIGlmcmFtZXMgd2FudCB0byBpbmhlcml0IHRoZWlyIGZvbnQgZnJvbSB0aGVp
ciBwYXJlbnQgaWZyYW1lLCBzbyBlYXJseSByZXR1cm4gYmVmb3JlIHNldHRpbmcgdGhlIGZvbnQu
CisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50U3R5
bGUucmVsZWFzZSgpOworCisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKKyAg
ICBmb250RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxl
Y3Rpb24oZG9jdW1lbnRTdHlsZS0+bG9jYWxlKCkpKTsKKyAgICBpZiAoU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCkpIHsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVu
Rm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRS
ZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiBzdGFuZGFyZEZvbnQgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFt
aWx5KGZvbnREZXNjcmlwdGlvbi5zY3JpcHQoKSk7CisgICAgICAgIGlmICghc3RhbmRhcmRGb250
LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoRm9udERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWlseSk7CisgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250KTsKKyAgICAgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKKyAgICAg
ICAgfQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRp
dW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKKyAgICAgICAgaW50IHNpemUgPSBTdHlsZVJlc29s
dmVyOjpmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQsIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSk7
CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOworICAgICAg
ICBib29sIHVzZVNWR1pvb21SdWxlcyA9IGRvY3VtZW50LT5pc1NWR0RvY3VtZW50KCk7CisgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoU3R5bGVSZXNvbHZlcjo6Z2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIGRvY3VtZW50U3R5bGUuZ2V0KCks
IGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMp
KTsKKyAgICB9IGVsc2UKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250
KGRvY3VtZW50LT5wcmludGluZygpKTsKKworICAgIEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50
YXRpb247CisgICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9uOworICAg
IGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnRPcmll
bnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7CisgICAgZm9udERlc2NyaXB0aW9uLnNldE9yaWVu
dGF0aW9uKGZvbnRPcmllbnRhdGlvbik7CisgICAgZm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0ds
eXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7CisKKyAgICBkb2N1bWVudFN0eWxlLT5z
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICBkb2N1bWVudFN0eWxlLT5m
b250KCkudXBkYXRlKGZvbnRTZWxlY3Rvcik7CisKKyAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5y
ZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U2hhZG93Qm91bmRhcnkoY29u
c3QgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlID0gZWxlbWVudC0+cGFyZW50
Tm9kZSgpOworICAgIHJldHVybiBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUtPmlzU2hhZG93Um9v
dCgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZv
ckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVyU3R5bGUqIGRlZmF1bHRQYXJlbnQsCisg
ICAgU3R5bGVTaGFyaW5nQmVoYXZpb3Igc2hhcmluZ0JlaGF2aW9yLCBSdWxlTWF0Y2hpbmdCZWhh
dmlvciBtYXRjaGluZ0JlaGF2aW9yLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7
CisgICAgLy8gT25jZSBhbiBlbGVtZW50IGhhcyBhIHJlbmRlcmVyLCB3ZSBkb24ndCB0cnkgdG8g
ZGVzdHJveSBpdCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSByZW5kZXJlcgorICAgIC8vIHdpbGwgdmFu
aXNoIGlmIGEgc3R5bGUgcmVjYWxjIGhhcHBlbnMgZHVyaW5nIGxvYWRpbmcuCisgICAgaWYgKHNo
YXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhZWxlbWVudC0+ZG9jdW1lbnQo
KS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgIWVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAg
ICAgICAgaWYgKCFzX3N0eWxlTm90WWV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBzX3N0eWxl
Tm90WWV0QXZhaWxhYmxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAg
ICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPnNldERpc3BsYXkoTk9ORSk7CisgICAgICAg
ICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9y
KTsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50LT5kb2N1bWVudCgpLT5zZXRIYXNOb2Rlc1dp
dGhQbGFjZWhvbGRlclN0eWxlKCk7CisgICAgICAgIHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxh
YmxlOworICAgIH0KKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaW5pdEVsZW1l
bnQoZWxlbWVudCk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBl
bGVtZW50LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywgcmVnaW9uRm9yU3R5bGluZyk7CisgICAg
aWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJp
YnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0
eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoKTsKKyAgICAgICAgaWYgKHNoYXJlZFN0eWxlKQorICAg
ICAgICAgICAgcmV0dXJuIHNoYXJlZFN0eWxlOworICAgIH0KKworICAgIFJlZlB0cjxSZW5kZXJT
dHlsZT4gY2xvbmVGb3JQYXJlbnQ7CisKKyAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUoKSkgewor
ICAgICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShzdGF0ZS5wYXJlbnRTdHlsZSgpLCBpc0F0U2hhZG93
Qm91bmRhcnkoZWxlbWVudCkgPyBSZW5kZXJTdHlsZTo6QXRTaGFkb3dCb3VuZGFyeSA6IFJlbmRl
clN0eWxlOjpOb3RBdFNoYWRvd0JvdW5kYXJ5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0
ZS5zZXRTdHlsZShkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkpOworICAgICAgICBjbG9uZUZvclBh
cmVudCA9IFJlbmRlclN0eWxlOjpjbG9uZShzdGF0ZS5zdHlsZSgpKTsKKyAgICAgICAgc3RhdGUu
c2V0UGFyZW50U3R5bGUoY2xvbmVGb3JQYXJlbnQuZ2V0KCkpOworICAgIH0KKyAgICAvLyBjb250
ZW50ZWRpdGFibGUgYXR0cmlidXRlIChpbXBsZW1lbnRlZCBieSAtd2Via2l0LXVzZXItbW9kaWZ5
KSBzaG91bGQKKyAgICAvLyBiZSBwcm9wYWdhdGVkIGZyb20gc2hhZG93IGhvc3QgdG8gZGlzdHJp
YnV0ZWQgbm9kZS4KKyAgICBpZiAoc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkp
IHsKKyAgICAgICAgaWYgKEVsZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgaWYgKFJlbmRlclN0eWxlKiBzdHlsZU9mU2hhZG93SG9zdCA9IHBh
cmVudC0+cmVuZGVyU3R5bGUoKSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRV
c2VyTW9kaWZ5KHN0eWxlT2ZTaGFkb3dIb3N0LT51c2VyTW9kaWZ5KCkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKSB7CisgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldElzTGluayh0cnVlKTsKKyAgICAgICAgRUluc2lkZUxpbmsgbGlua1N0YXRlID0gc3Rh
dGUuZWxlbWVudExpbmtTdGF0ZSgpOworICAgICAgICBpZiAobGlua1N0YXRlICE9IE5vdEluc2lk
ZUxpbmspIHsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VWaXNpdGVkID0gSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjpmb3JjZVBzZXVkb1N0YXRlKGVsZW1lbnQsIENTU1NlbGVjdG9yOjpQc2V1ZG9W
aXNpdGVkKTsKKyAgICAgICAgICAgIGlmIChmb3JjZVZpc2l0ZWQpCisgICAgICAgICAgICAgICAg
bGlua1N0YXRlID0gSW5zaWRlVmlzaXRlZExpbms7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdGUpOworICAgIH0KKworICAgIGJvb2wgbmVl
ZHNDb2xsZWN0aW9uID0gZmFsc2U7CisgICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjplbnN1cmVE
ZWZhdWx0U3R5bGVTaGVldHNGb3JFbGVtZW50KGVsZW1lbnQsIG5lZWRzQ29sbGVjdGlvbik7Cisg
ICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKKyAgICAgICAgbV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVy
ZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZlci5nZXQoKSk7CisK
KyAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAgICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9
PSBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcykKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVz
dWx0KTsKKyAgICBlbHNlCisgICAgICAgIG1hdGNoQWxsUnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNo
aW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOworCisgICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7CisKKyAgICAvLyBDbGVhbiB1
cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcg
b3RoZXIgZml4dXBzKS4KKyAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0
ZS5wYXJlbnRTdHlsZSgpLCBlbGVtZW50KTsKKworICAgIHN0YXRlLmNsZWFyKCk7IC8vIENsZWFy
IG91dCBmb3IgdGhlIG5leHQgcmVzb2x2ZS4KKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0
eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgorICAgIHJldHVy
biBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVS
ZXNvbHZlcjo6c3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxl
LCBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSwgS2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVW
YWx1ZSkKK3sKKyAgICBNYXRjaFJlc3VsdCByZXN1bHQ7CisgICAgaWYgKGtleWZyYW1lLT5wcm9w
ZXJ0aWVzKCkpCisgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUt
PnByb3BlcnRpZXMoKSk7CisKKyAgICBBU1NFUlQoIW1fc3RhdGUuc3R5bGUoKSk7CisKKyAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgLy8gQ3JlYXRlIHRoZSBzdHlsZQorICAgIHN0
YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjbG9uZShlbGVtZW50U3R5bGUpKTsKKyAgICBzdGF0
ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGJvdGhl
ciB3aXRoICFpbXBvcnRhbnQuIFNpbmNlIHRoZXJlIGlzIG9ubHkgZXZlciBvbmUKKyAgICAvLyBk
ZWNsLCB0aGVyZSdzIG5vdGhpbmcgdG8gb3ZlcnJpZGUuIFNvIGp1c3QgYWRkIHRoZSBmaXJzdCBw
cm9wZXJ0aWVzLgorICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIGlmIChrZXlm
cmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQ
cmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIElmIG91ciBmb250IGdv
dCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KKyAgICB1cGRhdGVGb250KCk7
CisKKyAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVk
IG9uIHRoZSBmb250LXNpemUKKyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisgICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSk7CisKKyAgICAvLyBOb3cgZG8gcmVzdCBvZiB0aGUgcHJvcGVydGllcy4KKyAgICBp
ZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
czxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIElmIG91ciBm
b250IGdvdCBkaXJ0aWVkIGJ5IG9uZSBvZiB0aGUgbm9uLWVzc2VudGlhbCBmb250IHByb3BzLAor
ICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgYSBzZWNvbmQgdGltZS4KKyAgICB1cGRhdGVG
b250KCk7CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRo
aXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICAvLyBBZGQg
YWxsIHRoZSBhbmltYXRpbmcgcHJvcGVydGllcyB0byB0aGUga2V5ZnJhbWUuCisgICAgaWYgKGNv
bnN0IFN0eWxlUHJvcGVydHlTZXQqIHN0eWxlRGVjbGFyYXRpb24gPSBrZXlmcmFtZS0+cHJvcGVy
dGllcygpKSB7CisgICAgICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBzdHlsZURlY2xhcmF0
aW9uLT5wcm9wZXJ0eUNvdW50KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBw
cm9wZXJ0eUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkg
PSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUF0KGkpLmlkKCk7CisgICAgICAgICAgICAvLyBU
aW1pbmctZnVuY3Rpb24gd2l0aGluIGtleWZyYW1lcyBpcyBzcGVjaWFsLCBiZWNhdXNlIGl0IGlz
IG5vdCBhbmltYXRlZDsgaXQganVzdAorICAgICAgICAgICAgLy8gZGVzY3JpYmVzIHRoZSB0aW1p
bmcgZnVuY3Rpb24gYmV0d2VlbiB0aGlzIGtleWZyYW1lIGFuZCB0aGUgbmV4dC4KKyAgICAgICAg
ICAgIGlmIChwcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0
aW9uKQorICAgICAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuYWRkUHJvcGVydHkocHJvcGVydHkp
OworICAgICAgICB9CisgICAgfQorCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNv
bHZlcigpOworCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqIGUsIGNvbnN0IFJl
bmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIEtleWZyYW1lTGlzdCYgbGlzdCkKK3sKKyAgICBsaXN0
LmNsZWFyKCk7CisKKyAgICAvLyBHZXQgdGhlIGtleWZyYW1lc1J1bGUgZm9yIHRoaXMgbmFtZQor
ICAgIGlmICghZSB8fCBsaXN0LmFuaW1hdGlvbk5hbWUoKS5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5jaGVja0NvbnNpc3RlbmN5KCk7CisKKyAg
ICBLZXlmcmFtZXNSdWxlTWFwOjppdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzUnVsZU1hcC5maW5k
KGxpc3QuYW5pbWF0aW9uTmFtZSgpLmltcGwoKSk7CisgICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVz
UnVsZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgU3R5bGVSdWxlS2V5
ZnJhbWVzKiBrZXlmcmFtZXNSdWxlID0gaXQtPnZhbHVlLmdldCgpOworCisgICAgLy8gQ29uc3Ry
dWN0IGFuZCBwb3B1bGF0ZSB0aGUgc3R5bGUgZm9yIGVhY2gga2V5ZnJhbWUKKyAgICBjb25zdCBW
ZWN0b3I8UmVmUHRyPFN0eWxlS2V5ZnJhbWU+ID4mIGtleWZyYW1lcyA9IGtleWZyYW1lc1J1bGUt
PmtleWZyYW1lcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrZXlmcmFtZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gQXBwbHkgdGhlIGRlY2xhcmF0aW9uIHRvIHRoZSBzdHls
ZS4gVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgbG9naWMgaW4gc3R5bGVGb3JF
bGVtZW50CisgICAgICAgIGluaXRFbGVtZW50KGUpOworICAgICAgICBtX3N0YXRlLmluaXRGb3JT
dHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSk7CisKKyAgICAgICAgY29uc3QgU3R5bGVLZXlmcmFt
ZSoga2V5ZnJhbWUgPSBrZXlmcmFtZXNbaV0uZ2V0KCk7CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1
ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0
eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBrZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwor
CisgICAgICAgIC8vIEFkZCB0aGlzIGtleWZyYW1lIHN0eWxlIHRvIGFsbCB0aGUgaW5kaWNhdGVk
IGtleSB0aW1lcworICAgICAgICBWZWN0b3I8ZmxvYXQ+IGtleXM7CisgICAgICAgIGtleWZyYW1l
LT5nZXRLZXlzKGtleXMpOworICAgICAgICBmb3IgKHNpemVfdCBrZXlJbmRleCA9IDA7IGtleUlu
ZGV4IDwga2V5cy5zaXplKCk7ICsra2V5SW5kZXgpIHsKKyAgICAgICAgICAgIGtleWZyYW1lVmFs
dWUuc2V0S2V5KGtleXNba2V5SW5kZXhdKTsKKyAgICAgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZy
YW1lVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIDAlIGtleWZyYW1l
IGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25l
IG90aGVyIGtleWZyYW1lKQorICAgIGludCBpbml0aWFsTGlzdFNpemUgPSBsaXN0LnNpemUoKTsK
KyAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiBsaXN0WzBdLmtleSgpKSB7CisgICAgICAg
IHN0YXRpYyBTdHlsZUtleWZyYW1lKiB6ZXJvUGVyY2VudEtleWZyYW1lOworICAgICAgICBpZiAo
IXplcm9QZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUg
PSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7CisgICAgICAgICAgICB6ZXJvUGVy
Y2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIwJSIpOworICAgICAgICB9CisgICAgICAgIEtleWZy
YW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKKyAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRT
dHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgemVyb1BlcmNlbnRLZXlmcmFtZSwg
a2V5ZnJhbWVWYWx1ZSkpOworICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKKyAg
ICB9CisKKyAgICAvLyBJZiB0aGUgMTAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQg
KGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKKyAgICBp
ZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiAobGlzdFtsaXN0LnNpemUoKSAtIDFdLmtleSgpICE9
IDEpKSB7CisgICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiBodW5kcmVkUGVyY2VudEtleWZy
YW1lOworICAgICAgICBpZiAoIWh1bmRyZWRQZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAgICAg
IGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVm
KCk7CisgICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIxMDAl
Iik7CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDEsIDAp
OworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVu
dFN0eWxlLCBodW5kcmVkUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisgICAgICAg
IGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGUs
IGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUpCit7CisgICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKKyAgICBpZiAoIWUp
CisgICAgICAgIHJldHVybiAwOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAg
IGluaXRFbGVtZW50KGUpOworCisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVu
dCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBzdGF0ZS5zZXRT
dHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRG
cm9tKG1fc3RhdGUucGFyZW50U3R5bGUoKSk7CisKKyAgICAvLyBTaW5jZSB3ZSBkb24ndCB1c2Ug
cHNldWRvLWVsZW1lbnRzIGluIGFueSBvZiBvdXIgcXVpcmsvcHJpbnQgdXNlciBhZ2VudCBydWxl
cywgZG9uJ3Qgd2FzdGUgdGltZSB3YWxraW5nCisgICAgLy8gdGhvc2UgcnVsZXMuCisKKyAgICAv
LyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVzLgorICAgIE1hdGNoUmVzdWx0IG1hdGNo
UmVzdWx0OworICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7CisKKyAgICBpZiAobV9tYXRj
aEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1
bHQsIGZhbHNlKTsKKyAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2Up
OworICAgIH0KKworICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBl
KHBzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzKG1hdGNoUmVzdWx0LCBlKTsKKworICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3Qn
cyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgorICAg
IGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIG1fc3RhdGUucGFyZW50U3R5bGUoKSwg
MCk7CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMg
c3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworICAgIGRvY3VtZW50KCktPmRp
ZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgor
ICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCit7CisgICAgbV9z
dGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGRvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpKTsgLy8gbV9yb290RWxlbWVudFN0eWxlIHdpbGwgYmUgc2V0IHRvIHRoZSBkb2N1
bWVudCBzdHlsZS4KKworICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgp
KTsKKyAgICBtX3N0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucm9vdEVsZW1lbnRT
dHlsZSgpKTsKKworICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgp
OworICAgIGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7CisgICAg
Y29uc3QgU3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOworICAgIAorICAgIE1hdGNo
UmVzdWx0IHJlc3VsdDsKKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHls
ZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAg
bWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlz
Rmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVs
ZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KKyAgICBtYXRjaFBh
Z2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0
LCBwYWdlKTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBib29sIGlu
aGVyaXRlZE9ubHkgPSBmYWxzZTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAs
IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKyNl
bmRpZgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4o
cmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGlu
aGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFk
IGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVp
Z2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4K
KyAgICBpZiAobV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0
eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOworCisg
ICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwg
ZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRP
bmx5KTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhp
cyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAgZG9jdW1lbnQoKS0+
ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUu
CisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OmRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKQoreworICAgIG1f
c3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKKyAgICAvLyBNYWtlIHN1cmUg
b3VyIGZvbnRzIGFyZSBpbml0aWFsaXplZCBpZiB3ZSBkb24ndCBpbmhlcml0IHRoZW0gZnJvbSBv
dXIgcGFyZW50IHN0eWxlLgorICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNl
dHRpbmdzKCkpIHsKKyAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7CisgICAg
ICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7CisgICAg
fSBlbHNlCisgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZSgwKTsKKworICAg
IHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclRleHQoVGV4dCogdGV4dE5vZGUpCit7CisgICAgQVNT
RVJUKHRleHROb2RlKTsKKworICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQodGV4dE5v
ZGUpOworICAgIE5vZGUqIHBhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJp
bmdBbmRTdHlsZSgpOworICAgIHJldHVybiBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgp
IHx8ICFwYXJlbnROb2RlID8KKyAgICAgICAgZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpIDogcGFy
ZW50Tm9kZS0+cmVuZGVyU3R5bGUoKTsKK30KKworc3RhdGljIHZvaWQgYWRkSW50cmluc2ljTWFy
Z2lucyhSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgLy8gSW50cmluc2ljIG1hcmdpbiB2YWx1
ZS4KKyAgICBjb25zdCBpbnQgaW50cmluc2ljTWFyZ2luID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVa
b29tKCk7CisKKyAgICAvLyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBub3Qg
YWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCisgICAgLy8g
RklYTUU6IFVzaW5nICJxdWlyayIgdG8gZGVjaWRlIHRoZSBtYXJnaW4gd2Fzbid0IHNldCBpcyBr
aW5kIG9mIGxhbWUuCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkp
IHsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmsoKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Cisg
ICAgICAgIGlmIChzdHlsZS0+bWFyZ2luUmlnaHQoKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5
bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAg
fQorCisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgeworICAgICAgICBpZiAoc3R5
bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luVG9w
KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgICAgIGlmIChzdHlsZS0+bWFy
Z2luQm90dG9tKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20o
TGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBFRGlz
cGxheSBlcXVpdmFsZW50QmxvY2tEaXNwbGF5KEVEaXNwbGF5IGRpc3BsYXksIGJvb2wgaXNGbG9h
dGluZywgYm9vbCBzdHJpY3RQYXJzaW5nKQoreworICAgIHN3aXRjaCAoZGlzcGxheSkgeworICAg
IGNhc2UgQkxPQ0s6CisgICAgY2FzZSBUQUJMRToKKyAgICBjYXNlIEJPWDoKKyAgICBjYXNlIEZM
RVg6CisgICAgY2FzZSBHUklEOgorICAgICAgICByZXR1cm4gZGlzcGxheTsKKworICAgIGNhc2Ug
TElTVF9JVEVNOgorICAgICAgICAvLyBJdCBpcyBhIFdpbklFIGJ1ZyB0aGF0IGZsb2F0ZWQgbGlz
dCBpdGVtcyBsb3NlIHRoZWlyIGJ1bGxldHMsIHNvIHdlJ2xsIGVtdWxhdGUgdGhlIHF1aXJrLCBi
dXQgb25seSBpbiBxdWlya3MgbW9kZS4KKyAgICAgICAgaWYgKCFzdHJpY3RQYXJzaW5nICYmIGlz
RmxvYXRpbmcpCisgICAgICAgICAgICByZXR1cm4gQkxPQ0s7CisgICAgICAgIHJldHVybiBkaXNw
bGF5OworICAgIGNhc2UgSU5MSU5FX1RBQkxFOgorICAgICAgICByZXR1cm4gVEFCTEU7CisgICAg
Y2FzZSBJTkxJTkVfQk9YOgorICAgICAgICByZXR1cm4gQk9YOworICAgIGNhc2UgSU5MSU5FX0ZM
RVg6CisgICAgICAgIHJldHVybiBGTEVYOworICAgIGNhc2UgSU5MSU5FX0dSSUQ6CisgICAgICAg
IHJldHVybiBHUklEOworCisgICAgY2FzZSBJTkxJTkU6CisgICAgY2FzZSBSVU5fSU46CisgICAg
Y2FzZSBDT01QQUNUOgorICAgIGNhc2UgSU5MSU5FX0JMT0NLOgorICAgIGNhc2UgVEFCTEVfUk9X
X0dST1VQOgorICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOgorICAgIGNhc2UgVEFCTEVfRk9P
VEVSX0dST1VQOgorICAgIGNhc2UgVEFCTEVfUk9XOgorICAgIGNhc2UgVEFCTEVfQ09MVU1OX0dS
T1VQOgorICAgIGNhc2UgVEFCTEVfQ09MVU1OOgorICAgIGNhc2UgVEFCTEVfQ0VMTDoKKyAgICBj
YXNlIFRBQkxFX0NBUFRJT046CisgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICBjYXNlIE5PTkU6
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gTk9ORTsKKyAg
ICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIEJMT0NLOworfQorCisv
LyBDU1MgcmVxdWlyZXMgdGV4dC1kZWNvcmF0aW9uIHRvIGJlIHJlc2V0IGF0IGVhY2ggRE9NIGVs
ZW1lbnQgZm9yIHRhYmxlcywgCisvLyBpbmxpbmUgYmxvY2tzLCBpbmxpbmUgdGFibGVzLCBydW4t
aW5zLCBzaGFkb3cgRE9NIGNyb3NzaW5ncywgZmxvYXRpbmcgZWxlbWVudHMsCisvLyBhbmQgYWJz
b2x1dGUgb3IgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLgorc3RhdGljIGJvb2wgZG9l
c05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUp
Cit7CisgICAgcmV0dXJuIHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBJTkxJTkVfVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBSVU5fSU4KKyAgICAg
ICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgfHwgc3R5bGUtPmRpc3BsYXko
KSA9PSBJTkxJTkVfQk9YIHx8IGlzQXRTaGFkb3dCb3VuZGFyeShlKQorICAgICAgICB8fCBzdHls
ZS0+aXNGbG9hdGluZygpIHx8IHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpOworfQorCitz
dGF0aWMgYm9vbCBpc0Rpc3BsYXlGbGV4aWJsZUJveChFRGlzcGxheSBkaXNwbGF5KQoreworICAg
IHJldHVybiBkaXNwbGF5ID09IEZMRVggfHwgZGlzcGxheSA9PSBJTkxJTkVfRkxFWDsKK30KKwor
dm9pZCBTdHlsZVJlc29sdmVyOjphZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUs
IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCAqZSkKK3sKKyAgICBBU1NFUlQocGFy
ZW50U3R5bGUpOworCisgICAgLy8gQ2FjaGUgb3VyIG9yaWdpbmFsIGRpc3BsYXkuCisgICAgc3R5
bGUtPnNldE9yaWdpbmFsRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpKTsKKworICAgIGlmIChzdHls
ZS0+ZGlzcGxheSgpICE9IE5PTkUpIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIDx0ZD4gdGhh
dCBzcGVjaWZpZXMgYSBmbG9hdCBwcm9wZXJ0eSwgaW4gcXVpcmtzIG1vZGUgd2UganVzdCBkcm9w
IHRoZSBmbG9hdAorICAgICAgICAvLyBwcm9wZXJ0eS4KKyAgICAgICAgLy8gU2l0ZXMgYWxzbyBj
b21tb25seSB1c2UgZGlzcGxheTppbmxpbmUvYmxvY2sgb24gPHRkPnMgYW5kIDx0YWJsZT5zLiBJ
biBxdWlya3MgbW9kZSB3ZSBmb3JjZQorICAgICAgICAvLyB0aGVzZSB0YWdzIHRvIHJldGFpbiB0
aGVpciBkaXNwbGF5IHR5cGVzLgorICAgICAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2Rl
KCkgJiYgZSkgeworICAgICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUodGRUYWcpKSB7CisgICAg
ICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVfQ0VMTCk7CisgICAgICAgICAgICAg
ICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChl
LT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxh
eShzdHlsZS0+aXNEaXNwbGF5SW5saW5lVHlwZSgpID8gSU5MSU5FX1RBQkxFIDogVEFCTEUpOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8IGUt
Pmhhc1RhZ05hbWUodGhUYWcpKSkgeworICAgICAgICAgICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNl
KCkgPT0gS0hUTUxfTk9XUkFQKSB7CisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBpZiB3
ZSBhcmUgcmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYgd2Ugc2hvdWxkIGp1c3QKKyAgICAgICAgICAg
ICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQuIElmIHRoZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBm
aXhlZCwgdGhlbgorICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGFjdHVhbGx5IHVzZSBOT1dS
QVAuCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzRml4ZWQoKSkKKyAgICAg
ICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9STUFMKTsKKyAgICAgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JB
UCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUYWJsZXMgbmV2ZXIg
c3VwcG9ydCB0aGUgLXdlYmtpdC0qIHZhbHVlcyBmb3IgdGV4dC1hbGlnbiBhbmQgd2lsbCByZXNl
dCBiYWNrIHRvIHRoZSBkZWZhdWx0LgorICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRh
YmxlVGFnKSAmJiAoc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9MRUZUIHx8IHN0eWxlLT50
ZXh0QWxpZ24oKSA9PSBXRUJLSVRfQ0VOVEVSIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJL
SVRfUklHSFQpKQorICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihUQVNUQVJUKTsKKwor
ICAgICAgICAvLyBGcmFtZXMgYW5kIGZyYW1lc2V0cyBuZXZlciBob25vciBwb3NpdGlvbjpyZWxh
dGl2ZSBvciBwb3NpdGlvbjphYnNvbHV0ZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8KKyAgICAgICAg
Ly8gZml4IGEgY3Jhc2ggd2hlcmUgYSBzaXRlIHRyaWVzIHRvIHBvc2l0aW9uIHRoZXNlIG9iamVj
dHMuIFRoZXkgYWxzbyBuZXZlciBob25vciBkaXNwbGF5LgorICAgICAgICBpZiAoZSAmJiAoZS0+
aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpKSB7Cisg
ICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOworICAgICAgICAg
ICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAgICAgICB9CisKKyAgICAgICAgLy8gUnVi
eSB0ZXh0IGRvZXMgbm90IHN1cHBvcnQgZmxvYXQgb3IgcG9zaXRpb24uIFRoaXMgbWlnaHQgY2hh
bmdlIHdpdGggZXZvbHV0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAgICBpZiAoZSAm
JiBlLT5oYXNUYWdOYW1lKHJ0VGFnKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9u
KFN0YXRpY1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgb3ZlcnJp
ZGluZyBzdGFydC8td2Via2l0LWF1dG8gbGlrZSB0aGlzLiBEbyBpdCBpbiBodG1sLmNzcyBpbnN0
ZWFkLgorICAgICAgICAvLyBUYWJsZSBoZWFkZXJzIHdpdGggYSB0ZXh0LWFsaWduIG9mIC13ZWJr
aXQtYXV0byB3aWxsIGNoYW5nZSB0aGUgdGV4dC1hbGlnbiB0byBjZW50ZXIuCisgICAgICAgIGlm
IChlICYmIGUtPmhhc1RhZ05hbWUodGhUYWcpICYmIHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBUQVNU
QVJUKQorICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihDRU5URVIpOworCisgICAgICAg
IGlmIChlICYmIGUtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSkKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KEJMT0NLKTsKKworICAgICAgICAvLyBBYnNvbHV0ZS9maXhlZCBwb3NpdGlvbmVk
IGVsZW1lbnRzLCBmbG9hdGluZyBlbGVtZW50cyBhbmQgdGhlIGRvY3VtZW50IGVsZW1lbnQgbmVl
ZCBibG9jay1saWtlIG91dHNpZGUgZGlzcGxheS4KKyAgICAgICAgaWYgKHN0eWxlLT5oYXNPdXRP
ZkZsb3dQb3NpdGlvbigpIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgKGUgJiYgZS0+ZG9jdW1l
bnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkpCisgICAgICAgICAgICBzdHlsZS0+c2V0RGlz
cGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zs
b2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworCisgICAgICAgIC8vIEZJ
WE1FOiBEb24ndCBzdXBwb3J0IHRoaXMgbXV0YXRpb24gZm9yIHBzZXVkbyBzdHlsZXMgbGlrZSBm
aXJzdC1sZXR0ZXIgb3IgZmlyc3QtbGluZSwgc2luY2UgaXQncyBub3QgY29tcGxldGVseQorICAg
ICAgICAvLyBjbGVhciBob3cgdGhhdCBzaG91bGQgd29yay4KKyAgICAgICAgaWYgKHN0eWxlLT5k
aXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0eWxlLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiBz
dHlsZS0+d3JpdGluZ01vZGUoKSAhPSBwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisKKyAgICAgICAgLy8gQWZ0
ZXIgcGVyZm9ybWluZyB0aGUgZGlzcGxheSBtdXRhdGlvbiwgY2hlY2sgdGFibGUgcm93cy4gV2Ug
ZG8gbm90IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOnN0aWNreSBvbgorICAg
ICAgICAvLyB0YWJsZSByb3dzIG9yIGNlbGxzLiBUaGlzIGhhcyBiZWVuIGVzdGFibGlzaGVkIGZv
ciBwb3NpdGlvbjpyZWxhdGl2ZSBpbiBDU1MyLjEgKGFuZCBjYXVzZWQgYSBjcmFzaCBpbiBjb250
YWluaW5nQmxvY2soKQorICAgICAgICAvLyBvbiBzb21lIHNpdGVzKS4KKyAgICAgICAgaWYgKChz
dHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX1JPV19HUk9VUAorICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9GT09URVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpCisgICAg
ICAgICAgICAmJiBzdHlsZS0+aGFzSW5GbG93UG9zaXRpb24oKSkKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7CisKKyAgICAgICAgLy8gd3JpdGluZy1tb2Rl
IGRvZXMgbm90IGFwcGx5IHRvIHRhYmxlIHJvdyBncm91cHMsIHRhYmxlIGNvbHVtbiBncm91cHMs
IHRhYmxlIHJvd3MsIGFuZCB0YWJsZSBjb2x1bW5zLgorICAgICAgICAvLyBGSVhNRTogVGFibGUg
Y2VsbHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgcGVycGVuZGljdWxhciBvciBmbGlwcGVkIHdp
dGggcmVzcGVjdCB0byB0aGUgdGFibGUsIHRob3VnaC4KKyAgICAgICAgaWYgKHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfQ09MVU1OIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1O
X0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQCisgICAgICAg
ICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX1JPVyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19H
Uk9VUAorICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DRUxMKQorICAg
ICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgp
KTsKKworICAgICAgICAvLyBGSVhNRTogU2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBibG9jay1mbG93
IG9uIGZsZXhpYmxlIGJveGVzIHlldCwgZGlzYWxsb3cgc2V0dGluZworICAgICAgICAvLyBvZiBi
bG9jay1mbG93IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZS4K
KyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2NDE4
IC0gRmxleGlibGUgYm94IHN1cHBvcnQuCisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUo
KSAhPSBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlICYmIChzdHlsZS0+ZGlzcGxheSgpID09IEJPWCB8
fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dFdyaXRpbmdNb2RlKFRvcFRvQm90dG9tV3JpdGluZ01vZGUpOworCisgICAgICAgIGlmIChpc0Rp
c3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkgeworICAgICAgICAgICAg
c3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3Bs
YXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9h
dGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKKyAgICAgICAgfQorCisjaWYg
RU5BQkxFKERJQUxPR19FTEVNRU5UKQorICAgICAgICAvLyBQZXIgdGhlIHNwZWMsIHBvc2l0aW9u
ICdzdGF0aWMnIGFuZCAncmVsYXRpdmUnIGluIHRoZSB0b3AgbGF5ZXIgY29tcHV0ZSB0byAnYWJz
b2x1dGUnLgorICAgICAgICBpZiAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSAmJiAoc3R5bGUtPnBv
c2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gfHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gUmVsYXRp
dmVQb3NpdGlvbikpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihBYnNvbHV0ZVBv
c2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKKyAgICAgICAg
fQorI2VuZGlmCisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIG91ciB6LWluZGV4IHZhbHVlIGlz
IG9ubHkgYXBwbGllZCBpZiB0aGUgb2JqZWN0IGlzIHBvc2l0aW9uZWQuCisgICAgaWYgKHN0eWxl
LT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uICYmICFpc0Rpc3BsYXlGbGV4aWJsZUJveChw
YXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkKKyAgICAgICAgc3R5bGUtPnNldEhhc0F1dG9aSW5kZXgo
KTsKKworICAgIC8vIEF1dG8gei1pbmRleCBiZWNvbWVzIDAgZm9yIHRoZSByb290IGVsZW1lbnQg
YW5kIHRyYW5zcGFyZW50IG9iamVjdHMuIFRoaXMgcHJldmVudHMKKyAgICAvLyBjYXNlcyB3aGVy
ZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGJsZW5kZWQgYXMgYSBzaW5nbGUgdW5pdCBlbmQgdXAg
d2l0aCBhIG5vbi10cmFuc3BhcmVudAorICAgIC8vIG9iamVjdCB3ZWRnZWQgaW4gYmV0d2VlbiB0
aGVtLiBBdXRvIHotaW5kZXggYWxzbyBiZWNvbWVzIDAgZm9yIG9iamVjdHMgdGhhdCBzcGVjaWZ5
IHRyYW5zZm9ybXMvbWFza3MvcmVmbGVjdGlvbnMuCisgICAgaWYgKHN0eWxlLT5oYXNBdXRvWklu
ZGV4KCkgJiYgKChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpCisg
ICAgICAgIHx8IHN0eWxlLT5vcGFjaXR5KCkgPCAxLjBmCisgICAgICAgIHx8IHN0eWxlLT5oYXNU
cmFuc2Zvcm1SZWxhdGVkUHJvcGVydHkoKQorICAgICAgICB8fCBzdHlsZS0+aGFzTWFzaygpCisg
ICAgICAgIHx8IHN0eWxlLT5jbGlwUGF0aCgpCisgICAgICAgIHx8IHN0eWxlLT5ib3hSZWZsZWN0
KCkKKyAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpCisgICAgICAgIHx8IHN0eWxlLT5oYXNC
bGVuZE1vZGUoKQorICAgICAgICB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGlja3lQb3NpdGlv
bgorICAgICAgICB8fCAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gRml4ZWRQb3NpdGlvbiAmJiBlICYm
IGUtPmRvY3VtZW50KCktPnBhZ2UoKSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCktPnNldHRpbmdz
KCktPmZpeGVkUG9zaXRpb25DcmVhdGVzU3RhY2tpbmdDb250ZXh0KCkpCisjaWYgRU5BQkxFKEFD
Q0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykKKyAgICAgICAgLy8gVG91Y2ggb3ZlcmZsb3cg
c2Nyb2xsaW5nIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0LgorICAgICAgICB8fCAoKHN0eWxl
LT5vdmVyZmxvd1goKSAhPSBPSElEREVOIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVO
KSAmJiBzdHlsZS0+dXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZygpKQorI2VuZGlmCisjaWYgRU5B
QkxFKERJQUxPR19FTEVNRU5UKQorICAgICAgICB8fCAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSkK
KyNlbmRpZgorICAgICAgICApKQorICAgICAgICBzdHlsZS0+c2V0WkluZGV4KDApOworCisgICAg
Ly8gVGV4dGFyZWEgY29uc2lkZXJzIG92ZXJmbG93IHZpc2libGUgYXMgYXV0by4KKyAgICBpZiAo
ZSAmJiBlLT5oYXNUYWdOYW1lKHRleHRhcmVhVGFnKSkgeworICAgICAgICBzdHlsZS0+c2V0T3Zl
cmZsb3dYKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92
ZXJmbG93WCgpKTsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShzdHlsZS0+b3ZlcmZsb3dZ
KCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1koKSk7CisgICAgfQorCisg
ICAgaWYgKGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oc3R5bGUsIGUpKQorICAgICAgICBz
dHlsZS0+c2V0VGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkp
OworICAgIGVsc2UKKyAgICAgICAgc3R5bGUtPmFkZFRvVGV4dERlY29yYXRpb25zSW5FZmZlY3Qo
c3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOworCisgICAgLy8gSWYgZWl0aGVyIG92ZXJmbG93IHZh
bHVlIGlzIG5vdCB2aXNpYmxlLCBjaGFuZ2UgdG8gYXV0by4KKyAgICBpZiAoc3R5bGUtPm92ZXJm
bG93WCgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPTUFSUVVFRSkKKyAg
ICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPTUFSUVVFRSk7CisgICAgZWxzZSBpZiAoc3R5bGUt
Pm92ZXJmbG93WSgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPTUFSUVVF
RSkKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPTUFSUVVFRSk7CisgICAgZWxzZSBpZiAo
c3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBP
VklTSUJMRSkgeworICAgICAgICAvLyBGSVhNRTogT25jZSB3ZSBpbXBsZW1lbnQgcGFnaW5hdGlv
biBjb250cm9scywgb3ZlcmZsb3cteCBzaG91bGQgZGVmYXVsdCB0byBoaWRkZW4KKyAgICAgICAg
Ly8gaWYgb3ZlcmZsb3cteSBpcyBzZXQgdG8gLXdlYmtpdC1wYWdlZC14IG9yIC13ZWJraXQtcGFn
ZS15LiBGb3Igbm93LCB3ZSdsbCBsZXQgaXQKKyAgICAgICAgLy8gZGVmYXVsdCB0byBhdXRvIHNv
IHdlIGNhbiBhdCBsZWFzdCBzY3JvbGwgdGhyb3VnaCB0aGUgcGFnZXMuCisgICAgICAgIHN0eWxl
LT5zZXRPdmVyZmxvd1goT0FVVE8pOworICAgIH0gZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgp
ID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSkKKyAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WShPQVVUTyk7CisKKyAgICAvLyBDYWxsIHNldFN0eWxlc0ZvclBh
Z2luYXRpb25Nb2RlKCkgaWYgYSBwYWdpbmF0aW9uIG1vZGUgaXMgc2V0IGZvciBhbnkgbm9uLXJv
b3QgZWxlbWVudHMuIElmIHRoZXNlCisgICAgLy8gc3R5bGVzIGFyZSBzcGVjaWZpZWQgb24gYSBy
b290IGVsZW1lbnQsIHRoZW4gdGhleSB3aWxsIGJlIGluY29ycG9yYXRlZCBpbgorICAgIC8vIFN0
eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoKS4KKyAgICBpZiAoKHN0eWxlLT5vdmVyZmxv
d1koKSA9PSBPUEFHRURYIHx8IHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURZKSAmJiAhKGUg
JiYgKGUtPmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgZS0+aGFzVGFnTmFtZShib2R5VGFnKSkpKQor
ICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShXZWJDb3JlOjpwYWdpbmF0aW9uTW9k
ZUZvclJlbmRlclN0eWxlKHN0eWxlKSwgc3R5bGUpOworCisgICAgLy8gVGFibGUgcm93cywgc2Vj
dGlvbnMgYW5kIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBzdXBwb3J0IG92ZXJmbG93OmhpZGRlbiBh
bmQgd2lsbCBpZ25vcmUgc2Nyb2xsL2F1dG8uCisgICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgdGFi
bGUgc2VjdGlvbnMgd2lsbCBzdXBwb3J0IGF1dG8gYW5kIHNjcm9sbC4KKyAgICBpZiAoc3R5bGUt
PmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRQor
ICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUCB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX1JPVykgeworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgp
ICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOKQorICAgICAgICAg
ICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7CisgICAgICAgIGlmIChzdHlsZS0+b3Zl
cmZsb3dZKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pCisg
ICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKyAgICB9CisKKyAgICAv
LyBNZW51bGlzdHMgc2hvdWxkIGhhdmUgdmlzaWJsZSBvdmVyZmxvdworICAgIGlmIChzdHlsZS0+
YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkgeworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZs
b3dYKE9WSVNJQkxFKTsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Cisg
ICAgfQorCisgICAgLy8gQ3VsbCBvdXQgYW55IHVzZWxlc3MgbGF5ZXJzIGFuZCBhbHNvIHJlcGVh
dCBwYXR0ZXJucyBpbnRvIGFkZGl0aW9uYWwgbGF5ZXJzLgorICAgIHN0eWxlLT5hZGp1c3RCYWNr
Z3JvdW5kTGF5ZXJzKCk7CisgICAgc3R5bGUtPmFkanVzdE1hc2tMYXllcnMoKTsKKworICAgIC8v
IERvIHRoZSBzYW1lIGZvciBhbmltYXRpb25zIGFuZCB0cmFuc2l0aW9ucy4KKyAgICBzdHlsZS0+
YWRqdXN0QW5pbWF0aW9ucygpOworICAgIHN0eWxlLT5hZGp1c3RUcmFuc2l0aW9ucygpOworCisg
ICAgLy8gSW1wb3J0YW50OiBJbnRyaW5zaWMgbWFyZ2lucyBnZXQgYWRkZWQgdG8gY29udHJvbHMg
YmVmb3JlIHRoZSB0aGVtZSBoYXMgYWRqdXN0ZWQgdGhlIHN0eWxlLCBzaW5jZSB0aGUgdGhlbWUg
d2lsbAorICAgIC8vIGFsdGVyIGZvbnRzIGFuZCBoZWlnaHRzL3dpZHRocy4KKyAgICBpZiAoZSAm
JiBlLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpICYmIHN0eWxlLT5mb250U2l6ZSgpID49IDExKSB7
CisgICAgICAgIC8vIERvbid0IGFwcGx5IGludHJpbnNpYyBtYXJnaW5zIHRvIGltYWdlIGJ1dHRv
bnMuIFRoZSBkZXNpZ25lciBrbm93cyBob3cgYmlnIHRoZSBpbWFnZXMgYXJlLAorICAgICAgICAv
LyBzbyB3ZSBoYXZlIHRvIHRyZWF0IGFsbCBpbWFnZSBidXR0b25zIGFzIHRob3VnaCB0aGV5IHdl
cmUgZXhwbGljaXRseSBzaXplZC4KKyAgICAgICAgaWYgKCFlLT5oYXNUYWdOYW1lKGlucHV0VGFn
KSB8fCAhc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGUpLT5pc0ltYWdlQnV0dG9uKCkp
CisgICAgICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKKyAgICB9CisKKyAgICAv
LyBMZXQgdGhlIHRoZW1lIGFsc28gaGF2ZSBhIGNyYWNrIGF0IGFkanVzdGluZyB0aGUgc3R5bGUu
CisgICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAgIFJlbmRlclRoZW1lOjpk
ZWZhdWx0VGhlbWUoKS0+YWRqdXN0U3R5bGUodGhpcywgc3R5bGUsIGUsIG1fc3RhdGUuaGFzVUFB
cHBlYXJhbmNlKCksIG1fc3RhdGUuYm9yZGVyRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmREYXRh
KCksIG1fc3RhdGUuYmFja2dyb3VuZENvbG9yKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZSBmaXJz
dC1sZXR0ZXIgcHNldWRvIHN0eWxlLCBkbyBub3Qgc2hhcmUgdGhpcyBzdHlsZS4KKyAgICBpZiAo
c3R5bGUtPmhhc1BzZXVkb1N0eWxlKEZJUlNUX0xFVFRFUikpCisgICAgICAgIHN0eWxlLT5zZXRV
bmlxdWUoKTsKKworICAgIC8vIEZJWE1FOiB3aGVuIGRyb3BwaW5nIHRoZSAtd2Via2l0IHByZWZp
eCBvbiB0cmFuc2Zvcm0tc3R5bGUsIHdlIHNob3VsZCBhbHNvIGhhdmUgb3BhY2l0eSA8IDEgY2F1
c2UgZmxhdHRlbmluZy4KKyAgICBpZiAoc3R5bGUtPnByZXNlcnZlczNEKCkgJiYgKHN0eWxlLT5v
dmVyZmxvd1goKSAhPSBPVklTSUJMRQorICAgICAgICB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0g
T1ZJU0lCTEUKKyAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpKSkKKyAgICAgICAgc3R5bGUt
PnNldFRyYW5zZm9ybVN0eWxlM0QoVHJhbnNmb3JtU3R5bGUzREZsYXQpOworCisgICAgLy8gU2Vh
bWxlc3MgaWZyYW1lcyBiZWhhdmUgbGlrZSBibG9ja3MuIE1hcCB0aGVpciBkaXNwbGF5IHRvIGlu
bGluZS1ibG9jayB3aGVuIG1hcmtlZCBpbmxpbmUuCisgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFt
ZShpZnJhbWVUYWcpICYmIHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0YXRpY19jYXN0
PEhUTUxJRnJhbWVFbGVtZW50Kj4oZSktPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5KCkpCisgICAg
ICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisKKyNpZiBFTkFCTEUoU1ZHKQor
ICAgIGlmIChlICYmIGUtPmlzU1ZHRWxlbWVudCgpKSB7CisgICAgICAgIC8vIFNwZWM6IGh0dHA6
Ly93d3cudzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwjT3ZlcmZsb3dQcm9wZXJ0eQorICAgICAg
ICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9TQ1JPTEwpCisgICAgICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dZKE9ISURERU4pOworICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZ
KCkgPT0gT0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsK
KworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9TQ1JPTEwpCisgICAgICAgICAg
ICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOworICAgICAgICBlbHNlIGlmIChzdHlsZS0+
b3ZlcmZsb3dYKCkgPT0gT0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9W
SVNJQkxFKTsKKworICAgICAgICAvLyBPbmx5IHRoZSByb290IDxzdmc+IGVsZW1lbnQgaW4gYW4g
U1ZHIGRvY3VtZW50IGZyYWdtZW50IHRyZWUgaG9ub3JzIGNzcyBwb3NpdGlvbgorICAgICAgICBp
ZiAoIShlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpICYmIGUtPnBhcmVudE5vZGUoKSAm
JiAhZS0+cGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQoKSkpCisgICAgICAgICAgICBzdHlsZS0+
c2V0UG9zaXRpb24oUmVuZGVyU3R5bGU6OmluaXRpYWxQb3NpdGlvbigpKTsKKworICAgICAgICAv
LyBSZW5kZXJTVkdSb290IGhhbmRsZXMgem9vbWluZyBmb3IgdGhlIHdob2xlIFNWRyBzdWJ0cmVl
LCBzbyBmb3JlaWduT2JqZWN0IGNvbnRlbnQgc2hvdWxkCisgICAgICAgIC8vIG5vdCBiZSBzY2Fs
ZWQgYWdhaW4uCisgICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpmb3JlaWduT2Jq
ZWN0VGFnKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRFZmZlY3RpdmVab29tKFJlbmRlclN0eWxl
Ojppbml0aWFsWm9vbSgpKTsKKyAgICB9CisjZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29sdmVy
OjpjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgLy8gRklY
TUUgKEJVRyA3MjQ3Mik6IFdlIGRvbid0IGFkZCBALXdlYmtpdC1yZWdpb24gcnVsZXMgb2Ygc2Nv
cGVkIHN0eWxlIHNoZWV0cyBmb3IgdGhlIG1vbWVudCwKKyAgICAvLyBzbyBhbGwgcmVnaW9uIHJ1
bGVzIGFyZSBnbG9iYWwgYnkgZGVmYXVsdC4gVmVyaWZ5IHdoZXRoZXIgdGhhdCBjYW4gc3RhbmQg
b3IgbmVlZHMgY2hhbmdpbmcuCisKKyAgICB1bnNpZ25lZCBydWxlc1NpemUgPSBtX3J1bGVTZXRz
LmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgeworICAgICAgICBBU1NF
UlQobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRz
LmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOworICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3Rvciht
X3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQo
aSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgaWYgKG1fcnVsZVNldHMudXNlclN0eWxlKCkpIHsKKyAgICAgICAgcnVsZXNT
aXplID0gbV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0
cy5zaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsr
aSkgeworICAgICAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7CisgICAgICAgICAgICBp
ZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNl
bGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShSZW5kZXJT
dHlsZSogc3R5bGUpCit7CisgICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAg
ICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247CisgICAgZ2V0Rm9udEFu
ZEdseXBoT3JpZW50YXRpb24oc3R5bGUsIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlv
bik7CisKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiA9IHN0eWxl
LT5mb250RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoZm9udERlc2NyaXB0aW9uLm9yaWVudGF0aW9u
KCkgPT0gZm9udE9yaWVudGF0aW9uICYmIGZvbnREZXNjcmlwdGlvbi5ub25DSktHbHlwaE9yaWVu
dGF0aW9uKCkgPT0gZ2x5cGhPcmllbnRhdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgRm9u
dERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIG5l
d0ZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRp
b24pOworICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRp
b24pOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjp1cGRhdGVGb250KCkKK3sKKyAgICBpZiAoIW1fc3Rh
dGUuZm9udERpcnR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNoZWNrRm9yVGV4dFNpemVB
ZGp1c3QoKTsKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3N0YXRlLnN0eWxlKCk7CisgICAg
Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVudFN0eWxlKCkp
OworICAgIGNoZWNrRm9yWm9vbUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsK
KyAgICBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKHN0eWxlKTsKKyAgICBzdHlsZS0+Zm9udCgp
LnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7CisgICAgbV9zdGF0ZS5zZXRGb250RGlydHkoZmFsc2Up
OworfQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpzdHlsZVJ1bGVz
Rm9yRWxlbWVudChFbGVtZW50KiBlLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKK3sKKyAgICBy
ZXR1cm4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoZSwgTk9QU0VVRE8sIHJ1bGVzVG9JbmNs
dWRlKTsKK30KKworUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6cHNldWRv
U3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgUHNldWRvSWQgcHNldWRvSWQsIHVuc2ln
bmVkIHJ1bGVzVG9JbmNsdWRlKQoreworICAgIGlmICghZSB8fCAhZS0+ZG9jdW1lbnQoKS0+aGF2
ZVN0eWxlc2hlZXRzTG9hZGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgbV9zdGF0ZS5z
ZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKKworICAgIGluaXRFbGVt
ZW50KGUpOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCAw
LCBwc2V1ZG9JZCk7CisKKyAgICBNYXRjaFJlc3VsdCBkdW1teTsKKyAgICBpZiAocnVsZXNUb0lu
Y2x1ZGUgJiBVQUFuZFVzZXJDU1NSdWxlcykgeworICAgICAgICAvLyBGaXJzdCB3ZSBtYXRjaCBy
dWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgICAgICBtYXRjaFVBUnVsZXMoZHVt
bXkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgorICAgICAg
ICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAgICAgICBtYXRjaFVzZXJS
dWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKyAgICB9CisKKyAg
ICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgKHJ1bGVzVG9JbmNsdWRlICYgQXV0
aG9yQ1NTUnVsZXMpKSB7CisgICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoIShydWxl
c1RvSW5jbHVkZSAmIENyb3NzT3JpZ2luQ1NTUnVsZXMpKTsKKworICAgICAgICAvLyBDaGVjayB0
aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cy4KKyAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhkdW1t
eSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKworICAgICAgICBtX3N0YXRlLnNl
dFNhbWVPcmlnaW5Pbmx5KGZhbHNlKTsKKyAgICB9CisKKyAgICBtX3N0YXRlLnNldE1vZGUoU2Vs
ZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisKKyAgICByZXR1cm4gbV9zdGF0ZS50YWtl
UnVsZUxpc3QoKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6cnVsZU1hdGNoZXMo
Y29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNl
dWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5
IGJlaGF2aW9yQXRCb3VuZGFyeSkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisg
ICAgaWYgKHJ1bGVEYXRhLmhhc0Zhc3RDaGVja2FibGVTZWxlY3RvcigpKSB7CisgICAgICAgIC8v
IFdlIGtub3cgdGhpcyBzZWxlY3RvciBkb2VzIG5vdCBpbmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVu
dHMuCisgICAgICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBO
T1BTRVVETykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gV2Uga25vdyBh
IHN1ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkg
YmVjYXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxlIGhhc2guCisgICAgICAgIC8vIFRoaXMg
aXMgbGltaXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFt
ZXNwYWNlLgorICAgICAgICBpZiAocnVsZURhdGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGlu
Z0hUTUxCYXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQo
KSkgeworICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQor
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChydWxl
RGF0YS5zZWxlY3RvcigpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9y
Q2hlY2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCkt
PnRhZ1FOYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBTZWxlY3Rv
ckNoZWNrZXJGYXN0UGF0aCBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aChydWxlRGF0YS5zZWxlY3Rv
cigpLCBzdGF0ZS5lbGVtZW50KCkpOworICAgICAgICBpZiAoIXNlbGVjdG9yQ2hlY2tlckZhc3RQ
YXRoLm1hdGNoZXNSaWdodG1vc3RBdHRyaWJ1dGVTZWxlY3RvcigpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRj
aGVzKCk7CisgICAgfQorCisgICAgLy8gU2xvdyBwYXRoLgorICAgIFNlbGVjdG9yQ2hlY2tlciBz
ZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgc3RhdGUubW9kZSgpKTsKKyAgICBTZWxlY3RvckNo
ZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEuc2VsZWN0b3Io
KSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQp
OworICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKKyAgICBjb250ZXh0
LnNjb3BlID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1ZG9JZCA9IHN0YXRlLnBzZXVkb1N0eWxl
UmVxdWVzdCgpLnBzZXVkb0lkOworICAgIGNvbnRleHQuc2Nyb2xsYmFyID0gc3RhdGUucHNldWRv
U3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyOworICAgIGNvbnRleHQuc2Nyb2xsYmFyUGFydCA9IHN0
YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhclBhcnQ7CisgICAgY29udGV4dC5iZWhh
dmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7CisgICAgU2VsZWN0b3JDaGVja2Vy
OjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250ZXh0LCBkeW5hbWljUHNl
dWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7CisgICAgaWYgKG1hdGNoICE9IFNl
bGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPICYm
IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IGR5bmFtaWNQc2V1ZG8pCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZVJl
c29sdmVyOjpjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxl
Y3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICBpZiAoIXJlZ2lvblNlbGVjdG9y
IHx8ICFyZWdpb25FbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBTZWxlY3Rv
ckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIG1fc3RhdGUubW9kZSgpKTsKKyAg
ICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2VsZWN0b3I7IHM7IHMgPSBDU1NT
ZWxlY3Rvckxpc3Q6Om5leHQocykpIHsKKyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rv
ckNoZWNraW5nQ29udGV4dCBzZWxlY3RvckNoZWNraW5nQ29udGV4dChzLCByZWdpb25FbGVtZW50
LCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERpc2FibGVkKTsKKyAgICAgICAgUHNldWRv
SWQgaWdub3JlRHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOworICAgICAgICBpZiAoc2VsZWN0b3JD
aGVja2VyLm1hdGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0LCBpZ25vcmVEeW5hbWljUHNldWRv
LCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkgPT0gU2VsZWN0b3JDaGVja2VyOjpTZWxl
Y3Rvck1hdGNoZXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRoaXMg
aXMgbW9zdGx5IGJvcmluZyBzdHVmZiBvbiBob3cgdG8gYXBwbHkgYSBjZXJ0YWluIHJ1bGUgdG8g
dGhlIHJlbmRlcnN0eWxlLi4uCisKK0xlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9JbnRM
ZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5
bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQoreworICAgIHJl
dHVybiBwcmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4
ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZl
cnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9u
PihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOworfQor
CitMZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvRmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBy
b290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQoreworICAgIHJldHVybiBwcmltaXRpdmVWYWx1
ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRGbG9hdENvbnZlcnNpb24g
fCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252
ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwg
bXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKK30KKwordGVtcGxhdGUgPFN0eWxlUmVz
b2x2ZXI6OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFw
cGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1
bGUqIHJ1bGUsIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlX
aGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAgICBBU1NFUlQoKHByb3Bl
cnR5V2hpdGVsaXN0VHlwZSAhPSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbikgfHwgbV9zdGF0ZS5y
ZWdpb25Gb3JTdHlsaW5nKCkpOworICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBj
b29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxQcm9jZXNzUnVsZShkb2N1bWVu
dCgpLCBydWxlLCB0aGlzKTsKKworICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBwcm9wZXJ0
aWVzLT5wcm9wZXJ0eUNvdW50KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3Bl
cnR5Q291bnQ7ICsraSkgeworICAgICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVy
ZW5jZSBjdXJyZW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlBdChpKTsKKyAgICAgICAgaWYgKGlz
SW1wb3J0YW50ICE9IGN1cnJlbnQuaXNJbXBvcnRhbnQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICBpZiAoaW5oZXJpdGVkT25seSAmJiAhY3VycmVudC5pc0luaGVyaXRlZCgpKSB7
CisgICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgZXhwbGljaXRseSBpbmhl
cml0ZWQsIHdlIG5lZWQgdG8gYXBwbHkgZnVydGhlciBub24taW5oZXJpdGVkIHByb3BlcnRpZXMK
KyAgICAgICAgICAgIC8vIGFzIHRoZXkgbWlnaHQgb3ZlcnJpZGUgdGhlIHZhbHVlIGluaGVyaXRl
ZCBoZXJlLiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb25zIHdpdGgK
KyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gYmUgY2Fj
aGVkLgorICAgICAgICAgICAgQVNTRVJUKCFjdXJyZW50LnZhbHVlKCktPmlzSW5oZXJpdGVkVmFs
dWUoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDU1NQcm9w
ZXJ0eUlEIHByb3BlcnR5ID0gY3VycmVudC5pZCgpOworCisgICAgICAgIGlmIChwcm9wZXJ0eVdo
aXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24gJiYgIVN0eWxlUmVzb2x2ZXI6
OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyAgICAgICAgaWYgKHByb3BlcnR5V2hpdGVs
aXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdEN1ZSAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxp
ZEN1ZVN0eWxlUHJvcGVydHkocHJvcGVydHkpKQorICAgICAgICAgICAgY29udGludWU7CisjZW5k
aWYKKyAgICAgICAgc3dpdGNoIChwYXNzKSB7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisg
ICAgICAgIGNhc2UgVmFyaWFibGVEZWZpbml0aW9uczoKKyAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKENTU1Byb3BlcnR5VmFyaWFibGUgPCBmaXJzdENTU1Byb3BlcnR5LCBDU1NfdmFyaWFibGVf
aXNfYmVmb3JlX2ZpcnN0X3Byb3BlcnR5KTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBD
U1NQcm9wZXJ0eVZhcmlhYmxlKQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVu
dC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAg
ICAgICAgY2FzZSBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzOgorICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoZmlyc3RDU1NQcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUNvbG9yLCBDU1NfY29sb3JfaXNf
Zmlyc3RfcHJvcGVydHkpOworICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHla
b29tID09IENTU1Byb3BlcnR5Q29sb3IgKyAxOCwgQ1NTX3pvb21faXNfZW5kX29mX2ZpcnN0X3By
b3BfcmFuZ2UpOworICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlMaW5lSGVp
Z2h0ID09IENTU1Byb3BlcnR5Wm9vbSArIDEsIENTU19saW5lX2hlaWdodF9pc19hZnRlcl96b29t
KTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9
PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlm
CisgICAgICAgICAgICAvLyBnaXZlIHNwZWNpYWwgcHJpb3JpdHkgdG8gZm9udC14eHgsIGNvbG9y
IHByb3BlcnRpZXMsIGV0YworICAgICAgICAgICAgaWYgKHByb3BlcnR5IDwgQ1NTUHJvcGVydHlM
aW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBj
dXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgLy8gd2UgYXBwbHkgbGluZS1oZWlnaHQgbGF0
ZXIKKyAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5TGluZUhlaWdo
dCkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZShjdXJyZW50LnZh
bHVlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTG93UHJpb3JpdHlQcm9w
ZXJ0aWVzOgorICAgICAgICAgICAgaWYgKHByb3BlcnR5ID4gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0
KQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50LnZh
bHVlKCkpOworICAgICAgICB9CisgICAgfQorICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkUHJvY2Vzc1J1bGUoY29va2llKTsKK30KKwordGVtcGxhdGUgPFN0eWxlUmVzb2x2ZXI6OlN0
eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBib29sIGlzSW1wb3J0
YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9ubHkpCit7
CisgICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpCisgICAgICAgIHJldHVybjsKKworICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKHN0YXRlLnN0eWxlKCktPmluc2lkZUxpbmsoKSAh
PSBOb3RJbnNpZGVMaW5rKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9
IGVuZEluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiBt
YXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldOworICAg
ICAgICAgICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IG1hdGNoZWRQcm9wZXJ0aWVzLmxpbmtN
YXRjaFR5cGU7CisgICAgICAgICAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZXIgdG8gcGFz
cyB0aGVzZSBhcyBhcmd1bWVudHMgYnV0IHRoYXQgcmVxdWlyZXMgY2hhbmdlcyBpbiBtYW55IHBs
YWNlcy4KKyAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShs
aW5rTWF0Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpNYXRjaExpbmspOworICAgICAgICAgICAg
c3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShsaW5rTWF0Y2hUeXBlICYg
U2VsZWN0b3JDaGVja2VyOjpNYXRjaFZpc2l0ZWQpOworCisgICAgICAgICAgICBhcHBseVByb3Bl
cnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJvcGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1
bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwgaW5oZXJpdGVkT25seSwgc3RhdGljX2Nh
c3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVkUHJvcGVydGllcy53aGl0ZWxpc3RUeXBl
KSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0
eWxlKHRydWUpOworICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBpID0gc3Rh
cnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7CisgICAgICAgIGNvbnN0IE1hdGNoZWRQcm9w
ZXJ0aWVzJiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
W2ldOworICAgICAgICBhcHBseVByb3BlcnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJv
cGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwg
aW5oZXJpdGVkT25seSwgc3RhdGljX2Nhc3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVk
UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlKSk7CisgICAgfQorfQorCit1bnNpZ25lZCBTdHlsZVJl
c29sdmVyOjpjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNIYXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0
aWVzKiBwcm9wZXJ0aWVzLCB1bnNpZ25lZCBzaXplKQoreworICAgIAorICAgIHJldHVybiBTdHJp
bmdIYXNoZXI6Omhhc2hNZW1vcnkocHJvcGVydGllcywgc2l6ZW9mKE1hdGNoZWRQcm9wZXJ0aWVz
KSAqIHNpemUpOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQoreworICAg
IHJldHVybiBhLmZpcnN0VUFSdWxlID09IGIuZmlyc3RVQVJ1bGUKKyAgICAgICAgJiYgYS5sYXN0
VUFSdWxlID09IGIubGFzdFVBUnVsZQorICAgICAgICAmJiBhLmZpcnN0QXV0aG9yUnVsZSA9PSBi
LmZpcnN0QXV0aG9yUnVsZQorICAgICAgICAmJiBhLmxhc3RBdXRob3JSdWxlID09IGIubGFzdEF1
dGhvclJ1bGUKKyAgICAgICAgJiYgYS5maXJzdFVzZXJSdWxlID09IGIuZmlyc3RVc2VyUnVsZQor
ICAgICAgICAmJiBhLmxhc3RVc2VyUnVsZSA9PSBiLmxhc3RVc2VyUnVsZTsKK30KKworYm9vbCBv
cGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHls
ZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOworfQor
Citib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQoreworICAgIHJl
dHVybiBhLnByb3BlcnRpZXMgPT0gYi5wcm9wZXJ0aWVzICYmIGEubGlua01hdGNoVHlwZSA9PSBi
LmxpbmtNYXRjaFR5cGU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVy
OjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3Bl
cnRpZXMmIGIpCit7CisgICAgcmV0dXJuICEoYSA9PSBiKTsKK30KKworY29uc3QgU3R5bGVSZXNv
bHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIFN0eWxlUmVzb2x2ZXI6OmZpbmRGcm9t
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYg
bWF0Y2hSZXN1bHQpCit7CisgICAgQVNTRVJUKGhhc2gpOworCisgICAgTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZmluZChoYXNo
KTsKKyAgICBpZiAoaXQgPT0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSYgY2FjaGVJdGVtID0g
aXQtPnZhbHVlOworCisgICAgc2l6ZV90IHNpemUgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCk7CisgICAgaWYgKHNpemUgIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVz
LnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
aXplOyArK2kpIHsKKyAgICAgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ld
ICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllc1tpXSkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgIH0KKyAgICBpZiAoY2FjaGVJdGVtLnJhbmdlcyAhPSBtYXRjaFJlc3VsdC5yYW5nZXMp
CisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAmY2FjaGVJdGVtOworfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHls
ZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgdW5zaWduZWQgaGFzaCwg
Y29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQoreworICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5Td2VlcHMgPSAxMDA7
CisgICAgaWYgKCsrbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dl
ZXAgPj0gbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dlZXBzCisgICAg
ICAgICYmICFtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLmlzQWN0aXZlKCkpIHsK
KyAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlU3dl
ZXBUaW1lSW5TZWNvbmRzID0gNjA7CisgICAgICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3
ZWVwVGltZXIuc3RhcnRPbmVTaG90KG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlU3dlZXBUaW1lSW5T
ZWNvbmRzKTsKKyAgICB9CisKKyAgICBBU1NFUlQoaGFzaCk7CisgICAgTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZUl0ZW0gY2FjaGVJdGVtOworICAgIGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllcy5h
cHBlbmQobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMpOworICAgIGNhY2hlSXRlbS5yYW5n
ZXMgPSBtYXRjaFJlc3VsdC5yYW5nZXM7CisgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGNhY2hl
IHRoZSBvcmlnaW5hbCBSZW5kZXJTdHlsZSBpbnN0YW5jZS4gSXQgbWF5IGJlIGZ1cnRoZXIgbW9k
aWZpZWQuCisgICAgLy8gVGhlIFJlbmRlclN0eWxlIGluIHRoZSBjYWNoZSBpcyByZWFsbHkganVz
dCBhIGhvbGRlciBmb3IgdGhlIHN1YnN0cnVjdHVyZXMgYW5kIG5ldmVyIHVzZWQgYXMtaXMuCisg
ICAgY2FjaGVJdGVtLnJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHN0eWxlKTsKKyAg
ICBjYWNoZUl0ZW0ucGFyZW50UmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocGFyZW50
U3R5bGUpOworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5hZGQoaGFzaCwgY2FjaGVJdGVt
KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjppbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXND
YWNoZSgpCit7CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmNsZWFyKCk7Cit9CisKK3N0
YXRpYyBib29sIGlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IEVsZW1l
bnQqIGVsZW1lbnQsIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlKQoreworICAgIC8vIEZJWE1FOiBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdN
b2RlIG1vZGlmaWVzIHN0YXRlIHdoZW4gYXBwbHlpbmcgdG8gZG9jdW1lbnQgZWxlbWVudC4gV2Ug
Y2FuJ3Qgc2tpcCB0aGUgYXBwbHlpbmcgYnkgY2FjaGluZy4KKyAgICBpZiAoZWxlbWVudCA9PSBl
bGVtZW50LT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSAmJiBlbGVtZW50LT5kb2N1bWVu
dCgpLT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpIHx8IChzdHlsZS0+c3R5bGVUeXBlKCkgIT0g
Tk9QU0VVRE8gJiYgcGFyZW50U3R5bGUtPnVuaXF1ZSgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKHN0eWxlLT56b29tKCkgIT0gUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gUmVu
ZGVyU3R5bGU6OmluaXRpYWxXcml0aW5nTW9kZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgLy8gVGhlIGNhY2hlIGFzc3VtZXMgc3RhdGljIGtub3dsZWRnZSBhYm91dCB3aGljaCBwcm9w
ZXJ0aWVzIGFyZSBpbmhlcml0ZWQuCisgICAgaWYgKHBhcmVudFN0eWxlLT5oYXNFeHBsaWNpdGx5
SW5oZXJpdGVkUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhj
b25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7
CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAg
dW5zaWduZWQgY2FjaGVIYXNoID0gbWF0Y2hSZXN1bHQuaXNDYWNoZWFibGUgPyBjb21wdXRlTWF0
Y2hlZFByb3BlcnRpZXNIYXNoKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmRhdGEoKSwg
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKSA6IDA7CisgICAgYm9vbCBhcHBs
eUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hl
SXRlbSogY2FjaGVJdGVtID0gMDsKKyAgICBpZiAoY2FjaGVIYXNoICYmIChjYWNoZUl0ZW0gPSBm
aW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCkpKSB7
CisgICAgICAgIC8vIFdlIGNhbiBidWlsZCB1cCB0aGUgc3R5bGUgYnkgY29weWluZyBub24taW5o
ZXJpdGVkIHByb3BlcnRpZXMgZnJvbSBhbiBlYXJsaWVyIHN0eWxlIG9iamVjdCBidWlsdCB1c2lu
ZyB0aGUgc2FtZSBleGFjdAorICAgICAgICAvLyBzdHlsZSBkZWNsYXJhdGlvbnMuIFdlIHRoZW4g
b25seSBuZWVkIHRvIGFwcGx5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcywgaWYgYW55LCBhcyB0
aGVpciB2YWx1ZXMgY2FuIGRlcGVuZCBvbiB0aGUgCisgICAgICAgIC8vIGVsZW1lbnQgY29udGV4
dC4gVGhpcyBpcyBmYXN0IGFuZCBzYXZlcyBtZW1vcnkgYnkgcmV1c2luZyB0aGUgc3R5bGUgZGF0
YSBzdHJ1Y3R1cmVzLgorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jb3B5Tm9uSW5oZXJpdGVkRnJv
bShjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKKyAgICAgICAgaWYgKHN0YXRlLnBhcmVu
dFN0eWxlKCktPmluaGVyaXRlZERhdGFTaGFyZWQoY2FjaGVJdGVtLT5wYXJlbnRSZW5kZXJTdHls
ZS5nZXQoKSkgJiYgIWlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSkgeworICAgICAgICAgICAg
RUluc2lkZUxpbmsgbGlua1N0YXR1cyA9IHN0YXRlLnN0eWxlKCktPmluc2lkZUxpbmsoKTsKKyAg
ICAgICAgICAgIC8vIElmIHRoZSBjYWNoZSBpdGVtIHBhcmVudCBzdHlsZSBoYXMgaWRlbnRpY2Fs
IGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJyZW50IHBhcmVudCBzdHlsZSB0aGVuIHRo
ZQorICAgICAgICAgICAgLy8gcmVzdWx0aW5nIHN0eWxlIHdpbGwgYmUgaWRlbnRpY2FsIHRvby4g
V2UgY29weSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMgb3ZlciBmcm9tIHRoZSBjYWNoZSBhbmQg
YXJlIGRvbmUuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShjYWNoZUl0
ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKKworICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSB0
aGUgbGluayBzdGF0dXMgaXMgdHJlYXRlZCBsaWtlIGFuIGluaGVyaXRlZCBwcm9wZXJ0eS4gV2Ug
bmVlZCB0byBleHBsaWNpdGx5IHJlc3RvcmUgaXQuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IHRydWU7IAorICAgIH0KKworI2lmIEVO
QUJMRShDU1NfVkFSSUFCTEVTKQorICAgIC8vIEZpcnN0IGFwcGx5IGFsbCB2YXJpYWJsZSBkZWZp
bml0aW9ucywgYXMgdGhleSBtYXkgYmUgdXNlZCBkdXJpbmcgYXBwbGljYXRpb24gb2YgbGF0ZXIg
cHJvcGVydGllcy4KKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlv
bnM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5y
YW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJs
ZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0
VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVk
T25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPiht
YXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJl
c3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyNlbmRpZgorCisg
ICAgLy8gTm93IHdlIGhhdmUgYWxsIG9mIHRoZSBtYXRjaGVkIHJ1bGVzIGluIHRoZSBhcHByb3By
aWF0ZSBvcmRlci4gV2FsayB0aGUgcnVsZXMgYW5kIGFwcGx5CisgICAgLy8gaGlnaC1wcmlvcml0
eSBwcm9wZXJ0aWVzIGZpcnN0LCBpLmUuLCB0aG9zZSBwcm9wZXJ0aWVzIHRoYXQgb3RoZXIgcHJv
cGVydGllcyBkZXBlbmQgb24uCisgICAgLy8gVGhlIG9yZGVyIGlzICgxKSBoaWdoLXByaW9yaXR5
IG5vdCBpbXBvcnRhbnQsICgyKSBoaWdoLXByaW9yaXR5IGltcG9ydGFudCwgKDMpIG5vcm1hbCBu
b3QgaW1wb3J0YW50CisgICAgLy8gYW5kICg0KSBub3JtYWwgaW1wb3J0YW50LgorICAgIHN0YXRl
LnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQ
cmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0
cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5n
ZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNl
clJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxI
aWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKKworICAgIGlmIChjYWNoZUl0ZW0gJiYgY2FjaGVJdGVtLT5yZW5kZXJTdHls
ZS0+ZWZmZWN0aXZlWm9vbSgpICE9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSkgewor
ICAgICAgICBzdGF0ZS5zZXRGb250RGlydHkodHJ1ZSk7CisgICAgICAgIGFwcGx5SW5oZXJpdGVk
T25seSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBn
byBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KKyAgICB1cGRhdGVGb250KCk7CisKKyAgICAvLyBM
aW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250
LXNpemUuCisgICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAgICBhcHBseVBy
b3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwor
CisgICAgLy8gTWFueSBwcm9wZXJ0aWVzIGRlcGVuZCBvbiB0aGUgZm9udC4gSWYgaXQgY2hhbmdl
cyB3ZSBqdXN0IGFwcGx5IGFsbCBwcm9wZXJ0aWVzLgorICAgIGlmIChjYWNoZUl0ZW0gJiYgY2Fj
aGVJdGVtLT5yZW5kZXJTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCkgIT0gc3RhdGUuc3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCkpCisgICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOwor
CisgICAgLy8gTm93IGRvIHRoZSBub3JtYWwgcHJpb3JpdHkgVUEgcHJvcGVydGllcy4KKyAgICBh
cHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQs
IGZhbHNlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdl
cy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIAorICAgIC8vIENhY2hlIG91
ciBib3JkZXIgYW5kIGJhY2tncm91bmQgc28gdGhhdCB3ZSBjYW4gZXhhbWluZSB0aGVtIGxhdGVy
LgorICAgIHN0YXRlLmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOworICAgIAorICAgIC8vIE5v
dyBkbyB0aGUgYXV0aG9yIGFuZCB1c2VyIG5vcm1hbCBwcmlvcml0eSBwcm9wZXJ0aWVzIGFuZCBh
bGwgdGhlICFpbXBvcnRhbnQgcHJvcGVydGllcy4KKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
PExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCBtYXRjaFJlc3VsdC5y
YW5nZXMubGFzdFVBUnVsZSArIDEsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxM
b3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5n
ZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFw
cGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0
eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RV
c2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRP
bmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4o
bWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAKKyAgICAv
LyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAg
bG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICBBU1NFUlQoIXN0YXRlLmZvbnREaXJ0
eSgpKTsKKyAgICAKKyAgICBpZiAoY2FjaGVJdGVtIHx8ICFjYWNoZUhhc2gpCisgICAgICAgIHJl
dHVybjsKKyAgICBpZiAoIWlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRl
LmVsZW1lbnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSkpCisgICAgICAg
IHJldHVybjsKKyAgICBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuc3R5bGUoKSwg
c3RhdGUucGFyZW50U3R5bGUoKSwgY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCk7Cit9CisKK3N0YXRp
YyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBj
b25zdCBTdHlsZVJ1bGVQYWdlKiByMikKK3sKKyAgICByZXR1cm4gcjEtPnNlbGVjdG9yKCktPnNw
ZWNpZmljaXR5KCkgPCByMi0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKTsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0
KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcm
IHBhZ2VOYW1lKQoreworICAgIGlmICghcnVsZXMpCisgICAgICAgIHJldHVybjsKKworICAgIFZl
Y3RvcjxTdHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VSdWxlczsKKyAgICBtYXRjaFBhZ2VSdWxl
c0Zvckxpc3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMtPnBhZ2VSdWxlcygpLCBpc0xlZnRQYWdl
LCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpOworICAgIGlmIChtYXRjaGVkUGFnZVJ1bGVzLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RkOjpzdGFibGVfc29ydChtYXRjaGVkUGFn
ZVJ1bGVzLmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMuZW5kKCksIGNvbXBhcmVQYWdlUnVsZXMp
OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRQYWdlUnVsZXMuc2l6ZSgp
OyBpKyspCisgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgbWF0Y2hlZFBhZ2VS
dWxlc1tpXS0+cHJvcGVydGllcygpKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0
b3JDb21wb25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdl
LCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZvciAo
Y29uc3QgQ1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVjdG9yOyBjb21wb25lbnQ7IGNvbXBv
bmVudCA9IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7CisgICAgICAgIGlmIChjb21wb25lbnQt
Pm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgeworICAgICAgICAgICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FOYW1lKCkubG9jYWxOYW1lKCk7Cisg
ICAgICAgICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIGxvY2FsTmFtZSAhPSBwYWdl
TmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAg
ICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9U
eXBlKCk7CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVm
dFBhZ2UgJiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NT
ZWxlY3Rvcjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAo
cHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFn
ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFBhZ2VS
dWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBW
ZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmly
c3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHlsZVJ1bGVQYWdlKiBydWxl
ID0gcnVsZXNbaV07CisKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMo
cnVsZS0+c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9w
ZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4KKyAgICAgICAgY29uc3QgU3R5bGVQcm9w
ZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKCFw
cm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxl
cy4KKyAgICAgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKKyAgICB9Cit9CisKK2Jvb2wg
U3R5bGVSZXNvbHZlcjo6aXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIGJv
b2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50
U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICBpc0ZpcnN0UGFnZUxl
ZnQgPSB0cnVlOworCisgICAgcmV0dXJuIChwYWdlSW5kZXggKyAoaXNGaXJzdFBhZ2VMZWZ0ID8g
MSA6IDApKSAlIDI7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6aXNGaXJzdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogSW4gY2FzZSBvZiBmb3JjZWQgbGVmdC9y
aWdodCBwYWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUgdGhlIGZpcnN0IHBhZ2Uu
CisgICAgcmV0dXJuICghcGFnZUluZGV4KTsKK30KKworU3RyaW5nIFN0eWxlUmVzb2x2ZXI6OnBh
Z2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEltcGxl
bWVudCBwYWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBwaW5nLgorICAgIHJldHVybiAiIjsKK30K
Kwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlE
IGlkLCBDU1NWYWx1ZSogdmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBpbml0RWxl
bWVudCgwKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgMCwg
c3R5bGUpOworICAgIG1fc3RhdGUuc2V0U3R5bGUoc3R5bGUpOworICAgIGFwcGx5UHJvcGVydHlU
b0N1cnJlbnRTdHlsZShpZCwgdmFsdWUpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5
UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUp
Cit7CisgICAgaWYgKHZhbHVlKQorICAgICAgICBhcHBseVByb3BlcnR5KGlkLCB2YWx1ZSk7Cit9
CisKK2lubGluZSBib29sIGlzVmFsaWRWaXNpdGVkTGlua1Byb3BlcnR5KENTU1Byb3BlcnR5SUQg
aWQpCit7CisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6
CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIENTU1Byb3BlcnR5RmlsbDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5U3Ryb2tlOgorI2VuZGlmCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1
bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8g
aHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxl
LXJ1bGUKKy8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9u
IHN0eWxpbmcgcHJvcGVydGllcy4KK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRS
ZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkg
eworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUNvbG9yOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBi
cmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZiBFTkFCTEUoVklERU9f
VFJBQ0spCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1l
bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFn
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udEZhbWlseToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWln
aHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91
dGxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5T3V0bGluZU9mZnNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVZp
c2liaWxpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHREZWNvcmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30K
KyNlbmRpZgorLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFy
ZWQgdG8gQ1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKKy8vIG9mIGVh
Y2ggaW5kaXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENT
U1ByaW1pdGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigpCisvLyBtdWx0aXBsaWVzIGVhY2ggcmVz
b2x2ZWQgbGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVl
ZCB0byBkaXNhYmxlIHRoYXQuCisvLyBUaG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUg
YXBwbGllZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIv
cGFkZGluZy4uLikKKy8vIG5lZWQgdG8gcmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0
aGUgcGFyZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCisvLyB3
aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZv
ciBTVkcgdGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNjYWxlLAorLy8gaWYgd2UnZCBwYXNzIGEg
MS4wIHpvb20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9y
IG9mIDEuMCBmb3Igc3BlY2lmaWMKKy8vIHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQg
dG8gc2NhbGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2lu
Zy9mb250LXNpemUpLgorYm9vbCBTdHlsZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQorewor
ICAgIHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdF
bGVtZW50KCk7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJp
bWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYg
c3RhdGUsIExlbmd0aCYgd29ya2luZ0xlbmd0aCkKK3sKKyAgICBpZiAocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5Db250ZW50KSB7CisgICAgICAgIHdvcmtp
bmdMZW5ndGggPSBMZW5ndGgoTWluQ29udGVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtp
dE1heENvbnRlbnQpIHsKKyAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50
KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgd29ya2luZ0xlbmd0aCA9IHBy
aW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBl
cmNlbnRDb252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252
ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0
eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7CisgICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmlu
ZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5p
c0xlbmd0aCgpKQorICAgICAgICB3b3JraW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVl
LT5pc1F1aXJrVmFsdWUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wg
Y3JlYXRlR3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1Np
emUpCit7CisgICAgUGFpciogbWluTWF4VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdl
dFBhaXJWYWx1ZSgpOworICAgIGlmICghbWluTWF4VHJhY2tCcmVhZHRoKSB7CisgICAgICAgIExl
bmd0aCB3b3JraW5nTGVuZ3RoOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgo
cHJpbWl0aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICB0cmFja1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRo
OworICAgIExlbmd0aCBtYXhUcmFja0JyZWFkdGg7CisgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tC
cmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0
aCkgfHwgIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQo
KSwgc3RhdGUsIG1heFRyYWNrQnJlYWR0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IHRyYWNrU2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwor
ICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChD
U1NWYWx1ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9y
PEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzKQoreworICAgIGlmICghdmFsdWUtPmlzVmFsdWVM
aXN0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRl
cmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgQ1NT
VmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlz
UHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBH
cmlkVHJhY2tTaXplIHRyYWNrU2l6ZTsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5N
YXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJh
Y2tTaXplKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0cmFja1NpemVz
LmFwcGVuZCh0cmFja1NpemUpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGlj
IGJvb2wgY3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJh
Y2tTaXplPiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQor
eworICAgIC8vIEhhbmRsZSAnbm9uZScuCisgICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVl
KCkpIHsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHJldHVybiBwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmU7CisgICAgfQorCisgICAgcmV0dXJu
IGNyZWF0ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Cit9CisKKwor
c3RhdGljIGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0
aW9uJiBwb3NpdGlvbikKK3sKKyAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVn
ZXI+IHwgJ2F1dG8nCisgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICBpZiAocHJpbWl0
aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVl
LT5pc051bWJlcigpKTsKKyAgICBwb3NpdGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZl
VmFsdWUtPmdldEludFZhbHVlKCkpOworICAgIHJldHVybiB0cnVlOworfQorCisjaWYgRU5BQkxF
KENTU19WQVJJQUJMRVMpCitzdGF0aWMgYm9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1
ZSogdmFsdWUpCit7CisgICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFz
VmFyaWFibGVSZWZlcmVuY2UoKTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRp
b25WYWx1ZSgpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFs
dWUpLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOworCisgICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RW
YWx1ZSgpKSB7CisgICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogZGlyZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKTsKKyAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7CisgICAgICAgIENT
U1ZhbHVlKiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNrKCk7CisgICAgICAgIHJldHVybiAoZGly
ZWN0aW9uICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYg
aGFzVmFyaWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZl
cmVuY2UobWFzaykpOworICAgIH0KKworICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9
IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgaWYgKGhhc1Zhcmlh
YmxlUmVmZXJlbmNlKGkudmFsdWUoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZh
cmlhYmxlcyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBh
aXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKQoreworICAgIHN0
ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJp
YWxpemVSZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsK
KworICAgIGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQorICAgICAg
ICByZXR1cm47IC8vIGN5Y2xlIGRldGVjdGVkLgorCisgICAga25vd25FeHByZXNzaW9ucy5hcHBl
bmQoZXhwcmVzc2lvbik7CisKKyAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0
byByZS1wYXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0
aW9uIGxpdmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdlIGRvIGl0IHRoZXJlLgorICAgIFJlZlB0
cjxTdHlsZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUo
KTsKKyAgICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBl
eHByZXNzaW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50KCkpKQorICAgICAgICByZXR1cm47IC8v
IGV4cHJlc3Npb24gZmFpbGVkIHRvIHBhcnNlLgorCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHJlc3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBpKyspIHsKKyAgICAgICAgU3R5bGVQcm9w
ZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5
QXQoaSk7CisgICAgICAgIGlmIChwcm9wZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUg
JiYgaGFzVmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHkudmFsdWUoKSkpCisgICAgICAgICAgICBy
ZXNvbHZlVmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhw
cmVzc2lvbnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3Bl
cnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCkpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZh
bHVlKQoreworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGlmIChpZCAhPSBDU1NQcm9w
ZXJ0eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHZhbHVlKSkgeworICAgICAgICBW
ZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25z
OworICAgICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIENTUyB2YXJpYWJsZXMg
ZG9uJ3QgcmVzb2x2ZSBzaG9ydGhhbmRzIGF0IHBhcnNpbmcgdGltZSwgc28gdGhpcyBzaG91bGQg
YmUgKmFmdGVyKiBoYW5kbGluZyB2YXJpYWJsZXMuCisgICAgQVNTRVJUX1dJVEhfTUVTU0FHRSgh
aXNFeHBhbmRlZFNob3J0aGFuZChpZCksICJTaG9ydGhhbmQgcHJvcGVydHkgaWQgPSAlZCB3YXNu
J3QgZXhwYW5kZWQgYXQgcGFyc2luZyB0aW1lIiwgaWQpOworCisgICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKKyAgICBib29sIGlzSW5oZXJpdCA9IHN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1
ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpOworICAgIGJvb2wgaXNJbml0aWFsID0gdmFsdWUtPmlzSW5p
dGlhbFZhbHVlKCkgfHwgKCFzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVk
VmFsdWUoKSk7CisKKyAgICBBU1NFUlQoIWlzSW5oZXJpdCB8fCAhaXNJbml0aWFsKTsgLy8gaXNJ
bmhlcml0IC0+ICFpc0luaXRpYWwgJiYgaXNJbml0aWFsIC0+ICFpc0luaGVyaXQKKyAgICBBU1NF
UlQoIWlzSW5oZXJpdCB8fCAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxl
KCkpKTsgLy8gaXNJbmhlcml0IC0+IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUucGFyZW50
U3R5bGUoKSkKKworICAgIGlmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkg
JiYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgfHwgIWlzVmFsaWRW
aXNpdGVkTGlua1Byb3BlcnR5KGlkKSkpIHsKKyAgICAgICAgLy8gTGltaXQgdGhlIHByb3BlcnRp
ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvbmx5IHRoZSBvbmVzIGhvbm9yZWQgYnkgOnZpc2l0
ZWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNJbmhlcml0ICYmICFzdGF0
ZS5wYXJlbnRTdHlsZSgpLT5oYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpICYmICFD
U1NQcm9wZXJ0eTo6aXNJbmhlcml0ZWRQcm9wZXJ0eShpZCkpCisgICAgICAgIHN0YXRlLnBhcmVu
dFN0eWxlKCktPnNldEhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCk7CisKKyNpZiBF
TkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkg
eworICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTih2YWx1ZS0+aXNWYXJp
YWJsZVZhbHVlKCkpOworICAgICAgICBDU1NWYXJpYWJsZVZhbHVlKiB2YXJpYWJsZSA9IHN0YXRp
Y19jYXN0PENTU1ZhcmlhYmxlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIEFTU0VSVCghdmFyaWFi
bGUtPm5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT52YWx1ZSgp
LmlzRW1wdHkoKSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFZhcmlhYmxlKHZhcmlhYmxl
LT5uYW1lKCksIHZhcmlhYmxlLT52YWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNl
bmRpZgorCisgICAgLy8gQ2hlY2sgbG9va3VwIHRhYmxlIGZvciBpbXBsZW1lbnRhdGlvbnMgYW5k
IHVzZSB3aGVuIGF2YWlsYWJsZS4KKyAgICBjb25zdCBQcm9wZXJ0eUhhbmRsZXImIGhhbmRsZXIg
PSBtX3N0eWxlQnVpbGRlci5wcm9wZXJ0eUhhbmRsZXIoaWQpOworICAgIGlmIChoYW5kbGVyLmlz
VmFsaWQoKSkgeworICAgICAgICBpZiAoaXNJbmhlcml0KQorICAgICAgICAgICAgaGFuZGxlci5h
cHBseUluaGVyaXRWYWx1ZShpZCwgdGhpcyk7CisgICAgICAgIGVsc2UgaWYgKGlzSW5pdGlhbCkK
KyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbml0aWFsVmFsdWUoaWQsIHRoaXMpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBoYW5kbGVyLmFwcGx5VmFsdWUoaWQsIHRoaXMsIHZhbHVlKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRp
dmVWYWx1ZSA9IHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHZhbHVlKSA6IDA7CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3RhdGUu
c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworCisgICAgLy8gV2hhdCBmb2xsb3dzIGlzIGEgbGlz
dCB0aGF0IG1hcHMgdGhlIENTUyBwcm9wZXJ0aWVzIGludG8gdGhlaXIgY29ycmVzcG9uZGluZyBm
cm9udC1lbmQKKyAgICAvLyBSZW5kZXJTdHlsZSB2YWx1ZXMuCisgICAgc3dpdGNoIChpZCkgewor
ICAgIC8vIGxpc3RzCisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6CisgICAgICAgIC8vIGxp
c3Qgb2Ygc3RyaW5nLCB1cmksIGNvdW50ZXIsIGF0dHIsIGkKKyAgICAgICAgeworICAgICAgICAg
ICAgLy8gRklYTUU6IEluIENTUzMsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gaW5oZXJpdCBjb250
ZW50LiBJbiBDU1MyIGl0IGlzIG5vdC4gVGhpcworICAgICAgICAgICAgLy8gbm90ZSBpcyBhIHJl
bWluZGVyIHRoYXQgZXZlbnR1YWxseSAiaW5oZXJpdCIgbmVlZHMgdG8gYmUgc3VwcG9ydGVkLgor
CisgICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgYm9vbCBkaWRTZXQgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsg
aS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGkudmFsdWUo
KTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzR3JhZGllbnRWYWx1ZSgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRl
ZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KGl0ZW0pLT5ncmFk
aWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSksIGRpZFNldCk7CisgICAgICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dENvbnRlbnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRpY19jYXN0PENTU0ltYWdl
R2VuZXJhdG9yVmFsdWUqPihpdGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRp
ZFNldCA9IHRydWU7CisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisgICAgICAgICAgICAgICAg
fSBlbHNlIGlmIChpdGVtLT5pc0ltYWdlU2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9w
ZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlU2V0VmFsdWUqPihpdGVtKSksIGRpZFNl
dCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisjZW5kaWYKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZVZhbHVlKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjYWNoZWRPclBl
bmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZh
bHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
Y29udGVudFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsKKwor
ICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWUtPmlzU3RyaW5nKCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb250ZW50VmFsdWUtPmdldFN0
cmluZ1ZhbHVlKCkuaW1wbCgpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQg
PSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFZhbHVlLT5pc0F0dHIo
KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2FuIGEgbmFtZXNwYWNlIGJlIHNw
ZWNpZmllZCBmb3IgYW4gYXR0cihmb28pPworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUu
c3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8pCisgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0VW5pcXVlKCk7
CisgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgYXR0cihudWxsQXRvbSwgY29udGVu
dFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgbnVsbEF0b20pOworICAgICAgICAgICAg
ICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlID0gc3RhdGUuZWxlbWVudCgpLT5nZXRB
dHRyaWJ1dGUoYXR0cik7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENv
bnRlbnQodmFsdWUuaXNOdWxsKCkgPyBlbXB0eUF0b20gOiB2YWx1ZS5pbXBsKCksIGRpZFNldCk7
CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAg
IC8vIHJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBhZmZlY3RzIHRo
ZSBzdHlsZQorICAgICAgICAgICAgICAgICAgICBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJ
blJ1bGVzLmFkZChhdHRyLmxvY2FsTmFtZSgpLmltcGwoKSk7CisgICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChjb250ZW50VmFsdWUtPmlzQ291bnRlcigpKSB7CisgICAgICAgICAgICAgICAgICAg
IENvdW50ZXIqIGNvdW50ZXJWYWx1ZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0Q291bnRlclZhbHVlKCk7
CisgICAgICAgICAgICAgICAgICAgIEVMaXN0U3R5bGVUeXBlIGxpc3RTdHlsZVR5cGUgPSBOb25l
TGlzdFN0eWxlOworICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdFN0eWxlSWRlbnQgPSBjb3Vu
dGVyVmFsdWUtPmxpc3RTdHlsZUlkZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0
U3R5bGVJZGVudCAhPSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0
U3R5bGVUeXBlID0gc3RhdGljX2Nhc3Q8RUxpc3RTdHlsZVR5cGU+KGxpc3RTdHlsZUlkZW50IC0g
Q1NTVmFsdWVEaXNjKTsKKyAgICAgICAgICAgICAgICAgICAgT3duUHRyPENvdW50ZXJDb250ZW50
PiBjb3VudGVyID0gYWRvcHRQdHIobmV3IENvdW50ZXJDb250ZW50KGNvdW50ZXJWYWx1ZS0+aWRl
bnRpZmllcigpLCBsaXN0U3R5bGVUeXBlLCBjb3VudGVyVmFsdWUtPnNlcGFyYXRvcigpKSk7Cisg
ICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY291bnRlci5yZWxl
YXNlKCksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50
VmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU9w
ZW5RdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoT1BFTl9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZUNsb3NlUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRDb250ZW50KENMT1NFX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAg
ICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9PcGVuUXVvdGU6CisgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KE5PX09QRU5fUVVPVEUs
IGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVOb0Nsb3NlUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRDb250ZW50KE5PX0NMT1NFX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICAg
ICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFs
IGFuZCBub25lIGRvIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgICAgICAgICAgICAgICAgICAgICAg
ICB7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmICghZGlkU2V0KQorICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPmNsZWFyQ29udGVudCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVF1b3RlczoKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHN0YXRlLnBhcmVudFN0eWxlKCktPnF1
b3RlcygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNJ
bml0aWFsKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoMCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLT5pc1ZhbHVlTGlz
dCgpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NW
YWx1ZUxpc3QqPih2YWx1ZSk7CisgICAgICAgICAgICBSZWZQdHI8UXVvdGVzRGF0YT4gcXVvdGVz
ID0gUXVvdGVzRGF0YTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IGxpc3QtPmxlbmd0aCgpOyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSog
Zmlyc3QgPSBsaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOworICAgICAgICAgICAgICAg
IC8vIGl0ZW0oKSByZXR1cm5zIG51bGwgaWYgb3V0IG9mIGJvdW5kcyBzbyB0aGlzIGlzIHNhZmUu
CisgICAgICAgICAgICAgICAgQ1NTVmFsdWUqIHNlY29uZCA9IGxpc3QtPml0ZW0oaSArIDEpOwor
ICAgICAgICAgICAgICAgIGlmICghc2Vjb25kKQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihmaXJz
dC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNV
UklUWV9JTVBMSUNBVElPTihzZWNvbmQtPmlzUHJpbWl0aXZlVmFsdWUoKSk7CisgICAgICAgICAg
ICAgICAgU3RyaW5nIHN0YXJ0UXVvdGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGZpcnN0KS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5kUXVv
dGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHNlY29uZCktPmdldFN0cmluZ1Zh
bHVlKCk7CisgICAgICAgICAgICAgICAgcXVvdGVzLT5hZGRQYWlyKHN0ZDo6bWFrZV9wYWlyKHN0
YXJ0UXVvdGUsIGVuZFF1b3RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRRdW90ZXMocXVvdGVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0UXVvdGVzKFF1b3Rlc0RhdGE6OmNyZWF0ZSgpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6IHsKKyAgICAg
ICAgLy8gbGlzdCBvZiBzdHJpbmdzIGFuZCBpZHMKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgewor
ICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIHBhcmVudEZvbnREZXNjcmlwdGlvbiA9IHN0YXRl
LnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgRm9udERlc2Ny
aXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigp
OworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkocGFyZW50Rm9u
dERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0RmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpKTsKKyAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmllZEZvbnQocGFyZW50Rm9udERlc2Ny
aXB0aW9uLmlzU3BlY2lmaWVkRm9udCgpKTsKKyAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlv
bihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGluaXRp
YWxEZXNjID0gRm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAg
ICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCB0aGUgc2l6ZSB0byBhY2NvdW50IGZvciB0aGUg
Z2VuZXJpYyBmYW1pbHkgY2hhbmdlIGZyb20gbW9ub3NwYWNlCisgICAgICAgICAgICAvLyB0byBu
b24tbW9ub3NwYWNlLgorICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6
ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCkpCisgICAgICAgICAg
ICAgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9j
dW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkg
LSAxLCBmYWxzZSkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoaW5pdGlhbERlc2MuZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAgICAgICAgIGlmICghaW5pdGlh
bERlc2MuZmlyc3RGYW1pbHkoKS5mYW1pbHlJc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldEZhbWlseShpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpKTsKKyAgICAg
ICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlw
dGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBGb250RmFt
aWx5JiBmaXJzdEZhbWlseSA9IGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpOworICAgICAg
ICBGb250RmFtaWx5KiBjdXJyRmFtaWx5ID0gMDsKKworICAgICAgICAvLyBCZWZvcmUgbWFwcGlu
ZyBpbiBhIG5ldyBmb250LWZhbWlseSBwcm9wZXJ0eSwgd2Ugc2hvdWxkIHJlc2V0IHRoZSBnZW5l
cmljIGZhbWlseS4KKyAgICAgICAgYm9vbCBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSA9
IGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCk7CisgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOworCisg
ICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsg
aS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwor
ICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogY29udGVudFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsKKyAgICAgICAgICAgIEF0
b21pY1N0cmluZyBmYWNlOworICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1l
bnRTZXR0aW5ncygpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkK
KyAgICAgICAgICAgICAgICBmYWNlID0gY29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwor
ICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gg
KGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVXZWJraXRCb2R5OgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2V0dGluZ3MtPnN0YW5k
YXJkRm9udEZhbWlseSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlU2VyaWY6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXJp
ZkZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkoRm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWlseSk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTYW5zU2VyaWY6CisgICAgICAg
ICAgICAgICAgICAgIGZhY2UgPSBzYW5zU2VyaWZGYW1pbHk7CisgICAgICAgICAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2Fuc1Nl
cmlmRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZUN1cnNpdmU6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBjdXJzaXZl
RmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0Zh
bWlseShGb250RGVzY3JpcHRpb246OkN1cnNpdmVGYW1pbHkpOworICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFudGFzeToKKyAgICAgICAg
ICAgICAgICAgICAgZmFjZSA9IGZhbnRhc3lGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6RmFudGFzeUZh
bWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Ug
Q1NTVmFsdWVNb25vc3BhY2U6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBtb25vc3BhY2VG
YW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFt
aWx5KEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFBpY3RvZ3JhcGg6
CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBwaWN0b2dyYXBoRmFtaWx5OworICAgICAgICAg
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRp
b246OlBpY3RvZ3JhcGhGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZmFjZS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJGYW1pbHkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gRmlsbGluZyBpbiB0aGUgZmlyc3QgZmFtaWx5LgorICAgICAgICAgICAgICAg
ICAgICBmaXJzdEZhbWlseS5zZXRGYW1pbHkoZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIGZp
cnN0RmFtaWx5LmFwcGVuZEZhbWlseSgwKTsgLy8gUmVtb3ZlIGFueSBpbmhlcml0ZWQgZmFtaWx5
LWZhbGxiYWNrIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSAmZmlyc3RG
YW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmll
ZEZvbnQoZm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSA9PSBGb250RGVzY3JpcHRpb246
Ok5vRmFtaWx5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAg
ICBSZWZQdHI8U2hhcmVkRm9udEZhbWlseT4gbmV3RmFtaWx5ID0gU2hhcmVkRm9udEZhbWlseTo6
Y3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZhbWlseS0+c2V0RmFtaWx5KGZhY2Up
OworICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5LT5hcHBlbmRGYW1pbHkobmV3RmFtaWx5
KTsKKyAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9IG5ld0ZhbWlseS5nZXQoKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBX
ZSBjYW4ndCBjYWxsIHVzZUZpeGVkRGVmYXVsdFNpemUoKSB1bnRpbCBhbGwgbmV3IGZvbnQgZmFt
aWxpZXMgaGF2ZSBiZWVuIGFkZGVkCisgICAgICAgIC8vIElmIGN1cnJGYW1pbHkgaXMgbm9uLXpl
cm8gdGhlbiB3ZSBzZXQgYXQgbGVhc3Qgb25lIGZhbWlseSBvbiB0aGlzIGRlc2NyaXB0aW9uLgor
ICAgICAgICBpZiAoY3VyckZhbWlseSkgeworICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlv
bi5rZXl3b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCkg
IT0gb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpCisgICAgICAgICAgICAgICAgc2V0Rm9u
dFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NT
VmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgLSAxLCAhb2xkRmFt
aWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpKTsKKworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0
aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICAvLyBTaG9ydGhhbmQgcHJvcGVydGllcy4KKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoK
KyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZv
bnREZXNjcmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwor
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5zcGVjaWZpZWRMaW5lSGVpZ2h0KCkpOworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhl
aWdodFZhbHVlKDApOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBTZXR0
aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICBBU1NFUlQo
c2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3Vt
ZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCisg
ICAgICAgICAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgIGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOworICAgICAgICB9IGVsc2UgaWYg
KHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVp
Z2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAgICAgICAgICAgIHN0YXRl
LnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZv
bnREZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+
c3lzdGVtRm9udChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSwgZm9udERlc2NyaXB0aW9uKTsK
KworICAgICAgICAgICAgLy8gRG91YmxlLWNoZWNrIGFuZCBzZWUgaWYgdGhlIHRoZW1lIGRpZCBh
bnl0aGluZy4gSWYgbm90LCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhlIGZvbnQuCisgICAgICAg
ICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBtb2RlIGFuZCBwcmludGVyIGZvbnQgc2V0
dGluZ3MgYXJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0g
ZG9jdW1lbnRTZXR0aW5ncygpOworICAgICAgICAgICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8v
IElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFs
d2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MKKyAgICAgICAgICAgICAg
ICBpZiAoIXNldHRpbmdzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5k
ZXJpbmdNb2RlKCkpOworICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmlu
dGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1
YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIHpv
b20gZmFjdG9yLgorICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNp
emUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQoKSwgc3RhdGUuc3R5
bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIGZvbnREZXNjcmlwdGlvbi5z
cGVjaWZpZWRTaXplKCksIHVzZVNWR1pvb21SdWxlcygpKSk7CisgICAgICAgICAgICAgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSBpZiAodmFsdWUtPmlzRm9udFZhbHVlKCkpIHsKKyAgICAgICAgICAgIEZvbnRWYWx1
ZSogZm9udCA9IHN0YXRpY19jYXN0PEZvbnRWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgICAgIGlm
ICghZm9udC0+c3R5bGUgfHwgIWZvbnQtPnZhcmlhbnQgfHwgIWZvbnQtPndlaWdodAorICAgICAg
ICAgICAgICAgIHx8ICFmb250LT5zaXplIHx8ICFmb250LT5saW5lSGVpZ2h0IHx8ICFmb250LT5m
YW1pbHkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0
eShDU1NQcm9wZXJ0eUZvbnRTdHlsZSwgZm9udC0+c3R5bGUuZ2V0KCkpOworICAgICAgICAgICAg
YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRWYXJpYW50LCBmb250LT52YXJpYW50LmdldCgp
KTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250V2VpZ2h0LCBmb250
LT53ZWlnaHQuZ2V0KCkpOworICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIHByb3BlcnRpZXMg
Y2FuIGRpcnR5IG91ciBmb250IGJ1dCB0aGV5IGRvbid0IHRyeSB0byByZWFkIHRoZSBmb250J3MK
KyAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYmFjaywgd2hpY2ggaXMgc2FmZS4gSG93ZXZlciBp
ZiBmb250LXNpemUgaXMgdXNpbmcgdGhlICdleCcgdW5pdCwgaXQgd2lsbAorICAgICAgICAgICAg
Ly8gbmVlZCBxdWVyeSB0aGUgZGlydGllZCBmb250J3MgeC1oZWlnaHQgdG8gZ2V0IHRoZSBjb21w
dXRlZCBzaXplLiBUbyBiZSBzYWZlIGluIHRoaXMKKyAgICAgICAgICAgIC8vIGNhc2UsIGxldCdz
IGp1c3QgdXBkYXRlIHRoZSBmb250IG5vdy4KKyAgICAgICAgICAgIHVwZGF0ZUZvbnQoKTsKKyAg
ICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U2l6ZSwgZm9udC0+c2l6ZS5n
ZXQoKSk7CisKKyAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZShmb250LT5saW5l
SGVpZ2h0LmdldCgpKTsKKworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZv
bnRGYW1pbHksIGZvbnQtPmZhbWlseS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
OworCisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVh
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJCb3R0b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJSaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3BhY2luZzoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RT
dHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvdzoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5UGFkZGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3Jk
ZXJBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJvcmRlclN0YXJ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJSYWRpdXM6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblJ1bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhGbG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRH
cmlkQ29sdW1uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJnaW5Db2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFycXVlZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFzazoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXM6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
bjoKKyNpZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFdyYXA6CisjZW5kaWYKKyAgICAgICAgQVNTRVJUKGlzRXhwYW5kZWRTaG9ydGhhbmQoaWQpKTsK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8g
Q1NTMyBQcm9wZXJ0aWVzCisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRTaGFkb3c6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJveFNoYWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94U2hh
ZG93OiB7CisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIGlmIChpZCA9PSBD
U1NQcm9wZXJ0eVRleHRTaGFkb3cpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxl
KCktPnNldFRleHRTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4dFNoYWRvdygpID8gYWRv
cHRQdHIobmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSkp
IDogbnVsbHB0cik7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hh
ZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpID8gYWRvcHRQdHIobmV3IFNoYWRv
d0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpKSkgOiBudWxscHRyKTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAoaXNJbml0aWFsIHx8IHByaW1pdGl2ZVZhbHVlKSAvLyBpbml0
aWFsIHwgbm9uZQorICAgICAgICAgICAgcmV0dXJuIGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRv
dyA/IHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3cobnVsbHB0cikgOiBzdGF0ZS5zdHlsZSgp
LT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxp
c3QoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0
ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgICAg
ICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICAgICAgaWYgKCFjdXJy
VmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjdXJy
VmFsdWUpOworICAgICAgICAgICAgaW50IHggPSBpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4o
c3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAg
ICAgICAgICAgIGludCB5ID0gaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxl
KCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBp
bnQgYmx1ciA9IGl0ZW0tPmJsdXIgPyBpdGVtLT5ibHVyLT5jb21wdXRlTGVuZ3RoPGludD4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSA6IDA7Cisg
ICAgICAgICAgICBpbnQgc3ByZWFkID0gaXRlbS0+c3ByZWFkID8gaXRlbS0+c3ByZWFkLT5jb21w
dXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6
b29tRmFjdG9yKSA6IDA7CisgICAgICAgICAgICBTaGFkb3dTdHlsZSBzaGFkb3dTdHlsZSA9IGl0
ZW0tPnN0eWxlICYmIGl0ZW0tPnN0eWxlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5zZXQgPyBJ
bnNldCA6IE5vcm1hbDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAgICAgICAgaWYg
KGl0ZW0tPmNvbG9yKQorICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZl
VmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuc3R5
bGUoKSkKKyAgICAgICAgICAgICAgICBjb2xvciA9IHN0YXRlLnN0eWxlKCktPmNvbG9yKCk7CisK
KyAgICAgICAgICAgIE93blB0cjxTaGFkb3dEYXRhPiBzaGFkb3dEYXRhID0gYWRvcHRQdHIobmV3
IFNoYWRvd0RhdGEoSW50UG9pbnQoeCwgeSksIGJsdXIsIHNwcmVhZCwgc2hhZG93U3R5bGUsIGlk
ID09IENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93LCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6
IENvbG9yOjp0cmFuc3BhcmVudCkpOworICAgICAgICAgICAgaWYgKGlkID09IENTU1Byb3BlcnR5
VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93
KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBpLmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYg
dGhpcyBpcyBub3QgdGhlIGZpcnN0IGVudHJ5CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBp
LmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGVu
dHJ5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm94UmVmbGVjdDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElB
TChib3hSZWZsZWN0LCBCb3hSZWZsZWN0KQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsK
KyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QoUmVuZGVyU3R5bGU6Omlu
aXRpYWxCb3hSZWZsZWN0KCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCF2YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxlY3RWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgUmVmUHRyPFN0eWxlUmVmbGVjdGlvbj4g
cmVmbGVjdGlvbiA9IFN0eWxlUmVmbGVjdGlvbjo6Y3JlYXRlKCk7CisgICAgICAgIHJlZmxlY3Rp
b24tPnNldERpcmVjdGlvbigqcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKSk7CisgICAgICAgIGlm
IChyZWZsZWN0VmFsdWUtPm9mZnNldCgpKQorICAgICAgICAgICAgcmVmbGVjdGlvbi0+c2V0T2Zm
c2V0KHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCktPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJD
b252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbj4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSk7CisgICAg
ICAgIE5pbmVQaWVjZUltYWdlIG1hc2s7CisgICAgICAgIG1hc2suc2V0TWFza0RlZmF1bHRzKCk7
CisgICAgICAgIG1fc3R5bGVNYXAubWFwTmluZVBpZWNlSW1hZ2UoaWQsIHJlZmxlY3RWYWx1ZS0+
bWFzaygpLCBtYXNrKTsKKyAgICAgICAgcmVmbGVjdGlvbi0+c2V0TWFzayhtYXNrKTsKKworICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KHJlZmxlY3Rpb24ucmVsZWFzZSgpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5U3JjOiAvLyBPbmx5
IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1NT
UHJvcGVydHlVbmljb2RlUmFuZ2U6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0
aW9uOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291
bnQsIE1hcnF1ZWVMb29wQ291bnQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9
PSBDU1NWYWx1ZUluZmluaXRlKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVl
ZUxvb3BDb3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVhdCBmb3JldmVyLgorICAgICAgICBlbHNl
IGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVl
U3BlZWQ6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVk
LCBNYXJxdWVlU3BlZWQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIGlmIChpbnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSkgeworICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgeworICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZVNsb3c6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNw
ZWVkKDUwMCk7IC8vIDUwMCBtc2VjLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6CisgICAgICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBT
dXBlciBmYXN0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAg
ICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1RpbWUoKSkKKyAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50
LCBDU1NQcmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRzPigpKTsKKyAgICAgICAgZWxzZSBpZiAo
cHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4K
KyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1
ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFycXVlZUluY3JlbWVudCkKKyAgICAgICAg
aWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Cisg
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgo
MSwgRml4ZWQpKTsgLy8gMXB4LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZU5vcm1hbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRN
YXJxdWVlSW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZh
dWx0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxh
cmdlOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQo
TGVuZ3RoKDM2LCBGaXhlZCkpOyAvLyAzNnB4LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVM
ZW5ndGggPSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCks
IHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5n
dGguaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlSW5jcmVtZW50KG1hcnF1ZWVMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvY2FsZTogeworICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExvY2FsZSk7CisgICAgICAgIGlmICghcHJp
bWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCisgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRMb2NhbGUobnVsbEF0b20pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwor
ICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9j
YWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkp
OworICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNpemVBZGp1c3Q6
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFNpemVBZGp1c3QsIFRl
eHRTaXplQWRqdXN0KQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc2V0VGV4dFNp
emVBZGp1c3QocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoKKyAgICB7CisgICAgICAgIEhB
TkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lv
bnMpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkg
eworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJT
dHlsZTo6bm9uZURhc2hib2FyZFJlZ2lvbnMoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVl
LT5nZXREYXNoYm9hcmRSZWdpb25WYWx1ZSgpOworICAgICAgICBpZiAoIXJlZ2lvbikKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9u
OworICAgICAgICB3aGlsZSAocmVnaW9uKSB7CisgICAgICAgICAgICBMZW5ndGggdG9wID0gY29u
dmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRM
ZW5ndGgocmVnaW9uLT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCkpOworICAgICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChy
ZWdpb24tPmJvdHRvbSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkp
OworICAgICAgICAgICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5s
ZWZ0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisKKyAgICAg
ICAgICAgIGlmICh0b3AuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICB0b3AgPSBMZW5n
dGgoKTsKKyAgICAgICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAg
ICAgIHJpZ2h0ID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVk
KCkpCisgICAgICAgICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAo
bGVmdC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKKwor
ICAgICAgICAgICAgaWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKKyAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNs
ZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBm
aXJzdCA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNS
ZWN0YW5nbGUpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVn
aW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9w
LCByaWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwor
ICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0KCk7CisgICAgICAgIH0KKwor
ICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwor
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyNpZiBFTkFCTEUoRFJBR0dBQkxFX1JF
R0lPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVnaW9uOiB7CisgICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25N
b2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJs
ZVJlZ2lvbkRyYWcgOiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOworICAgICAgICBzdGF0ZS5kb2N1
bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDog
eworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRl
eHRTdHJva2VXaWR0aCkKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAgICBzd2l0Y2gg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUaGlu
OgorICAgICAgICBjYXNlIENTU1ZhbHVlTWVkaXVtOgorICAgICAgICBjYXNlIENTU1ZhbHVlVGhp
Y2s6IHsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAgLyA0ODsKKyAgICAgICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKKyAgICAg
ICAgICAgICAgICByZXN1bHQgKj0gMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVGhpY2spCisgICAgICAgICAgICAgICAgcmVzdWx0
ICo9IDU7CisgICAgICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVz
dWx0LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
d2lkdGggPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0
aCh3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zZm9ybTogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFu
c2Zvcm0sIFRyYW5zZm9ybSk7CisgICAgICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9u
czsKKyAgICAgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKKyAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0VHJhbnNmb3JtKG9wZXJhdGlvbnMpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZTogeworICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCisKKyAgICAg
ICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7CisgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7CisgICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgICAgIHBlcnNwZWN0aXZl
VmFsdWUgPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgZWxzZSBp
ZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBiYWNr
d2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KKyAgICAg
ICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1p
dGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+
Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgaWYgKHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikKKyAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFsdWUpOworICAgICAgICByZXR1
cm47CisgICAgfQorI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKHRhcEhpZ2hsaWdodENvbG9yLCBUYXBIaWdobGlnaHRDb2xvcik7CisgICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDb2xvciBj
b2wgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShwcmltaXRpdmVWYWx1ZSk7CisgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldFRhcEhpZ2hsaWdodENvbG9yKGNvbCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisjZW5kaWYKKyNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1dfU0NST0xMSU5H
KQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogeworICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh1c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nLCBV
c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VUb3VjaE92
ZXJmbG93U2Nyb2xsaW5nKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVG91
Y2gpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0
eUludmFsaWQ6CisgICAgICAgIHJldHVybjsKKyAgICAvLyBEaXJlY3Rpb25hbCBwcm9wZXJ0aWVz
IGFyZSByZXNvbHZlZCBieSByZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eSgpIGJlZm9yZSB0
aGUgc3dpdGNoLgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckVuZFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3Jk
ZXJTdGFydENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFdpZHRoOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckJlZm9yZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlckNvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlclN0eWxlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcldpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXJnaW5FbmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpblN0YXJ0Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5CZWZvcmU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcmdpbkFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5C
ZWZvcmVDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luVG9wQ29sbGFw
c2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFmdGVyQ29sbGFwc2U6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJvdHRvbUNvbGxhcHNlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRQYWRkaW5nRW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRk
aW5nU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdCZWZvcmU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsSGVp
Z2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1heExvZ2ljYWxXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9n
aWNhbEhlaWdodDoKKyAgICB7CisgICAgICAgIENTU1Byb3BlcnR5SUQgbmV3SWQgPSBDU1NQcm9w
ZXJ0eTo6cmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoaWQsIHN0YXRlLnN0eWxlKCktPmRp
cmVjdGlvbigpLCBzdGF0ZS5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAgQVNTRVJU
KG5ld0lkICE9IGlkKTsKKyAgICAgICAgcmV0dXJuIGFwcGx5UHJvcGVydHkobmV3SWQsIHZhbHVl
KTsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHJldGNoOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlQYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2g6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0TGluZVRocm91Z2hNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91
Z2hTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoV2lkdGg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92
ZXJsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZU1vZGU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0T3ZlcmxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0VW5kZXJsaW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZVN0
eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lV2lkdGg6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZvbnRTaXplRGVsdGE6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRleHREZWNvcmF0aW9uc0luRWZmZWN0OgorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDU1Mg
VGV4dCBMYXlvdXQgTW9kdWxlIExldmVsIDM6IFZlcnRpY2FsIHdyaXRpbmcgc3VwcG9ydAorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZTogeworICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTCh3cml0aW5nTW9kZSwgV3JpdGluZ01vZGUpOworICAgICAgICAKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgc2V0V3JpdGluZ01vZGUoKnBy
aW1pdGl2ZVZhbHVlKTsKKworICAgICAgICAvLyBGSVhNRTogSXQgaXMgbm90IG9rIHRvIG1vZGlm
eSBkb2N1bWVudCBzdGF0ZSB3aGlsZSBhcHBseWluZyBzdHlsZS4KKyAgICAgICAgaWYgKHN0YXRl
LmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+ZG9jdW1l
bnRFbGVtZW50KCkpCisgICAgICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9k
ZVNldE9uRG9jdW1lbnRFbGVtZW50KHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRPcmllbnRhdGlvbjogeworICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0T3JpZW50YXRpb24sIFRleHRPcmllbnRhdGlvbik7
CisKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgc2V0VGV4dE9yaWVu
dGF0aW9uKCpwcmltaXRpdmVWYWx1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQm94Q29udGFpbjogeworICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChsaW5lQm94Q29udGFpbiwgTGluZUJveENvbnRhaW4pCisgICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250
YWluKExpbmVCb3hDb250YWluTm9uZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KworICAgICAgICBpZiAoIXZhbHVlLT5pc0NTU0xpbmVCb3hDb250YWluVmFsdWUoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBDU1NMaW5lQm94Q29udGFpblZhbHVlKiBsaW5lQm94
Q29udGFpblZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTTGluZUJveENvbnRhaW5WYWx1ZSo+KHZhbHVl
KTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4obGluZUJveENvbnRh
aW5WYWx1ZS0+dmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDU1Mg
Rm9udHMgTW9kdWxlIExldmVsIDMKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEZlYXR1
cmVTZXR0aW5nczogeworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb3JtYWwpIHsKKyAgICAgICAgICAgIHNldEZvbnRE
ZXNjcmlwdGlvbihzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKS5tYWtlTm9ybWFsRmVh
dHVyZVNldHRpbmdzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9u
dERlc2NyaXB0aW9uKCk7CisgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19jYXN0
PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKKyAgICAgICAgUmVmUHRyPEZvbnRGZWF0dXJlU2V0dGlu
Z3M+IHNldHRpbmdzID0gRm9udEZlYXR1cmVTZXR0aW5nczo6Y3JlYXRlKCk7CisgICAgICAgIGlu
dCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47
ICsraSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBsaXN0LT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKGkpOworICAgICAgICAgICAgaWYgKCFpdGVtLT5pc0ZvbnRGZWF0dXJlVmFsdWUo
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEZvbnRGZWF0dXJlVmFs
dWUqIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGb250RmVhdHVyZVZhbHVlKj4oaXRlbSk7CisgICAg
ICAgICAgICBzZXR0aW5ncy0+YXBwZW5kKEZvbnRGZWF0dXJlKGZlYXR1cmUtPnRhZygpLCBmZWF0
dXJlLT52YWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZl
YXR1cmVTZXR0aW5ncyhzZXR0aW5ncy5yZWxlYXNlKCkpOworICAgICAgICBzZXRGb250RGVzY3Jp
cHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIEVO
QUJMRShDU1NfRklMVEVSUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmlsdGVyOiB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGZpbHRlciwgRmlsdGVyKTsKKyAgICAg
ICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgICAgICBpZiAoY3JlYXRlRmlsdGVy
T3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LCBvcGVyYXRpb25zKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEZpbHRlcihvcGVy
YXRpb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRHcmlkQ29sdW1uczogeworICAgICAgICBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4g
dHJhY2tTaXplczsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0KHZhbHVlLCB0cmFj
a1NpemVzLCBzdGF0ZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRDb2x1bW5zKHRyYWNrU2l6ZXMpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93czogeworICAgICAgICBWZWN0b3I8R3Jp
ZFRyYWNrU2l6ZT4gdHJhY2tTaXplczsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0
KHZhbHVlLCB0cmFja1NpemVzLCBzdGF0ZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldEdyaWRSb3dzKHRyYWNrU2l6ZXMpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRTdGFydDogeworICAgICAg
ICBHcmlkUG9zaXRpb24gc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9z
aXRpb24odmFsdWUsIHN0YXJ0UG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24pOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkRW5kOiB7Cisg
ICAgICAgIEdyaWRQb3NpdGlvbiBlbmRQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlk
UG9zaXRpb24odmFsdWUsIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRCZWZvcmU6IHsK
KyAgICAgICAgR3JpZFBvc2l0aW9uIGJlZm9yZVBvc2l0aW9uOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYmVmb3JlUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUJlZm9yZShiZWZvcmVQb3NpdGlv
bik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdy
aWRBZnRlcjogeworICAgICAgICBHcmlkUG9zaXRpb24gYWZ0ZXJQb3NpdGlvbjsKKyAgICAgICAg
aWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGFmdGVyUG9zaXRpb24pKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUFmdGVyKGFmdGVy
UG9zaXRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlc2UgcHJvcGVy
dGllcyBhcmUgYWxpYXNlZCBhbmQgU3R5bGVCdWlsZGVyIGFscmVhZHkgYXBwbGllZCB0aGUgcHJv
cGVydHkgb24gdGhlIHByZWZpeGVkIHZlcnNpb24uCisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkR1cmF0aW9uOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICAgICAgcmV0dXJuOworICAgIC8vIFRoZXNl
IHByb3BlcnRpZXMgYXJlIGltcGxlbWVudGVkIGluIHRoZSBTdHlsZUJ1aWxkZXIgbG9va3VwIHRh
YmxlLgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kUG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFJlcGVhdFk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXpl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQm90dG9tTGVmdFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Qm90dG9tUmlnaHRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21XaWR0aDoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlT3V0
c2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVJlcGVhdDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1h
Z2VTb3VyY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
TGVmdFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0V2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clJpZ2h0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0V2lkdGg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJUb3BMZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BSaWdodFJhZGl1
czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wU3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlclRvcFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3R0b206CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJveFNpemluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2FwdGlvblNpZGU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNsZWFyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDbGlwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlcklu
Y3JlbWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlclJlc2V0OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlDdXJzb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eURpcmVjdGlvbjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5RGlzcGxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5RW1wdHlDZWxsczoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5RmxvYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRW
YXJpYW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlIZWlnaHQ6CisjaWYgRU5BQkxFKENTU19JTUFHRV9PUklFTlRBVElPTikKKyAgICBjYXNl
IENTU1Byb3BlcnR5SW1hZ2VPcmllbnRhdGlvbjoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlJbWFnZVJlbmRlcmluZzoKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1JFU09MVVRJT04pCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVzb2x1dGlvbjoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJv
cGVydHlMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5nOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFn
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlUG9zaXRpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUxpc3RTdHlsZVR5cGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToK
KyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luTGVmdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFy
Z2luUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRvcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5TWF4SGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5TWluSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoK
KyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dX
cmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1g6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU92ZXJmbG93WToKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbToKKyAgICBjYXNl
IENTU1Byb3BlcnR5UGFkZGluZ0xlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdSaWdo
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1RvcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
UGFnZUJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0JlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrSW5zaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQ
b2ludGVyRXZlbnRzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQb3NpdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5UmVzaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlSaWdodDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5U3BlYWs6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVRhYlNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRhYmxlTGF5b3V0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0QWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0SW5kZW50OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0T3ZlcmZsb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRSZW5kZXJpbmc6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRUcmFuc2Zvcm06CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRvcDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZUJpZGk6CisjaWYgRU5BQkxFKENTU19WQVJJQUJM
RVMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVZhcmlhYmxlOgorI2VuZGlmCisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVZlcnRpY2FsQWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBbmltYXRpb25EaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEFuaW1hdGlvbkR1cmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25G
aWxsTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uQ291
bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbk5hbWU6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblBsYXlTdGF0ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEFwcGVhcmFuY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFzcGVjdFJhdGlvOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZmFjZVZpc2liaWxpdHk6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
YWNrZ3JvdW5kQ29tcG9zaXRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5k
T3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kU2l6ZToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRml0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJIb3Jpem9udGFsU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVySW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2lu
ZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246CisjaWYgRU5BQkxFKENTU19C
T1hfREVDT1JBVElPTl9CUkVBSykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGVjb3Jh
dGlvbkJyZWFrOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERpcmVjdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm94RmxleEdyb3VwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hMaW5l
czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdyb3VwOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hPcmllbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eFBhY2s6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29ycmVjdGlvbjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJl
YWtCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrSW5zaWRlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uR2FwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Qcm9n
cmVzc2lvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uU3BhbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGg6CisjaWYgRU5B
QkxFKENVUlNPUl9WSVNJQklMSVRZKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDdXJzb3JW
aXNpYmlsaXR5OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduQ29udGVu
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVtczoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0QWxpZ25TZWxmOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFz
aXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZsZXhHcm93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
U2hyaW5rOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4V3JhcDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0SnVzdGlmeUNvbnRlbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE9yZGVyOgorI2lmIEVOQUJMRShDU1NfUkVHSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Rmxvd0Zyb206CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dJbnRvOgorI2VuZGlm
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRLZXJuaW5nOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRGb250U21vb3RoaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250
VmFyaWFudExpZ2F0dXJlczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SGlnaGxpZ2h0Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVDaGFyYWN0ZXI6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRI
eXBoZW5hdGVMaW1pdExpbmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5zOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdExpbmVCcmVhazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUNsYW1wOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lR3JpZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZVNuYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVEaXJlY3Rp
b246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrQm94SW1hZ2VPdXRzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFn
ZVJlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU2xpY2U6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNvdXJjZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ29tcG9zaXRlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hc2tPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlv
blg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblk6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE5ic3BNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQ
ZXJzcGVjdGl2ZU9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVP
cmlnaW5YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6CisjaWYgRU5BQkxFKENT
U19SRUdJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVyOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFJlZ2lvbk92ZXJmbG93OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ0
bE9yZGVyaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRDb21iaW5lOgorI2lmIEVOQUJMRShDU1MzX1RFWFQp
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dEFsaWduTGFzdDoKKyNlbmRpZiAvLyBDU1MzX1RFWFQKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRleHRFbXBoYXNpc1Bvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
RW1waGFzaXNTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRy
YW5zZm9ybU9yaWdpblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
blk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblo6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUcmFuc2l0aW9uRGVsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRp
b25EdXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvblByb3BlcnR5
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uVGltaW5nRnVuY3Rpb246Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJEcmFnOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRVc2VyTW9kaWZ5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyU2VsZWN0Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDbGlwUGF0aDoKKyNpZiBFTkFCTEUoQ1NTX0VYQ0xV
U0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBGbG93OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRTaGFwZU1hcmdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hh
cGVQYWRkaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwVGhyb3VnaDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFNoYXBlT3V0c2lkZToKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaWRvd3M6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdpZHRo
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkQnJlYWs6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdv
cmRTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkV3JhcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5WkluZGV4OgorICAgIGNhc2UgQ1NTUHJvcGVydHlab29tOgorI2lmIEVOQUJMRShDU1Nf
REVWSUNFX0FEQVBUQVRJT04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFpvb206CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU1pblpvb206CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9yaWVudGF0aW9uOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlVc2VyWm9vbToKKyNlbmRpZgorICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisjaWYgRU5BQkxFKFNW
RykKKyAgICAgICAgLy8gVHJ5IHRoZSBTVkcgcHJvcGVydGllcworICAgICAgICBhcHBseVNWR1By
b3BlcnR5KGlkLCB2YWx1ZSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwor
UGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUltYWdlKENTU1Byb3Bl
cnR5SUQgcHJvcGVydHksIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzSW1h
Z2VWYWx1ZSgpKQorICAgICAgICByZXR1cm4gY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3Bl
cnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZhbHVlKj4odmFsdWUpKTsKKworICAgIGlmICh2YWx1
ZS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlLT5pc0dyYWRp
ZW50VmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFs
dWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFsdWUqPih2YWx1ZSktPmdyYWRp
ZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGdlbmVy
YXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5l
cmF0b3JWYWx1ZSo+KHZhbHVlKSk7CisgICAgfQorCisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQp
CisgICAgaWYgKHZhbHVlLT5pc0ltYWdlU2V0VmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHNldE9y
UGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+
KHZhbHVlKSk7CisjZW5kaWYKKworICAgIGlmICh2YWx1ZS0+aXNDdXJzb3JJbWFnZVZhbHVlKCkp
CisgICAgICAgIHJldHVybiBjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRp
Y19jYXN0PENTU0N1cnNvckltYWdlVmFsdWUqPih2YWx1ZSkpOworCisgICAgcmV0dXJuIDA7Cit9
CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y2FjaGVkT3JQZW5kaW5n
RnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlVmFsdWUqIHZhbHVlKQor
eworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJ
bWFnZSgpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAg
ICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7
CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxTdHlsZUltYWdl
PiBTdHlsZVJlc29sdmVyOjpnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJ
RCBwcm9wZXJ0eSwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHZh
bHVlLT5pc1BlbmRpbmcoKSkgeworICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRp
ZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFN0eWxlUGVuZGluZ0lt
YWdlOjpjcmVhdGUodmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gU3R5bGVHZW5lcmF0ZWRJbWFn
ZTo6Y3JlYXRlKHZhbHVlKTsKK30KKworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorUGFzc1Jl
ZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VTZXRWYWx1ZSogdmFsdWUpCit7CisgICAgUmVm
UHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlU2V0KGRv
Y3VtZW50KCkpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAg
ICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1
ZSk7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKyNlbmRpZgorCitQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQ
cm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NDdXJzb3JJbWFnZVZhbHVlKiB2YWx1ZSkKK3sKKyAgICBS
ZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2UoZG9j
dW1lbnQoKSk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQorICAg
ICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVl
KTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OmNoZWNrRm9yVGV4dFNpemVBZGp1c3QoKQoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1f
c3RhdGUuc3R5bGUoKTsKKworICAgIGlmIChzdHlsZS0+dGV4dFNpemVBZGp1c3QoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihzdHls
ZS0+Zm9udERlc2NyaXB0aW9uKCkpOworICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRl
ZFNpemUobmV3Rm9udERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSk7CisgICAgc3R5bGUtPnNl
dEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OmNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSkKK3sKKyAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA9PSBwYXJl
bnRTdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBG
b250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKyAg
ICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7CisgICAgc2V0
Rm9udFNpemUobmV3Rm9udERlc2NyaXB0aW9uLCBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgpKTsK
KyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0
eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworCisgICAg
aWYgKGNoaWxkRm9udC5pc0Fic29sdXRlU2l6ZSgpIHx8ICFwYXJlbnRTdHlsZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250ID0gcGFyZW50
U3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIGlmIChjaGlsZEZvbnQudXNlRml4ZWREZWZh
dWx0U2l6ZSgpID09IHBhcmVudEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBGb3Igbm93LCBsdW1wIGFsbCBmYW1pbGllcyBidXQgbW9ub3NwYWNl
IHRvZ2V0aGVyLgorICAgIGlmIChjaGlsZEZvbnQuZ2VuZXJpY0ZhbWlseSgpICE9IEZvbnREZXNj
cmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5CisgICAgICAgICYmIHBhcmVudEZvbnQuZ2VuZXJpY0Zh
bWlseSgpICE9IEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBXZSBrbm93IHRoZSBwYXJlbnQgaXMgbW9ub3NwYWNlIG9yIHRoZSBjaGls
ZCBpcyBtb25vc3BhY2UsIGFuZCB0aGF0IGZvbnQKKyAgICAvLyBzaXplIHdhcyB1bnNwZWNpZmll
ZC4gV2Ugd2FudCB0byBzY2FsZSBvdXIgZm9udCBzaXplIGFzIGFwcHJvcHJpYXRlLgorICAgIC8v
IElmIHRoZSBmb250IHVzZXMgYSBrZXl3b3JkIHNpemUsIHRoZW4gd2UgcmVmZXRjaCBmcm9tIHRo
ZSB0YWJsZSByYXRoZXIgdGhhbgorICAgIC8vIG11bHRpcGx5aW5nIGJ5IG91ciBzY2FsZSBmYWN0
b3IuCisgICAgZmxvYXQgc2l6ZTsKKyAgICBpZiAoY2hpbGRGb250LmtleXdvcmRTaXplKCkpCisg
ICAgICAgIHNpemUgPSBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNt
YWxsICsgY2hpbGRGb250LmtleXdvcmRTaXplKCkgLSAxLCBjaGlsZEZvbnQudXNlRml4ZWREZWZh
dWx0U2l6ZSgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9j
dW1lbnRTZXR0aW5ncygpOworICAgICAgICBmbG9hdCBmaXhlZFNjYWxlRmFjdG9yID0gKHNldHRp
bmdzICYmIHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpICYmIHNldHRpbmdzLT5kZWZh
dWx0Rm9udFNpemUoKSkKKyAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNldHRpbmdz
LT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpKSAvIHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKQor
ICAgICAgICAgICAgOiAxOworICAgICAgICBzaXplID0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1
bHRTaXplKCkgPworICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgLyBm
aXhlZFNjYWxlRmFjdG9yIDoKKyAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6
ZSgpICogZml4ZWRTY2FsZUZhY3RvcjsKKyAgICB9CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3
Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7CisgICAgc2V0Rm9udFNpemUobmV3Rm9udERlc2Ny
aXB0aW9uLCBzaXplKTsKKyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNj
cmlwdGlvbik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdGlhbGl6ZUZvbnRTdHlsZShT
ZXR0aW5ncyogc2V0dGluZ3MpCit7CisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlv
bjsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246
OlN0YW5kYXJkRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShz
ZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFVz
ZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5G
b250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0YW5k
YXJkRm9udEZhbWlseSA9IGRvY3VtZW50U2V0dGluZ3MoKS0+c3RhbmRhcmRGb250RmFtaWx5KCk7
CisgICAgaWYgKCFzdGFuZGFyZEZvbnRGYW1pbHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnRGYW1pbHkpOwor
ICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7Cisg
ICAgfQorICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAt
IENTU1ZhbHVlWHhTbWFsbCArIDEpOworICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwg
Zm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSkpOwor
ICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExp
bmVIZWlnaHQoKSk7CisgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6c2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGZsb2F0IHNp
emUpCit7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7CisgICAg
Zm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lm
aWVkU2l6ZShkb2N1bWVudCgpLCBtX3N0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fi
c29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMoKSkpOworfQorCitmbG9hdCBTdHls
ZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCogZG9j
dW1lbnQsIFJlbmRlclN0eWxlKiBzdHlsZSwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3Bl
Y2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVsZXMpCit7CisgICAgZmxvYXQgem9vbUZhY3Rv
ciA9IDEuMGY7CisgICAgaWYgKCF1c2VTVkdab29tUnVsZXMpIHsKKyAgICAgICAgem9vbUZhY3Rv
ciA9IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBk
b2N1bWVudC0+ZnJhbWUoKSkKKyAgICAgICAgICAgIHpvb21GYWN0b3IgKj0gZnJhbWUtPnRleHRa
b29tRmFjdG9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCB6b29tRmFjdG9yLCBpc0Fic29sdXRl
U2l6ZSwgc3BlY2lmaWVkU2l6ZSk7Cit9CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgZmxvYXQgem9vbUZh
Y3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWlu
aW11bUZvckZvbnRTaXplIHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplKQoreworICAgIC8vIFRl
eHQgd2l0aCBhIDBweCBmb250IHNpemUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIGFuZCB0aGVyZWZv
cmUgbmVlZHMgdG8gYmUKKyAgICAvLyBleGVtcHQgZnJvbSBtaW5pbXVtIGZvbnQgc2l6ZSBydWxl
cy4gQWNpZDMgcmVsaWVzIG9uIHRoaXMgZm9yIHBpeGVsLXBlcmZlY3QKKyAgICAvLyByZW5kZXJp
bmcuIFRoaXMgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYnJvd3NlcnMgdGhhdCBoYXZl
IG1pbmltdW0KKyAgICAvLyBmb250IHNpemUgc2V0dGluZ3MgKGUuZy4gRmlyZWZveCkuCisgICAg
aWYgKGZhYnNmKHNwZWNpZmllZFNpemUpIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVw
c2lsb24oKSkKKyAgICAgICAgcmV0dXJuIDAuMGY7CisKKyAgICAvLyBXZSBzdXBwb3J0IHR3byB0
eXBlcyBvZiBtaW5pbXVtIGZvbnQgc2l6ZS4gVGhlIGZpcnN0IGlzIGEgaGFyZCBvdmVycmlkZSB0
aGF0IGFwcGxpZXMgdG8KKyAgICAvLyBhbGwgZm9udHMuIFRoaXMgaXMgIm1pblNpemUuIiBUaGUg
c2Vjb25kIHR5cGUgb2YgbWluaW11bSBmb250IHNpemUgaXMgYSAic21hcnQgbWluaW11bSIKKyAg
ICAvLyB0aGF0IGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSBXZWIgcGFnZSBjYW4ndCBrbm93IHdo
YXQgc2l6ZSBpdCByZWFsbHkgYXNrZWQgZm9yLCBlLmcuLAorICAgIC8vIHdoZW4gaXQgdXNlcyBs
b2dpY2FsIHNpemVzIGxpa2UgInNtYWxsIiBvciBleHByZXNzZXMgdGhlIGZvbnQtc2l6ZSBhcyBh
IHBlcmNlbnRhZ2Ugb2YKKyAgICAvLyB0aGUgdXNlcidzIGRlZmF1bHQgZm9udCBzZXR0aW5nLgor
CisgICAgLy8gV2l0aCB0aGUgc21hcnQgbWluaW11bSwgd2UgbmV2ZXIgd2FudCB0byBnZXQgc21h
bGxlciB0aGFuIHRoZSBtaW5pbXVtIGZvbnQgc2l6ZSB0byBrZWVwIGZvbnRzIHJlYWRhYmxlLgor
ICAgIC8vIEhvd2V2ZXIgd2UgYWx3YXlzIGFsbG93IHRoZSBwYWdlIHRvIHNldCBhbiBleHBsaWNp
dCBwaXhlbCBzaXplIHRoYXQgaXMgc21hbGxlciwKKyAgICAvLyBzaW5jZSBzaXRlcyB3aWxsIG1p
cy1yZW5kZXIgb3RoZXJ3aXNlIChlLmcuLCBodHRwOi8vd3d3LmdhbWVzcG90LmNvbSB3aXRoIGEg
OXB4IG1pbmltdW0pLgorCisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRp
bmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0dXJuIDEuMGY7CisKKyAgICBp
bnQgbWluU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtRm9udFNpemUoKTsKKyAgICBpbnQgbWluTG9n
aWNhbFNpemUgPSBzZXR0aW5ncy0+bWluaW11bUxvZ2ljYWxGb250U2l6ZSgpOworICAgIGZsb2F0
IHpvb21lZFNpemUgPSBzcGVjaWZpZWRTaXplICogem9vbUZhY3RvcjsKKworICAgIC8vIEFwcGx5
IHRoZSBoYXJkIG1pbmltdW0gZmlyc3QuIFdlIG9ubHkgYXBwbHkgdGhlIGhhcmQgbWluaW11bSBp
ZiBhZnRlciB6b29taW5nIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbC4KKyAgICBpZiAoem9vbWVkU2l6
ZSA8IG1pblNpemUpCisgICAgICAgIHpvb21lZFNpemUgPSBtaW5TaXplOworCisgICAgLy8gTm93
IGFwcGx5IHRoZSAic21hcnQgbWluaW11bS4iIFRoaXMgbWluaW11bSBpcyBhbHNvIG9ubHkgYXBw
bGllZCBpZiB3ZSdyZSBzdGlsbCB0b28gc21hbGwKKyAgICAvLyBhZnRlciB6b29taW5nLiBUaGUg
Zm9udCBzaXplIG11c3QgZWl0aGVyIGJlIHJlbGF0aXZlIHRvIHRoZSB1c2VyIGRlZmF1bHQgb3Ig
dGhlIG9yaWdpbmFsIHNpemUKKyAgICAvLyBtdXN0IGhhdmUgYmVlbiBhY2NlcHRhYmxlLiBJbiBv
dGhlciB3b3Jkcywgd2Ugb25seSBhcHBseSB0aGUgc21hcnQgbWluaW11bSB3aGVuZXZlciB3ZSdy
ZSBwb3NpdGl2ZQorICAgIC8vIGRvaW5nIHNvIHdvbid0IGRpc3J1cHQgdGhlIGxheW91dC4KKyAg
ICBpZiAodXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUgJiYgem9vbWVkU2l6ZSA8IG1pbkxvZ2lj
YWxTaXplICYmIChzcGVjaWZpZWRTaXplID49IG1pbkxvZ2ljYWxTaXplIHx8ICFpc0Fic29sdXRl
U2l6ZSkpCisgICAgICAgIHpvb21lZFNpemUgPSBtaW5Mb2dpY2FsU2l6ZTsKKworICAgIC8vIEFs
c28gY2xhbXAgdG8gYSByZWFzb25hYmxlIG1heGltdW0gdG8gcHJldmVudCBpbnNhbmUgZm9udCBz
aXplcyBmcm9tIGNhdXNpbmcgY3Jhc2hlcyBvbiB2YXJpb3VzCisgICAgLy8gcGxhdGZvcm1zIChJ
J20gbG9va2luZyBhdCB5b3UsIFdpbmRvd3MuKQorICAgIHJldHVybiBtaW4obWF4aW11bUFsbG93
ZWRGb250U2l6ZSwgem9vbWVkU2l6ZSk7Cit9CisKK2NvbnN0IGludCBmb250U2l6ZVRhYmxlTWF4
ID0gMTY7Citjb25zdCBpbnQgZm9udFNpemVUYWJsZU1pbiA9IDk7Citjb25zdCBpbnQgdG90YWxL
ZXl3b3JkcyA9IDg7CisKKy8vIFdpbklFL05hdjQgdGFibGUgZm9yIGZvbnQgc2l6ZXMuIERlc2ln
bmVkIHRvIG1hdGNoIHRoZSBsZWdhY3kgZm9udCBtYXBwaW5nIHN5c3RlbSBvZiBIVE1MLgorc3Rh
dGljIGNvbnN0IGludCBxdWlya3NGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250
U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQoreworICAgICAgeyA5LCAgICA5LCAg
ICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI4IH0sCisgICAgICB7IDksICAg
IDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzEgfSwKKyAgICAgIHsg
OSwgICAgOSwgICAgIDksICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzNCB9LAorICAg
ICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM3IH0s
CisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAg
NDAgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKKyAgICAgIHsgOSwgICAgOSwgICAgMTEs
ICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAorICAgICAgeyA5LCAgIDEwLCAg
ICAxMiwgICAgMTUsICAgIDE3LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCisgICAgICB7IDksICAg
MTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0
aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKK307CisvLyBIVE1MICAgICAgIDEgICAgICAyICAgICAg
MyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKKy8vIENTUyAgeHhzICAgeHMgICAgIHMgICAg
ICBtICAgICAgbCAgICAgeGwgICAgIHh4bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwK
Ky8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgorCisvLyBTdHJpY3QgbW9kZSB0YWJs
ZSBtYXRjaGVzIE1hY0lFIGFuZCBNb3ppbGxhJ3Mgc2V0dGluZ3MgZXhhY3RseS4KK3N0YXRpYyBj
b25zdCBpbnQgc3RyaWN0Rm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0gZm9udFNpemVU
YWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KK3sKKyAgICAgIHsgOSwgICAgOSwgICAgIDks
ICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyNyB9LAorICAgICAgeyA5LCAgICA5LCAg
ICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMwIH0sCisgICAgICB7IDksICAg
IDksICAgIDEwLCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzMgfSwKKyAgICAgIHsg
OSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAzNiB9LAorICAg
ICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYsICAgIDM5IH0s
IC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCisgICAgICB7IDksICAgMTAsICAgIDEyLCAgICAx
NCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTMs
ICAgIDE1LCAgICAxOCwgICAgMjMsICAgIDMwLCAgICA0NSB9LAorICAgICAgeyA5LCAgIDEwLCAg
ICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJvcG9ydGlvbmFs
IGZvbnQgZGVmYXVsdCAoMTYpCit9OworLy8gSFRNTCAgICAgICAxICAgICAgMiAgICAgIDMgICAg
ICA0ICAgICAgNSAgICAgIDYgICAgICA3CisvLyBDU1MgIHh4cyAgIHhzICAgICBzICAgICAgbSAg
ICAgIGwgICAgIHhsICAgICB4eGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyAg
ICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKKworLy8gRm9yIHZhbHVlcyBvdXRzaWRlIHRo
ZSByYW5nZSBvZiB0aGUgdGFibGUsIHdlIHVzZSBUb2RkIEZhaHJuZXIncyBzdWdnZXN0ZWQgc2Nh
bGUKKy8vIGZhY3RvcnMgZm9yIGVhY2gga2V5d29yZCB2YWx1ZS4KK3N0YXRpYyBjb25zdCBmbG9h
dCBmb250U2l6ZUZhY3RvcnNbdG90YWxLZXl3b3Jkc10gPSB7IDAuNjBmLCAwLjc1ZiwgMC44OWYs
IDEuMGYsIDEuMmYsIDEuNWYsIDIuMGYsIDMuMGYgfTsKKworZmxvYXQgU3R5bGVSZXNvbHZlcjo6
Zm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiBkb2N1bWVudCwgaW50IGtleXdvcmQsIGJvb2wg
c2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKK3sKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICByZXR1cm4g
MS4wZjsKKworICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01vZGUoKTsK
KyAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBzZXR0aW5n
cy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKTsK
KyAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNpemUgPD0g
Zm9udFNpemVUYWJsZU1heCkgeworICAgICAgICAvLyBMb29rIHVwIHRoZSBlbnRyeSBpbiB0aGUg
dGFibGUuCisgICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsK
KyAgICAgICAgaW50IGNvbCA9IChrZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxsKTsKKyAgICAgICAg
cmV0dXJuIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRhYmxlW3Jvd11bY29sXSA6IHN0cmlj
dEZvbnRTaXplVGFibGVbcm93XVtjb2xdOworICAgIH0KKworICAgIC8vIFZhbHVlIGlzIG91dHNp
ZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZS4gQXBwbHkgdGhlIHNjYWxlIGZhY3RvciBpbnN0ZWFk
LgorICAgIGZsb2F0IG1pbkxvZ2ljYWxTaXplID0gbWF4KHNldHRpbmdzLT5taW5pbXVtTG9naWNh
bEZvbnRTaXplKCksIDEpOworICAgIHJldHVybiBtYXgoZm9udFNpemVGYWN0b3JzW2tleXdvcmQg
LSBDU1NWYWx1ZVh4U21hbGxdKm1lZGl1bVNpemUsIG1pbkxvZ2ljYWxTaXplKTsKK30KKwordGVt
cGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbnQgZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZShp
bnQgcGl4ZWxGb250U2l6ZSwgY29uc3QgVCogdGFibGUsIGludCBtdWx0aXBsaWVyKQoreworICAg
IC8vIElnbm9yZSB0YWJsZVswXSBiZWNhdXNlIHh4LXNtYWxsIGRvZXMgbm90IGNvcnJlc3BvbmQg
dG8gYW55IGxlZ2FjeSBmb250IHNpemUuCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0b3RhbEtl
eXdvcmRzIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChwaXhlbEZvbnRTaXplICogMiA8ICh0YWJs
ZVtpXSArIHRhYmxlW2kgKyAxXSkgKiBtdWx0aXBsaWVyKQorICAgICAgICAgICAgcmV0dXJuIGk7
CisgICAgfQorICAgIHJldHVybiB0b3RhbEtleXdvcmRzIC0gMTsKK30KKworaW50IFN0eWxlUmVz
b2x2ZXI6OmxlZ2FjeUZvbnRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgaW50IHBpeGVsRm9udFNp
emUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKK3sKKyAgICBTZXR0aW5ncyogc2V0
dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAg
ICByZXR1cm4gMTsKKworICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01v
ZGUoKTsKKyAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBz
ZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNp
emUoKTsKKyAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNp
emUgPD0gZm9udFNpemVUYWJsZU1heCkgeworICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6ZSAt
IGZvbnRTaXplVGFibGVNaW47CisgICAgICAgIHJldHVybiBmaW5kTmVhcmVzdExlZ2FjeUZvbnRT
aXplPGludD4ocGl4ZWxGb250U2l6ZSwgcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVb
cm93XSA6IHN0cmljdEZvbnRTaXplVGFibGVbcm93XSwgMSk7CisgICAgfQorCisgICAgcmV0dXJu
IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8ZmxvYXQ+KHBpeGVsRm9udFNpemUsIGZvbnRTaXpl
RmFjdG9ycywgbWVkaXVtU2l6ZSk7Cit9CisKK3N0YXRpYyBDb2xvciBjb2xvckZvckNTU1ZhbHVl
KGludCBjc3NWYWx1ZUlkKQoreworICAgIHN0cnVjdCBDb2xvclZhbHVlIHsKKyAgICAgICAgaW50
IGNzc1ZhbHVlSWQ7CisgICAgICAgIFJHQkEzMiBjb2xvcjsKKyAgICB9OworCisgICAgc3RhdGlj
IGNvbnN0IENvbG9yVmFsdWUgY29sb3JWYWx1ZXNbXSA9IHsKKyAgICAgICAgeyBDU1NWYWx1ZUFx
dWEsIDB4RkYwMEZGRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUJsYWNrLCAweEZGMDAwMDAwIH0s
CisgICAgICAgIHsgQ1NTVmFsdWVCbHVlLCAweEZGMDAwMEZGIH0sCisgICAgICAgIHsgQ1NTVmFs
dWVGdWNoc2lhLCAweEZGRkYwMEZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmF5LCAweEZGODA4
MDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmVlbiwgMHhGRjAwODAwMCAgfSwKKyAgICAgICAg
eyBDU1NWYWx1ZUdyZXksIDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUxpbWUsIDB4
RkYwMEZGMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU1hcm9vbiwgMHhGRjgwMDAwMCB9LAorICAg
ICAgICB7IENTU1ZhbHVlTmF2eSwgMHhGRjAwMDA4MCB9LAorICAgICAgICB7IENTU1ZhbHVlT2xp
dmUsIDB4RkY4MDgwMDAgIH0sCisgICAgICAgIHsgQ1NTVmFsdWVPcmFuZ2UsIDB4RkZGRkE1MDAg
fSwKKyAgICAgICAgeyBDU1NWYWx1ZVB1cnBsZSwgMHhGRjgwMDA4MCB9LAorICAgICAgICB7IENT
U1ZhbHVlUmVkLCAweEZGRkYwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVTaWx2ZXIsIDB4RkZD
MEMwQzAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVRlYWwsIDB4RkYwMDgwODAgIH0sCisgICAgICAg
IHsgQ1NTVmFsdWVUcmFuc3BhcmVudCwgMHgwMDAwMDAwMCB9LAorICAgICAgICB7IENTU1ZhbHVl
V2hpdGUsIDB4RkZGRkZGRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVllbGxvdywgMHhGRkZGRkYw
MCB9LAorICAgICAgICB7IDAsIDAgfQorICAgIH07CisKKyAgICBmb3IgKGNvbnN0IENvbG9yVmFs
dWUqIGNvbCA9IGNvbG9yVmFsdWVzOyBjb2wtPmNzc1ZhbHVlSWQ7ICsrY29sKSB7CisgICAgICAg
IGlmIChjb2wtPmNzc1ZhbHVlSWQgPT0gY3NzVmFsdWVJZCkKKyAgICAgICAgICAgIHJldHVybiBj
b2wtPmNvbG9yOworICAgIH0KKyAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgp
LT5zeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVl
KiB2YWx1ZSkKK3sKKyAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0SWRlbnQoKTsKKyAgICBzd2l0
Y2ggKGlkZW50KSB7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6CisgICAgY2FzZSBDU1NW
YWx1ZVdlYmtpdExpbms6CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxpbms6CisgICAg
Y2FzZSBDU1NWYWx1ZUN1cnJlbnRjb2xvcjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworQ29sb3IgU3R5bGVSZXNv
bHZlcjo6Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlLCBi
b29sIGZvclZpc2l0ZWRMaW5rKSBjb25zdAoreworICAgIGlmICh2YWx1ZS0+aXNSR0JDb2xvcigp
KQorICAgICAgICByZXR1cm4gQ29sb3IodmFsdWUtPmdldFJHQkEzMlZhbHVlKCkpOworCisgICAg
Y29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0
SWRlbnQoKTsKKyAgICBzd2l0Y2ggKGlkZW50KSB7CisgICAgY2FzZSAwOgorICAgICAgICByZXR1
cm4gQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKKyAgICAgICAgcmV0dXJu
IHN0YXRlLmRvY3VtZW50KCktPnRleHRDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRM
aW5rOgorICAgICAgICByZXR1cm4gKHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkgJiYgZm9yVmlz
aXRlZExpbmspID8gc3RhdGUuZG9jdW1lbnQoKS0+dmlzaXRlZExpbmtDb2xvcigpIDogc3RhdGUu
ZG9jdW1lbnQoKS0+bGlua0NvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxp
bms6CisgICAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudCgpLT5hY3RpdmVMaW5rQ29sb3IoKTsK
KyAgICBjYXNlIENTU1ZhbHVlV2Via2l0Rm9jdXNSaW5nQ29sb3I6CisgICAgICAgIHJldHVybiBS
ZW5kZXJUaGVtZTo6Zm9jdXNSaW5nQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNv
bG9yOgorICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKKyAgICBkZWZhdWx0
OgorICAgICAgICByZXR1cm4gY29sb3JGb3JDU1NWYWx1ZShpZGVudCk7CisgICAgfQorfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChj
b25zdCBNZWRpYVF1ZXJ5RXhwKiBleHByLCBib29sIHJlc3VsdCkKK3sKKyAgICBtX3ZpZXdwb3J0
RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuYXBwZW5kKGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5
UmVzdWx0KCpleHByLCByZXN1bHQpKSk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6YWZmZWN0
ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3QKK3sKKyAgICB1bnNpZ25lZCBzID0gbV92aWV3cG9y
dERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgczsgaSsrKSB7CisgICAgICAgIGlmIChtX21lZGl1bS0+ZXZhbCgmbV92aWV3cG9y
dERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX2V4cHJlc3Npb24pICE9IG1fdmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9yZXN1bHQpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgVHJhbnNm
b3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUoV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zZm9ybU9wZXJhdGlvblR5cGUgdHlwZSkKK3sKKyAg
ICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2Fs
ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU7Cisg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9YOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6U0NBTEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpT
Y2FsZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxF
X1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5zZm9ybU9w
ZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfM0Q7CisgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6VFJBTlNMQVRFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNs
YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNM
QVRFX1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV8zRDsK
KyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURTsKKyAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpST1RBVEVfWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpS
T1RBVEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWjsKKyAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlNLRVc7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWDsKKyAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6TUFUUklYOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJp
eDNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVhf
M0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zv
cm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlBFUlNQRUNUSVZFOworICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok5PTkU7CisgICAgfQorICAgIHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246Ok5PTkU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlVHJh
bnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBS
ZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25z
KQoreworICAgIGlmICghaW5WYWx1ZSB8fCAhaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeworICAg
ICAgICBvdXRPcGVyYXRpb25zLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgp
IDogMTsKKyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7
CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisKKyAgICAgICAgaWYg
KCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKiB0cmFuc2Zvcm1WYWx1
ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKj4oaS52YWx1ZSgpKTsKKyAg
ICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZhbHNlOworICAgICAg
ICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpOyArK2op
IHsKKyAgICAgICAgICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGhhdmVOb25Qcmlt
aXRpdmVWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1ZSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygwKSk7CisKKyAgICAgICAgc3dpdGNoICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSB7CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNj
YWxlVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91
YmxlIHN4ID0gMS4wOworICAgICAgICAgICAgZG91YmxlIHN5ID0gMS4wOworICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBzeSA9IGZp
cnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7
CisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAg
IHN5ID0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpj
cmVhdGUoc3gsIHN5LCAxLjAsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJh
dGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5z
Zm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIHN4ID0gMS4wOworICAgICAgICAg
ICAgZG91YmxlIHN5ID0gMS4wOworICAgICAgICAgICAgZG91YmxlIHN6ID0gMS4wOworICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBz
eiA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgc3kgPSBmaXJzdFZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAg
ICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBzeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZh
bHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAg
ICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHN4OworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0
aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHN4LCBzeSwgc3os
IGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlv
bjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5z
Zm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3RoIHR4ID0gTGVuZ3RoKDAsIEZpeGVk
KTsKKyAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB0
eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHggPSBjb252
ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9y
KTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAh
PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikg
eworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZl
cnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9y
KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIG9wZXJhdGlv
bnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0
ZSh0eCwgdHksIExlbmd0aCgwLCBGaXhlZCksIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpU
cmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGggdHgg
PSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZp
eGVkKTsKKyAgICAgICAgICAgIExlbmd0aCB0eiA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUs
IHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9y
bU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZp
cnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICAgICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVl
LCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgodGhpcmRWYWx1ZSwg
c3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9G
bG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZpbmVkKCkgfHwg
dHouaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1P
cGVyYXRpb246OmNyZWF0ZSh0eCwgdHksIHR6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUt
PmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5h
cHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoMCwgMCwgMSwgYW5nbGUsIGdl
dFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246CisgICAg
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRp
b246IHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSB5ID0g
MDsKKyAgICAgICAgICAgIGRvdWJsZSB6ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9
IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3Rh
dGVYVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHggPSAxOworICAgICAgICAg
ICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICB5ID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ID0gMTsKKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVy
YXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlM0RU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVu
Z3RoKCkgPCA0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOworICAgICAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZvdXJ0aFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSk7
CisgICAgICAgICAgICBkb3VibGUgeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICBkb3VibGUgeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAg
ICAgICAgICAgZG91YmxlIHogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAg
ICAgICAgZG91YmxlIGFuZ2xlID0gZm91cnRoVmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3Bl
cmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFu
c2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNr
ZXdYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFuZ2xl
WCA9IDA7CisgICAgICAgICAgICBkb3VibGUgYW5nbGVZID0gMDsKKyAgICAgICAgICAgIGRvdWJs
ZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgYW5nbGVZID0gYW5n
bGU7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbmdsZVggPSBhbmdsZTsK
KyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAg
ICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZVkgPSBzZWNvbmRWYWx1
ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGVYLCBhbmdsZVksIGdl
dFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDYpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBkb3VibGUgYSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICBkb3VibGUgYiA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgZG91YmxlIGMgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFs
dWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSktPmdldERvdWJs
ZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZSA9IHpvb21GYWN0b3IgKiBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBmID0gem9vbUZh
Y3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjo6
Y3JlYXRlKGEsIGIsIGMsIGQsIGUsIGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeDNEVHJhbnNmb3Jt
T3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwg
MTYpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCBtYXRyaXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVl
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSktPmdl
dERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygzKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg2KSktPmdldERvdWJsZVZh
bHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg3KSkt
PmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjayg4KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayg5KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMCkpLT5nZXREb3VibGVWYWx1ZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTEpKS0+Z2V0RG91
YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9yICog
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxMikpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEzKSktPmdldERvdWJsZVZh
bHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNCkp
LT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMTUpKS0+Z2V0RG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICBvcGVyYXRpb25z
Lm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSht
YXRyaXgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBMZW5ndGggcCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBpZiAo
Zmlyc3RWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBwID0gY29udmVydFRvRmxv
YXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAg
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcXVpcmsgdGhhdCBz
aG91bGQgZ28gYXdheSB3aGVuIDNkIHRyYW5zZm9ybXMgYXJlIGZpbmFsaXplZC4KKyAgICAgICAg
ICAgICAgICBkb3VibGUgdmFsID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAg
ICAgICAgICAgICBwID0gdmFsID49IDAgPyBMZW5ndGgoY2xhbXBUb1Bvc2l0aXZlSW50ZWdlcih2
YWwpLCBGaXhlZCkgOiBMZW5ndGgoVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKHAuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChQZXJzcGVjdGl2
ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFu
c2Zvcm1PcGVyYXRpb246CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0T3BlcmF0aW9ucyA9IG9w
ZXJhdGlvbnM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMp
CitzdGF0aWMgRmlsdGVyT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGZpbHRlck9wZXJhdGlvbkZv
clR5cGUoV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkZpbHRlck9wZXJhdGlvblR5cGUgdHlwZSkKK3sK
KyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpSZWZl
cmVuY2VGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlJF
RkVSRU5DRTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJP
cGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkdSQVlTQ0FMRTsKKyAg
ICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKKyAgICAg
ICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0VQSUE7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OlNBVFVSQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJv
dGF0ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SFVF
X1JPVEFURTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJPcGVy
YXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OklOVkVSVDsKKyAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpPUEFDSVRZOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OkJSSUdIVE5FU1M7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29u
dHJhc3RGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkNP
TlRSQVNUOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRp
b246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkJMVVI7CisgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6RFJPUF9TSEFET1c7CisjaWYgRU5BQkxFKENTU19TSEFERVJT
KQorICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkN1c3RvbUZpbHRlck9wZXJhdGlvbjoK
KyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NOworI2VuZGlmCisgICAgY2Fz
ZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Tk9ORTsKKyAgICB9CisgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6Tk9ORTsKK30KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNW
RykKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKQoreworICAg
IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKCFzdGF0ZS5zdHlsZSgpLT5oYXNGaWx0
ZXIoKSB8fCBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIg
PSBzdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworICAgIFZlY3RvcjxS
ZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gc3RhdGUuc3R5bGUo
KS0+bXV0YWJsZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgZmlsdGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8Rmls
dGVyT3BlcmF0aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOwor
ICAgICAgICBpZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVy
T3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUZpbHRlck9wZXJh
dGlvbiogcmVmZXJlbmNlRmlsdGVyID0gc3RhdGljX2Nhc3Q8UmVmZXJlbmNlRmlsdGVyT3BlcmF0
aW9uKj4oZmlsdGVyT3BlcmF0aW9uLmdldCgpKTsKKworICAgICAgICAgICAgV2ViS2l0Q1NTU1ZH
RG9jdW1lbnRWYWx1ZSogdmFsdWUgPSBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuZ2V0KHJl
ZmVyZW5jZUZpbHRlcikuZ2V0KCk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ2FjaGVkU1ZHRG9jdW1lbnQqIGNhY2hlZERv
Y3VtZW50ID0gdmFsdWUtPmxvYWQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgICAgICAgICAg
aWYgKCFjYWNoZWREb2N1bWVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAgICAgLy8gU3Rhc2ggdGhlIENhY2hlZFNWR0RvY3VtZW50IG9uIHRoZSByZWZlcmVuY2UgZmls
dGVyLgorICAgICAgICAgICAgcmVmZXJlbmNlRmlsdGVyLT5zZXRDYWNoZWRTVkdEb2N1bWVudFJl
ZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UoY2FjaGVkRG9j
dW1lbnQpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50
cygpLmNsZWFyKCk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKK1N0eWxl
U2hhZGVyKiBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYWRlcihDU1NWYWx1ZSogdmFsdWUpCit7Cisg
ICAgaWYgKHZhbHVlLT5pc1dlYktpdENTU1NoYWRlclZhbHVlKCkpCisgICAgICAgIHJldHVybiBj
YWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShzdGF0aWNfY2FzdDxXZWJLaXRDU1NT
aGFkZXJWYWx1ZSo+KHZhbHVlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK1N0eWxlU2hhZGVyKiBT
dHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRD
U1NTaGFkZXJWYWx1ZSogdmFsdWUpCit7CisgICAgU3R5bGVTaGFkZXIqIHNoYWRlciA9IHZhbHVl
LT5jYWNoZWRPclBlbmRpbmdTaGFkZXIoKTsKKyAgICBpZiAoc2hhZGVyICYmIHNoYWRlci0+aXNQ
ZW5kaW5nU2hhZGVyKCkpCisgICAgICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnModHJ1
ZSk7CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVu
ZGluZ1NoYWRlcnMoKQoreworICAgIGlmICghbV9zdGF0ZS5zdHlsZSgpLT5oYXNGaWx0ZXIoKSB8
fCAhbV9zdGF0ZS5oYXNQZW5kaW5nU2hhZGVycygpKQorICAgICAgICByZXR1cm47CisKKyAgICBD
YWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBtX3N0YXRlLmRvY3Vt
ZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisKKyAgICBWZWN0b3I8UmVmUHRyPEZpbHRl
ck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IG1fc3RhdGUuc3R5bGUoKS0+bXV0YWJs
ZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmls
dGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8RmlsdGVyT3BlcmF0
aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOworICAgICAgICBp
ZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVyT3BlcmF0aW9u
OjpDVVNUT00pIHsKKyAgICAgICAgICAgIEN1c3RvbUZpbHRlck9wZXJhdGlvbiogY3VzdG9tRmls
dGVyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9u
LmdldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVChjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7Cisg
ICAgICAgICAgICBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qIHByb2dyYW0gPSBzdGF0aWNfY2Fz
dDxTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qPihjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7Cisg
ICAgICAgICAgICBpZiAocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkgJiYgcHJvZ3JhbS0+dmVydGV4
U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7CisgICAgICAgICAgICAgICAgV2ViS2l0Q1NT
U2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVy
Kj4ocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOworICAgICAgICAg
ICAgICAgIHByb2dyYW0tPnNldFZlcnRleFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVy
KGNhY2hlZFJlc291cmNlTG9hZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
cHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSAmJiBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLT5p
c1BlbmRpbmdTaGFkZXIoKSkgeworICAgICAgICAgICAgICAgIFdlYktpdENTU1NoYWRlclZhbHVl
KiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRlcio+KHByb2dyYW0t
PmZyYWdtZW50U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOworICAgICAgICAgICAgICAgIHBy
b2dyYW0tPnNldEZyYWdtZW50U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVk
UmVzb3VyY2VMb2FkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBt
X3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKTsKK30KKworc3RhdGljIGJvb2wgc29y
dFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI+JiBhLCBjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiYgYikKK3sKKyAg
ICByZXR1cm4gY29kZVBvaW50Q29tcGFyZUxlc3NUaGFuKGEtPm5hbWUoKSwgYi0+bmFtZSgpKTsK
K30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBh
cnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1
ZUxpc3QqIHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI+
IGFycmF5UGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI6OmNyZWF0ZShuYW1l
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBsZW5ndGggPSB2YWx1ZXMtPmxlbmd0aCgpOyBp
IDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKGkpOworICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7
CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGFy
cmF5UGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7
CisgICAgfQorICAgIHJldHVybiBhcnJheVBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFs
dWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI+IG51bWJlclBh
cmFtZXRlciA9IEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YWx1ZXMtPmxlbmd0aCgpOyArK2kpIHsKKyAgICAg
ICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwor
ICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG51bWJlclBhcmFtZXRlci0+YWRkVmFsdWUo
cHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVt
YmVyUGFyYW1ldGVyLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVy
KGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRy
PEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcj4gdHJhbnNmb3JtUGFyYW1ldGVyID0gQ3Vz
dG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7CisgICAgVHJhbnNmb3Jt
T3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFs
dWVzLCBtX3N0YXRlLnN0eWxlKCksIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRp
b25zKTsKKyAgICB0cmFuc2Zvcm1QYXJhbWV0ZXItPnNldE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7
CisgICAgcmV0dXJuIHRyYW5zZm9ybVBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRl
clBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKiBwYXJhbWV0ZXJWYWx1ZSkK
K3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IG90aGVyIHBhcmFtZXRlcnMgdHlwZXMgcGFyc2lu
Zy4KKyAgICAvLyBib29sZWFuczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTc2NDM4CisgICAgLy8gdGV4dHVyZXM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03MTQ0MgorICAgIC8vIG1hdDIsIG1hdDMsIG1hdDQ6IGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTQ0NAorICAgIC8vIE51bWJlciBwYXJhbWV0ZXJz
IGFyZSB3cmFwcGVkIGluc2lkZSBhIENTU1ZhbHVlTGlzdCBhbmQgYWxsCisgICAgLy8gdGhlIG90
aGVyIGZ1bmN0aW9ucyB2YWx1ZXMgaW5oZXJpdCBmcm9tIENTU1ZhbHVlTGlzdC4KKyAgICBpZiAo
IXBhcmFtZXRlclZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IENTU1ZhbHVlTGlzdCogdmFsdWVzID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4ocGFyYW1l
dGVyVmFsdWUpOworICAgIGlmICghdmFsdWVzLT5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBpZiAocGFyYW1ldGVyVmFsdWUtPmlzV2ViS2l0Q1NTQXJyYXlGdW5jdGlvblZhbHVl
KCkpCisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKG5hbWUs
IHZhbHVlcyk7CisKKyAgICAvLyBJZiB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGxpc3QgaXMgYSB0
cmFuc2Zvcm0gZnVuY3Rpb24sCisgICAgLy8gdGhlbiB3ZSBjb3VsZCBzYWZlbHkgYXNzdW1lIHRo
YXQgYWxsIHRoZSByZW1haW5pbmcgaXRlbXMKKyAgICAvLyBhcmUgdHJhbnNmb3Jtcy4gcGFyc2VD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIgd2lsbAorICAgIC8vIHJldHVybiAwIGlmIHRo
YXQgYXNzdW1wdGlvbiBpcyBpbmNvcnJlY3QuCisgICAgaWYgKHZhbHVlcy0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygwKS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQorICAgICAgICByZXR1
cm4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKwor
ICAgIC8vIFdlIGNhbiBoYXZlIG9ubHkgYXJyYXlzIG9mIGJvb2xlYW5zIG9yIG51bWJlcnMsIHNv
IHVzZSB0aGUgZmlyc3QgdmFsdWUgdG8gY2hvb3NlIGJldHdlZW4gdGhvc2UgdHdvLgorICAgIC8v
IFdlIG5lZWQgdXAgdG8gNCB2YWx1ZXMgKGFsbCBib29sZWFucyBvciBhbGwgbnVtYmVycykuCisg
ICAgaWYgKCF2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFs
dWUoKSB8fCB2YWx1ZXMtPmxlbmd0aCgpID4gNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0UHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7Cisg
ICAgaWYgKGZpcnN0UHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRp
dmVWYWx1ZTo6Q1NTX05VTUJFUikKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyTnVt
YmVyUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7CisKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHRo
ZSBib29sZWFuIGFycmF5IHBhcmFtZXRlciBoZXJlLgorICAgIC8vIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQzOAorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wg
U3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiBw
YXJhbWV0ZXJzVmFsdWUsIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmIHBhcmFtZXRlckxpc3Qp
Cit7CisgICAgSGFzaFNldDxTdHJpbmc+IGtub3duUGFyYW1ldGVyTmFtZXM7CisgICAgQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgcGFyYW1ldGVySXRlcmF0b3IocGFyYW1ldGVyc1ZhbHVlKTsKKyAgICBm
b3IgKDsgcGFyYW1ldGVySXRlcmF0b3IuaGFzTW9yZSgpOyBwYXJhbWV0ZXJJdGVyYXRvci5hZHZh
bmNlKCkpIHsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpLT5pc1ZhbHVl
TGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBDU1NWYWx1ZUxpc3RJ
dGVyYXRvciBpdGVyYXRvcihwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgaWYg
KCFpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfU1RS
SU5HKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgU3RyaW5n
IG5hbWUgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgLy8gRG8g
bm90IGFsbG93IGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMuCisgICAgICAgIGlmIChrbm93blBh
cmFtZXRlck5hbWVzLmNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBrbm93blBhcmFtZXRlck5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgCisgICAgICAg
IGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghaXRlcmF0b3IuaGFz
TW9yZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgUmVm
UHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyYW1ldGVyID0gcGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXIobmFtZSwgaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmICghcGFyYW1ldGVy
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBwYXJhbWV0ZXJMaXN0LmFwcGVu
ZChwYXJhbWV0ZXIucmVsZWFzZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gTWFrZSBzdXJlIHdl
IHNvcnQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHBhc3NpbmcgdGhlbSBkb3duIHRvIHRoZSBDdXN0
b21GaWx0ZXJPcGVyYXRpb24uCisgICAgc3RkOjpzb3J0KHBhcmFtZXRlckxpc3QuYmVnaW4oKSwg
cGFyYW1ldGVyTGlzdC5lbmQoKSwgc29ydFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKTsKKyAg
ICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRp
b24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1bGVS
ZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQoreworICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgc3R5bGUgcmVzb2x1dGlvbiBmb3IgdGhlIGN1c3RvbSBmaWx0
ZXIgYXQtcnVsZSByZWZlcmVuY2Ugc3ludGF4LgorICAgIFVOVVNFRF9QQVJBTShmaWx0ZXJWYWx1
ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
PiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3lu
dGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICBDU1NWYWx1ZSog
c2hhZGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Cisg
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2hhZGVyc1ZhbHVlLT5pc1ZhbHVl
TGlzdCgpKTsKKyAgICBDU1NWYWx1ZUxpc3QqIHNoYWRlcnNMaXN0ID0gc3RhdGljX2Nhc3Q8Q1NT
VmFsdWVMaXN0Kj4oc2hhZGVyc1ZhbHVlKTsKKworICAgIHVuc2lnbmVkIHNoYWRlcnNMaXN0TGVu
Z3RoID0gc2hhZGVyc0xpc3QtPmxlbmd0aCgpOworICAgIEFTU0VSVChzaGFkZXJzTGlzdExlbmd0
aCk7CisKKyAgICBSZWZQdHI8U3R5bGVTaGFkZXI+IHZlcnRleFNoYWRlciA9IHN0eWxlU2hhZGVy
KHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKyAgICBSZWZQdHI8U3R5
bGVTaGFkZXI+IGZyYWdtZW50U2hhZGVyOworICAgIEN1c3RvbUZpbHRlclByb2dyYW1UeXBlIHBy
b2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX0JMRU5EU19FTEVNRU5UX1RFWFRVUkU7CisgICAgQ3Vz
dG9tRmlsdGVyUHJvZ3JhbU1peFNldHRpbmdzIG1peFNldHRpbmdzOworCisgICAgaWYgKHNoYWRl
cnNMaXN0TGVuZ3RoID4gMSkgeworICAgICAgICBDU1NWYWx1ZSogZnJhZ21lbnRTaGFkZXJPck1p
eEZ1bmN0aW9uID0gc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7CisKKyAg
ICAgICAgaWYgKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbi0+aXNXZWJLaXRDU1NNaXhGdW5j
dGlvblZhbHVlKCkpIHsKKyAgICAgICAgICAgIFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUqIG1p
eEZ1bmN0aW9uID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSo+KGZyYWdt
ZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7CisgICAgICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRv
ciBpdGVyYXRvcihtaXhGdW5jdGlvbik7CisKKyAgICAgICAgICAgIEFTU0VSVChtaXhGdW5jdGlv
bi0+bGVuZ3RoKCkpOworICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihp
dGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKworICAg
ICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSA8PSAzKTsKKyAgICAgICAgICAg
IHdoaWxlIChpdGVyYXRvci5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmIChDU1NQYXJzZXI6OmlzQmxl
bmRNb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAg
bWl4U2V0dGluZ3MuYmxlbmRNb2RlID0gKnByaW1pdGl2ZVZhbHVlOworICAgICAgICAgICAgICAg
IGVsc2UgaWYgKENTU1BhcnNlcjo6aXNDb21wb3NpdGVPcGVyYXRvcihwcmltaXRpdmVWYWx1ZS0+
Z2V0SWRlbnQoKSkpCisgICAgICAgICAgICAgICAgICAgIG1peFNldHRpbmdzLmNvbXBvc2l0ZU9w
ZXJhdG9yID0gKnByaW1pdGl2ZVZhbHVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgaXRlcmF0
b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfTk9fRUxFTUVOVF9URVhUVVJFOworICAgICAg
ICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihmcmFnbWVudFNoYWRlck9yTWl4RnVu
Y3Rpb24pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIG1lc2hSb3dzID0g
MTsKKyAgICB1bnNpZ25lZCBtZXNoQ29sdW1ucyA9IDE7CisgICAgQ3VzdG9tRmlsdGVyTWVzaFR5
cGUgbWVzaFR5cGUgPSBNZXNoVHlwZUF0dGFjaGVkOworICAgIAorICAgIENTU1ZhbHVlKiBwYXJh
bWV0ZXJzVmFsdWUgPSAwOworICAgIAorICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7CisgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKGZpbHRlclZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBzZWNv
bmQgdmFsdWUgbWlnaHQgYmUgdGhlIG1lc2ggYm94IG9yIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnM6
CisgICAgICAgIC8vIElmIGl0IHN0YXJ0cyB3aXRoIGEgbnVtYmVyIG9yIGFueSBvZiB0aGUgbWVz
aC1ib3ggaWRlbnRpZmllcnMgaXQgaXMgCisgICAgICAgIC8vIHRoZSBtZXNoLWJveCBsaXN0LCBp
ZiBub3QgaXQgbWVhbnMgaXQgaXMgdGhlIHBhcmFtZXRlcnMgbGlzdC4KKworICAgICAgICBpZiAo
aXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAg
ICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIG9ubHkg
b25lIGludGVnZXIgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHNldCBib3RoCisgICAgICAg
ICAgICAgICAgLy8gdGhlIHJvd3MgYW5kIHRoZSBjb2x1bW5zLgorICAgICAgICAgICAgICAgIG1l
c2hDb2x1bW5zID0gbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKKyAg
ICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGFub3RoZXIgbnVtYmVyIGZvciB0aGUgcm93cy4K
KyAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJp
bWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9y
LnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVt
YmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc2hSb3dzID0gcHJpbWl0aXZlVmFs
dWUtPmdldEludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZh
bmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3Jl
KCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlRGV0YWNoZWQpIHsKKyAgICAgICAgICAgICAgICBtZXNoVHlw
ZSA9IE1lc2hUeXBlRGV0YWNoZWQ7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWl0ZXJh
dG9yLmluZGV4KCkpIHsKKyAgICAgICAgICAgIC8vIElmIG5vIHZhbHVlIHdhcyBjb25zdW1lZCBm
cm9tIHRoZSBtZXNoIHZhbHVlLCB0aGVuIGl0IGlzIGp1c3QgYSBwYXJhbWV0ZXIgbGlzdCwgbWVh
bmluZyB0aGF0IHdlIGVuZCB1cAorICAgICAgICAgICAgLy8gaGF2aW5nIGp1c3QgdHdvIENTU0xp
c3RWYWx1ZXM6IGxpc3Qgb2Ygc2hhZGVycyBhbmQgbGlzdCBvZiBwYXJhbWV0ZXJzLgorICAgICAg
ICAgICAgQVNTRVJUKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAyKTsKKyAgICAgICAgICAgIHBh
cmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpOwor
ICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPiAy
ICYmICFwYXJhbWV0ZXJzVmFsdWUpCisgICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpOworICAgIAorICAgIEN1c3RvbUZpbHRlclBh
cmFtZXRlckxpc3QgcGFyYW1ldGVyTGlzdDsKKyAgICBpZiAocGFyYW1ldGVyc1ZhbHVlICYmICFw
YXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QocGFyYW1ldGVyc1ZhbHVlLCBwYXJhbWV0ZXJM
aXN0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgUmVmUHRyPFN0eWxlQ3VzdG9tRmls
dGVyUHJvZ3JhbT4gcHJvZ3JhbSA9IFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbTo6Y3JlYXRlKHZl
cnRleFNoYWRlci5yZWxlYXNlKCksIGZyYWdtZW50U2hhZGVyLnJlbGVhc2UoKSwgcHJvZ3JhbVR5
cGUsIG1peFNldHRpbmdzLCBtZXNoVHlwZSk7CisgICAgcmV0dXJuIEN1c3RvbUZpbHRlck9wZXJh
dGlvbjo6Y3JlYXRlKHByb2dyYW0ucmVsZWFzZSgpLCBwYXJhbWV0ZXJMaXN0LCBtZXNoUm93cywg
bWVzaENvbHVtbnMsIG1lc2hUeXBlKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVy
YXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRD
U1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCit7CisgICAgQVNTRVJUKGZpbHRlclZhbHVlLT5s
ZW5ndGgoKSk7CisgICAgYm9vbCBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA9IGZpbHRlclZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVlKCk7CisgICAgcmV0
dXJuIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID8gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9u
V2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChmaWx0ZXJWYWx1ZSkgOiBjcmVhdGVDdXN0b21GaWx0
ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KGZpbHRlclZhbHVlKTsKK30KKworI2VuZGlmCisK
K2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5W
YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJP
cGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKQoreworICAgIEFTU0VSVChvdXRPcGVyYXRpb25zLmlz
RW1wdHkoKSk7CisgICAgCisgICAgaWYgKCFpblZhbHVlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgCisgICAgaWYgKGluVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KGluVmFsdWUpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkgPT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIGlmICghaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpvb20o
KSA6IDE7CisgICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGZvciAoQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewor
ICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICBpZiAoIWN1
cnJWYWx1ZS0+aXNXZWJLaXRDU1NGaWx0ZXJWYWx1ZSgpKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlID0gc3RhdGljX2Nh
c3Q8V2ViS2l0Q1NTRmlsdGVyVmFsdWUqPihpLnZhbHVlKCkpOworICAgICAgICBGaWx0ZXJPcGVy
YXRpb246Ok9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9IGZpbHRlck9wZXJhdGlvbkZvclR5
cGUoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQURF
UlMpCisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6VkFMSURB
VEVEX0NVU1RPTSkgeworICAgICAgICAgICAgLy8gVmFsaWRhdGVkQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBlbmQgdXAgaW4gdGhlIFJlbmRlclN0eWxlLgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RP
TSkgeworICAgICAgICAgICAgUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0aW9u
ID0gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKGZpbHRlclZhbHVlKTsKKyAgICAgICAgICAg
IGlmICghb3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlv
bik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlm
IChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7CisjaWYgRU5B
QkxFKFNWRykKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBhcmd1bWVudCA9
IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworCisgICAgICAgICAgICBp
ZiAoIWFyZ3VtZW50LT5pc1dlYktpdENTU1NWR0RvY3VtZW50VmFsdWUoKSkKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSog
c3ZnRG9jdW1lbnRWYWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWUq
Pihhcmd1bWVudCk7CisgICAgICAgICAgICBLVVJMIHVybCA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+
Y29tcGxldGVVUkwoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCkpOworCisgICAgICAgICAgICBSZWZQ
dHI8UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBSZWZlcmVuY2VGaWx0ZXJP
cGVyYXRpb246OmNyZWF0ZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgdXJsLmZyYWdtZW50SWRl
bnRpZmllcigpLCBvcGVyYXRpb25UeXBlKTsKKyAgICAgICAgICAgIGlmIChTVkdVUklSZWZlcmVu
Y2U6OmlzRXh0ZXJuYWxVUklSZWZlcmVuY2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIG1fc3Rh
dGUuZG9jdW1lbnQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN2Z0RvY3VtZW50VmFsdWUt
PmxvYWRSZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZS5wZW5kaW5nU1ZH
RG9jdW1lbnRzKCkuc2V0KG9wZXJhdGlvbi5nZXQoKSwgc3ZnRG9jdW1lbnRWYWx1ZSk7CisgICAg
ICAgICAgICAgICAgZWxzZSBpZiAoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQo
KSkKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLT5zZXRDYWNoZWRTVkdEb2N1bWVudFJl
ZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2Uoc3ZnRG9jdW1l
bnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24pOworI2VuZGlmCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoYXQg
YWxsIHBhcmFtZXRlcnMgYXJlIHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggdGhlCisgICAgICAgIC8v
IGV4Y2VwdGlvbiBvZiBkcm9wIHNoYWRvdyB3aGljaCBoYXMgYSBTaGFkb3dWYWx1ZSBwYXJhbWV0
ZXIuCisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlICE9IEZpbHRlck9wZXJhdGlvbjo6RFJPUF9T
SEFET1cpIHsKKyAgICAgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7
CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgZmlsdGVyVmFsdWUtPmxlbmd0
aCgpOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhh
dmVOb25QcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorCisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0gZmlsdGVyVmFsdWUt
Pmxlbmd0aCgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmaWx0ZXJWYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSkgOiAwOworICAgICAgICBzd2l0Y2ggKGZpbHRlclZh
bHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6R3JheXNjYWxlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRl
clZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBh
bW91bnQgPSAxOworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKSB7
CisgICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNQZXJjZW50YWdlKCkpCisgICAgICAg
ICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3Bl
cmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpIdWVSb3Rh
dGVGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IDA7CisgICAg
ICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpCisgICAgICAgICAgICAgICAg
YW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworCisgICAgICAgICAgICBvcGVy
YXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlv
bjo6Y3JlYXRlKGFuZ2xlLCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJP
cGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5lc3NG
aWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkNvbnRy
YXN0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpP
cGFjaXR5RmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW1vdW50ID0gKGZp
bHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdo
dG5lc3NGaWx0ZXJPcGVyYXRpb24pID8gMCA6IDE7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFs
dWUtPmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVl
LT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1Bl
cmNlbnRhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2lj
Q29tcG9uZW50VHJhbnNmZXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlv
blR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIExl
bmd0aCBzdGREZXZpYXRpb24gPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA+PSAxKQorICAgICAgICAgICAgICAgIHN0ZERldmlhdGlvbiA9
IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21G
YWN0b3IpOworICAgICAgICAgICAgaWYgKHN0ZERldmlhdGlvbi5pc1VuZGVmaW5lZCgpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKEJsdXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShzdGREZXZpYXRpb24s
IG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246IHsK
KyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIENTU1ZhbHVlKiBjc3NWYWx1ZSA9IGZp
bHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworICAgICAgICAgICAgaWYgKCFj
c3NWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4o
Y3NzVmFsdWUpOworICAgICAgICAgICAgSW50UG9pbnQgbG9jYXRpb24oaXRlbS0+eC0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290
U3R5bGUsIHpvb21GYWN0b3IpKTsKKyAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/
IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFj
dG9yKSA6IDA7CisgICAgICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgIGlmIChpdGVt
LT5jb2xvcikKKyAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVl
KGl0ZW0tPmNvbG9yLmdldCgpKTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKERyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShsb2NhdGlvbiwgYmx1
ciwgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQsIG9wZXJhdGlv
blR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorCisgICAgb3V0T3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0
eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqIHBlbmRpbmdJ
bWFnZSkKK3sKKyAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIg
PSBtX3N0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisKKyAgICBpZiAo
cGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VWYWx1ZSog
aW1hZ2VWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpOworICAgICAgICByZXR1
cm4gaW1hZ2VWYWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0K
KworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgeworICAg
ICAgICBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiBpbWFnZUdlbmVyYXRvclZhbHVlID0gcGVuZGlu
Z0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCk7CisgICAgICAgIGltYWdlR2VuZXJhdG9y
VmFsdWUtPmxvYWRTdWJpbWFnZXMoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgICAgICByZXR1
cm4gU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKGltYWdlR2VuZXJhdG9yVmFsdWUpOworICAg
IH0KKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKSkgeworICAg
ICAgICBDU1NDdXJzb3JJbWFnZVZhbHVlKiBjdXJzb3JJbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdl
LT5jc3NDdXJzb3JJbWFnZVZhbHVlKCk7CisgICAgICAgIHJldHVybiBjdXJzb3JJbWFnZVZhbHVl
LT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgfQorCisjaWYgRU5BQkxF
KENTU19JTUFHRV9TRVQpCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgp
KSB7CisgICAgICAgIENTU0ltYWdlU2V0VmFsdWUqIGltYWdlU2V0VmFsdWUgPSBwZW5kaW5nSW1h
Z2UtPmNzc0ltYWdlU2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGltYWdlU2V0VmFsdWUtPmNh
Y2hlZEltYWdlU2V0KGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9CisjZW5kaWYKKworICAg
IHJldHVybiAwOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2VzKCkK
K3sKKyAgICBpZiAobV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRl
cmF0b3I6OktleXMgZW5kID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuZW5kKCku
a2V5cygpOworICAgIGZvciAoUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0X2l0ZXJhdG9y
OjpLZXlzIGl0ID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuYmVnaW4oKS5rZXlz
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBDU1NQcm9wZXJ0eUlEIGN1cnJlbnRQcm9w
ZXJ0eSA9ICppdDsKKworICAgICAgICBzd2l0Y2ggKGN1cnJlbnRQcm9wZXJ0eSkgeworICAgICAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOiB7CisgICAgICAgICAgICBmb3IgKEZp
bGxMYXllciogYmFja2dyb3VuZExheWVyID0gbV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NCYWNrZ3Jv
dW5kTGF5ZXJzKCk7IGJhY2tncm91bmRMYXllcjsgYmFja2dyb3VuZExheWVyID0gYmFja2dyb3Vu
ZExheWVyLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZExheWVyLT5p
bWFnZSgpICYmIGJhY2tncm91bmRMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAg
ICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZExheWVyLT5zZXRJbWFnZShsb2FkUGVuZGluZ0lt
YWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oYmFja2dyb3VuZExheWVyLT5pbWFn
ZSgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6IHsKKyAgICAgICAgICAgIGZvciAoQ29udGVu
dERhdGEqIGNvbnRlbnREYXRhID0gY29uc3RfY2FzdDxDb250ZW50RGF0YSo+KG1fc3RhdGUuc3R5
bGUoKS0+Y29udGVudERhdGEoKSk7IGNvbnRlbnREYXRhOyBjb250ZW50RGF0YSA9IGNvbnRlbnRE
YXRhLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudERhdGEtPmlzSW1hZ2Uo
KSkgeworICAgICAgICAgICAgICAgICAgICBTdHlsZUltYWdlKiBpbWFnZSA9IHN0YXRpY19jYXN0
PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPmltYWdlKCk7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShz
dGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGltYWdlKSk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAobG9hZGVkSW1hZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+c2V0SW1hZ2UobG9hZGVk
SW1hZ2UucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgQ1NTUHJvcGVydHlDdXJzb3I6IHsKKyAgICAgICAgICAgIGlmIChDdXJzb3JMaXN0KiBj
dXJzb3JMaXN0ID0gbV9zdGF0ZS5zdHlsZSgpLT5jdXJzb3JzKCkpIHsKKyAgICAgICAgICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGN1cnNvckxpc3QtPnNpemUoKTsgKytpKSB7CisgICAg
ICAgICAgICAgICAgICAgIEN1cnNvckRhdGEmIGN1cnJlbnRDdXJzb3IgPSBjdXJzb3JMaXN0LT5h
dChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0eWxlSW1hZ2UqIGltYWdlID0gY3VycmVu
dEN1cnNvci5pbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmlz
UGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN1cnNv
ci5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdl
Kj4oaW1hZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0
eWxlKCktPmxpc3RTdHlsZUltYWdlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFn
ZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+
c2V0TGlzdFN0eWxlSW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRp
bmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFn
ZVNvdXJjZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VT
b3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCktPmlzUGVuZGlu
Z0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRCb3JkZXJJbWFn
ZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4o
bV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpKSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6
IHsKKyAgICAgICAgICAgIGlmIChTdHlsZVJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtX3N0YXRl
LnN0eWxlKCktPmJveFJlZmxlY3QoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IE5pbmVQaWVj
ZUltYWdlJiBtYXNrSW1hZ2UgPSByZWZsZWN0aW9uLT5tYXNrKCk7CisgICAgICAgICAgICAgICAg
aWYgKG1hc2tJbWFnZS5pbWFnZSgpICYmIG1hc2tJbWFnZS5pbWFnZSgpLT5pc1BlbmRpbmdJbWFn
ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJbWFn
ZSA9IGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNr
SW1hZ2UuaW1hZ2UoKSkpOworICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNr
KE5pbmVQaWVjZUltYWdlKGxvYWRlZEltYWdlLnJlbGVhc2UoKSwgbWFza0ltYWdlLmltYWdlU2xp
Y2VzKCksIG1hc2tJbWFnZS5maWxsKCksIG1hc2tJbWFnZS5ib3JkZXJTbGljZXMoKSwgbWFza0lt
YWdlLm91dHNldCgpLCBtYXNrSW1hZ2UuaG9yaXpvbnRhbFJ1bGUoKSwgbWFza0ltYWdlLnZlcnRp
Y2FsUnVsZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZVNvdXJjZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bWFza0Jv
eEltYWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKS0+
aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldE1h
c2tCb3hJbWFnZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGlu
Z0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSkpKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrSW1hZ2U6IHsKKyAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBtYXNrTGF5ZXIgPSBtX3N0
YXRlLnN0eWxlKCktPmFjY2Vzc01hc2tMYXllcnMoKTsgbWFza0xheWVyOyBtYXNrTGF5ZXIgPSBt
YXNrTGF5ZXItPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChtYXNrTGF5ZXItPmltYWdl
KCkgJiYgbWFza0xheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAg
ICAgICAgICBtYXNrTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8
U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNrTGF5ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3N0
YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5jbGVhcigpOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OmxvYWRQZW5kaW5nUmVzb3VyY2VzKCkKK3sKKyAgICAvLyBTdGFydCBsb2FkaW5nIGlt
YWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdJbWFnZXMoKTsK
KworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAvLyBTdGFydCBsb2FkaW5nIHRoZSBzaGFk
ZXJzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1NoYWRlcnMoKTsK
KyNlbmRpZgorICAgIAorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAg
ICAvLyBTdGFydCBsb2FkaW5nIHRoZSBTVkcgRG9jdW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBz
dHlsZS4KKyAgICBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOworI2VuZGlmCit9CisKK2lubGlu
ZSBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6TWF0Y2hlZFByb3BlcnRpZXMoKQor
ICAgIDogcG9zc2libHlQYWRkZWRNZW1iZXIoMCkKK3sKK30KKworaW5saW5lIFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjp+TWF0Y2hlZFByb3BlcnRpZXMoKQoreworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNz
SW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NT
KTsKKyAgICBpbmZvLmFkZE1lbWJlcihwcm9wZXJ0aWVzLCAicHJvcGVydGllcyIpOworfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtOjpyZXBvcnRNZW1v
cnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAg
IE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1v
cnlUeXBlczo6Q1NTKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtYXRjaGVkUHJvcGVydGllcywgIm1h
dGNoZWRQcm9wZXJ0aWVzIik7CisgICAgaW5mby5hZGRNZW1iZXIocmFuZ2VzLCAicmFuZ2VzIik7
CisgICAgaW5mby5hZGRNZW1iZXIocmVuZGVyU3R5bGUsICJyZW5kZXJTdHlsZSIpOworICAgIGlu
Zm8uYWRkTWVtYmVyKHBhcmVudFJlbmRlclN0eWxlLCAicGFyZW50UmVuZGVyU3R5bGUiKTsKK30K
Kwordm9pZCBNZWRpYVF1ZXJ5UmVzdWx0OjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJ
bmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZv
KG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBp
bmZvLmFkZE1lbWJlcihtX2V4cHJlc3Npb24sICJleHByZXNzaW9uIik7Cit9CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2Jq
ZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJ
bmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9ydWxlU2V0cywgInJ1bGVTZXRzIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9rZXlmcmFtZXNS
dWxlTWFwLCAia2V5ZnJhbWVzUnVsZU1hcCIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZSwgIm1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUiKTsKKyAgICBpbmZvLmFk
ZE1lbWJlcihtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLCAibWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZVN3ZWVwVGltZXIiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fbWVkaXVtLCAi
bWVkaXVtIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9yb290RGVmYXVsdFN0eWxlLCAicm9vdERl
ZmF1bHRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZG9jdW1lbnQsICJkb2N1bWVudCIp
OworCisgICAgaW5mby5hZGRNZW1iZXIobV9mb250U2VsZWN0b3IsICJmb250U2VsZWN0b3IiKTsK
KyAgICBpbmZvLmFkZE1lbWJlcihtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMs
ICJ2aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzIik7CisgICAgaW5mby5pZ25vcmVN
ZW1iZXIobV9zdHlsZUJ1aWxkZXIpOworICAgIGluZm8uYWRkTWVtYmVyKG1faW5zcGVjdG9yQ1NT
T01XcmFwcGVycyk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zY29wZVJlc29sdmVyLCAic2NvcGVS
ZXNvbHZlciIpOworCisgICAgaW5mby5hZGRNZW1iZXIobV9zdGF0ZSwgInN0YXRlIik7CisKKyAg
ICAvLyBGSVhNRTogbW92ZSB0aGlzIHRvIGEgcGxhY2Ugd2hlcmUgaXQgd291bGQgYmUgY2FsbGVk
IG9ubHkgb25jZT8KKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRl
ZmF1bHRTdHlsZSwgImRlZmF1bHRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlLCAiZGVmYXVsdFF1aXJrc1N0eWxlIik7
CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRT
dHlsZSwiZGVmYXVsdFByaW50U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0
U3R5bGVTaGVldHM6OmRlZmF1bHRWaWV3U291cmNlU3R5bGUsICJkZWZhdWx0Vmlld1NvdXJjZVN0
eWxlIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAkocmV2aXNpb24gMTQ0ODkzKQorKysgU291cmNlL1dl
YkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNTIx
NiArMjcsMTA0IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlN0eWxl
UmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJQYWdlUnVsZUNvbGxlY3Rvci5oIgogCi0jaW5jbHVkZSAi
QXR0cmlidXRlLmgiCi0jaW5jbHVkZSAiQ1NTQm9yZGVySW1hZ2UuaCIKLSNpbmNsdWRlICJDU1ND
YWxjdWxhdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oIgogI2lu
Y2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIkNTU0ZvbnRGYWNlUnVs
ZS5oIgotI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5oIgotI2luY2x1ZGUgIkNTU0xpbmVCb3hD
b250YWluVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NQYWdlUnVsZS5oIgotI2luY2x1ZGUgIkNTU1Bh
cnNlci5oIgotI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZhbHVlTWFwcGluZ3MuaCIKLSNpbmNsdWRl
ICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0jaW5jbHVkZSAiQ1NTUmVmbGVjdFZhbHVlLmgiCi0jaW5j
bHVkZSAiQ1NTU2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKLSNpbmNs
dWRlICJDU1NTdHlsZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NTdXBwb3J0c1J1bGUuaCIKLSNpbmNs
dWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVMaXN0Lmgi
Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0jaW5jbHVkZSAiQ1NTVmFyaWFibGVWYWx1ZS5o
IgotI2VuZGlmCi0jaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJDYWxjdWxhdGlv
blZhbHVlLmgiCi0jaW5jbHVkZSAiQ29udGVudERhdGEuaCIKLSNpbmNsdWRlICJDb250ZXh0RmVh
dHVyZXMuaCIKLSNpbmNsdWRlICJDb3VudGVyLmgiCi0jaW5jbHVkZSAiQ291bnRlckNvbnRlbnQu
aCIKLSNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKLSNpbmNsdWRlICJGb250
RmVhdHVyZVZhbHVlLmgiCi0jaW5jbHVkZSAiRm9udFZhbHVlLmgiCi0jaW5jbHVkZSAiRnJhbWUu
aCIKLSNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgot
I2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgotI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50Lmgi
Ci0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgot
I2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTFByb2dyZXNzRWxl
bWVudC5oIgotI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MVGV4
dEFyZWFFbGVtZW50LmgiCi0jaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQuaCIKLSNpbmNsdWRlICJJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJLZXlmcmFtZUxpc3QuaCIKLSNp
bmNsdWRlICJMaW5rSGFzaC5oIgotI2luY2x1ZGUgIkxvY2FsZVRvU2NyaXB0TWFwcGluZy5oIgot
I2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCi0jaW5jbHVkZSAiTWF0cml4M0RUcmFuc2Zvcm1PcGVy
YXRpb24uaCIKLSNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRl
ICJNZWRpYUxpc3QuaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCi0jaW5jbHVk
ZSAiTm9kZVJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQuaCIK
LSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGFpci5oIgotI2luY2x1ZGUgIlBlcnNwZWN0
aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgotI2luY2x1
ZGUgIlJlY3QuaCIKLSNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKLSNpbmNsdWRlICJSZW5kZXJT
Y3JvbGxiYXIuaCIKLSNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVtZS5oIgotI2luY2x1ZGUg
IlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKLSNpbmNs
dWRlICJSZW5kZXJWaWV3LmgiCi0jaW5jbHVkZSAiUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgi
Ci0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9ucy5o
IgotI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgotI2luY2x1ZGUgIlNjYWxlVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKLSNpbmNsdWRlICJT
ZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVk
ZSAiU2hhZG93RGF0YS5oIgotI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKLSNpbmNsdWRlICJTaGFk
b3dWYWx1ZS5oIgotI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCi0jaW5j
bHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5o
IgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJTdHlsZUdlbmVyYXRl
ZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVQZW5kaW5nSW1hZ2UuaCIKICNpbmNsdWRlICJTdHls
ZVByb3BlcnR5U2V0LmgiCiAjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiU3R5bGVS
dWxlSW1wb3J0LmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCi0jaW5jbHVkZSAi
U3R5bGVTaGVldExpc3QuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiVHJhbnNmb3Jt
YXRpb25NYXRyaXguaCIKLSNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIK
LSNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIlZpZXdwb3J0U3R5
bGVSZXNvbHZlci5oIgotI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKLSNpbmNsdWRlICJX
ZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJh
bWVSdWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgotI2luY2x1ZGUg
IldlYktpdENTU1JlZ2lvblJ1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZS5oIgotI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgotI2luY2x1ZGUgIlhNTE5h
bWVzLmgiCi0jaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KLSNp
bmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0
Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0
cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotCi0jaWYgRU5BQkxFKENTU19GSUxURVJT
KQotI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdENTU0ZpbHRl
clZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKLSNpbmNs
dWRlICJEYXNoYm9hcmRSZWdpb24uaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFNWRykKLSNpbmNs
dWRlICJDYWNoZWRTVkdEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVm
ZXJlbmNlLmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50
LmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIK
LSNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5o
IgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgotI2luY2x1ZGUgIkN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5o
IgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZp
bHRlclRyYW5zZm9ybVBhcmFtZXRlci5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgi
Ci0jaW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCi0jaW5jbHVkZSAiU3R5bGVQ
ZW5kaW5nU2hhZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKLSNpbmNsdWRlICJXZWJL
aXRDU1NNaXhGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUu
aCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0jaW5jbHVkZSAiQ1NTSW1h
Z2VTZXRWYWx1ZS5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKLSNlbmRpZgot
Ci0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKLSNl
bmRpZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1uYW1lc3BhY2UgV1RGIHsKLQotdGVtcGxh
dGU8PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2Vi
Q29yZTo6UnVsZURhdGEqPiB7Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lk
IHJlcG9ydE1lbW9yeVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5mbyYpIHsgfQotfTsKLQotfQog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLSNk
ZWZpbmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5oZXJpdCkgeyBcCi0g
ICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9w
KCkpOyBcCi0gICAgcmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwocHJvcCwgUHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlz
SW5pdGlhbCkgeyBcCi0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6
OmluaXRpYWwjI1Byb3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotUmVuZGVyU3R5bGUqIFN0
eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KLXN0YXRpYyBTdHlsZVByb3Bl
cnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xP
Q0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9w
ZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkp
Ci0gICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rp
b24sIENTU1ZhbHVlTHRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwotfQot
Ci1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCi17Ci0g
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9M
ZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKHJpZ2h0VG9M
ZWZ0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5
KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0gICAgcmV0dXJuIHJpZ2h0VG9M
ZWZ0RGVjbC5nZXQoKTsKLX0KLQotCi1pbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVz
b2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAgaWYgKCFtX3J1bGVMaXN0KQot
ICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIHJl
dHVybiBtX3J1bGVMaXN0LmdldCgpOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpT
dGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKLXsKLSAgICBtX2hhc1VBQXBwZWFyYW5j
ZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKLSAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2Up
IHsKLSAgICAgICAgbV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9yZGVyKCk7Ci0gICAgICAgIG1f
YmFja2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExheWVycygpOwotICAgICAgICBt
X2JhY2tncm91bmRDb2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOwotICAgIH0KLX0K
LQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKLXsKLSAgICBtX2Vs
ZW1lbnQgPSAwOwotICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7Ci0gICAgbV9wYXJlbnRTdHlsZSA9
IDA7Ci0gICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOwot
ICAgIG1fcnVsZUxpc3QgPSAwOwotICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7Ci0gICAgbV9w
ZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQot
ICAgIG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKLSNlbmRpZgotI2lmIEVOQUJMRShDU1Nf
RklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIo
KTsKLSNlbmRpZgotfQotCi1TdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBk
b2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgOiBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgwKQotICAgICwgbV9tYXRjaGVk
UHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRj
aGVkUHJvcGVydGllc0NhY2hlKQotICAgICwgbV9kb2N1bWVudChkb2N1bWVudCkKLSAgICAsIG1f
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAs
IG1fZm9udFNlbGVjdG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKLSNpZiBF
TkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2
ZXIoVmlld3BvcnRTdHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1lbnQpKQotI2VuZGlmCi0gICAg
LCBtX3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQotICAg
ICwgbV9zdHlsZU1hcCh0aGlzKQotewotICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9j
dW1lbnRFbGVtZW50KCk7Ci0KLSAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0
U3R5bGUocm9vdCk7Ci0KLSAgICAvLyBjb25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRl
ZmF1bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVkCi0gICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVl
cmllcyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQg
KG1heC13aWR0aDogMTBlbSkiCi0gICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3Ry
dWN0b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4sCi0gICAgLy8gZG9jdW1lbnQg
ZG9lc24ndCBoYXZlIGRvY3VtZW50RWxlbWVudAotICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0
aGF0IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKLSAg
ICAvLyBpcyBhbHdheXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxl
Y3RvcgotICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52aWV3KCk7Ci0gICAgaWYgKHZp
ZXcpCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Io
dmlldy0+bWVkaWFUeXBlKCkpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQ
dHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKLQotICAgIGlmIChyb290KQotICAg
ICAgICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxs
b3dTdHlsZVNoYXJpbmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKTsKLQotICAgIGlmIChtX3Jv
b3REZWZhdWx0U3R5bGUgJiYgdmlldykKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcg
TWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9y
b290RGVmYXVsdFN0eWxlLmdldCgpKSk7Ci0KLSAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5
bGUoKTsKLQotICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xs
ZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCk7Ci0gICAgbV9ydWxlU2V0
cy5pbml0VXNlclN0eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsK
LQotI2lmIEVOQUJMRShTVkdfRk9OVFMpCi0gICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25z
KCkpIHsKLSAgICAgICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9u
dEZhY2VFbGVtZW50cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxl
bWVudHMoKTsKLSAgICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNo
U2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNl
RWxlbWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgZm9udFNlbGVj
dG9yKCktPmFkZEZvbnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VSdWxlKCkpOwotICAgIH0KLSNl
bmRpZgotCi0gICAgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rp
b24tPmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRzKCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8
UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQotewotICAgIG1fcnVsZVNldHMu
YXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5n
ZXQoKSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2Uo
KSwgdGhpcyk7Ci0gICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+
cmVuZGVyZXIoKS0+c3R5bGUoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5
bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RF
VklDRV9BREFQVEFUSU9OKQotICAgIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7
Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVt
ZW50KiBwYXJlbnQpCi17Ci0gICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9
IHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOwotCi0gICAgLy8gV2UgYXJlIG5v
dCBhbHdheXMgaW52b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0
aW9uIGNhbiBjYXVzZSB1cyB0byBlbnRlcgotICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlk
ZGxlIG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hl
cmUgd2l0aGluIHRoZSB0cmVlLgotICAgIC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2Us
IG9yIGlmIHdlIHNlZSBhIG5ldyByb290IGVsZW1lbnQuCi0gICAgLy8gT3RoZXJ3aXNlIGp1c3Qg
cHVzaCB0aGUgbmV3IHBhcmVudC4KLSAgICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3Rv
ckZpbHRlci5wYXJlbnRTdGFja0lzRW1wdHkoKSkKLSAgICAgICAgbV9zZWxlY3RvckZpbHRlci5z
ZXR1cFBhcmVudFN0YWNrKHBhcmVudCk7Ci0gICAgZWxzZQotICAgICAgICBtX3NlbGVjdG9yRmls
dGVyLnB1c2hQYXJlbnQocGFyZW50KTsKLQotICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBT
aGFkb3dSb290IG5vZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCi0gICAgaWYgKG1fc2NvcGVSZXNv
bHZlcikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJl
bnRPclNoYWRvd0hvc3ROb2RlKCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVu
dEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQotewotICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0
IGludm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVy
aW5nIHN0eWxlIHJlc29sdmUuCi0gICAgLy8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGlu
IHRoaXMgY2FzZS4KLSAgICBpZiAobV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lz
dGVudChwYXJlbnQpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOwotICAg
IGlmIChtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVu
dCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3Qg
U2hhZG93Um9vdCogc2hhZG93Um9vdCkKLXsKLSAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgp
KTsKLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1
c2goc2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCi17
Ci0gICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZl
cikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7Ci19Ci0KLS8vIFRo
aXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0
eWxlcwotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5
bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQotewotICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUo
KSk7Ci0gICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7Ci19Ci0KLVN0
eWxlUmVzb2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKLXsKLSAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xl
YXJEb2N1bWVudCgpOwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBt
X3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOwotI2VuZGlmCi19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxl
UmVzb2x2ZXI+KikKLXsKLSAgICAvLyBMb29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcg
YSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCi0g
ICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24g
Y2F1c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxlKCkKLSAgICAvLyBvciBwcmVz
ZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUg
d2l0aCB0aGUgbGFzdCByZWYgb24gdGhlIG9sZCBvbmUuCi0gICAgVmVjdG9yPHVuc2lnbmVkLCAx
Nj4gdG9SZW1vdmU7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBt
X21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0Nh
Y2hlOjppdGVyYXRvciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7Ci0gICAg
Zm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRp
ZXM+JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKLSAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsr
aSkgewotICAgICAgICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhh
c09uZVJlZigpKSB7Ci0gICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOwot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCi0gICAgICAg
IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1vdmVbaV0pOwotCi0gICAgbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRj
aFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBy
dWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVy
dHlXaGl0ZWxpc3RUeXBlKQotewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdy
b3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hl
ZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5sYXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHls
ZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hU
eXBlID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBw
cm9wZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVu
ZChydWxlKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxl
UHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBw
cm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKLXsKLSAgICBpZiAoIXByb3BlcnR5U2V0KQot
ICAgICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RB
dXRob3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9
IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMo
cmVzdWx0LCBwcm9wZXJ0eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hlYWJsZSkKLSAgICAgICAgcmVz
dWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3Bl
IHsKLXB1YmxpYzoKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotICAgIH5NYXRjaGluZ1VB
UnVsZXNTY29wZSgpOwotCi0gICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKLQot
cHJpdmF0ZToKLSAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKLX07Ci0KLU1hdGNo
aW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgQVNTRVJUKCFt
X21hdGNoaW5nVUFSdWxlcyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwotfQotCi1N
YXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBtX21h
dGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotfQotCi1pbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNT
Y29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotewotICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxl
czsKLX0KLQotYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBm
YWxzZTsKLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBN
YXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAg
QVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKLSAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50
KCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBFbGVtZW50KiBlbGVtZW50
ID0gc3RhdGUuZWxlbWVudCgpOwotICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1l
bnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1
ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7Ci0gICAgaWYgKCFwc2V1ZG9JZC5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOwotICAgICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0Vs
ZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0g
ICAgfQotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIGlmIChlbGVtZW50LT5pc1dlYlZU
VEVsZW1lbnQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
Ci0jZW5kaWYKLSAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBh
cHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgot
ICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCi0gICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dz
IGF1dGhvciBydWxlcwotICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0
eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCi0gICAgVHJlZVNjb3BlKiB0cmVl
U2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKLSAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Nj
b3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi0gICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0
aG9yU3R5bGVzKCkKLSAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1
ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNoUmVx
dWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NC
b3VuZGFyeSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRo
ZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1
ZmZlciBhbmQKLSAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZWxlbWVudC0+
aGFzSUQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgp
KSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0
eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVs
ZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKLSAgICB9Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCi0gICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1Bz
ZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChTZWxl
Y3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQotICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNl
dWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50
LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxS
dWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRj
aFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAgIGlmICghbV9zdGF0ZS5yZWdp
b25Gb3JTdHlsaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBt
YXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25z
dCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGNo
ZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPiht
X3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKLSAgICAgICAgICAgIFJ1bGVT
ZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKLSAgICAgICAgICAgIEFTU0VSVChyZWdp
b25SdWxlcyk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3Qo
cmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0
LnNjb3BlKSwgcnVsZVJhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkK
LXsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0
YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7Ci0gICAgaWYgKG1h
dGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNvcnRNYXRjaGVk
UnVsZXMoKTsKLQotICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xs
ZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRS
dWxlcy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1
bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIo
KSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNl
dCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKLSAg
ICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29t
bW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVu
aXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxl
c1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRj
aGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdo
aXRlbGlzdFR5cGUoKSk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2Nv
cGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxl
cykKLXsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAg
ICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2gg
c2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFj
ayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KLSAgICBpZiAobV9zY29wZVJl
c29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNr
Q29uc2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7Ci0gICAgICAgIGJvb2wgYXBwbHlBdXRo
b3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5
bGVzKCk7Ci0gICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7Ci0gICAgICAgIHVuc2ln
bmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9z
dGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5s
YXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0g
ICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0g
bV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7Ci0gICAgICAgICAgICBkb2N1bWVudFNj
b3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsK
LSAgICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFh
cHBseUF1dGhvclN0eWxlcykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRj
aGVzU3R5bGVCb3VuZHMoZnJhbWUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFt
ZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAg
ICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgp
OwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVz
KHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQs
IGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0g
ICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCi1pbmxpbmUg
Ym9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVz
KCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBh
Z2UqIHIxLCBjb25zdCBTdHlsZVJ1bGVQYWdlKiByMikKIHsKLSNpZiBFTkFCTEUoU0hBRE9XX0RP
TSkKLSAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7Ci0jZWxz
ZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgorICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+
c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwogfQogCi12b2lk
IFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wg
aW5jbHVkZUVtcHR5UnVsZXMpCitib29sIFBhZ2VSdWxlQ29sbGVjdG9yOjppc0xlZnRQYWdlKGlu
dCBwYWdlSW5kZXgpIGNvbnN0CiB7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgQVNTRVJU
KG1fc2NvcGVSZXNvbHZlcik7Ci0KLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxOwotCi0gICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7Ci0g
ICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0
Y2hlZFJ1bGVzKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuOworICAgIGJvb2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICBp
c0ZpcnN0UGFnZUxlZnQgPSB0cnVlOwogCi0gICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1
bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
cmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxl
cywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwotICAgIH0KLSAgICBzb3J0QW5kVHJh
bnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3Vs
dCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgorICAgIHJl
dHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwogfQogCi12
b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwg
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK2Jvb2wgUGFnZVJ1bGVDb2xsZWN0b3I6OmlzRmlyc3RQ
YWdlKGludCBwYWdlSW5kZXgpIGNvbnN0CiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5j
bGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQotICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIC8vIE1hdGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCi0gICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1
ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5h
dXRob3JSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3RvcjxNYXRj
aFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRl
ZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVx
dWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7
ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVs
ZVJhbmdlKTsKLSNlbmRpZgotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3Vs
dCk7Ci0KLSAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVs
ZXMpOworICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBh
Z2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4g
KCFwYWdlSW5kZXgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVXNlclJ1bGVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCitTdHJpbmcgUGFnZVJ1
bGVDb2xsZWN0b3I6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0CiB7Ci0gICAg
aWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0
VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBNYXRj
aFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy51c2VyUnVs
ZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAg
ICByZXR1cm4gIiI7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNo
UmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQordm9pZCBQYWdlUnVsZUNvbGxlY3Rvcjo6
bWF0Y2hBbGxQYWdlUnVsZXMoaW50IHBhZ2VJbmRleCkKIHsKLSAgICBtX3N0YXRlLm1hdGNoZWRS
dWxlcygpLmNsZWFyKCk7CisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJ
bmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsK
KyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CiAgICAgCi0gICAg
cmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFu
Z2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxl
UmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAg
bWF0Y2hQYWdlUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwg
aXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLnVz
ZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIg
dGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRN
TDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlz
TGVmdCwgaXNGaXJzdCwgcGFnZSk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBN
YXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit2b2lkIFBh
Z2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xl
ZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQogewogICAg
IGlmICghcnVsZXMpCiAgICAgICAgIHJldHVybjsKIAotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUg
Zm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVz
b2x2ZS4KLSAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVyIGZpbHRlciB3b24ndCBiZSB1cC10by1k
YXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBmYXN0IHBhdGguCi0gICAgYm9v
bCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lz
dGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRh
cnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeTsKLQotICAgIHVuc2ln
bmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBz
aXplOyArK2kpIHsKLSAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0
KGkpOwotICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZh
c3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURh
dGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotCi0gICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKLSAg
ICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKLSAg
ICAgICAgUHNldWRvSWQgZHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOwotICAgICAgICBpZiAocnVs
ZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVxdWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywgbWF0
Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBy
dWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9u
LWRlYnVnIG1vZGUuCi0gICAgICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0
aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8
IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxl
cykpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNo
UnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5kYXJkIGdl
dE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5l
ZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVE
YXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgewotICAgICAgICAgICAgICAgIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgd2Un
cmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCi0gICAgICAgICAg
ICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCi0gICAgICAgICAg
ICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVl
c3QoKS5wc2V1ZG9JZCA9PSBOT1BTRVVETykgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5t
b2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgICAg
ICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBm
YWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyA8IEZJUlNUX0lOVEVSTkFMX1BTRVVE
T0lEKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRIYXNQc2V1ZG9TdHls
ZShkeW5hbWljUHNldWRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAg
Ly8gVXBkYXRlIG91ciBmaXJzdC9sYXN0IHJ1bGUgaW5kaWNlcyBpbiB0aGUgbWF0Y2hlZCBydWxl
cyBhcnJheS4KLSAgICAgICAgICAgICAgICArK3J1bGVSYW5nZS5sYXN0UnVsZUluZGV4OwotICAg
ICAgICAgICAgICAgIGlmIChydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPT0gLTEpCi0gICAgICAg
ICAgICAgICAgICAgIHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVs
ZUluZGV4OwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICAgICAgICAgIG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUo
JnJ1bGVEYXRhKTsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZE1hdGNoUnVsZShjb29raWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBi
b29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikK
LXsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKLSAgICB1
bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKLSAgICByZXR1cm4gKHNw
ZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRp
b24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKLXsKLSAgICBzdGQ6OnNvcnQobV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5iZWdpbigpLCBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmVuZCgpLCBjb21wYXJlUnVs
ZXMpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCi17Ci0gICAgbWF0Y2hVQVJ1bGVz
KHJlc3VsdCk7Ci0KLSAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KLSAgICBp
ZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoVXNlclJ1bGVzKHJl
c3VsdCwgZmFsc2UpOwotCi0gICAgLy8gTm93IGNoZWNrIGF1dGhvciBydWxlcywgYmVnaW5uaW5n
IGZpcnN0IHdpdGggcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcyBtYXBwZWQgZnJvbSBIVE1MLgot
ICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkgewotICAgICAgICBhZGRFbGVtZW50U3R5
bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlv
bkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFs
IG1hcHBlZCBkZWNsYXJhdGlvbnMuCi0gICAgICAgIC8vIFRhYmxlcyBhbmQgdGFibGUgY2VsbHMg
c2hhcmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3QgYmUgYXBwbGllZAotICAg
ICAgICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRl
cGVuZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVzLgotICAgICAgICBhZGRF
bGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFk
ZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICBpZiAobV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgYm9v
bCBpc0F1dG87Ci0gICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0b0hU
TUxFbGVtZW50KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9uYWxpdHlJZmhhc0Rp
ckF1dG9BdHRyaWJ1dGUoaXNBdXRvKTsKLSAgICAgICAgICAgIGlmIChpc0F1dG8pCi0gICAgICAg
ICAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0ZXh0RGlyZWN0aW9uID09IExU
UiA/IGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhv
ciBzaGVldHMgbmV4dC4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAg
ICAgIG1hdGNoQXV0aG9yUnVsZXMocmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sg
b3VyIGlubGluZSBzdHlsZSBhdHRyaWJ1dGUuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpKSB7Ci0gICAgICAgIC8vIElubGluZSBzdHlsZSBpcyBpbW11dGFi
bGUgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVyLgotICAgICAgICAvLyBGSVhN
RTogTWVkaWEgY29udHJvbCBzaGFkb3cgdHJlZXMgc2VlbSB0byBoYXZlIHByb2JsZW1zIHdpdGgg
Y2FjaGluZy4KLSAgICAgICAgYm9vbCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAmJiAhbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBDb25z
dGlmeS4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlv
biBvdmVycmlkZSBzdHlsZS4KLSAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgYWRkRWxlbWVudFN0
eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBp
c0NhY2hlYWJsZSAqLyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlU01JTFByb3Bl
cnRpZXMpOwotI2VuZGlmCi19CisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFn
ZVJ1bGVzOworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxl
cy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAg
aWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CiAKLWJvb2wg
U3R5bGVSZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0
U3RyaW5nJiBjbGFzc05hbWVzKSBjb25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBjbGFzc05hbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX3J1bGVTZXRzLmZlYXR1
cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NOYW1lc1tpXS5pbXBsKCkpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KKyAgICBz
dGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxl
cy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7CiAKLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6
OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQotewotICAgIG1fZWxlbWVudCA9IGU7Ci0g
ICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19j
YXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7Ci0gICAgbV9lbGVtZW50TGlua1N0YXRlID0gZSA/
IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUp
IDogTm90SW5zaWRlTGluazsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBh
Z2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRp
ZXMobWF0Y2hlZFBhZ2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsKIH0KIAotaW5saW5lIHZvaWQg
U3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKK3N0YXRpYyBib29sIGNoZWNr
UGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wg
aXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKIHsK
LSAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkgewotICAgICAgICBtX3N0YXRlLmluaXRF
bGVtZW50KGUpOwotICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRP
bkRvY3VtZW50RWxlbWVudChmYWxzZSk7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRX
cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKKyAgICBmb3IgKGNvbnN0IENT
U1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBj
b21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNo
ID09IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
bG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOworICAgICAgICAg
ICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxp
bmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVu
dCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgY29uc3Qg
UHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclJlZ2lvbiogcmVn
aW9uRm9yU3R5bGluZykKLXsKLSAgICBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHBzZXVkb1N0eWxl
UmVxdWVzdDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOwogCi0g
ICAgaWYgKGUpIHsKLSAgICAgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dChlKTsKLSAg
ICAgICAgbV9wYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5
bGUoKTsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRh
bmNlKCkgPyAwIDoKLSAgICAgICAgICAgIHBhcmVudFN0eWxlID8gcGFyZW50U3R5bGUgOgotICAg
ICAgICAgICAgbV9wYXJlbnROb2RlID8gbV9wYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpIDogMDsK
LSAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBjb250ZXh0Lmluc2VydGlv
blBvaW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICAg
ICAgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOwotICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9J
bnNlcnRpb25Qb2ludCA9IGZhbHNlOwotICAgIH0KLQotICAgIE5vZGUqIGRvY0VsZW1lbnQgPSBl
ID8gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgOiAwOwotICAgIFJlbmRlclN0eWxl
KiBkb2NTdHlsZSA9IGRvY3VtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIG1fcm9vdEVsZW1lbnRT
dHlsZSA9IGRvY0VsZW1lbnQgJiYgZSAhPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVy
U3R5bGUoKSA6IGRvY1N0eWxlOwotCi0gICAgbV9zdHlsZSA9IDA7Ci0gICAgbV9wZW5kaW5nSW1h
Z2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0gICAgbV9mb250RGly
dHkgPSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaFRocmVz
aG9sZCA9IDEwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaExldmVsVGhyZXNo
b2xkID0gMTA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwYXJlbnRFbGVtZW50UHJldmVudHNTaGFy
aW5nKGNvbnN0IEVsZW1lbnQqIHBhcmVudEVsZW1lbnQpCi17Ci0gICAgaWYgKCFwYXJlbnRFbGVt
ZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHBhcmVudEVsZW1lbnQtPmhh
c0ZsYWdzU2V0RHVyaW5nU3R5bGluZ09mQ2hpbGRyZW4oKTsKLX0KLQotTm9kZSogU3R5bGVSZXNv
bHZlcjo6bG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVk
Tm9kZUNvdW50KSBjb25zdAotewotICAgIGlmICh2aXNpdGVkTm9kZUNvdW50ID49IGNTdHlsZVNl
YXJjaFRocmVzaG9sZCAqIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3R5bGVkRWxlbWVudCogcCA9IHN0YXRpY19jYXN0
PFN0eWxlZEVsZW1lbnQqPihwYXJlbnQpOwotICAgIGlmIChwLT5pbmxpbmVTdHlsZSgpKQotICAg
ICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChwLT5pc1NWR0VsZW1lbnQo
KSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4ocCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVy
dGllcygpKQotICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIGlmIChwLT5oYXNJRCgpICYm
IG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHAtPmlkRm9yU3R5bGVS
ZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUgPSBwLT5yZW5kZXJTdHlsZSgpOwotICAgIHVuc2lnbmVkIHN1YmNvdW50
ID0gMDsKLSAgICBOb2RlKiB0aGlzQ291c2luID0gcDsKLSAgICBOb2RlKiBjdXJyZW50Tm9kZSA9
IHAtPnByZXZpb3VzU2libGluZygpOwotCi0gICAgLy8gUmVzZXJ2ZSB0aGUgdHJpZXMgZm9yIHRo
aXMgbGV2ZWwuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMgc3VyZSB0aGF0IHRoZSBhbGdvcml0aG0K
LSAgICAvLyB3aWxsIG5ldmVyIGdvIGRlZXBlciB0aGFuIGNTdHlsZVNlYXJjaExldmVsVGhyZXNo
b2xkIGxldmVscyBpbnRvIHJlY3Vyc2lvbi4KLSAgICB2aXNpdGVkTm9kZUNvdW50ICs9IGNTdHls
ZVNlYXJjaFRocmVzaG9sZDsKLSAgICB3aGlsZSAodGhpc0NvdXNpbikgewotICAgICAgICB3aGls
ZSAoY3VycmVudE5vZGUpIHsKLSAgICAgICAgICAgICsrc3ViY291bnQ7Ci0gICAgICAgICAgICBp
ZiAoY3VycmVudE5vZGUtPnJlbmRlclN0eWxlKCkgPT0gcGFyZW50U3R5bGUgJiYgY3VycmVudE5v
ZGUtPmxhc3RDaGlsZCgpCi0gICAgICAgICAgICAgICAgJiYgY3VycmVudE5vZGUtPmlzRWxlbWVu
dE5vZGUoKSAmJiAhcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyh0b0VsZW1lbnQoY3VycmVu
dE5vZGUpKQotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgICAgICAgICAgICAgICYmICF0b0Vs
ZW1lbnQoY3VycmVudE5vZGUpLT5zaGFkb3coKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgKSB7
Ci0gICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB1bnVzZWQgcmVzZXJ2ZWQgdHJpZXMuCi0g
ICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVDb3VudCAtPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQg
LSBzdWJjb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGUtPmxhc3RDaGls
ZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1YmNvdW50ID49IGNTdHlsZVNl
YXJjaFRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGN1
cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnByZXZpb3VzU2libGluZygpOworICAgICAgICBDU1NT
ZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7
CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2Ug
JiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rv
cjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRv
VHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBj
dXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxlbWVudCgp
LCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnROb2RlOwog
ICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hh
cmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCi17Ci0gICAgaWYg
KCFydWxlU2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOwotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hh
cmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9
IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5k
ZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVs
ZVJhbmdlKTsKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdT
dHlsZSk7Ci0gICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0eSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwogICAg
IHJldHVybiB0cnVlOwogfQogCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRo
Q29udHJvbChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAordm9pZCBQYWdlUnVsZUNvbGxl
Y3Rvcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNo
ZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKIHsKLSAgICBj
b25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRoaXNJ
bnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgpOwotICAgIEhUTUxJbnB1dEVs
ZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpLT50b0lucHV0RWxlbWVu
dCgpOwotCi0gICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFvdGhlcklucHV0RWxlbWVudCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmVsZW1l
bnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkpIHsKLSAgICAgICAg
aWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1
dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShy
ZWFkb25seUF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlm
ICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+
aXNBdXRvZmlsbGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0
RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5zaG91
bGRBcHBlYXJDaGVja2VkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lu
cHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzSW5k
ZXRlcm1pbmF0ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVs
ZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNFbmFibGVkRm9ybUNv
bnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZvcm1Db250cm9sKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0RlZmF1bHRCdXR0b25Gb3JG
b3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5kb2N1bWVudCgpLT5jb250YWluc1Zh
bGlkaXR5U3R5bGVSdWxlcygpKSB7Ci0gICAgICAgIGJvb2wgd2lsbFZhbGlkYXRlID0gZWxlbWVu
dC0+d2lsbFZhbGlkYXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAhPSBzdGF0ZS5l
bGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBT
dHlsZVJ1bGVQYWdlKiBydWxlID0gcnVsZXNbaV07CiAKLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0
ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1l
bnQoKS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+c2Vs
ZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChlbGVtZW50LT5pc0luUmFuZ2UoKSAhPSBzdGF0ZS5l
bGVtZW50KCktPmlzSW5SYW5nZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUg
aXQuCisgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5w
cm9wZXJ0aWVzKCk7CisgICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0Vt
cHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoZWxlbWVudC0+aXNP
dXRPZlJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2UoKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwogICAg
IH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZWxlbWVudEhh
c0RpcmVjdGlvbkF1dG8oRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBs
aW5lIGlzIHN1cnByaXNpbmdseSBob3QsIHdlIG1heSB3aXNoIHRvIGlubGluZSBoYXNEaXJlY3Rp
b25BdXRvIGludG8gU3R5bGVSZXNvbHZlci4KLSAgICByZXR1cm4gZWxlbWVudC0+aXNIVE1MRWxl
bWVudCgpICYmIHRvSFRNTEVsZW1lbnQoZWxlbWVudCktPmhhc0RpcmVjdGlvbkF1dG8oKTsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjpzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVB
ZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqIHNoYXJpbmdDYW5kaWRhdGUpIGNvbnN0
Ci17Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuZWxl
bWVudCgpLT5lbGVtZW50RGF0YSgpID09IHNoYXJpbmdDYW5kaWRhdGUtPmVsZW1lbnREYXRhKCkp
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRB
dHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0
QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSAhPSBzaGFy
aW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgaWYgKCFzdGF0ZS5lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSkg
ewotICAgICAgICBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVz
QWZmZWN0ZWRCeVJ1bGVzKHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXND
bGFzcygpKSB7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLy8gU1ZHIGVsZW1lbnRzIHJlcXVp
cmUgYSAoc2xvdyEpIGdldEF0dHJpYnV0ZSBjb21wYXJpc2lvbiBiZWNhdXNlICJjbGFzcyIgaXMg
YW4gYW5pbWF0YWJsZSBhdHRyaWJ1dGUgZm9yIFNWRy4KLSAgICAgICAgaWYgKHN0YXRlLmVsZW1l
bnQoKS0+aXNTVkdFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCkt
PmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmdldEF0dHJpYnV0
ZShjbGFzc0F0dHIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBl
bHNlIHsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1l
cygpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfSBl
bHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+cHJl
c2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYg
RU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCi0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aGFzVGFn
TmFtZShwcm9ncmVzc1RhZykpIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxQcm9ncmVz
c0VsZW1lbnQqPihzdGF0ZS5lbGVtZW50KCkpLT5pc0RldGVybWluYXRlKCkgIT0gc3RhdGljX2Nh
c3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHNoYXJpbmdDYW5kaWRhdGUpLT5pc0RldGVybWluYXRl
KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aEVsZW1l
bnQoU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5
bGUgPSBlbGVtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0KLSAgICBpZiAoIXN0eWxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYg
KHN0eWxlLT51bmlxdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+
aGFzVW5pcXVlUHNldWRvU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChl
bGVtZW50LT50YWdRTmFtZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+dGFnUU5hbWUoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5pbmxpbmVTdHlsZSgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKGVsZW1lbnQtPmlz
U1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihlbGVtZW50KS0+YW5pbWF0
ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgot
ICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmhvdmVyZWQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmhvdmVyZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChl
bGVtZW50LT5hY3RpdmUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmFjdGl2ZSgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmZvY3VzZWQoKSAhPSBzdGF0ZS5lbGVtZW50
KCktPmZvY3VzZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5z
aGFkb3dQc2V1ZG9JZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+c2hhZG93UHNldWRvSWQoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50
KCktPmNzc1RhcmdldCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFzaGFyaW5n
Q2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKGVsZW1lbnQpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmFkZGl0aW9uYWxQcmVzZW50
YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25h
bFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGlmIChlbGVtZW50LT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1
bGVzLmNvbnRhaW5zKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5oYXNTY29wZWRIVE1MU3R5bGVD
aGlsZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IHNoYXJlIHN0eWxlIGZvciBvcHRpb24gYW5kIG9wdGdyb3VwIHdoZW5ldmVyIHBvc3NpYmxlLgot
ICAgIC8vIEJlZm9yZSBkb2luZyBzbywgd2UgbmVlZCB0byByZXNvbHZlIGlzc3VlcyBpbiBIVE1M
U2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zCi0gICAgLy8gYW5kIFJlbmRlck1lbnVMaXN0
OjpzZXRUZXh0LiBTZWUgYWxzbyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODg0MDUKLSAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGVsZW1l
bnQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBib29sIGlzQ29udHJvbCA9IGVsZW1lbnQtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCk7Ci0KLSAg
ICBpZiAoaXNDb250cm9sICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNGb3JtQ29udHJvbEVsZW1lbnQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGlzQ29udHJvbCAmJiAhY2FuU2hh
cmVTdHlsZVdpdGhDb250cm9sKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoc3R5bGUtPnRyYW5zaXRpb25zKCkgfHwgc3R5bGUtPmFuaW1hdGlvbnMoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAg
IC8vIFR1cm4gb2ZmIHN0eWxlIHNoYXJpbmcgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdhaW4gbGF5
ZXJzIGZvciByZWFzb25zIG91dHNpZGUgb2YgdGhlIHN0eWxlIHN5c3RlbS4KLSAgICAvLyBTZWUg
Y29tbWVudHMgaW4gUmVuZGVyT2JqZWN0OjpzZXRTdHlsZSgpLgotICAgIGlmIChlbGVtZW50LT5o
YXNUYWdOYW1lKGlmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwg
ZWxlbWVudC0+aGFzVGFnTmFtZShlbWJlZFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvYmpl
Y3RUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXBwbGV0VGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGNhbnZhc1RhZykKLSNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAg
ICAgICAgLy8gV2l0aCBwcm94eWluZywgdGhlIG1lZGlhIGVsZW1lbnRzIGFyZSBiYWNrZWQgYnkg
YSBSZW5kZXJFbWJlZGRlZE9iamVjdC4KLSAgICAgICAgfHwgZWxlbWVudC0+aGFzVGFnTmFtZSh2
aWRlb1RhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhdWRpb1RhZykKLSNlbmRpZgotICAgICAg
ICApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gICAgaWYgKGVsZW1lbnRIYXNE
aXJlY3Rpb25BdXRvKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAo
ZWxlbWVudC0+aXNMaW5rKCkgJiYgc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpICE9IHN0eWxlLT5p
bnNpZGVMaW5rKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lmIEVOQUJMRShWSURFT19U
UkFDSykKLSAgICAvLyBEZW55IHNoYXJpbmcgc3R5bGVzIGJldHdlZW4gV2ViVlRUIGFuZCBub24t
V2ViVlRUIG5vZGVzLgotICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5p
c1dlYlZUVEVsZW1lbnQoKSAmJiB0b1dlYlZUVEVsZW1lbnQoZWxlbWVudCktPmlzUGFzdE5vZGUo
KSAhPSB0b1dlYlZUVEVsZW1lbnQoc3RhdGUuZWxlbWVudCgpKS0+aXNQYXN0Tm9kZSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkK
LSAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVs
bFNjcmVlbkVsZW1lbnQoKSB8fCBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+
d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUgU3R5bGVkRWxlbWVudCogU3R5
bGVSZXNvbHZlcjo6ZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSogbm9kZSwgdW5zaWdu
ZWQmIGNvdW50KSBjb25zdAotewotICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cHJldmlv
dXNTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoY2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50
KHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKSkpCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgaWYgKGNvdW50KysgPT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50
Kj4obm9kZSk7Ci19Ci0KLVJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWRT
dHlsZSgpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0
eWxlZEVsZW1lbnQoKSB8fCAhc3RhdGUucGFyZW50U3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgaW5saW5lIHN0eWxlIGl0IGlzIHByb2JhYmx5
IHVuaXF1ZS4KLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKQot
ICAgICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChzdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihzdGF0
ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAvLyBJZHMgc3RvcCBzdHlsZSBzaGFyaW5nIGlmIHRo
ZXkgc2hvdyB1cCBpbiB0aGUgc3R5bGVzaGVldHMuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlu
cyhzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmco
c3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3Vt
ZW50KCktPmNzc1RhcmdldCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZWxlbWVudEhh
c0RpcmVjdGlvbkF1dG8oc3RhdGUuZWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICAvLyBDYWNoZSB3aGV0aGVyIHN0YXRlLmVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkgYW55IGtub3du
IGNsYXNzIHNlbGVjdG9ycy4KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1i
ZXIgdmFyaWFibGUuIFRoZSBzdHlsZSBzaGFyaW5nIGNvZGUgY291bGQgYmUgZmFjdG9yZWQgb3V0
IG9mIFN0eWxlUmVzb2x2ZXIuCi0gICAgc3RhdGUuc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1
bGVzKHN0YXRlLmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmhhc0NsYXNzKCkgJiYgY2xh
c3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSkpOwot
Ci0gICAgLy8gQ2hlY2sgcHJldmlvdXMgc2libGluZ3MgYW5kIHRoZWlyIGNvdXNpbnMuCi0gICAg
dW5zaWduZWQgY291bnQgPSAwOwotICAgIHVuc2lnbmVkIHZpc2l0ZWROb2RlQ291bnQgPSAwOwot
ICAgIFN0eWxlZEVsZW1lbnQqIHNoYXJlRWxlbWVudCA9IDA7Ci0gICAgTm9kZSogY291c2luTGlz
dCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUg
KGNvdXNpbkxpc3QpIHsKLSAgICAgICAgc2hhcmVFbGVtZW50ID0gZmluZFNpYmxpbmdGb3JTdHls
ZVNoYXJpbmcoY291c2luTGlzdCwgY291bnQpOwotICAgICAgICBpZiAoc2hhcmVFbGVtZW50KQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNvdXNpbkxpc3QgPSBsb2NhdGVDb3VzaW5MaXN0
KGNvdXNpbkxpc3QtPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7Ci0gICAgfQot
Ci0gICAgLy8gSWYgd2UgaGF2ZSBleGhhdXN0ZWQgYWxsIG91ciBidWRnZXQgb3Igb3VyIGNvdXNp
bnMuCi0gICAgaWYgKCFzaGFyZUVsZW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8g
Q2FuJ3Qgc2hhcmUgaWYgc2libGluZyBydWxlcyBhcHBseS4gVGhpcyBpcyBjaGVja2VkIGF0IHRo
ZSBlbmQgYXMgaXQgc2hvdWxkIHJhcmVseSBmYWlsLgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5k
aWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnNpYmxpbmcoKSkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIC8vIENhbid0IHNoYXJlIGlmIGF0dHJpYnV0ZSBydWxlcyBhcHBseS4KLSAgICBp
ZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy51bmNvbW1v
bkF0dHJpYnV0ZSgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYg
QGhvc3QgQC1ydWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hl
c0hvc3RSdWxlcygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvLyBUcmFja2luZyBjaGlsZCBp
bmRleCByZXF1aXJlcyB1bmlxdWUgc3R5bGUgZm9yIGVhY2ggbm9kZS4gVGhpcyBtYXkgZ2V0IHNl
dCBieSB0aGUgc2libGluZyBydWxlIG1hdGNoIGFib3ZlLgotICAgIGlmIChwYXJlbnRFbGVtZW50
UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkK
LXsKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1h
dGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0Nh
Y2hlYWJsZSA9IGZhbHNlOwotICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21l
ZGl1bS0+bWVkaWFUeXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6
OmRlZmF1bHRTdHlsZTsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNo
ZWV0KTsKLQotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBx
dWlya3MgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2Rl
KCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
ZGVmYXVsdFF1aXJrc1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3Vy
Y2Ugc3R5bGVzIChpbiB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRo
ZW4gd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAg
aWYgKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVz
dWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQotc3Rh
dGljIHZvaWQgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdp
bmF0aW9uTW9kZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIGlmIChwYWdpbmF0aW9uTW9k
ZSA9PSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAK
LSAgICBzd2l0Y2ggKHBhZ2luYXRpb25Nb2RlKSB7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpMZWZ0
VG9SaWdodFBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRh
bENvbHVtbkF4aXMpOwotICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
KCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNv
bHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENv
bHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2
ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFBhZ2luYXRpb246OlJpZ2h0VG9MZWZ0UGFnaW5hdGVkOgotICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAg
IGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8g
UmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6
IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFn
aW5hdGlvbjo6VG9wVG9Cb3R0b21QYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5B
eGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihz
dHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVz
c2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0
aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lv
bik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6Qm90dG9tVG9Ub3BQYWdp
bmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7
Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3Jp
dGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dy
ZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dy
ZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJv
Z3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEZvbnRBbmRH
bHlwaE9yaWVudGF0aW9uKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgRm9udE9yaWVudGF0aW9u
JiBmb250T3JpZW50YXRpb24sIE5vbkNKS0dseXBoT3JpZW50YXRpb24mIGdseXBoT3JpZW50YXRp
b24pCi17Ci0gICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7Ci0gICAg
ICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRp
b24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIHN3aXRjaCAoc3R5bGUtPnRleHRPcmllbnRhdGlvbigpKSB7Ci0gICAg
Y2FzZSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRp
b24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3Jp
ZW50YXRpb25VcHJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAg
ICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25VcHJpZ2h0Owot
ICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5czoKLSAgICAg
ICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpID09IExlZnRUb1JpZ2h0V3JpdGluZ01vZGUpIHsK
LSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBtYXAgdG8gc2lkZXdheXMtbGVmdCwg
d2hpY2ggaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAgICAgICBmb250T3JpZW50YXRpb24g
PSBWZXJ0aWNhbDsKLSAgICAgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9y
aWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVu
dGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJl
dHVybjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzUmlnaHQ6Ci0gICAgICAgIGZv
bnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBO
b25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAg
IGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBmb250T3Jp
ZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pL
R2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19
Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1l
bnQoRG9jdW1lbnQqIGRvY3VtZW50LCBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcikKLXsK
LSAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKLQotICAgIC8vIEhUTUw1IHN0
YXRlcyB0aGF0IHNlYW1sZXNzIGlmcmFtZXMgc2hvdWxkIHJlcGxhY2UgZGVmYXVsdCBDU1MgdmFs
dWVzCi0gICAgLy8gd2l0aCB2YWx1ZXMgaW5oZXJpdGVkIGZyb20gdGhlIGNvbnRhaW5pbmcgaWZy
YW1lIGVsZW1lbnQuIEhvd2V2ZXIsCi0gICAgLy8gc29tZSB2YWx1ZXMgKHN1Y2ggYXMgdGhlIGNh
c2Ugb2YgZGVzaWduTW9kZSA9ICJvbiIpIHN0aWxsIG5lZWQgdG8KLSAgICAvLyBiZSBzZXQgYnkg
dGhpcyAiZG9jdW1lbnQgc3R5bGUiLgotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gZG9jdW1lbnRT
dHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICBib29sIHNlYW1sZXNzV2l0aFBhcmVu
dCA9IGRvY3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKTsKLSAgICBp
ZiAoc2VhbWxlc3NXaXRoUGFyZW50KSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBpZnJhbWVTdHls
ZSA9IGRvY3VtZW50LT5zZWFtbGVzc1BhcmVudElGcmFtZSgpLT5yZW5kZXJTdHlsZSgpOwotICAg
ICAgICBpZiAoaWZyYW1lU3R5bGUpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5pbmhlcml0
RnJvbShpZnJhbWVTdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFy
IHdoaWNoIHZhbHVlcyBiZWxvdyB3ZSB3YW50IHRvIG92ZXJyaWRlIGluIHRoZSBzZWFtbGVzcyBj
YXNlIQotICAgIGRvY3VtZW50U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgIGlmICghc2Vh
bWxlc3NXaXRoUGFyZW50KSB7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFJUTE9yZGVyaW5n
KGRvY3VtZW50LT52aXN1YWxseU9yZGVyZWQoKSA/IFZpc3VhbE9yZGVyIDogTG9naWNhbE9yZGVy
KTsKLSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Wm9vbShmcmFtZSAmJiAhZG9jdW1lbnQtPnBy
aW50aW5nKCkgPyBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKSA6IDEpOwotICAgICAgICBkb2N1bWVu
dFN0eWxlLT5zZXRQYWdlU2NhbGVUcmFuc2Zvcm0oZnJhbWUgPyBmcmFtZS0+ZnJhbWVTY2FsZUZh
Y3RvcigpIDogMSk7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldExvY2FsZShkb2N1bWVudC0+
Y29udGVudExhbmd1YWdlKCkpOwotICAgIH0KLSAgICAvLyBUaGlzIG92ZXJyaWRlcyBhbnkgLXdl
YmtpdC11c2VyLW1vZGlmeSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGlmcmFtZS4KLSAgICBk
b2N1bWVudFN0eWxlLT5zZXRVc2VyTW9kaWZ5KGRvY3VtZW50LT5pbkRlc2lnbk1vZGUoKSA/IFJF
QURfV1JJVEUgOiBSRUFEX09OTFkpOwotCi0gICAgRWxlbWVudCogZG9jRWxlbWVudCA9IGRvY3Vt
ZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKLSAgICBSZW5kZXJPYmplY3QqIGRvY0VsZW1lbnRSZW5k
ZXJlciA9IGRvY0VsZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJlcigpIDogMDsKLSAgICBpZiAo
ZG9jRWxlbWVudFJlbmRlcmVyKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGlyZWN0aW9uIGFuZCB3
cml0aW5nLW1vZGUgb2YgdGhlIGJvZHkgdG8gc2V0IHRoZQotICAgICAgICAvLyB2aWV3cG9ydCdz
IGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIHVubGVzcyB0aGUgcHJvcGVydHkgaXMgc2V0IG9u
IHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBib2R5LCB0
aGVuIHVzZSB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBib2R5
UmVuZGVyZXIgPSBkb2N1bWVudC0+Ym9keSgpID8gZG9jdW1lbnQtPmJvZHkoKS0+cmVuZGVyZXIo
KSA6IDA7Ci0gICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT53cml0aW5nTW9k
ZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRX
cml0aW5nTW9kZShib2R5UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShkb2NFbGVt
ZW50UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoYm9keVJl
bmRlcmVyICYmICFkb2N1bWVudC0+ZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAg
ICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihib2R5UmVuZGVyZXItPnN0eWxl
KCktPmRpcmVjdGlvbigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnRTdHls
ZS0+c2V0RGlyZWN0aW9uKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkp
OwotICAgIH0KLQotICAgIGlmIChmcmFtZSkgewotICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBmcmFtZS0+dmlldygpKSB7Ci0gICAgICAgICAgICBjb25zdCBQYWdpbmF0aW9uJiBw
YWdpbmF0aW9uID0gZnJhbWVWaWV3LT5wYWdpbmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFn
aW5hdGlvbi5tb2RlICE9IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAg
ICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUocGFnaW5hdGlvbi5tb2RlLCBkb2N1bWVudFN0
eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRDb2x1bW5HYXAo
cGFnaW5hdGlvbi5nYXApOwotICAgICAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3KiB2aWV3ID0g
ZG9jdW1lbnQtPnJlbmRlclZpZXcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmlldy0+
aGFzQ29sdW1ucygpKQotICAgICAgICAgICAgICAgICAgICAgICAgdmlldy0+dXBkYXRlQ29sdW1u
SW5mb0Zyb21TdHlsZShkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTZWFtbGVzcyBpZnJhbWVz
IHdhbnQgdG8gaW5oZXJpdCB0aGVpciBmb250IGZyb20gdGhlaXIgcGFyZW50IGlmcmFtZSwgc28g
ZWFybHkgcmV0dXJuIGJlZm9yZSBzZXR0aW5nIHRoZSBmb250LgotICAgIGlmIChzZWFtbGVzc1dp
dGhQYXJlbnQpCi0gICAgICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKLQotICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9uLnNl
dFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKGRvY3VtZW50U3R5bGUt
PmxvY2FsZSgpKSk7Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0
aW5ncygpKSB7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1
bWVudC0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFi
bGVkKCkpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5n
cy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3Rh
bmRhcmRGb250ID0gc2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseShmb250RGVzY3JpcHRpb24u
c2NyaXB0KCkpOwotICAgICAgICBpZiAoIXN0YW5kYXJkRm9udC5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6
U3RhbmRhcmRGYW1pbHkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5
KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
Zmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxs
ICsgMSk7Ci0gICAgICAgIGludCBzaXplID0gU3R5bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3
b3JkKGRvY3VtZW50LCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpOwotICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAgICAgICAgYm9vbCB1c2VTVkdab29tUnVs
ZXMgPSBkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpOwotICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0Q29tcHV0ZWRTaXplKFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZp
ZWRTaXplKGRvY3VtZW50LCBkb2N1bWVudFN0eWxlLmdldCgpLCBmb250RGVzY3JpcHRpb24uaXNB
YnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKSk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmco
KSk7Ci0KLSAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOwotICAgIE5vbkNKS0ds
eXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKLSAgICBnZXRGb250QW5kR2x5cGhPcmll
bnRhdGlvbihkb2N1bWVudFN0eWxlLmdldCgpLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50
YXRpb24pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRp
b24pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBo
T3JpZW50YXRpb24pOwotCi0gICAgZG9jdW1lbnRTdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7Ci0gICAgZG9jdW1lbnRTdHlsZS0+Zm9udCgpLnVwZGF0ZShmb250U2Vs
ZWN0b3IpOwotCi0gICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotfQotCi1zdGF0
aWMgaW5saW5lIGJvb2wgaXNBdFNoYWRvd0JvdW5kYXJ5KGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQp
Ci17Ci0gICAgaWYgKCFlbGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ29udGFp
bmVyTm9kZSogcGFyZW50Tm9kZSA9IGVsZW1lbnQtPnBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4g
cGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLT5pc1NoYWRvd1Jvb3QoKTsKLX0KLQotUGFzc1JlZlB0
cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGVs
ZW1lbnQsIFJlbmRlclN0eWxlKiBkZWZhdWx0UGFyZW50LAotICAgIFN0eWxlU2hhcmluZ0JlaGF2
aW9yIHNoYXJpbmdCZWhhdmlvciwgUnVsZU1hdGNoaW5nQmVoYXZpb3IgbWF0Y2hpbmdCZWhhdmlv
ciwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQotewotICAgIC8vIE9uY2UgYW4gZWxl
bWVudCBoYXMgYSByZW5kZXJlciwgd2UgZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgaXQsIHNpbmNlIG90
aGVyd2lzZSB0aGUgcmVuZGVyZXIKLSAgICAvLyB3aWxsIHZhbmlzaCBpZiBhIHN0eWxlIHJlY2Fs
YyBoYXBwZW5zIGR1cmluZyBsb2FkaW5nLgotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxs
b3dTdHlsZVNoYXJpbmcgJiYgIWVsZW1lbnQtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xv
YWRlZCgpICYmICFlbGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICghc19zdHlsZU5v
dFlldEF2YWlsYWJsZSkgewotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZSA9IFJl
bmRlclN0eWxlOjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0
QXZhaWxhYmxlLT5zZXREaXNwbGF5KE5PTkUpOwotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2
YWlsYWJsZS0+Zm9udCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAg
ICAgZWxlbWVudC0+ZG9jdW1lbnQoKS0+c2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgp
OwotICAgICAgICByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKLSAgICB9Ci0KLSAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0
YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVu
dCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOwotICAgIGlmIChzaGFyaW5nQmVoYXZpb3Ig
PT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2lu
dCgpKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJlZFN0
eWxlKCk7Ci0gICAgICAgIGlmIChzaGFyZWRTdHlsZSkKLSAgICAgICAgICAgIHJldHVybiBzaGFy
ZWRTdHlsZTsKLSAgICB9Ci0KLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNsb25lRm9yUGFyZW50
OwotCi0gICAgaWYgKHN0YXRlLnBhcmVudFN0eWxlKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5
bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJp
dEZyb20oc3RhdGUucGFyZW50U3R5bGUoKSwgaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpID8g
UmVuZGVyU3R5bGU6OkF0U2hhZG93Qm91bmRhcnkgOiBSZW5kZXJTdHlsZTo6Tm90QXRTaGFkb3dC
b3VuZGFyeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoZGVmYXVsdFN0
eWxlRm9yRWxlbWVudCgpKTsKLSAgICAgICAgY2xvbmVGb3JQYXJlbnQgPSBSZW5kZXJTdHlsZTo6
Y2xvbmUoc3RhdGUuc3R5bGUoKSk7Ci0gICAgICAgIHN0YXRlLnNldFBhcmVudFN0eWxlKGNsb25l
Rm9yUGFyZW50LmdldCgpKTsKLSAgICB9Ci0gICAgLy8gY29udGVudGVkaXRhYmxlIGF0dHJpYnV0
ZSAoaW1wbGVtZW50ZWQgYnkgLXdlYmtpdC11c2VyLW1vZGlmeSkgc2hvdWxkCi0gICAgLy8gYmUg
cHJvcGFnYXRlZCBmcm9tIHNoYWRvdyBob3N0IHRvIGRpc3RyaWJ1dGVkIG5vZGUuCi0gICAgaWYg
KHN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIGlmIChFbGVt
ZW50KiBwYXJlbnQgPSBlbGVtZW50LT5wYXJlbnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlm
IChSZW5kZXJTdHlsZSogc3R5bGVPZlNoYWRvd0hvc3QgPSBwYXJlbnQtPnJlbmRlclN0eWxlKCkp
Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlck1vZGlmeShzdHlsZU9mU2hh
ZG93SG9zdC0+dXNlck1vZGlmeSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbGVt
ZW50LT5pc0xpbmsoKSkgewotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJc0xpbmsodHJ1ZSk7
Ci0gICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0ZSA9IHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUo
KTsKLSAgICAgICAgaWYgKGxpbmtTdGF0ZSAhPSBOb3RJbnNpZGVMaW5rKSB7Ci0gICAgICAgICAg
ICBib29sIGZvcmNlVmlzaXRlZCA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6Zm9yY2VQc2V1
ZG9TdGF0ZShlbGVtZW50LCBDU1NTZWxlY3Rvcjo6UHNldWRvVmlzaXRlZCk7Ci0gICAgICAgICAg
ICBpZiAoZm9yY2VWaXNpdGVkKQotICAgICAgICAgICAgICAgIGxpbmtTdGF0ZSA9IEluc2lkZVZp
c2l0ZWRMaW5rOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxp
bmsobGlua1N0YXRlKTsKLSAgICB9Ci0KLSAgICBib29sIG5lZWRzQ29sbGVjdGlvbiA9IGZhbHNl
OwotICAgIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZW5zdXJlRGVmYXVsdFN0eWxlU2hlZXRzRm9y
RWxlbWVudChlbGVtZW50LCBuZWVkc0NvbGxlY3Rpb24pOwotICAgIGlmIChuZWVkc0NvbGxlY3Rp
b24pCi0gICAgICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50KCktPmlzVmll
d1NvdXJjZSgpLCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwotCi0gICAgTWF0Y2hSZXN1bHQgbWF0
Y2hSZXN1bHQ7Ci0gICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50
UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0gICAgZWxzZQotICAg
ICAgICBtYXRjaEFsbFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNo
QWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0
Y2hSZXN1bHQsIGVsZW1lbnQpOwotCi0gICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdz
IGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCi0gICAg
YWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxl
bWVudCk7Ci0KLSAgICBzdGF0ZS5jbGVhcigpOyAvLyBDbGVhciBvdXQgZm9yIHRoZSBuZXh0IHJl
c29sdmUuCi0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAg
ICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yS2V5
ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgY29uc3QgU3R5bGVLZXlmcmFt
ZSoga2V5ZnJhbWUsIEtleWZyYW1lVmFsdWUmIGtleWZyYW1lVmFsdWUpCi17Ci0gICAgTWF0Y2hS
ZXN1bHQgcmVzdWx0OwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBh
ZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwotCi0g
ICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLQotICAgIC8vIENyZWF0ZSB0aGUgc3R5bGUKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJT
dHlsZTo6Y2xvbmUoZWxlbWVudFN0eWxlKSk7Ci0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVl
KDApOwotCi0gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgd2l0aCAhaW1wb3J0YW50LiBT
aW5jZSB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lCi0gICAgLy8gZGVjbCwgdGhlcmUncyBub3RoaW5n
IHRvIG92ZXJyaWRlLiBTbyBqdXN0IGFkZCB0aGUgZmlyc3QgcHJvcGVydGllcy4KLSAgICBib29s
IGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkK
LSAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihy
ZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5o
ZXJpdGVkT25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQg
YW5kIHVwZGF0ZSBpdCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWln
aHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplCi0g
ICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENT
U1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgLy8g
Tm93IGRvIHJlc3Qgb2YgdGhlIHByb3BlcnRpZXMuCi0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0
aWVzKCkpCi0gICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0
aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCBieSBv
bmUgb2YgdGhlIG5vbi1lc3NlbnRpYWwgZm9udCBwcm9wcywKLSAgICAvLyBnbyBhaGVhZCBhbmQg
dXBkYXRlIGl0IGEgc2Vjb25kIHRpbWUuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gU3Rh
cnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQ
ZW5kaW5nUmVzb3VyY2VzKCk7Ci0gICAgCi0gICAgLy8gQWRkIGFsbCB0aGUgYW5pbWF0aW5nIHBy
b3BlcnRpZXMgdG8gdGhlIGtleWZyYW1lLgotICAgIGlmIChjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBzdHlsZURlY2xhcmF0aW9uID0ga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkgewotICAgICAgICB1
bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlDb3VudCgp
OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7
Ci0gICAgICAgICAgICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0gc3R5bGVEZWNsYXJhdGlvbi0+
cHJvcGVydHlBdChpKS5pZCgpOwotICAgICAgICAgICAgLy8gVGltaW5nLWZ1bmN0aW9uIHdpdGhp
biBrZXlmcmFtZXMgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBub3QgYW5pbWF0ZWQ7IGl0IGp1
c3QKLSAgICAgICAgICAgIC8vIGRlc2NyaWJlcyB0aGUgdGltaW5nIGZ1bmN0aW9uIGJldHdlZW4g
dGhpcyBrZXlmcmFtZSBhbmQgdGhlIG5leHQuCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0g
Q1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbikKLSAgICAgICAgICAgICAg
ICBrZXlmcmFtZVZhbHVlLmFkZFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIHJldHVy
biBzdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjprZXlmcmFtZVN0
eWxlc0ZvckFuaW1hdGlvbihFbGVtZW50KiBlLCBjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0
eWxlLCBLZXlmcmFtZUxpc3QmIGxpc3QpCi17Ci0gICAgbGlzdC5jbGVhcigpOwotCi0gICAgLy8g
R2V0IHRoZSBrZXlmcmFtZXNSdWxlIGZvciB0aGlzIG5hbWUKLSAgICBpZiAoIWUgfHwgbGlzdC5h
bmltYXRpb25OYW1lKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2tleWZy
YW1lc1J1bGVNYXAuY2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgS2V5ZnJhbWVzUnVsZU1hcDo6
aXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lc1J1bGVNYXAuZmluZChsaXN0LmFuaW1hdGlvbk5hbWUo
KS5pbXBsKCkpOwotICAgIGlmIChpdCA9PSBtX2tleWZyYW1lc1J1bGVNYXAuZW5kKCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGNvbnN0IFN0eWxlUnVsZUtleWZyYW1lcyoga2V5ZnJhbWVzUnVs
ZSA9IGl0LT52YWx1ZS5nZXQoKTsKLQotICAgIC8vIENvbnN0cnVjdCBhbmQgcG9wdWxhdGUgdGhl
IHN0eWxlIGZvciBlYWNoIGtleWZyYW1lCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZUtl
eWZyYW1lPiA+JiBrZXlmcmFtZXMgPSBrZXlmcmFtZXNSdWxlLT5rZXlmcmFtZXMoKTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5ZnJhbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
IC8vIEFwcGx5IHRoZSBkZWNsYXJhdGlvbiB0byB0aGUgc3R5bGUuIFRoaXMgaXMgYSBzaW1wbGlm
aWVkIHZlcnNpb24gb2YgdGhlIGxvZ2ljIGluIHN0eWxlRm9yRWxlbWVudAotICAgICAgICBpbml0
RWxlbWVudChlKTsKLSAgICAgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50
KCksIGUpOwotCi0gICAgICAgIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lID0ga2V5ZnJh
bWVzW2ldLmdldCgpOwotCi0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAw
KTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1l
bnRTdHlsZSwga2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLQotICAgICAgICAvLyBBZGQgdGhp
cyBrZXlmcmFtZSBzdHlsZSB0byBhbGwgdGhlIGluZGljYXRlZCBrZXkgdGltZXMKLSAgICAgICAg
VmVjdG9yPGZsb2F0PiBrZXlzOwotICAgICAgICBrZXlmcmFtZS0+Z2V0S2V5cyhrZXlzKTsKLSAg
ICAgICAgZm9yIChzaXplX3Qga2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMuc2l6ZSgpOyAr
K2tleUluZGV4KSB7Ci0gICAgICAgICAgICBrZXlmcmFtZVZhbHVlLnNldEtleShrZXlzW2tleUlu
ZGV4XSk7Ci0gICAgICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIElmIHRoZSAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUg
aXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKLSAg
ICBpbnQgaW5pdGlhbExpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgaWYgKGluaXRpYWxMaXN0
U2l6ZSA+IDAgJiYgbGlzdFswXS5rZXkoKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFt
ZSogemVyb1BlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCF6ZXJvUGVyY2VudEtleWZyYW1l
KSB7Ci0gICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3Jl
YXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZS0+c2V0S2V5
VGV4dCgiMCUiKTsKLSAgICAgICAgfQotICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFs
dWUoMCwgMCk7Ci0gICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFt
ZShlbGVtZW50U3R5bGUsIHplcm9QZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLSAg
ICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhl
IDEwMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBp
cyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCi0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+
IDAgJiYgKGxpc3RbbGlzdC5zaXplKCkgLSAxXS5rZXkoKSAhPSAxKSkgewotICAgICAgICBzdGF0
aWMgU3R5bGVLZXlmcmFtZSogaHVuZHJlZFBlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCFo
dW5kcmVkUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZy
YW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgaHVu
ZHJlZFBlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMTAwJSIpOwotICAgICAgICB9Ci0gICAg
ICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgxLCAwKTsKLSAgICAgICAga2V5ZnJhbWVW
YWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgaHVuZHJlZFBlcmNl
bnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFt
ZVZhbHVlKTsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2
ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlLCBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewot
ICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7Ci0gICAgaWYgKCFlKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLQot
ICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUs
IHBzZXVkb1N0eWxlUmVxdWVzdCk7Ci0gICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpKTsKLSAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnBhcmVudFN0
eWxlKCkpOwotCi0gICAgLy8gU2luY2Ugd2UgZG9uJ3QgdXNlIHBzZXVkby1lbGVtZW50cyBpbiBh
bnkgb2Ygb3VyIHF1aXJrL3ByaW50IHVzZXIgYWdlbnQgcnVsZXMsIGRvbid0IHdhc3RlIHRpbWUg
d2Fsa2luZwotICAgIC8vIHRob3NlIHJ1bGVzLgotCi0gICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5k
IGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVB
UnVsZXMobWF0Y2hSZXN1bHQpOwotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
KSB7Ci0gICAgICAgIG1hdGNoVXNlclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAg
IG1hdGNoQXV0aG9yUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAo
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHN0YXRlLnN0eWxlKCktPnNldFN0eWxlVHlwZShwc2V1ZG9TdHlsZVJlcXVlc3Qu
cHNldWRvSWQpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZSk7
Ci0KLSAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBk
ZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJTdHlsZShz
dGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnBhcmVudFN0eWxlKCksIDApOwotCi0gICAgLy8gU3RhcnQg
bG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5k
aW5nUmVzb3VyY2VzKCk7Ci0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVy
KCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFr
ZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0
eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQotewotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVz
b2x2ZShkb2N1bWVudCgpLCBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSk7IC8vIG1fcm9v
dEVsZW1lbnRTdHlsZSB3aWxsIGJlIHNldCB0byB0aGUgZG9jdW1lbnQgc3R5bGUuCi0KLSAgICBt
X3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgbV9zdGF0ZS5zdHls
ZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICBjb25z
dCBib29sIGlzTGVmdCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlz
Rmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0g
cGFnZU5hbWUocGFnZUluZGV4KTsKLSAgICAKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAg
bWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmlu
dFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3Vs
dCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAv
LyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVz
LCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCi0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1
bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbV9zdGF0
ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7
Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxW
YXJpYWJsZURlZmluaXRpb25zPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0jZW5kaWYKLSAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAg
IC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4K
LSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBh
cmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUuCi0gICAgaWYgKG1fc3RhdGUubGlu
ZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVp
Z2h0LCBtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBTdGFy
dCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBl
bmRpbmdSZXNvdXJjZXMoKTsKLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2
ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBtX3N0YXRl
LnRha2VTdHlsZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkKLXsKLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRl
clN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgLy8gTWFrZSBzdXJlIG91ciBmb250cyBhcmUgaW5pdGlh
bGl6ZWQgaWYgd2UgZG9uJ3QgaW5oZXJpdCB0aGVtIGZyb20gb3VyIHBhcmVudCBzdHlsZS4KLSAg
ICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpKSB7Ci0gICAgICAg
IGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOwotICAgICAgICBtX3N0YXRlLnN0eWxlKCkt
PmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKCkpOwotICAgIH0gZWxzZQotICAgICAgICBtX3N0
YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoMCk7Ci0KLSAgICByZXR1cm4gbV9zdGF0ZS50YWtl
U3R5bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5
bGVGb3JUZXh0KFRleHQqIHRleHROb2RlKQotewotICAgIEFTU0VSVCh0ZXh0Tm9kZSk7Ci0KLSAg
ICBOb2RlUmVuZGVyaW5nQ29udGV4dCBjb250ZXh0KHRleHROb2RlKTsKLSAgICBOb2RlKiBwYXJl
bnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICBy
ZXR1cm4gY29udGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSB8fCAhcGFyZW50Tm9kZSA/Ci0g
ICAgICAgIGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSA6IHBhcmVudE5vZGUtPnJlbmRlclN0eWxl
KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqIHN0
eWxlKQotewotICAgIC8vIEludHJpbnNpYyBtYXJnaW4gdmFsdWUuCi0gICAgY29uc3QgaW50IGlu
dHJpbnNpY01hcmdpbiA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gRklY
TUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1p
bi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgotICAgIC8vIEZJWE1FOiBVc2luZyAicXVpcmsi
IHRvIGRlY2lkZSB0aGUgbWFyZ2luIHdhc24ndCBzZXQgaXMga2luZCBvZiBsYW1lLgotICAgIGlm
IChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChzdHls
ZS0+bWFyZ2luTGVmdCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVm
dChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1h
cmdpblJpZ2h0KCkucXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChM
ZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChzdHlsZS0+
aGVpZ2h0KCkuaXNBdXRvKCkpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Ub3AoKS5xdWly
aygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgoaW50cmluc2ljTWFy
Z2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkp
Ci0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChpbnRyaW5zaWNNYXJn
aW4sIEZpeGVkKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgRURpc3BsYXkgZXF1aXZhbGVudEJsb2Nr
RGlzcGxheShFRGlzcGxheSBkaXNwbGF5LCBib29sIGlzRmxvYXRpbmcsIGJvb2wgc3RyaWN0UGFy
c2luZykKLXsKLSAgICBzd2l0Y2ggKGRpc3BsYXkpIHsKLSAgICBjYXNlIEJMT0NLOgotICAgIGNh
c2UgVEFCTEU6Ci0gICAgY2FzZSBCT1g6Ci0gICAgY2FzZSBGTEVYOgotICAgIGNhc2UgR1JJRDoK
LSAgICAgICAgcmV0dXJuIGRpc3BsYXk7Ci0KLSAgICBjYXNlIExJU1RfSVRFTToKLSAgICAgICAg
Ly8gSXQgaXMgYSBXaW5JRSBidWcgdGhhdCBmbG9hdGVkIGxpc3QgaXRlbXMgbG9zZSB0aGVpciBi
dWxsZXRzLCBzbyB3ZSdsbCBlbXVsYXRlIHRoZSBxdWlyaywgYnV0IG9ubHkgaW4gcXVpcmtzIG1v
ZGUuCi0gICAgICAgIGlmICghc3RyaWN0UGFyc2luZyAmJiBpc0Zsb2F0aW5nKQotICAgICAgICAg
ICAgcmV0dXJuIEJMT0NLOwotICAgICAgICByZXR1cm4gZGlzcGxheTsKLSAgICBjYXNlIElOTElO
RV9UQUJMRToKLSAgICAgICAgcmV0dXJuIFRBQkxFOwotICAgIGNhc2UgSU5MSU5FX0JPWDoKLSAg
ICAgICAgcmV0dXJuIEJPWDsKLSAgICBjYXNlIElOTElORV9GTEVYOgotICAgICAgICByZXR1cm4g
RkxFWDsKLSAgICBjYXNlIElOTElORV9HUklEOgotICAgICAgICByZXR1cm4gR1JJRDsKLQotICAg
IGNhc2UgSU5MSU5FOgotICAgIGNhc2UgUlVOX0lOOgotICAgIGNhc2UgQ09NUEFDVDoKLSAgICBj
YXNlIElOTElORV9CTE9DSzoKLSAgICBjYXNlIFRBQkxFX1JPV19HUk9VUDoKLSAgICBjYXNlIFRB
QkxFX0hFQURFUl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoKLSAgICBjYXNl
IFRBQkxFX1JPVzoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICBjYXNlIFRBQkxF
X0NPTFVNTjoKLSAgICBjYXNlIFRBQkxFX0NFTEw6Ci0gICAgY2FzZSBUQUJMRV9DQVBUSU9OOgot
ICAgICAgICByZXR1cm4gQkxPQ0s7Ci0gICAgY2FzZSBOT05FOgotICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIE5PTkU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgIHJldHVybiBCTE9DSzsKLX0KLQotLy8gQ1NTIHJlcXVpcmVzIHRleHQt
ZGVjb3JhdGlvbiB0byBiZSByZXNldCBhdCBlYWNoIERPTSBlbGVtZW50IGZvciB0YWJsZXMsIAot
Ly8gaW5saW5lIGJsb2NrcywgaW5saW5lIHRhYmxlcywgcnVuLWlucywgc2hhZG93IERPTSBjcm9z
c2luZ3MsIGZsb2F0aW5nIGVsZW1lbnRzLAotLy8gYW5kIGFic29sdXRlIG9yIHJlbGF0aXZlbHkg
cG9zaXRpb25lZCBlbGVtZW50cy4KLXN0YXRpYyBib29sIGRvZXNOb3RJbmhlcml0VGV4dERlY29y
YXRpb24oUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKQotewotICAgIHJldHVybiBzdHls
ZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxF
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gUlVOX0lOCi0gICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gSU5MSU5FX0JMT0NLIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCB8fCBp
c0F0U2hhZG93Qm91bmRhcnkoZSkKLSAgICAgICAgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCBz
dHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKTsKLX0KLQotc3RhdGljIGJvb2wgaXNEaXNwbGF5
RmxleGlibGVCb3goRURpc3BsYXkgZGlzcGxheSkKLXsKLSAgICByZXR1cm4gZGlzcGxheSA9PSBG
TEVYIHx8IGRpc3BsYXkgPT0gSU5MSU5FX0ZMRVg7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
YWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUsIEVsZW1lbnQgKmUpCi17Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKLQotICAgIC8v
IENhY2hlIG91ciBvcmlnaW5hbCBkaXNwbGF5LgotICAgIHN0eWxlLT5zZXRPcmlnaW5hbERpc3Bs
YXkoc3R5bGUtPmRpc3BsYXkoKSk7Ci0KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05F
KSB7Ci0gICAgICAgIC8vIElmIHdlIGhhdmUgYSA8dGQ+IHRoYXQgc3BlY2lmaWVzIGEgZmxvYXQg
cHJvcGVydHksIGluIHF1aXJrcyBtb2RlIHdlIGp1c3QgZHJvcCB0aGUgZmxvYXQKLSAgICAgICAg
Ly8gcHJvcGVydHkuCi0gICAgICAgIC8vIFNpdGVzIGFsc28gY29tbW9ubHkgdXNlIGRpc3BsYXk6
aW5saW5lL2Jsb2NrIG9uIDx0ZD5zIGFuZCA8dGFibGU+cy4gSW4gcXVpcmtzIG1vZGUgd2UgZm9y
Y2UKLSAgICAgICAgLy8gdGhlc2UgdGFncyB0byByZXRhaW4gdGhlaXIgZGlzcGxheSB0eXBlcy4K
LSAgICAgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpICYmIGUpIHsKLSAgICAgICAg
ICAgIGlmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSkgewotICAgICAgICAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KFRBQkxFX0NFTEwpOwotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGlu
ZyhOb0Zsb2F0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS0+aGFzVGFnTmFtZSh0YWJsZVRh
ZykpCi0gICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoc3R5bGUtPmlzRGlzcGxheUlu
bGluZVR5cGUoKSA/IElOTElORV9UQUJMRSA6IFRBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChlICYmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBlLT5oYXNUYWdOYW1lKHRoVGFnKSkp
IHsKLSAgICAgICAgICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1MX05PV1JBUCkg
ewotICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxseSBub3dyYXBw
aW5nIG9yIGlmIHdlIHNob3VsZCBqdXN0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIG5vcm1hbCBp
bnN0ZWFkLiBJZiB0aGUgd2lkdGggb2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAg
ICAgICAgICAvLyB3ZSBkb24ndCBhY3R1YWxseSB1c2UgTk9XUkFQLgotICAgICAgICAgICAgICAg
IGlmIChzdHlsZS0+d2lkdGgoKS5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHN0eWxl
LT5zZXRXaGl0ZVNwYWNlKE5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVApOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGFibGVzIG5ldmVyIHN1cHBvcnQgdGhlIC13ZWJraXQt
KiB2YWx1ZXMgZm9yIHRleHQtYWxpZ24gYW5kIHdpbGwgcmVzZXQgYmFjayB0byB0aGUgZGVmYXVs
dC4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykgJiYgKHN0eWxlLT50
ZXh0QWxpZ24oKSA9PSBXRUJLSVRfTEVGVCB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lU
X0NFTlRFUiB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAgICAg
ICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oVEFTVEFSVCk7Ci0KLSAgICAgICAgLy8gRnJhbWVzIGFu
ZCBmcmFtZXNldHMgbmV2ZXIgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246YWJz
b2x1dGUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCi0gICAgICAgIC8vIGZpeCBhIGNyYXNoIHdoZXJl
IGEgc2l0ZSB0cmllcyB0byBwb3NpdGlvbiB0aGVzZSBvYmplY3RzLiBUaGV5IGFsc28gbmV2ZXIg
aG9ub3IgZGlzcGxheS4KLSAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUoZnJhbWVUYWcp
IHx8IGUtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNl
dFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5
KEJMT0NLKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1YnkgdGV4dCBkb2VzIG5vdCBzdXBw
b3J0IGZsb2F0IG9yIHBvc2l0aW9uLiBUaGlzIG1pZ2h0IGNoYW5nZSB3aXRoIGV2b2x1dGlvbiBv
ZiB0aGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShydFRh
ZykpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0g
ICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIG92ZXJyaWRpbmcgc3RhcnQvLXdlYmtpdC1h
dXRvIGxpa2UgdGhpcy4gRG8gaXQgaW4gaHRtbC5jc3MgaW5zdGVhZC4KLSAgICAgICAgLy8gVGFi
bGUgaGVhZGVycyB3aXRoIGEgdGV4dC1hbGlnbiBvZiAtd2Via2l0LWF1dG8gd2lsbCBjaGFuZ2Ug
dGhlIHRleHQtYWxpZ24gdG8gY2VudGVyLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1l
KHRoVGFnKSAmJiBzdHlsZS0+dGV4dEFsaWduKCkgPT0gVEFTVEFSVCkKLSAgICAgICAgICAgIHN0
eWxlLT5zZXRUZXh0QWxpZ24oQ0VOVEVSKTsKLQotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdO
YW1lKGxlZ2VuZFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0K
LSAgICAgICAgLy8gQWJzb2x1dGUvZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywgZmxvYXRpbmcg
ZWxlbWVudHMgYW5kIHRoZSBkb2N1bWVudCBlbGVtZW50IG5lZWQgYmxvY2stbGlrZSBvdXRzaWRl
IGRpc3BsYXkuCi0gICAgICAgIGlmIChzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSB8fCBz
dHlsZS0+aXNGbG9hdGluZygpIHx8IChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVu
dCgpID09IGUpKQotICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2Nr
RGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQo
KS0+aW5RdWlya3NNb2RlKCkpKTsKLQotICAgICAgICAvLyBGSVhNRTogRG9uJ3Qgc3VwcG9ydCB0
aGlzIG11dGF0aW9uIGZvciBwc2V1ZG8gc3R5bGVzIGxpa2UgZmlyc3QtbGV0dGVyIG9yIGZpcnN0
LWxpbmUsIHNpbmNlIGl0J3Mgbm90IGNvbXBsZXRlbHkKLSAgICAgICAgLy8gY2xlYXIgaG93IHRo
YXQgc2hvdWxkIHdvcmsuCi0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAm
JiBzdHlsZS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgc3R5bGUtPndyaXRpbmdNb2RlKCkg
IT0gcGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlz
cGxheShJTkxJTkVfQkxPQ0spOwotCi0gICAgICAgIC8vIEFmdGVyIHBlcmZvcm1pbmcgdGhlIGRp
c3BsYXkgbXV0YXRpb24sIGNoZWNrIHRhYmxlIHJvd3MuIFdlIGRvIG5vdCBob25vciBwb3NpdGlv
bjpyZWxhdGl2ZSBvciBwb3NpdGlvbjpzdGlja3kgb24KLSAgICAgICAgLy8gdGFibGUgcm93cyBv
ciBjZWxscy4gVGhpcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBmb3IgcG9zaXRpb246cmVsYXRpdmUg
aW4gQ1NTMi4xIChhbmQgY2F1c2VkIGEgY3Jhc2ggaW4gY29udGFpbmluZ0Jsb2NrKCkKLSAgICAg
ICAgLy8gb24gc29tZSBzaXRlcykuCi0gICAgICAgIGlmICgoc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAK
LSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKQotICAgICAgICAgICAgJiYgc3R5bGUtPmhh
c0luRmxvd1Bvc2l0aW9uKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGlj
UG9zaXRpb24pOwotCi0gICAgICAgIC8vIHdyaXRpbmctbW9kZSBkb2VzIG5vdCBhcHBseSB0byB0
YWJsZSByb3cgZ3JvdXBzLCB0YWJsZSBjb2x1bW4gZ3JvdXBzLCB0YWJsZSByb3dzLCBhbmQgdGFi
bGUgY29sdW1ucy4KLSAgICAgICAgLy8gRklYTUU6IFRhYmxlIGNlbGxzIHNob3VsZCBiZSBhbGxv
d2VkIHRvIGJlIHBlcnBlbmRpY3VsYXIgb3IgZmxpcHBlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHRh
YmxlLCB0aG91Z2guCi0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVN
TiB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCB8fCBzdHlsZS0+ZGlz
cGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9S
T1cgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ0VMTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRX
cml0aW5nTW9kZShwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSk7Ci0KLSAgICAgICAgLy8gRklY
TUU6IFNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYmxvY2stZmxvdyBvbiBmbGV4aWJsZSBib3hlcyB5
ZXQsIGRpc2FsbG93IHNldHRpbmcKLSAgICAgICAgLy8gb2YgYmxvY2stZmxvdyB0byBhbnl0aGlu
ZyBvdGhlciB0aGFuIFRvcFRvQm90dG9tV3JpdGluZ01vZGUuCi0gICAgICAgIC8vIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NjQxOCAtIEZsZXhpYmxlIGJveCBzdXBw
b3J0LgotICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gVG9wVG9Cb3R0b21Xcml0
aW5nTW9kZSAmJiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBCT1ggfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBJTkxJTkVfQk9YKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShUb3BUb0Jv
dHRvbVdyaXRpbmdNb2RlKTsKLQotICAgICAgICBpZiAoaXNEaXNwbGF5RmxleGlibGVCb3gocGFy
ZW50U3R5bGUtPmRpc3BsYXkoKSkpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhO
b0Zsb2F0KTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rp
c3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCkt
PmluUXVpcmtzTW9kZSgpKSk7Ci0gICAgICAgIH0KLQotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVO
VCkKLSAgICAgICAgLy8gUGVyIHRoZSBzcGVjLCBwb3NpdGlvbiAnc3RhdGljJyBhbmQgJ3JlbGF0
aXZlJyBpbiB0aGUgdG9wIGxheWVyIGNvbXB1dGUgdG8gJ2Fic29sdXRlJy4KLSAgICAgICAgaWYg
KGUgJiYgZS0+aXNJblRvcExheWVyKCkgJiYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bv
c2l0aW9uIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFJlbGF0aXZlUG9zaXRpb24pKSB7Ci0gICAg
ICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oQWJzb2x1dGVQb3NpdGlvbik7Ci0gICAgICAgICAg
ICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQot
ICAgIC8vIE1ha2Ugc3VyZSBvdXIgei1pbmRleCB2YWx1ZSBpcyBvbmx5IGFwcGxpZWQgaWYgdGhl
IG9iamVjdCBpcyBwb3NpdGlvbmVkLgotICAgIGlmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0
aWNQb3NpdGlvbiAmJiAhaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXko
KSkpCi0gICAgICAgIHN0eWxlLT5zZXRIYXNBdXRvWkluZGV4KCk7Ci0KLSAgICAvLyBBdXRvIHot
aW5kZXggYmVjb21lcyAwIGZvciB0aGUgcm9vdCBlbGVtZW50IGFuZCB0cmFuc3BhcmVudCBvYmpl
Y3RzLiBUaGlzIHByZXZlbnRzCi0gICAgLy8gY2FzZXMgd2hlcmUgb2JqZWN0cyB0aGF0IHNob3Vs
ZCBiZSBibGVuZGVkIGFzIGEgc2luZ2xlIHVuaXQgZW5kIHVwIHdpdGggYSBub24tdHJhbnNwYXJl
bnQKLSAgICAvLyBvYmplY3Qgd2VkZ2VkIGluIGJldHdlZW4gdGhlbS4gQXV0byB6LWluZGV4IGFs
c28gYmVjb21lcyAwIGZvciBvYmplY3RzIHRoYXQgc3BlY2lmeSB0cmFuc2Zvcm1zL21hc2tzL3Jl
ZmxlY3Rpb25zLgotICAgIGlmIChzdHlsZS0+aGFzQXV0b1pJbmRleCgpICYmICgoZSAmJiBlLT5k
b2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKQotICAgICAgICB8fCBzdHlsZS0+b3Bh
Y2l0eSgpIDwgMS4wZgotICAgICAgICB8fCBzdHlsZS0+aGFzVHJhbnNmb3JtUmVsYXRlZFByb3Bl
cnR5KCkKLSAgICAgICAgfHwgc3R5bGUtPmhhc01hc2soKQotICAgICAgICB8fCBzdHlsZS0+Y2xp
cFBhdGgoKQotICAgICAgICB8fCBzdHlsZS0+Ym94UmVmbGVjdCgpCi0gICAgICAgIHx8IHN0eWxl
LT5oYXNGaWx0ZXIoKQotICAgICAgICB8fCBzdHlsZS0+aGFzQmxlbmRNb2RlKCkKLSAgICAgICAg
fHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RpY2t5UG9zaXRpb24KLSAgICAgICAgfHwgKHN0eWxl
LT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb24gJiYgZSAmJiBlLT5kb2N1bWVudCgpLT5wYWdl
KCkgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpLT5zZXR0aW5ncygpLT5maXhlZFBvc2l0aW9uQ3Jl
YXRlc1N0YWNraW5nQ29udGV4dCgpKQotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19T
Q1JPTExJTkcpCi0gICAgICAgIC8vIFRvdWNoIG92ZXJmbG93IHNjcm9sbGluZyBjcmVhdGVzIGEg
c3RhY2tpbmcgY29udGV4dC4KLSAgICAgICAgfHwgKChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJ
RERFTiB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikgJiYgc3R5bGUtPnVzZVRvdWNo
T3ZlcmZsb3dTY3JvbGxpbmcoKSkKLSNlbmRpZgotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkK
LSAgICAgICAgfHwgKGUgJiYgZS0+aXNJblRvcExheWVyKCkpCi0jZW5kaWYKLSAgICAgICAgKSkK
LSAgICAgICAgc3R5bGUtPnNldFpJbmRleCgwKTsKLQotICAgIC8vIFRleHRhcmVhIGNvbnNpZGVy
cyBvdmVyZmxvdyB2aXNpYmxlIGFzIGF1dG8uCi0gICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0
ZXh0YXJlYVRhZykpIHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChzdHlsZS0+b3ZlcmZs
b3dYKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1goKSk7Ci0gICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1koc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFID8gT0FV
VE8gOiBzdHlsZS0+b3ZlcmZsb3dZKCkpOwotICAgIH0KLQotICAgIGlmIChkb2VzTm90SW5oZXJp
dFRleHREZWNvcmF0aW9uKHN0eWxlLCBlKSkKLSAgICAgICAgc3R5bGUtPnNldFRleHREZWNvcmF0
aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLSAgICBlbHNlCi0gICAgICAg
IHN0eWxlLT5hZGRUb1RleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlv
bigpKTsKLQotICAgIC8vIElmIGVpdGhlciBvdmVyZmxvdyB2YWx1ZSBpcyBub3QgdmlzaWJsZSwg
Y2hhbmdlIHRvIGF1dG8uCi0gICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPTUFSUVVFRSAm
JiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVy
Zmxvd1koT01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPTUFS
UVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1goT01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9
PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUpIHsKLSAgICAgICAg
Ly8gRklYTUU6IE9uY2Ugd2UgaW1wbGVtZW50IHBhZ2luYXRpb24gY29udHJvbHMsIG92ZXJmbG93
LXggc2hvdWxkIGRlZmF1bHQgdG8gaGlkZGVuCi0gICAgICAgIC8vIGlmIG92ZXJmbG93LXkgaXMg
c2V0IHRvIC13ZWJraXQtcGFnZWQteCBvciAtd2Via2l0LXBhZ2UteS4gRm9yIG5vdywgd2UnbGwg
bGV0IGl0Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gYXV0byBzbyB3ZSBjYW4gYXQgbGVhc3Qgc2Ny
b2xsIHRocm91Z2ggdGhlIHBhZ2VzLgotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9BVVRP
KTsKLSAgICB9IGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSAmJiBzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1ko
T0FVVE8pOwotCi0gICAgLy8gQ2FsbCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZSgpIGlmIGEg
cGFnaW5hdGlvbiBtb2RlIGlzIHNldCBmb3IgYW55IG5vbi1yb290IGVsZW1lbnRzLiBJZiB0aGVz
ZQotICAgIC8vIHN0eWxlcyBhcmUgc3BlY2lmaWVkIG9uIGEgcm9vdCBlbGVtZW50LCB0aGVuIHRo
ZXkgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW4KLSAgICAvLyBTdHlsZVJlc29sdmVyOjpzdHlsZUZv
ckRvY3VtZW50KCkuCi0gICAgaWYgKChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWCB8fCBz
dHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWSkgJiYgIShlICYmIChlLT5oYXNUYWdOYW1lKGh0
bWxUYWcpIHx8IGUtPmhhc1RhZ05hbWUoYm9keVRhZykpKSkKLSAgICAgICAgc2V0U3R5bGVzRm9y
UGFnaW5hdGlvbk1vZGUoV2ViQ29yZTo6cGFnaW5hdGlvbk1vZGVGb3JSZW5kZXJTdHlsZShzdHls
ZSksIHN0eWxlKTsKLQotICAgIC8vIFRhYmxlIHJvd3MsIHNlY3Rpb25zIGFuZCB0aGUgdGFibGUg
aXRzZWxmIHdpbGwgc3VwcG9ydCBvdmVyZmxvdzpoaWRkZW4gYW5kIHdpbGwgaWdub3JlIHNjcm9s
bC9hdXRvLgotICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5IHRhYmxlIHNlY3Rpb25zIHdpbGwgc3Vw
cG9ydCBhdXRvIGFuZCBzY3JvbGwuCi0gICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUg
fHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUKLSAgICAgICAgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9S
T1cpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSAmJiBzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTikKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1goT1ZJU0lCTEUpOwotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxF
ICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WShPVklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8gTWVudWxpc3RzIHNob3VsZCBo
YXZlIHZpc2libGUgb3ZlcmZsb3cKLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51
bGlzdFBhcnQpIHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0gICAg
ICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwotICAgIH0KLQotICAgIC8vIEN1bGwg
b3V0IGFueSB1c2VsZXNzIGxheWVycyBhbmQgYWxzbyByZXBlYXQgcGF0dGVybnMgaW50byBhZGRp
dGlvbmFsIGxheWVycy4KLSAgICBzdHlsZS0+YWRqdXN0QmFja2dyb3VuZExheWVycygpOwotICAg
IHN0eWxlLT5hZGp1c3RNYXNrTGF5ZXJzKCk7Ci0KLSAgICAvLyBEbyB0aGUgc2FtZSBmb3IgYW5p
bWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMuCi0gICAgc3R5bGUtPmFkanVzdEFuaW1hdGlvbnMoKTsK
LSAgICBzdHlsZS0+YWRqdXN0VHJhbnNpdGlvbnMoKTsKLQotICAgIC8vIEltcG9ydGFudDogSW50
cmluc2ljIG1hcmdpbnMgZ2V0IGFkZGVkIHRvIGNvbnRyb2xzIGJlZm9yZSB0aGUgdGhlbWUgaGFz
IGFkanVzdGVkIHRoZSBzdHlsZSwgc2luY2UgdGhlIHRoZW1lIHdpbGwKLSAgICAvLyBhbHRlciBm
b250cyBhbmQgaGVpZ2h0cy93aWR0aHMuCi0gICAgaWYgKGUgJiYgZS0+aXNGb3JtQ29udHJvbEVs
ZW1lbnQoKSAmJiBzdHlsZS0+Zm9udFNpemUoKSA+PSAxMSkgewotICAgICAgICAvLyBEb24ndCBh
cHBseSBpbnRyaW5zaWMgbWFyZ2lucyB0byBpbWFnZSBidXR0b25zLiBUaGUgZGVzaWduZXIga25v
d3MgaG93IGJpZyB0aGUgaW1hZ2VzIGFyZSwKLSAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB0cmVh
dCBhbGwgaW1hZ2UgYnV0dG9ucyBhcyB0aG91Z2ggdGhleSB3ZXJlIGV4cGxpY2l0bHkgc2l6ZWQu
Ci0gICAgICAgIGlmICghZS0+aGFzVGFnTmFtZShpbnB1dFRhZykgfHwgIXN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihlKS0+aXNJbWFnZUJ1dHRvbigpKQotICAgICAgICAgICAgYWRkSW50
cmluc2ljTWFyZ2lucyhzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSB0aGVtZSBhbHNv
IGhhdmUgYSBjcmFjayBhdCBhZGp1c3RpbmcgdGhlIHN0eWxlLgotICAgIGlmIChzdHlsZS0+aGFz
QXBwZWFyYW5jZSgpKQotICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFkanVz
dFN0eWxlKHRoaXMsIHN0eWxlLCBlLCBtX3N0YXRlLmhhc1VBQXBwZWFyYW5jZSgpLCBtX3N0YXRl
LmJvcmRlckRhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91
bmRDb2xvcigpKTsKLQotICAgIC8vIElmIHdlIGhhdmUgZmlyc3QtbGV0dGVyIHBzZXVkbyBzdHls
ZSwgZG8gbm90IHNoYXJlIHRoaXMgc3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNQc2V1ZG9TdHls
ZShGSVJTVF9MRVRURVIpKQotICAgICAgICBzdHlsZS0+c2V0VW5pcXVlKCk7Ci0KLSAgICAvLyBG
SVhNRTogd2hlbiBkcm9wcGluZyB0aGUgLXdlYmtpdCBwcmVmaXggb24gdHJhbnNmb3JtLXN0eWxl
LCB3ZSBzaG91bGQgYWxzbyBoYXZlIG9wYWNpdHkgPCAxIGNhdXNlIGZsYXR0ZW5pbmcuCi0gICAg
aWYgKHN0eWxlLT5wcmVzZXJ2ZXMzRCgpICYmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lC
TEUKLSAgICAgICAgfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFCi0gICAgICAgIHx8
IHN0eWxlLT5oYXNGaWx0ZXIoKSkpCi0gICAgICAgIHN0eWxlLT5zZXRUcmFuc2Zvcm1TdHlsZTNE
KFRyYW5zZm9ybVN0eWxlM0RGbGF0KTsKLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgYmVoYXZl
IGxpa2UgYmxvY2tzLiBNYXAgdGhlaXIgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sgd2hlbiBtYXJr
ZWQgaW5saW5lLgotICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSAmJiBzdHls
ZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+
KGUpLT5zaG91bGREaXNwbGF5U2VhbWxlc3NseSgpKQotICAgICAgICBzdHlsZS0+c2V0RGlzcGxh
eShJTkxJTkVfQkxPQ0spOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZSAmJiBlLT5pc1NW
R0VsZW1lbnQoKSkgewotICAgICAgICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcv
bWFza2luZy5odG1sI092ZXJmbG93UHJvcGVydHkKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxv
d1koKSA9PSBPU0NST0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPSElEREVO
KTsKLSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9BVVRPKQotICAgICAg
ICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKHN0eWxl
LT5vdmVyZmxvd1goKSA9PSBPU0NST0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93
WChPSElEREVOKTsKLSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9BVVRP
KQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0KLSAgICAgICAg
Ly8gT25seSB0aGUgcm9vdCA8c3ZnPiBlbGVtZW50IGluIGFuIFNWRyBkb2N1bWVudCBmcmFnbWVu
dCB0cmVlIGhvbm9ycyBjc3MgcG9zaXRpb24KLSAgICAgICAgaWYgKCEoZS0+aGFzVGFnTmFtZShT
VkdOYW1lczo6c3ZnVGFnKSAmJiBlLT5wYXJlbnROb2RlKCkgJiYgIWUtPnBhcmVudE5vZGUoKS0+
aXNTVkdFbGVtZW50KCkpKQotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFJlbmRlclN0
eWxlOjppbml0aWFsUG9zaXRpb24oKSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyU1ZHUm9vdCBoYW5k
bGVzIHpvb21pbmcgZm9yIHRoZSB3aG9sZSBTVkcgc3VidHJlZSwgc28gZm9yZWlnbk9iamVjdCBj
b250ZW50IHNob3VsZAotICAgICAgICAvLyBub3QgYmUgc2NhbGVkIGFnYWluLgotICAgICAgICBp
ZiAoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6Zm9yZWlnbk9iamVjdFRhZykpCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSk7Ci0g
ICAgfQotI2VuZGlmCi19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TdHlsZShF
bGVtZW50KiByZWdpb25FbGVtZW50KQotewotICAgIC8vIEZJWE1FIChCVUcgNzI0NzIpOiBXZSBk
b24ndCBhZGQgQC13ZWJraXQtcmVnaW9uIHJ1bGVzIG9mIHNjb3BlZCBzdHlsZSBzaGVldHMgZm9y
IHRoZSBtb21lbnQsCi0gICAgLy8gc28gYWxsIHJlZ2lvbiBydWxlcyBhcmUgZ2xvYmFsIGJ5IGRl
ZmF1bHQuIFZlcmlmeSB3aGV0aGVyIHRoYXQgY2FuIHN0YW5kIG9yIG5lZWRzIGNoYW5naW5nLgot
Ci0gICAgdW5zaWduZWQgcnVsZXNTaXplID0gbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3Jl
Z2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMuYXV0aG9y
U3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgp
KTsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy5hdXRob3JTdHls
ZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25F
bGVtZW50KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3J1
bGVTZXRzLnVzZXJTdHlsZSgpKSB7Ci0gICAgICAgIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMudXNl
clN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgICAgIEFT
U0VSVChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRz
LmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0
b3IobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5h
dChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2
b2lkIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAg
IEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRh
dGlvbiBnbHlwaE9yaWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKHN0
eWxlLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotCi0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24gPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7
Ci0gICAgaWYgKGZvbnREZXNjcmlwdGlvbi5vcmllbnRhdGlvbigpID09IGZvbnRPcmllbnRhdGlv
biAmJiBmb250RGVzY3JpcHRpb24ubm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09IGdseXBoT3Jp
ZW50YXRpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250
RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0
Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKLSAgICBuZXdGb250RGVz
Y3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKLSAgICBzdHlsZS0+c2V0
Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6dXBkYXRlRm9udCgpCi17Ci0gICAgaWYgKCFtX3N0YXRlLmZvbnREaXJ0eSgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjaGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0gICAgUmVuZGVy
U3R5bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOwotICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWls
eUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKLSAgICBjaGVja0Zvclpvb21D
aGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3JPcmllbnRh
dGlvbkNoYW5nZShzdHlsZSk7Ci0gICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0
b3IpOwotICAgIG1fc3RhdGUuc2V0Rm9udERpcnR5KGZhbHNlKTsKLX0KLQotUGFzc1JlZlB0cjxD
U1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCog
ZSwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCi17Ci0gICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVs
ZXNGb3JFbGVtZW50KGUsIE5PUFNFVURPLCBydWxlc1RvSW5jbHVkZSk7Ci19Ci0KLVBhc3NSZWZQ
dHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50
KEVsZW1lbnQqIGUsIFBzZXVkb0lkIHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkK
LXsKLSAgICBpZiAoIWUgfHwgIWUtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNr
ZXI6OkNvbGxlY3RpbmdSdWxlcyk7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLSAgICBtX3N0YXRl
LmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOwotCi0gICAg
TWF0Y2hSZXN1bHQgZHVtbXk7Ci0gICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NT
UnVsZXMpIHsKLSAgICAgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBh
Z2VudCBzaGVldC4KLSAgICAgICAgbWF0Y2hVQVJ1bGVzKGR1bW15KTsKLQotICAgICAgICAvLyBO
b3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KLSAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JB
bmRVc2VyU3R5bGVzKQotICAgICAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9J
bmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0gICAgfQotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JB
bmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAg
ICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09y
aWdpbkNTU1J1bGVzKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBz
aGVldHMuCi0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYg
RW1wdHlDU1NSdWxlcyk7Ci0KLSAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxz
ZSk7Ci0gICAgfQotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2
aW5nU3R5bGUpOwotCi0gICAgcmV0dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlu
bGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxl
RGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRv
LCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkp
Ci17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIGlmIChydWxlRGF0YS5oYXNG
YXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgewotICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0
b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNldWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3Rh
dGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxl
IHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQg
ZnJvbSB0aGUgcnVsZSBoYXNoLgotICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBv
bmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYg
KHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNo
KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlm
ICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9t
YXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMo
c3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2Vs
ZWN0b3JDaGVja2VyRmFzdFBhdGgocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgp
KTsKLSAgICAgICAgaWYgKCFzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0
QXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICByZXR1cm4gc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlcygpOwotICAgIH0KLQotICAg
IC8vIFNsb3cgcGF0aC4KLSAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3Vt
ZW50KCksIHN0YXRlLm1vZGUoKSk7Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNr
aW5nQ29udGV4dCBjb250ZXh0KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwg
U2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1l
bnRTdHlsZSA9IHN0YXRlLnN0eWxlKCk7Ci0gICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAg
IGNvbnRleHQucHNldWRvSWQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsK
LSAgICBjb250ZXh0LnNjcm9sbGJhciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9s
bGJhcjsKLSAgICBjb250ZXh0LnNjcm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVl
c3QoKS5zY3JvbGxiYXJQYXJ0OwotICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVo
YXZpb3JBdEJvdW5kYXJ5OwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxl
Y3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZl
cnNhbFN0cmF0ZWd5KCkpOwotICAgIGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVj
dG9yTWF0Y2hlcykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdGF0ZS5wc2V1ZG9T
dHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJl
cXVlc3QoKS5wc2V1ZG9JZCAhPSBkeW5hbWljUHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25T
ZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lv
bkVsZW1lbnQpCi17Ci0gICAgaWYgKCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hl
Y2tlcihkb2N1bWVudCgpLCBtX3N0YXRlLm1vZGUoKSk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxl
Y3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMp
KSB7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2Vs
ZWN0b3JDaGVja2luZ0NvbnRleHQocywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpW
aXNpdGVkTWF0Y2hEaXNhYmxlZCk7Ci0gICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1
ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3Rv
ckNoZWNraW5nQ29udGV4dCwgaWdub3JlRHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNh
bFN0cmF0ZWd5KCkpID09IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1
ZmYgb24gaG93IHRvIGFwcGx5IGEgY2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgot
Ci1MZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZh
bHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9v
dFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKLXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUg
PyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24g
fCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252
ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwg
bXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKLX0KLQotTGVuZ3RoIFN0eWxlUmVzb2x2
ZXI6OmNvbnZlcnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1
ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVs
dGlwbGllcikKLXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+
Y29udmVydFRvTGVuZ3RoPEZpeGVkRmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24g
fCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVy
Y2VudGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3Ro
KFVuZGVmaW5lZCk7Ci19Ci0KLXRlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0
aW9uUGFzcyBwYXNzPgotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1w
b3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0
eVdoaXRlbGlzdFR5cGUpCi17Ci0gICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0g
UHJvcGVydHlXaGl0ZWxpc3RSZWdpb24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsK
LSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjp3aWxsUHJvY2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0K
LSAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAg
ICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3Bl
cnRpZXMtPnByb3BlcnR5QXQoaSk7Ci0gICAgICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50
LmlzSW1wb3J0YW50KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGluaGVy
aXRlZE9ubHkgJiYgIWN1cnJlbnQuaXNJbmhlcml0ZWQoKSkgewotICAgICAgICAgICAgLy8gSWYg
dGhlIHByb3BlcnR5IHZhbHVlIGlzIGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFw
cGx5IGZ1cnRoZXIgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBhcyB0
aGV5IG1pZ2h0IG92ZXJyaWRlIHRoZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVh
c29uIHdlIGRvbid0IGFsbG93IGRlY2xhcmF0aW9ucyB3aXRoCi0gICAgICAgICAgICAvLyBleHBs
aWNpdGx5IGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIEFT
U0VSVCghY3VycmVudC52YWx1ZSgpLT5pc0luaGVyaXRlZFZhbHVlKCkpOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1
cnJlbnQuaWQoKTsKLQotICAgICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3Bl
cnR5V2hpdGVsaXN0UmVnaW9uICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQ
cm9wZXJ0eShwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSNpZiBFTkFCTEUoVklE
RU9fVFJBQ0spCi0gICAgICAgIGlmIChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlX
aGl0ZWxpc3RDdWUgJiYgIVN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHBy
b3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAo
cGFzcykgewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICBjYXNlIFZhcmlhYmxl
RGVmaW5pdGlvbnM6Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlh
YmxlIDwgZmlyc3RDU1NQcm9wZXJ0eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9w
ZXJ0eSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkK
LSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1
ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgSGlnaFByaW9y
aXR5UHJvcGVydGllczoKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVy
dHkgPT0gQ1NTUHJvcGVydHlDb2xvciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKLSAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNv
bG9yICsgMTgsIENTU196b29tX2lzX2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsKLSAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpv
b20gKyAxLCBDU1NfbGluZV9oZWlnaHRfaXNfYWZ0ZXJfem9vbSk7Ci0jaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJs
ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSNlbmRpZgotICAgICAgICAgICAgLy8gZ2l2
ZSBzcGVjaWFsIHByaW9yaXR5IHRvIGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKLSAg
ICAgICAgICAgIGlmIChwcm9wZXJ0eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAg
ICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAg
ICAgICAgICAgIC8vIHdlIGFwcGx5IGxpbmUtaGVpZ2h0IGxhdGVyCi0gICAgICAgICAgICBlbHNl
IGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAg
bV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIExvd1ByaW9yaXR5UHJvcGVydGllczoKLSAgICAgICAgICAg
IGlmIChwcm9wZXJ0eSA+IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBh
cHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tp
ZSk7Ci19Ci0KLXRlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBw
YXNzPgotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1h
dGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgs
IGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KQotewotICAgIGlmIChzdGFydEluZGV4
ID09IC0xKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwot
ICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgewot
ICAgICAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0g
ICAgICAgICAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBt
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxp
bmtNYXRjaFR5cGUgPSBtYXRjaGVkUHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOwotICAgICAgICAg
ICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRz
IGJ1dCB0aGF0IHJlcXVpcmVzIGNoYW5nZXMgaW4gbWFueSBwbGFjZXMuCi0gICAgICAgICAgICBz
dGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVj
dG9yQ2hlY2tlcjo6TWF0Y2hMaW5rKTsKLSAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVy
dHlUb1Zpc2l0ZWRMaW5rU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0
Y2hWaXNpdGVkKTsKLQotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQ
cm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwg
aXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0
VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOwotICAgICAgICB9Ci0gICAg
ICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsKLSAgICAgICAg
c3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5k
ZXg7ICsraSkgewotICAgICAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3Bl
cnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXTsKLSAgICAgICAgYXBwbHlQ
cm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNo
UmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRp
Y19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0
VHlwZSkpOwotICAgIH0KLX0KLQotdW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNo
ZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5z
aWduZWQgc2l6ZSkKLXsKLSAgICAKLSAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5
KHByb3BlcnRpZXMsIHNpemVvZihNYXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsKLX0KLQotYm9v
bCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBT
dHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKLXsKLSAgICByZXR1cm4gYS5maXJzdFVBUnVs
ZSA9PSBiLmZpcnN0VUFSdWxlCi0gICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1
bGUKLSAgICAgICAgJiYgYS5maXJzdEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKLSAg
ICAgICAgJiYgYS5sYXN0QXV0aG9yUnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCi0gICAgICAgICYm
IGEuZmlyc3RVc2VyUnVsZSA9PSBiLmZpcnN0VXNlclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VXNl
clJ1bGUgPT0gYi5sYXN0VXNlclJ1bGU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHls
ZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5n
ZXMmIGIpCi17Ci0gICAgcmV0dXJuICEoYSA9PSBiKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNv
bnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29s
dmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYikKLXsKLSAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09
IGIucHJvcGVydGllcyAmJiBhLmxpbmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOwotfQot
Ci1ib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQotewotICAgIHJl
dHVybiAhKGEgPT0gYik7Ci19Ci0KLWNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVJdGVtKiBTdHlsZVJlc29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQotewotICAg
IEFTU0VSVChoYXNoKTsKLQotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0
ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmZpbmQoaGFzaCk7Ci0gICAgaWYgKGl0ID09IG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5lbmQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTWF0
Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsKLQotICAgIHNp
emVfdCBzaXplID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlm
IChzaXplICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpCi0gICAgICAgIHJl
dHVybiAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAg
IGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hl
ZFByb3BlcnRpZXNbaV0pCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNh
Y2hlSXRlbS5yYW5nZXMgIT0gbWF0Y2hSZXN1bHQucmFuZ2VzKQotICAgICAgICByZXR1cm4gMDsK
LSAgICByZXR1cm4gJmNhY2hlSXRlbTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5k
ZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBt
YXRjaFJlc3VsdCkKLXsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0
aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dlZXBzID0gMTAwOwotICAgIGlmICgrK21fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJh
dGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3ZWVwcwotICAgICAgICAmJiAhbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlU3dlZXBUaW1lci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIHN0YXRpYyBjb25z
dCB1bnNpZ25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYw
OwotICAgICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hv
dChtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7Ci0gICAgfQotCi0g
ICAgQVNTRVJUKGhhc2gpOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRl
bTsKLSAgICBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzKTsKLSAgICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFu
Z2VzOwotICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVy
U3R5bGUgaW5zdGFuY2UuIEl0IG1heSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgotICAgIC8vIFRoZSBS
ZW5kZXJTdHlsZSBpbiB0aGUgY2FjaGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBz
dWJzdHJ1Y3R1cmVzIGFuZCBuZXZlciB1c2VkIGFzLWlzLgotICAgIGNhY2hlSXRlbS5yZW5kZXJT
dHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShzdHlsZSk7Ci0gICAgY2FjaGVJdGVtLnBhcmVudFJl
bmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKLSAgICBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUuYWRkKGhhc2gsIGNhY2hlSXRlbSk7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6aW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQotewotICAgIG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZS5jbGVhcigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0NhY2hlYWJs
ZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBS
ZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAg
ICAvLyBGSVhNRTogQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3
aGVuIGFwcGx5aW5nIHRvIGRvY3VtZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5
aW5nIGJ5IGNhY2hpbmcuCi0gICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkgJiYgZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRP
bkRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxl
LT51bmlxdWUoKSB8fCAoc3R5bGUtPnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0
eWxlLT51bmlxdWUoKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPmhh
c0FwcGVhcmFuY2UoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+em9v
bSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3Jp
dGluZ01vZGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIFRoZSBjYWNoZSBhc3N1
bWVzIHN0YXRpYyBrbm93bGVkZ2UgYWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVk
LgotICAgIGlmIChwYXJlbnRTdHlsZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1h
dGNoUmVzdWx0LCBjb25zdCBFbGVtZW50KiBlbGVtZW50KQotewotICAgIEFTU0VSVChlbGVtZW50
KTsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9
IG1hdGNoUmVzdWx0LmlzQ2FjaGVhYmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaCht
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSkgOiAwOwotICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFs
c2U7Ci0gICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7
Ci0gICAgaWYgKGNhY2hlSGFzaCAmJiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVy
dGllc0NhY2hlKGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpKSkgewotICAgICAgICAvLyBXZSBjYW4g
YnVpbGQgdXAgdGhlIHN0eWxlIGJ5IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZy
b20gYW4gZWFybGllciBzdHlsZSBvYmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKLSAg
ICAgICAgLy8gc3R5bGUgZGVjbGFyYXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0
aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBl
bmQgb24gdGhlIAotICAgICAgICAvLyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQg
c2F2ZXMgbWVtb3J5IGJ5IHJldXNpbmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KLSAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+Y29weU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJT
dHlsZS5nZXQoKSk7Ci0gICAgICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWRE
YXRhU2hhcmVkKGNhY2hlSXRlbS0+cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hh
ZG93Qm91bmRhcnkoZWxlbWVudCkpIHsKLSAgICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0
dXMgPSBzdGF0ZS5zdHlsZSgpLT5pbnNpZGVMaW5rKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUg
Y2FjaGUgaXRlbSBwYXJlbnQgc3R5bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGll
cyB0byB0aGUgY3VycmVudCBwYXJlbnQgc3R5bGUgdGhlbiB0aGUKLSAgICAgICAgICAgIC8vIHJl
c3VsdGluZyBzdHlsZSB3aWxsIGJlIGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRl
ZCBwcm9wZXJ0aWVzIG92ZXIgZnJvbSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQo
KSk7Ci0KLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRy
ZWF0ZWQgbGlrZSBhbiBpbmhlcml0ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSBy
ZXN0b3JlIGl0LgotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5r
U3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBhcHBseUlu
aGVyaXRlZE9ubHkgPSB0cnVlOyAKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykK
LSAgICAvLyBGaXJzdCBhcHBseSBhbGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5
IGJlIHVzZWQgZHVyaW5nIGFwcGxpY2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMuCi0gICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFs
c2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5o
ZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRp
b25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkp
OwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hS
ZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1
bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0jZW5kaWYKLQotICAgIC8vIE5vdyB3ZSBoYXZlIGFs
bCBvZiB0aGUgbWF0Y2hlZCBydWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhl
IHJ1bGVzIGFuZCBhcHBseQotICAgIC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwg
aS5lLiwgdGhvc2UgcHJvcGVydGllcyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgot
ICAgIC8vIFRoZSBvcmRlciBpcyAoMSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikg
aGlnaC1wcmlvcml0eSBpbXBvcnRhbnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFudAotICAgIC8v
IGFuZCAoNCkgbm9ybWFsIGltcG9ydGFudC4KLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
MCk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPiht
YXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxI
aWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBh
cHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9y
aXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRl
ZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGll
cz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0KLSAgICBp
ZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAh
PSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0Rm9u
dERpcnR5KHRydWUpOwotICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICB9
Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBp
dCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdo
ZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgotICAgIGlmIChzdGF0
ZS5saW5lSGVpZ2h0VmFsdWUoKSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxp
bmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAgIC8vIE1hbnkgcHJvcGVy
dGllcyBkZXBlbmQgb24gdGhlIGZvbnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwg
cHJvcGVydGllcy4KLSAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUt
PmZvbnREZXNjcmlwdGlvbigpICE9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQot
ICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLQotICAgIC8vIE5vdyBkbyB0aGUg
bm9ybWFsIHByaW9yaXR5IFVBIHByb3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
czxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQu
cmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJ
bmhlcml0ZWRPbmx5KTsKLSAgICAKLSAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3Jv
dW5kIHNvIHRoYXQgd2UgY2FuIGV4YW1pbmUgdGhlbSBsYXRlci4KLSAgICBzdGF0ZS5jYWNoZUJv
cmRlckFuZEJhY2tncm91bmQoKTsKLSAgICAKLSAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQg
dXNlciBub3JtYWwgcHJpb3JpdHkgcHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHBy
b3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRp
ZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAx
LCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRl
ZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJl
c3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0
LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFS
dWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNv
dXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2Vz
KCk7Ci0gICAgCi0gICAgQVNTRVJUKCFzdGF0ZS5mb250RGlydHkoKSk7Ci0gICAgCi0gICAgaWYg
KGNhY2hlSXRlbSB8fCAhY2FjaGVIYXNoKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFpc0Nh
Y2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0
eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCkpKQotICAgICAgICByZXR1cm47Ci0gICAgYWRkVG9N
YXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCks
IGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFy
ZVBhZ2VSdWxlcyhjb25zdCBTdHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSog
cjIpCi17Ci0gICAgcmV0dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNl
bGVjdG9yKCktPnNwZWNpZmljaXR5KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQ
YWdlUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBp
ZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+
IG1hdGNoZWRQYWdlUnVsZXM7Ci0gICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdl
UnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VO
YW1lKTsKLSAgICBpZiAobWF0Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIHN0ZDo6c3RhYmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRj
aGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJlUGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRN
YXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMo
KSk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBD
U1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwg
Y29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBj
b21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRh
Z0hpc3RvcnkoKSkgewotICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVj
dG9yOjpUYWcpIHsKLSAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0g
Y29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2Fs
TmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVk
b1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVudC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAo
KHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdl
KQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0
UGFnZSAmJiBpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAhaXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2Uq
PiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5n
JiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgp
OyArK2kpIHsKLSAgICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAg
ICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlz
TGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhl
biBpZ25vcmUgaXQuCi0gICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMg
PSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0
aWVzLT5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQg
dGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRS
dWxlcy5hcHBlbmQocnVsZSk7Ci0gICAgfQotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVm
dFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKLXsKLSAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9
IGZhbHNlOwotICAgIGlmICghbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmln
aHREaXJlY3Rpb24oKSkKLSAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAgIHJl
dHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0g
ICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBp
bmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBhZ2VJ
bmRleCk7Ci19Ci0KLVN0cmluZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUlu
ZGV4ICovKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBw
YWdlIG5hbWUgbWFwcGluZy4KLSAgICByZXR1cm4gIiI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6YXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVl
LCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgaW5pdEVsZW1lbnQoMCk7Ci0gICAgbV9zdGF0
ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIDAsIHN0eWxlKTsKLSAgICBtX3N0YXRl
LnNldFN0eWxlKHN0eWxlKTsKLSAgICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZh
bHVlKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5
bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZSkK
LSAgICAgICAgYXBwbHlQcm9wZXJ0eShpZCwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBpc1Zh
bGlkVmlzaXRlZExpbmtQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAo
aWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uUnVsZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFz
aXNDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yOgotICAgIC8vIEFsc28gYWxsb3cg
c2hvcnRoYW5kcyBzbyB0aGF0IGluaGVyaXQvaW5pdGlhbCBzdGlsbCB3b3JrLgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eU91dGxpbmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGU6Ci0j
aWYgRU5BQkxFKFNWRykKLSAgICBjYXNlIENTU1Byb3BlcnR5RmlsbDoKLSAgICBjYXNlIENTU1By
b3BlcnR5U3Ryb2tlOgotI2VuZGlmCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gaHR0
cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxlLXJ1
bGUKLS8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9uIHN0
eWxpbmcgcHJvcGVydGllcy4KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdp
b25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVh
azsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJB
Q0spCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShD
U1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9z
aXRpb25YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kUmVwZWF0WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9u
dEZhbWlseToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxp
bmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5T3V0bGluZU9mZnNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2li
aWxpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHREZWNvcmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNl
bmRpZgotLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFyZWQg
dG8gQ1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKLS8vIG9mIGVhY2gg
aW5kaXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENTU1By
aW1pdGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigpCi0vLyBtdWx0aXBsaWVzIGVhY2ggcmVzb2x2
ZWQgbGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVlZCB0
byBkaXNhYmxlIHRoYXQuCi0vLyBUaG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBw
bGllZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIvcGFk
ZGluZy4uLikKLS8vIG5lZWQgdG8gcmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0aGUg
cGFyZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCi0vLyB3aWR0
aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZvciBT
VkcgdGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNjYWxlLAotLy8gaWYgd2UnZCBwYXNzIGEgMS4w
IHpvb20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9yIG9m
IDEuMCBmb3Igc3BlY2lmaWMKLS8vIHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQgdG8g
c2NhbGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2luZy9m
b250LXNpemUpLgotYm9vbCBTdHlsZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQotewotICAg
IHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVt
ZW50KCk7Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3Rh
dGUsIExlbmd0aCYgd29ya2luZ0xlbmd0aCkKLXsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5Db250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdM
ZW5ndGggPSBMZW5ndGgoTWluQ29udGVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LQotICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1h
eENvbnRlbnQpIHsKLSAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50KTsK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgd29ya2luZ0xlbmd0aCA9IHByaW1p
dGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNl
bnRDb252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252ZXJz
aW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKSk7Ci0gICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmluZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xl
bmd0aCgpKQotICAgICAgICB3b3JraW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVlLT5p
c1F1aXJrVmFsdWUoKSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3Jl
YXRlR3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29u
c3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1NpemUp
Ci17Ci0gICAgUGFpciogbWluTWF4VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdldFBh
aXJWYWx1ZSgpOwotICAgIGlmICghbWluTWF4VHJhY2tCcmVhZHRoKSB7Ci0gICAgICAgIExlbmd0
aCB3b3JraW5nTGVuZ3RoOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgocHJp
bWl0aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgICAgICB0cmFja1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRoOwot
ICAgIExlbmd0aCBtYXhUcmFja0JyZWFkdGg7Ci0gICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVh
ZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0aCkg
fHwgIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQoKSwg
c3RhdGUsIG1heFRyYWNrQnJlYWR0aCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRy
YWNrU2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwotICAg
IHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChDU1NW
YWx1ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9yPEdy
aWRUcmFja1NpemU+JiB0cmFja1NpemVzKQotewotICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0
b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFs
dWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzUHJp
bWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBHcmlk
VHJhY2tTaXplIHRyYWNrU2l6ZTsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5NYXgo
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJhY2tT
aXplKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cmFja1NpemVzLmFw
cGVuZCh0cmFja1NpemUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJv
b2wgY3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJhY2tT
aXplPiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQotewot
ICAgIC8vIEhhbmRsZSAnbm9uZScuCi0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkp
IHsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNy
ZWF0ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Ci19Ci0KLQotc3Rh
dGljIGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0aW9u
JiBwb3NpdGlvbikKLXsKLSAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVnZXI+
IHwgJ2F1dG8nCi0gICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVlLT5p
c051bWJlcigpKTsKLSAgICBwb3NpdGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZlVmFs
dWUtPmdldEludFZhbHVlKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCi1zdGF0aWMgYm9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1ZSog
dmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFzVmFy
aWFibGVSZWZlcmVuY2UoKTsKLSAgICB9Ci0KLSAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRpb25W
YWx1ZSgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFsdWUp
LT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOwotCi0gICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RWYWx1
ZSgpKSB7Ci0gICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
ZGlyZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKTsKLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7Ci0gICAgICAgIENTU1Zh
bHVlKiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNrKCk7Ci0gICAgICAgIHJldHVybiAoZGlyZWN0
aW9uICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYgaGFz
VmFyaWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZlcmVu
Y2UobWFzaykpOwotICAgIH0KLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZh
bHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgaWYgKGhhc1ZhcmlhYmxl
UmVmZXJlbmNlKGkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZhcmlh
YmxlcyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBhaXI8
Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKQotewotICAgIHN0ZDo6
cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJpYWxp
emVSZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsKLQot
ICAgIGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQotICAgICAgICBy
ZXR1cm47IC8vIGN5Y2xlIGRldGVjdGVkLgotCi0gICAga25vd25FeHByZXNzaW9ucy5hcHBlbmQo
ZXhwcmVzc2lvbik7Ci0KLSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0byBy
ZS1wYXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0aW9u
IGxpdmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdlIGRvIGl0IHRoZXJlLgotICAgIFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKTsK
LSAgICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBleHBy
ZXNzaW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50KCkpKQotICAgICAgICByZXR1cm47IC8vIGV4
cHJlc3Npb24gZmFpbGVkIHRvIHBhcnNlLgotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJlc3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBpKyspIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0
eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5QXQo
aSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYg
aGFzVmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXNv
bHZlVmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhwcmVz
c2lvbnMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3BlcnR5
LmlkKCksIHByb3BlcnR5LnZhbHVlKCkpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVl
KQotewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGlmIChpZCAhPSBDU1NQcm9wZXJ0
eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHZhbHVlKSkgewotICAgICAgICBWZWN0
b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25zOwot
ICAgICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7Ci0gICAgYm9vbCBpc0luaGVyaXQgPSBzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlz
SW5oZXJpdGVkVmFsdWUoKTsKLSAgICBib29sIGlzSW5pdGlhbCA9IHZhbHVlLT5pc0luaXRpYWxW
YWx1ZSgpIHx8ICghc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVl
KCkpOwotCi0gICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgIWlzSW5pdGlhbCk7IC8vIGlzSW5oZXJp
dCAtPiAhaXNJbml0aWFsICYmIGlzSW5pdGlhbCAtPiAhaXNJbmhlcml0Ci0gICAgQVNTRVJUKCFp
c0luaGVyaXQgfHwgKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKSk7
IC8vIGlzSW5oZXJpdCAtPiAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxl
KCkpCi0KLSAgICBpZiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpICYmICgh
c3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIHx8ICFpc1ZhbGlkVmlzaXRl
ZExpbmtQcm9wZXJ0eShpZCkpKSB7Ci0gICAgICAgIC8vIExpbWl0IHRoZSBwcm9wZXJ0aWVzIHRo
YXQgY2FuIGJlIGFwcGxpZWQgdG8gb25seSB0aGUgb25lcyBob25vcmVkIGJ5IDp2aXNpdGVkLgot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGlzSW5oZXJpdCAmJiAhc3RhdGUucGFy
ZW50U3R5bGUoKS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSAmJiAhQ1NTUHJv
cGVydHk6OmlzSW5oZXJpdGVkUHJvcGVydHkoaWQpKQotICAgICAgICBzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5zZXRIYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpOwotCi0jaWYgRU5BQkxF
KENTU19WQVJJQUJMRVMpCi0gICAgaWYgKGlkID09IENTU1Byb3BlcnR5VmFyaWFibGUpIHsKLSAg
ICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04odmFsdWUtPmlzVmFyaWFibGVW
YWx1ZSgpKTsKLSAgICAgICAgQ1NTVmFyaWFibGVWYWx1ZSogdmFyaWFibGUgPSBzdGF0aWNfY2Fz
dDxDU1NWYXJpYWJsZVZhbHVlKj4odmFsdWUpOwotICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT5u
YW1lKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+dmFsdWUoKS5pc0Vt
cHR5KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRWYXJpYWJsZSh2YXJpYWJsZS0+bmFt
ZSgpLCB2YXJpYWJsZS0+dmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYK
LQotICAgIC8vIENoZWNrIGxvb2t1cCB0YWJsZSBmb3IgaW1wbGVtZW50YXRpb25zIGFuZCB1c2Ug
d2hlbiBhdmFpbGFibGUuCi0gICAgY29uc3QgUHJvcGVydHlIYW5kbGVyJiBoYW5kbGVyID0gbV9z
dHlsZUJ1aWxkZXIucHJvcGVydHlIYW5kbGVyKGlkKTsKLSAgICBpZiAoaGFuZGxlci5pc1ZhbGlk
KCkpIHsKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkKLSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJ
bmhlcml0VmFsdWUoaWQsIHRoaXMpOwotICAgICAgICBlbHNlIGlmIChpc0luaXRpYWwpCi0gICAg
ICAgICAgICBoYW5kbGVyLmFwcGx5SW5pdGlhbFZhbHVlKGlkLCB0aGlzKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgaGFuZGxlci5hcHBseVZhbHVlKGlkLCB0aGlzLCB2YWx1ZSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFs
dWUgPSB2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih2YWx1ZSkgOiAwOwotCi0gICAgZmxvYXQgem9vbUZhY3RvciA9IHN0YXRlLnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGxpc3QgdGhh
dCBtYXBzIHRoZSBDU1MgcHJvcGVydGllcyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZnJvbnQt
ZW5kCi0gICAgLy8gUmVuZGVyU3R5bGUgdmFsdWVzLiBTaG9ydGhhbmRzIChlLmcuIGJvcmRlciwg
YmFja2dyb3VuZCkgb2NjdXIgaW4gdGhpcyBsaXN0IGFzIHdlbGwgYW5kCi0gICAgLy8gYXJlIG9u
bHkgaGl0IHdoZW4gbWFwcGluZyAiaW5oZXJpdCIgb3IgImluaXRpYWwiIGludG8gZnJvbnQtZW5k
IHZhbHVlcy4KLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgLy8gbGlzdHMKLSAgICBjYXNlIENTU1By
b3BlcnR5Q29udGVudDoKLSAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwg
YXR0ciwgaQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2ls
bCBiZSBwb3NzaWJsZSB0byBpbmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlz
Ci0gICAgICAgICAgICAvLyBub3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhl
cml0IiBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIGlmIChpc0luaXRpYWwp
IHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghdmFs
dWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAg
ICBib29sIGRpZFNldCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAg
ICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVt
LT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRl
bS0+aXNHcmFkaWVudFZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxD
U1NHcmFkaWVudFZhbHVlKj4oaXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMp
LmdldCgpKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdl
OjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlk
U2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNpZiBFTkFCTEUoQ1NT
X0lNQUdFX1NFVCkKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRW
YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
c2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NT
SW1hZ2VTZXRWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlk
U2V0ID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAg
IGlmIChpdGVtLT5pc0ltYWdlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRDb250ZW50KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNv
bnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQ
cmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAg
ICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRW
YWx1ZS0+aXNTdHJpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRDb250ZW50KGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7
Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChjb250ZW50VmFsdWUtPmlzQXR0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBDYW4gYSBuYW1lc3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BT
RVVETykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgp
OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5wYXJlbnRTdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUXVhbGlm
aWVkTmFtZSBhdHRyKG51bGxBdG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1w
bCgpLCBudWxsQXRvbSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYg
dmFsdWUgPSBzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5
QXRvbSA6IHZhbHVlLmltcGwoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0
ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0
aGUgYXR0cmlidXRlIHZhbHVlIGFmZmVjdHMgdGhlIHN0eWxlCi0gICAgICAgICAgICAgICAgICAg
IG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCku
aW1wbCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3Vu
dGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29u
dGVudFZhbHVlLT5nZXRDb3VudGVyVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRUxpc3RT
dHlsZVR5cGUgbGlzdFN0eWxlVHlwZSA9IE5vbmVMaXN0U3R5bGU7Ci0gICAgICAgICAgICAgICAg
ICAgIGludCBsaXN0U3R5bGVJZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkK
LSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlz
dFN0eWxlVHlwZT4obGlzdFN0eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOwotICAgICAgICAgICAg
ICAgICAgICBPd25QdHI8Q291bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291
bnRlckNvbnRlbnQoY291bnRlclZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNv
dW50ZXJWYWx1ZS0+c2VwYXJhdG9yKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChjb3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKLSAgICAgICAgICAg
ICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlT3BlblF1b3RlOgotICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0Vf
UVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
Q1NTVmFsdWVOb09wZW5RdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldENvbnRlbnQoTk9fT1BFTl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRp
ZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVm
ZmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsgfQotICAgICAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaWRT
ZXQpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgot
ICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRR
dW90ZXMoc3RhdGUucGFyZW50U3R5bGUoKS0+cXVvdGVzKCkpOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFF1b3RlcygwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQot
ICAgICAgICBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVl
TGlzdCogbGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKLSAgICAgICAg
ICAgIFJlZlB0cjxRdW90ZXNEYXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKLSAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikg
ewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soaSk7Ci0gICAgICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBv
dXQgb2YgYm91bmRzIHNvIHRoaXMgaXMgc2FmZS4KLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSog
c2Vjb25kID0gbGlzdC0+aXRlbShpICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQp
Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEFTU0VSVF9X
SVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOwotICAg
ICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQ
cmltaXRpdmVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOwot
ICAgICAgICAgICAgICAgIFN0cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBxdW90
ZXMtPmFkZFBhaXIoc3RkOjptYWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZSkgewotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlTm9uZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVz
RGF0YTo6Y3JlYXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udEZhbWlseTogewotICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlk
cwotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24g
cGFyZW50Rm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0
aW9uKCk7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3Rh
dGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgp
KTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2Ny
aXB0aW9uLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElz
U3BlY2lmaWVkRm9udChwYXJlbnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOwot
ICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAg
ICAgICAgICBGb250RGVzY3JpcHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsK
LSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHls
ZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0
IHRoZSBzaXplIHRvIGFjY291bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBt
b25vc3BhY2UKLSAgICAgICAgICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCi0gICAgICAgICAgICBp
ZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZp
eGVkRGVmYXVsdFNpemUoKSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3Jp
cHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBm
b250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7Ci0gICAgICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5
KCkpOwotICAgICAgICAgICAgaWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlz
RW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRp
YWxEZXNjLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCk7Ci0gICAgICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2Ny
aXB0aW9uLmZpcnN0RmFtaWx5KCk7Ci0gICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAw
OwotCi0gICAgICAgIC8vIEJlZm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3Bl
cnR5LCB3ZSBzaG91bGQgcmVzZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgotICAgICAgICBib29sIG9s
ZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVm
YXVsdFNpemUoKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAg
Q1NTVmFsdWUqIGl0ZW0gPSBpLnZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJp
bWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KGl0ZW0pOwotICAgICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7Ci0gICAgICAgICAg
ICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBp
ZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKQotICAgICAgICAgICAgICAgIGZhY2UgPSBjb250
ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5n
cykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7
Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6Ci0gICAgICAgICAgICAg
ICAgICAgIGZhY2UgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKLSAg
ICAgICAgICAgICAgICAgICAgZmFjZSA9IHNlcmlmRmFtaWx5OwotICAgICAgICAgICAgICAgICAg
ICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlm
RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVNhbnNTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJp
ZkZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkoRm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1pbHkpOwotICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKLSAgICAg
ICAgICAgICAgICAgICAgZmFjZSA9IGN1cnNpdmVGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2
ZUZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNh
c2UgQ1NTVmFsdWVGYW50YXN5OgotICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZh
bWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoRm9udERlc2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKLSAgICAgICAg
ICAgICAgICAgICAgZmFjZSA9IG1vbm9zcGFjZUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3Bh
Y2VGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlV2Via2l0UGljdG9ncmFwaDoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9
IHBpY3RvZ3JhcGhGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgaWYgKCFmYWNlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlm
ICghY3VyckZhbWlseSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBm
aXJzdCBmYW1pbHkuCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShm
YWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAv
LyBSZW1vdmUgYW55IGluaGVyaXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KLSAgICAgICAgICAg
ICAgICAgICAgY3VyckZhbWlseSA9ICZmaXJzdEZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJp
Y0ZhbWlseSgpID09IEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOwotICAgICAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBu
ZXdGYW1pbHkgPSBTaGFyZWRGb250RmFtaWx5OjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAg
ICAgbmV3RmFtaWx5LT5zZXRGYW1pbHkoZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJG
YW1pbHktPmFwcGVuZEZhbWlseShuZXdGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBjdXJy
RmFtaWx5ID0gbmV3RmFtaWx5LmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0
U2l6ZSgpIHVudGlsIGFsbCBuZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKLSAgICAg
ICAgLy8gSWYgY3VyckZhbWlseSBpcyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUg
ZmFtaWx5IG9uIHRoaXMgZGVzY3JpcHRpb24uCi0gICAgICAgIGlmIChjdXJyRmFtaWx5KSB7Ci0g
ICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2Ny
aXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0
U2l6ZSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRT
aXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRp
b24ua2V5d29yZFNpemUoKSAtIDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOwot
Ci0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAg
ICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotLy8gc2hvcnRoYW5kIHByb3BlcnRpZXMKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICAgICAgaWYgKGlzSW5pdGlhbCkgewot
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJCYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IoKSk7Ci0gICAg
ICAgIH0gZWxzZSBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5p
bmhlcml0QmFja2dyb3VuZExheWVycygqc3RhdGUucGFyZW50U3R5bGUoKS0+YmFja2dyb3VuZExh
eWVycygpKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJhY2tncm91bmRDb2xvcihz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrOgotICAgICAgICBpZiAo
aXNJbml0aWFsKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJNYXNrTGF5ZXJzKCk7
Ci0gICAgICAgIGVsc2UgaWYgKGlzSW5oZXJpdCkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PmluaGVyaXRNYXNrTGF5ZXJzKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5tYXNrTGF5ZXJzKCkpOwot
ICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6Ci0gICAgICAgIGlmIChp
c0luaGVyaXQpIHsKLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24g
PSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoc3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lmaWVk
TGluZUhlaWdodCgpKTsKLSAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsK
LSAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAg
ICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdz
ID0gZG9jdW1lbnRTZXR0aW5ncygpOwotICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8g
SWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3
YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwotICAgICAgICAgICAgaWYg
KCFzZXR0aW5ncykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpbml0aWFs
aXplRm9udFN0eWxlKHNldHRpbmdzKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1
ZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHls
ZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoMCk7Ci0KLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247
Ci0gICAgICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQocHJp
bWl0aXZlVmFsdWUtPmdldElkZW50KCksIGZvbnREZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgICAg
IC8vIERvdWJsZS1jaGVjayBhbmQgc2VlIGlmIHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElmIG5v
dCwgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBmb250LgotICAgICAgICAgICAgaWYgKGZvbnRE
ZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFrZSBz
dXJlIHRoZSByZW5kZXJpbmcgbW9kZSBhbmQgcHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1cGRh
dGVkLgotICAgICAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGlu
Z3MoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2lu
ZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBm
cmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5n
cykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsK
LSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1l
bnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFi
bGVkKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4KLSAg
ICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVk
U2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnREZXNj
cmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgp
LCB1c2VTVkdab29tUnVsZXMoKSkpOwotICAgICAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlv
bihmb250RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHZh
bHVlLT5pc0ZvbnRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBzdGF0
aWNfY2FzdDxGb250VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIWZvbnQtPnN0eWxl
IHx8ICFmb250LT52YXJpYW50IHx8ICFmb250LT53ZWlnaHQKLSAgICAgICAgICAgICAgICB8fCAh
Zm9udC0+c2l6ZSB8fCAhZm9udC0+bGluZUhlaWdodCB8fCAhZm9udC0+ZmFtaWx5KQotICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlG
b250U3R5bGUsIGZvbnQtPnN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHko
Q1NTUHJvcGVydHlGb250VmFyaWFudCwgZm9udC0+dmFyaWFudC5nZXQoKSk7Ci0gICAgICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0LmdldCgp
KTsKLSAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIg
Zm9udCBidXQgdGhleSBkb24ndCB0cnkgdG8gcmVhZCB0aGUgZm9udCdzCi0gICAgICAgICAgICAv
LyBwcm9wZXJ0aWVzIGJhY2ssIHdoaWNoIGlzIHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXplIGlz
IHVzaW5nIHRoZSAnZXgnIHVuaXQsIGl0IHdpbGwKLSAgICAgICAgICAgIC8vIG5lZWQgcXVlcnkg
dGhlIGRpcnRpZWQgZm9udCdzIHgtaGVpZ2h0IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8g
YmUgc2FmZSBpbiB0aGlzCi0gICAgICAgICAgICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0
aGUgZm9udCBub3cuCi0gICAgICAgICAgICB1cGRhdGVGb250KCk7Ci0gICAgICAgICAgICBhcHBs
eVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNpemUsIGZvbnQtPnNpemUuZ2V0KCkpOwotCi0gICAg
ICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQoKSk7
Ci0KLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmb250
LT5mYW1pbHkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIENT
UzMgUHJvcGVydGllcwotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3hTaGFkb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRv
dzogewotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQ1NT
UHJvcGVydHlUZXh0U2hhZG93KQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgp
LT5zZXRUZXh0U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSA/IGFkb3B0
UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkpKSA6
IG51bGxwdHIpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRv
dyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dE
YXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSkpIDogbnVsbHB0cik7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKGlzSW5pdGlhbCB8fCBwcmltaXRpdmVWYWx1ZSkgLy8gaW5pdGlh
bCB8IG5vbmUKLSAgICAgICAgICAgIHJldHVybiBpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cg
PyBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KG51bGxwdHIpIDogc3RhdGUuc3R5bGUoKS0+
c2V0Qm94U2hhZG93KG51bGxwdHIpOwotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0
KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAg
Q1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghY3VyclZh
bHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
ICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4oY3VyclZh
bHVlKTsKLSAgICAgICAgICAgIGludCB4ID0gaXRlbS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAg
ICAgICAgICBpbnQgeSA9IGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgp
LCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgaW50
IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAg
ICAgICAgICAgaW50IHNwcmVhZCA9IGl0ZW0tPnNwcmVhZCA/IGl0ZW0tPnNwcmVhZC0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9v
bUZhY3RvcikgOiAwOwotICAgICAgICAgICAgU2hhZG93U3R5bGUgc2hhZG93U3R5bGUgPSBpdGVt
LT5zdHlsZSAmJiBpdGVtLT5zdHlsZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluc2V0ID8gSW5z
ZXQgOiBOb3JtYWw7Ci0gICAgICAgICAgICBDb2xvciBjb2xvcjsKLSAgICAgICAgICAgIGlmIChp
dGVtLT5jb2xvcikKLSAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZh
bHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLnN0eWxl
KCkpCi0gICAgICAgICAgICAgICAgY29sb3IgPSBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotCi0g
ICAgICAgICAgICBPd25QdHI8U2hhZG93RGF0YT4gc2hhZG93RGF0YSA9IGFkb3B0UHRyKG5ldyBT
aGFkb3dEYXRhKEludFBvaW50KHgsIHkpLCBibHVyLCBzcHJlYWQsIHNoYWRvd1N0eWxlLCBpZCA9
PSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBD
b2xvcjo6dHJhbnNwYXJlbnQpKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRl
eHRTaGFkb3cpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhz
aGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRo
aXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5p
bmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRy
eQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveFJlZmxlY3Q6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwo
Ym94UmVmbGVjdCwgQm94UmVmbGVjdCkKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7Ci0g
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KFJlbmRlclN0eWxlOjppbml0
aWFsQm94UmVmbGVjdCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAg
ICAgIGlmICghdmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NS
ZWZsZWN0VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxTdHlsZVJlZmxlY3Rpb24+IHJl
ZmxlY3Rpb24gPSBTdHlsZVJlZmxlY3Rpb246OmNyZWF0ZSgpOwotICAgICAgICByZWZsZWN0aW9u
LT5zZXREaXJlY3Rpb24oKnJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCkpOwotICAgICAgICBpZiAo
cmVmbGVjdFZhbHVlLT5vZmZzZXQoKSkKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE9mZnNl
dChyZWZsZWN0VmFsdWUtPm9mZnNldCgpLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29u
dmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24+KHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikpOwotICAgICAg
ICBOaW5lUGllY2VJbWFnZSBtYXNrOwotICAgICAgICBtYXNrLnNldE1hc2tEZWZhdWx0cygpOwot
ICAgICAgICBtX3N0eWxlTWFwLm1hcE5pbmVQaWVjZUltYWdlKGlkLCByZWZsZWN0VmFsdWUtPm1h
c2soKSwgbWFzayk7Ci0gICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2sobWFzayk7Ci0KLSAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChyZWZsZWN0aW9uLnJlbGVhc2UoKSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNyYzogLy8gT25seSB1
c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCi0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1By
b3BlcnR5VW5pY29kZVJhbmdlOiAvLyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KLSAg
ICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgotICAg
ICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb2x1
bW5SdWxlQ29sb3Ioc3RhdGUucGFyZW50U3R5bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkuaXNWYWxp
ZCgpID8gc3RhdGUucGFyZW50U3R5bGUoKS0+Y29sdW1uUnVsZUNvbG9yKCkgOiBzdGF0ZS5wYXJl
bnRTdHlsZSgpLT5jb2xvcigpKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbHVt
blJ1bGVTdHlsZShzdGF0ZS5wYXJlbnRTdHlsZSgpLT5jb2x1bW5SdWxlU3R5bGUoKSk7Ci0gICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb2x1bW5SdWxlV2lkdGgoc3RhdGUucGFyZW50U3R5
bGUoKS0+Y29sdW1uUnVsZVdpZHRoKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkK
LSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnJlc2V0Q29sdW1uUnVsZSgpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWU6Ci0gICAgICAgIGlmICgh
aXNJbmhlcml0KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlRGlyZWN0aW9uKHN0YXRlLnBhcmVudFN0eWxlKCktPm1hcnF1ZWVEaXJlY3Rpb24o
KSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoc3RhdGUucGFy
ZW50U3R5bGUoKS0+bWFycXVlZUluY3JlbWVudCgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZVNwZWVkKHN0YXRlLnBhcmVudFN0eWxlKCktPm1hcnF1ZWVTcGVlZCgpKTsKLSAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudChzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5tYXJxdWVlTG9vcENvdW50KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlQmVoYXZpb3Ioc3RhdGUucGFyZW50U3R5bGUoKS0+bWFycXVlZUJlaGF2aW9yKCkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0aW9u
OiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291bnQs
IE1hcnF1ZWVMb29wQ291bnQpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZUluZmluaXRlKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxv
b3BDb3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVhdCBmb3JldmVyLgotICAgICAgICBlbHNlIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3Bl
ZWQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVkLCBN
YXJxdWVlU3BlZWQpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIGlmIChpbnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQo
KSkgewotICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgewotICAgICAgICAgICAgY2FzZSBDU1NW
YWx1ZVNsb3c6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVk
KDUwMCk7IC8vIDUwMCBtc2VjLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRN
YXJxdWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6Ci0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBTdXBl
ciBmYXN0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9
IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1RpbWUoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50LCBD
U1NQcmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRzPigpKTsKLSAgICAgICAgZWxzZSBpZiAocHJp
bWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4KLSAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+
Z2V0SW50VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5E
X0lOSVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFycXVlZUluY3JlbWVudCkKLSAgICAgICAgaWYg
KCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Ci0gICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMSwg
Rml4ZWQpKTsgLy8gMXB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlSW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZhdWx0
LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxhcmdl
OgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVu
Z3RoKDM2LCBGaXhlZCkpOyAvLyAzNnB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVMZW5n
dGggPSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5ndGgu
aXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVl
SW5jcmVtZW50KG1hcnF1ZWVMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvY2FsZTogewotICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExvY2FsZSk7Ci0gICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRMb2NhbGUobnVsbEF0b20pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwotICAg
ICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9u
dERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxl
VG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkpOwot
ICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNpemVBZGp1c3Q6IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFNpemVBZGp1c3QsIFRleHRT
aXplQWRqdXN0KQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc2V0VGV4dFNpemVB
ZGp1c3QocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoKLSAgICB7Ci0gICAgICAgIEhBTkRM
RV9JTkhFUklUX0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lvbnMp
Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewot
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJTdHls
ZTo6bm9uZURhc2hib2FyZFJlZ2lvbnMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVlLT5n
ZXREYXNoYm9hcmRSZWdpb25WYWx1ZSgpOwotICAgICAgICBpZiAoIXJlZ2lvbikKLSAgICAgICAg
ICAgIHJldHVybjsKLQotICAgICAgICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9uOwot
ICAgICAgICB3aGlsZSAocmVnaW9uKSB7Ci0gICAgICAgICAgICBMZW5ndGggdG9wID0gY29udmVy
dFRvSW50TGVuZ3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRMZW5n
dGgocmVnaW9uLT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxl
KCkpOwotICAgICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdp
b24tPmJvdHRvbSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwot
ICAgICAgICAgICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5sZWZ0
KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICAgICAg
ICAgIGlmICh0b3AuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICB0b3AgPSBMZW5ndGgo
KTsKLSAgICAgICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAg
IHJpZ2h0ID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVkKCkp
Ci0gICAgICAgICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVm
dC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKLQotICAg
ICAgICAgICAgaWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNsZSwg
cmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJz
dCA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNSZWN0
YW5nbGUpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9u
KFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCBy
aWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwotICAg
ICAgICAgICAgcmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0KCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotCi0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSNpZiBFTkFCTEUoRFJBR0dBQkxFX1JFR0lP
TikKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVnaW9uOiB7Ci0gICAgICAgIGlmICgh
cHJpbWl0aXZlVmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25Nb2Rl
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJsZVJl
Z2lvbkRyYWcgOiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOwotICAgICAgICBzdGF0ZS5kb2N1bWVu
dCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDogewot
ICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRleHRT
dHJva2VXaWR0aCkKLSAgICAgICAgZmxvYXQgd2lkdGggPSAwOwotICAgICAgICBzd2l0Y2ggKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGluOgot
ICAgICAgICBjYXNlIENTU1ZhbHVlTWVkaXVtOgotICAgICAgICBjYXNlIENTU1ZhbHVlVGhpY2s6
IHsKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAgLyA0ODsKLSAgICAgICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKLSAgICAgICAg
ICAgICAgICByZXN1bHQgKj0gMzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlVGhpY2spCi0gICAgICAgICAgICAgICAgcmVzdWx0ICo9
IDU7Ci0gICAgICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVzdWx0
LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgd2lk
dGggPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0aCh3
aWR0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFuc2Zv
cm0sIFRyYW5zZm9ybSk7Ci0gICAgICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsK
LSAgICAgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0VHJhbnNmb3JtKG9wZXJhdGlvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZTogewotICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCi0KLSAgICAgICAg
aWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7Ci0gICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFs
dWUgPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgZWxzZSBpZiAo
cHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgIC8vIEZvciBiYWNrd2Fy
ZCBjb21wYXRpYmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KLSAgICAgICAg
ICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1pdGl2
ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+Y29t
cHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LCB6b29tRmFjdG9yKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAg
ICAgICAgaWYgKHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFsdWUpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb246Ci0gICAgICAgIGlm
IChpc0luaXRpYWwpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckFuaW1hdGlvbnMo
KTsKLSAgICAgICAgZWxzZSBpZiAoaXNJbmhlcml0KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+aW5oZXJpdEFuaW1hdGlvbnMoc3RhdGUucGFyZW50U3R5bGUoKS0+YW5pbWF0aW9ucygpKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgot
ICAgICAgICBpZiAoaXNJbml0aWFsKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJU
cmFuc2l0aW9ucygpOwotICAgICAgICBlbHNlIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5pbmhlcml0VHJhbnNpdGlvbnMoc3RhdGUucGFyZW50U3R5bGUoKS0+dHJh
bnNpdGlvbnMoKSk7Ci0gICAgICAgIHJldHVybjsKLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogewotICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0
Q29sb3IpOwotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgQ29sb3IgY29sID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZl
VmFsdWUpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVE
X09WRVJGTE9XX1NDUk9MTElORykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dT
Y3JvbGxpbmc6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hP
dmVyZmxvd1Njcm9sbGluZywgVXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7Ci0gICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0VXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZVRvdWNoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlJbnZhbGlkOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gRGly
ZWN0aW9uYWwgcHJvcGVydGllcyBhcmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJl
UHJvcGVydHkoKSBiZWZvcmUgdGhlIHN3aXRjaC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyRW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckVuZFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3Jk
ZXJTdGFydDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRTdHlsZToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0
ZXJDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFyZ2luRW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5T
dGFydDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFyZ2luQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNv
bGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFBhZGRpbmdFbmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFy
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0JlZm9yZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0UGFkZGluZ0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRM
b2dpY2FsV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWluTG9naWNhbEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWF4TG9naWNhbFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVp
Z2h0OgotICAgIHsKLSAgICAgICAgQ1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5Ojpy
ZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9u
KCksIHN0YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBBU1NFUlQobmV3SWQg
IT0gaWQpOwotICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOwotICAg
IH0KLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVBhZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRM
aW5lVGhyb3VnaE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dE92ZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dE92ZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVy
bGluZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRV
bmRlcmxpbmVNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Rm9udFNpemVEZWx0YToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERl
Y29yYXRpb25zSW5FZmZlY3Q6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpczoKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gQ1NTIFRleHQgTGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0
aW5nIHN1cHBvcnQKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKLSAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2Rl
KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNl
dFdyaXRpbmdNb2RlKCpwcmltaXRpdmVWYWx1ZSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IEl0IGlz
IG5vdCBvayB0byBtb2RpZnkgZG9jdW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCi0g
ICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRv
Y3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQo
KS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCh0cnVlKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246
IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBU
ZXh0T3JpZW50YXRpb24pOwotCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAg
ICAgIHNldFRleHRPcmllbnRhdGlvbigqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVC
b3hDb250YWluKQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRMaW5lQm94Q29udGFpbihMaW5lQm94Q29udGFpbk5vbmUpOwotICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFp
blZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ1NTTGluZUJveENvbnRh
aW5WYWx1ZSogbGluZUJveENvbnRhaW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250
YWluVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250
YWluKGxpbmVCb3hDb250YWluVmFsdWUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgLy8gQ1NTIEZvbnRzIE1vZHVsZSBMZXZlbCAzCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEZvbnRGZWF0dXJlU2V0dGluZ3M6IHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
ICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7Ci0gICAg
ICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9u
KCkubWFrZU5vcm1hbEZlYXR1cmVTZXR0aW5ncygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0
YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGxp
c3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxG
b250RmVhdHVyZVNldHRpbmdzPiBzZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0
ZSgpOwotICAgICAgICBpbnQgbGVuID0gbGlzdC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlz
dC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKLSAgICAgICAgICAgIGlmICghaXRlbS0+aXNG
b250RmVhdHVyZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICBGb250RmVhdHVyZVZhbHVlKiBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1
ZSo+KGl0ZW0pOwotICAgICAgICAgICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0
dXJlLT50YWcoKSwgZmVhdHVyZS0+dmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRGZWF0dXJlU2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKLSAgICAg
ICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEZpbHRlcjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIs
IEZpbHRlcik7Ci0gICAgICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAg
aWYgKGNyZWF0ZUZpbHRlck9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucykpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRGaWx0ZXIob3BlcmF0aW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbnM6IHsKLSAgICAgICAgVmVjdG9y
PEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNr
TGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKLSAg
ICAgICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3Jl
YXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
U3RhcnQ6Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3Vs
ZCBiZSBhIHNob3J0aGFuZC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjog
ewotICAgICAgICBHcmlkUG9zaXRpb24gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVh
dGVHcmlkUG9zaXRpb24odmFsdWUsIHN0YXJ0UG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24p
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
RW5kOiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBlbmRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFj
cmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGVuZFBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRC
ZWZvcmU6Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcgYXMgdGhlIHByb3BlcnR5IHNob3Vs
ZCBiZSBhIHNob3J0aGFuZC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvdzogewot
ICAgICAgICBHcmlkUG9zaXRpb24gYmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRl
R3JpZFBvc2l0aW9uKHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9u
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3Jp
ZEFmdGVyOiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQ
b3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBwcm9wZXJ0
aWVzIGFyZSBhbGlhc2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9w
ZXJ0eSBvbiB0aGUgcHJlZml4ZWQgdmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNp
dGlvbkRlbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5
VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gVGhlc2Ug
cHJvcGVydGllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFi
bGUuCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFJlcGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVh
dFg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRZOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckJvdHRvbUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVz
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckJvdHRvbVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZU91dHNldDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlU2xpY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckxlZnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVm
dFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclJpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFN0eWxlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJSaWdodFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5n
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyVG9wTGVmdFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyVG9wUmlnaHRSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAgICBjYXNlIENTU1By
b3BlcnR5Qm94U2l6aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Q2xlYXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUN1cnNvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlEaXNwbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlGbG9hdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUhl
aWdodDoKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJv
cGVydHlJbWFnZU9yaWVudGF0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdl
UmVuZGVyaW5nOgotI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVTT0xVVElPTikKLSAgICBjYXNlIENT
U1Byb3BlcnR5SW1hZ2VSZXNvbHV0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUxl
ZnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUxpbmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHls
ZVBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXJnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2lu
UmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRvcDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5TWF4SGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5TWluSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNv
bG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlPdXRsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93
V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dYOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlPdmVyZmxvd1k6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVBhZGRpbmdCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nUmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBh
ZGRpbmdUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlQYWdlQnJlYWtCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVh
a0luc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5UG9pbnRlckV2ZW50czoKLSAgICBjYXNlIENT
U1Byb3BlcnR5UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5UmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVNwZWFrOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUYWJsZUxheW91dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dEluZGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJmbG93OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0UmVuZGVyaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNm
b3JtOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNv
ZGVCaWRpOgotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlW
YXJpYWJsZToKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bmltYXRpb25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0
aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlvbjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRmlsbE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRBbmltYXRpb25OYW1lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25Q
bGF5U3RhdGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0
aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBlYXJhbmNlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBc3BlY3RSYXRpbzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFj
a2ZhY2VWaXNpYmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xp
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0ZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QmFja2dyb3VuZFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckZpdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
clZlcnRpY2FsU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246Ci0j
aWYgRU5BQkxFKENTU19CT1hfREVDT1JBVElPTl9CUkVBSykKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm94RGVjb3JhdGlvbkJyZWFrOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJveERpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hMaW5lczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdy
b3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmllbnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveFBhY2s6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29y
cmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Q29sdW1uQnJlYWtCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVt
bkJyZWFrSW5zaWRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uR2FwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRDb2x1bW5Qcm9ncmVzc2lvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1u
UnVsZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Q29sdW1uczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uU3Bh
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGg6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEFsaWduQ29udGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxp
Z25JdGVtczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25TZWxmOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRGbGV4OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFz
aXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZsZXhGbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
R3JvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFNocmluazoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0RmxleFdyYXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3Rp
ZnlDb250ZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPcmRlcjoKLSNpZiBFTkFCTEUo
Q1NTX1JFR0lPTlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRGbG93SW50bzoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRGb250S2VybmluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNtb290
aGluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEhpZ2hsaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0SHlwaGVuYXRlQ2hhcmFjdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBo
ZW5hdGVMaW1pdEFmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1p
dEJlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5lczoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZUFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVDbGFtcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZUdyaWQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXJxdWVlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNsaWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tC
b3hJbWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFza0ltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2luOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQ
b3NpdGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrUmVwZWF0WToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE5ic3BNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRQZXJzcGVjdGl2ZU9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3Rp
dmVPcmlnaW5YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6Ci0jaWYgRU5BQkxF
KENTU19SRUdJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVy
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFJlZ2lvbk92ZXJmbG93OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFJ0bE9yZGVyaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRDb21iaW5lOgotI2lmIEVOQUJMRShDU1MzX1RF
WFQpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VGV4dEFsaWduTGFzdDoKLSNlbmRpZiAvLyBDU1MzX1RFWFQKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRleHRFbXBoYXNpc1Bvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RW1waGFzaXNTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybU9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3Jp
Z2luWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VHJhbnNmb3JtU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5z
aXRpb25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9u
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VXNlckRyYWc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJN
b2RpZnk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdENsaXBQYXRoOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
V3JhcEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFdyYXBUaHJvdWdoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRzaWRlOgotI2VuZGlmCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V29yZFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdv
cmRXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVpvb206Ci0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBjYXNlIENTU1By
b3BlcnR5TWF4Wm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3JpZW50YXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgotI2Vu
ZGlmCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAg
ZGVmYXVsdDoKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0
aWVzCi0gICAgICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKLSNlbmRpZgotICAgICAg
ICByZXR1cm47Ci0gICAgfQotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2
ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQot
ewotICAgIGlmICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjYWNoZWRP
clBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2
YWx1ZSkpOwotCi0gICAgaWYgKHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAg
ICAgICBpZiAodmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGdl
bmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGll
bnRWYWx1ZSo+KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkp
OwotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBz
dGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsKLSAgICB9Ci0KLSNp
ZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgp
KQotICAgICAgICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNf
Y2FzdDxDU1NJbWFnZVNldFZhbHVlKj4odmFsdWUpKTsKLSNlbmRpZgotCi0gICAgaWYgKHZhbHVl
LT5pc0N1cnNvckltYWdlVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zy
b21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVl
KSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJl
c29sdmVyOjpjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwg
Q1NTSW1hZ2VWYWx1ZSogdmFsdWUpCi17Ci0gICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0g
dmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5p
c1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQot
Ci1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGlu
Z0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVl
KiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzUGVuZGluZygpKSB7Ci0gICAgICAgIG1fc3Rh
dGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgICAg
ICByZXR1cm4gU3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci0gICAgfQotICAgIHJl
dHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFsdWUpOwotfQotCi0jaWYgRU5BQkxF
KENTU19JTUFHRV9TRVQpCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNl
dE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZh
bHVlKiB2YWx1ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2Fj
aGVkT3JQZW5kaW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdl
LT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRp
ZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwot
fQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29y
T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdl
VmFsdWUqIHZhbHVlKQotewotICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5j
YWNoZWRPclBlbmRpbmdJbWFnZShkb2N1bWVudCgpKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2Ut
PmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGll
cygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JUZXh0U2l6ZUFkanVzdCgpCi17Ci0gICAg
UmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOwotCi0gICAgaWYgKHN0eWxlLT50
ZXh0U2l6ZUFkanVzdCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBGb250RGVzY3JpcHRpb24g
bmV3Rm9udERlc2NyaXB0aW9uKHN0eWxlLT5mb250RGVzY3JpcHRpb24oKSk7Ci0gICAgbmV3Rm9u
dERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShuZXdGb250RGVzY3JpcHRpb24uc3BlY2lmaWVk
U2l6ZSgpKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlv
bik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0
eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIGlmIChzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUt
PmZvbnREZXNjcmlwdGlvbigpOwotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRp
b24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxk
Rm9udC5zcGVjaWZpZWRTaXplKCkpOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3
Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVy
aWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUpCi17Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9u
dERlc2NyaXB0aW9uKCk7Ci0KLSAgICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwg
IXBhcmVudFN0eWxlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRp
b24mIHBhcmVudEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYg
KGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZvciBub3csIGx1bXAgYWxs
IGZhbWlsaWVzIGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCi0gICAgaWYgKGNoaWxkRm9udC5nZW5l
cmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKLSAgICAgICAg
JiYgcGFyZW50Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3Bh
Y2VGYW1pbHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBp
cyBtb25vc3BhY2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAotICAg
IC8vIHNpemUgd2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUg
YXMgYXBwcm9wcmlhdGUuCi0gICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwg
dGhlbiB3ZSByZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFuCi0gICAgLy8gbXVsdGlw
bHlpbmcgYnkgb3VyIHNjYWxlIGZhY3Rvci4KLSAgICBmbG9hdCBzaXplOwotICAgIGlmIChjaGls
ZEZvbnQua2V5d29yZFNpemUoKSkKLSAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChk
b2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEs
IGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpOwotICAgIGVsc2UgewotICAgICAgICBT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgIGZsb2F0IGZp
eGVkU2NhbGVGYWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRT
aXplKCkgJiYgc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQotICAgICAgICAgICAgPyBzdGF0
aWNfY2FzdDxmbG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGlu
Z3MtPmRlZmF1bHRGb250U2l6ZSgpCi0gICAgICAgICAgICA6IDE7Ci0gICAgICAgIHNpemUgPSBw
YXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/Ci0gICAgICAgICAgICAgICAgY2hpbGRG
b250LnNwZWNpZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgotICAgICAgICAgICAgICAg
IGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOwotICAgIH0KLQot
ICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBz
ZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOwotICAgIHN0eWxlLT5zZXRGb250
RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
Ojppbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykKLXsKLSAgICBGb250RGVz
Y3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmlj
RmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwotICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAg
ICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmco
KSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygp
LT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKLSAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5
KHN0YW5kYXJkRm9udEZhbWlseSk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWls
eSgpLmFwcGVuZEZhbWlseSgwKTsKLSAgICB9Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdv
cmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgc2V0Rm9u
dFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NT
VmFsdWVNZWRpdW0sIGZhbHNlKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0
KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLSAgICBtX3N0YXRlLnNldExpbmVI
ZWlnaHRWYWx1ZSgwKTsKLSAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZv
bnREZXNjcmlwdGlvbiwgZmxvYXQgc2l6ZSkKLXsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U3Bl
Y2lmaWVkU2l6ZShzaXplKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdl
dENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUo
KSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxl
cygpKSk7Ci19Ci0KLWZsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVj
aWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlz
QWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykK
LXsKLSAgICBmbG9hdCB6b29tRmFjdG9yID0gMS4wZjsKLSAgICBpZiAoIXVzZVNWR1pvb21SdWxl
cykgewotICAgICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICAg
ICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQotICAgICAgICAgICAgem9v
bUZhY3RvciAqPSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
U3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQs
IHpvb21GYWN0b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKLX0KLQotZmxvYXQg
U3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQq
IGRvY3VtZW50LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBz
cGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9y
Rm9udFNpemUpCi17Ci0gICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90
IGJlIHZpc2libGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQotICAgIC8vIGV4ZW1wdCBmcm9t
IG1pbmltdW0gZm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwt
cGVyZmVjdAotICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBv
dGhlciBicm93c2VycyB0aGF0IGhhdmUgbWluaW11bQotICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5n
cyAoZS5nLiBGaXJlZm94KS4KLSAgICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51
bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQotICAgICAgICByZXR1cm4gMC4wZjsKLQot
ICAgIC8vIFdlIHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmly
c3QgaXMgYSBoYXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bwotICAgIC8vIGFsbCBmb250cy4g
VGhpcyBpcyAibWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBp
cyBhICJzbWFydCBtaW5pbXVtIgotICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhl
IFdlYiBwYWdlIGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4s
Ci0gICAgLy8gd2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJl
c3NlcyB0aGUgZm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgotICAgIC8vIHRoZSB1c2VyJ3Mg
ZGVmYXVsdCBmb250IHNldHRpbmcuCi0KLSAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3
ZSBuZXZlciB3YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRv
IGtlZXAgZm9udHMgcmVhZGFibGUuCi0gICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhl
IHBhZ2UgdG8gc2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAotICAg
IC8vIHNpbmNlIHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93
d3cuZ2FtZXNwb3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCi0KLSAgICBTZXR0aW5ncyogc2V0
dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAg
ICByZXR1cm4gMS4wZjsKLQotICAgIGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250
U2l6ZSgpOwotICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNh
bEZvbnRTaXplKCk7Ci0gICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29t
RmFjdG9yOwotCi0gICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBh
cHBseSB0aGUgaGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNt
YWxsLgotICAgIGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKLSAgICAgICAgem9vbWVkU2l6ZSA9
IG1pblNpemU7Ci0KLSAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBt
aW5pbXVtIGlzIGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAotICAg
IC8vIGFmdGVyIHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUg
dG8gdGhlIHVzZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQotICAgIC8vIG11c3QgaGF2
ZSBiZWVuIGFjY2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFy
dCBtaW5pbXVtIHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCi0gICAgLy8gZG9pbmcgc28gd29uJ3Qg
ZGlzcnVwdCB0aGUgbGF5b3V0LgotICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAm
JiB6b29tZWRTaXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9n
aWNhbFNpemUgfHwgIWlzQWJzb2x1dGVTaXplKSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxv
Z2ljYWxTaXplOwotCi0gICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0
byBwcmV2ZW50IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlv
dXMKLSAgICAvLyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCi0gICAg
cmV0dXJuIG1pbihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKLX0KLQotY29u
c3QgaW50IGZvbnRTaXplVGFibGVNYXggPSAxNjsKLWNvbnN0IGludCBmb250U2l6ZVRhYmxlTWlu
ID0gOTsKLWNvbnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKLQotLy8gV2luSUUvTmF2NCB0YWJs
ZSBmb3IgZm9udCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBp
bmcgc3lzdGVtIG9mIEhUTUwuCi1zdGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVb
Zm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9
Ci17Ci0gICAgICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwg
ICAgMjggfSwKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAg
IDIwLCAgICAzMSB9LAotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAx
NywgICAgMjIsICAgIDM0IH0sCi0gICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQs
ICAgIDE4LCAgICAyNCwgICAgMzcgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAg
ICAxNiwgICAgMjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQot
ICAgICAgeyA5LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQy
IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwg
ICAgNDUgfSwKLSAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAg
IDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQotfTsKLS8vIEhU
TUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNwotLy8g
Q1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCi0vLyAgICAg
ICAgICAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVm
Ci0KLS8vIFN0cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0
aW5ncyBleGFjdGx5Lgotc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRT
aXplVGFibGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQotewot
ICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3
IH0sCi0gICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwg
ICAgMzAgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAg
IDIyLCAgICAzMyB9LAotICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAx
OCwgICAgMjQsICAgIDM2IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYs
ICAgIDIwLCAgICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKLSAgICAg
IHsgOSwgICAxMCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAot
ICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1
IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwg
ICAgNDggfSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBIVE1MICAg
ICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8vIENTUyAg
eHhzICAgeHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAgICAgICAg
ICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgotCi0v
LyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQg
RmFocm5lcidzIHN1Z2dlc3RlZCBzY2FsZQotLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZh
bHVlLgotc3RhdGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9
IHsgMC42MGYsIDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9Owot
Ci1mbG9hdCBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3Vt
ZW50LCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAg
IFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0
dGluZ3MpCi0gICAgICAgIHJldHVybiAxLjBmOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9j
dW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4
ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGlu
Z3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFi
bGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIC8vIExv
b2sgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZS4KLSAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNp
emUgLSBmb250U2l6ZVRhYmxlTWluOwotICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NW
YWx1ZVh4U21hbGwpOwotICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXpl
VGFibGVbcm93XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07Ci0gICAgfQot
Ci0gICAgLy8gVmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0
aGUgc2NhbGUgZmFjdG9yIGluc3RlYWQuCi0gICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgo
c2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7Ci0gICAgcmV0dXJuIG1heChm
b250U2l6ZUZhY3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWlu
TG9naWNhbFNpemUpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGludCBmaW5k
TmVhcmVzdExlZ2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwg
aW50IG11bHRpcGxpZXIpCi17Ci0gICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21h
bGwgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KLSAgICBmb3Ig
KGludCBpID0gMTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKHBp
eGVsRm9udFNpemUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIp
Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIHRvdGFsS2V5d29yZHMg
LSAxOwotfQotCi1pbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRv
Y3VtZW50LCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXpl
KQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAg
IGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgYm9vbCBxdWlya3NNb2Rl
ID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxk
VXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDog
c2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRT
aXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAg
IGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAgcmV0dXJu
IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2Rl
ID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAx
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4o
cGl4ZWxGb250U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXplKTsKLX0KLQotc3RhdGlj
IENvbG9yIGNvbG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCi17Ci0gICAgc3RydWN0IENv
bG9yVmFsdWUgewotICAgICAgICBpbnQgY3NzVmFsdWVJZDsKLSAgICAgICAgUkdCQTMyIGNvbG9y
OwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0g
ewotICAgICAgICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAotICAgICAgICB7IENTU1Zh
bHVlQmxhY2ssIDB4RkYwMDAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAw
RkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZUdyYXksIDB4RkY4MDgwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAw
eEZGMDA4MDAwICB9LAotICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAotICAg
ICAgICB7IENTU1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTWFy
b29uLCAweEZGODAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0s
Ci0gICAgICAgIHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZU9yYW5nZSwgMHhGRkZGQTUwMCB9LAotICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZG
ODAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAotICAgICAgICB7IENTU1ZhbHVlVGVhbCwg
MHhGRjAwODA4MCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAw
IH0sCi0gICAgICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAotICAgICAgICB7IENT
U1ZhbHVlWWVsbG93LCAweEZGRkZGRjAwIH0sCi0gICAgICAgIHsgMCwgMCB9Ci0gICAgfTsKLQot
ICAgIGZvciAoY29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFs
dWVJZDsgKytjb2wpIHsKLSAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlk
KQotICAgICAgICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7Ci0gICAgfQotICAgIHJldHVybiBSZW5k
ZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwotfQotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVs
ZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlKQotewotICAgIGludCBpZGVudCA9IHZhbHVl
LT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIENTU1ZhbHVlV2Vi
a2l0VGV4dDoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKLSAgICBjYXNlIENTU1ZhbHVl
V2Via2l0QWN0aXZlbGluazoKLSAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotfQotCi1Db2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQ
cmltaXRpdmVWYWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Ci17Ci0gICAg
aWYgKHZhbHVlLT5pc1JHQkNvbG9yKCkpCi0gICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0
UkdCQTMyVmFsdWUoKSk7Ci0KLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAg
IGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAg
ICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJr
aXRUZXh0OgotICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7Ci0g
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6Ci0gICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVu
dCgpLT5pc0xpbmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNp
dGVkTGlua0NvbG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKLSAgICBjYXNl
IENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50
KCktPmFjdGl2ZUxpbmtDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdD
b2xvcjoKLSAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOwotICAg
IGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgp
LT5jb2xvcigpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVl
KGlkZW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBl
bmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVz
dWx0KQotewotICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQo
YWRvcHRQdHIobmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKLX0KLQotYm9v
bCBTdHlsZVJlc29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAotewotICAg
IHVuc2lnbmVkIHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLSAgICAgICAgaWYgKG1f
bWVkaXVtLT5ldmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1f
ZXhwcmVzc2lvbikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5t
X3Jlc3VsdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXN0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJh
bnNmb3JtT3BlcmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpTQ0FMRTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpT
Y2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxF
X1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOwotICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9u
OjpTQ0FMRV8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsK
LSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKLSAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKLSAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6VFJBTlNMQVRFXzNEOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9U
QVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOwotICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246OlJPVEFURV9aOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVf
M0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKLSAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6U0tFV19YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNr
ZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7
Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7Ci0gICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJh
dGlvbjo6UEVSU1BFQ1RJVkU7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5r
bm93blRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsK
LSAgICB9Ci0gICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLX0KLQotYm9vbCBT
dHlsZVJlc29sdmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVl
LCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9w
ZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVl
LT5pc1ZhbHVlTGlzdCgpKSB7Ci0gICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/
IHN0eWxlLT5lZmZlY3RpdmVab29tKCkgOiAxOwotICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3Bl
cmF0aW9uczsKLSAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhh
c01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGku
dmFsdWUoKTsKLQotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWUqIHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWUqPihpLnZhbHVlKCkpOwotICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2
ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAg
ICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaGF2ZU5vblBy
aW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLQotICAgICAgICBzd2l0
Y2ggKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0
aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUg
c3kgPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQot
ICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91Ymxl
VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5
cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9u
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vj
b25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3Vi
bGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBk
b3VibGUgc3ogPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0
aW9uKQotICAgICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0g
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAg
ICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkg
IT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgewot
ICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgewot
ICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3Vi
bGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN5ID0gc3g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0
aW9uOjpjcmVhdGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNm
b3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5n
dGggdHggPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3Ro
KDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0
aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1
ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxl
LCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxl
LCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHguaXNVbmRlZmlu
ZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJh
bnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsK
LSAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBM
ZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVu
Z3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3Bl
cmF0aW9uKQotICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0g
Y29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZh
Y3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRU
b0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwot
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9G
bG9hdExlbmd0aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9v
dFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkg
fHwgdHkuaXNVbmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRy
YW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91
YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZSgwLCAwLCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9w
ZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRy
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIHggPSAwOwot
ICAgICAgICAgICAgZG91YmxlIHkgPSAwOwotICAgICAgICAgICAgZG91YmxlIHogPSAwOwotICAg
ICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLQot
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAg
ICAgICAgeCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3Bl
cmF0aW9uKQotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgIHogPSAxOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRU
cmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEpKTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygyKSk7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDMpKTsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdl
dERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+
Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFw
cGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0
VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0g
ICAgICAgICAgICBkb3VibGUgYW5nbGVYID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkg
PSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3Jl
ZXMoKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICBhbmdsZVkgPSBhbmdsZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgICAgIGFuZ2xlWCA9IGFuZ2xlOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNm
b3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIGFuZ2xlWSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZShhbmdsZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3Bl
cmF0aW9uOiB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxKSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMikpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0g
em9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAg
ICAgICAgZG91YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0
cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmICh0cmFu
c2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCAxNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0
RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFs
dWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDYpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEw
KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVl
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMTMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsK
LSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5z
Zm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1hdHJpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVU
cmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZp
eGVkKTsKLSAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAg
ICAgICAgIHAgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8v
IFRoaXMgaXMgYSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBh
cmUgZmluYWxpemVkLgotICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5n
ZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChj
bGFtcFRvUG9zaXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOwot
ICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQotICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
I2lmIEVOQUJMRShDU1NfRklMVEVSUykKLXN0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlv
blR5cGUgZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVy
T3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6R1JBWVNDQUxFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlh
RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsK
LSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoK
LSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7Ci0gICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1
cm4gRmlsdGVyT3BlcmF0aW9uOjpIVUVfUk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJh
dGlvbjo6SU5WRVJUOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0
ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoK
LSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKLSAgICBjYXNlIFdl
YktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6Q09OVFJBU1Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlv
bjo6QkxVUjsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVy
T3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsK
LSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpD
VVNUT007Ci0jZW5kaWYKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmls
dGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotICAg
IH0KLSAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotfQotCi0jaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGlu
Z1NWR0RvY3VtZW50cygpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAo
IXN0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMo
KS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVy
KiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNl
TG9hZGVyKCk7Ci0gICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9w
ZXJhdGlvbnMgPSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytp
KSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZp
bHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9w
ZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewotICAgICAgICAg
ICAgUmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2Fz
dDxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotCi0g
ICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRp
bmdTVkdEb2N1bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKLSAgICAgICAgICAg
IGlmICghdmFsdWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDYWNo
ZWRTVkdEb2N1bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJj
ZUxvYWRlcik7Ci0gICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50KQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1l
bnQgb24gdGhlIHJlZmVyZW5jZSBmaWx0ZXIuCi0gICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXIt
PnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1
bWVudFJlZmVyZW5jZShjYWNoZWREb2N1bWVudCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBz
dGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKLX0KLSNlbmRpZgotCi0jaWYgRU5B
QkxFKENTU19TSEFERVJTKQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVy
KENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFs
dWUoKSkKLSAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVl
KHN0YXRpY19jYXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUpKTsKLSAgICByZXR1cm4g
MDsKLX0KLQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxl
U2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBTdHls
ZVNoYWRlciogc2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOwotICAgIGlm
IChzaGFkZXIgJiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKLSAgICAgICAgbV9zdGF0ZS5z
ZXRIYXNQZW5kaW5nU2hhZGVycyh0cnVlKTsKLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi12b2lk
IFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCi17Ci0gICAgaWYgKCFtX3N0YXRl
LnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJj
ZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQot
ICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0g
bV9zdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAg
ICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJh
dGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5
cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgewotICAgICAgICAgICAgQ3VzdG9tRmls
dGVyT3BlcmF0aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVy
YXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotICAgICAgICAgICAgQVNTRVJUKGN1c3Rv
bUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3Jh
bSogcHJvZ3JhbSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3Rv
bUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFk
ZXIoKSAmJiBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKLSAg
ICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNf
Y2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1No
YWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNo
YWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dy
YW0tPmZyYWdtZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAg
ICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQ
ZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVl
KCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFs
dWUtPmNhY2hlZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2Up
OwotfQotCi1zdGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3Qg
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0
ZXJQYXJhbWV0ZXI+JiBiKQotewotICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4o
YS0+bmFtZSgpLCBiLT5uYW1lKCkpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25z
dCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxDdXN0
b21GaWx0ZXJBcnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJh
eVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0
aCA9IHZhbHVlcy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBDU1NWYWx1
ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlm
ICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmlt
aXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5UGFyYW1ldGVy
LnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxl
UmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYg
bmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlck51
bWJlclBhcmFtZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1l
dGVyOjpjcmVhdGUobmFtZSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+
bGVuZ3RoKCk7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFs
dWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsK
LSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0
aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbnVt
YmVyUGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7
Ci0gICAgfQotICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNz
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21G
aWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3Qq
IHZhbHVlcykKLXsKLSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0
cmFuc2Zvcm1QYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0
ZShuYW1lKTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgY3JlYXRl
VHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwotICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0
T3BlcmF0aW9ucyhvcGVyYXRpb25zKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJl
bGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVz
b2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWUqIHBhcmFtZXRlclZhbHVlKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIg
cGFyYW1ldGVycyB0eXBlcyBwYXJzaW5nLgotICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKLSAgICAvLyB0ZXh0dXJlczogaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCi0gICAgLy8gbWF0MiwgbWF0
MywgbWF0NDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0Ci0g
ICAgLy8gTnVtYmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0
IGFuZCBhbGwKLSAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20g
Q1NTVmFsdWVMaXN0LgotICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2Fz
dDxDU1NWYWx1ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7Ci0gICAgaWYgKCF2YWx1ZXMtPmxlbmd0
aCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJL
aXRDU1NBcnJheUZ1bmN0aW9uVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmls
dGVyQXJyYXlQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIElmIHRoZSBmaXJzdCB2
YWx1ZSBvZiB0aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwKLSAgICAvLyB0aGVuIHdl
IGNvdWxkIHNhZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcwotICAgIC8v
IGFyZSB0cmFuc2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxs
Ci0gICAgLy8gcmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KLSAgICBp
ZiAodmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9y
bVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFt
ZXRlcihuYW1lLCB2YWx1ZXMpOwotCi0gICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2Yg
Ym9vbGVhbnMgb3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0
d2VlbiB0aG9zZSB0d28uCi0gICAgLy8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xl
YW5zIG9yIGFsbCBudW1iZXJzKS4KLSAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQotICAg
ICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRp
dmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDApKTsKLSAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0
aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICByZXR1
cm4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCi0g
ICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4Ci0KLSAg
ICByZXR1cm4gMDsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBh
cmFtZXRlckxpc3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1l
dGVyTGlzdCYgcGFyYW1ldGVyTGlzdCkKLXsKLSAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJh
bWV0ZXJOYW1lczsKLSAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihw
YXJhbWV0ZXJzVmFsdWUpOwotICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7
IHBhcmFtZXRlckl0ZXJhdG9yLmFkdmFuY2UoKSkgewotICAgICAgICBpZiAoIXBhcmFtZXRlckl0
ZXJhdG9yLnZhbHVlKCktPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9y
LnZhbHVlKCkpOwotICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1p
dGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1
ZSgpKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NT
UHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdW
YWx1ZSgpOwotICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1l
cy4KLSAgICAgICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5h
bWUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAKLSAg
ICAgICAgaWYgKCFpdGVyYXRvci5oYXNNb3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0
ZXIgPSBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsK
LSAgICAgICAgaWYgKCFwYXJhbWV0ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIHBhcmFtZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOwotICAgIH0KLSAg
ICAKLSAgICAvLyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2lu
ZyB0aGVtIGRvd24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4KLSAgICBzdGQ6OnNvcnQo
cGFyYW1ldGVyTGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVy
c0J5TmFtZUNvbXBhcmF0b3IpOwotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1QYXNzUmVm
UHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmls
dGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1
ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0
aW9uIGZvciB0aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCi0gICAg
VU5VU0VEX1BBUkFNKGZpbHRlclZhbHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0
cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRl
ck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZh
bHVlKQotewotICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygwKTsKLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElP
TihzaGFkZXJzVmFsdWUtPmlzVmFsdWVMaXN0KCkpOwotICAgIENTU1ZhbHVlTGlzdCogc2hhZGVy
c0xpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOwotCi0gICAg
dW5zaWduZWQgc2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7Ci0gICAg
QVNTRVJUKHNoYWRlcnNMaXN0TGVuZ3RoKTsKLQotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVy
dGV4U2hhZGVyID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMCkpOwotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7Ci0gICAgQ3Vz
dG9tRmlsdGVyUHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VM
RU1FTlRfVEVYVFVSRTsKLSAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0
dGluZ3M7Ci0KLSAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7Ci0gICAgICAgIENTU1Zh
bHVlKiBmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxKTsKLQotICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0
aW9uLT5pc1dlYktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgewotICAgICAgICAgICAgV2ViS2l0
Q1NTTWl4RnVuY3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NN
aXhGdW5jdGlvblZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKLSAgICAgICAg
ICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKLQotICAgICAg
ICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBmcmFnbWVu
dFNoYWRlciA9IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaXRl
cmF0b3IuYWR2YW5jZSgpOwotCi0gICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0
aCgpIDw9IDMpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgewotICAg
ICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAg
ICAgaWYgKENTU1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkp
KQotICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZl
VmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9w
ZXJhdG9yKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAgICAgICAg
bWl4U2V0dGluZ3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19F
TEVNRU5UX1RFWFRVUkU7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVy
KGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0g
ICAgdW5zaWduZWQgbWVzaFJvd3MgPSAxOwotICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsK
LSAgICBDdXN0b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7Ci0g
ICAgCi0gICAgQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7Ci0gICAgCi0gICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aXRlcmF0b3IoZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAg
ICAKLSAgICAgICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3Ig
dGhlIGxpc3Qgb2YgcGFyYW1ldGVyczoKLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBu
dW1iZXIgb3IgYW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKLSAgICAgICAg
Ly8gdGhlIG1lc2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVy
cyBsaXN0LgotCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQ
cmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0
aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVl
KCkpOwotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0
IHdpbGwgc2V0IGJvdGgKLSAgICAgICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVt
bnMuCi0gICAgICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZh
bHVlLT5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsK
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhl
ciBudW1iZXIgZm9yIHRoZSByb3dzLgotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNN
b3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
bWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkp
IHsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAg
ICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgewot
ICAgICAgICAgICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKLSAgICAgICAgICAg
ICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgewotICAgICAgICAgICAgLy8gSWYg
bm8gdmFsdWUgd2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVz
dCBhIHBhcmFtZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVwCi0gICAgICAgICAgICAv
LyBoYXZpbmcganVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0
IG9mIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID09IDIpOwotICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKLSAgICAgICAgcGFy
YW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7Ci0g
ICAgCi0gICAgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OwotICAgIGlm
IChwYXJhbWV0ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJh
bWV0ZXJzVmFsdWUsIHBhcmFtZXRlckxpc3QpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAg
ICBSZWZQdHI8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21G
aWx0ZXJQcm9ncmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFk
ZXIucmVsZWFzZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKLSAgICBy
ZXR1cm4gQ3VzdG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBh
cmFtZXRlckxpc3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOwotfQotCi1QYXNz
UmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAg
ICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKLSAgICBib29sIGlzQXRSdWxlUmVmZXJl
bmNlU3ludGF4ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJp
bWl0aXZlVmFsdWUoKTsKLSAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVh
dGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZh
bHVlKSA6IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVy
VmFsdWUpOwotfQotCi0jZW5kaWYKLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJP
cGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0
eWxlKiByb290U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAg
QVNTRVJUKG91dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKLSAgICAKLSAgICBpZiAoIWluVmFsdWUp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7Ci0gICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUg
PyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpIDogMTsKLSAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJh
dGlvbnM7Ci0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNN
b3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZh
bHVlKCk7Ci0gICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSog
ZmlsdGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUo
KSk7Ci0gICAgICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBl
ID0gZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsK
LQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0g
RmlsdGVyT3BlcmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAvLyBWYWxp
ZGF0ZWRDdXN0b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0
aGUgUmVuZGVyU3R5bGUuCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09
IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmls
dGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmls
dGVyVmFsdWUpOwotICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJh
dGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9u
OjpSRUZFUkVOQ0UpIHsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAgICAgaWYgKGZpbHRlclZh
bHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgQ1NTVmFsdWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMCk7Ci0KLSAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1l
bnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBXZWJL
aXRDU1NTVkdEb2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2Vi
S2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKLSAgICAgICAgICAgIEtVUkwgdXJs
ID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwo
KSk7Ci0KLSAgICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJh
dGlvbiA9IFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUt
PnVybCgpLCB1cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOwotICAgICAg
ICAgICAgaWYgKFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1
bWVudFZhbHVlLT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgewotICAgICAgICAgICAgICAg
IGlmICghc3ZnRG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAg
ICAgICBtX3N0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBz
dmdEb2N1bWVudFZhbHVlKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZh
bHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24t
PnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1
bWVudFJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5k
KG9wZXJhdGlvbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVl
cywgd2l0aCB0aGUKLSAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhh
cyBhIFNoYWRvd1ZhbHVlIHBhcmFtZXRlci4KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0g
RmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVykgewotICAgICAgICAgICAgYm9vbCBoYXZlTm9u
UHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7
IGogPCBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgICAgIGlmICgh
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUo
KSkgewotICAgICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZp
cnN0VmFsdWUgPSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7Ci0g
ICAgICAgIHN3aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgewotICAgICAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAg
ICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjog
ewotICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5p
c1BlcmNlbnRhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJh
c2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5
cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAg
ZG91YmxlIGFuZ2xlID0gMDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkg
PT0gMSkKLSAgICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVz
KCk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0Nv
bG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAg
ICAgIGRvdWJsZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKLSAg
ICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAg
ICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAg
ICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQotICAgICAgICAgICAgICAgICAgICBh
bW91bnQgLz0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6
Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJh
dGlvbjogewotICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhl
ZCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCi0gICAgICAg
ICAgICAgICAgc3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwg
c3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBpZiAoc3RkRGV2aWF0
aW9uLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlv
bjo6Y3JlYXRlKHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNo
YWRvd0ZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAg
Q1NTVmFsdWUqIGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MCk7Ci0gICAgICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3Rh
dGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7Ci0gICAgICAgICAgICBJbnRQb2ludCBs
b2NhdGlvbihpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3RvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRl
TGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikpOwotICAgICAgICAgICAg
aW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0
eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAgICAgIENvbG9yIGNvbG9y
OwotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQotICAgICAgICAgICAgICAgIGNvbG9yID0g
Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOwotCi0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlv
bjo6Y3JlYXRlKGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9y
Ojp0cmFuc3BhcmVudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9w
ZXJhdGlvbjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVy
YXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLVBh
c3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHls
ZVBlbmRpbmdJbWFnZSogcGVuZGluZ0ltYWdlKQotewotICAgIENhY2hlZFJlc291cmNlTG9hZGVy
KiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3Vy
Y2VMb2FkZXIoKTsKLQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgewot
ICAgICAgICBDU1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFn
ZVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRS
ZXNvdXJjZUxvYWRlcik7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VH
ZW5lcmF0b3JWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdl
R2VuZXJhdG9yVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsK
LSAgICAgICAgaW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJj
ZUxvYWRlcik7Ci0gICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1h
Z2VHZW5lcmF0b3JWYWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vy
c29ySW1hZ2VWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvcklt
YWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKLSAgICAgICAg
cmV0dXJuIGN1cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVy
KTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAocGVuZGluZ0lt
YWdlLT5jc3NJbWFnZVNldFZhbHVlKCkpIHsKLSAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1h
Z2VTZXRWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOwotICAgICAgICBy
ZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIp
OwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6bG9hZFBlbmRpbmdJbWFnZXMoKQotewotICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVBy
b3BlcnRpZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBlbmRpbmdJbWFn
ZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKS5lbmQoKS5rZXlzKCk7Ci0gICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9w
ZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVBy
b3BlcnRpZXMoKS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIENT
U1Byb3BlcnR5SUQgY3VycmVudFByb3BlcnR5ID0gKml0OwotCi0gICAgICAgIHN3aXRjaCAoY3Vy
cmVudFByb3BlcnR5KSB7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6
IHsKLSAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRl
LnN0eWxlKCktPmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNr
Z3JvdW5kTGF5ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgewotICAgICAgICAgICAgICAg
IGlmIChiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgp
LT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXIt
PnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2Uq
PihiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogewot
ICAgICAgICAgICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENv
bnRlbnREYXRhKj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7
IGNvbnRlbnREYXRhID0gY29udGVudERhdGEtPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlm
IChjb250ZW50RGF0YS0+aXNJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0eWxlSW1h
Z2UqIGltYWdlID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+
aW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1h
Z2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1h
Z2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVu
dERhdGEpLT5zZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogewotICAgICAg
ICAgICAgaWYgKEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNv
cnMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlz
dC0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVu
dEN1cnNvciA9IGN1cnNvckxpc3QtPmF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoU3R5
bGVJbWFnZSogaW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGlj
X2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogewotICAg
ICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRl
LnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAg
ICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdl
KHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5
bGVJbWFnZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0
ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVy
SW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRl
LnN0eWxlKCktPnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nh
c3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNl
KCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm94UmVmbGVjdDogewotICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlv
biogcmVmbGVjdGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7Ci0gICAgICAg
ICAgICAgICAgY29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1h
c2soKTsKLSAgICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdl
LmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmUHRy
PFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxT
dHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIHJlZmxlY3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFz
ZSgpLCBtYXNrSW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdl
LmJvcmRlclNsaWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFs
UnVsZSgpLCBtYXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAo
bV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCkt
Pm1hc2tCb3hJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAg
IG1fc3RhdGUuc3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uo
c3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJ
bWFnZVNvdXJjZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogewotICAgICAgICAgICAgZm9yIChGaWxs
TGF5ZXIqIG1hc2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBt
YXNrTGF5ZXI7IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKG1hc2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGlu
Z0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBl
bmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1h
Z2UoKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFy
KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQotewot
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAg
ICBsb2FkUGVuZGluZ0ltYWdlcygpOwotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIC8v
IFN0YXJ0IGxvYWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAg
IGxvYWRQZW5kaW5nU2hhZGVycygpOwotI2VuZGlmCi0gICAgCi0jaWYgRU5BQkxFKENTU19GSUxU
RVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVu
dHMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRz
KCk7Ci0jZW5kaWYKLX0KLQotaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVz
OjpNYXRjaGVkUHJvcGVydGllcygpCi0gICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQotewot
fQotCi1pbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJv
cGVydGllcygpCi17Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6
OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNv
bnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywg
V2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMs
ICJwcm9wZXJ0aWVzIik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZUl0ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9i
amVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0
SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVy
KG1hdGNoZWRQcm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsKLSAgICBpbmZvLmFkZE1l
bWJlcihyYW5nZXMsICJyYW5nZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwg
InJlbmRlclN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJw
YXJlbnRSZW5kZXJTdHlsZSIpOwotfQotCi12b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1l
bW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0g
ICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1l
bW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJl
c3Npb24iKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1v
cnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNz
SW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NT
KTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKLSAgICBpbmZv
LmFkZE1lbWJlcihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3
ZWVwVGltZXIsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciIpOwotCi0gICAgaW5m
by5hZGRNZW1iZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Jv
b3REZWZhdWx0U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIo
bV9kb2N1bWVudCwgImRvY3VtZW50Iik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxl
Y3RvciwgImZvbnRTZWxlY3RvciIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBl
bmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3Vs
dHMiKTsKLSAgICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7Ci0gICAgaW5mby5h
ZGRNZW1iZXIobV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKLSAgICBpbmZvLmFkZE1lbWJlciht
X3Njb3BlUmVzb2x2ZXIsICJzY29wZVJlc29sdmVyIik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlciht
X3N0YXRlLCAic3RhdGUiKTsKLQotICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3
aGVyZSBpdCB3b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPwotICAgIGluZm8uYWRkTWVtYmVyKENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUs
ICJkZWZhdWx0UXVpcmtzU3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOwotICAgIGlu
Zm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHls
ZSwgImRlZmF1bHRWaWV3U291cmNlU3R5bGUiKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgJKHJldmlzaW9uIDE0
NDg5MykJKGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaDoxNDQ4OTMpCisr
KyBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaAkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDcwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChr
bm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAy
MDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgor
ICovCisKKyNpZm5kZWYgU3R5bGVSZXNvbHZlcl9oCisjZGVmaW5lIFN0eWxlUmVzb2x2ZXJfaAor
CisjaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKKyNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgiCisj
aW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgor
I2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuaCIKKyNpbmNsdWRlICJMaW5rSGFzaC5o
IgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgor
I2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmgiCisjaW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1ZGUg
IlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgorI2lu
Y2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgorI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCisj
aW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCisjaW5jbHVkZSAiU3R5bGVTY29wZVJlc29s
dmVyLmgiCisjaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCisjaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3VtZW50
VmFsdWUuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworZW51bSBFU21h
cnRNaW5pbXVtRm9yRm9udFNpemUgeyBEb05vdFVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplLCBV
c2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSB9OworCitjbGFzcyBDU1NDdXJzb3JJbWFnZVZhbHVl
OworY2xhc3MgQ1NTRm9udFNlbGVjdG9yOworY2xhc3MgQ1NTRm9udEZhY2U7CitjbGFzcyBDU1NG
b250RmFjZVJ1bGU7CitjbGFzcyBDU1NJbWFnZUdlbmVyYXRvclZhbHVlOworY2xhc3MgQ1NTSW1h
Z2VTZXRWYWx1ZTsKK2NsYXNzIENTU0ltYWdlVmFsdWU7CitjbGFzcyBDU1NQYWdlUnVsZTsKK2Ns
YXNzIENTU1ByaW1pdGl2ZVZhbHVlOworY2xhc3MgQ1NTUHJvcGVydHk7CitjbGFzcyBDU1NSdWxl
TGlzdDsKK2NsYXNzIENTU1NlbGVjdG9yOworY2xhc3MgQ1NTU3R5bGVTaGVldDsKK2NsYXNzIENT
U1ZhbHVlOworY2xhc3MgQ29udGFpbmVyTm9kZTsKK2NsYXNzIEN1c3RvbUZpbHRlck9wZXJhdGlv
bjsKK2NsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlcjsKK2NsYXNzIEN1c3RvbUZpbHRlclBhcmFt
ZXRlckxpc3Q7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIEVsZW1lbnQ7CitjbGFzcyBGcmFtZTsK
K2NsYXNzIEZyYW1lVmlldzsKK2NsYXNzIEtVUkw7CitjbGFzcyBLZXlmcmFtZUxpc3Q7CitjbGFz
cyBLZXlmcmFtZVZhbHVlOworY2xhc3MgTWVkaWFRdWVyeUV2YWx1YXRvcjsKK2NsYXNzIE5vZGU7
CitjbGFzcyBSZW5kZXJSZWdpb247CitjbGFzcyBSZW5kZXJTY3JvbGxiYXI7CitjbGFzcyBSdWxl
RGF0YTsKK2NsYXNzIFJ1bGVTZXQ7CitjbGFzcyBTZXR0aW5nczsKK2NsYXNzIFN0YXRpY0NTU1J1
bGVMaXN0OworY2xhc3MgU3R5bGVCdWlsZGVyOworY2xhc3MgU3R5bGVTY29wZVJlc29sdmVyOwor
Y2xhc3MgU3R5bGVJbWFnZTsKK2NsYXNzIFN0eWxlS2V5ZnJhbWU7CitjbGFzcyBTdHlsZVBlbmRp
bmdJbWFnZTsKK2NsYXNzIFN0eWxlUHJvcGVydHlTZXQ7CitjbGFzcyBTdHlsZVJ1bGU7CisjaWYg
RU5BQkxFKFNIQURPV19ET00pCitjbGFzcyBTdHlsZVJ1bGVIb3N0OworI2VuZGlmCitjbGFzcyBT
dHlsZVJ1bGVLZXlmcmFtZXM7CitjbGFzcyBTdHlsZVJ1bGVQYWdlOworY2xhc3MgU3R5bGVSdWxl
UmVnaW9uOworY2xhc3MgU3R5bGVTaGFkZXI7CitjbGFzcyBTdHlsZVNoZWV0OworY2xhc3MgU3R5
bGVTaGVldExpc3Q7CitjbGFzcyBTdHlsZWRFbGVtZW50OworY2xhc3MgVmlld3BvcnRTdHlsZVJl
c29sdmVyOworY2xhc3MgV2ViS2l0Q1NTRmlsdGVyVmFsdWU7CitjbGFzcyBXZWJLaXRDU1NTaGFk
ZXJWYWx1ZTsKK2NsYXNzIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU7CisKK2NsYXNzIE1lZGlh
UXVlcnlSZXN1bHQgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE1lZGlhUXVlcnlSZXN1bHQp
OyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBNZWRpYVF1ZXJ5UmVzdWx0
KGNvbnN0IE1lZGlhUXVlcnlFeHAmIGV4cHIsIGJvb2wgcmVzdWx0KQorICAgICAgICA6IG1fZXhw
cmVzc2lvbihleHByKQorICAgICAgICAsIG1fcmVzdWx0KHJlc3VsdCkKKyAgICB7CisgICAgfQor
ICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworCisg
ICAgTWVkaWFRdWVyeUV4cCBtX2V4cHJlc3Npb247CisgICAgYm9vbCBtX3Jlc3VsdDsKK307CisK
K2VudW0gU3R5bGVTaGFyaW5nQmVoYXZpb3IgeworICAgIEFsbG93U3R5bGVTaGFyaW5nLAorICAg
IERpc2FsbG93U3R5bGVTaGFyaW5nLAorfTsKKworLy8gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMg
aXMgdXNlZCBpbiBtZWRpYSBxdWVyaWVzLCB3aGVyZSByZWxhdGl2ZSB1bml0cworLy8gYXJlIGlu
dGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50IHN0eWxlLCBh
bmQgc3R5bGVkIG9ubHkKKy8vIGZyb20gdGhlIFVzZXIgQWdlbnQgU3R5bGVzaGVldCBydWxlcy4K
KworZW51bSBSdWxlTWF0Y2hpbmdCZWhhdmlvciB7CisgICAgTWF0Y2hBbGxSdWxlcywKKyAgICBN
YXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCwKKyAgICBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcywK
K307CisKK2NsYXNzIFBzZXVkb1N0eWxlUmVxdWVzdCB7CitwdWJsaWM6CisgICAgUHNldWRvU3R5
bGVSZXF1ZXN0KFBzZXVkb0lkIHBzZXVkb0lkLCBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhciA9
IDAsIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydCA9IE5vUGFydCkKKyAgICAgICAgOiBwc2V1
ZG9JZChwc2V1ZG9JZCkKKyAgICAgICAgLCBzY3JvbGxiYXJQYXJ0KHNjcm9sbGJhclBhcnQpCisg
ICAgICAgICwgc2Nyb2xsYmFyKHNjcm9sbGJhcikKKyAgICB7CisgICAgfQorCisgICAgUHNldWRv
SWQgcHNldWRvSWQ7CisgICAgU2Nyb2xsYmFyUGFydCBzY3JvbGxiYXJQYXJ0OworICAgIFJlbmRl
clNjcm9sbGJhciogc2Nyb2xsYmFyOworfTsKKworY2xhc3MgTWF0Y2hSZXF1ZXN0IHsKK3B1Ymxp
YzoKKyAgICBNYXRjaFJlcXVlc3QoUnVsZVNldCogcnVsZVNldCwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcyA9IGZhbHNlLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSA9IDAsIFNlbGVjdG9yQ2hl
Y2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hl
Y2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgICAgIDogcnVsZVNldChydWxlU2V0KQor
ICAgICAgICAsIGluY2x1ZGVFbXB0eVJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKQorICAgICAgICAs
IHNjb3BlKHNjb3BlKQorICAgICAgICAsIGJlaGF2aW9yQXRCb3VuZGFyeShiZWhhdmlvckF0Qm91
bmRhcnkpIHsgfQorICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVTZXQ7CisgICAgY29uc3QgYm9vbCBp
bmNsdWRlRW1wdHlSdWxlczsKKyAgICBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZTsKKyAgICBj
b25zdCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRh
cnk7Cit9OworCisvLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBSZW5kZXJTdHlsZSBmb3IgYSBnaXZl
biBlbGVtZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBzdHlsZXNoZWV0cy4KK2NsYXNzIFN0
eWxlUmVzb2x2ZXIgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0eWxlUmVzb2x2ZXIpOyBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBTdHlsZVJlc29sdmVyKERvY3Vt
ZW50KiwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpOworICAgIH5TdHlsZVJlc29sdmVy
KCk7CisKKyAgICAvLyBVc2luZyB0aGVzZSBkdXJpbmcgdHJlZSB3YWxrIHdpbGwgYWxsb3cgc3R5
bGUgc2VsZWN0b3IgdG8gb3B0aW1pemUgY2hpbGQgYW5kIGRlc2NlbmRhbnQgc2VsZWN0b3IgbG9v
a3Vwcy4KKyAgICB2b2lkIHB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHBv
cFBhcmVudEVsZW1lbnQoRWxlbWVudCopOworICAgIHZvaWQgcHVzaFBhcmVudFNoYWRvd1Jvb3Qo
Y29uc3QgU2hhZG93Um9vdCopOworICAgIHZvaWQgcG9wUGFyZW50U2hhZG93Um9vdChjb25zdCBT
aGFkb3dSb290Kik7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgdm9pZCBhZGRIb3N0UnVs
ZShTdHlsZVJ1bGVIb3N0KiBydWxlLCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIGNv
bnN0IENvbnRhaW5lck5vZGUqIHNjb3BlKSB7IGVuc3VyZVNjb3BlUmVzb2x2ZXIoKS0+YWRkSG9z
dFJ1bGUocnVsZSwgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgc2NvcGUpOyB9CisjZW5kaWYK
KworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRWxlbWVudChFbGVtZW50Kiwg
UmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgU3R5bGVTaGFyaW5nQmVoYXZpb3IgPSBBbGxv
d1N0eWxlU2hhcmluZywKKyAgICAgICAgUnVsZU1hdGNoaW5nQmVoYXZpb3IgPSBNYXRjaEFsbFJ1
bGVzLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKworICAgIHZvaWQga2V5
ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCosIGNvbnN0IFJlbmRlclN0eWxlKiwgS2V5
ZnJhbWVMaXN0Jik7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBwc2V1ZG9TdHlsZUZv
ckVsZW1lbnQoRWxlbWVudCosIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSk7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclBh
Z2UoaW50IHBhZ2VJbmRleCk7CisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gZGVmYXVsdFN0
eWxlRm9yRWxlbWVudCgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yVGV4
dChUZXh0Kik7CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JE
b2N1bWVudChEb2N1bWVudCosIENTU0ZvbnRTZWxlY3RvciogPSAwKTsKKworICAgIFJlbmRlclN0
eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuc3R5bGUoKTsgfQorICAgIFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50U3R5bGUo
KTsgfQorICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCk7IH0KKyAgICBFbGVtZW50KiBlbGVtZW50KCkgeyBy
ZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCk7IH0KKyAgICBEb2N1bWVudCogZG9jdW1lbnQoKSB7IHJl
dHVybiBtX2RvY3VtZW50OyB9CisgICAgU3R5bGVTY29wZVJlc29sdmVyKiBzY29wZVJlc29sdmVy
KCkgY29uc3QgeyByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOyB9CisgICAgYm9vbCBoYXNQ
YXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnROb2RlKCk7IH0KKworICAg
IC8vIEZJWE1FOiBJdCBjb3VsZCBiZSBiZXR0ZXIgdG8gY2FsbCBtX3J1bGVTZXRzLmFwcGVuZEF1
dGhvclN0eWxlU2hlZXRzKCkgZGlyZWN0bHkgYWZ0ZXIgd2UgZmFjdG9yIFN0eWxlUnNvbHZlciBm
dXJ0aGVyLgorICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
MDg4OTAKKyAgICB2b2lkIGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3
LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mKTsKKworICAgIERvY3VtZW50
UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQorICAgIGNvbnN0IERv
Y3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsgfQor
CisjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgU3R5
bGVTY29wZVJlc29sdmVyKiBlbnN1cmVTY29wZVJlc29sdmVyKCkKKyAgICB7CisjaWYgRU5BQkxF
KFNUWUxFX1NDT1BFRCkKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICAgICAgQVNTRVJUKFJ1
bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSB8fCBSdW50aW1lRW5hYmxl
ZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVuYWJsZWQoKSk7CisjZWxzZQorICAgICAgICBBU1NFUlQo
UnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2VuZGlmCisj
ZWxzZQorICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93RE9NRW5h
YmxlZCgpKTsKKyNlbmRpZgorICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAg
ICAgIG1fc2NvcGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVNjb3BlUmVzb2x2ZXIoKSk7
CisgICAgICAgIHJldHVybiBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCk7CisgICAgfQorI2VuZGlmCisK
K3ByaXZhdGU6CisgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7CisgICAgUmVuZGVyU3R5
bGUqIGxvY2F0ZVNoYXJlZFN0eWxlKCk7CisgICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVN
YXRjaGVzUnVsZVNldChSdWxlU2V0Kik7CisgICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVN
YXRjaGVzSG9zdFJ1bGVzKCk7CisgICAgTm9kZSogbG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBw
YXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdDsKKyAgICBTdHlsZWRFbGVt
ZW50KiBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiwgdW5zaWduZWQmIGNvdW50KSBj
b25zdDsKKyAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50Kikg
Y29uc3Q7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvcktleWZyYW1lKGNv
bnN0IFJlbmRlclN0eWxlKiwgY29uc3QgU3R5bGVLZXlmcmFtZSosIEtleWZyYW1lVmFsdWUmKTsK
KworcHVibGljOgorICAgIC8vIFRoZXNlIG1ldGhvZHMgd2lsbCBnaXZlIGJhY2sgdGhlIHNldCBv
ZiBydWxlcyB0aGF0IG1hdGNoZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudCAob3IgYSBwc2V1ZG8tZWxl
bWVudCkuCisgICAgZW51bSBDU1NSdWxlRmlsdGVyIHsKKyAgICAgICAgVUFBbmRVc2VyQ1NTUnVs
ZXMgICA9IDEgPDwgMSwKKyAgICAgICAgQXV0aG9yQ1NTUnVsZXMgICAgICA9IDEgPDwgMiwKKyAg
ICAgICAgRW1wdHlDU1NSdWxlcyAgICAgICA9IDEgPDwgMywKKyAgICAgICAgQ3Jvc3NPcmlnaW5D
U1NSdWxlcyA9IDEgPDwgNCwKKyAgICAgICAgQWxsQnV0RW1wdHlDU1NSdWxlcyA9IFVBQW5kVXNl
ckNTU1J1bGVzIHwgQXV0aG9yQ1NTUnVsZXMgfCBDcm9zc09yaWdpbkNTU1J1bGVzLAorICAgICAg
ICBBbGxDU1NSdWxlcyAgICAgICAgID0gQWxsQnV0RW1wdHlDU1NSdWxlcyB8IEVtcHR5Q1NTUnVs
ZXMsCisgICAgfTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBzdHlsZVJ1bGVzRm9yRWxl
bWVudChFbGVtZW50KiwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1
bGVzKTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxl
bWVudChFbGVtZW50KiwgUHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0
RW1wdHlDU1NSdWxlcyk7CisKKyAgICAvLyBHaXZlbiBhIENTUyBrZXl3b3JkIGluIHRoZSByYW5n
ZSAoeHgtc21hbGwgdG8gLXdlYmtpdC14eHgtbGFyZ2UpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0
dXJuCisgICAgLy8gdGhlIGNvcnJlY3QgZm9udCBzaXplIHNjYWxlZCByZWxhdGl2ZSB0byB0aGUg
dXNlcidzIGRlZmF1bHQgKG1lZGl1bSkuCisgICAgc3RhdGljIGZsb2F0IGZvbnRTaXplRm9yS2V5
d29yZChEb2N1bWVudCosIGludCBrZXl3b3JkLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNp
emUpOworCisgICAgLy8gR2l2ZW4gYSBmb250IHNpemUgaW4gcGl4ZWwsIHRoaXMgZnVuY3Rpb24g
d2lsbCByZXR1cm4gbGVnYWN5IGZvbnQgc2l6ZSBiZXR3ZWVuIDEgYW5kIDcuCisgICAgc3RhdGlj
IGludCBsZWdhY3lGb250U2l6ZShEb2N1bWVudCosIGludCBwaXhlbEZvbnRTaXplLCBib29sIHNo
b3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpOworCitwdWJsaWM6CisgICAgdm9pZCBhcHBseVByb3Bl
cnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFJlbmRlclN0eWxlKik7CisKKyAg
ICB2b2lkIGFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1
ZSopOworCisgICAgdm9pZCB1cGRhdGVGb250KCk7CisgICAgdm9pZCBpbml0aWFsaXplRm9udFN0
eWxlKFNldHRpbmdzKik7CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNw
ZWNpZmllZFNpemUoRG9jdW1lbnQqLCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVT
aXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgPSBVc2VT
bWFydE1pbmltdW1Gb3JGb250Rml6ZSk7CisKKyAgICB2b2lkIHNldEZvbnRTaXplKEZvbnREZXNj
cmlwdGlvbiYsIGZsb2F0IHNpemUpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBmbG9hdCBnZXRD
b21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIFJlbmRlclN0eWxlKiwgYm9v
bCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVs
ZXMpOworCitwdWJsaWM6CisgICAgYm9vbCB1c2VTVkdab29tUnVsZXMoKTsKKworICAgIHN0YXRp
YyBib29sIGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJp
bWl0aXZlVmFsdWUqKTsKKyAgICBDb2xvciBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmlt
aXRpdmVWYWx1ZSosIGJvb2wgZm9yVmlzaXRlZExpbmsgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBi
b29sIGhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7CisgICAgYm9v
bCBoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJv
b2wgaGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7CisK
KyAgICBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZm9u
dFNlbGVjdG9yLmdldCgpOyB9CisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAg
ICBWaWV3cG9ydFN0eWxlUmVzb2x2ZXIqIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpIHsgcmV0dXJu
IG1fdmlld3BvcnRTdHlsZVJlc29sdmVyLmdldCgpOyB9CisjZW5kaWYKKworICAgIHZvaWQgYWRk
Vmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqLCBi
b29sIHJlc3VsdCk7CisgICAgYm9vbCBoYXNWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcmllcygp
IGNvbnN0IHsgcmV0dXJuICFtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuaXNF
bXB0eSgpOyB9CisgICAgYm9vbCBhZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdDsKKwor
ICAgIHZvaWQgYWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4p
OworCisgICAgYm9vbCBjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwor
CisgICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fcnVsZVNldHMu
ZmVhdHVyZXMoKS5zaWJsaW5nUnVsZXMuaXNFbXB0eSgpOyB9CisgICAgYm9vbCB1c2VzRmlyc3RM
aW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0ZpcnN0
TGluZVJ1bGVzOyB9CisgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0IHsgcmV0
dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS51c2VzQmVmb3JlQWZ0ZXJSdWxlczsgfQorCisgICAg
c3RhdGljIGJvb2wgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwg
UmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9w
ZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOworICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZU1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyAgICBib29s
IGNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBp
blN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBvdXRPcGVy
YXRpb25zKTsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgU3R5bGVTaGFkZXIqIHN0eWxl
U2hhZGVyKENTU1ZhbHVlKik7CisgICAgU3R5bGVTaGFkZXIqIGNhY2hlZE9yUGVuZGluZ1N0eWxl
U2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKik7CisgICAgYm9vbCBwYXJzZUN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJM
aXN0Jik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqKTsKKyAgICBQYXNz
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcihj
b25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9t
RmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihjb25z
dCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmls
dGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJl
bmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50
YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9w
ZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVl
Kik7CisgICAgdm9pZCBsb2FkUGVuZGluZ1NoYWRlcnMoKTsKKyNlbmRpZgorI2lmIEVOQUJMRShT
VkcpCisgICAgdm9pZCBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOworI2VuZGlmCisjZW5kaWYg
Ly8gRU5BQkxFKENTU19GSUxURVJTKQorCisgICAgdm9pZCBsb2FkUGVuZGluZ1Jlc291cmNlcygp
OworCitwcml2YXRlOgorICAgIC8vIFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRlZmF1bHQg
Zm9udCBzaXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZvbnQgZmFt
aWx5IGhhcyBjaGFuZ2VkLiAtZHdoCisgICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFu
Z2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hl
Y2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsK
KyAgICB2b2lkIGNoZWNrRm9yVGV4dFNpemVBZGp1c3QoKTsKKworICAgIHZvaWQgYWRqdXN0UmVu
ZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSwgRWxlbWVudCopOworCisgICAgc3RydWN0IFJ1bGVSYW5nZSB7CisgICAgICAgIFJ1bGVS
YW5nZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQmIGxhc3RSdWxlSW5kZXgpOiBmaXJzdFJ1bGVJ
bmRleChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxlSW5kZXgobGFzdFJ1bGVJbmRleCkgeyB9Cisg
ICAgICAgIGludCYgZmlyc3RSdWxlSW5kZXg7CisgICAgICAgIGludCYgbGFzdFJ1bGVJbmRleDsK
KyAgICB9OworCisgICAgc3RydWN0IE1hdGNoUmFuZ2VzIHsKKyAgICAgICAgTWF0Y2hSYW5nZXMo
KSA6IGZpcnN0VUFSdWxlKC0xKSwgbGFzdFVBUnVsZSgtMSksIGZpcnN0QXV0aG9yUnVsZSgtMSks
IGxhc3RBdXRob3JSdWxlKC0xKSwgZmlyc3RVc2VyUnVsZSgtMSksIGxhc3RVc2VyUnVsZSgtMSkg
eyB9CisgICAgICAgIGludCBmaXJzdFVBUnVsZTsKKyAgICAgICAgaW50IGxhc3RVQVJ1bGU7Cisg
ICAgICAgIGludCBmaXJzdEF1dGhvclJ1bGU7CisgICAgICAgIGludCBsYXN0QXV0aG9yUnVsZTsK
KyAgICAgICAgaW50IGZpcnN0VXNlclJ1bGU7CisgICAgICAgIGludCBsYXN0VXNlclJ1bGU7Cisg
ICAgICAgIFJ1bGVSYW5nZSBVQVJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVB
UnVsZSwgbGFzdFVBUnVsZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIGF1dGhvclJ1bGVSYW5nZSgp
IHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdEF1dGhvclJ1bGUsIGxhc3RBdXRob3JSdWxlKTsgfQor
ICAgICAgICBSdWxlUmFuZ2UgdXNlclJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJz
dFVzZXJSdWxlLCBsYXN0VXNlclJ1bGUpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRjaGVk
UHJvcGVydGllcyB7CisgICAgICAgIE1hdGNoZWRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH5NYXRj
aGVkUHJvcGVydGllcygpOworICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKKyAgICAgICAgCisgICAgICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5
U2V0PiBwcm9wZXJ0aWVzOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBzdHJ1Y3Qgewor
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgOiAyOworICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIHdoaXRlbGlzdFR5cGUgOiAyOworICAgICAgICAgICAgfTsKKyAgICAgICAg
ICAgIC8vIFVzZWQgdG8gbWFrZSBzdXJlIGFsbCBtZW1vcnkgaXMgemVyby1pbml0aWFsaXplZCBz
aW5jZSB3ZSBjb21wdXRlIHRoZSBoYXNoIG92ZXIgdGhlIGJ5dGVzIG9mIHRoaXMgb2JqZWN0Lgor
ICAgICAgICAgICAgdm9pZCogcG9zc2libHlQYWRkZWRNZW1iZXI7CisgICAgICAgIH07CisgICAg
fTsKKworICAgIHN0cnVjdCBNYXRjaFJlc3VsdCB7CisgICAgICAgIE1hdGNoUmVzdWx0KCkgOiBp
c0NhY2hlYWJsZSh0cnVlKSB7IH0KKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzLCA2
ND4gbWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0
Y2hlZFJ1bGVzOworICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7CisgICAgICAgIGJvb2wgaXND
YWNoZWFibGU7CisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVz
KE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVS
dWxlKiA9IDAsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBTZWxlY3RvckNoZWNrZXI6Ok1hdGNo
QWxsLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOworICAg
IHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxl
UHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lkIG1hdGNo
QWxsUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisgICAg
dm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcyhN
YXRjaFJlc3VsdCYsIFJ1bGVTZXQqKTsKKyAgICB2b2lkIG1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hS
ZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNlclJ1bGVz
KE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFNj
b3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Cisg
ICAgdm9pZCBtYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpOworCisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNv
bnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKKworICAgIGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVE
YXRhJikgY29uc3Q7CisgICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisgICAgdm9pZCBzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmKTsKKworICAgIGJvb2wgcnVsZU1h
dGNoZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRv
SWQmLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tl
cjo6RG9lc05vdENyb3NzQm91bmRhcnkpOworICAgIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihj
b25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQp
OworICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGNv
bnN0IEVsZW1lbnQqKTsKKyAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKKyNpZiBFTkFC
TEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgVmFyaWFibGVEZWZpbml0aW9ucywKKyNlbmRpZgor
ICAgICAgICBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzLAorICAgICAgICBMb3dQcmlvcml0eVByb3Bl
cnRpZXMKKyAgICB9OworICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgor
ICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGJvb2wg
aW1wb3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9u
bHkpOworICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgorICAgIHZvaWQg
YXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxl
UnVsZSosIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0
ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklB
QkxFUykKKyAgICB2b2lkIHJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUq
LCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNz
aW9ucyk7CisjZW5kaWYKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEKTsKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgc3RhdGljIGJv
b2wgaXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7CisjZW5kaWYKKyAgICB2
b2lkIG1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCosIGJvb2wgaXNMZWZ0UGFn
ZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgdm9pZCBt
YXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVz
LCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlz
Rmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKyAgICBTZXR0aW5ncyogZG9jdW1l
bnRTZXR0aW5ncygpIHsgcmV0dXJuIG1fZG9jdW1lbnQtPnNldHRpbmdzKCk7IH0KKworICAgIGJv
b2wgaXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBib29sIGlzUmlnaHRQYWdl
KGludCBwYWdlSW5kZXgpIGNvbnN0IHsgcmV0dXJuICFpc0xlZnRQYWdlKHBhZ2VJbmRleCk7IH0K
KyAgICBib29sIGlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OworICAgIFN0cmluZyBw
YWdlTmFtZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKworICAgIERvY3VtZW50UnVsZVNldHMgbV9y
dWxlU2V0czsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgUmVmUHRy
PFN0eWxlUnVsZUtleWZyYW1lcz4gPiBLZXlmcmFtZXNSdWxlTWFwOworICAgIEtleWZyYW1lc1J1
bGVNYXAgbV9rZXlmcmFtZXNSdWxlTWFwOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBIYXNoTWFw
PENTU1Byb3BlcnR5SUQsIFJlZlB0cjxDU1NWYWx1ZT4gPiBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1h
cDsKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgdHlwZWRlZiBI
YXNoTWFwPEZpbHRlck9wZXJhdGlvbiosIFJlZlB0cjxXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVl
PiA+IFBlbmRpbmdTVkdEb2N1bWVudE1hcDsKKyNlbmRpZgorCisgICAgY2xhc3MgU3RhdGUgewor
ICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdGF0ZSk7CisgICAgcHVibGljOgorICAgICAg
ICBTdGF0ZSgpCisgICAgICAgIDogbV9lbGVtZW50KDApCisgICAgICAgICwgbV9zdHlsZWRFbGVt
ZW50KDApCisgICAgICAgICwgbV9wYXJlbnROb2RlKDApCisgICAgICAgICwgbV9wYXJlbnRTdHls
ZSgwKQorICAgICAgICAsIG1fcm9vdEVsZW1lbnRTdHlsZSgwKQorICAgICAgICAsIG1fcmVnaW9u
Rm9yU3R5bGluZygwKQorICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCisgICAgICAg
ICwgbV9wc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pCisgICAgICAgICwgbV9lbGVtZW50TGlu
a1N0YXRlKE5vdEluc2lkZUxpbmspCisgICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9u
UG9pbnQoZmFsc2UpCisgICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoZmFs
c2UpCisgICAgICAgICwgbV9tb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpCisg
ICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSkKKyAgICAgICAgLCBt
X2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpCisjaWYgRU5BQkxFKENTU19T
SEFERVJTKQorICAgICAgICAsIG1faGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpCisjZW5kaWYKKyAg
ICAgICAgLCBtX2xpbmVIZWlnaHRWYWx1ZSgwKQorICAgICAgICAsIG1fZm9udERpcnR5KGZhbHNl
KQorICAgICAgICAsIG1faGFzVUFBcHBlYXJhbmNlKGZhbHNlKQorICAgICAgICAsIG1fYmFja2dy
b3VuZERhdGEoQmFja2dyb3VuZEZpbGxMYXllcikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAg
IHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJl
c29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwg
Y29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyks
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lkIGNsZWFy
KCk7CisKKyAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVt
ZW50LT5kb2N1bWVudCgpOyB9CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQoKSBjb25zdCB7IHJl
dHVybiBtX2VsZW1lbnQ7IH0KKyAgICAgICAgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCgp
IGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVkRWxlbWVudDsgfQorICAgICAgICB2b2lkIHNldFN0eWxl
KFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlKSB7IG1fc3R5bGUgPSBzdHlsZTsgfQorICAg
ICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9
CisgICAgICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHRha2VTdHlsZSgpIHsgcmV0dXJuIG1f
c3R5bGUucmVsZWFzZSgpOyB9CisKKyAgICAgICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1
bGVMaXN0KCk7CisgICAgICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHRha2VSdWxlTGlzdCgp
IHsgcmV0dXJuIG1fcnVsZUxpc3QucmVsZWFzZSgpOyB9CisKKyAgICAgICAgY29uc3QgQ29udGFp
bmVyTm9kZSogcGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50Tm9kZTsgfQorICAg
ICAgICB2b2lkIHNldFBhcmVudFN0eWxlKFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkgeyBtX3Bh
cmVudFN0eWxlID0gcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnRTdHlsZTsgfQorICAgICAgICBSZW5kZXJTdHls
ZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm9vdEVsZW1lbnRTdHlsZTsg
fQorCisgICAgICAgIGNvbnN0IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZygpIGNvbnN0
IHsgcmV0dXJuIG1fcmVnaW9uRm9yU3R5bGluZzsgfQorICAgICAgICB2b2lkIHNldFNhbWVPcmln
aW5Pbmx5KGJvb2wgaXNTYW1lT3JpZ2luT25seSkgeyBtX3NhbWVPcmlnaW5Pbmx5ID0gaXNTYW1l
T3JpZ2luT25seTsgfQorICAgICAgICBib29sIGlzU2FtZU9yaWdpbk9ubHkoKSBjb25zdCB7IHJl
dHVybiBtX3NhbWVPcmlnaW5Pbmx5OyB9CisgICAgICAgIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVz
dCYgcHNldWRvU3R5bGVSZXF1ZXN0KCkgY29uc3QgeyByZXR1cm4gbV9wc2V1ZG9TdHlsZVJlcXVl
c3Q7IH0KKyAgICAgICAgRUluc2lkZUxpbmsgZWxlbWVudExpbmtTdGF0ZSgpIGNvbnN0IHsgcmV0
dXJuIG1fZWxlbWVudExpbmtTdGF0ZTsgfQorICAgICAgICBib29sIGRpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50
OyB9CisgICAgICAgIHZvaWQgc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGJvb2wgaXNB
ZmZlY3RlZCkgeyBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyA9IGlzQWZmZWN0ZWQ7IH0K
KyAgICAgICAgYm9vbCBlbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSBjb25zdCB7IHJldHVy
biBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsgfQorICAgICAgICB2b2lkIHNldE1vZGUo
U2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUpIHsgbV9tb2RlID0gbW9kZTsgfQorICAgICAgICBT
ZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kZTsgfQorICAg
ICAgICAKKyAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBp
c0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsgfQorICAg
ICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5
KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAg
ICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2Fw
cGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsgfQorICAgICAgICBib29sIGFwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0
ZWRMaW5rU3R5bGU7IH0KKyAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAmIHBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKSB7IHJldHVybiBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7IH0KKyNp
ZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdE
b2N1bWVudE1hcCYgcGVuZGluZ1NWR0RvY3VtZW50cygpIHsgcmV0dXJuIG1fcGVuZGluZ1NWR0Rv
Y3VtZW50czsgfQorI2VuZGlmCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICB2b2lk
IHNldEhhc1BlbmRpbmdTaGFkZXJzKGJvb2wgaGFzUGVuZGluZ1NoYWRlcnMpIHsgbV9oYXNQZW5k
aW5nU2hhZGVycyA9IGhhc1BlbmRpbmdTaGFkZXJzOyB9CisgICAgICAgIGJvb2wgaGFzUGVuZGlu
Z1NoYWRlcnMoKSBjb25zdCB7IHJldHVybiBtX2hhc1BlbmRpbmdTaGFkZXJzOyB9CisjZW5kaWYK
KworICAgICAgICB2b2lkIHNldExpbmVIZWlnaHRWYWx1ZShDU1NWYWx1ZSogdmFsdWUpIHsgbV9s
aW5lSGVpZ2h0VmFsdWUgPSB2YWx1ZTsgfQorICAgICAgICBDU1NWYWx1ZSogbGluZUhlaWdodFZh
bHVlKCkgeyByZXR1cm4gbV9saW5lSGVpZ2h0VmFsdWU7IH0KKyAgICAgICAgdm9pZCBzZXRGb250
RGlydHkoYm9vbCBpc0RpcnR5KSB7IG1fZm9udERpcnR5ID0gaXNEaXJ0eTsgfQorICAgICAgICBi
b29sIGZvbnREaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udERpcnR5OyB9CisKKyAgICAgICAg
dm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKKyAgICAgICAgYm9vbCBoYXNVQUFwcGVh
cmFuY2UoKSBjb25zdCB7IHJldHVybiBtX2hhc1VBQXBwZWFyYW5jZTsgfQorICAgICAgICBCb3Jk
ZXJEYXRhIGJvcmRlckRhdGEoKSBjb25zdCB7IHJldHVybiBtX2JvcmRlckRhdGE7IH0KKyAgICAg
ICAgRmlsbExheWVyIGJhY2tncm91bmREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5k
RGF0YTsgfQorICAgICAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7IHJldHVybiBt
X2JhY2tncm91bmRDb2xvcjsgfQorCisgICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAg
ICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7IHJl
dHVybiBtX3BhcmVudFN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQorICAgICAgICB2b2lkIHNl
dEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikg
eyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsgfQorICAgICAgICB2b2lkIHNldFpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBt
X3N0eWxlLT5zZXRab29tKGYpOyB9CisgICAgICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9vbShmbG9h
dCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oZik7IH0KKyAg
ICAgICAgdm9pZCBzZXRUZXh0U2l6ZUFkanVzdChib29sIGIpIHsgbV9mb250RGlydHkgfD0gbV9z
dHlsZS0+c2V0VGV4dFNpemVBZGp1c3QoYik7IH0KKyAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9k
ZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRX
cml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KKyAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRp
b24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0
eWxlLT5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQorCisgICAgICAgIFZl
Y3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRj
aGVkUnVsZXM7IH0KKyAgICAgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSog
cnVsZSkgeyBtX21hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7IH0KKyAgICAgICAgCisgICAgcHJp
dmF0ZToKKyAgICAgICAgLy8gRklYTUUoYnVnIDEwODU2Myk6IHRvIG1ha2UgaXQgZWFzaWVyIHRv
IHJldmlldywgdGhlc2UgbWVtYmVyCisgICAgICAgIC8vIHZhcmlhYmxlcyBhcmUgcHVibGljLiBI
b3dldmVyIHdlIHNob3VsZCBhZGQgbWV0aG9kcyB0byBhY2Nlc3MKKyAgICAgICAgLy8gdGhlc2Ug
dmFyaWFibGVzLgorICAgICAgICBFbGVtZW50KiBtX2VsZW1lbnQ7CisgICAgICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gbV9zdHlsZTsKKyAgICAgICAgU3R5bGVkRWxlbWVudCogbV9zdHlsZWRFbGVt
ZW50OworICAgICAgICBDb250YWluZXJOb2RlKiBtX3BhcmVudE5vZGU7CisgICAgICAgIFJlbmRl
clN0eWxlKiBtX3BhcmVudFN0eWxlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9yb290RWxlbWVu
dFN0eWxlOworICAgICAgICAKKyAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxp
bmc7CisgICAgICAgIGJvb2wgbV9zYW1lT3JpZ2luT25seTsKKyAgICAgICAgUHNldWRvU3R5bGVS
ZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0OworCisgICAgICAgIEVJbnNpZGVMaW5rIG1fZWxl
bWVudExpbmtTdGF0ZTsKKworICAgICAgICBib29sIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBv
aW50OworCisgICAgICAgIGJvb2wgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7CisKKyAg
ICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKworICAgICAgICAvLyBBIGJ1ZmZl
ciB1c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIGZvciBhbiBlbGVtZW50LAor
ICAgICAgICAvLyBhbmQgYSB0ZW1wb3JhcnkgYnVmZmVyIHVzZWQgZm9yIG1lcmdlIHNvcnRpbmcu
CisgICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiBtX21hdGNoZWRSdWxlczsKKyAg
ICAgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OworCisgICAgICAgIGJv
b2wgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7CisgICAgICAgIGJvb2wgbV9hcHBseVBy
b3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOworCisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5
TWFwIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllczsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisg
ICAgICAgIGJvb2wgbV9oYXNQZW5kaW5nU2hhZGVyczsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1Nf
RklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwIG1f
cGVuZGluZ1NWR0RvY3VtZW50czsKKyNlbmRpZgorICAgICAgICBDU1NWYWx1ZSogbV9saW5lSGVp
Z2h0VmFsdWU7CisgICAgICAgIGJvb2wgbV9mb250RGlydHk7CisKKyAgICAgICAgYm9vbCBtX2hh
c1VBQXBwZWFyYW5jZTsKKyAgICAgICAgQm9yZGVyRGF0YSBtX2JvcmRlckRhdGE7CisgICAgICAg
IEZpbGxMYXllciBtX2JhY2tncm91bmREYXRhOworICAgICAgICBDb2xvciBtX2JhY2tncm91bmRD
b2xvcjsKKyAgICB9OworCisgICAgc3RhdGljIFJlbmRlclN0eWxlKiBzdHlsZU5vdFlldEF2YWls
YWJsZSgpIHsgcmV0dXJuIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7IH0KKworICAgIFBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gc3R5bGVJbWFnZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworICAg
IFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3Bl
cnR5SUQsIENTU0ltYWdlVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGdlbmVy
YXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZUdlbmVyYXRvclZh
bHVlKik7CisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisgICAgUGFzc1JlZlB0cjxTdHlsZUlt
YWdlPiBzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VTZXRWYWx1
ZSopOworI2VuZGlmCisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjdXJzb3JPclBlbmRpbmdG
cm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSopOworCisgICAgYm9v
bCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLmFw
cGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpOyB9CisgICAgYm9vbCBhcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlKCk7IH0KKworICAgIHN0YXRpYyBMZW5ndGggY29udmVydFRvSW50TGVu
Z3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0
eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworICAgIHN0YXRpYyBMZW5ndGggY29udmVydFRv
RmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7CisKKyAgICBDU1NUb1N0eWxlTWFw
KiBzdHlsZU1hcCgpIHsgcmV0dXJuICZtX3N0eWxlTWFwOyB9CisgICAgSW5zcGVjdG9yQ1NTT01X
cmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFwcGVycygpIHsgcmV0dXJuIG1faW5zcGVjdG9yQ1NT
T01XcmFwcGVyczsgfQorICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9u
KCkgeyByZXR1cm4gbV9zdGF0ZS5mb250RGVzY3JpcHRpb24oKTsgfQorICAgIGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdGF0ZS5wYXJl
bnRGb250RGVzY3JpcHRpb24oKTsgfQorICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fc3RhdGUuc2V0Rm9udERlc2Ny
aXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAgICB2b2lkIHNldFpvb20oZmxvYXQgZikgeyBt
X3N0YXRlLnNldFpvb20oZik7IH0KKyAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikg
eyBtX3N0YXRlLnNldEVmZmVjdGl2ZVpvb20oZik7IH0KKyAgICB2b2lkIHNldFRleHRTaXplQWRq
dXN0KGJvb2wgYikgeyBtX3N0YXRlLnNldFRleHRTaXplQWRqdXN0KGIpOyB9CisgICAgdm9pZCBz
ZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX3N0YXRlLnNldFdyaXRp
bmdNb2RlKHdyaXRpbmdNb2RlKTsgfQorICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRP
cmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5zZXRUZXh0T3JpZW50YXRpb24o
dGV4dE9yaWVudGF0aW9uKTsgfQorICAgIAorICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVt
b3J5T2JqZWN0SW5mbyopIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgUmVuZGVy
U3R5bGUqIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKKyAgICB2b2lkIGNhY2hlQm9yZGVyQW5k
QmFja2dyb3VuZCgpOworCitwcml2YXRlOgorICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhDb250
cm9sKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZvaWQgYXBwbHlQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUlELCBDU1NWYWx1ZSopOworCisjaWYgRU5BQkxFKFNWRykKKyAgICB2b2lkIGFwcGx5
U1ZHUHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyNlbmRpZgorCisgICAgUGFz
c1JlZlB0cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKik7
CisgICAgdm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNv
bXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqLCB1bnNp
Z25lZCBzaXplKTsKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0geworICAg
ICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKyAg
ICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVkUHJvcGVydGllczsKKyAgICAg
ICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHJlbmRl
clN0eWxlOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBhcmVudFJlbmRlclN0eWxlOwor
ICAgIH07CisgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGZpbmRGcm9tTWF0
Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOwor
ICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiwg
Y29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRj
aFJlc3VsdCYpOworCisgICAgLy8gRXZlcnkgTiBhZGRpdGlvbnMgdG8gdGhlIG1hdGNoZWQgZGVj
bGFyYXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJlIGVudHJpZXMgaG9sZGluZworICAg
IC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRlY2xhcmF0aW9uIGFyZSBnYXJiYWdl
IGNvbGxlY3RlZC4KKyAgICB2b2lkIHN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxT
dHlsZVJlc29sdmVyPiopOworCisgICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNv
bnN0IFNwYWNlU3BsaXRTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVI
YXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0
OworCisgICAgdW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VM
YXN0U3dlZXA7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVJdGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hlOworICAgIE1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOworCisgICAgVGltZXI8U3R5bGVSZXNv
bHZlcj4gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcjsKKworICAgIE93blB0cjxN
ZWRpYVF1ZXJ5RXZhbHVhdG9yPiBtX21lZGl1bTsKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1f
cm9vdERlZmF1bHRTdHlsZTsKKworICAgIERvY3VtZW50KiBtX2RvY3VtZW50OworICAgIFNlbGVj
dG9yRmlsdGVyIG1fc2VsZWN0b3JGaWx0ZXI7CisKKyAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzOworCisgICAgUmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7
CisgICAgVmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRl
bnRNZWRpYVF1ZXJ5UmVzdWx0czsKKworI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04p
CisgICAgUmVmUHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2
ZXI7CisjZW5kaWYKKworICAgIGNvbnN0IFN0eWxlQnVpbGRlciYgbV9zdHlsZUJ1aWxkZXI7CisK
KyAgICBPd25QdHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7CisgICAgQ1NT
VG9TdHlsZU1hcCBtX3N0eWxlTWFwOworICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMgbV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzOworCisgICAgU3RhdGUgbV9zdGF0ZTsKKworICAgIGZyaWVuZCBj
bGFzcyBTdHlsZUJ1aWxkZXI7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRj
aGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7CisgICAgZnJpZW5kIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9w
ZXJ0aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaFJhbmdlcyYs
IGNvbnN0IE1hdGNoUmFuZ2VzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBN
YXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Cit9OworCitpbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcgJmF0
dHJpYnV0ZU5hbWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFhdHRyaWJ1dGVOYW1lLmlzRW1wdHko
KSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuY29udGFp
bnMoYXR0cmlidXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
OjpoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYgY2xhc3NWYWx1ZSkgY29u
c3QKK3sKKyAgICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9y
dWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzVmFsdWUuaW1w
bCgpKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZChj
b25zdCBBdG9taWNTdHJpbmcmIGlkVmFsdWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFpZFZhbHVl
LmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVz
LmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvUGFn
ZVJ1bGVDb2xsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1
bGVDb2xsZWN0b3IuaAkocmV2aXNpb24gMTQ0ODkzKQorKysgU291cmNlL1dlYkNvcmUvY3NzL1Bh
Z2VSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDY4MiArMTksNDIgQEAKICAq
CiAgKi8KIAotI2lmbmRlZiBTdHlsZVJlc29sdmVyX2gKLSNkZWZpbmUgU3R5bGVSZXNvbHZlcl9o
CisjaWZuZGVmIFBhZ2VSdWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgUGFnZVJ1bGVDb2xsZWN0b3Jf
aAogCi0jaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKLSNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgi
Ci0jaW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5o
IgotI2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuaCIKLSNpbmNsdWRlICJMaW5rSGFz
aC5oIgotI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5o
IgotI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmgiCi0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1
ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKLSNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgot
I2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgotI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgi
Ci0jaW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCi0jaW5jbHVkZSAiU3R5bGVTY29wZVJl
c29sdmVyLmgiCi0jaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCi0jaWYgRU5BQkxF
KENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3Vt
ZW50VmFsdWUuaCIKLSNlbmRpZgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8
d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCiAjaW5jbHVkZSA8d3Rm
L1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9B
dG9taWNTdHJpbmdIYXNoLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLWVudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9O
b3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUg
fTsKLQotY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKLWNsYXNzIENTU0ZvbnRTZWxlY3RvcjsK
LWNsYXNzIENTU0ZvbnRGYWNlOwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlOwotY2xhc3MgQ1NTSW1h
Z2VHZW5lcmF0b3JWYWx1ZTsKLWNsYXNzIENTU0ltYWdlU2V0VmFsdWU7Ci1jbGFzcyBDU1NJbWFn
ZVZhbHVlOwotY2xhc3MgQ1NTUGFnZVJ1bGU7Ci1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKLWNs
YXNzIENTU1Byb3BlcnR5OwotY2xhc3MgQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBDU1NTZWxlY3RvcjsK
LWNsYXNzIENTU1N0eWxlU2hlZXQ7Ci1jbGFzcyBDU1NWYWx1ZTsKLWNsYXNzIENvbnRhaW5lck5v
ZGU7Ci1jbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI7Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OwotY2xhc3MgRG9jdW1lbnQ7
Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBGcmFtZVZpZXc7Ci1jbGFzcyBL
VVJMOwotY2xhc3MgS2V5ZnJhbWVMaXN0OwotY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKLWNsYXNzIE1l
ZGlhUXVlcnlFdmFsdWF0b3I7Ci1jbGFzcyBOb2RlOwotY2xhc3MgUmVuZGVyUmVnaW9uOwotY2xh
c3MgUmVuZGVyU2Nyb2xsYmFyOwotY2xhc3MgUnVsZURhdGE7Ci1jbGFzcyBSdWxlU2V0OwotY2xh
c3MgU2V0dGluZ3M7Ci1jbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKLWNsYXNzIFN0eWxlQnVpbGRl
cjsKLWNsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKLWNsYXNzIFN0eWxlSW1hZ2U7Ci1jbGFzcyBT
dHlsZUtleWZyYW1lOwotY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7Ci1jbGFzcyBTdHlsZVByb3Bl
cnR5U2V0OwotY2xhc3MgU3R5bGVSdWxlOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotY2xhc3Mg
U3R5bGVSdWxlSG9zdDsKLSNlbmRpZgotY2xhc3MgU3R5bGVSdWxlS2V5ZnJhbWVzOwogY2xhc3Mg
U3R5bGVSdWxlUGFnZTsKLWNsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKLWNsYXNzIFN0eWxlU2hhZGVy
OwotY2xhc3MgU3R5bGVTaGVldDsKLWNsYXNzIFN0eWxlU2hlZXRMaXN0OwotY2xhc3MgU3R5bGVk
RWxlbWVudDsKLWNsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKLWNsYXNzIFdlYktpdENTU0Zp
bHRlclZhbHVlOwotY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRDU1NT
VkdEb2N1bWVudFZhbHVlOwotCi1jbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0IHsKLSAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7
Ci1wdWJsaWM6Ci0gICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHBy
LCBib29sIHJlc3VsdCkKLSAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhwcikKLSAgICAgICAgLCBt
X3Jlc3VsdChyZXN1bHQpCi0gICAgewotICAgIH0KLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdl
KE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKLQotICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNz
aW9uOwotICAgIGJvb2wgbV9yZXN1bHQ7Ci19OwotCi1lbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9y
IHsKLSAgICBBbGxvd1N0eWxlU2hhcmluZywKLSAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKLX07
Ci0KLS8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywg
d2hlcmUgcmVsYXRpdmUgdW5pdHMKLS8vIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhl
IGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBvbmx5Ci0vLyBmcm9tIHRo
ZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCi0KLWVudW0gUnVsZU1hdGNoaW5nQmVoYXZp
b3IgewotICAgIE1hdGNoQWxsUnVsZXMsCi0gICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUws
Ci0gICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCi19OwotCi1jbGFzcyBQc2V1ZG9TdHlsZVJl
cXVlc3QgewotcHVibGljOgotICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9J
ZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJh
clBhcnQgPSBOb1BhcnQpCi0gICAgICAgIDogcHNldWRvSWQocHNldWRvSWQpCi0gICAgICAgICwg
c2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQotICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxi
YXIpCi0gICAgewotICAgIH0KLQotICAgIFBzZXVkb0lkIHBzZXVkb0lkOwotICAgIFNjcm9sbGJh
clBhcnQgc2Nyb2xsYmFyUGFydDsKLSAgICBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKLX07
Ci0KLWNsYXNzIE1hdGNoUmVxdWVzdCB7Ci1wdWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0KFJ1bGVT
ZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFp
bmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBi
ZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5
KQotICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKLSAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxl
cyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAgICAgLCBzY29wZShzY29wZSkKLSAgICAgICAgLCBi
ZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0KLSAgICBjb25zdCBSdWxl
U2V0KiBydWxlU2V0OwotICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXM7Ci0gICAgY29u
c3QgQ29udGFpbmVyTm9kZSogc2NvcGU7Ci0gICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhh
dmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OwotfTsKIAotLy8gVGhpcyBjbGFzcyBz
ZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxl
Y3Rpb24gb2Ygc3R5bGVzaGVldHMuCi1jbGFzcyBTdHlsZVJlc29sdmVyIHsKLSAgICBXVEZfTUFL
RV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citj
bGFzcyBQYWdlUnVsZUNvbGxlY3RvciB7CiBwdWJsaWM6Ci0gICAgU3R5bGVSZXNvbHZlcihEb2N1
bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKLSAgICB+U3R5bGVSZXNvbHZl
cigpOworICAgIFBhZ2VSdWxlQ29sbGVjdG9yKFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwg
RG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAg
ICAgICAgLCBtX3J1bGVTZXRzKHJ1bGVTZXRzKSB7IH0KIAotICAgIC8vIFVzaW5nIHRoZXNlIGR1
cmluZyB0cmVlIHdhbGsgd2lsbCBhbGxvdyBzdHlsZSBzZWxlY3RvciB0byBvcHRpbWl6ZSBjaGls
ZCBhbmQgZGVzY2VuZGFudCBzZWxlY3RvciBsb29rdXBzLgotICAgIHZvaWQgcHVzaFBhcmVudEVs
ZW1lbnQoRWxlbWVudCopOwotICAgIHZvaWQgcG9wUGFyZW50RWxlbWVudChFbGVtZW50Kik7Ci0g
ICAgdm9pZCBwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7Ci0gICAgdm9p
ZCBwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSNpZiBFTkFCTEUoU0hB
RE9XX0RPTSkKLSAgICB2b2lkIGFkZEhvc3RSdWxlKFN0eWxlUnVsZUhvc3QqIHJ1bGUsIGJvb2wg
aGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUpIHsg
ZW5zdXJlU2NvcGVSZXNvbHZlcigpLT5hZGRIb3N0UnVsZShydWxlLCBoYXNEb2N1bWVudFNlY3Vy
aXR5T3JpZ2luLCBzY29wZSk7IH0KLSNlbmRpZgotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gc3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAw
LCBTdHlsZVNoYXJpbmdCZWhhdmlvciA9IEFsbG93U3R5bGVTaGFyaW5nLAotICAgICAgICBSdWxl
TWF0Y2hpbmdCZWhhdmlvciA9IE1hdGNoQWxsUnVsZXMsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9y
U3R5bGluZyA9IDApOwotCi0gICAgdm9pZCBrZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVt
ZW50KiwgY29uc3QgUmVuZGVyU3R5bGUqLCBLZXlmcmFtZUxpc3QmKTsKLQotICAgIFBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IHBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiwgY29uc3QgUHNl
dWRvU3R5bGVSZXF1ZXN0JiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLQotICAgIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KTsKLSAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCk7Ci0gICAgUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JUZXh0KFRleHQqKTsKLQotICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiwgQ1NTRm9udFNl
bGVjdG9yKiA9IDApOwotCi0gICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9zdGF0ZS5zdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29uc3Qg
eyByZXR1cm4gbV9zdGF0ZS5wYXJlbnRTdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHJvb3RF
bGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKTsg
fQotICAgIEVsZW1lbnQqIGVsZW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKTsgfQot
ICAgIERvY3VtZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fZG9jdW1lbnQ7IH0KLSAgICBTdHls
ZVNjb3BlUmVzb2x2ZXIqIHNjb3BlUmVzb2x2ZXIoKSBjb25zdCB7IHJldHVybiBtX3Njb3BlUmVz
b2x2ZXIuZ2V0KCk7IH0KLSAgICBib29sIGhhc1BhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBt
X3N0YXRlLnBhcmVudE5vZGUoKTsgfQotCi0gICAgLy8gRklYTUU6IEl0IGNvdWxkIGJlIGJldHRl
ciB0byBjYWxsIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoKSBkaXJlY3RseSBh
ZnRlciB3ZSBmYWN0b3IgU3R5bGVSc29sdmVyIGZ1cnRoZXIuCi0gICAgLy8gaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwODg5MAotICAgIHZvaWQgYXBwZW5kQXV0aG9y
U3R5bGVTaGVldHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gPiYpOwotCi0gICAgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSB7IHJldHVy
biBtX3J1bGVTZXRzOyB9Ci0gICAgY29uc3QgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSBj
b25zdCB7IHJldHVybiBtX3J1bGVTZXRzOyB9Ci0KLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8
fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIGVuc3VyZVNjb3Bl
UmVzb2x2ZXIoKQotICAgIHsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKQotI2lmIEVOQUJMRShT
SEFET1dfRE9NKQotICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93
RE9NRW5hYmxlZCgpIHx8IFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxl
ZCgpKTsKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzdHls
ZVNjb3BlZEVuYWJsZWQoKSk7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1l
RW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkpOwotI2VuZGlmCi0gICAgICAgIGlm
ICghbV9zY29wZVJlc29sdmVyKQotICAgICAgICAgICAgbV9zY29wZVJlc29sdmVyID0gYWRvcHRQ
dHIobmV3IFN0eWxlU2NvcGVSZXNvbHZlcigpKTsKLSAgICAgICAgcmV0dXJuIG1fc2NvcGVSZXNv
bHZlci5nZXQoKTsKLSAgICB9Ci0jZW5kaWYKKyAgICB2b2lkIG1hdGNoQWxsUGFnZVJ1bGVzKGlu
dCBwYWdlSW5kZXgpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVz
dWx0KCkgeyByZXR1cm4gbV9yZXN1bHQ7IH0KIAogcHJpdmF0ZToKLSAgICB2b2lkIGluaXRFbGVt
ZW50KEVsZW1lbnQqKTsKLSAgICBSZW5kZXJTdHlsZSogbG9jYXRlU2hhcmVkU3R5bGUoKTsKLSAg
ICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqKTsKLSAg
ICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKTsKLSAgICBOb2Rl
KiBsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5zaWduZWQmIHZpc2l0ZWROb2Rl
Q291bnQpIGNvbnN0OwotICAgIFN0eWxlZEVsZW1lbnQqIGZpbmRTaWJsaW5nRm9yU3R5bGVTaGFy
aW5nKE5vZGUqLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0OwotICAgIGJvb2wgY2FuU2hhcmVTdHls
ZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IHN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBTdHls
ZUtleWZyYW1lKiwgS2V5ZnJhbWVWYWx1ZSYpOwotCi1wdWJsaWM6Ci0gICAgLy8gVGhlc2UgbWV0
aG9kcyB3aWxsIGdpdmUgYmFjayB0aGUgc2V0IG9mIHJ1bGVzIHRoYXQgbWF0Y2hlZCBmb3IgYSBn
aXZlbiBlbGVtZW50IChvciBhIHBzZXVkby1lbGVtZW50KS4KLSAgICBlbnVtIENTU1J1bGVGaWx0
ZXIgewotICAgICAgICBVQUFuZFVzZXJDU1NSdWxlcyAgID0gMSA8PCAxLAotICAgICAgICBBdXRo
b3JDU1NSdWxlcyAgICAgID0gMSA8PCAyLAotICAgICAgICBFbXB0eUNTU1J1bGVzICAgICAgID0g
MSA8PCAzLAotICAgICAgICBDcm9zc09yaWdpbkNTU1J1bGVzID0gMSA8PCA0LAotICAgICAgICBB
bGxCdXRFbXB0eUNTU1J1bGVzID0gVUFBbmRVc2VyQ1NTUnVsZXMgfCBBdXRob3JDU1NSdWxlcyB8
IENyb3NzT3JpZ2luQ1NTUnVsZXMsCi0gICAgICAgIEFsbENTU1J1bGVzICAgICAgICAgPSBBbGxC
dXRFbXB0eUNTU1J1bGVzIHwgRW1wdHlDU1NSdWxlcywKLSAgICB9OwotICAgIFBhc3NSZWZQdHI8
Q1NTUnVsZUxpc3Q+IHN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCB1bnNpZ25lZCBydWxl
c1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOwotICAgIFBhc3NSZWZQdHI8Q1NTUnVs
ZUxpc3Q+IHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCBQc2V1ZG9JZCwgdW5z
aWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1bGVzKTsKLQotICAgIC8vIEdp
dmVuIGEgQ1NTIGtleXdvcmQgaW4gdGhlIHJhbmdlICh4eC1zbWFsbCB0byAtd2Via2l0LXh4eC1s
YXJnZSksIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KLSAgICAvLyB0aGUgY29ycmVjdCBmb250
IHNpemUgc2NhbGVkIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgZGVmYXVsdCAobWVkaXVtKS4KLSAg
ICBzdGF0aWMgZmxvYXQgZm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiwgaW50IGtleXdvcmQs
IGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0KLSAgICAvLyBHaXZlbiBhIGZvbnQg
c2l6ZSBpbiBwaXhlbCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBsZWdhY3kgZm9udCBzaXpl
IGJldHdlZW4gMSBhbmQgNy4KLSAgICBzdGF0aWMgaW50IGxlZ2FjeUZvbnRTaXplKERvY3VtZW50
KiwgaW50IHBpeGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0K
LXB1YmxpYzoKLSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQsIENT
U1ZhbHVlKiwgUmVuZGVyU3R5bGUqKTsKLQotICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvQ3VycmVu
dFN0eWxlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0KLSAgICB2b2lkIHVwZGF0ZUZvbnQo
KTsKLSAgICB2b2lkIGluaXRpYWxpemVGb250U3R5bGUoU2V0dGluZ3MqKTsKLQotICAgIHN0YXRp
YyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIGZsb2F0
IHpvb21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVT
bWFydE1pbmltdW1Gb3JGb250U2l6ZSA9IFVzZVNtYXJ0TWluaW11bUZvckZvbnRGaXplKTsKLQot
ICAgIHZvaWQgc2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiwgZmxvYXQgc2l6ZSk7Ci0KLXBy
aXZhdGU6Ci0gICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiwgUmVuZGVyU3R5bGUqLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVj
aWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcyk7Ci0KLXB1YmxpYzoKLSAgICBib29sIHVz
ZVNWR1pvb21SdWxlcygpOwotCi0gICAgc3RhdGljIGJvb2wgY29sb3JGcm9tUHJpbWl0aXZlVmFs
dWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVWYWx1ZSopOwotICAgIENvbG9yIGNv
bG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiwgYm9vbCBmb3JWaXNpdGVk
TGluayA9IGZhbHNlKSBjb25zdDsKLQotICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JJZChjb25zdCBB
dG9taWNTdHJpbmcmKSBjb25zdDsKLSAgICBib29sIGhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3Qg
QXRvbWljU3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShj
b25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLQotICAgIENTU0ZvbnRTZWxlY3RvciogZm9udFNl
bGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mb250U2VsZWN0b3IuZ2V0KCk7IH0KLSNpZiBFTkFC
TEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIFZpZXdwb3J0U3R5bGVSZXNvbHZlciogdmll
d3BvcnRTdHlsZVJlc29sdmVyKCkgeyByZXR1cm4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIuZ2V0
KCk7IH0KLSNlbmRpZgotCi0gICAgdm9pZCBhZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlS
ZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCosIGJvb2wgcmVzdWx0KTsKLSAgICBib29sIGhhc1Zp
ZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyaWVzKCkgY29uc3QgeyByZXR1cm4gIW1fdmlld3BvcnRE
ZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5pc0VtcHR5KCk7IH0KLSAgICBib29sIGFmZmVjdGVk
QnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0OwotCi0gICAgdm9pZCBhZGRLZXlmcmFtZVN0eWxlKFBh
c3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPik7Ci0KLSAgICBib29sIGNoZWNrUmVnaW9uU3R5
bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0KLSAgICBib29sIHVzZXNTaWJsaW5nUnVsZXMo
KSBjb25zdCB7IHJldHVybiAhbV9ydWxlU2V0cy5mZWF0dXJlcygpLnNpYmxpbmdSdWxlcy5pc0Vt
cHR5KCk7IH0KLSAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1f
cnVsZVNldHMuZmVhdHVyZXMoKS51c2VzRmlyc3RMaW5lUnVsZXM7IH0KLSAgICBib29sIHVzZXNC
ZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVz
ZXNCZWZvcmVBZnRlclJ1bGVzOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBjcmVhdGVUcmFuc2Zvcm1P
cGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVy
U3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Ci0g
ICAgCi0gICAgdm9pZCBpbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSgpOwotCi0jaWYg
RU5BQkxFKENTU19GSUxURVJTKQotICAgIGJvb2wgY3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NW
YWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLSAgICBTdHlsZVNoYWRlciogc3R5bGVTaGFkZXIoQ1NTVmFsdWUqKTsKLSAgICBTdHls
ZVNoYWRlciogY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2ViS2l0Q1NTU2hh
ZGVyVmFsdWUqKTsKLSAgICBib29sIHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NW
YWx1ZSosIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmKTsKLSAgICBQYXNzUmVmUHRyPEN1c3Rv
bUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBDU1NWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVy
PiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNl
Q3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVM
aXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9t
RmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0
Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZp
bHRlck9wZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFs
dWUqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwot
ICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJP
cGVyYXRpb24oV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5nU2hh
ZGVycygpOwotI2VuZGlmCi0jaWYgRU5BQkxFKFNWRykKLSAgICB2b2lkIGxvYWRQZW5kaW5nU1ZH
RG9jdW1lbnRzKCk7Ci0jZW5kaWYKLSNlbmRpZiAvLyBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0KLSAg
ICB2b2lkIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhpcyBm
dW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0
IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKLSAgICB2
b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUq
LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3JUZXh0U2l6ZUFk
anVzdCgpOwotCi0gICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGVU
b0FkanVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50Kik7Ci0KLSAgICBzdHJ1
Y3QgUnVsZVJhbmdlIHsKLSAgICAgICAgUnVsZVJhbmdlKGludCYgZmlyc3RSdWxlSW5kZXgsIGlu
dCYgbGFzdFJ1bGVJbmRleCk6IGZpcnN0UnVsZUluZGV4KGZpcnN0UnVsZUluZGV4KSwgbGFzdFJ1
bGVJbmRleChsYXN0UnVsZUluZGV4KSB7IH0KLSAgICAgICAgaW50JiBmaXJzdFJ1bGVJbmRleDsK
LSAgICAgICAgaW50JiBsYXN0UnVsZUluZGV4OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hS
YW5nZXMgewotICAgICAgICBNYXRjaFJhbmdlcygpIDogZmlyc3RVQVJ1bGUoLTEpLCBsYXN0VUFS
dWxlKC0xKSwgZmlyc3RBdXRob3JSdWxlKC0xKSwgbGFzdEF1dGhvclJ1bGUoLTEpLCBmaXJzdFVz
ZXJSdWxlKC0xKSwgbGFzdFVzZXJSdWxlKC0xKSB7IH0KLSAgICAgICAgaW50IGZpcnN0VUFSdWxl
OwotICAgICAgICBpbnQgbGFzdFVBUnVsZTsKLSAgICAgICAgaW50IGZpcnN0QXV0aG9yUnVsZTsK
LSAgICAgICAgaW50IGxhc3RBdXRob3JSdWxlOwotICAgICAgICBpbnQgZmlyc3RVc2VyUnVsZTsK
LSAgICAgICAgaW50IGxhc3RVc2VyUnVsZTsKLSAgICAgICAgUnVsZVJhbmdlIFVBUnVsZVJhbmdl
KCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VUFSdWxlLCBsYXN0VUFSdWxlKTsgfQotICAgICAg
ICBSdWxlUmFuZ2UgYXV0aG9yUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0QXV0
aG9yUnVsZSwgbGFzdEF1dGhvclJ1bGUpOyB9Ci0gICAgICAgIFJ1bGVSYW5nZSB1c2VyUnVsZVJh
bmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VXNlclJ1bGUsIGxhc3RVc2VyUnVsZSk7IH0K
LSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzIHsKLSAgICAgICAgTWF0Y2hl
ZFByb3BlcnRpZXMoKTsKLSAgICAgICAgfk1hdGNoZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHZv
aWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwotICAgICAgICAK
LSAgICAgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHByb3BlcnRpZXM7Ci0gICAgICAgIHVu
aW9uIHsKLSAgICAgICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbGlu
a01hdGNoVHlwZSA6IDI7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgd2hpdGVsaXN0VHlwZSA6
IDI7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gVXNlZCB0byBtYWtlIHN1cmUgYWxs
IG1lbW9yeSBpcyB6ZXJvLWluaXRpYWxpemVkIHNpbmNlIHdlIGNvbXB1dGUgdGhlIGhhc2ggb3Zl
ciB0aGUgYnl0ZXMgb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAgICB2b2lkKiBwb3NzaWJseVBh
ZGRlZE1lbWJlcjsKLSAgICAgICAgfTsKLSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoUmVzdWx0
IHsKLSAgICAgICAgTWF0Y2hSZXN1bHQoKSA6IGlzQ2FjaGVhYmxlKHRydWUpIHsgfQotICAgICAg
ICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXMsIDY0PiBtYXRjaGVkUHJvcGVydGllczsKLSAgICAg
ICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7Ci0gICAgICAgIE1hdGNoUmFu
Z2VzIHJhbmdlczsKLSAgICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKLSAgICB9OwotCi0gICAgc3Rh
dGljIHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVBy
b3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNo
VHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9
IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0
aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFi
bGUgPSB0cnVlKTsKLQotICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wg
aW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRjaFJlc3Vs
dCYpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCopOwotICAg
IHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpOwotICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQm
LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9zdFJ1bGVzKE1hdGNo
UmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0KLSAgICB2b2lkIGNvbGxlY3RNYXRj
aGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdl
Jik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1
bGVEYXRhPiosIGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotCi0gICAgYm9vbCBm
YXN0UmVqZWN0U2VsZWN0b3IoY29uc3QgUnVsZURhdGEmKSBjb25zdDsKLSAgICB2b2lkIHNvcnRN
YXRjaGVkUnVsZXMoKTsKLSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRj
aFJlc3VsdCYpOwotCi0gICAgYm9vbCBydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0
IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZp
b3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSk7Ci0g
ICAgYm9vbCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxl
Y3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0gICAgdm9pZCBhcHBseU1hdGNoZWRQcm9w
ZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgY29uc3QgRWxlbWVudCopOwotICAgIGVudW0gU3R5
bGVBcHBsaWNhdGlvblBhc3MgewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICBW
YXJpYWJsZURlZmluaXRpb25zLAotI2VuZGlmCi0gICAgICAgIEhpZ2hQcmlvcml0eVByb3BlcnRp
ZXMsCi0gICAgICAgIExvd1ByaW9yaXR5UHJvcGVydGllcwotICAgIH07Ci0gICAgdGVtcGxhdGUg
PFN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgYm9vbCBpbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBp
bnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSk7Ci0gICAgdGVtcGxhdGUgPFN0eWxlQXBw
bGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQ
cm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiwgYm9vbCBpc0ltcG9ydGFudCwgYm9v
bCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlz
dE5vbmUpOwotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIHZvaWQgcmVzb2x2ZVZhcmlh
YmxlcyhDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVy
dHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKTsKLSNlbmRpZgotICAgIHN0YXRpYyBi
b29sIGlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOwotI2lmIEVOQUJM
RShWSURFT19UUkFDSykKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShD
U1NQcm9wZXJ0eUlEKTsKLSNlbmRpZgotICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1
bHQmLCBSdWxlU2V0KiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBT
dHJpbmcmIHBhZ2VOYW1lKTsKLSAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8
U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdl
Kj4mLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFn
ZU5hbWUpOwotICAgIFNldHRpbmdzKiBkb2N1bWVudFNldHRpbmdzKCkgeyByZXR1cm4gbV9kb2N1
bWVudC0+c2V0dGluZ3MoKTsgfQotCiAgICAgYm9vbCBpc0xlZnRQYWdlKGludCBwYWdlSW5kZXgp
IGNvbnN0OwogICAgIGJvb2wgaXNSaWdodFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QgeyByZXR1
cm4gIWlzTGVmdFBhZ2UocGFnZUluZGV4KTsgfQogICAgIGJvb2wgaXNGaXJzdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3Q7CiAgICAgU3RyaW5nIHBhZ2VOYW1lKGludCBwYWdlSW5kZXgpIGNvbnN0
OwogCi0gICAgRG9jdW1lbnRSdWxlU2V0cyBtX3J1bGVTZXRzOwotCi0gICAgdHlwZWRlZiBIYXNo
TWFwPEF0b21pY1N0cmluZ0ltcGwqLCBSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiA+IEtleWZy
YW1lc1J1bGVNYXA7Ci0gICAgS2V5ZnJhbWVzUnVsZU1hcCBtX2tleWZyYW1lc1J1bGVNYXA7Ci0K
LXB1YmxpYzoKLSAgICB0eXBlZGVmIEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwgUmVmUHRyPENTU1Zh
bHVlPiA+IFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOwotI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKLSAgICB0eXBlZGVmIEhhc2hNYXA8RmlsdGVyT3BlcmF0aW9uKiwgUmVm
UHRyPFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU+ID4gUGVuZGluZ1NWR0RvY3VtZW50TWFwOwot
I2VuZGlmCi0KLSAgICBjbGFzcyBTdGF0ZSB7Ci0gICAgICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KFN0YXRlKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFN0YXRlKCkKLSAgICAgICAgOiBtX2VsZW1l
bnQoMCkKLSAgICAgICAgLCBtX3N0eWxlZEVsZW1lbnQoMCkKLSAgICAgICAgLCBtX3BhcmVudE5v
ZGUoMCkKLSAgICAgICAgLCBtX3BhcmVudFN0eWxlKDApCi0gICAgICAgICwgbV9yb290RWxlbWVu
dFN0eWxlKDApCi0gICAgICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCi0gICAgICAgICwgbV9z
YW1lT3JpZ2luT25seShmYWxzZSkKLSAgICAgICAgLCBtX3BzZXVkb1N0eWxlUmVxdWVzdChOT1BT
RVVETykKLSAgICAgICAgLCBtX2VsZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRlTGluaykKLSAgICAg
ICAgLCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludChmYWxzZSkKLSAgICAgICAgLCBtX2Vs
ZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxzZSkKLSAgICAgICAgLCBtX21vZGUoU2VsZWN0
b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKLSAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Jl
Z3VsYXJTdHlsZSh0cnVlKQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZShmYWxzZSkKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgICwgbV9oYXNQZW5k
aW5nU2hhZGVycyhmYWxzZSkKLSNlbmRpZgotICAgICAgICAsIG1fbGluZUhlaWdodFZhbHVlKDAp
Ci0gICAgICAgICwgbV9mb250RGlydHkoZmFsc2UpCi0gICAgICAgICwgbV9oYXNVQUFwcGVhcmFu
Y2UoZmFsc2UpCi0gICAgICAgICwgbV9iYWNrZ3JvdW5kRGF0YShCYWNrZ3JvdW5kRmlsbExheWVy
KSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7
Ci0gICAgICAgIHZvaWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1lbnQqLCBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmID0g
UHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKSwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHls
aW5nID0gMCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLQotICAgICAgICBEb2N1bWVudCogZG9j
dW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KLSAgICAgICAg
RWxlbWVudCogZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotICAgICAgICBT
dHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZWRFbGVt
ZW50OyB9Ci0gICAgICAgIHZvaWQgc2V0U3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5
bGUpIHsgbV9zdHlsZSA9IHN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KLSAgICAgICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KLQotICAgICAg
ICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFzc1JlZlB0
cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNl
KCk7IH0KLQotICAgICAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkgY29uc3Qg
eyByZXR1cm4gbV9wYXJlbnROb2RlOyB9Ci0gICAgICAgIHZvaWQgc2V0UGFyZW50U3R5bGUoUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsgfQot
ICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVu
dFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3Qg
eyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxlOyB9Ci0KLSAgICAgICAgY29uc3QgUmVuZGVyUmVn
aW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JTdHlsaW5n
OyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmlnaW5Pbmx5
KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIGJvb2wg
aXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7IH0KLSAg
ICAgICAgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QoKSBjb25z
dCB7IHJldHVybiBtX3BzZXVkb1N0eWxlUmVxdWVzdDsgfQotICAgICAgICBFSW5zaWRlTGluayBl
bGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRlOyB9Ci0g
ICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyByZXR1cm4g
bV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRFbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFmZmVjdGVk
QnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQotICAgICAgICBib29sIGVsZW1lbnRBZmZlY3Rl
ZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1
bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkg
eyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKCkg
Y29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNldEFwcGx5
UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRv
VmlzaXRlZExpbmtTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVk
TGlua1N0eWxlID0gaXNBcHBseTsgfQotICAgICAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3Vs
YXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOyB9
Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsgfQotICAgICAgICBQZW5k
aW5nSW1hZ2VQcm9wZXJ0eU1hcCYgcGVuZGluZ0ltYWdlUHJvcGVydGllcygpIHsgcmV0dXJuIG1f
cGVuZGluZ0ltYWdlUHJvcGVydGllczsgfQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5B
QkxFKFNWRykKLSAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwJiBwZW5kaW5nU1ZHRG9jdW1l
bnRzKCkgeyByZXR1cm4gbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOyB9Ci0jZW5kaWYKLSNpZiBFTkFC
TEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIHZvaWQgc2V0SGFzUGVuZGluZ1NoYWRlcnMoYm9vbCBo
YXNQZW5kaW5nU2hhZGVycykgeyBtX2hhc1BlbmRpbmdTaGFkZXJzID0gaGFzUGVuZGluZ1NoYWRl
cnM7IH0KLSAgICAgICAgYm9vbCBoYXNQZW5kaW5nU2hhZGVycygpIGNvbnN0IHsgcmV0dXJuIG1f
aGFzUGVuZGluZ1NoYWRlcnM7IH0KLSNlbmRpZgotCi0gICAgICAgIHZvaWQgc2V0TGluZUhlaWdo
dFZhbHVlKENTU1ZhbHVlKiB2YWx1ZSkgeyBtX2xpbmVIZWlnaHRWYWx1ZSA9IHZhbHVlOyB9Ci0g
ICAgICAgIENTU1ZhbHVlKiBsaW5lSGVpZ2h0VmFsdWUoKSB7IHJldHVybiBtX2xpbmVIZWlnaHRW
YWx1ZTsgfQotICAgICAgICB2b2lkIHNldEZvbnREaXJ0eShib29sIGlzRGlydHkpIHsgbV9mb250
RGlydHkgPSBpc0RpcnR5OyB9Ci0gICAgICAgIGJvb2wgZm9udERpcnR5KCkgY29uc3QgeyByZXR1
cm4gbV9mb250RGlydHk7IH0KLQotICAgICAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3Vu
ZCgpOwotICAgICAgICBib29sIGhhc1VBQXBwZWFyYW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFz
VUFBcHBlYXJhbmNlOyB9Ci0gICAgICAgIEJvcmRlckRhdGEgYm9yZGVyRGF0YSgpIGNvbnN0IHsg
cmV0dXJuIG1fYm9yZGVyRGF0YTsgfQotICAgICAgICBGaWxsTGF5ZXIgYmFja2dyb3VuZERhdGEo
KSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmREYXRhOyB9Ci0gICAgICAgIENvbG9yIGJhY2tn
cm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9Ci0KLSAgICAg
ICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0
eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQotICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24m
IHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fcGFyZW50U3R5bGUtPmZvbnREZXNj
cmlwdGlvbigpOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNl
dEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgICAgIHZvaWQgc2V0Wm9v
bShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFpvb20oZik7IH0KLSAgICAg
ICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHls
ZS0+c2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldFRleHRTaXplQWRqdXN0
KGJvb2wgYikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0U2l6ZUFkanVzdChiKTsg
fQotICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2RlKSB7
IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2RlKTsgfQot
ICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4dE9yaWVu
dGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRhdGlvbih0ZXh0
T3JpZW50YXRpb24pOyB9Ci0KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBt
YXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxlczsgfQotICAgICAgICB2b2lkIGFk
ZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1bGVzLmFwcGVu
ZChydWxlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRShidWcg
MTA4NTYzKTogdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1iZXIKLSAgICAg
ICAgLy8gdmFyaWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFkZCBtZXRob2Rz
IHRvIGFjY2VzcwotICAgICAgICAvLyB0aGVzZSB2YXJpYWJsZXMuCi0gICAgICAgIEVsZW1lbnQq
IG1fZWxlbWVudDsKLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3N0eWxlOwotICAgICAg
ICBTdHlsZWRFbGVtZW50KiBtX3N0eWxlZEVsZW1lbnQ7Ci0gICAgICAgIENvbnRhaW5lck5vZGUq
IG1fcGFyZW50Tm9kZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7Ci0gICAg
ICAgIFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAgICAgICBS
ZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3NhbWVPcmln
aW5Pbmx5OwotICAgICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7
Ci0KLSAgICAgICAgRUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRlOwotCi0gICAgICAgIGJv
b2wgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7Ci0KLSAgICAgICAgYm9vbCBtX2VsZW1l
bnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsKLQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUg
bV9tb2RlOwotCi0gICAgICAgIC8vIEEgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUgc2V0IG9mIG1h
dGNoZWQgcnVsZXMgZm9yIGFuIGVsZW1lbnQsCi0gICAgICAgIC8vIGFuZCBhIHRlbXBvcmFyeSBi
dWZmZXIgdXNlZCBmb3IgbWVyZ2Ugc29ydGluZy4KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVE
YXRhKiwgMzI+IG1fbWF0Y2hlZFJ1bGVzOwotICAgICAgICBSZWZQdHI8U3RhdGljQ1NTUnVsZUxp
c3Q+IG1fcnVsZUxpc3Q7Ci0KLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJT
dHlsZTsKLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7Ci0K
LSAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVz
OwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFk
ZXJzOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAg
ICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlm
Ci0gICAgICAgIENTU1ZhbHVlKiBtX2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2Zv
bnREaXJ0eTsKLQotICAgICAgICBib29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAgICAgICBCb3Jk
ZXJEYXRhIG1fYm9yZGVyRGF0YTsKLSAgICAgICAgRmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7
Ci0gICAgICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMg
UmVuZGVyU3R5bGUqIHN0eWxlTm90WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFll
dEF2YWlsYWJsZTsgfQotCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENT
U1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNo
ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAg
IFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1By
b3BlcnR5SUQsIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdF
X1NFVCkKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUlELCBDU1NJbWFnZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1ND
dXJzb3JJbWFnZVZhbHVlKik7Ci0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7
IH0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX3N0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAg
c3RhdGljIExlbmd0aCBjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5k
ZXJTdHlsZSosIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7
Ci0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1
ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxp
ZXIgPSAxKTsKLQotICAgIENTU1RvU3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5
bGVNYXA7IH0KLSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBw
ZXJzKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNj
cmlwdGlvbigpOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3Jp
cHRpb24oKSB7IHJldHVybiBtX3N0YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAg
dm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3Jp
cHRpb24pIHsgbV9zdGF0ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQot
ICAgIHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZv
aWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShm
KTsgfQotICAgIHZvaWQgc2V0VGV4dFNpemVBZGp1c3QoYm9vbCBiKSB7IG1fc3RhdGUuc2V0VGV4
dFNpemVBZGp1c3QoYik7IH0KLSAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdy
aXRpbmdNb2RlKSB7IG1fc3RhdGUuc2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAg
dm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikg
eyBtX3N0YXRlLnNldFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9Ci0gICAgCi0g
ICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAg
Ci1wcml2YXRlOgotICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc19zdHlsZU5vdFlldEF2YWlsYWJs
ZTsKLQotICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Ci0KLXByaXZhdGU6Ci0g
ICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCopIGNvbnN0Owot
Ci0gICAgdm9pZCBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0KLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIHZvaWQgYXBwbHlTVkdQcm9wZXJ0eShDU1NQcm9wZXJ0eUlELCBD
U1NWYWx1ZSopOwotI2VuZGlmCi0KLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRQZW5k
aW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5nSW1hZ2Vz
KCk7CisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xlZnRQ
YWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKyAgICB2b2lk
IG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVs
ZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2Us
IGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwogCi0gICAgc3RhdGlj
IHVuc2lnbmVkIGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3Bl
cnRpZXMqLCB1bnNpZ25lZCBzaXplKTsKLSAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZUl0ZW0gewotICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8q
KSBjb25zdDsKLSAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVkUHJvcGVy
dGllczsKLSAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBSZWZQdHI8UmVuZGVy
U3R5bGU+IHJlbmRlclN0eWxlOwotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBhcmVudFJl
bmRlclN0eWxlOwotICAgIH07Ci0gICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0q
IGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRj
aFJlc3VsdCYpOwotICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJl
bmRlclN0eWxlKiwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNo
LCBjb25zdCBNYXRjaFJlc3VsdCYpOworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBt
X3N0YXRlOworICAgIERvY3VtZW50UnVsZVNldHMmIG1fcnVsZVNldHM7CiAKLSAgICAvLyBFdmVy
eSBOIGFkZGl0aW9ucyB0byB0aGUgbWF0Y2hlZCBkZWNsYXJhdGlvbiBjYWNoZSB0cmlnZ2VyIGEg
c3dlZXAgd2hlcmUgZW50cmllcyBob2xkaW5nCi0gICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRv
IGEgc3R5bGUgZGVjbGFyYXRpb24gYXJlIGdhcmJhZ2UgY29sbGVjdGVkLgotICAgIHZvaWQgc3dl
ZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+Kik7Ci0KLSAgICBi
b29sIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYpIGNv
bnN0OwotICAgIGJvb2wgc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5n
QXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB1bnNpZ25lZCBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcDsKLQotICAgIHR5cGVkZWYg
SGFzaE1hcDx1bnNpZ25lZCwgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0+IE1hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGU7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGU7Ci0KLSAgICBUaW1lcjxTdHlsZVJlc29sdmVyPiBtX21hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGVTd2VlcFRpbWVyOwotCi0gICAgT3duUHRyPE1lZGlhUXVlcnlFdmFsdWF0b3I+IG1fbWVk
aXVtOwotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbV9yb290RGVmYXVsdFN0eWxlOwotCi0gICAg
RG9jdW1lbnQqIG1fZG9jdW1lbnQ7Ci0gICAgU2VsZWN0b3JGaWx0ZXIgbV9zZWxlY3RvckZpbHRl
cjsKLQotICAgIGJvb2wgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXM7Ci0KLSAgICBSZWZQdHI8
Q1NTRm9udFNlbGVjdG9yPiBtX2ZvbnRTZWxlY3RvcjsKLSAgICBWZWN0b3I8T3duUHRyPE1lZGlh
UXVlcnlSZXN1bHQ+ID4gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzOwotCi0j
aWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBSZWZQdHI8Vmlld3BvcnRTdHls
ZVJlc29sdmVyPiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKLSNlbmRpZgotCi0gICAgY29uc3Qg
U3R5bGVCdWlsZGVyJiBtX3N0eWxlQnVpbGRlcjsKLQotICAgIE93blB0cjxTdHlsZVNjb3BlUmVz
b2x2ZXI+IG1fc2NvcGVSZXNvbHZlcjsKLSAgICBDU1NUb1N0eWxlTWFwIG1fc3R5bGVNYXA7Ci0g
ICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7Ci0KLSAg
ICBTdGF0ZSBtX3N0YXRlOwotCi0gICAgZnJpZW5kIGNsYXNzIFN0eWxlQnVpbGRlcjsKLSAgICBm
cmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXMmKTsKLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNo
ZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmKTsKLSAgICBmcmllbmQgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsKLSAg
ICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hS
YW5nZXMmKTsKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKIH07CiAK
LWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0
IEF0b21pY1N0cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWF0dHJp
YnV0ZU5hbWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0
dHJzSW5SdWxlcy5jb250YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7Ci19Ci0KLWlubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5n
JiBjbGFzc1ZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkp
OwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFp
bnMoY2xhc3NWYWx1ZS5pbXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpo
YXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKLXsKLSAg
ICBBU1NFUlQoIWlkVmFsdWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0
dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwotfQotCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKKyNlbmRpZiAvLyBQ
YWdlUnVsZUNvbGxlY3Rvcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3Bw
CShyZXZpc2lvbiAxNDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlICJDb3VudGVyQ29u
dGVudC5oIgogI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKICNpbmNsdWRlICJEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCIKICNp
bmNsdWRlICJFbGVtZW50U2hhZG93LmgiCiAjaW5jbHVkZSAiRm9udEZlYXR1cmVWYWx1ZS5oIgog
I2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgpAQCAtODYsNiArODcsNyBAQAogI2luY2x1ZGUgIk5vZGVS
ZW5kZXJTdHlsZS5oIgogI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0LmgiCiAjaW5jbHVk
ZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmgiCiAjaW5jbHVkZSAiUGFp
ci5oIgogI2luY2x1ZGUgIlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCiAjaW5jbHVk
ZSAiUXVvdGVzRGF0YS5oIgpAQCAtMTA3LDcgKzEwOSw2IEBACiAjaW5jbHVkZSAiU2hhZG93RGF0
YS5oIgogI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKICNpbmNsdWRlICJTaGFkb3dWYWx1ZS5oIgot
I2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAiU2tld1Ry
YW5zZm9ybU9wZXJhdGlvbi5oIgogI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5oIgogI2luY2x1ZGUg
IlN0eWxlQ2FjaGVkSW1hZ2UuaCIKQEAgLTIxMCwzMCArMjExLDYgQEAgaWYgKGlzSW5pdGlhbCkg
eyBcCiAKIFJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0eWxlTm90WWV0QXZhaWxhYmxl
OwogCi1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpCi17
Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIGxlZnRU
b1JpZ2h0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKGxlZnRU
b1JpZ2h0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICBsZWZ0VG9SaWdodERlY2wtPnNldFByb3Bl
cnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7Ci0gICAgcmV0dXJuIGxlZnRU
b1JpZ2h0RGVjbC5nZXQoKTsKLX0KLQotc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIHJpZ2h0VG9M
ZWZ0RGVjbGFyYXRpb24oKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxl
UHJvcGVydHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUo
KSkpOwotICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHkoKSkKLSAgICAgICAgcmlnaHRU
b0xlZnREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVSdGwp
OwotICAgIHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Ci19Ci0KLQotaW5saW5lIFN0YXRp
Y0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVsZUxpc3QoKQotewot
ICAgIGlmICghbV9ydWxlTGlzdCkKLSAgICAgICAgbV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVM
aXN0OjpjcmVhdGUoKTsKLSAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsKLX0KLQogaW5saW5l
IHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpCiB7
CiAgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJhbmNlKCk7CkBAIC0y
NTEsOCArMjI4LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKAog
ICAgIG1fcGFyZW50U3R5bGUgPSAwOwogICAgIG1fcGFyZW50Tm9kZSA9IDA7CiAgICAgbV9yZWdp
b25Gb3JTdHlsaW5nID0gMDsKLSAgICBtX3J1bGVMaXN0ID0gMDsKLSAgICBtX21hdGNoZWRSdWxl
cy5jbGVhcigpOwogICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwogI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKICAgICBtX2hhc1BlbmRpbmdTaGFkZXJzID0gZmFsc2U7CkBAIC0y
NjIsNiArMjM3LDE2IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigK
ICNlbmRpZgogfQogCit2b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0OjphZGRNYXRjaGVk
UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUq
IHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9w
ZXJ0eVdoaXRlbGlzdFR5cGUpCit7CisgICAgbWF0Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgKyAxKTsKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVy
dGllcyYgbmV3UHJvcGVydGllcyA9IG1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKKyAgICBuZXdQ
cm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9w
ZXJ0aWVzKTsKKyAgICBuZXdQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBl
OworICAgIG5ld1Byb3BlcnRpZXMud2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlw
ZTsKKyAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworfQorCiBTdHlsZVJlc29sdmVyOjpT
dHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJT
dHlsZXMpCiAgICAgOiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RT
d2VlcCgwKQogICAgICwgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAm
U3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKQpAQCAtNDA1LDE4MiAr
MzkwLDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aQogICAgIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsKIH0KIAot
dm9pZCBTdHlsZVJlc29sdmVyOjphZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgbWF0
Y2hSZXN1bHQsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSog
cnVsZSwgdW5zaWduZWQgbGlua01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3Bl
cnR5V2hpdGVsaXN0VHlwZSkKLXsKLSAgICBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5n
cm93KG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOwotICAgIE1hdGNo
ZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMubGFzdCgpOwotICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5
bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRpZXMpOwotICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNo
VHlwZSA9IGxpbmtNYXRjaFR5cGU7Ci0gICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0g
cHJvcGVydHlXaGl0ZWxpc3RUeXBlOwotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlcy5hcHBl
bmQocnVsZSk7Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCog
cHJvcGVydHlTZXQsIGJvb2wgaXNDYWNoZWFibGUpCi17Ci0gICAgaWYgKCFwcm9wZXJ0eVNldCkK
LSAgICAgICAgcmV0dXJuOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlmIChyZXN1bHQucmFuZ2VzLmZpcnN0
QXV0aG9yUnVsZSA9PSAtMSkKLSAgICAgICAgcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUg
PSByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOwotICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVz
KHJlc3VsdCwgcHJvcGVydHlTZXQpOwotICAgIGlmICghaXNDYWNoZWFibGUpCi0gICAgICAgIHJl
c3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOwotfQotCi1jbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29w
ZSB7Ci1wdWJsaWM6Ci0gICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKLSAgICB+TWF0Y2hpbmdV
QVJ1bGVzU2NvcGUoKTsKLQotICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7Ci0K
LXByaXZhdGU6Ci0gICAgc3RhdGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Ci19OwotCi1NYXRj
aGluZ1VBUnVsZXNTY29wZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQotewotICAgIEFTU0VSVCgh
bV9tYXRjaGluZ1VBUnVsZXMpOwotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKLX0KLQot
TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgbV9t
YXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKLX0KLQotaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVz
U2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKLXsKLSAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVs
ZXM7Ci19Ci0KLWJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0g
ZmFsc2U7Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3Qg
TWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAg
IEFTU0VSVChtYXRjaFJlcXVlc3QucnVsZVNldCk7Ci0gICAgQVNTRVJUKG1fc3RhdGUuZWxlbWVu
dCgpKTsKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgRWxlbWVudCogZWxlbWVu
dCA9IHN0YXRlLmVsZW1lbnQoKTsKLSAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVt
ZW50ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNl
dWRvSWQgPSBlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpOwotICAgIGlmICghcHNldWRvSWQuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIEFTU0VSVChzdHlsZWRFbGVtZW50KTsKLSAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQc2V1ZG9F
bGVtZW50UnVsZXMocHNldWRvSWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwot
ICAgIH0KLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICBpZiAoZWxlbWVudC0+aXNXZWJW
VFRFbGVtZW50KCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+Y3VlUHNldWRvUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OwotI2VuZGlmCi0gICAgLy8gQ2hlY2sgd2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxlcyBhcmUg
YXBwbGljYWJsZSBpbiB0aGUgY3VycmVudCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3IgdGhpczoK
LSAgICAvLyBhKSBpdCdzIGEgVUEgcnVsZQotICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93
cyBhdXRob3IgcnVsZXMKLSAgICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBz
dHlsZSBzaGVldCB3aXRoaW4gdGhlIHNhbWUgdHJlZSBzY29wZQotICAgIFRyZWVTY29wZSogdHJl
ZVNjb3BlID0gZWxlbWVudC0+dHJlZVNjb3BlKCk7Ci0gICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNT
Y29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotICAgICAgICAmJiAhdHJlZVNjb3BlLT5hcHBseUF1
dGhvclN0eWxlcygpCi0gICAgICAgICYmICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1hdGNoUmVx
dWVzdC5zY29wZS0+dHJlZVNjb3BlKCkgIT0gdHJlZVNjb3BlKQotICAgICAgICAmJiBtYXRjaFJl
cXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3Nz
Qm91bmRhcnkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIG5lZWQgdG8gY29sbGVjdCB0
aGUgcnVsZXMgZm9yIGlkLCBjbGFzcywgdGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGludG8gYSBi
dWZmZXIgYW5kCi0gICAgLy8gdGhlbiBzb3J0IHRoZSBidWZmZXIuCi0gICAgaWYgKGVsZW1lbnQt
Pmhhc0lEKCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVl
c3QucnVsZVNldC0+aWRSdWxlcyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwo
KSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBz
dHlsZWRFbGVtZW50LT5oYXNDbGFzcygpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQotICAgICAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1
bGVzKHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQotICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmxpbmtQ
c2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBpZiAoU2Vs
ZWN0b3JDaGVja2VyOjptYXRjaGVzRm9jdXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKLSAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1Bz
ZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVu
dC0+bG9jYWxOYW1lKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2Fs
UnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0
Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBpZiAoIW1fc3RhdGUucmVn
aW9uRm9yU3R5bGluZygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICB1bnNpZ25lZCBzaXplID0g
bWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgY29u
c3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1f
cmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7Ci0gICAgICAgIGlmIChj
aGVja1JlZ2lvblNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4o
bV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7Ci0gICAgICAgICAgICBSdWxl
U2V0KiByZWdpb25SdWxlcyA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCk7Ci0gICAgICAgICAgICBBU1NFUlQocmVn
aW9uUnVsZXMpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0
KHJlZ2lvblJ1bGVzLCBtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVz
dC5zY29wZSksIHJ1bGVSYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQp
Ci17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBWZWN0b3I8Y29uc3QgUnVsZURh
dGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOwotICAgIGlmICht
YXRjaGVkUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzb3J0TWF0Y2hl
ZFJ1bGVzKCk7Ci0KLSAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29s
bGVjdGluZ1J1bGVzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVk
UnVsZXMuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5y
dWxlcygpLmFwcGVuZChtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVy
KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm93IHRyYW5zZmVyIHRoZSBz
ZXQgb2YgbWF0Y2hlZCBydWxlcyBvdmVyIHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7Ci0g
ICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNv
bW1vbkF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRV
bmlxdWUoKTsKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVs
ZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0
Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlX
aGl0ZWxpc3RUeXBlKCkpOwotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNj
b3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCi17Ci0jaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCi0g
ICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIE1hdGNo
IHNjb3BlZCBhdXRob3IgcnVsZXMgYnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3Rh
Y2sgKHJlYnVpbGQgaXQgaWYgaXQgZ290IGluY29uc2lzdGVudCkuCi0gICAgaWYgKG1fc2NvcGVS
ZXNvbHZlci0+aGFzU2NvcGVkU3R5bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFj
a0NvbnNpc3RlbmN5KG1fc3RhdGUuZWxlbWVudCgpKSkgewotICAgICAgICBib29sIGFwcGx5QXV0
aG9yU3R5bGVzID0gbV9zdGF0ZS5lbGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0
eWxlcygpOwotICAgICAgICBib29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOwotICAgICAgICB1bnNp
Z25lZCBzY29wZVNpemUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2NvcGVTaXplOyArK2kpIHsKLSAgICAgICAgICAgIG1f
c3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgICAgIHJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQot
ICAgICAgICAgICAgY29uc3QgU3R5bGVTY29wZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBmcmFtZSA9
IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tGcmFtZUF0KGkpOwotICAgICAgICAgICAgZG9jdW1lbnRT
Y29wZSA9IGRvY3VtZW50U2NvcGUgJiYgIWZyYW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dUcmVlKCk7
Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnRTY29wZSkgewotICAgICAgICAgICAgICAgIGlmICgh
YXBwbHlBdXRob3JTdHlsZXMpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlci0+bWF0
Y2hlc1N0eWxlQm91bmRzKGZyYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QoZnJh
bWUubV9ydWxlU2V0LCBpbmNsdWRlRW1wdHlSdWxlcywgZnJhbWUubV9zY29wZSk7Ci0gICAgICAg
ICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2Uo
KTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKLSAgICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhyZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWF0Y2hIb3N0UnVsZXMocmVzdWx0
LCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwot
ICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZW5kaWYKLX0KLQogaW5saW5l
IGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxl
cygpCiB7CiAjaWYgRU5BQkxFKFNIQURPV19ET00pCkBAIC01OTAsMTk3ICszOTksNiBAQCBpbmxp
bmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDCiAjZW5kaWYKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIEFTU0VSVCht
X3Njb3BlUmVzb2x2ZXIpOwotCi0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwot
ICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMTsKLQotICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOwotICAg
IG1fc2NvcGVSZXNvbHZlci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNo
ZWRSdWxlcyk7Ci0gICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAt
LWkpIHsKLSAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9y
UnVsZVJhbmdlKCk7Ci0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdCht
YXRjaGVkUnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgp
KSwgcnVsZVJhbmdlKTsKLSAgICB9Ci0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJl
c3VsdCk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwotICAgIFVOVVNFRF9QQVJB
TShpbmNsdWRlRW1wdHlSdWxlcyk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpt
YXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCi17Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5y
YW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MTsKLQotICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IC8vIE1hdGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVx
dWVzdChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBS
dWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotI2lm
IEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVz
dHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNo
UmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKLSAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKLSNlbmRpZgotCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0KLSAgICBtYXRjaFNjb3Bl
ZEF1dGhvclJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpCi17Ci0gICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0g
ICAgcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMTsKLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNl
clN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0g
cmVzdWx0LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMo
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVn
aW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcyhyZXN1bHQpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhN
YXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKLXsKLSAgICBtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0g
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVS
YW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25z
dCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0g
ICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHls
ZSBmb3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSBy
ZXNvbHZlLgotICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRv
LWRhdGUgaW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBi
b29sIGNhblVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25z
aXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3Vu
ZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OwotCi0gICAgdW5z
aWduZWQgc2l6ZSA9IHJ1bGVzLT5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHNpemU7ICsraSkgewotICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+
YXQoaSk7Ci0gICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIu
ZmFzdFJlamVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxl
RGF0YS5kZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOwot
ICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOwot
ICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChy
dWxlTWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBt
YXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgewotICAgICAgICAgICAgLy8gSWYgdGhl
IHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBu
b24tZGVidWcgbW9kZS4KLSAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3Bl
cnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMg
fHwgKHByb3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1
bGVzKSkgewotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0
Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQg
Z2V0TWF0Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMg
bmVlZGVkLgotICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVs
ZURhdGEuaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB3
ZSdyZSBtYXRjaGluZyBub3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKLSAgICAgICAg
ICAgIC8vIHdlIHJlYWxseSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KLSAgICAgICAg
ICAgIGlmIChkeW5hbWljUHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVx
dWVzdCgpLnBzZXVkb0lkID09IE5PUFNFVURPKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRl
Lm1vZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAgICAgICAg
ICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUs
IGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNF
VURPSUQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0
eWxlKGR5bmFtaWNQc2V1ZG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAg
ICAvLyBVcGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1
bGVzIGFycmF5LgotICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7Ci0g
ICAgICAgICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKLSAgICAg
ICAgICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RS
dWxlSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0
IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVs
ZSgmcnVsZURhdGEpOwotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
OjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5l
IGJvb2wgY29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIy
KQotewotICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOwotICAg
IHVuc2lnbmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOwotICAgIHJldHVybiAo
c3BlY2lmaWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3Np
dGlvbigpIDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6OnNvcnRNYXRjaGVkUnVsZXMoKQotewotICAgIHN0ZDo6c29ydChtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVS
dWxlcyk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3Vs
dCYgcmVzdWx0LCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKLXsKLSAgICBtYXRjaFVBUnVs
ZXMocmVzdWx0KTsKLQotICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgotICAg
IGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMo
cmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5p
bmcgZmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwu
Ci0gICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgIGFkZEVsZW1lbnRT
dHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0
aW9uQXR0cmlidXRlU3R5bGUoKSk7Ci0KLSAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9u
YWwgbWFwcGVkIGRlY2xhcmF0aW9ucy4KLSAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxs
cyBzaGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0g
ICAgICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUg
ZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCi0gICAgICAgIGFk
ZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+
YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIGlmICht
X3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBi
b29sIGlzQXV0bzsKLSAgICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbiA9IHRv
SFRNTEVsZW1lbnQobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFz
RGlyQXV0b0F0dHJpYnV0ZShpc0F1dG8pOwotICAgICAgICAgICAgaWYgKGlzQXV0bykKLSAgICAg
ICAgICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0g
TFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigp
KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0
aG9yIHNoZWV0cyBuZXh0LgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAg
ICAgICAgbWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVj
ayBvdXIgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlubGluZVN0eWxlKCkpIHsKLSAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0
YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCi0gICAgICAgIC8vIEZJ
WE1FOiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0
aCBjYWNoaW5nLgotICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgLy8gRklYTUU6IENv
bnN0aWZ5LgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUp
OwotICAgIH0KLQotI2lmIEVOQUJMRShTVkcpCi0gICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0
aW9uIG92ZXJyaWRlIHN0eWxlLgotICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9t
YXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQotICAgICAgICBhZGRFbGVtZW50
U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8q
IGlzQ2FjaGVhYmxlICovKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJv
cGVydGllcyk7Ci0jZW5kaWYKLX0KLQogYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZm
ZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0CiB7
CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsK
QEAgLTgwOCw5ICs0MjYsOCBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjppbml0RWxlbWVu
dChFCiAgICAgfQogfQogCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZv
clN0eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVl
c3QsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKK2lubGluZSB2b2lkIFN0eWxlUmVz
b2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxl
bWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZv
clN0eWxpbmcpCiB7Ci0gICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJlcXVl
c3Q7CiAgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKIAogICAgIGlm
IChlKSB7CkBAIC04MzIsNyArNDQ5LDYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3Rh
dGU6OmluaXRGbwogCiAgICAgbV9zdHlsZSA9IDA7CiAgICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9IDA7CiAgICAgbV9mb250RGlydHkgPSBmYWxz
ZTsKIH0KIApAQCAtOTAwLDE3ICs1MTYsOSBAQCBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hh
cmluZ0NhbmRpZGF0CiB7CiAgICAgaWYgKCFydWxlU2V0KQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwogCi0gICAgbV9zdGF0ZS5zZXRN
b2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5k
ZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmly
c3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1h
dGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKLSAgICBtX3N0YXRlLnNldE1vZGUoU2Vs
ZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0gICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1
bGVzKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRj
aGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJldHVybiB0cnVlOworICAgIEVsZW1lbnRSdWxlQ29s
bGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBtX3N0YXRlKTsKKyAgICByZXR1cm4gY29sbGVjdG9yLmhh
c0FueU1hdGNoaW5nUnVsZXMocnVsZVNldCk7CiB9CiAKIGJvb2wgU3R5bGVSZXNvbHZlcjo6Y2Fu
U2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0CkBAIC0x
MTc4LDI2ICs3ODYsNiBAQCBSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hhcmVk
CiAgICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKIH0KIAotdm9pZCBTdHls
ZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBNYXRj
aGluZ1VBUnVsZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZy
b20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZh
bHNlOwotICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21lZGl1bS0+bWVkaWFU
eXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0
czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHls
ZTsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAg
IC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBh
Z2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAg
IG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJr
c1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChp
biB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2gg
cnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50
KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQogc3RhdGljIHZvaWQgc2V0
U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdpbmF0aW9uTW9kZSwg
UmVuZGVyU3R5bGUqIHN0eWxlKQogewogICAgIGlmIChwYWdpbmF0aW9uTW9kZSA9PSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZCkKQEAgLTEzOTUsNyArOTgzLDcgQEAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gU3R5bGVSZXNvbHZlcjo6cwogCiAgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKICAg
ICBpbml0RWxlbWVudChlbGVtZW50KTsKLSAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRv
Y3VtZW50KCksIGVsZW1lbnQsIGRlZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JTdHls
aW5nKTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGVsZW1lbnQs
IGRlZmF1bHRQYXJlbnQsIHJlZ2lvbkZvclN0eWxpbmcpOwogICAgIGlmIChzaGFyaW5nQmVoYXZp
b3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Q
b2ludCgpKSB7CiAgICAgICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJl
ZFN0eWxlKCk7CiAgICAgICAgIGlmIChzaGFyZWRTdHlsZSkKQEAgLTE0MzcsMTMgKzEwMjUsMTYg
QEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cwogICAgIGlmIChuZWVk
c0NvbGxlY3Rpb24pCiAgICAgICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50
KCktPmlzVmlld1NvdXJjZSgpLCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwogCi0gICAgTWF0Y2hS
ZXN1bHQgbWF0Y2hSZXN1bHQ7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRo
aXMsIHN0YXRlKTsKKyAgICBjb2xsZWN0b3Iuc2V0UmVnaW9uRm9yU3R5bGluZyhyZWdpb25Gb3JT
dHlsaW5nKTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVtKG1fbWVkaXVtLmdldCgpKTsKKwogICAg
IGlmIChtYXRjaGluZ0JlaGF2aW9yID09IE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKQotICAgICAg
ICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1
bGVzKCk7CiAgICAgZWxzZQotICAgICAgICBtYXRjaEFsbFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRj
aGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKKyAgICAgICAgY29s
bGVjdG9yLm1hdGNoQWxsUnVsZXMobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIG1hdGNoaW5n
QmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOwogCi0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7CisgICAgYXBwbHlNYXRjaGVkUHJv
cGVydGllcyhjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpLCBlbGVtZW50KTsKIAogICAgIC8vIENs
ZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChh
bW9uZyBvdGhlciBmaXh1cHMpLgogICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCks
IHN0YXRlLnBhcmVudFN0eWxlKCksIGVsZW1lbnQpOwpAQCAtMTQ2MCw3ICsxMDUxLDcgQEAgUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cwogewogICAgIE1hdGNoUmVzdWx0
IHJlc3VsdDsKICAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYWRkTWF0
Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKyAgICAgICAg
cmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwogCiAg
ICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOwogCkBAIC0xNTg0LDcgKzExNzUsNyBAQCBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpwCiAKICAgICBpbml0RWxlbWVudChl
KTsKIAotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50
U3R5bGUsIHBzZXVkb1N0eWxlUmVxdWVzdCk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2
ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHlsZSk7CiAgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVy
U3R5bGU6OmNyZWF0ZSgpKTsKICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRl
LnBhcmVudFN0eWxlKCkpOwogCkBAIC0xNTkyLDIwICsxMTgzLDIyIEBAIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnAKICAgICAvLyB0aG9zZSBydWxlcy4KIAogICAgIC8v
IENoZWNrIFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hS
ZXN1bHQ7Ci0gICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKyAgICBFbGVtZW50UnVsZUNv
bGxlY3RvciBjb2xsZWN0b3IodGhpcywgc3RhdGUpOworICAgIGNvbGxlY3Rvci5zZXRQc2V1ZG9T
dHlsZVJlcXVlc3QocHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVt
KG1fbWVkaXVtLmdldCgpKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAKICAgICBp
ZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMo
bWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRjaFJlc3Vs
dCwgZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVc2VyUnVsZXMoZmFsc2UpOworICAg
ICAgICBjb2xsZWN0b3IubWF0Y2hBdXRob3JSdWxlcyhmYWxzZSk7CiAgICAgfQogCi0gICAgaWYg
KG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICBpZiAoY29sbGVj
dG9yLm1hdGNoZWRSZXN1bHQoKS5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCiAgICAgICAg
IHJldHVybiAwOwogCiAgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVkb1N0eWxl
UmVxdWVzdC5wc2V1ZG9JZCk7CiAKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVz
dWx0LCBlKTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbGxlY3Rvci5tYXRjaGVkUmVz
dWx0KCksIGUpOwogCiAgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkg
YW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCiAgICAgYWRqdXN0UmVu
ZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKQEAgLTE2
MjYsMTcgKzEyMTksMTIgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6
cwogICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKICAgICBtX3N0
YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKIAot
ICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0
IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgU3RyaW5n
IHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOwotICAgIAotICAgIE1hdGNoUmVzdWx0IHJlc3Vs
dDsKLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVm
YXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbWF0Y2hQYWdlUnVs
ZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2Up
OwotICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBh
Z2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1
bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAg
ICBQYWdlUnVsZUNvbGxlY3RvciBjb2xsZWN0b3IobV9zdGF0ZSwgbV9ydWxlU2V0cyk7CisgICAg
Y29sbGVjdG9yLm1hdGNoQWxsUGFnZVJ1bGVzKHBhZ2VJbmRleCk7CiAgICAgbV9zdGF0ZS5zZXRM
aW5lSGVpZ2h0VmFsdWUoMCk7CiAgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisKKyAg
ICBNYXRjaFJlc3VsdCYgcmVzdWx0ID0gY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKTsKICNpZiBF
TkFCTEUoQ1NTX1ZBUklBQkxFUykKICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxl
RGVmaW5pdGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKICNlbmRpZgpAQCAtMjA2Myw4OSArMTY1MSwzMSBA
QCBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpwCiAgICAgaWYgKCFlIHx8
ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKICAgICAgICAgcmV0dXJu
IDA7CiAKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVs
ZXMpOwotCiAgICAgaW5pdEVsZW1lbnQoZSk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNv
bHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCk7CisKKyAgICBFbGVtZW50UnVsZUNvbGxlY3RvciBj
b2xsZWN0b3IodGhpcywgbV9zdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldE1vZGUoU2VsZWN0b3JD
aGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOworICAgIGNvbGxlY3Rvci5zZXRQc2V1ZG9TdHlsZVJl
cXVlc3QoUHNldWRvU3R5bGVSZXF1ZXN0KHBzZXVkb0lkKSk7CisgICAgY29sbGVjdG9yLnNldE1l
ZGl1bShtX21lZGl1bS5nZXQoKSk7CiAKLSAgICBNYXRjaFJlc3VsdCBkdW1teTsKICAgICBpZiAo
cnVsZXNUb0luY2x1ZGUgJiBVQUFuZFVzZXJDU1NSdWxlcykgewogICAgICAgICAvLyBGaXJzdCB3
ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgotICAgICAgICBtYXRjaFVB
UnVsZXMoZHVtbXkpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hVQVJ1bGVzKCk7CiAKICAgICAg
ICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCiAgICAgICAgIGlmIChtX21hdGNo
QXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBy
dWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworICAgICAgICAgICAgY29sbGVjdG9yLm1h
dGNoVXNlclJ1bGVzKHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CiAgICAgfQogCiAg
ICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVkZSAmIEF1
dGhvckNTU1J1bGVzKSkgewotICAgICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVs
ZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisgICAgICAgIGNvbGxlY3Rvci5z
ZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykp
OwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgotICAgICAg
ICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMp
OwotCi0gICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOwotICAgIH0KLQot
ICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLQot
ICAgIHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOwotfQotCi1pbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENv
bnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVj
a2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQotewotICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNl
bGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGlu
Y2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxl
UmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBz
ZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUg
aGFzaC4KLSAgICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24n
dCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2UuCi0gICAgICAgIGlmIChydWxlRGF0YS5oYXNS
aWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVs
ZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhh
c011bHRpcGFydFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
ICAgIH0KLSAgICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2Vs
ZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQo
KSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZh
c3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7Ci0gICAgICAgIGlm
ICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVj
dG9yKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGVj
dG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsKKyAgICAgICAgY29sbGVjdG9yLm1hdGNoQXV0
aG9yUnVsZXMocnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKICAgICB9CiAKLSAgICAv
LyBTbG93IHBhdGguCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVu
dCgpLCBzdGF0ZS5tb2RlKCkpOwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2lu
Z0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNl
bGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5lbGVtZW50
U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwotICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKLSAgICBj
b250ZXh0LnBzZXVkb0lkID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7Ci0g
ICAgY29udGV4dC5zY3JvbGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxi
YXI7Ci0gICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2
aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0
b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJz
YWxTdHJhdGVneSgpKTsKLSAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rv
ck1hdGNoZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUucHNldWRvU3R5
bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1
ZXN0KCkucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2Vs
ZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25F
bGVtZW50KQotewotICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNr
ZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5tb2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0
b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkg
ewotICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVj
dG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6Vmlz
aXRlZE1hdGNoRGlzYWJsZWQpOwotICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRv
ID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JD
aGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxT
dHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4g
Y29sbGVjdG9yLm1hdGNoZWRSdWxlTGlzdCgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCkBAIC0yNDI0LDg2ICsxOTU0LDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjphcHBs
eU1hdGNoZWRQcm9wZXJ0aQogICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKIH0K
IAotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFn
ZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2VsZWN0
b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQs
IFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0
IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1hdGNo
UGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlz
TGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdlUnVs
ZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KG1h
dGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBh
Z2VSdWxlcyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxl
cy5zaXplKCk7IGkrKykKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRj
aGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1Bh
Z2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlz
TGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0g
ICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVu
dDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKGNv
bXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5h
bWUoKTsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1l
ICE9IHBhZ2VOYW1lKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQot
Ci0gICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQt
PnBzZXVkb1R5cGUoKTsKLSAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQ
c2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBl
ID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAgICAg
ICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlz
Rmlyc3RQYWdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMs
IGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJv
b2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVsZVBh
Z2UqIHJ1bGUgPSBydWxlc1tpXTsKLQotICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29t
cG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5h
bWUpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFz
IG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAg
ICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRj
aGVkIHJ1bGVzLgotICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0KLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17
Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlzRmly
c3RQYWdlTGVmdCA9IHRydWU7Ci0KLSAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFn
ZUxlZnQgPyAxIDogMCkpICUgMjsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFn
ZShpbnQgcGFnZUluZGV4KSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNl
ZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmly
c3QgcGFnZS4KLSAgICByZXR1cm4gKCFwYWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVSZXNv
bHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBGSVhN
RTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0dXJu
ICIiOwotfQotCiB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1By
b3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQogewogICAg
IGluaXRFbGVtZW50KDApOwpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCShyZXZp
c2lvbiAxNDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKICNp
bmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIKICNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgor
I2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAiU3R5bGVJ
bmhlcml0ZWREYXRhLmgiCiAjaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCiAjaW5jbHVk
ZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCkBAIC0xNTYsMTIgKzE1NywxMCBAQCBwdWJsaWM6
CiAgICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNr
ZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNr
ZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQogICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKICAg
ICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAgICAgLCBz
Y29wZShzY29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5k
YXJ5KSB7IH0KKyAgICAgICAgLCBzY29wZShzY29wZSkgeyB9CiAgICAgY29uc3QgUnVsZVNldCog
cnVsZVNldDsKICAgICBjb25zdCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzOwogICAgIGNvbnN0IENv
bnRhaW5lck5vZGUqIHNjb3BlOwotICAgIGNvbnN0IFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JB
dEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeTsKIH07CiAKIC8vIFRoaXMgY2xhc3Mgc2VsZWN0
cyBhIFJlbmRlclN0eWxlIGZvciBhIGdpdmVuIGVsZW1lbnQgYmFzZWQgb24gYSBjb2xsZWN0aW9u
IG9mIHN0eWxlc2hlZXRzLgpAQCAtMjA3LDYgKzIwNiw3IEBAIHB1YmxpYzoKIAogICAgIERvY3Vt
ZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQogICAgIGNvbnN0
IERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsg
fQorICAgIFNlbGVjdG9yRmlsdGVyJiBzZWxlY3RvckZpbHRlcigpIHsgcmV0dXJuIG1fc2VsZWN0
b3JGaWx0ZXI7IH0KIAogI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1df
RE9NKQogICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCkBAIC0z
MjUsMTQgKzMyNSw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMo
KTsKIAotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0
IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZh
bWlseSBoYXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hh
bmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLSAgICB2b2lkIGNo
ZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7
Ci0gICAgdm9pZCBjaGVja0ZvclRleHRTaXplQWRqdXN0KCk7Ci0KLSAgICB2b2lkIGFkanVzdFJl
bmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUsIEVsZW1lbnQqKTsKLQogICAgIHN0cnVjdCBSdWxlUmFuZ2UgewogICAgICAgICBSdWxl
UmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxl
SW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQog
ICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OwpAQCAtMzc0LDMwICszNjYsMjIgQEAgcHJpdmF0
ZToKICAgICAgICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7CiAgICAgICAg
IE1hdGNoUmFuZ2VzIHJhbmdlczsKICAgICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKKworICAgICAg
ICB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3Bl
cnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JD
aGVja2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxp
c3ROb25lKTsKICAgICB9OwogCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMo
TWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1
bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hB
bGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAg
dm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQ
cm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKK3ByaXZhdGU6CisgICAgLy8g
VGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0
cyB0aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gK
KyAgICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSk7CisgICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVy
U3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3JUZXh0
U2l6ZUFkanVzdCgpOwogCi0gICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9v
bCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVz
dWx0Jik7Ci0gICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7Ci0g
ICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcyk7Ci0gICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3Vs
dCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0
Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLQotICAgIHZvaWQgY29sbGVjdE1h
dGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFu
Z2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8
UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAgdm9pZCBh
ZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlLCBFbGVtZW50Kik7CiAKICAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihj
b25zdCBSdWxlRGF0YSYpIGNvbnN0OwotICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOwotICAg
IHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CiAKLSAgICBi
b29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2Nv
cGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxl
Y3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9u
U2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdp
b25FbGVtZW50KTsKICAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hS
ZXN1bHQmLCBjb25zdCBFbGVtZW50Kik7CisKICAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNz
IHsKICNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9u
cywKQEAgLTQ0NiwxMiArNDMwLDkgQEAgcHVibGljOgogICAgICAgICAsIG1fcGFyZW50U3R5bGUo
MCkKICAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3JlZ2lvbkZv
clN0eWxpbmcoMCkKLSAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQotICAgICAgICAs
IG1fcHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKQogICAgICAgICAsIG1fZWxlbWVudExpbmtT
dGF0ZShOb3RJbnNpZGVMaW5rKQogICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBv
aW50KGZhbHNlKQogICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNl
KQotICAgICAgICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQogICAg
ICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCiAgICAgICAgICwgbV9h
cHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQogI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKQEAgLTQ2NCw3ICs0NDUsNyBAQCBwdWJsaWM6CiAKICAgICBwdWJsaWM6CiAgICAgICAg
IHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOwotICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJl
c29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwg
Y29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyks
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lkIGluaXRG
b3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlID0gMCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CiAgICAgICAgIHZv
aWQgY2xlYXIoKTsKIAogICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVy
biBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KQEAgLTQ3NCwyNSArNDU1LDE3IEBAIHB1YmxpYzoK
ICAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQo
KTsgfQogICAgICAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVy
biBtX3N0eWxlLnJlbGVhc2UoKTsgfQogCi0gICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1
cmVSdWxlTGlzdCgpOwotICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxp
c3QoKSB7IHJldHVybiBtX3J1bGVMaXN0LnJlbGVhc2UoKTsgfQotCiAgICAgICAgIGNvbnN0IENv
bnRhaW5lck5vZGUqIHBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0K
ICAgICAgICAgdm9pZCBzZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsg
bV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOyB9CiAgICAgICAgIFJlbmRlclN0eWxlKiBwYXJl
bnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KICAgICAgICAgUmVuZGVy
U3R5bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5
bGU7IH0KIAogICAgICAgICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBj
b25zdCB7IHJldHVybiBtX3JlZ2lvbkZvclN0eWxpbmc7IH0KLSAgICAgICAgdm9pZCBzZXRTYW1l
T3JpZ2luT25seShib29sIGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlz
U2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3Qg
eyByZXR1cm4gbV9zYW1lT3JpZ2luT25seTsgfQotICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVS
ZXF1ZXN0OyB9CiAgICAgICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7
IHJldHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KICAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRv
SW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Q
b2ludDsgfQogICAgICAgICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29s
IGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVk
OyB9CiAgICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KLSAgICAgICAgdm9pZCBzZXRN
b2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAg
ICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0K
LSAgICAgICAgCisKICAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUo
Ym9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsg
fQogICAgICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBp
c0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0K
ICAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVy
biBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsgfQpAQCAtNTI2LDkgKzQ5OSw4IEBAIHB1
YmxpYzoKICAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9k
ZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7
IH0KICAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRP
cmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0T3JpZW50YXRpb24o
dGV4dE9yaWVudGF0aW9uKTsgfQogCi0gICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMy
PiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRjaGVkUnVsZXM7IH0KLSAgICAgICAgdm9p
ZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSogcnVsZSkgeyBtX21hdGNoZWRSdWxlcy5h
cHBlbmQocnVsZSk7IH0KLSAgICAgICAgCisgICAgICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCkg
Y29uc3QgeyByZXR1cm4gbV9lbGVtZW50ICYmIG1fZWxlbWVudC0+aXNTVkdFbGVtZW50KCk7IH0K
KwogICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0
IGVhc2llciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgogICAgICAgICAvLyB2YXJpYWJsZXMgYXJl
IHB1YmxpYy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCkBAIC01Mzks
MjQgKzUxMSwxNiBAQCBwdWJsaWM6CiAgICAgICAgIENvbnRhaW5lck5vZGUqIG1fcGFyZW50Tm9k
ZTsKICAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7CiAgICAgICAgIFJlbmRlclN0
eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAgICAgICBSZW5kZXJSZWdpb24q
IG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5OwotICAg
ICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7CiAKKyAgICAgICAg
Ly8gUmVxdWlyZWQgdG8gQVNTRVJUIGluIGFwcGx5UHJvcGVydGllcy4KKyAgICAgICAgUmVuZGVy
UmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7CisgICAgICAgIAogICAgICAgICBFSW5zaWRlTGlu
ayBtX2VsZW1lbnRMaW5rU3RhdGU7CiAKICAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludDsKIAogICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVz
OwogCi0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7Ci0KLSAgICAgICAgLy8g
QSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxl
bWVudCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBz
b3J0aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVs
ZXM7Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKLQogICAg
ICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOwogICAgICAgICBib29sIG1f
YXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsKIApAQCAtNjk1LDYgKzY1OSwyMSBAQCBp
bmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvCiAgICAgcmV0dXJuIG1fcnVs
ZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKIH0K
IAoraW5saW5lIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVn
aW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgaWYgKCFyZWdpb25T
ZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
U2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihyZWdpb25FbGVtZW50LT5kb2N1bWVudCgp
LCBTZWxlY3RvckNoZWNrZXI6OlF1ZXJ5aW5nUnVsZXMpOworICAgIGZvciAoY29uc3QgQ1NTU2Vs
ZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChz
KSkgeworICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNl
bGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6
VmlzaXRlZE1hdGNoRGlzYWJsZWQpOworICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNl
dWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0
b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJz
YWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIFN0eWxlUmVzb2x2ZXJfaApJbmRleDogU291
cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwCShyZXZpc2lv
biAxNDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NTgsMTEgKzk1OCwxMSBAQCBQYXNzUmVmUHRyPFR5cGVC
dWlsZGVyOjpDU1M6OlNlbGVjdG9yUHJvCiAgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CiB9
CiAKLXZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OndpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiBydWxl
LCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6
d2lsbE1hdGNoUnVsZShTdHlsZVJ1bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGlu
c3BlY3RvckNTU09NV3JhcHBlcnMsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxl
U2hlZXRDb2xsZWN0aW9uKQogewogLy8gICAgcHJpbnRmKCJJbnNwZWN0b3JDU1NBZ2VudDo6d2ls
bE1hdGNoUnVsZSAlc1xuIiwgcnVsZS0+c2VsZWN0b3JMaXN0KCkuc2VsZWN0b3JzVGV4dCgpLnV0
ZjgoKS5kYXRhKCkpOwogICAgIGlmIChtX2N1cnJlbnRTZWxlY3RvclByb2ZpbGUpCi0gICAgICAg
IG1fY3VycmVudFNlbGVjdG9yUHJvZmlsZS0+c3RhcnRTZWxlY3RvcihzdHlsZVJlc29sdmVyLT5p
bnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkuZ2V0V3JhcHBlckZvclJ1bGVJblNoZWV0cyhydWxlLCBz
dHlsZVJlc29sdmVyLT5kb2N1bWVudCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKSk7CisgICAg
ICAgIG1fY3VycmVudFNlbGVjdG9yUHJvZmlsZS0+c3RhcnRTZWxlY3RvcihpbnNwZWN0b3JDU1NP
TVdyYXBwZXJzLmdldFdyYXBwZXJGb3JSdWxlSW5TaGVldHMocnVsZSwgc3R5bGVTaGVldENvbGxl
Y3Rpb24pKTsKIH0KIAogdm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6ZGlkTWF0Y2hSdWxlKGJvb2wg
bWF0Y2hlZCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2Vu
dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NB
Z2VudC5oCShyZXZpc2lvbiAxNDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQ1NTQWdlbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNyArNDcsOSBAQCBjbGFzcyBD
U1NTdHlsZURlY2xhcmF0aW9uOwogY2xhc3MgQ1NTU3R5bGVSdWxlOwogY2xhc3MgQ1NTU3R5bGVT
aGVldDsKIGNsYXNzIERvY3VtZW50OworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlv
bjsKIGNsYXNzIEVsZW1lbnQ7CitjbGFzcyBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwogY2xhc3Mg
SW5zcGVjdG9yRnJvbnRlbmQ7CiBjbGFzcyBJbnN0cnVtZW50aW5nQWdlbnRzOwogY2xhc3MgTmFt
ZU5vZGVNYXA7CkBAIC0xMjUsNyArMTI3LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBz
dG9wU2VsZWN0b3JQcm9maWxlcihFcnJvclN0cmluZyosIFJlZlB0cjxUeXBlQnVpbGRlcjo6Q1NT
OjpTZWxlY3RvclByb2ZpbGU+Jik7CiAKICAgICBQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6
OlNlbGVjdG9yUHJvZmlsZT4gc3RvcFNlbGVjdG9yUHJvZmlsZXJJbXBsKEVycm9yU3RyaW5nKiwg
Ym9vbCBuZWVkUHJvZmlsZSk7Ci0gICAgdm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSosIFN0
eWxlUmVzb2x2ZXIqKTsKKyAgICB2b2lkIHdpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiwgSW5zcGVj
dG9yQ1NTT01XcmFwcGVycyYsIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsKICAgICB2
b2lkIGRpZE1hdGNoUnVsZShib29sKTsKICAgICB2b2lkIHdpbGxQcm9jZXNzUnVsZShTdHlsZVJ1
bGUqLCBTdHlsZVJlc29sdmVyKik7CiAgICAgdm9pZCBkaWRQcm9jZXNzUnVsZSgpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRh
dGlvbi5jcHAJKHJldmlzaW9uIDE0NTA1MykKKysrIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OTAsMTEgKzU5
MCwxMSBAQCB2b2lkIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkU2NoZWR1CiAgICAgICAg
IHJlc291cmNlQWdlbnQtPmRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKGRvY3VtZW50KTsK
IH0KIAotSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGlu
Z0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQor
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50
cywgU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NP
TVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzaGVldENvbGxlY3Rpb24p
CiB7CiAgICAgSW5zcGVjdG9yQ1NTQWdlbnQqIGNzc0FnZW50ID0gaW5zdHJ1bWVudGluZ0FnZW50
cy0+aW5zcGVjdG9yQ1NTQWdlbnQoKTsKICAgICBpZiAoY3NzQWdlbnQpIHsKLSAgICAgICAgY3Nz
QWdlbnQtPndpbGxNYXRjaFJ1bGUocnVsZSwgc3R5bGVSZXNvbHZlcik7CisgICAgICAgIGNzc0Fn
ZW50LT53aWxsTWF0Y2hSdWxlKHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIHNoZWV0Q29s
bGVjdGlvbik7CiAgICAgICAgIHJldHVybiBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUo
aW5zdHJ1bWVudGluZ0FnZW50cywgMSk7CiAgICAgfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCShyZXZpc2lvbiAx
NDUwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTYxLDEwICs2MSwxMiBAQCBjbGFzcyBEb2N1bWVudDsK
IGNsYXNzIEVsZW1lbnQ7CiBjbGFzcyBFdmVudENvbnRleHQ7CiBjbGFzcyBEb2N1bWVudExvYWRl
cjsKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBEZXZpY2VPcmll
bnRhdGlvbkRhdGE7CiBjbGFzcyBHZW9sb2NhdGlvblBvc2l0aW9uOwogY2xhc3MgR3JhcGhpY3ND
b250ZXh0OwogY2xhc3MgSW5zcGVjdG9yQ1NTQWdlbnQ7CitjbGFzcyBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzOwogY2xhc3MgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOwogY2xhc3MgSW5zcGVjdG9y
VGltZWxpbmVBZ2VudDsKIGNsYXNzIEluc3RydW1lbnRpbmdBZ2VudHM7CkBAIC0xNzMsNyArMTc1
LDcgQEAgcHVibGljOgogICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUg
d2lsbFJlY2FsY3VsYXRlU3R5bGUoRG9jdW1lbnQqKTsKICAgICBzdGF0aWMgdm9pZCBkaWRSZWNh
bGN1bGF0ZVN0eWxlKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwogICAg
IHN0YXRpYyB2b2lkIGRpZFNjaGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKERvY3VtZW50Kik7Ci0g
ICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlKERv
Y3VtZW50KiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOworICAgIHN0YXRpYyBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZShEb2N1bWVudCosIFN0eWxlUnVs
ZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Kik7CiAgICAgc3RhdGljIHZvaWQgZGlkTWF0Y2hSdWxlKGNvbnN0IEluc3BlY3Rvckluc3RydW1l
bnRhdGlvbkNvb2tpZSYsIGJvb2wgbWF0Y2hlZCk7CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbkNvb2tpZSB3aWxsUHJvY2Vzc1J1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBT
dHlsZVJlc29sdmVyKik7CiAgICAgc3RhdGljIHZvaWQgZGlkUHJvY2Vzc1J1bGUoY29uc3QgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJik7CkBAIC0zNzMsNyArMzc1LDcgQEAgcHJpdmF0
ZToKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxSZWNhbGN1
bGF0ZVN0eWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiwgRnJhbWUqKTsKICAgICBzdGF0aWMg
dm9pZCBkaWRSZWNhbGN1bGF0ZVN0eWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUmKTsKICAgICBzdGF0aWMgdm9pZCBkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlv
bkltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIERvY3VtZW50Kik7Ci0gICAgc3RhdGljIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlSW1wbChJbnN0cnVtZW50aW5n
QWdlbnRzKiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOworICAgIHN0YXRpYyBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0Fn
ZW50cyosIFN0eWxlUnVsZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uKik7CiAgICAgc3RhdGljIHZvaWQgZGlkTWF0Y2hSdWxlSW1wbChjb25z
dCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmLCBib29sIG1hdGNoZWQpOwogICAgIHN0
YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbFByb2Nlc3NSdWxlSW1wbChJ
bnN0cnVtZW50aW5nQWdlbnRzKiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAgIHN0
YXRpYyB2b2lkIGRpZFByb2Nlc3NSdWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUmKTsKQEAgLTExNzUsMTYgKzExNzcsMTcgQEAgaW5saW5lIHZvaWQgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjpkaQogI2VuZGlmCiB9CiAKLWlubGluZSBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKERv
Y3VtZW50KiBkb2N1bWVudCwgU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJl
c29sdmVyKQoraW5saW5lIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBTdHlsZVJ1
bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMs
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewog
I2lmIEVOQUJMRShJTlNQRUNUT1IpCiAgICAgRkFTVF9SRVRVUk5fSUZfTk9fRlJPTlRFTkRTKElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSgpKTsKICAgICBpZiAoSW5zdHJ1bWVudGluZ0Fn
ZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cyA9IGluc3RydW1lbnRpbmdBZ2VudHNGb3JEb2N1bWVu
dChkb2N1bWVudCkpCi0gICAgICAgIHJldHVybiB3aWxsTWF0Y2hSdWxlSW1wbChpbnN0cnVtZW50
aW5nQWdlbnRzLCBydWxlLCBzdHlsZVJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIHdpbGxNYXRj
aFJ1bGVJbXBsKGluc3RydW1lbnRpbmdBZ2VudHMsIHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBl
cnMsIHN0eWxlU2hlZXRDb2xsZWN0aW9uKTsKICNlbHNlCiAgICAgVU5VU0VEX1BBUkFNKGRvY3Vt
ZW50KTsKICAgICBVTlVTRURfUEFSQU0ocnVsZSk7Ci0gICAgVU5VU0VEX1BBUkFNKHN0eWxlUmVz
b2x2ZXIpOworICAgIFVOVVNFRF9QQVJBTShpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBV
TlVTRURfUEFSQU0oc3R5bGVTaGVldENvbGxlY3Rpb24pOwogI2VuZGlmCiAgICAgcmV0dXJuIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>192172</attachid>
            <date>2013-03-08 00:57:30 -0800</date>
            <delta_ts>2013-03-08 02:20:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130308175332.patch</filename>
            <type>text/plain</type>
            <size>1103249</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTE5MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBAQAorMjAxMy0wMy0wNyAgVGFrYXNo
aSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5nXSBJ
bXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQW50dGkgS29pdmlz
dG8uCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1lbnQg
YW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4gY2xh
c3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAgYSBz
dHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3RvcmluZy4K
KworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3Qu
YW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAg
ICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNzcy9D
U1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFuZCBQ
YWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1
ZXN0cyk6CisgICAgICAgIFNpbmNlIGJlaGF2aW9yQXRCb3VuZGFyeSBpcyBhIHN0YXRlIG93bmVk
IGJ5IEVsZW1lbnRSdWxlQ29sbGVjdG9yLAorICAgICAgICByZW1vdmVkIGZyb20gaGVyZS4KKyAg
ICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5oOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93
RGlzdHJpYnV0ZWRSdWxlczo6aXNFbXB0eSk6CisgICAgICAgIEFkZGVkIHRvIHF1aWNrbHkgY2hl
Y2sgd2hldGhlciB0aGVyZSBleGlzdCBhbnkgU2hhZG93RGlzdHJpYnV0ZWRSdWxlcworICAgICAg
ICBvciBub3QuCisgICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDogQ29waWVk
IGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJl
c3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1
bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRj
aGVkUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJN
YXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmVu
c3VyZVJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxl
Q29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29w
ZWRBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
bWF0Y2hIb3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoU2hhZG93RGlzdHJpYnV0ZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxl
bWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6cnVsZU1hdGNoZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyk6CisgICAgICAg
IE1vdmVkIHRoZXNlIG1ldGhvZHMgZnJvbSBTdHlsZVJlc29sdmVyIHRvIHRoaXMgY2xhc3MuCisg
ICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxl
cyk6CisgICAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBn
aXZlbiBlbGVtZW50IGNhbiBzaGFyZQorICAgICAgICBhIGNhY2hlLgorICAgICAgICAqIGNzcy9F
bGVtZW50UnVsZUNvbGxlY3Rvci5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5
bGVSZXNvbHZlci5oLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBVc2Ugc3R5
bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFibGVzLCBp
LmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NTT01XcmFw
cGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChFbGVtZW50
UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNl
dWRvU3R5bGVSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpzZXRTYW1lT3JpZ2luT25seSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxl
Y3Rvcjo6c2V0UmVnaW9uRm9yU3R5bGluZyk6CisgICAgICAgIE1vZGUsIFNhbWVPcmlnaW5Pbmx5
LCBSZWdpb25Gb3JTdHlsaW5nIGFyZSBvbmx5IHVzZWQgd2hpbGUgY29sbGVjdGluZworICAgICAg
ICBtYXRjaGVkIHJ1bGVzLgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnNldE1lZGl1bSk6CisgICAgICAgIE5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0IHN0eWxlc2hl
ZXQgc2hvdWxkIGJlIGxvb2tlZCB1cC4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpkb2N1bWVudCk6CisgICAgICAgICogY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcDog
Q29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHls
ZVJlc29sdmVyLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VS
dWxlQ29sbGVjdG9yOjpQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChQYWdlUnVsZUNvbGxl
Y3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3Vs
dCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5
bGVSZXNvbHZlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmlu
Z0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2
ZXI6OnN0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpz
dHlsZUZvcktleWZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnBzZXVk
b1N0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpzdHls
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6YXBwbHlN
YXRjaGVkUHJvcGVydGllcyk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGNoUmVxdWVzdDo6TWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgUmVtb3Zl
ZCBiZWhhdmlvckF0Qm91bmRhcnkuIEluc3RlYWQsIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGhhdmUg
dGhlCisgICAgICAgIHN0YXRlLgorICAgICAgICAoTWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAgICAgICAgQWRkZWQgdG8g
b2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVjdG9yJ3MgY29uc3RydWN0
b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1hdGNoUmVzdWx0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIFRv
IHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcywgbmVlZCB0byBr
ZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAgKFN0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpyZWdpb25Gb3JTdHlsaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjp1c2VTVkdab29tUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZCk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgor
ICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSk6CisgICAgICAgIFJlbW92ZWQg
U3R5bGVSZXNvbHZlciBmcm9tIGl0cyBwYXJhbWV0ZXIgbGlzdC4gSW5zdGVhZCwgYWRkZWQKKyAg
ICAgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBhbmQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaDoKKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9yQ1NTQWdlbnQpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwOgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJ
bXBsKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmg6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEluc3BlY3Rvckluc3RydW1lbnRhdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUp
OgorCiAyMDEzLTAzLTA4ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNv
bT4KIAogICAgICAgICBbQmxhY2tCZXJyeV0gVXNlIE93blB0ciBmb3IgQ3JlZGVudGlhbEJhY2tp
bmdTdG9yZSBtZW1iZXJzCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24gMTQ1MTkw
KQorKysgU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTEw
NzAsNiArMTA3MCw3IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBjc3MvQ1NTVmFsdWVQb29s
LmNwcAogICAgIGNzcy9ET01XaW5kb3dDU1MuY3BwCiAgICAgY3NzL0RvY3VtZW50UnVsZVNldHMu
Y3BwCisgICAgY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAogICAgIGNzcy9Gb250RmVhdHVy
ZVZhbHVlLmNwcAogICAgIGNzcy9Gb250VmFsdWUuY3BwCiAgICAgY3NzL0luc3BlY3RvckNTU09N
V3JhcHBlcnMuY3BwCkBAIC0xMDgyLDYgKzEwODMsNyBAQCBzZXQoV2ViQ29yZV9TT1VSQ0VTCiAg
ICAgY3NzL01lZGlhUXVlcnlMaXN0LmNwcAogICAgIGNzcy9NZWRpYVF1ZXJ5TGlzdExpc3RlbmVy
LmNwcAogICAgIGNzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5jcHAKKyAgICBjc3MvUGFnZVJ1bGVDb2xs
ZWN0b3IuY3BwCiAgICAgY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAKICAg
ICBjc3MvUkdCQ29sb3IuY3BwCiAgICAgY3NzL1J1bGVGZWF0dXJlLmgKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
R05VbWFrZWZpbGUubGlzdC5hbQkocmV2aXNpb24gMTQ1MTkwKQorKysgU291cmNlL1dlYkNvcmUv
R05VbWFrZWZpbGUubGlzdC5hbQkod29ya2luZyBjb3B5KQpAQCAtMjY2MCw2ICsyNjYwLDggQEAg
d2ViY29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRGFzaGJvYXJkUmVnaW9u
LmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcCBcCiAJU291cmNl
L1dlYkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuaCBcCisJU291cmNlL1dlYkNvcmUvY3NzL0Vs
ZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxl
Q29sbGVjdG9yLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Gb250RmVhdHVyZVZhbHVlLmNwcCBc
CiAJU291cmNlL1dlYkNvcmUvY3NzL0ZvbnRGZWF0dXJlVmFsdWUuaCBcCiAJU291cmNlL1dlYkNv
cmUvY3NzL0ZvbnRWYWx1ZS5jcHAgXApAQCAtMjY4NCw2ICsyNjg2LDggQEAgd2ViY29yZV9zb3Vy
Y2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5oIFwK
IAlTb3VyY2UvV2ViQ29yZS9jc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwIFwKIAlTb3VyY2UvV2Vi
Q29yZS9jc3MvTWVkaWFRdWVyeU1hdGNoZXIuaCBcCisJU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VS
dWxlQ29sbGVjdG9yLmNwcCBcCisJU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9y
LmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9QYWlyLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Q
cm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3Mv
UHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmggXApJbmRleDogU291cmNlL1dlYkNvcmUv
VGFyZ2V0LnByaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCShyZXZp
c2lvbiAxNDUxOTApCisrKyBTb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCSh3b3JraW5nIGNvcHkp
CkBAIC0zMDUsNiArMzA1LDcgQEAgU09VUkNFUyArPSBcCiAgICAgY3NzL0NTU1ZhbHVlUG9vbC5j
cHAgXAogICAgIGNzcy9ET01XaW5kb3dDU1MuY3BwIFwKICAgICBjc3MvRG9jdW1lbnRSdWxlU2V0
cy5jcHAgXAorICAgIGNzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgXAogICAgIGNzcy9Gb250
RmVhdHVyZVZhbHVlLmNwcCBcCiAgICAgY3NzL0ZvbnRWYWx1ZS5jcHAgXAogICAgIGNzcy9JbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzLmNwcCBcCkBAIC0zMTcsNiArMzE4LDcgQEAgU09VUkNFUyArPSBc
CiAgICAgY3NzL01lZGlhUXVlcnlMaXN0LmNwcCBcCiAgICAgY3NzL01lZGlhUXVlcnlMaXN0TGlz
dGVuZXIuY3BwIFwKICAgICBjc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwIFwKKyAgICBjc3MvUGFn
ZVJ1bGVDb2xsZWN0b3IuY3BwIFwKICAgICBjc3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0
aW9uLmNwcCBcCiAgICAgY3NzL1JHQkNvbG9yLmNwcCBcCiAgICAgY3NzL1J1bGVGZWF0dXJlLmNw
cCBcCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiAxNDUxOTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTE2NTEsNiArMTY1MSw4IEBACiAg
ICAgICAgICAgICAnY3NzL0Rhc2hib2FyZFJlZ2lvbi5oJywKICAgICAgICAgICAgICdjc3MvRG9j
dW1lbnRSdWxlU2V0cy5jcHAnLAogICAgICAgICAgICAgJ2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmgn
LAorICAgICAgICAgICAgJ2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAnLAorICAgICAgICAg
ICAgJ2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oJywKICAgICAgICAgICAgICdjc3MvRm9udEZl
YXR1cmVWYWx1ZS5jcHAnLAogICAgICAgICAgICAgJ2Nzcy9Gb250RmVhdHVyZVZhbHVlLmgnLAog
ICAgICAgICAgICAgJ2Nzcy9Gb250VmFsdWUuY3BwJywKQEAgLTE2NzQsNiArMTY3Niw4IEBACiAg
ICAgICAgICAgICAnY3NzL01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuaCcsCiAgICAgICAgICAgICAn
Y3NzL01lZGlhUXVlcnlNYXRjaGVyLmNwcCcsCiAgICAgICAgICAgICAnY3NzL01lZGlhUXVlcnlN
YXRjaGVyLmgnLAorICAgICAgICAgICAgJ2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAnLAorICAg
ICAgICAgICAgJ2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oJywKICAgICAgICAgICAgICdjc3MvUHJv
cGVydHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCcsCiAgICAgICAgICAgICAnY3NzL1Byb3Bl
cnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5oJywKICAgICAgICAgICAgICdjc3MvUkdCQ29sb3Iu
Y3BwJywKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oJKHJldmlzaW9uIDE0NTE5MCkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNjU1MCw2ICs2NTUw
LDEwIEBACiAJCUZCRDZBRjhCMTVFRjI1RTUwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5jcHAg
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkQ2QUY4NjE1
RUYyMUQ0MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMuY3BwICovOyB9OwogCQlGQkQ2QUY4QzE1
RUYyNjA0MDA4QjcxMTAgLyogQmFzaWNTaGFwZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCRDZBRjgzMTVFRjIxQTMwMDhCNzExMCAvKiBCYXNpY1No
YXBlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJ
CUZCRDZBRjhEMTVFRjI2MEEwMDhCNzExMCAvKiBCYXNpY1NoYXBlcy5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkQ2QUY4MjE1RUYyMUEzMDA4Qjcx
MTAgLyogQmFzaWNTaGFwZXMuY3BwICovOyB9OworCQlGQkRCNjE5QjE2RDYwMzJBMDBCQjMzOTQg
LyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRkJEQjYxOUExNkQ2MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxl
Q29sbGVjdG9yLmNwcCAqLzsgfTsKKwkJRkJEQjYxOUQxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VS
dWxlQ29sbGVjdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEZCREI2MTlDMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAg
Ki87IH07CisJCUZCREI2MTlGMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rv
ci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJEQjYx
OUUxNkQ2MDM2NTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggKi87IH07CisJCUZC
REI2MUExMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJEQjYxQTAxNkQ2MDM3RTAwQkIz
Mzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggKi87IH07CiAJCUZCRjg5MDQ1MTY5RTlGMUYwMDUy
RDg2RSAvKiBDU1NHcm91cGluZ1J1bGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRkJGODkwNDQxNjlFOUYxRjAwNTJEODZFIC8qIENTU0dyb3VwaW5n
UnVsZS5jcHAgKi87IH07CiAJCUZDNTREMDU3MTZBNzY3MzEwMDU3NUU0RCAvKiBDU1NTdXBwb3J0
c1J1bGUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZD
NjNCREIxMTY3QUFCQUMwMEY5MzgwRiAvKiBDU1NTdXBwb3J0c1J1bGUuaCAqLzsgfTsKIAkJRkM1
NEQwNTgxNkE3Njc2RTAwNTc1RTREIC8qIEpTQ1NTU3VwcG9ydHNSdWxlLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQzg0ODAyRTE2N0FCNDQ0MDA4Q0Qx
MDAgLyogSlNDU1NTdXBwb3J0c1J1bGUuaCAqLzsgfTsKQEAgLTE0MzAwLDYgKzE0MzA0LDEwIEBA
CiAJCUZCRDZBRjg1MTVFRjIxRDQwMDhCNzExMCAvKiBCYXNpY1NoYXBlRnVuY3Rpb25zLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJhc2ljU2hhcGVGdW5jdGlvbnMuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkJENkFGODYxNUVGMjFENDAwOEI3MTEwIC8qIENT
U0Jhc2ljU2hhcGVzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENT
U0Jhc2ljU2hhcGVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkJENkFGODcx
NUVGMjFENDAwOEI3MTEwIC8qIENTU0Jhc2ljU2hhcGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IENTU0Jhc2ljU2hhcGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUZCREI2MTlBMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBFbGVtZW50UnVsZUNvbGxlY3Rv
ci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZCREI2MTlDMTZENjAzNDYwMEJC
MzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBQYWdlUnVsZUNvbGxlY3Rvci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUZCREI2MTlFMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBFbGVtZW50UnVsZUNvbGxlY3Rvci5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQkRCNjFBMDE2RDYwMzdFMDBCQjMzOTQg
LyogUGFnZVJ1bGVDb2xsZWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
UGFnZVJ1bGVDb2xsZWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkJGODkw
NDQxNjlFOUYxRjAwNTJEODZFIC8qIENTU0dyb3VwaW5nUnVsZS5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NHcm91cGluZ1J1bGUuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlGQzYzQkRCMDE2N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNS
dWxlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENTU1N1cHBvcnRz
UnVsZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZDNjNCREIxMTY3QUFCQUMw
MEY5MzgwRiAvKiBDU1NTdXBwb3J0c1J1bGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gQ1NTU3VwcG9ydHNSdWxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0y
MjEyNiw2ICsyMjEzNCw4IEBACiAJCQkJRkM5QTBGNzExNjQwOTRDRjAwM0Q2QjhEIC8qIERPTVdp
bmRvd0NTUy5jcHAgKi8sCiAJCQkJRkM5QTBGNzIxNjQwOTRDRjAwM0Q2QjhEIC8qIERPTVdpbmRv
d0NTUy5oICovLAogCQkJCUZDOUEwRjczMTY0MDk0Q0YwMDNENkI4RCAvKiBET01XaW5kb3dDU1Mu
aWRsICovLAorCQkJCUZCREI2MTlFMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxl
Y3Rvci5oICovLAorCQkJCUZCREI2MTlBMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNv
bGxlY3Rvci5jcHAgKi8sCiAJCQkJNEE2RTlGQzIxM0MxN0QxRDAwNDZBN0Y4IC8qIEZvbnRGZWF0
dXJlVmFsdWUuaCAqLywKIAkJCQlBODBFNkNDNzBBMTk4OUNBMDA3RkI4QzUgLyogRm9udFZhbHVl
LmNwcCAqLywKIAkJCQlBODBFNkNDMzBBMTk4OUNBMDA3RkI4QzUgLyogRm9udFZhbHVlLmggKi8s
CkBAIC0yMjE2MSw2ICsyMjE3MSw4IEBACiAJCQkJRDNBOTRBMzUxMjJEQUJBQzAwQTM3QkJDIC8q
IE1lZGlhUXVlcnlMaXN0TGlzdGVuZXIuaWRsICovLAogCQkJCUQzQUExMEYxMTIzQTk4QUEwMDky
MTUyQiAvKiBNZWRpYVF1ZXJ5TWF0Y2hlci5jcHAgKi8sCiAJCQkJRDNBQTEwRjIxMjNBOThBQTAw
OTIxNTJCIC8qIE1lZGlhUXVlcnlNYXRjaGVyLmggKi8sCisJCQkJRkJEQjYxQTAxNkQ2MDM3RTAw
QkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggKi8sCisJCQkJRkJEQjYxOUMxNkQ2MDM0NjAw
QkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCAqLywKIAkJCQlBODBFNkNEMTBBMTk4OUNB
MDA3RkI4QzUgLyogUGFpci5oICovLAogCQkJCTMxODlFNkRCMTZCMjEwMzUwMDM4NkVBMyAvKiBw
bHVnSW5zLmNzcyAqLywKIAkJCQlFNEJCRUQwQzE0RjQwMjVEMDAzRjBCOTggLyogUHJvcGVydHlT
ZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCAqLywKQEAgLTI2NjkyLDYgKzI2NzA0LDggQEAKIAkJ
CQk3RTY2RTIzNDE2RDZFQjZDMDBGN0U3RkYgLyogV2ViR0xDb21wcmVzc2VkVGV4dHVyZUFUQy5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJN0VBMzBGNkExNkRGRkU3NTAwMjU3RDBCIC8qIEpTV2ViR0xD
b21wcmVzc2VkVGV4dHVyZUFUQy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJMkQ4Mjg3RjcxNkU0QTAz
ODAwODZCRDAwIC8qIEhpdFRlc3RMb2NhdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJRkJEQjYx
OUYxNkQ2MDM2NTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmggaW4gSGVhZGVycyAq
LywKKwkJCQlGQkRCNjFBMTE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBp
biBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Np
bmcgPSAwOwogCQl9OwpAQCAtMjk4OTUsNiArMjk5MDksOCBAQAogCQkJCTdFNjZFMjMzMTZENkVC
NkMwMEY3RTdGRiAvKiBXZWJHTENvbXByZXNzZWRUZXh0dXJlQVRDLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTdFQTMwRjY5MTZERkZFNzUwMDI1N0QwQiAvKiBKU1dlYkdMQ29tcHJlc3NlZFRleHR1
cmVBVEMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkQ4Mjg3RjYxNkU0QTAzODAwODZCRDAwIC8q
IEhpdFRlc3RMb2NhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlGQkRCNjE5QjE2RDYwMzJB
MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
RkJEQjYxOUQxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwogCQl9OwpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU0FsbEluT25lLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUuY3BwCShyZXZpc2lvbiAxNDUx
OTApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTQWxsSW5PbmUuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC03MSw3ICs3MSw5IEBACiAjaW5jbHVkZSAiQ1NTVmFsdWVQb29sLmNwcCIKICNpbmNsdWRl
ICJET01XaW5kb3dDU1MuY3BwIgogI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuY3BwIgorI2lu
Y2x1ZGUgIkVsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCIKICNpbmNsdWRlICJJbnNwZWN0b3JDU1NP
TVdyYXBwZXJzLmNwcCIKKyNpbmNsdWRlICJQYWdlUnVsZUNvbGxlY3Rvci5jcHAiCiAjaW5jbHVk
ZSAiUnVsZUZlYXR1cmUuY3BwIgogI2luY2x1ZGUgIlJ1bGVTZXQuY3BwIgogI2luY2x1ZGUgIlNl
bGVjdG9yQ2hlY2tlckZhc3RQYXRoLmNwcCIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1
bWVudFJ1bGVTZXRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1l
bnRSdWxlU2V0cy5jcHAJKHJldmlzaW9uIDE0NTE5MCkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9E
b2N1bWVudFJ1bGVTZXRzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTMsNyArNTMsNyBAQCB2b2lk
IFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXM6OmFkZFJ1bGUoU3R5CiB2b2lkIFNoYWRvd0Rpc3RyaWJ1
dGVkUnVsZXM6OmNvbGxlY3RNYXRjaFJlcXVlc3RzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMsIFZl
Y3RvcjxNYXRjaFJlcXVlc3Q+JiBtYXRjaFJlcXVlc3RzKQogewogICAgIGZvciAoU2hhZG93RGlz
dHJpYnV0ZWRSdWxlU2V0TWFwOjppdGVyYXRvciBpdCA9IG1fc2hhZG93RGlzdHJpYnV0ZWRSdWxl
U2V0TWFwLmJlZ2luKCk7IGl0ICE9IG1fc2hhZG93RGlzdHJpYnV0ZWRSdWxlU2V0TWFwLmVuZCgp
OyArK2l0KQotICAgICAgICBtYXRjaFJlcXVlc3RzLmFwcGVuZChNYXRjaFJlcXVlc3QoaXQtPnZh
bHVlLmdldCgpLCBpbmNsdWRlRW1wdHlSdWxlcywgaXQtPmtleSwgU2VsZWN0b3JDaGVja2VyOjpD
cm9zc2VzQm91bmRhcnkpKTsKKyAgICAgICAgbWF0Y2hSZXF1ZXN0cy5hcHBlbmQoTWF0Y2hSZXF1
ZXN0KGl0LT52YWx1ZS5nZXQoKSwgaW5jbHVkZUVtcHR5UnVsZXMsIGl0LT5rZXkpKTsKIH0KICNl
bmRpZgogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmgJKHJldmlzaW9u
IDE0NTE5MCkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQ3LDYgKzQ3LDcgQEAgcHVibGljOgogICAgIHZvaWQgYWRkUnVsZShTdHls
ZVJ1bGUqLCBzaXplX3Qgc2VsZWN0b3JJbmRleCwgQ29udGFpbmVyTm9kZSogc2NvcGUsIEFkZFJ1
bGVGbGFncyk7CiAgICAgdm9pZCBjb2xsZWN0TWF0Y2hSZXF1ZXN0cyhib29sIGluY2x1ZGVFbXB0
eVJ1bGVzLCBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiYpOwogICAgIHZvaWQgY2xlYXIoKSB7IG1fc2hh
ZG93RGlzdHJpYnV0ZWRSdWxlU2V0TWFwLmNsZWFyKCk7IH0KKyAgICBib29sIGlzRW1wdHkoKSBj
b25zdCB7IHJldHVybiBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5pc0VtcHR5KCk7IH0K
IHByaXZhdGU6CiAgICAgdHlwZWRlZiBIYXNoTWFwPGNvbnN0IENvbnRhaW5lck5vZGUqLCBPd25Q
dHI8UnVsZVNldD4gPiBTaGFkb3dEaXN0cmlidXRlZFJ1bGVTZXRNYXA7CiAgICAgU2hhZG93RGlz
dHJpYnV0ZWRSdWxlU2V0TWFwIG1fc2hhZG93RGlzdHJpYnV0ZWRSdWxlU2V0TWFwOwpJbmRleDog
U291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCShyZXZpc2lvbiAx
NDUxODEpCShmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcDoxNDUxODEp
CisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNTE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJz
IEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDA0LTIwMDUgQWxsYW4g
U2FuZGZlbGQgSmVuc2VuIChrZGVAY2FyZXdvbGYuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3IE5pY2hvbGFzIFNoYW5rcyAod2Via2l0QG5pY2tzaGFua3MuY29tKQorICogQ29weXJp
Z2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyLCAy
MDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
NyBBbGV4ZXkgUHJvc2t1cnlha292IDxhcEB3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAy
MDA3LCAyMDA4IEVyaWMgU2VpZGVsIDxlcmljQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMDgsIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0dHA6
Ly93d3cudG9yY2htb2JpbGUuY29tLykKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgQ29kZSBBdXJv
cmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNo
IEluIE1vdGlvbiBMaW1pdGVkIDIwMTEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKworI2luY2x1ZGUgIkF0dHJpYnV0
ZS5oIgorI2luY2x1ZGUgIkNTU0JvcmRlckltYWdlLmgiCisjaW5jbHVkZSAiQ1NTQ2FsY3VsYXRp
b25WYWx1ZS5oIgorI2luY2x1ZGUgIkNTU0N1cnNvckltYWdlVmFsdWUuaCIKKyNpbmNsdWRlICJD
U1NEZWZhdWx0U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJDU1NGb250RmFjZVJ1bGUuaCIKKyNp
bmNsdWRlICJDU1NGb250U2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NMaW5lQm94Q29udGFpblZh
bHVlLmgiCisjaW5jbHVkZSAiQ1NTUGFnZVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NQYXJzZXIuaCIK
KyNpbmNsdWRlICJDU1NQcmltaXRpdmVWYWx1ZU1hcHBpbmdzLmgiCisjaW5jbHVkZSAiQ1NTUHJv
cGVydHlOYW1lcy5oIgorI2luY2x1ZGUgIkNTU1JlZmxlY3RWYWx1ZS5oIgorI2luY2x1ZGUgIkNT
U1NlbGVjdG9yLmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3JMaXN0LmgiCisjaW5jbHVkZSAiQ1NT
U3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiQ1NTU3VwcG9ydHNSdWxlLmgiCisjaW5jbHVkZSAiQ1NT
VGltaW5nRnVuY3Rpb25WYWx1ZS5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlTGlzdC5oIgorI2lmIEVO
QUJMRShDU1NfVkFSSUFCTEVTKQorI2luY2x1ZGUgIkNTU1ZhcmlhYmxlVmFsdWUuaCIKKyNlbmRp
ZgorI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiQ2FsY3VsYXRpb25WYWx1ZS5o
IgorI2luY2x1ZGUgIkNvbnRlbnREYXRhLmgiCisjaW5jbHVkZSAiQ29udGV4dEZlYXR1cmVzLmgi
CisjaW5jbHVkZSAiQ291bnRlci5oIgorI2luY2x1ZGUgIkNvdW50ZXJDb250ZW50LmgiCisjaW5j
bHVkZSAiQ3Vyc29yTGlzdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24uaCIKKyNpbmNsdWRlICJFbGVtZW50U2hhZG93LmgiCisjaW5jbHVkZSAiRm9udEZlYXR1cmVW
YWx1ZS5oIgorI2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5j
bHVkZSAiRnJhbWVTZWxlY3Rpb24uaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRl
ICJIVE1MRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVudC5oIgorI2luY2x1
ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRl
ICJIVE1MT3B0aW9uRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxQcm9ncmVzc0VsZW1lbnQuaCIK
KyNpbmNsdWRlICJIVE1MU3R5bGVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxl
bWVudC5oIgorI2luY2x1ZGUgIkluc2VydGlvblBvaW50LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiS2V5ZnJhbWVMaXN0LmgiCisjaW5jbHVkZSAi
TGlua0hhc2guaCIKKyNpbmNsdWRlICJMb2NhbGVUb1NjcmlwdE1hcHBpbmcuaCIKKyNpbmNsdWRl
ICJNYXRoTUxOYW1lcy5oIgorI2luY2x1ZGUgIk1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uLmgi
CisjaW5jbHVkZSAiTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiTWVkaWFM
aXN0LmgiCisjaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgorI2luY2x1ZGUgIk5vZGVS
ZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0LmgiCisjaW5jbHVk
ZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhaXIuaCIKKyNpbmNsdWRlICJQZXJzcGVjdGl2ZVRyYW5z
Zm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIlF1b3Rlc0RhdGEuaCIKKyNpbmNsdWRlICJSZWN0
LmgiCisjaW5jbHVkZSAiUmVuZGVyUmVnaW9uLmgiCisjaW5jbHVkZSAiUmVuZGVyU2Nyb2xsYmFy
LmgiCisjaW5jbHVkZSAiUmVuZGVyU2Nyb2xsYmFyVGhlbWUuaCIKKyNpbmNsdWRlICJSZW5kZXJT
dHlsZUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAiUmVu
ZGVyVmlldy5oIgorI2luY2x1ZGUgIlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1
ZGUgIlJ1bGVTZXQuaCIKKyNpbmNsdWRlICJTVkdEb2N1bWVudEV4dGVuc2lvbnMuaCIKKyNpbmNs
dWRlICJTVkdGb250RmFjZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJTY2FsZVRyYW5zZm9ybU9wZXJh
dGlvbi5oIgorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2VsZWN0b3JD
aGVja2VyRmFzdFBhdGguaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlNoYWRv
d0RhdGEuaCIKKyNpbmNsdWRlICJTaGFkb3dSb290LmgiCisjaW5jbHVkZSAiU2hhZG93VmFsdWUu
aCIKKyNpbmNsdWRlICJTaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ2llcy5oIgorI2luY2x1ZGUgIlNr
ZXdUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJTdHlsZUJ1aWxkZXIuaCIKKyNpbmNs
dWRlICJTdHlsZUNhY2hlZEltYWdlLmgiCisjaW5jbHVkZSAiU3R5bGVHZW5lcmF0ZWRJbWFnZS5o
IgorI2luY2x1ZGUgIlN0eWxlUGVuZGluZ0ltYWdlLmgiCisjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0
eVNldC5oIgorI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTaG9ydGhhbmQuaCIKKyNpbmNsdWRlICJT
dHlsZVJ1bGUuaCIKKyNpbmNsdWRlICJTdHlsZVJ1bGVJbXBvcnQuaCIKKyNpbmNsdWRlICJTdHls
ZVNoZWV0Q29udGVudHMuaCIKKyNpbmNsdWRlICJTdHlsZVNoZWV0TGlzdC5oIgorI2luY2x1ZGUg
IlRleHQuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIlRy
YW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hl
ZXRzLmgiCisjaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCisjaW5jbHVkZSAiVmlz
aXRlZExpbmtTdGF0ZS5oIgorI2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJbnN0cnVtZW50YXRpb24u
aCIKKyNpbmNsdWRlICJXZWJLaXRDU1NLZXlmcmFtZVJ1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRD
U1NLZXlmcmFtZXNSdWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTUmVnaW9uUnVsZS5oIgorI2lu
Y2x1ZGUgIldlYktpdENTU1RyYW5zZm9ybVZhbHVlLmgiCisjaW5jbHVkZSAiV2ViS2l0Rm9udEZh
bWlseU5hbWVzLmgiCisjaW5jbHVkZSAiWE1MTmFtZXMuaCIKKyNpbmNsdWRlIDx3dGYvTWVtb3J5
SW5zdHJ1bWVudGF0aW9uSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50
YXRpb25IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvblZlY3Rv
ci5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisjaW5jbHVkZSAiRmlsdGVyT3BlcmF0aW9u
LmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTRmlsdGVyVmFsdWUuaCIKKyNlbmRpZgorCisjaWYgRU5B
QkxFKERBU0hCT0FSRF9TVVBQT1JUKQorI2luY2x1ZGUgIkRhc2hib2FyZFJlZ2lvbi5oIgorI2Vu
ZGlmCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50LmgiCisj
aW5jbHVkZSAiQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJTVkdEb2N1
bWVudC5oIgorI2luY2x1ZGUgIlNWR0VsZW1lbnQuaCIKKyNpbmNsdWRlICJTVkdOYW1lcy5oIgor
I2luY2x1ZGUgIlNWR1VSSVJlZmVyZW5jZS5oIgorI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3Vt
ZW50VmFsdWUuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorI2luY2x1ZGUg
IkN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyLmgiCisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQ29u
c3RhbnRzLmgiCisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyLmgiCisjaW5j
bHVkZSAiQ3VzdG9tRmlsdGVyT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyUGFy
YW1ldGVyLmgiCisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyLmgiCisj
aW5jbHVkZSAiU3R5bGVDYWNoZWRTaGFkZXIuaCIKKyNpbmNsdWRlICJTdHlsZUN1c3RvbUZpbHRl
clByb2dyYW0uaCIKKyNpbmNsdWRlICJTdHlsZVBlbmRpbmdTaGFkZXIuaCIKKyNpbmNsdWRlICJT
dHlsZVNoYWRlci5oIgorI2luY2x1ZGUgIldlYktpdENTU01peEZ1bmN0aW9uVmFsdWUuaCIKKyNp
bmNsdWRlICJXZWJLaXRDU1NTaGFkZXJWYWx1ZS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NT
X0lNQUdFX1NFVCkKKyNpbmNsdWRlICJDU1NJbWFnZVNldFZhbHVlLmgiCisjaW5jbHVkZSAiU3R5
bGVDYWNoZWRJbWFnZVNldC5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisj
aW5jbHVkZSAiV2ViVlRURWxlbWVudC5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7
CisKK25hbWVzcGFjZSBXVEYgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBTZXF1ZW5jZU1lbW9yeUlu
c3RydW1lbnRhdGlvblRyYWl0czxjb25zdCBXZWJDb3JlOjpSdWxlRGF0YSo+IHsKKyAgICB0ZW1w
bGF0ZSA8dHlwZW5hbWUgST4gc3RhdGljIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoSSwgSSwgTWVt
b3J5Q2xhc3NJbmZvJikgeyB9Cit9OworCit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNp
bmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKworI2RlZmluZSBIQU5ETEVfSU5IRVJJVChwcm9wLCBQ
cm9wKSBcCitpZiAoaXNJbmhlcml0KSB7IFwKKyAgICBtX3N0YXRlLnN0eWxlKCktPnNldCMjUHJv
cChtX3N0YXRlLnBhcmVudFN0eWxlKCktPnByb3AoKSk7IFwKKyAgICByZXR1cm47IFwKK30KKwor
I2RlZmluZSBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChwcm9wLCBQcm9wKSBcCitIQU5ETEVf
SU5IRVJJVChwcm9wLCBQcm9wKSBcCitpZiAoaXNJbml0aWFsKSB7IFwKKyAgICBtX3N0YXRlLnN0
eWxlKCktPnNldCMjUHJvcChSZW5kZXJTdHlsZTo6aW5pdGlhbCMjUHJvcCgpKTsgXAorICAgIHJl
dHVybjsgXAorfQorCitSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6c19zdHlsZU5vdFlldEF2
YWlsYWJsZTsKKworc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIGxlZnRUb1JpZ2h0RGVjbGFyYXRp
b24oKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+
LCBsZWZ0VG9SaWdodERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKSkpOworICAgIGlm
IChsZWZ0VG9SaWdodERlY2wtPmlzRW1wdHkoKSkKKyAgICAgICAgbGVmdFRvUmlnaHREZWNsLT5z
ZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVMdHIpOworICAgIHJldHVy
biBsZWZ0VG9SaWdodERlY2wuZ2V0KCk7Cit9CisKK3N0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBy
aWdodFRvTGVmdERlY2xhcmF0aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0
cjxTdHlsZVByb3BlcnR5U2V0PiwgcmlnaHRUb0xlZnREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6
Y3JlYXRlKCkpKTsKKyAgICBpZiAocmlnaHRUb0xlZnREZWNsLT5pc0VtcHR5KCkpCisgICAgICAg
IHJpZ2h0VG9MZWZ0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1Zh
bHVlUnRsKTsKKyAgICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgpOworfQorCisKK2lubGlu
ZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmVuc3VyZVJ1bGVMaXN0
KCkKK3sKKyAgICBpZiAoIW1fcnVsZUxpc3QpCisgICAgICAgIG1fcnVsZUxpc3QgPSBTdGF0aWND
U1NSdWxlTGlzdDo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7Cit9CisK
K2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjYWNoZUJvcmRlckFuZEJhY2tncm91
bmQoKQoreworICAgIG1faGFzVUFBcHBlYXJhbmNlID0gbV9zdHlsZS0+aGFzQXBwZWFyYW5jZSgp
OworICAgIGlmIChtX2hhc1VBQXBwZWFyYW5jZSkgeworICAgICAgICBtX2JvcmRlckRhdGEgPSBt
X3N0eWxlLT5ib3JkZXIoKTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kRGF0YSA9ICptX3N0eWxlLT5i
YWNrZ3JvdW5kTGF5ZXJzKCk7CisgICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0gbV9zdHlsZS0+
YmFja2dyb3VuZENvbG9yKCk7CisgICAgfQorfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVy
OjpTdGF0ZTo6Y2xlYXIoKQoreworICAgIG1fZWxlbWVudCA9IDA7CisgICAgbV9zdHlsZWRFbGVt
ZW50ID0gMDsKKyAgICBtX3BhcmVudFN0eWxlID0gMDsKKyAgICBtX3BhcmVudE5vZGUgPSAwOwor
ICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7CisgICAgbV9ydWxlTGlzdCA9IDA7CisgICAgbV9t
YXRjaGVkUnVsZXMuY2xlYXIoKTsKKyAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIo
KTsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgbV9oYXNQZW5kaW5nU2hhZGVycyA9IGZh
bHNlOworI2VuZGlmCisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAg
IG1fcGVuZGluZ1NWR0RvY3VtZW50cy5jbGVhcigpOworI2VuZGlmCit9CisKK1N0eWxlUmVzb2x2
ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcykKKyAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNl
TGFzdFN3ZWVwKDApCisgICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyKHRo
aXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCisgICAgLCBt
X2RvY3VtZW50KGRvY3VtZW50KQorICAgICwgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMobWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICwgbV9mb250U2VsZWN0b3IoQ1NTRm9udFNlbGVj
dG9yOjpjcmVhdGUoZG9jdW1lbnQpKQorI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04p
CisgICAgLCBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcihWaWV3cG9ydFN0eWxlUmVzb2x2ZXI6OmNy
ZWF0ZShkb2N1bWVudCkpCisjZW5kaWYKKyAgICAsIG1fc3R5bGVCdWlsZGVyKFN0eWxlQnVpbGRl
cjo6c2hhcmVkU3R5bGVCdWlsZGVyKCkpCisgICAgLCBtX3N0eWxlTWFwKHRoaXMpCit7CisgICAg
RWxlbWVudCogcm9vdCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKKworICAgIENTU0Rl
ZmF1bHRTdHlsZVNoZWV0czo6aW5pdERlZmF1bHRTdHlsZShyb290KTsKKworICAgIC8vIGNvbnN0
cnVjdCBkb2N1bWVudCByb290IGVsZW1lbnQgZGVmYXVsdCBzdHlsZS4gdGhpcyBpcyBuZWVkZWQK
KyAgICAvLyB0byBldmFsdWF0ZSBtZWRpYSBxdWVyaWVzIHRoYXQgY29udGFpbiByZWxhdGl2ZSBj
b25zdHJhaW50cywgbGlrZSAic2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMGVtKSIKKyAgICAvLyBU
aGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciwgYmVjYXVzZSB3aGVuIGNvbnN0cnVj
dG9yIGlzIHJ1biwKKyAgICAvLyBkb2N1bWVudCBkb2Vzbid0IGhhdmUgZG9jdW1lbnRFbGVtZW50
CisgICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgZWxlbWVudCB0aGF0IGdldHMgcGFzc2Vk
IHRvIHN0eWxlRm9yRWxlbWVudCAtY2FsbAorICAgIC8vIGlzIGFsd2F5cyBmcm9tIHRoZSBkb2N1
bWVudCB0aGF0IG93bnMgdGhlIHN0eWxlIHNlbGVjdG9yCisgICAgRnJhbWVWaWV3KiB2aWV3ID0g
ZG9jdW1lbnQtPnZpZXcoKTsKKyAgICBpZiAodmlldykKKyAgICAgICAgbV9tZWRpdW0gPSBhZG9w
dFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSkpOworICAgIGVs
c2UKKyAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcigi
YWxsIikpOworCisgICAgaWYgKHJvb3QpCisgICAgICAgIG1fcm9vdERlZmF1bHRTdHlsZSA9IHN0
eWxlRm9yRWxlbWVudChyb290LCAwLCBEaXNhbGxvd1N0eWxlU2hhcmluZywgTWF0Y2hPbmx5VXNl
ckFnZW50UnVsZXMpOworCisgICAgaWYgKG1fcm9vdERlZmF1bHRTdHlsZSAmJiB2aWV3KQorICAg
ICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZpZXctPm1l
ZGlhVHlwZSgpLCB2aWV3LT5mcmFtZSgpLCBtX3Jvb3REZWZhdWx0U3R5bGUuZ2V0KCkpKTsKKwor
ICAgIG1fcnVsZVNldHMucmVzZXRBdXRob3JTdHlsZSgpOworCisgICAgRG9jdW1lbnRTdHlsZVNo
ZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5bGVTaGVl
dENvbGxlY3Rpb24oKTsKKyAgICBtX3J1bGVTZXRzLmluaXRVc2VyU3R5bGUoc3R5bGVTaGVldENv
bGxlY3Rpb24sICptX21lZGl1bSwgKnRoaXMpOworCisjaWYgRU5BQkxFKFNWR19GT05UUykKKyAg
ICBpZiAoZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKSkgeworICAgICAgICBjb25zdCBIYXNoU2V0
PFNWR0ZvbnRGYWNlRWxlbWVudCo+JiBzdmdGb250RmFjZUVsZW1lbnRzID0gZG9jdW1lbnQtPnN2
Z0V4dGVuc2lvbnMoKS0+c3ZnRm9udEZhY2VFbGVtZW50cygpOworICAgICAgICBIYXNoU2V0PFNW
R0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBzdmdGb250RmFjZUVsZW1l
bnRzLmVuZCgpOworICAgICAgICBmb3IgKEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gc3ZnRm9udEZhY2VFbGVtZW50cy5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCisgICAgICAgICAgICBmb250U2VsZWN0b3IoKS0+YWRkRm9udEZhY2VSdWxlKCgqaXQp
LT5mb250RmFjZVJ1bGUoKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBhcHBlbmRBdXRob3JTdHls
ZVNoZWV0cygwLCBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+YWN0aXZlQXV0aG9yU3R5bGVTaGVldHMo
KSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwZW5kQXV0aG9yU3R5bGVTaGVldHModW5z
aWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiYgc3R5
bGVTaGVldHMpCit7CisgICAgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0cyhmaXJz
dE5ldywgc3R5bGVTaGVldHMsIG1fbWVkaXVtLmdldCgpLCBtX2luc3BlY3RvckNTU09NV3JhcHBl
cnMsIGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCB0aGlzKTsKKyAgICBpZiAoZG9jdW1lbnQo
KS0+cmVuZGVyZXIoKSAmJiBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpKQorICAgICAg
ICBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxl
Y3RvcigpKTsKKworI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgdmlld3Bv
cnRTdHlsZVJlc29sdmVyKCktPnJlc29sdmUoKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OnB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkKK3sKKyAgICBjb25zdCBD
b250YWluZXJOb2RlKiBwYXJlbnRzUGFyZW50ID0gcGFyZW50LT5wYXJlbnRPclNoYWRvd0hvc3RF
bGVtZW50KCk7CisKKyAgICAvLyBXZSBhcmUgbm90IGFsd2F5cyBpbnZva2VkIGNvbnNpc3RlbnRs
eS4gRm9yIGV4YW1wbGUsIHNjcmlwdCBleGVjdXRpb24gY2FuIGNhdXNlIHVzIHRvIGVudGVyCisg
ICAgLy8gc3R5bGUgcmVjYWxjIGluIHRoZSBtaWRkbGUgb2YgdHJlZSBidWlsZGluZy4gV2UgbWF5
IGFsc28gYmUgaW52b2tlZCBmcm9tIHNvbWV3aGVyZSB3aXRoaW4gdGhlIHRyZWUuCisgICAgLy8g
UmVzZXQgdGhlIHN0YWNrIGluIHRoaXMgY2FzZSwgb3IgaWYgd2Ugc2VlIGEgbmV3IHJvb3QgZWxl
bWVudC4KKyAgICAvLyBPdGhlcndpc2UganVzdCBwdXNoIHRoZSBuZXcgcGFyZW50LgorICAgIGlm
ICghcGFyZW50c1BhcmVudCB8fCBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNFbXB0eSgp
KQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnNldHVwUGFyZW50U3RhY2socGFyZW50KTsKKyAg
ICBlbHNlCisgICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucHVzaFBhcmVudChwYXJlbnQpOworCisg
ICAgLy8gTm90ZTogV2UgbXVzdG4ndCBza2lwIFNoYWRvd1Jvb3Qgbm9kZXMgZm9yIHRoZSBzY29w
ZSBzdGFjay4KKyAgICBpZiAobV9zY29wZVJlc29sdmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2
ZXItPnB1c2gocGFyZW50LCBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9zdE5vZGUoKSk7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJlbnQpCit7
CisgICAgLy8gTm90ZSB0aGF0IHdlIG1heSBnZXQgaW52b2tlZCBmb3Igc29tZSByYW5kb20gZWxl
bWVudHMgaW4gc29tZSB3YWNreSBjYXNlcyBkdXJpbmcgc3R5bGUgcmVzb2x2ZS4KKyAgICAvLyBQ
YXVzZSBtYWludGFpbmluZyB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLgorICAgIGlmIChtX3NlbGVj
dG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHBhcmVudCkpCisgICAgICAgIG1fc2Vs
ZWN0b3JGaWx0ZXIucG9wUGFyZW50KCk7CisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKKyAgICAg
ICAgbV9zY29wZVJlc29sdmVyLT5wb3AocGFyZW50KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
OjpwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290KQorewor
ICAgIEFTU0VSVChzaGFkb3dSb290LT5ob3N0KCkpOworICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIp
CisgICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cHVzaChzaGFkb3dSb290LCBzaGFkb3dSb290LT5o
b3N0KCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudFNoYWRvd1Jvb3QoY29u
c3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKK3sKKyAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9z
dCgpKTsKKyAgICBpZiAobV9zY29wZVJlc29sdmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXIt
PnBvcChzaGFkb3dSb290KTsKK30KKworLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgc3R5bGUgc2V0
dGluZyBmdW5jdGlvbiBmb3Iga2V5ZnJhbWUgc3R5bGVzCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFk
ZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+IHJ1bGUpCit7Cisg
ICAgQXRvbWljU3RyaW5nIHMocnVsZS0+bmFtZSgpKTsKKyAgICBtX2tleWZyYW1lc1J1bGVNYXAu
c2V0KHMuaW1wbCgpLCBydWxlKTsKK30KKworU3R5bGVSZXNvbHZlcjo6flN0eWxlUmVzb2x2ZXIo
KQoreworICAgIG1fZm9udFNlbGVjdG9yLT5jbGVhckRvY3VtZW50KCk7CisKKyNpZiBFTkFCTEUo
Q1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyLT5jbGVh
ckRvY3VtZW50KCk7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZlcj4qKQoreworICAgIC8vIExvb2sg
Zm9yIGNhY2hlIGVudHJpZXMgY29udGFpbmluZyBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggYSBz
aW5nbGUgcmVmIGFuZCByZW1vdmUgdGhlbS4KKyAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBh
biBlbGVtZW50IGF0dHJpYnV0ZSBtdXRhdGlvbiBjYXVzZXMgaXQgdG8gZ2VuZXJhdGUgYSBuZXcg
aW5saW5lU3R5bGUoKQorICAgIC8vIG9yIHByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCksIHBv
dGVudGlhbGx5IGxlYXZpbmcgdGhpcyBjYWNoZSB3aXRoIHRoZSBsYXN0IHJlZiBvbiB0aGUgb2xk
IG9uZS4KKyAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiB0b1JlbW92ZTsKKyAgICBNYXRjaGVkUHJv
cGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5iZWdp
bigpOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGVuZCA9IG1fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZS5lbmQoKTsKKyAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcz4mIG1hdGNoZWRQcm9wZXJ0aWVzID0gaXQt
PnZhbHVlLm1hdGNoZWRQcm9wZXJ0aWVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobWF0Y2hl
ZFByb3BlcnRpZXNbaV0ucHJvcGVydGllcy0+aGFzT25lUmVmKCkpIHsKKyAgICAgICAgICAgICAg
ICB0b1JlbW92ZS5hcHBlbmQoaXQtPmtleSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0
b1JlbW92ZS5zaXplKCk7ICsraSkKKyAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLnJl
bW92ZSh0b1JlbW92ZVtpXSk7CisKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlv
bnNTaW5jZUxhc3RTd2VlcCA9IDA7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkTWF0Y2hl
ZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5
U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUs
IFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCit7CisgICAgbWF0
Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgKyAxKTsKKyAgICBNYXRjaGVkUHJvcGVydGllcyYgbmV3UHJvcGVydGllcyA9
IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKKyAgICBuZXdQcm9wZXJ0aWVz
LnByb3BlcnRpZXMgPSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9wZXJ0aWVzKTsK
KyAgICBuZXdQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBlOworICAgIG5l
d1Byb3BlcnRpZXMud2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlwZTsKKyAgICBt
YXRjaFJlc3VsdC5tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworfQorCitpbmxpbmUgdm9pZCBT
dHlsZVJlc29sdmVyOjphZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiByZXN1
bHQsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnR5U2V0LCBib29sIGlzQ2FjaGVhYmxl
KQoreworICAgIGlmICghcHJvcGVydHlTZXQpCisgICAgICAgIHJldHVybjsKKyAgICByZXN1bHQu
cmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsK
KyAgICBpZiAocmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPT0gLTEpCisgICAgICAgIHJl
c3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVs
ZTsKKyAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnR5U2V0KTsKKyAgICBp
ZiAoIWlzQ2FjaGVhYmxlKQorICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKK30K
KworY2xhc3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgeworcHVibGljOgorICAgIE1hdGNoaW5nVUFS
dWxlc1Njb3BlKCk7CisgICAgfk1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7CisKKyAgICBzdGF0aWMg
Ym9vbCBpc01hdGNoaW5nVUFSdWxlcygpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBib29sIG1f
bWF0Y2hpbmdVQVJ1bGVzOworfTsKKworTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFS
dWxlc1Njb3BlKCkKK3sKKyAgICBBU1NFUlQoIW1fbWF0Y2hpbmdVQVJ1bGVzKTsKKyAgICBtX21h
dGNoaW5nVUFSdWxlcyA9IHRydWU7Cit9CisKK01hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hp
bmdVQVJ1bGVzU2NvcGUoKQoreworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7Cit9CisK
K2lubGluZSBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCit7
CisgICAgcmV0dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOworfQorCitib29sIE1hdGNoaW5nVUFSdWxl
c1Njb3BlOjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOworCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBS
dWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3sKKyAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQp
OworICAgIEFTU0VSVChtX3N0YXRlLmVsZW1lbnQoKSk7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOworICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCk7CisgICAgY29u
c3QgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKTsK
KyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHBzZXVkb0lkID0gZWxlbWVudC0+c2hhZG93UHNldWRv
SWQoKTsKKyAgICBpZiAoIXBzZXVkb0lkLmlzRW1wdHkoKSkgeworICAgICAgICBBU1NFUlQoc3R5
bGVkRWxlbWVudCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBzZXVkb0lkLmltcGwoKSks
IG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoVklERU9fVFJB
Q0spCisgICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQorICAgICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmN1ZVBzZXVkb1J1bGVz
KCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyNlbmRpZgorICAgIC8vIENoZWNrIHdoZXRo
ZXIgb3RoZXIgdHlwZXMgb2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4gdGhlIGN1cnJlbnQgdHJl
ZSBzY29wZS4gQ3JpdGVyaWEgZm9yIHRoaXM6CisgICAgLy8gYSkgaXQncyBhIFVBIHJ1bGUKKyAg
ICAvLyBiKSB0aGUgdHJlZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVzCisgICAgLy8gYykgdGhl
IHJ1bGVzIGNvbWVzIGZyb20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0aGluIHRoZSBzYW1lIHRy
ZWUgc2NvcGUKKyAgICBUcmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1lbnQtPnRyZWVTY29wZSgp
OworICAgIGlmICghTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKKyAg
ICAgICAgJiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQorICAgICAgICAmJiAoIW1h
dGNoUmVxdWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRy
ZWVTY29wZSkKKyAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBT
ZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3MsIHRhZywg
YW5kIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAorICAgIC8vIHRoZW4gc29ydCB0
aGUgYnVmZmVyLgorICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQorICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmlkUnVsZXMoZWxlbWVudC0+
aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
CisgICAgaWYgKHN0eWxlZEVsZW1lbnQgJiYgc3R5bGVkRWxlbWVudC0+aGFzQ2xhc3MoKSkgewor
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMo
KS5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCht
YXRjaFJlcXVlc3QucnVsZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVz
KClbaV0uaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworICAgIGlm
IChlbGVtZW50LT5pc0xpbmsoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0
KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7CisgICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6bWF0Y2hlc0ZvY3VzUHNl
dWRvQ2xhc3MoZWxlbWVudCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCht
YXRjaFJlcXVlc3QucnVsZVNldC0+Zm9jdXNQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1
ZXN0LnJ1bGVTZXQtPnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSksIG1hdGNo
UmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0
Y2hSZXF1ZXN0LnJ1bGVTZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJl
Z2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFu
Z2UpCit7CisgICAgaWYgKCFtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgdW5zaWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lv
blNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3Rv
ciA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0
KGkpLnNlbGVjdG9yOworICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxl
Y3Rvciwgc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpLT5u
b2RlKCkpKSkgeworICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMgPSBtYXRjaFJlcXVl
c3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0Lmdl
dCgpOworICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKKyAgICAgICAgICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1ZXN0Lmlu
Y2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOworICAgICAg
ICB9CisgICAgfQorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0KQoreworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3Rh
dGU7CisgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSBzdGF0
ZS5tYXRjaGVkUnVsZXMoKTsKKyAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgc29ydE1hdGNoZWRSdWxlcygpOworCisgICAgaWYgKHN0YXRlLm1v
ZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgKytpKQorICAgICAgICAg
ICAgc3RhdGUuZW5zdXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ld
LT5ydWxlKCktPmNyZWF0ZUNTU09NV3JhcHBlcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIE5vdyB0cmFuc2ZlciB0aGUgc2V0IG9mIG1hdGNoZWQgcnVsZXMgb3ZlciB0byBv
dXIgbGlzdCBvZiBkZWNsYXJhdGlvbnMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1h
dGNoZWRSdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc3RhdGUuc3R5bGUoKSAmJiBt
YXRjaGVkUnVsZXNbaV0tPmNvbnRhaW5zVW5jb21tb25BdHRyaWJ1dGVTZWxlY3RvcigpKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7CisgICAgICAgIGFkZE1hdGNoZWRQ
cm9wZXJ0aWVzKHJlc3VsdCwgbWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPnByb3BlcnRpZXMoKSwg
bWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCksIG1hdGNoZWRSdWxlc1tpXS0+bGlua01hdGNoVHlwZSgp
LCBtYXRjaGVkUnVsZXNbaV0tPnByb3BlcnR5V2hpdGVsaXN0VHlwZSgpKTsKKyAgICB9Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYg
cmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShTVFlMRV9TQ09Q
RUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIGlmICghbV9zY29wZVJlc29sdmVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9yIHJ1bGVzIGJ5IHRyYXZl
cnNpbmcgdGhlIHNjb3BlZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0IGlmIGl0IGdvdCBpbmNv
bnNpc3RlbnQpLgorICAgIGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Njb3BlZFN0eWxlcygpICYm
IG1fc2NvcGVSZXNvbHZlci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeShtX3N0YXRlLmVsZW1lbnQo
KSkpIHsKKyAgICAgICAgYm9vbCBhcHBseUF1dGhvclN0eWxlcyA9IG1fc3RhdGUuZWxlbWVudCgp
LT50cmVlU2NvcGUoKS0+YXBwbHlBdXRob3JTdHlsZXMoKTsKKyAgICAgICAgYm9vbCBkb2N1bWVu
dFNjb3BlID0gdHJ1ZTsKKyAgICAgICAgdW5zaWduZWQgc2NvcGVTaXplID0gbV9zY29wZVJlc29s
dmVyLT5zdGFja1NpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNjb3Bl
U2l6ZTsgKytpKSB7CisgICAgICAgICAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
CisgICAgICAgICAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisKKyAgICAgICAgICAgIGNvbnN0IFN0eWxlU2NvcGVS
ZXNvbHZlcjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrRnJhbWVB
dChpKTsKKyAgICAgICAgICAgIGRvY3VtZW50U2NvcGUgPSBkb2N1bWVudFNjb3BlICYmICFmcmFt
ZS5tX3Njb3BlLT5pc0luU2hhZG93VHJlZSgpOworICAgICAgICAgICAgaWYgKGRvY3VtZW50U2Nv
cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFwcGx5QXV0aG9yU3R5bGVzKQorICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXItPm1hdGNoZXNTdHlsZUJvdW5kcyhmcmFtZSkpCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBN
YXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KGZyYW1lLm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVs
ZXMsIGZyYW1lLm1fc2NvcGUpOworICAgICAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJl
c3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgICAgICAg
ICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIG1hdGNoSG9zdFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworI2Vsc2UK
KyAgICBVTlVTRURfUEFSQU0ocmVzdWx0KTsKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5
UnVsZXMpOworI2VuZGlmCit9CisKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hh
cmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKQoreworI2lmIEVOQUJMRShTSEFET1dfRE9N
KQorICAgIHJldHVybiBtX3Njb3BlUmVzb2x2ZXIgJiYgbV9zY29wZVJlc29sdmVyLT5zdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKG1fc3RhdGUuZWxlbWVudCgpKTsKKyNlbHNl
CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0
Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykK
K3sKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBBU1NFUlQobV9zY29wZVJlc29sdmVyKTsK
KworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisK
KyAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNoZWRSdWxlczsKKyAgICBtX3Njb3BlUmVzb2x2ZXIt
Pm1hdGNoSG9zdFJ1bGVzKG1fc3RhdGUuZWxlbWVudCgpLCBtYXRjaGVkUnVsZXMpOworICAgIGlm
IChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7CisgICAgICAgIFJ1
bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAg
ICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QobWF0Y2hlZFJ1bGVzLmF0KGkt
MSksIGluY2x1ZGVFbXB0eVJ1bGVzLCBtX3N0YXRlLmVsZW1lbnQoKSksIHJ1bGVSYW5nZSk7Cisg
ICAgfQorICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworI2Vsc2UKKyAg
ICBVTlVTRURfUEFSQU0ocmVzdWx0KTsKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVs
ZXMpOworI2VuZGlmCit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBdXRob3JSdWxlcyhN
YXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQoreworICAgIG1fc3Rh
dGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JS
dWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisKKyAgICBpZiAoIW1f
c3RhdGUuZWxlbWVudCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBNYXRjaCBnbG9iYWwg
YXV0aG9yIHJ1bGVzLgorICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy5h
dXRob3JTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgUnVsZVJhbmdlIHJ1bGVSYW5n
ZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyNpZiBFTkFCTEUoU0hBRE9XX0RP
TSkKKyAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOworICAgIG1fcnVsZVNl
dHMuc2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVF
bXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1h
dGNoUmVxdWVzdHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1h
dGNoUmVxdWVzdHNbaV0sIHJ1bGVSYW5nZSk7CisjZW5kaWYKKworICAgIHNvcnRBbmRUcmFuc2Zl
ck1hdGNoZWRSdWxlcyhyZXN1bHQpOworCisgICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhyZXN1
bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVz
ZXJSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQorewor
ICAgIGlmICghbV9ydWxlU2V0cy51c2VyU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKworICAgIHJlc3VsdC5yYW5nZXMu
bGFzdFVzZXJSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpbmNsdWRl
RW1wdHlSdWxlcyk7CisgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMudXNl
clJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgUnVsZVNldCogcnVsZXMpCit7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigp
OworICAgIAorICAgIHJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFu
Z2VzLlVBUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0
KHJ1bGVzKSwgcnVsZVJhbmdlKTsKKworICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhy
ZXN1bHQpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9y
TGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxlcywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBt
YXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghcnVsZXMpCisg
ICAgICAgIHJldHVybjsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgLy8gSW4g
c29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBlbGVt
ZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KKyAgICAvLyBB
bmNlc3RvciBpZGVudGlmaWVyIGZpbHRlciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQgY2Fz
ZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBmYXN0IHBhdGguCisgICAgYm9vbCBjYW5Vc2VGYXN0UmVq
ZWN0ID0gbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5wYXJl
bnROb2RlKCkpICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JD
aGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeTsKKworICAgIHVuc2lnbmVkIHNpemUgPSBydWxl
cy0+c2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAg
ICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0KGkpOworICAgICAgICBp
ZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3Rv
cjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNl
bGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAg
ICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKKyAgICAgICAgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKKyAgICAgICAgUHNldWRvSWQg
ZHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOworICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVsZURh
dGEsIG1hdGNoUmVxdWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJlaGF2
aW9yQXRCb3VuZGFyeSkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9w
ZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUuCisg
ICAgICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJv
cGVydGllcygpOworICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVzLT5p
c0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcykpIHsKKyAgICAgICAg
ICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZh
bHNlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5kYXJkIGdldE1hdGNoZWRDU1NSdWxl
cyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5lZWRlZC4KKyAgICAgICAg
ICAgIGlmIChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50
U2VjdXJpdHlPcmlnaW4oKSkgeworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRh
dGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9y
bWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCisgICAgICAgICAgICAvLyB3ZSByZWFsbHkg
anVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCisgICAgICAgICAgICBpZiAoZHluYW1pY1Bz
ZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCA9
PSBOT1BTRVVETykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0
b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBpZiAoZHluYW1pY1BzZXVkbyA8IEZJUlNUX0lOVEVSTkFMX1BTRVVET0lEKQorICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRIYXNQc2V1ZG9TdHlsZShkeW5hbWljUHNldWRv
KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG91ciBm
aXJzdC9sYXN0IHJ1bGUgaW5kaWNlcyBpbiB0aGUgbWF0Y2hlZCBydWxlcyBhcnJheS4KKyAgICAg
ICAgICAgICAgICArK3J1bGVSYW5nZS5sYXN0UnVsZUluZGV4OworICAgICAgICAgICAgICAgIGlm
IChydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJ1
bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVsZUluZGV4OworCisgICAg
ICAgICAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVz
LgorICAgICAgICAgICAgICAgIG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKKyAg
ICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29r
aWUsIHRydWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNv
b2tpZSwgZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxl
cyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikKK3sKKyAgICB1bnNpZ25l
ZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKKyAgICB1bnNpZ25lZCBzcGVjaWZp
Y2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKKyAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBz
cGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmlj
aXR5MSA8IHNwZWNpZmljaXR5MjsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0Y2hl
ZFJ1bGVzKCkKK3sKKyAgICBzdGQ6OnNvcnQobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5iZWdpbigp
LCBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmVuZCgpLCBjb21wYXJlUnVsZXMpOworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6Om1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBp
bmNsdWRlU01JTFByb3BlcnRpZXMpCit7CisgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCk7CisKKyAg
ICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KKyAgICBpZiAobV9tYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMpCisgICAgICAgIG1hdGNoVXNlclJ1bGVzKHJlc3VsdCwgZmFsc2UpOwor
CisgICAgLy8gTm93IGNoZWNrIGF1dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGggcHJl
c2VudGF0aW9uYWwgYXR0cmlidXRlcyBtYXBwZWQgZnJvbSBIVE1MLgorICAgIGlmIChtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKSkgeworICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJl
c3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxl
KCkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFsIG1hcHBlZCBkZWNsYXJh
dGlvbnMuCisgICAgICAgIC8vIFRhYmxlcyBhbmQgdGFibGUgY2VsbHMgc2hhcmUgYW4gYWRkaXRp
b25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3QgYmUgYXBwbGllZAorICAgICAgICAvLyBhZnRlciBh
bGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRlcGVuZHMgb24gdGhlIHZh
bHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVzLgorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9w
ZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50
YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKworICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICAgICAgYm9vbCBpc0F1dG87CisgICAg
ICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0b0hUTUxFbGVtZW50KG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9uYWxpdHlJZmhhc0RpckF1dG9BdHRyaWJ1dGUo
aXNBdXRvKTsKKyAgICAgICAgICAgIGlmIChpc0F1dG8pCisgICAgICAgICAgICAgICAgYWRkTWF0
Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0ZXh0RGlyZWN0aW9uID09IExUUiA/IGxlZnRUb1JpZ2h0
RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKSk7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMgbmV4dC4K
KyAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAgIG1hdGNoQXV0aG9y
UnVsZXMocmVzdWx0LCBmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBzdHls
ZSBhdHRyaWJ1dGUuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHls
ZSgpKSB7CisgICAgICAgIC8vIElubGluZSBzdHlsZSBpcyBpbW11dGFibGUgYXMgbG9uZyBhcyB0
aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVyLgorICAgICAgICAvLyBGSVhNRTogTWVkaWEgY29udHJv
bCBzaGFkb3cgdHJlZXMgc2VlbSB0byBoYXZlIHByb2JsZW1zIHdpdGggY2FjaGluZy4KKyAgICAg
ICAgYm9vbCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAmJiAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmlzSW5TaGFkb3dUcmVlKCk7CisgICAgICAgIC8vIEZJWE1FOiBDb25zdGlmeS4KKyAgICAgICAg
YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsKKyAgICB9CisKKyNpZiBF
TkFCTEUoU1ZHKQorICAgIC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHls
ZS4KKyAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1fbWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pc1NWR0VsZW1lbnQoKSkKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhy
ZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkt
PmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAqLyk7
CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlU01JTFByb3BlcnRpZXMpOworI2VuZGlm
Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25z
dCBTcGFjZVNwbGl0U3RyaW5nJiBjbGFzc05hbWVzKSBjb25zdAoreworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtX3J1
bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NOYW1lc1tpXS5p
bXBsKCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxz
ZTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRFbGVtZW50KEVs
ZW1lbnQqIGUpCit7CisgICAgbV9lbGVtZW50ID0gZTsKKyAgICBtX3N0eWxlZEVsZW1lbnQgPSBl
ICYmIGUtPmlzU3R5bGVkRWxlbWVudCgpID8gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KGUp
IDogMDsKKyAgICBtX2VsZW1lbnRMaW5rU3RhdGUgPSBlID8gZS0+ZG9jdW1lbnQoKS0+dmlzaXRl
ZExpbmtTdGF0ZSgpLT5kZXRlcm1pbmVMaW5rU3RhdGUoZSkgOiBOb3RJbnNpZGVMaW5rOworfQor
CitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjppbml0RWxlbWVudChFbGVtZW50KiBlKQorewor
ICAgIGlmIChtX3N0YXRlLmVsZW1lbnQoKSAhPSBlKSB7CisgICAgICAgIG1fc3RhdGUuaW5pdEVs
ZW1lbnQoZSk7CisgICAgICAgIGlmIChlICYmIGUgPT0gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRF
bGVtZW50KCkpIHsKKyAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNldERpcmVjdGlvblNldE9u
RG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKKyAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNldFdy
aXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOworICAgICAgICB9CisgICAgfQor
fQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2
ZShEb2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclJl
Z2lvbiogcmVnaW9uRm9yU3R5bGluZykKK3sKKyAgICBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHBz
ZXVkb1N0eWxlUmVxdWVzdDsKKyAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHls
aW5nOworCisgICAgaWYgKGUpIHsKKyAgICAgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4
dChlKTsKKyAgICAgICAgbV9wYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVy
aW5nQW5kU3R5bGUoKTsKKyAgICAgICAgbV9wYXJlbnRTdHlsZSA9IGNvbnRleHQucmVzZXRTdHls
ZUluaGVyaXRhbmNlKCkgPyAwIDoKKyAgICAgICAgICAgIHBhcmVudFN0eWxlID8gcGFyZW50U3R5
bGUgOgorICAgICAgICAgICAgbV9wYXJlbnROb2RlID8gbV9wYXJlbnROb2RlLT5yZW5kZXJTdHls
ZSgpIDogMDsKKyAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBjb250ZXh0
Lmluc2VydGlvblBvaW50KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wYXJlbnROb2RlID0g
MDsKKyAgICAgICAgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOworICAgICAgICBtX2Rpc3Ry
aWJ1dGVkVG9JbnNlcnRpb25Qb2ludCA9IGZhbHNlOworICAgIH0KKworICAgIE5vZGUqIGRvY0Vs
ZW1lbnQgPSBlID8gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgOiAwOworICAgIFJl
bmRlclN0eWxlKiBkb2NTdHlsZSA9IGRvY3VtZW50LT5yZW5kZXJTdHlsZSgpOworICAgIG1fcm9v
dEVsZW1lbnRTdHlsZSA9IGRvY0VsZW1lbnQgJiYgZSAhPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVu
dC0+cmVuZGVyU3R5bGUoKSA6IGRvY1N0eWxlOworCisgICAgbV9zdHlsZSA9IDA7CisgICAgbV9w
ZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgbV9ydWxlTGlzdCA9IDA7CisgICAg
bV9mb250RGlydHkgPSBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNl
YXJjaFRocmVzaG9sZCA9IDEwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaExl
dmVsVGhyZXNob2xkID0gMTA7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwYXJlbnRFbGVtZW50UHJl
dmVudHNTaGFyaW5nKGNvbnN0IEVsZW1lbnQqIHBhcmVudEVsZW1lbnQpCit7CisgICAgaWYgKCFw
YXJlbnRFbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHBhcmVudEVs
ZW1lbnQtPmhhc0ZsYWdzU2V0RHVyaW5nU3R5bGluZ09mQ2hpbGRyZW4oKTsKK30KKworTm9kZSog
U3R5bGVSZXNvbHZlcjo6bG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVk
JiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdAoreworICAgIGlmICh2aXNpdGVkTm9kZUNvdW50ID49
IGNTdHlsZVNlYXJjaFRocmVzaG9sZCAqIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc1N0eWxlZEVsZW1l
bnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHBhcmVudC0+aGFzU2NvcGVkSFRNTFN0
eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgU3R5bGVkRWxlbWVudCogcCA9IHN0
YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihwYXJlbnQpOworICAgIGlmIChwLT5pbmxpbmVTdHls
ZSgpKQorICAgICAgICByZXR1cm4gMDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChwLT5pc1NW
R0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4ocCktPmFuaW1hdGVkU01JTFN0
eWxlUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIGlmIChwLT5o
YXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHAtPmlk
Rm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSBwLT5yZW5kZXJTdHlsZSgpOworICAgIHVuc2lnbmVk
IHN1YmNvdW50ID0gMDsKKyAgICBOb2RlKiB0aGlzQ291c2luID0gcDsKKyAgICBOb2RlKiBjdXJy
ZW50Tm9kZSA9IHAtPnByZXZpb3VzU2libGluZygpOworCisgICAgLy8gUmVzZXJ2ZSB0aGUgdHJp
ZXMgZm9yIHRoaXMgbGV2ZWwuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMgc3VyZSB0aGF0IHRoZSBh
bGdvcml0aG0KKyAgICAvLyB3aWxsIG5ldmVyIGdvIGRlZXBlciB0aGFuIGNTdHlsZVNlYXJjaExl
dmVsVGhyZXNob2xkIGxldmVscyBpbnRvIHJlY3Vyc2lvbi4KKyAgICB2aXNpdGVkTm9kZUNvdW50
ICs9IGNTdHlsZVNlYXJjaFRocmVzaG9sZDsKKyAgICB3aGlsZSAodGhpc0NvdXNpbikgeworICAg
ICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKKyAgICAgICAgICAgICsrc3ViY291bnQ7CisgICAg
ICAgICAgICBpZiAoY3VycmVudE5vZGUtPnJlbmRlclN0eWxlKCkgPT0gcGFyZW50U3R5bGUgJiYg
Y3VycmVudE5vZGUtPmxhc3RDaGlsZCgpCisgICAgICAgICAgICAgICAgJiYgY3VycmVudE5vZGUt
PmlzRWxlbWVudE5vZGUoKSAmJiAhcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyh0b0VsZW1l
bnQoY3VycmVudE5vZGUpKQorI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgICAgICAgICAgICAg
ICYmICF0b0VsZW1lbnQoY3VycmVudE5vZGUpLT5zaGFkb3coKQorI2VuZGlmCisgICAgICAgICAg
ICAgICAgKSB7CisgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB1bnVzZWQgcmVzZXJ2ZWQg
dHJpZXMuCisgICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVDb3VudCAtPSBjU3R5bGVTZWFyY2hU
aHJlc2hvbGQgLSBzdWJjb3VudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGUt
Pmxhc3RDaGlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1YmNvdW50ID49
IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnByZXZpb3VzU2libGluZygpOworICAg
ICAgICB9CisgICAgICAgIGN1cnJlbnROb2RlID0gbG9jYXRlQ291c2luTGlzdCh0aGlzQ291c2lu
LT5wYXJlbnRFbGVtZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOworICAgICAgICB0aGlzQ291c2lu
ID0gY3VycmVudE5vZGU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgU3R5bGVS
ZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCogcnVs
ZVNldCkKK3sKKyAgICBpZiAoIXJ1bGVTZXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBt
X3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisKKyAgICBtX3N0YXRlLnNldE1vZGUoU2Vs
ZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMpOworICAgIGludCBmaXJzdFJ1bGVJbmRleCA9IC0x
LCBsYXN0UnVsZUluZGV4ID0gLTE7CisgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZShmaXJzdFJ1bGVJ
bmRleCwgbGFzdFJ1bGVJbmRleCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1
ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOworICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNo
ZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKyAgICBpZiAobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5p
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6
Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7
CisgICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBIVE1MSW5wdXRFbGVtZW50
KiB0aGlzSW5wdXRFbGVtZW50ID0gZWxlbWVudC0+dG9JbnB1dEVsZW1lbnQoKTsKKyAgICBIVE1M
SW5wdXRFbGVtZW50KiBvdGhlcklucHV0RWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKS0+dG9JbnB1
dEVsZW1lbnQoKTsKKworICAgIGlmICghdGhpc0lucHV0RWxlbWVudCB8fCAhb3RoZXJJbnB1dEVs
ZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50
LT5lbGVtZW50RGF0YSgpICE9IG90aGVySW5wdXRFbGVtZW50LT5lbGVtZW50RGF0YSgpKSB7Cisg
ICAgICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSAh
PSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZSh0eXBlQXR0cikpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5mYXN0R2V0
QXR0cmlidXRlKHJlYWRvbmx5QXR0cikgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRy
aWJ1dGUocmVhZG9ubHlBdHRyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkgIT0gb3RoZXJJbnB1dEVs
ZW1lbnQtPmlzQXV0b2ZpbGxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRo
aXNJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNoZWNrZWQoKSAhPSBvdGhlcklucHV0RWxlbWVu
dC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYg
KHRoaXNJbnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpICE9IG90aGVySW5wdXRFbGVtZW50
LT5pc0luZGV0ZXJtaW5hdGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlz
SW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzUmVxdWly
ZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzRW5hYmxl
ZEZvcm1Db250cm9sKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0VuYWJsZWRGb3JtQ29udHJvbCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aXNEZWZhdWx0QnV0
dG9uRm9yRm9ybSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNEZWZhdWx0QnV0dG9uRm9yRm9ybSgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoc3RhdGUuZG9jdW1lbnQoKS0+Y29u
dGFpbnNWYWxpZGl0eVN0eWxlUnVsZXMoKSkgeworICAgICAgICBib29sIHdpbGxWYWxpZGF0ZSA9
IGVsZW1lbnQtPndpbGxWYWxpZGF0ZSgpOworCisgICAgICAgIGlmICh3aWxsVmFsaWRhdGUgIT0g
c3RhdGUuZWxlbWVudCgpLT53aWxsVmFsaWRhdGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpZiAod2lsbFZhbGlkYXRlICYmIChlbGVtZW50LT5pc1ZhbGlkRm9ybUNv
bnRyb2xFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1ZhbGlkRm9ybUNvbnRyb2xFbGVt
ZW50KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChlbGVtZW50
LT5pc0luUmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzSW5SYW5nZSgpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChlbGVtZW50LT5pc091dE9mUmFuZ2UoKSAh
PSBzdGF0ZS5lbGVtZW50KCktPmlzT3V0T2ZSYW5nZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wg
ZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICAvLyBGSVhN
RTogVGhpcyBsaW5lIGlzIHN1cnByaXNpbmdseSBob3QsIHdlIG1heSB3aXNoIHRvIGlubGluZSBo
YXNEaXJlY3Rpb25BdXRvIGludG8gU3R5bGVSZXNvbHZlci4KKyAgICByZXR1cm4gZWxlbWVudC0+
aXNIVE1MRWxlbWVudCgpICYmIHRvSFRNTEVsZW1lbnQoZWxlbWVudCktPmhhc0RpcmVjdGlvbkF1
dG8oKTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRp
Y2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqIHNoYXJpbmdDYW5kaWRh
dGUpIGNvbnN0Cit7CisgICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAo
c3RhdGUuZWxlbWVudCgpLT5lbGVtZW50RGF0YSgpID09IHNoYXJpbmdDYW5kaWRhdGUtPmVsZW1l
bnREYXRhKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCkt
PmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRl
LT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRy
KSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFzdGF0ZS5lbGVtZW50QWZmZWN0ZWRCeUNsYXNz
UnVsZXMoKSkgeworICAgICAgICBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSAmJiBj
bGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChzaGFyaW5nQ2FuZGlk
YXRlLT5oYXNDbGFzcygpKSB7CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgLy8gU1ZHIGVsZW1l
bnRzIHJlcXVpcmUgYSAoc2xvdyEpIGdldEF0dHJpYnV0ZSBjb21wYXJpc2lvbiBiZWNhdXNlICJj
bGFzcyIgaXMgYW4gYW5pbWF0YWJsZSBhdHRyaWJ1dGUgZm9yIFNWRy4KKyAgICAgICAgaWYgKHN0
YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5l
bGVtZW50KCktPmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmdl
dEF0dHJpYnV0ZShjbGFzc0F0dHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+
Y2xhc3NOYW1lcygpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgfQorI2VuZGlm
CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdGF0ZS5zdHls
ZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc2hhcmluZ0NhbmRp
ZGF0ZS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisjaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCisgICAgaWYgKHN0YXRlLmVsZW1lbnQo
KS0+aGFzVGFnTmFtZShwcm9ncmVzc1RhZykpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhU
TUxQcm9ncmVzc0VsZW1lbnQqPihzdGF0ZS5lbGVtZW50KCkpLT5pc0RldGVybWluYXRlKCkgIT0g
c3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHNoYXJpbmdDYW5kaWRhdGUpLT5pc0Rl
dGVybWluYXRlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2VuZGlmCisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxl
V2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKK3sKKyAgICBSZW5kZXJT
dHlsZSogc3R5bGUgPSBlbGVtZW50LT5yZW5kZXJTdHlsZSgpOworICAgIGNvbnN0IFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAoIXN0eWxlKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgaWYgKHN0eWxlLT51bmlxdWUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
IChzdHlsZS0+aGFzVW5pcXVlUHNldWRvU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT50YWdRTmFtZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+dGFnUU5hbWUo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5pbmxpbmVTdHlsZSgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNh
bGMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKGVs
ZW1lbnQtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihlbGVtZW50
KS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyNlbmRpZgorICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlz
TGluaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmhvdmVyZWQo
KSAhPSBzdGF0ZS5lbGVtZW50KCktPmhvdmVyZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT5hY3RpdmUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmFjdGl2ZSgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmZvY3VzZWQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmZvY3VzZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChl
bGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+c2hhZG93UHNldWRv
SWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQt
PmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYg
KCFzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKGVs
ZW1lbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmFkZGl0aW9u
YWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+
YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGlmIChlbGVtZW50LT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5pZHNJblJ1bGVzLmNvbnRhaW5zKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1w
bCgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5oYXNTY29wZWRI
VE1MU3R5bGVDaGlsZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTog
V2Ugc2hvdWxkIHNoYXJlIHN0eWxlIGZvciBvcHRpb24gYW5kIG9wdGdyb3VwIHdoZW5ldmVyIHBv
c3NpYmxlLgorICAgIC8vIEJlZm9yZSBkb2luZyBzbywgd2UgbmVlZCB0byByZXNvbHZlIGlzc3Vl
cyBpbiBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zCisgICAgLy8gYW5kIFJlbmRl
ck1lbnVMaXN0OjpzZXRUZXh0LiBTZWUgYWxzbyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9ODg0MDUKKyAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcp
IHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBib29sIGlzQ29udHJvbCA9IGVsZW1lbnQtPmlzRm9ybUNvbnRyb2xFbGVtZW50
KCk7CisKKyAgICBpZiAoaXNDb250cm9sICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNGb3JtQ29udHJv
bEVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGlzQ29udHJvbCAm
JiAhY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoc3R5bGUtPnRyYW5zaXRpb25zKCkgfHwgc3R5bGUtPmFuaW1hdGlvbnMo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgIC8vIFR1cm4gb2ZmIHN0eWxlIHNoYXJpbmcgZm9yIGVsZW1lbnRzIHRoYXQgY2Fu
IGdhaW4gbGF5ZXJzIGZvciByZWFzb25zIG91dHNpZGUgb2YgdGhlIHN0eWxlIHN5c3RlbS4KKyAg
ICAvLyBTZWUgY29tbWVudHMgaW4gUmVuZGVyT2JqZWN0OjpzZXRTdHlsZSgpLgorICAgIGlmIChl
bGVtZW50LT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShmcmFt
ZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShlbWJlZFRhZykgfHwgZWxlbWVudC0+aGFzVGFn
TmFtZShvYmplY3RUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXBwbGV0VGFnKSB8fCBlbGVt
ZW50LT5oYXNUYWdOYW1lKGNhbnZhc1RhZykKKyNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9W
SURFTykKKyAgICAgICAgLy8gV2l0aCBwcm94eWluZywgdGhlIG1lZGlhIGVsZW1lbnRzIGFyZSBi
YWNrZWQgYnkgYSBSZW5kZXJFbWJlZGRlZE9iamVjdC4KKyAgICAgICAgfHwgZWxlbWVudC0+aGFz
VGFnTmFtZSh2aWRlb1RhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhdWRpb1RhZykKKyNlbmRp
ZgorICAgICAgICApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisgICAgaWYgKGVs
ZW1lbnRIYXNEaXJlY3Rpb25BdXRvKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgJiYgc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpICE9
IHN0eWxlLT5pbnNpZGVMaW5rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIEVOQUJM
RShWSURFT19UUkFDSykKKyAgICAvLyBEZW55IHNoYXJpbmcgc3R5bGVzIGJldHdlZW4gV2ViVlRU
IGFuZCBub24tV2ViVlRUIG5vZGVzLgorICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQo
KSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgJiYgc3RhdGUuZWxl
bWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSAmJiB0b1dlYlZUVEVsZW1lbnQoZWxlbWVudCktPmlz
UGFzdE5vZGUoKSAhPSB0b1dlYlZUVEVsZW1lbnQoc3RhdGUuZWxlbWVudCgpKS0+aXNQYXN0Tm9k
ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworI2lmIEVOQUJMRShGVUxMU0NS
RUVOX0FQSSkKKyAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT53ZWJraXRD
dXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSB8fCBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9j
dW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgU3R5bGVkRWxl
bWVudCogU3R5bGVSZXNvbHZlcjo6ZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSogbm9k
ZSwgdW5zaWduZWQmIGNvdW50KSBjb25zdAoreworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9k
ZS0+cHJldmlvdXNTaWJsaW5nKCkpIHsKKyAgICAgICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1l
bnQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoY2FuU2hhcmVTdHlsZVdp
dGhFbGVtZW50KHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKSkpCisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgaWYgKGNvdW50KysgPT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHls
ZWRFbGVtZW50Kj4obm9kZSk7Cit9CisKK1JlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2Nh
dGVTaGFyZWRTdHlsZSgpCit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAo
IXN0YXRlLnN0eWxlZEVsZW1lbnQoKSB8fCAhc3RhdGUucGFyZW50U3R5bGUoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgaW5saW5lIHN0eWxlIGl0IGlz
IHByb2JhYmx5IHVuaXF1ZS4KKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVT
dHlsZSgpKQorICAgICAgICByZXR1cm4gMDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChzdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1l
bnQqPihzdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMo
KSkKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAvLyBJZHMgc3RvcCBzdHlsZSBzaGFy
aW5nIGlmIHRoZXkgc2hvdyB1cCBpbiB0aGUgc3R5bGVzaGVldHMuCisgICAgaWYgKHN0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxl
cy5jb250YWlucyhzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCku
aW1wbCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50
c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQorICAgICAgICByZXR1
cm4gMDsKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNTY29wZWRIVE1MU3R5bGVD
aGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RhdGUuZWxlbWVudCgpID09IHN0
YXRlLmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAo
ZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oc3RhdGUuZWxlbWVudCgpKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICAvLyBDYWNoZSB3aGV0aGVyIHN0YXRlLmVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkg
YW55IGtub3duIGNsYXNzIHNlbGVjdG9ycy4KKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3Qg
YmUgYSBtZW1iZXIgdmFyaWFibGUuIFRoZSBzdHlsZSBzaGFyaW5nIGNvZGUgY291bGQgYmUgZmFj
dG9yZWQgb3V0IG9mIFN0eWxlUmVzb2x2ZXIuCisgICAgc3RhdGUuc2V0RWxlbWVudEFmZmVjdGVk
QnlDbGFzc1J1bGVzKHN0YXRlLmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmhhc0NsYXNz
KCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFt
ZXMoKSkpOworCisgICAgLy8gQ2hlY2sgcHJldmlvdXMgc2libGluZ3MgYW5kIHRoZWlyIGNvdXNp
bnMuCisgICAgdW5zaWduZWQgY291bnQgPSAwOworICAgIHVuc2lnbmVkIHZpc2l0ZWROb2RlQ291
bnQgPSAwOworICAgIFN0eWxlZEVsZW1lbnQqIHNoYXJlRWxlbWVudCA9IDA7CisgICAgTm9kZSog
Y291c2luTGlzdCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7Cisg
ICAgd2hpbGUgKGNvdXNpbkxpc3QpIHsKKyAgICAgICAgc2hhcmVFbGVtZW50ID0gZmluZFNpYmxp
bmdGb3JTdHlsZVNoYXJpbmcoY291c2luTGlzdCwgY291bnQpOworICAgICAgICBpZiAoc2hhcmVF
bGVtZW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNvdXNpbkxpc3QgPSBsb2NhdGVD
b3VzaW5MaXN0KGNvdXNpbkxpc3QtPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7
CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBleGhhdXN0ZWQgYWxsIG91ciBidWRnZXQgb3Ig
b3VyIGNvdXNpbnMuCisgICAgaWYgKCFzaGFyZUVsZW1lbnQpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgc2libGluZyBydWxlcyBhcHBseS4gVGhpcyBpcyBjaGVj
a2VkIGF0IHRoZSBlbmQgYXMgaXQgc2hvdWxkIHJhcmVseSBmYWlsLgorICAgIGlmIChzdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnNpYmxpbmcoKSkpCisgICAg
ICAgIHJldHVybiAwOworICAgIC8vIENhbid0IHNoYXJlIGlmIGF0dHJpYnV0ZSBydWxlcyBhcHBs
eS4KKyAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0
cy51bmNvbW1vbkF0dHJpYnV0ZSgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gQ2FuJ3Qg
c2hhcmUgaWYgQGhvc3QgQC1ydWxlcyBhcHBseS4KKyAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc0hvc3RSdWxlcygpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBUcmFja2lu
ZyBjaGlsZCBpbmRleCByZXF1aXJlcyB1bmlxdWUgc3R5bGUgZm9yIGVhY2ggbm9kZS4gVGhpcyBt
YXkgZ2V0IHNldCBieSB0aGUgc2libGluZyBydWxlIG1hdGNoIGFib3ZlLgorICAgIGlmIChwYXJl
bnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgp
KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5
bGUoKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCkKK3sKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSBzY29wZTsKKworICAgIC8vIEZp
cnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYgKENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCisgICAgICAgIHJl
c3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOworICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hl
ZXQgPSBtX21lZGl1bS0+bWVkaWFUeXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQorICAgICAgICA/
IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKKyAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdl
bnRTdHlsZVNoZWV0KTsKKworICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBm
cm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aW5R
dWlya3NNb2RlKCkpCisgICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHls
ZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlKTsKKworICAgIC8vIElmIGRvY3VtZW50IHVzZXMg
dmlldyBzb3VyY2Ugc3R5bGVzIChpbiB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIg
bW9kZSksIHRoZW4gd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hl
ZXQuCisgICAgaWYgKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpKQorICAgICAgICBtYXRjaFVB
UnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsK
K30KKworc3RhdGljIHZvaWQgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6
TW9kZSBwYWdpbmF0aW9uTW9kZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIGlmIChwYWdp
bmF0aW9uTW9kZSA9PSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICBzd2l0Y2ggKHBhZ2luYXRpb25Nb2RlKSB7CisgICAgY2FzZSBQYWdpbmF0
aW9uOjpMZWZ0VG9SaWdodFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMo
SG9yaXpvbnRhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5
bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDog
UmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3R5
bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9k
ZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24p
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlJpZ2h0VG9MZWZ0UGFnaW5h
dGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7
CisgICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Np
b24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Np
b24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9n
cmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgUGFnaW5hdGlvbjo6VG9wVG9Cb3R0b21QYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5z
ZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7CisgICAgICAgIGlmIChzdHlsZS0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9n
cmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1
bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1Jp
Z2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Q
cm9ncmVzc2lvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGFnaW5hdGlvbjo6Qm90dG9t
VG9Ub3BQYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29s
dW1uQXhpcyk7CisgICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVk
QmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNv
bHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3R5bGUtPnNldENv
bHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNl
Q29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQ6CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdl
dEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgRm9udE9y
aWVudGF0aW9uJiBmb250T3JpZW50YXRpb24sIE5vbkNKS0dseXBoT3JpZW50YXRpb24mIGdseXBo
T3JpZW50YXRpb24pCit7CisgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KSB7CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAgICAgIGdseXBo
T3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoc3R5bGUtPnRleHRPcmllbnRhdGlvbigp
KSB7CisgICAgY2FzZSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OgorICAgICAgICBmb250
T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNK
S0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgY2Fz
ZSBUZXh0T3JpZW50YXRpb25VcHJpZ2h0OgorICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0
aWNhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25V
cHJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5
czoKKyAgICAgICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpID09IExlZnRUb1JpZ2h0V3JpdGlu
Z01vZGUpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBtYXAgdG8gc2lkZXdh
eXMtbGVmdCwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAgICAgICAgICBmb250T3Jp
ZW50YXRpb24gPSBWZXJ0aWNhbDsKKyAgICAgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25D
SktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOworICAgICAgICBn
bHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Cisg
ICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzUmlnaHQ6Cisg
ICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAgICAgIGdseXBoT3JpZW50
YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgcmV0
dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9u
ID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsK
KyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxl
Rm9yRG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50LCBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxl
Y3RvcikKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKKworICAgIC8v
IEhUTUw1IHN0YXRlcyB0aGF0IHNlYW1sZXNzIGlmcmFtZXMgc2hvdWxkIHJlcGxhY2UgZGVmYXVs
dCBDU1MgdmFsdWVzCisgICAgLy8gd2l0aCB2YWx1ZXMgaW5oZXJpdGVkIGZyb20gdGhlIGNvbnRh
aW5pbmcgaWZyYW1lIGVsZW1lbnQuIEhvd2V2ZXIsCisgICAgLy8gc29tZSB2YWx1ZXMgKHN1Y2gg
YXMgdGhlIGNhc2Ugb2YgZGVzaWduTW9kZSA9ICJvbiIpIHN0aWxsIG5lZWQgdG8KKyAgICAvLyBi
ZSBzZXQgYnkgdGhpcyAiZG9jdW1lbnQgc3R5bGUiLgorICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4g
ZG9jdW1lbnRTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAgICBib29sIHNlYW1sZXNz
V2l0aFBhcmVudCA9IGRvY3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQo
KTsKKyAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50KSB7CisgICAgICAgIFJlbmRlclN0eWxlKiBp
ZnJhbWVTdHlsZSA9IGRvY3VtZW50LT5zZWFtbGVzc1BhcmVudElGcmFtZSgpLT5yZW5kZXJTdHls
ZSgpOworICAgICAgICBpZiAoaWZyYW1lU3R5bGUpCisgICAgICAgICAgICBkb2N1bWVudFN0eWxl
LT5pbmhlcml0RnJvbShpZnJhbWVTdHlsZSk7CisgICAgfQorCisgICAgLy8gRklYTUU6IEl0J3Mg
bm90IGNsZWFyIHdoaWNoIHZhbHVlcyBiZWxvdyB3ZSB3YW50IHRvIG92ZXJyaWRlIGluIHRoZSBz
ZWFtbGVzcyBjYXNlIQorICAgIGRvY3VtZW50U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAg
IGlmICghc2VhbWxlc3NXaXRoUGFyZW50KSB7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFJU
TE9yZGVyaW5nKGRvY3VtZW50LT52aXN1YWxseU9yZGVyZWQoKSA/IFZpc3VhbE9yZGVyIDogTG9n
aWNhbE9yZGVyKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Wm9vbShmcmFtZSAmJiAhZG9j
dW1lbnQtPnByaW50aW5nKCkgPyBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKSA6IDEpOworICAgICAg
ICBkb2N1bWVudFN0eWxlLT5zZXRQYWdlU2NhbGVUcmFuc2Zvcm0oZnJhbWUgPyBmcmFtZS0+ZnJh
bWVTY2FsZUZhY3RvcigpIDogMSk7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldExvY2FsZShk
b2N1bWVudC0+Y29udGVudExhbmd1YWdlKCkpOworICAgIH0KKyAgICAvLyBUaGlzIG92ZXJyaWRl
cyBhbnkgLXdlYmtpdC11c2VyLW1vZGlmeSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGlmcmFt
ZS4KKyAgICBkb2N1bWVudFN0eWxlLT5zZXRVc2VyTW9kaWZ5KGRvY3VtZW50LT5pbkRlc2lnbk1v
ZGUoKSA/IFJFQURfV1JJVEUgOiBSRUFEX09OTFkpOworCisgICAgRWxlbWVudCogZG9jRWxlbWVu
dCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICBSZW5kZXJPYmplY3QqIGRvY0Vs
ZW1lbnRSZW5kZXJlciA9IGRvY0VsZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJlcigpIDogMDsK
KyAgICBpZiAoZG9jRWxlbWVudFJlbmRlcmVyKSB7CisgICAgICAgIC8vIFVzZSB0aGUgZGlyZWN0
aW9uIGFuZCB3cml0aW5nLW1vZGUgb2YgdGhlIGJvZHkgdG8gc2V0IHRoZQorICAgICAgICAvLyB2
aWV3cG9ydCdzIGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIHVubGVzcyB0aGUgcHJvcGVydHkg
aXMgc2V0IG9uIHRoZSBkb2N1bWVudCBlbGVtZW50LgorICAgICAgICAvLyBJZiB0aGVyZSBpcyBu
byBib2R5LCB0aGVuIHVzZSB0aGUgZG9jdW1lbnQgZWxlbWVudC4KKyAgICAgICAgUmVuZGVyT2Jq
ZWN0KiBib2R5UmVuZGVyZXIgPSBkb2N1bWVudC0+Ym9keSgpID8gZG9jdW1lbnQtPmJvZHkoKS0+
cmVuZGVyZXIoKSA6IDA7CisgICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT53
cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgICAgICBkb2N1bWVudFN0
eWxlLT5zZXRXcml0aW5nTW9kZShib2R5UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9k
ZShkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOworICAgICAgICBp
ZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+ZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1l
bnQoKSkKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihib2R5UmVuZGVy
ZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9j
dW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+ZGly
ZWN0aW9uKCkpOworICAgIH0KKworICAgIGlmIChmcmFtZSkgeworICAgICAgICBpZiAoRnJhbWVW
aWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygpKSB7CisgICAgICAgICAgICBjb25zdCBQYWdp
bmF0aW9uJiBwYWdpbmF0aW9uID0gZnJhbWVWaWV3LT5wYWdpbmF0aW9uKCk7CisgICAgICAgICAg
ICBpZiAocGFnaW5hdGlvbi5tb2RlICE9IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKSB7CisgICAg
ICAgICAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUocGFnaW5hdGlvbi5tb2RlLCBk
b2N1bWVudFN0eWxlLmdldCgpKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRD
b2x1bW5HYXAocGFnaW5hdGlvbi5nYXApOworICAgICAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3
KiB2aWV3ID0gZG9jdW1lbnQtPnJlbmRlclZpZXcoKSkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAodmlldy0+aGFzQ29sdW1ucygpKQorICAgICAgICAgICAgICAgICAgICAgICAgdmlldy0+dXBk
YXRlQ29sdW1uSW5mb0Zyb21TdHlsZShkb2N1bWVudFN0eWxlLmdldCgpKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZWFtbGVz
cyBpZnJhbWVzIHdhbnQgdG8gaW5oZXJpdCB0aGVpciBmb250IGZyb20gdGhlaXIgcGFyZW50IGlm
cmFtZSwgc28gZWFybHkgcmV0dXJuIGJlZm9yZSBzZXR0aW5nIHRoZSBmb250LgorICAgIGlmIChz
ZWFtbGVzc1dpdGhQYXJlbnQpCisgICAgICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2Uo
KTsKKworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgZm9udERlc2Ny
aXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKGRvY3Vt
ZW50U3R5bGUtPmxvY2FsZSgpKSk7CisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3Vt
ZW50LT5zZXR0aW5ncygpKSB7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVy
Rm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0
dXRpb25FbmFibGVkKCkpOworICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9k
ZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgc3RhbmRhcmRGb250ID0gc2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseShmb250RGVz
Y3JpcHRpb24uc2NyaXB0KCkpOworICAgICAgICBpZiAoIXN0YW5kYXJkRm9udC5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNj
cmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZp
cnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udCk7CisgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7CisgICAgICAgIH0KKyAgICAg
ICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFs
dWVYeFNtYWxsICsgMSk7CisgICAgICAgIGludCBzaXplID0gU3R5bGVSZXNvbHZlcjo6Zm9udFNp
emVGb3JLZXl3b3JkKGRvY3VtZW50LCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpOworICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKKyAgICAgICAgYm9vbCB1c2VT
Vkdab29tUnVsZXMgPSBkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpOworICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZy
b21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCBkb2N1bWVudFN0eWxlLmdldCgpLCBmb250RGVzY3Jp
cHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKSk7CisgICAgfSBl
bHNlCisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+
cHJpbnRpbmcoKSk7CisKKyAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOworICAg
IE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKKyAgICBnZXRGb250QW5k
R2x5cGhPcmllbnRhdGlvbihkb2N1bWVudFN0eWxlLmdldCgpLCBmb250T3JpZW50YXRpb24sIGds
eXBoT3JpZW50YXRpb24pOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250
T3JpZW50YXRpb24pOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0
aW9uKGdseXBoT3JpZW50YXRpb24pOworCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0Rm9udERlc2Ny
aXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgZG9jdW1lbnRTdHlsZS0+Zm9udCgpLnVwZGF0
ZShmb250U2VsZWN0b3IpOworCisgICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwor
fQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdFNoYWRvd0JvdW5kYXJ5KGNvbnN0IEVsZW1lbnQq
IGVsZW1lbnQpCit7CisgICAgaWYgKCFlbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSA9IGVsZW1lbnQtPnBhcmVudE5vZGUoKTsKKyAg
ICByZXR1cm4gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLT5pc1NoYWRvd1Jvb3QoKTsKK30KKwor
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KEVs
ZW1lbnQqIGVsZW1lbnQsIFJlbmRlclN0eWxlKiBkZWZhdWx0UGFyZW50LAorICAgIFN0eWxlU2hh
cmluZ0JlaGF2aW9yIHNoYXJpbmdCZWhhdmlvciwgUnVsZU1hdGNoaW5nQmVoYXZpb3IgbWF0Y2hp
bmdCZWhhdmlvciwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQoreworICAgIC8vIE9u
Y2UgYW4gZWxlbWVudCBoYXMgYSByZW5kZXJlciwgd2UgZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgaXQs
IHNpbmNlIG90aGVyd2lzZSB0aGUgcmVuZGVyZXIKKyAgICAvLyB3aWxsIHZhbmlzaCBpZiBhIHN0
eWxlIHJlY2FsYyBoYXBwZW5zIGR1cmluZyBsb2FkaW5nLgorICAgIGlmIChzaGFyaW5nQmVoYXZp
b3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIWVsZW1lbnQtPmRvY3VtZW50KCktPmhhdmVTdHls
ZXNoZWV0c0xvYWRlZCgpICYmICFlbGVtZW50LT5yZW5kZXJlcigpKSB7CisgICAgICAgIGlmICgh
c19zdHlsZU5vdFlldEF2YWlsYWJsZSkgeworICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWls
YWJsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKS5sZWFrUmVmKCk7CisgICAgICAgICAgICBzX3N0
eWxlTm90WWV0QXZhaWxhYmxlLT5zZXREaXNwbGF5KE5PTkUpOworICAgICAgICAgICAgc19zdHls
ZU5vdFlldEF2YWlsYWJsZS0+Zm9udCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7CisgICAgICAg
IH0KKyAgICAgICAgZWxlbWVudC0+ZG9jdW1lbnQoKS0+c2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xk
ZXJTdHlsZSgpOworICAgICAgICByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKKyAgICB9
CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGluaXRFbGVtZW50KGVsZW1lbnQp
OworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVm
YXVsdFBhcmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOworICAgIGlmIChzaGFyaW5n
QmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludCgpKSB7CisgICAgICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0
ZVNoYXJlZFN0eWxlKCk7CisgICAgICAgIGlmIChzaGFyZWRTdHlsZSkKKyAgICAgICAgICAgIHJl
dHVybiBzaGFyZWRTdHlsZTsKKyAgICB9CisKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNsb25l
Rm9yUGFyZW50OworCisgICAgaWYgKHN0YXRlLnBhcmVudFN0eWxlKCkpIHsKKyAgICAgICAgc3Rh
dGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKKyAgICAgICAgc3RhdGUuc3R5bGUo
KS0+aW5oZXJpdEZyb20oc3RhdGUucGFyZW50U3R5bGUoKSwgaXNBdFNoYWRvd0JvdW5kYXJ5KGVs
ZW1lbnQpID8gUmVuZGVyU3R5bGU6OkF0U2hhZG93Qm91bmRhcnkgOiBSZW5kZXJTdHlsZTo6Tm90
QXRTaGFkb3dCb3VuZGFyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGUuc2V0U3R5bGUo
ZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpKTsKKyAgICAgICAgY2xvbmVGb3JQYXJlbnQgPSBSZW5k
ZXJTdHlsZTo6Y2xvbmUoc3RhdGUuc3R5bGUoKSk7CisgICAgICAgIHN0YXRlLnNldFBhcmVudFN0
eWxlKGNsb25lRm9yUGFyZW50LmdldCgpKTsKKyAgICB9CisgICAgLy8gY29udGVudGVkaXRhYmxl
IGF0dHJpYnV0ZSAoaW1wbGVtZW50ZWQgYnkgLXdlYmtpdC11c2VyLW1vZGlmeSkgc2hvdWxkCisg
ICAgLy8gYmUgcHJvcGFnYXRlZCBmcm9tIHNoYWRvdyBob3N0IHRvIGRpc3RyaWJ1dGVkIG5vZGUu
CisgICAgaWYgKHN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7CisgICAgICAg
IGlmIChFbGVtZW50KiBwYXJlbnQgPSBlbGVtZW50LT5wYXJlbnRFbGVtZW50KCkpIHsKKyAgICAg
ICAgICAgIGlmIChSZW5kZXJTdHlsZSogc3R5bGVPZlNoYWRvd0hvc3QgPSBwYXJlbnQtPnJlbmRl
clN0eWxlKCkpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlck1vZGlmeShz
dHlsZU9mU2hhZG93SG9zdC0+dXNlck1vZGlmeSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChlbGVtZW50LT5pc0xpbmsoKSkgeworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJc0xp
bmsodHJ1ZSk7CisgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0ZSA9IHN0YXRlLmVsZW1lbnRM
aW5rU3RhdGUoKTsKKyAgICAgICAgaWYgKGxpbmtTdGF0ZSAhPSBOb3RJbnNpZGVMaW5rKSB7Cisg
ICAgICAgICAgICBib29sIGZvcmNlVmlzaXRlZCA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6
Zm9yY2VQc2V1ZG9TdGF0ZShlbGVtZW50LCBDU1NTZWxlY3Rvcjo6UHNldWRvVmlzaXRlZCk7Cisg
ICAgICAgICAgICBpZiAoZm9yY2VWaXNpdGVkKQorICAgICAgICAgICAgICAgIGxpbmtTdGF0ZSA9
IEluc2lkZVZpc2l0ZWRMaW5rOworICAgICAgICB9CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dEluc2lkZUxpbmsobGlua1N0YXRlKTsKKyAgICB9CisKKyAgICBib29sIG5lZWRzQ29sbGVjdGlv
biA9IGZhbHNlOworICAgIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZW5zdXJlRGVmYXVsdFN0eWxl
U2hlZXRzRm9yRWxlbWVudChlbGVtZW50LCBuZWVkc0NvbGxlY3Rpb24pOworICAgIGlmIChuZWVk
c0NvbGxlY3Rpb24pCisgICAgICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50
KCktPmlzVmlld1NvdXJjZSgpLCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOworCisgICAgTWF0Y2hS
ZXN1bHQgbWF0Y2hSZXN1bHQ7CisgICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5
VXNlckFnZW50UnVsZXMpCisgICAgICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7CisgICAg
ZWxzZQorICAgICAgICBtYXRjaEFsbFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9y
ICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKKworICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXMobWF0Y2hSZXN1bHQsIGVsZW1lbnQpOworCisgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxl
IG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVw
cykuCisgICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5
bGUoKSwgZWxlbWVudCk7CisKKyAgICBzdGF0ZS5jbGVhcigpOyAvLyBDbGVhciBvdXQgZm9yIHRo
ZSBuZXh0IHJlc29sdmUuCisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVy
KCk7CisKKyAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KKyAgICByZXR1cm4gc3RhdGUudGFr
ZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0
eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgY29uc3QgU3R5
bGVLZXlmcmFtZSoga2V5ZnJhbWUsIEtleWZyYW1lVmFsdWUmIGtleWZyYW1lVmFsdWUpCit7Cisg
ICAgTWF0Y2hSZXN1bHQgcmVzdWx0OworICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQor
ICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVz
KCkpOworCisgICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOworCisgICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKKworICAgIC8vIENyZWF0ZSB0aGUgc3R5bGUKKyAgICBzdGF0ZS5zZXRTdHls
ZShSZW5kZXJTdHlsZTo6Y2xvbmUoZWxlbWVudFN0eWxlKSk7CisgICAgc3RhdGUuc2V0TGluZUhl
aWdodFZhbHVlKDApOworCisgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgd2l0aCAhaW1w
b3J0YW50LiBTaW5jZSB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lCisgICAgLy8gZGVjbCwgdGhlcmUn
cyBub3RoaW5nIHRvIG92ZXJyaWRlLiBTbyBqdXN0IGFkZCB0aGUgZmlyc3QgcHJvcGVydGllcy4K
KyAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyAgICBpZiAoa2V5ZnJhbWUtPnByb3Bl
cnRpZXMoKSkKKyAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9w
ZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMSwgaW5oZXJpdGVkT25seSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwg
Z28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgpOworCisgICAgLy8g
TGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9u
dC1zaXplCisgICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAgICBhcHBseVBy
b3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwor
CisgICAgLy8gTm93IGRvIHJlc3Qgb2YgdGhlIHByb3BlcnRpZXMuCisgICAgaWYgKGtleWZyYW1l
LT5wcm9wZXJ0aWVzKCkpCisgICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3Jp
dHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGly
dGllZCBieSBvbmUgb2YgdGhlIG5vbi1lc3NlbnRpYWwgZm9udCBwcm9wcywKKyAgICAvLyBnbyBh
aGVhZCBhbmQgdXBkYXRlIGl0IGEgc2Vjb25kIHRpbWUuCisgICAgdXBkYXRlRm9udCgpOworCisg
ICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgor
ICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisgICAgCisgICAgLy8gQWRkIGFsbCB0aGUgYW5p
bWF0aW5nIHByb3BlcnRpZXMgdG8gdGhlIGtleWZyYW1lLgorICAgIGlmIChjb25zdCBTdHlsZVBy
b3BlcnR5U2V0KiBzdHlsZURlY2xhcmF0aW9uID0ga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkgewor
ICAgICAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVy
dHlDb3VudCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3Vu
dDsgKytpKSB7CisgICAgICAgICAgICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0gc3R5bGVEZWNs
YXJhdGlvbi0+cHJvcGVydHlBdChpKS5pZCgpOworICAgICAgICAgICAgLy8gVGltaW5nLWZ1bmN0
aW9uIHdpdGhpbiBrZXlmcmFtZXMgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBub3QgYW5pbWF0
ZWQ7IGl0IGp1c3QKKyAgICAgICAgICAgIC8vIGRlc2NyaWJlcyB0aGUgdGltaW5nIGZ1bmN0aW9u
IGJldHdlZW4gdGhpcyBrZXlmcmFtZSBhbmQgdGhlIG5leHQuCisgICAgICAgICAgICBpZiAocHJv
cGVydHkgIT0gQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbikKKyAgICAg
ICAgICAgICAgICBrZXlmcmFtZVZhbHVlLmFkZFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKKwor
ICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpr
ZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVtZW50KiBlLCBjb25zdCBSZW5kZXJTdHlsZSog
ZWxlbWVudFN0eWxlLCBLZXlmcmFtZUxpc3QmIGxpc3QpCit7CisgICAgbGlzdC5jbGVhcigpOwor
CisgICAgLy8gR2V0IHRoZSBrZXlmcmFtZXNSdWxlIGZvciB0aGlzIG5hbWUKKyAgICBpZiAoIWUg
fHwgbGlzdC5hbmltYXRpb25OYW1lKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX2tleWZyYW1lc1J1bGVNYXAuY2hlY2tDb25zaXN0ZW5jeSgpOworCisgICAgS2V5ZnJhbWVz
UnVsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lc1J1bGVNYXAuZmluZChsaXN0LmFuaW1h
dGlvbk5hbWUoKS5pbXBsKCkpOworICAgIGlmIChpdCA9PSBtX2tleWZyYW1lc1J1bGVNYXAuZW5k
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFN0eWxlUnVsZUtleWZyYW1lcyoga2V5
ZnJhbWVzUnVsZSA9IGl0LT52YWx1ZS5nZXQoKTsKKworICAgIC8vIENvbnN0cnVjdCBhbmQgcG9w
dWxhdGUgdGhlIHN0eWxlIGZvciBlYWNoIGtleWZyYW1lCisgICAgY29uc3QgVmVjdG9yPFJlZlB0
cjxTdHlsZUtleWZyYW1lPiA+JiBrZXlmcmFtZXMgPSBrZXlmcmFtZXNSdWxlLT5rZXlmcmFtZXMo
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5ZnJhbWVzLnNpemUoKTsgKytpKSB7
CisgICAgICAgIC8vIEFwcGx5IHRoZSBkZWNsYXJhdGlvbiB0byB0aGUgc3R5bGUuIFRoaXMgaXMg
YSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGxvZ2ljIGluIHN0eWxlRm9yRWxlbWVudAorICAg
ICAgICBpbml0RWxlbWVudChlKTsKKyAgICAgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIGUpOworCisgICAgICAgIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1l
ID0ga2V5ZnJhbWVzW2ldLmdldCgpOworCisgICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVW
YWx1ZSgwLCAwKTsKKyAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZy
YW1lKGVsZW1lbnRTdHlsZSwga2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKKworICAgICAgICAv
LyBBZGQgdGhpcyBrZXlmcmFtZSBzdHlsZSB0byBhbGwgdGhlIGluZGljYXRlZCBrZXkgdGltZXMK
KyAgICAgICAgVmVjdG9yPGZsb2F0PiBrZXlzOworICAgICAgICBrZXlmcmFtZS0+Z2V0S2V5cyhr
ZXlzKTsKKyAgICAgICAgZm9yIChzaXplX3Qga2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMu
c2l6ZSgpOyArK2tleUluZGV4KSB7CisgICAgICAgICAgICBrZXlmcmFtZVZhbHVlLnNldEtleShr
ZXlzW2tleUluZGV4XSk7CisgICAgICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSAwJSBrZXlmcmFtZSBpcyBtaXNzaW5n
LCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlm
cmFtZSkKKyAgICBpbnQgaW5pdGlhbExpc3RTaXplID0gbGlzdC5zaXplKCk7CisgICAgaWYgKGlu
aXRpYWxMaXN0U2l6ZSA+IDAgJiYgbGlzdFswXS5rZXkoKSkgeworICAgICAgICBzdGF0aWMgU3R5
bGVLZXlmcmFtZSogemVyb1BlcmNlbnRLZXlmcmFtZTsKKyAgICAgICAgaWYgKCF6ZXJvUGVyY2Vu
dEtleWZyYW1lKSB7CisgICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlm
cmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOworICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFt
ZS0+c2V0S2V5VGV4dCgiMCUiKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZVZhbHVlIGtl
eWZyYW1lVmFsdWUoMCwgMCk7CisgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVG
b3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIHplcm9QZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFs
dWUpKTsKKyAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgfQorCisgICAg
Ly8gSWYgdGhlIDEwMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBp
ZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCisgICAgaWYgKGluaXRpYWxM
aXN0U2l6ZSA+IDAgJiYgKGxpc3RbbGlzdC5zaXplKCkgLSAxXS5rZXkoKSAhPSAxKSkgeworICAg
ICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogaHVuZHJlZFBlcmNlbnRLZXlmcmFtZTsKKyAgICAg
ICAgaWYgKCFodW5kcmVkUGVyY2VudEtleWZyYW1lKSB7CisgICAgICAgICAgICBodW5kcmVkUGVy
Y2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOworICAgICAg
ICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMTAwJSIpOworICAgICAg
ICB9CisgICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgxLCAwKTsKKyAgICAgICAg
a2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgaHVu
ZHJlZFBlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOworICAgICAgICBsaXN0Lmluc2Vy
dChrZXlmcmFtZVZhbHVlKTsKKyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0
eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlLCBjb25zdCBQc2V1
ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlKQoreworICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7CisgICAgaWYgKCFlKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpbml0RWxlbWVu
dChlKTsKKworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFy
ZW50U3R5bGUsIHBzZXVkb1N0eWxlUmVxdWVzdCk7CisgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVy
U3R5bGU6OmNyZWF0ZSgpKTsKKyAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRl
LnBhcmVudFN0eWxlKCkpOworCisgICAgLy8gU2luY2Ugd2UgZG9uJ3QgdXNlIHBzZXVkby1lbGVt
ZW50cyBpbiBhbnkgb2Ygb3VyIHF1aXJrL3ByaW50IHVzZXIgYWdlbnQgcnVsZXMsIGRvbid0IHdh
c3RlIHRpbWUgd2Fsa2luZworICAgIC8vIHRob3NlIHJ1bGVzLgorCisgICAgLy8gQ2hlY2sgVUEs
IHVzZXIgYW5kIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAg
ICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOworCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzKSB7CisgICAgICAgIG1hdGNoVXNlclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7
CisgICAgICAgIG1hdGNoQXV0aG9yUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKKyAgICB9CisK
KyAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIHN0YXRlLnN0eWxlKCktPnNldFN0eWxlVHlwZShwc2V1ZG9TdHls
ZVJlcXVlc3QucHNldWRvSWQpOworCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJl
c3VsdCwgZSk7CisKKyAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBh
bmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KKyAgICBhZGp1c3RSZW5k
ZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnBhcmVudFN0eWxlKCksIDApOworCisgICAg
Ly8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAg
IGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHls
ZVJlc29sdmVyKCk7CisKKyAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KKyAgICByZXR1cm4g
c3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQoreworICAgIG1fc3RhdGUuaW5pdEZv
clN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSk7
IC8vIG1fcm9vdEVsZW1lbnRTdHlsZSB3aWxsIGJlIHNldCB0byB0aGUgZG9jdW1lbnQgc3R5bGUu
CisKKyAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgbV9z
dGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisK
KyAgICBjb25zdCBib29sIGlzTGVmdCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25z
dCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOworICAgIGNvbnN0IFN0cmlu
ZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsKKyAgICAKKyAgICBNYXRjaFJlc3VsdCByZXN1
bHQ7CisgICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRl
ZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIG1hdGNoUGFnZVJ1
bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdl
KTsKKyAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBw
YWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCisgICAgbWF0Y2hQYWdlUnVsZXMocmVz
dWx0LCBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Cisg
ICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgYm9vbCBpbmhlcml0ZWRPbmx5
ID0gZmFsc2U7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgYXBwbHlNYXRjaGVkUHJv
cGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CisjZW5kaWYKKyAgICBh
cHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFs
c2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5
KTsKKworICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRl
IGl0IG5vdy4KKyAgICB1cGRhdGVGb250KCk7CisKKyAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQg
d2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUuCisgICAgaWYgKG1f
c3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVy
dHlMaW5lSGVpZ2h0LCBtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKKworICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCBy
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CisKKyAg
ICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisg
ICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0
eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgorICAgIHJldHVy
biBtX3N0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHls
ZVJlc29sdmVyOjpkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkKK3sKKyAgICBtX3N0YXRlLnNldFN0
eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgLy8gTWFrZSBzdXJlIG91ciBmb250cyBh
cmUgaW5pdGlhbGl6ZWQgaWYgd2UgZG9uJ3QgaW5oZXJpdCB0aGVtIGZyb20gb3VyIHBhcmVudCBz
dHlsZS4KKyAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpKSB7
CisgICAgICAgIGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOworICAgICAgICBtX3N0YXRl
LnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKCkpOworICAgIH0gZWxzZQorICAg
ICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoMCk7CisKKyAgICByZXR1cm4gbV9z
dGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVGb3JUZXh0KFRleHQqIHRleHROb2RlKQoreworICAgIEFTU0VSVCh0ZXh0Tm9k
ZSk7CisKKyAgICBOb2RlUmVuZGVyaW5nQ29udGV4dCBjb250ZXh0KHRleHROb2RlKTsKKyAgICBO
b2RlKiBwYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUo
KTsKKyAgICByZXR1cm4gY29udGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSB8fCAhcGFyZW50
Tm9kZSA/CisgICAgICAgIGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSA6IHBhcmVudE5vZGUtPnJl
bmRlclN0eWxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVy
U3R5bGUqIHN0eWxlKQoreworICAgIC8vIEludHJpbnNpYyBtYXJnaW4gdmFsdWUuCisgICAgY29u
c3QgaW50IGludHJpbnNpY01hcmdpbiA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworCisg
ICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGlu
ZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgorICAgIC8vIEZJWE1FOiBVc2lu
ZyAicXVpcmsiIHRvIGRlY2lkZSB0aGUgbWFyZ2luIHdhc24ndCBzZXQgaXMga2luZCBvZiBsYW1l
LgorICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7CisgICAgICAg
IGlmIChzdHlsZS0+bWFyZ2luTGVmdCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0
TWFyZ2luTGVmdChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgICAgICBpZiAo
c3R5bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJn
aW5SaWdodChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgIH0KKworICAgIGlm
IChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpIHsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5U
b3AoKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgoaW50
cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgp
LnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChpbnRy
aW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgfQorfQorCitzdGF0aWMgRURpc3BsYXkgZXF1aXZh
bGVudEJsb2NrRGlzcGxheShFRGlzcGxheSBkaXNwbGF5LCBib29sIGlzRmxvYXRpbmcsIGJvb2wg
c3RyaWN0UGFyc2luZykKK3sKKyAgICBzd2l0Y2ggKGRpc3BsYXkpIHsKKyAgICBjYXNlIEJMT0NL
OgorICAgIGNhc2UgVEFCTEU6CisgICAgY2FzZSBCT1g6CisgICAgY2FzZSBGTEVYOgorICAgIGNh
c2UgR1JJRDoKKyAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisKKyAgICBjYXNlIExJU1RfSVRFTToK
KyAgICAgICAgLy8gSXQgaXMgYSBXaW5JRSBidWcgdGhhdCBmbG9hdGVkIGxpc3QgaXRlbXMgbG9z
ZSB0aGVpciBidWxsZXRzLCBzbyB3ZSdsbCBlbXVsYXRlIHRoZSBxdWlyaywgYnV0IG9ubHkgaW4g
cXVpcmtzIG1vZGUuCisgICAgICAgIGlmICghc3RyaWN0UGFyc2luZyAmJiBpc0Zsb2F0aW5nKQor
ICAgICAgICAgICAgcmV0dXJuIEJMT0NLOworICAgICAgICByZXR1cm4gZGlzcGxheTsKKyAgICBj
YXNlIElOTElORV9UQUJMRToKKyAgICAgICAgcmV0dXJuIFRBQkxFOworICAgIGNhc2UgSU5MSU5F
X0JPWDoKKyAgICAgICAgcmV0dXJuIEJPWDsKKyAgICBjYXNlIElOTElORV9GTEVYOgorICAgICAg
ICByZXR1cm4gRkxFWDsKKyAgICBjYXNlIElOTElORV9HUklEOgorICAgICAgICByZXR1cm4gR1JJ
RDsKKworICAgIGNhc2UgSU5MSU5FOgorICAgIGNhc2UgUlVOX0lOOgorICAgIGNhc2UgQ09NUEFD
VDoKKyAgICBjYXNlIElOTElORV9CTE9DSzoKKyAgICBjYXNlIFRBQkxFX1JPV19HUk9VUDoKKyAg
ICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDoKKyAgICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoK
KyAgICBjYXNlIFRBQkxFX1JPVzoKKyAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKKyAgICBj
YXNlIFRBQkxFX0NPTFVNTjoKKyAgICBjYXNlIFRBQkxFX0NFTEw6CisgICAgY2FzZSBUQUJMRV9D
QVBUSU9OOgorICAgICAgICByZXR1cm4gQkxPQ0s7CisgICAgY2FzZSBOT05FOgorICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgfQorICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBCTE9DSzsKK30KKworLy8gQ1NTIHJlcXVp
cmVzIHRleHQtZGVjb3JhdGlvbiB0byBiZSByZXNldCBhdCBlYWNoIERPTSBlbGVtZW50IGZvciB0
YWJsZXMsIAorLy8gaW5saW5lIGJsb2NrcywgaW5saW5lIHRhYmxlcywgcnVuLWlucywgc2hhZG93
IERPTSBjcm9zc2luZ3MsIGZsb2F0aW5nIGVsZW1lbnRzLAorLy8gYW5kIGFic29sdXRlIG9yIHJl
bGF0aXZlbHkgcG9zaXRpb25lZCBlbGVtZW50cy4KK3N0YXRpYyBib29sIGRvZXNOb3RJbmhlcml0
VGV4dERlY29yYXRpb24oUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKQoreworICAgIHJl
dHVybiBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5M
SU5FX1RBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gUlVOX0lOCisgICAgICAgIHx8IHN0eWxl
LT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5F
X0JPWCB8fCBpc0F0U2hhZG93Qm91bmRhcnkoZSkKKyAgICAgICAgfHwgc3R5bGUtPmlzRmxvYXRp
bmcoKSB8fCBzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKTsKK30KKworc3RhdGljIGJvb2wg
aXNEaXNwbGF5RmxleGlibGVCb3goRURpc3BsYXkgZGlzcGxheSkKK3sKKyAgICByZXR1cm4gZGlz
cGxheSA9PSBGTEVYIHx8IGRpc3BsYXkgPT0gSU5MSU5FX0ZMRVg7Cit9CisKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6YWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUsIEVsZW1lbnQgKmUpCit7CisgICAgQVNTRVJUKHBhcmVudFN0eWxlKTsK
KworICAgIC8vIENhY2hlIG91ciBvcmlnaW5hbCBkaXNwbGF5LgorICAgIHN0eWxlLT5zZXRPcmln
aW5hbERpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSk7CisKKyAgICBpZiAoc3R5bGUtPmRpc3BsYXko
KSAhPSBOT05FKSB7CisgICAgICAgIC8vIElmIHdlIGhhdmUgYSA8dGQ+IHRoYXQgc3BlY2lmaWVz
IGEgZmxvYXQgcHJvcGVydHksIGluIHF1aXJrcyBtb2RlIHdlIGp1c3QgZHJvcCB0aGUgZmxvYXQK
KyAgICAgICAgLy8gcHJvcGVydHkuCisgICAgICAgIC8vIFNpdGVzIGFsc28gY29tbW9ubHkgdXNl
IGRpc3BsYXk6aW5saW5lL2Jsb2NrIG9uIDx0ZD5zIGFuZCA8dGFibGU+cy4gSW4gcXVpcmtzIG1v
ZGUgd2UgZm9yY2UKKyAgICAgICAgLy8gdGhlc2UgdGFncyB0byByZXRhaW4gdGhlaXIgZGlzcGxh
eSB0eXBlcy4KKyAgICAgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpICYmIGUpIHsK
KyAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSkgeworICAgICAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX0NFTEwpOworICAgICAgICAgICAgICAgIHN0eWxlLT5z
ZXRGbG9hdGluZyhOb0Zsb2F0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZS0+aGFzVGFnTmFt
ZSh0YWJsZVRhZykpCisgICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoc3R5bGUtPmlz
RGlzcGxheUlubGluZVR5cGUoKSA/IElOTElORV9UQUJMRSA6IFRBQkxFKTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBlLT5oYXNUYWdOYW1l
KHRoVGFnKSkpIHsKKyAgICAgICAgICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1M
X05PV1JBUCkgeworICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxs
eSBub3dyYXBwaW5nIG9yIGlmIHdlIHNob3VsZCBqdXN0CisgICAgICAgICAgICAgICAgLy8gdXNl
IG5vcm1hbCBpbnN0ZWFkLiBJZiB0aGUgd2lkdGggb2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4K
KyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBhY3R1YWxseSB1c2UgTk9XUkFQLgorICAgICAg
ICAgICAgICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ZpeGVkKCkpCisgICAgICAgICAgICAgICAg
ICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PUk1BTCk7CisgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVApOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGFibGVzIG5ldmVyIHN1cHBvcnQgdGhl
IC13ZWJraXQtKiB2YWx1ZXMgZm9yIHRleHQtYWxpZ24gYW5kIHdpbGwgcmVzZXQgYmFjayB0byB0
aGUgZGVmYXVsdC4KKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykgJiYg
KHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfTEVGVCB8fCBzdHlsZS0+dGV4dEFsaWduKCkg
PT0gV0VCS0lUX0NFTlRFUiB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oVEFTVEFSVCk7CisKKyAgICAgICAgLy8g
RnJhbWVzIGFuZCBmcmFtZXNldHMgbmV2ZXIgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9z
aXRpb246YWJzb2x1dGUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCisgICAgICAgIC8vIGZpeCBhIGNy
YXNoIHdoZXJlIGEgc2l0ZSB0cmllcyB0byBwb3NpdGlvbiB0aGVzZSBvYmplY3RzLiBUaGV5IGFs
c28gbmV2ZXIgaG9ub3IgZGlzcGxheS4KKyAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUo
ZnJhbWVUYWcpIHx8IGUtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKSkgeworICAgICAgICAgICAg
c3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KEJMT0NLKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJ1YnkgdGV4dCBkb2Vz
IG5vdCBzdXBwb3J0IGZsb2F0IG9yIHBvc2l0aW9uLiBUaGlzIG1pZ2h0IGNoYW5nZSB3aXRoIGV2
b2x1dGlvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFn
TmFtZShydFRhZykpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3Np
dGlvbik7CisgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAg
IH0KKworICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIG92ZXJyaWRpbmcgc3RhcnQv
LXdlYmtpdC1hdXRvIGxpa2UgdGhpcy4gRG8gaXQgaW4gaHRtbC5jc3MgaW5zdGVhZC4KKyAgICAg
ICAgLy8gVGFibGUgaGVhZGVycyB3aXRoIGEgdGV4dC1hbGlnbiBvZiAtd2Via2l0LWF1dG8gd2ls
bCBjaGFuZ2UgdGhlIHRleHQtYWxpZ24gdG8gY2VudGVyLgorICAgICAgICBpZiAoZSAmJiBlLT5o
YXNUYWdOYW1lKHRoVGFnKSAmJiBzdHlsZS0+dGV4dEFsaWduKCkgPT0gVEFTVEFSVCkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oQ0VOVEVSKTsKKworICAgICAgICBpZiAoZSAmJiBl
LT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShC
TE9DSyk7CisKKyAgICAgICAgLy8gQWJzb2x1dGUvZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywg
ZmxvYXRpbmcgZWxlbWVudHMgYW5kIHRoZSBkb2N1bWVudCBlbGVtZW50IG5lZWQgYmxvY2stbGlr
ZSBvdXRzaWRlIGRpc3BsYXkuCisgICAgICAgIGlmIChzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRp
b24oKSB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8IChlICYmIGUtPmRvY3VtZW50KCktPmRvY3Vt
ZW50RWxlbWVudCgpID09IGUpKQorICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZh
bGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAh
ZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKKworICAgICAgICAvLyBGSVhNRTogRG9uJ3Qg
c3VwcG9ydCB0aGlzIG11dGF0aW9uIGZvciBwc2V1ZG8gc3R5bGVzIGxpa2UgZmlyc3QtbGV0dGVy
IG9yIGZpcnN0LWxpbmUsIHNpbmNlIGl0J3Mgbm90IGNvbXBsZXRlbHkKKyAgICAgICAgLy8gY2xl
YXIgaG93IHRoYXQgc2hvdWxkIHdvcmsuCisgICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09
IElOTElORSAmJiBzdHlsZS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgc3R5bGUtPndyaXRp
bmdNb2RlKCkgIT0gcGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHls
ZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOworCisgICAgICAgIC8vIEFmdGVyIHBlcmZvcm1p
bmcgdGhlIGRpc3BsYXkgbXV0YXRpb24sIGNoZWNrIHRhYmxlIHJvd3MuIFdlIGRvIG5vdCBob25v
ciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlvbjpzdGlja3kgb24KKyAgICAgICAgLy8gdGFi
bGUgcm93cyBvciBjZWxscy4gVGhpcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBmb3IgcG9zaXRpb246
cmVsYXRpdmUgaW4gQ1NTMi4xIChhbmQgY2F1c2VkIGEgY3Jhc2ggaW4gY29udGFpbmluZ0Jsb2Nr
KCkKKyAgICAgICAgLy8gb24gc29tZSBzaXRlcykuCisgICAgICAgIGlmICgoc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9S
T1dfR1JPVVAKKyAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVS
X0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKQorICAgICAgICAgICAgJiYg
c3R5bGUtPmhhc0luRmxvd1Bvc2l0aW9uKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRp
b24oU3RhdGljUG9zaXRpb24pOworCisgICAgICAgIC8vIHdyaXRpbmctbW9kZSBkb2VzIG5vdCBh
cHBseSB0byB0YWJsZSByb3cgZ3JvdXBzLCB0YWJsZSBjb2x1bW4gZ3JvdXBzLCB0YWJsZSByb3dz
LCBhbmQgdGFibGUgY29sdW1ucy4KKyAgICAgICAgLy8gRklYTUU6IFRhYmxlIGNlbGxzIHNob3Vs
ZCBiZSBhbGxvd2VkIHRvIGJlIHBlcnBlbmRpY3VsYXIgb3IgZmxpcHBlZCB3aXRoIHJlc3BlY3Qg
dG8gdGhlIHRhYmxlLCB0aG91Z2guCisgICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX0NPTFVNTiB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCB8fCBz
dHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUAorICAgICAgICAgICAgfHwgc3R5
bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9ST1cgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKKyAgICAg
ICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ0VMTCkKKyAgICAgICAgICAgIHN0
eWxlLT5zZXRXcml0aW5nTW9kZShwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSk7CisKKyAgICAg
ICAgLy8gRklYTUU6IFNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYmxvY2stZmxvdyBvbiBmbGV4aWJs
ZSBib3hlcyB5ZXQsIGRpc2FsbG93IHNldHRpbmcKKyAgICAgICAgLy8gb2YgYmxvY2stZmxvdyB0
byBhbnl0aGluZyBvdGhlciB0aGFuIFRvcFRvQm90dG9tV3JpdGluZ01vZGUuCisgICAgICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NjQxOCAtIEZsZXhpYmxl
IGJveCBzdXBwb3J0LgorICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gVG9wVG9C
b3R0b21Xcml0aW5nTW9kZSAmJiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBCT1ggfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBJTkxJTkVfQk9YKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9k
ZShUb3BUb0JvdHRvbVdyaXRpbmdNb2RlKTsKKworICAgICAgICBpZiAoaXNEaXNwbGF5RmxleGli
bGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRG
bG9hdGluZyhOb0Zsb2F0KTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxl
bnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRv
Y3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7CisgICAgICAgIH0KKworI2lmIEVOQUJMRShESUFM
T0dfRUxFTUVOVCkKKyAgICAgICAgLy8gUGVyIHRoZSBzcGVjLCBwb3NpdGlvbiAnc3RhdGljJyBh
bmQgJ3JlbGF0aXZlJyBpbiB0aGUgdG9wIGxheWVyIGNvbXB1dGUgdG8gJ2Fic29sdXRlJy4KKyAg
ICAgICAgaWYgKGUgJiYgZS0+aXNJblRvcExheWVyKCkgJiYgKHN0eWxlLT5wb3NpdGlvbigpID09
IFN0YXRpY1Bvc2l0aW9uIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFJlbGF0aXZlUG9zaXRpb24p
KSB7CisgICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oQWJzb2x1dGVQb3NpdGlvbik7Cisg
ICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CisgICAgICAgIH0KKyNlbmRpZgor
ICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBvdXIgei1pbmRleCB2YWx1ZSBpcyBvbmx5IGFwcGxp
ZWQgaWYgdGhlIG9iamVjdCBpcyBwb3NpdGlvbmVkLgorICAgIGlmIChzdHlsZS0+cG9zaXRpb24o
KSA9PSBTdGF0aWNQb3NpdGlvbiAmJiAhaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUt
PmRpc3BsYXkoKSkpCisgICAgICAgIHN0eWxlLT5zZXRIYXNBdXRvWkluZGV4KCk7CisKKyAgICAv
LyBBdXRvIHotaW5kZXggYmVjb21lcyAwIGZvciB0aGUgcm9vdCBlbGVtZW50IGFuZCB0cmFuc3Bh
cmVudCBvYmplY3RzLiBUaGlzIHByZXZlbnRzCisgICAgLy8gY2FzZXMgd2hlcmUgb2JqZWN0cyB0
aGF0IHNob3VsZCBiZSBibGVuZGVkIGFzIGEgc2luZ2xlIHVuaXQgZW5kIHVwIHdpdGggYSBub24t
dHJhbnNwYXJlbnQKKyAgICAvLyBvYmplY3Qgd2VkZ2VkIGluIGJldHdlZW4gdGhlbS4gQXV0byB6
LWluZGV4IGFsc28gYmVjb21lcyAwIGZvciBvYmplY3RzIHRoYXQgc3BlY2lmeSB0cmFuc2Zvcm1z
L21hc2tzL3JlZmxlY3Rpb25zLgorICAgIGlmIChzdHlsZS0+aGFzQXV0b1pJbmRleCgpICYmICgo
ZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKQorICAgICAgICB8fCBz
dHlsZS0+b3BhY2l0eSgpIDwgMS4wZgorICAgICAgICB8fCBzdHlsZS0+aGFzVHJhbnNmb3JtUmVs
YXRlZFByb3BlcnR5KCkKKyAgICAgICAgfHwgc3R5bGUtPmhhc01hc2soKQorICAgICAgICB8fCBz
dHlsZS0+Y2xpcFBhdGgoKQorICAgICAgICB8fCBzdHlsZS0+Ym94UmVmbGVjdCgpCisgICAgICAg
IHx8IHN0eWxlLT5oYXNGaWx0ZXIoKQorICAgICAgICB8fCBzdHlsZS0+aGFzQmxlbmRNb2RlKCkK
KyAgICAgICAgfHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RpY2t5UG9zaXRpb24KKyAgICAgICAg
fHwgKHN0eWxlLT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb24gJiYgZSAmJiBlLT5kb2N1bWVu
dCgpLT5wYWdlKCkgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpLT5zZXR0aW5ncygpLT5maXhlZFBv
c2l0aW9uQ3JlYXRlc1N0YWNraW5nQ29udGV4dCgpKQorI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9P
VkVSRkxPV19TQ1JPTExJTkcpCisgICAgICAgIC8vIFRvdWNoIG92ZXJmbG93IHNjcm9sbGluZyBj
cmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dC4KKyAgICAgICAgfHwgKChzdHlsZS0+b3ZlcmZsb3dY
KCkgIT0gT0hJRERFTiB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikgJiYgc3R5bGUt
PnVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcoKSkKKyNlbmRpZgorI2lmIEVOQUJMRShESUFMT0df
RUxFTUVOVCkKKyAgICAgICAgfHwgKGUgJiYgZS0+aXNJblRvcExheWVyKCkpCisjZW5kaWYKKyAg
ICAgICAgKSkKKyAgICAgICAgc3R5bGUtPnNldFpJbmRleCgwKTsKKworICAgIC8vIFRleHRhcmVh
IGNvbnNpZGVycyBvdmVyZmxvdyB2aXNpYmxlIGFzIGF1dG8uCisgICAgaWYgKGUgJiYgZS0+aGFz
VGFnTmFtZSh0ZXh0YXJlYVRhZykpIHsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChzdHls
ZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1goKSk7
CisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJ
QkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dZKCkpOworICAgIH0KKworICAgIGlmIChkb2Vz
Tm90SW5oZXJpdFRleHREZWNvcmF0aW9uKHN0eWxlLCBlKSkKKyAgICAgICAgc3R5bGUtPnNldFRl
eHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKKyAgICBlbHNl
CisgICAgICAgIHN0eWxlLT5hZGRUb1RleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0
RGVjb3JhdGlvbigpKTsKKworICAgIC8vIElmIGVpdGhlciBvdmVyZmxvdyB2YWx1ZSBpcyBub3Qg
dmlzaWJsZSwgY2hhbmdlIHRvIGF1dG8uCisgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBP
TUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT01BUlFVRUUpCisgICAgICAgIHN0eWxl
LT5zZXRPdmVyZmxvd1koT01BUlFVRUUpOworICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1ko
KSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT01BUlFVRUUpCisgICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1goT01BUlFVRUUpOworICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVy
Zmxvd1goKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUpIHsK
KyAgICAgICAgLy8gRklYTUU6IE9uY2Ugd2UgaW1wbGVtZW50IHBhZ2luYXRpb24gY29udHJvbHMs
IG92ZXJmbG93LXggc2hvdWxkIGRlZmF1bHQgdG8gaGlkZGVuCisgICAgICAgIC8vIGlmIG92ZXJm
bG93LXkgaXMgc2V0IHRvIC13ZWJraXQtcGFnZWQteCBvciAtd2Via2l0LXBhZ2UteS4gRm9yIG5v
dywgd2UnbGwgbGV0IGl0CisgICAgICAgIC8vIGRlZmF1bHQgdG8gYXV0byBzbyB3ZSBjYW4gYXQg
bGVhc3Qgc2Nyb2xsIHRocm91Z2ggdGhlIHBhZ2VzLgorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZs
b3dYKE9BVVRPKTsKKyAgICB9IGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJM
RSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUpCisgICAgICAgIHN0eWxlLT5zZXRP
dmVyZmxvd1koT0FVVE8pOworCisgICAgLy8gQ2FsbCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9k
ZSgpIGlmIGEgcGFnaW5hdGlvbiBtb2RlIGlzIHNldCBmb3IgYW55IG5vbi1yb290IGVsZW1lbnRz
LiBJZiB0aGVzZQorICAgIC8vIHN0eWxlcyBhcmUgc3BlY2lmaWVkIG9uIGEgcm9vdCBlbGVtZW50
LCB0aGVuIHRoZXkgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW4KKyAgICAvLyBTdHlsZVJlc29sdmVy
OjpzdHlsZUZvckRvY3VtZW50KCkuCisgICAgaWYgKChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BB
R0VEWCB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWSkgJiYgIShlICYmIChlLT5oYXNU
YWdOYW1lKGh0bWxUYWcpIHx8IGUtPmhhc1RhZ05hbWUoYm9keVRhZykpKSkKKyAgICAgICAgc2V0
U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoV2ViQ29yZTo6cGFnaW5hdGlvbk1vZGVGb3JSZW5kZXJT
dHlsZShzdHlsZSksIHN0eWxlKTsKKworICAgIC8vIFRhYmxlIHJvd3MsIHNlY3Rpb25zIGFuZCB0
aGUgdGFibGUgaXRzZWxmIHdpbGwgc3VwcG9ydCBvdmVyZmxvdzpoaWRkZW4gYW5kIHdpbGwgaWdu
b3JlIHNjcm9sbC9hdXRvLgorICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5IHRhYmxlIHNlY3Rpb25z
IHdpbGwgc3VwcG9ydCBhdXRvIGFuZCBzY3JvbGwuCisgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUKKyAgICAgICAgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9ST1cpIHsKKyAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJM
RSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTikKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpICE9
IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVOKQorICAgICAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7CisgICAgfQorCisgICAgLy8gTWVudWxpc3Rz
IHNob3VsZCBoYXZlIHZpc2libGUgb3ZlcmZsb3cKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2Uo
KSA9PSBNZW51bGlzdFBhcnQpIHsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJM
RSk7CisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOworICAgIH0KKworICAg
IC8vIEN1bGwgb3V0IGFueSB1c2VsZXNzIGxheWVycyBhbmQgYWxzbyByZXBlYXQgcGF0dGVybnMg
aW50byBhZGRpdGlvbmFsIGxheWVycy4KKyAgICBzdHlsZS0+YWRqdXN0QmFja2dyb3VuZExheWVy
cygpOworICAgIHN0eWxlLT5hZGp1c3RNYXNrTGF5ZXJzKCk7CisKKyAgICAvLyBEbyB0aGUgc2Ft
ZSBmb3IgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMuCisgICAgc3R5bGUtPmFkanVzdEFuaW1h
dGlvbnMoKTsKKyAgICBzdHlsZS0+YWRqdXN0VHJhbnNpdGlvbnMoKTsKKworICAgIC8vIEltcG9y
dGFudDogSW50cmluc2ljIG1hcmdpbnMgZ2V0IGFkZGVkIHRvIGNvbnRyb2xzIGJlZm9yZSB0aGUg
dGhlbWUgaGFzIGFkanVzdGVkIHRoZSBzdHlsZSwgc2luY2UgdGhlIHRoZW1lIHdpbGwKKyAgICAv
LyBhbHRlciBmb250cyBhbmQgaGVpZ2h0cy93aWR0aHMuCisgICAgaWYgKGUgJiYgZS0+aXNGb3Jt
Q29udHJvbEVsZW1lbnQoKSAmJiBzdHlsZS0+Zm9udFNpemUoKSA+PSAxMSkgeworICAgICAgICAv
LyBEb24ndCBhcHBseSBpbnRyaW5zaWMgbWFyZ2lucyB0byBpbWFnZSBidXR0b25zLiBUaGUgZGVz
aWduZXIga25vd3MgaG93IGJpZyB0aGUgaW1hZ2VzIGFyZSwKKyAgICAgICAgLy8gc28gd2UgaGF2
ZSB0byB0cmVhdCBhbGwgaW1hZ2UgYnV0dG9ucyBhcyB0aG91Z2ggdGhleSB3ZXJlIGV4cGxpY2l0
bHkgc2l6ZWQuCisgICAgICAgIGlmICghZS0+aGFzVGFnTmFtZShpbnB1dFRhZykgfHwgIXN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihlKS0+aXNJbWFnZUJ1dHRvbigpKQorICAgICAgICAg
ICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7CisgICAgfQorCisgICAgLy8gTGV0IHRoZSB0
aGVtZSBhbHNvIGhhdmUgYSBjcmFjayBhdCBhZGp1c3RpbmcgdGhlIHN0eWxlLgorICAgIGlmIChz
dHlsZS0+aGFzQXBwZWFyYW5jZSgpKQorICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1l
KCktPmFkanVzdFN0eWxlKHRoaXMsIHN0eWxlLCBlLCBtX3N0YXRlLmhhc1VBQXBwZWFyYW5jZSgp
LCBtX3N0YXRlLmJvcmRlckRhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kRGF0YSgpLCBtX3N0YXRl
LmJhY2tncm91bmRDb2xvcigpKTsKKworICAgIC8vIElmIHdlIGhhdmUgZmlyc3QtbGV0dGVyIHBz
ZXVkbyBzdHlsZSwgZG8gbm90IHNoYXJlIHRoaXMgc3R5bGUuCisgICAgaWYgKHN0eWxlLT5oYXNQ
c2V1ZG9TdHlsZShGSVJTVF9MRVRURVIpKQorICAgICAgICBzdHlsZS0+c2V0VW5pcXVlKCk7CisK
KyAgICAvLyBGSVhNRTogd2hlbiBkcm9wcGluZyB0aGUgLXdlYmtpdCBwcmVmaXggb24gdHJhbnNm
b3JtLXN0eWxlLCB3ZSBzaG91bGQgYWxzbyBoYXZlIG9wYWNpdHkgPCAxIGNhdXNlIGZsYXR0ZW5p
bmcuCisgICAgaWYgKHN0eWxlLT5wcmVzZXJ2ZXMzRCgpICYmIChzdHlsZS0+b3ZlcmZsb3dYKCkg
IT0gT1ZJU0lCTEUKKyAgICAgICAgfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFCisg
ICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKSkpCisgICAgICAgIHN0eWxlLT5zZXRUcmFuc2Zv
cm1TdHlsZTNEKFRyYW5zZm9ybVN0eWxlM0RGbGF0KTsKKworICAgIC8vIFNlYW1sZXNzIGlmcmFt
ZXMgYmVoYXZlIGxpa2UgYmxvY2tzLiBNYXAgdGhlaXIgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sg
d2hlbiBtYXJrZWQgaW5saW5lLgorICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUoaWZyYW1lVGFn
KSAmJiBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1l
RWxlbWVudCo+KGUpLT5zaG91bGREaXNwbGF5U2VhbWxlc3NseSgpKQorICAgICAgICBzdHlsZS0+
c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOworCisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoZSAm
JiBlLT5pc1NWR0VsZW1lbnQoKSkgeworICAgICAgICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9y
Zy9UUi9TVkcvbWFza2luZy5odG1sI092ZXJmbG93UHJvcGVydHkKKyAgICAgICAgaWYgKHN0eWxl
LT5vdmVyZmxvd1koKSA9PSBPU0NST0xMKQorICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93
WShPSElEREVOKTsKKyAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9BVVRP
KQorICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7CisKKyAgICAgICAg
aWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPU0NST0xMKQorICAgICAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WChPSElEREVOKTsKKyAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgp
ID09IE9BVVRPKQorICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7CisK
KyAgICAgICAgLy8gT25seSB0aGUgcm9vdCA8c3ZnPiBlbGVtZW50IGluIGFuIFNWRyBkb2N1bWVu
dCBmcmFnbWVudCB0cmVlIGhvbm9ycyBjc3MgcG9zaXRpb24KKyAgICAgICAgaWYgKCEoZS0+aGFz
VGFnTmFtZShTVkdOYW1lczo6c3ZnVGFnKSAmJiBlLT5wYXJlbnROb2RlKCkgJiYgIWUtPnBhcmVu
dE5vZGUoKS0+aXNTVkdFbGVtZW50KCkpKQorICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9u
KFJlbmRlclN0eWxlOjppbml0aWFsUG9zaXRpb24oKSk7CisKKyAgICAgICAgLy8gUmVuZGVyU1ZH
Um9vdCBoYW5kbGVzIHpvb21pbmcgZm9yIHRoZSB3aG9sZSBTVkcgc3VidHJlZSwgc28gZm9yZWln
bk9iamVjdCBjb250ZW50IHNob3VsZAorICAgICAgICAvLyBub3QgYmUgc2NhbGVkIGFnYWluLgor
ICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6Zm9yZWlnbk9iamVjdFRhZykpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShSZW5kZXJTdHlsZTo6aW5pdGlhbFpv
b20oKSk7CisgICAgfQorI2VuZGlmCit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdp
b25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50KQoreworICAgIC8vIEZJWE1FIChCVUcgNzI0
NzIpOiBXZSBkb24ndCBhZGQgQC13ZWJraXQtcmVnaW9uIHJ1bGVzIG9mIHNjb3BlZCBzdHlsZSBz
aGVldHMgZm9yIHRoZSBtb21lbnQsCisgICAgLy8gc28gYWxsIHJlZ2lvbiBydWxlcyBhcmUgZ2xv
YmFsIGJ5IGRlZmF1bHQuIFZlcmlmeSB3aGV0aGVyIHRoYXQgY2FuIHN0YW5kIG9yIG5lZWRzIGNo
YW5naW5nLgorCisgICAgdW5zaWduZWQgcnVsZXNTaXplID0gbV9ydWxlU2V0cy5hdXRob3JTdHls
ZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kpIHsKKyAgICAgICAgQVNTRVJUKG1fcnVsZVNl
dHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxl
U2V0LmdldCgpKTsKKyAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy5h
dXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9y
LCByZWdpb25FbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGlmIChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKSB7CisgICAgICAgIHJ1bGVzU2l6ZSA9IG1fcnVs
ZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwor
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kpIHsKKyAgICAg
ICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0Fu
ZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNoZWNrUmVn
aW9uU2VsZWN0b3IobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRS
dWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3N0YXRpYyB2b2lkIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxl
KQoreworICAgIEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247CisgICAgTm9uQ0pLR2x5
cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9uOworICAgIGdldEZvbnRBbmRHbHlwaE9yaWVu
dGF0aW9uKHN0eWxlLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOworCisgICAg
Y29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24gPSBzdHlsZS0+Zm9udERlc2Ny
aXB0aW9uKCk7CisgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5vcmllbnRhdGlvbigpID09IGZvbnRP
cmllbnRhdGlvbiAmJiBmb250RGVzY3JpcHRpb24ubm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09
IGdseXBoT3JpZW50YXRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIEZvbnREZXNjcmlwdGlv
biBuZXdGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICBuZXdGb250RGVzY3Jp
cHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKKyAgICBu
ZXdGb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKKyAgICBz
dHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6dXBkYXRlRm9udCgpCit7CisgICAgaWYgKCFtX3N0YXRlLmZvbnREaXJ0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3N0YXRl
LnN0eWxlKCk7CisgICAgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKHN0eWxlLCBtX3N0YXRl
LnBhcmVudFN0eWxlKCkpOworICAgIGNoZWNrRm9yWm9vbUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5w
YXJlbnRTdHlsZSgpKTsKKyAgICBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKHN0eWxlKTsKKyAg
ICBzdHlsZS0+Zm9udCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7CisgICAgbV9zdGF0ZS5zZXRG
b250RGlydHkoZmFsc2UpOworfQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29s
dmVyOjpzdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCB1bnNpZ25lZCBydWxlc1RvSW5j
bHVkZSkKK3sKKyAgICByZXR1cm4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoZSwgTk9QU0VV
RE8sIHJ1bGVzVG9JbmNsdWRlKTsKK30KKworUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVS
ZXNvbHZlcjo6cHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgUHNldWRvSWQg
cHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlKQoreworICAgIGlmICghZSB8fCAhZS0+
ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsK
KworICAgIGluaXRFbGVtZW50KGUpOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShk
b2N1bWVudCgpLCBlLCAwLCBwc2V1ZG9JZCk7CisKKyAgICBNYXRjaFJlc3VsdCBkdW1teTsKKyAg
ICBpZiAocnVsZXNUb0luY2x1ZGUgJiBVQUFuZFVzZXJDU1NSdWxlcykgeworICAgICAgICAvLyBG
aXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgICAgICBt
YXRjaFVBUnVsZXMoZHVtbXkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0
IHJ1bGVzLgorICAgICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAg
ICAgICBtYXRjaFVzZXJSdWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVz
KTsKKyAgICB9CisKKyAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgKHJ1bGVz
VG9JbmNsdWRlICYgQXV0aG9yQ1NTUnVsZXMpKSB7CisgICAgICAgIG1fc3RhdGUuc2V0U2FtZU9y
aWdpbk9ubHkoIShydWxlc1RvSW5jbHVkZSAmIENyb3NzT3JpZ2luQ1NTUnVsZXMpKTsKKworICAg
ICAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cy4KKyAgICAgICAgbWF0Y2hB
dXRob3JSdWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKKworICAg
ICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KGZhbHNlKTsKKyAgICB9CisKKyAgICBtX3N0
YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisKKyAgICByZXR1
cm4gbV9zdGF0ZS50YWtlUnVsZUxpc3QoKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZl
cjo6cnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBDb250YWluZXJO
b2RlKiBzY29wZSwgUHNldWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hlY2tlcjo6QmVo
YXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSkKK3sKKyAgICBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOworCisgICAgaWYgKHJ1bGVEYXRhLmhhc0Zhc3RDaGVja2FibGVTZWxlY3Rvcigp
KSB7CisgICAgICAgIC8vIFdlIGtub3cgdGhpcyBzZWxlY3RvciBkb2VzIG5vdCBpbmNsdWRlIGFu
eSBwc2V1ZG8gZWxlbWVudHMuCisgICAgICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3Qo
KS5wc2V1ZG9JZCAhPSBOT1BTRVVETykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgLy8gV2Uga25vdyBhIHN1ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQgc2VsZWN0b3Ig
bWF0Y2hlcyBzaW1wbHkgYmVjYXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxlIGhhc2guCisg
ICAgICAgIC8vIFRoaXMgaXMgbGltaXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9uJ3QgbmVlZCB0
byBjaGVjayB0aGUgbmFtZXNwYWNlLgorICAgICAgICBpZiAocnVsZURhdGEuaGFzUmlnaHRtb3N0
U2VsZWN0b3JNYXRjaGluZ0hUTUxCYXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5lbGVtZW50KCkt
PmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5oYXNNdWx0aXBh
cnRTZWxlY3RvcigpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgICAgIGlmIChydWxlRGF0YS5zZWxlY3RvcigpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpU
YWcgJiYgIVNlbGVjdG9yQ2hlY2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50KCksIHJ1bGVE
YXRhLnNlbGVjdG9yKCktPnRhZ1FOYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBTZWxlY3RvckNoZWNrZXJGYXN0UGF0aCBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aChy
dWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCkpOworICAgICAgICBpZiAoIXNlbGVj
dG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXNSaWdodG1vc3RBdHRyaWJ1dGVTZWxlY3RvcigpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBzZWxlY3RvckNoZWNr
ZXJGYXN0UGF0aC5tYXRjaGVzKCk7CisgICAgfQorCisgICAgLy8gU2xvdyBwYXRoLgorICAgIFNl
bGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgc3RhdGUubW9kZSgpKTsK
KyAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVs
ZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0
ZWRNYXRjaEVuYWJsZWQpOworICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUo
KTsKKyAgICBjb250ZXh0LnNjb3BlID0gc2NvcGU7CisgICAgY29udGV4dC5wc2V1ZG9JZCA9IHN0
YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkOworICAgIGNvbnRleHQuc2Nyb2xsYmFy
ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyOworICAgIGNvbnRleHQuc2Ny
b2xsYmFyUGFydCA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhclBhcnQ7Cisg
ICAgY29udGV4dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7CisgICAg
U2VsZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250
ZXh0LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7CisgICAg
aWYgKG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lk
ICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IGR5
bmFtaWNQc2V1ZG8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVj
dG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICBpZiAo
IXJlZ2lvblNlbGVjdG9yIHx8ICFyZWdpb25FbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIG1fc3Rh
dGUubW9kZSgpKTsKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2VsZWN0
b3I7IHM7IHMgPSBDU1NTZWxlY3Rvckxpc3Q6Om5leHQocykpIHsKKyAgICAgICAgU2VsZWN0b3JD
aGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBzZWxlY3RvckNoZWNraW5nQ29udGV4dChz
LCByZWdpb25FbGVtZW50LCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERpc2FibGVkKTsK
KyAgICAgICAgUHNldWRvSWQgaWdub3JlRHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOworICAgICAg
ICBpZiAoc2VsZWN0b3JDaGVja2VyLm1hdGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0LCBpZ25v
cmVEeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkgPT0gU2VsZWN0
b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KKy8vIHRoaXMgaXMgbW9zdGx5IGJvcmluZyBzdHVmZiBvbiBob3cgdG8gYXBwbHkgYSBj
ZXJ0YWluIHJ1bGUgdG8gdGhlIHJlbmRlcnN0eWxlLi4uCisKK0xlbmd0aCBTdHlsZVJlc29sdmVy
Ojpjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBs
aWVyKQoreworICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252
ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwg
Q2FsY3VsYXRlZENvbnZlcnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNl
bnRhZ2VDb252ZXJzaW9uPihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChV
bmRlZmluZWQpOworfQorCitMZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvRmxvYXRMZW5n
dGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUs
IFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQoreworICAgIHJldHVy
biBwcmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRG
bG9hdENvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9u
IHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5
bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKK30KKwordGVt
cGxhdGUgPFN0eWxlUmVzb2x2ZXI6OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Cit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1bGUsIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVk
T25seSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAg
ICBBU1NFUlQoKHByb3BlcnR5V2hpdGVsaXN0VHlwZSAhPSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lv
bikgfHwgbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpOworICAgIEluc3BlY3Rvckluc3RydW1l
bnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxQcm9j
ZXNzUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKKworICAgIHVuc2lnbmVkIHByb3BlcnR5
Q291bnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUNvdW50KCk7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHByb3BlcnR5Q291bnQ7ICsraSkgeworICAgICAgICBTdHlsZVByb3BlcnR5U2V0
OjpQcm9wZXJ0eVJlZmVyZW5jZSBjdXJyZW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlBdChpKTsK
KyAgICAgICAgaWYgKGlzSW1wb3J0YW50ICE9IGN1cnJlbnQuaXNJbXBvcnRhbnQoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaW5oZXJpdGVkT25seSAmJiAhY3VycmVudC5p
c0luaGVyaXRlZCgpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMg
ZXhwbGljaXRseSBpbmhlcml0ZWQsIHdlIG5lZWQgdG8gYXBwbHkgZnVydGhlciBub24taW5oZXJp
dGVkIHByb3BlcnRpZXMKKyAgICAgICAgICAgIC8vIGFzIHRoZXkgbWlnaHQgb3ZlcnJpZGUgdGhl
IHZhbHVlIGluaGVyaXRlZCBoZXJlLiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgYWxsb3cgZGVj
bGFyYXRpb25zIHdpdGgKKyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgaW5oZXJpdGVkIHByb3Bl
cnRpZXMgdG8gYmUgY2FjaGVkLgorICAgICAgICAgICAgQVNTRVJUKCFjdXJyZW50LnZhbHVlKCkt
PmlzSW5oZXJpdGVkVmFsdWUoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
ICAgICAgICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0gY3VycmVudC5pZCgpOworCisgICAgICAg
IGlmIChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24gJiYg
IVN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKKyAg
ICAgICAgICAgIGNvbnRpbnVlOworI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyAgICAgICAgaWYg
KHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdEN1ZSAmJiAhU3R5bGVS
ZXNvbHZlcjo6aXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkocHJvcGVydHkpKQorICAgICAgICAgICAg
Y29udGludWU7CisjZW5kaWYKKyAgICAgICAgc3dpdGNoIChwYXNzKSB7CisjaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCisgICAgICAgIGNhc2UgVmFyaWFibGVEZWZpbml0aW9uczoKKyAgICAgICAg
ICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5VmFyaWFibGUgPCBmaXJzdENTU1Byb3BlcnR5
LCBDU1NfdmFyaWFibGVfaXNfYmVmb3JlX2ZpcnN0X3Byb3BlcnR5KTsKKyAgICAgICAgICAgIGlm
IChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKQorICAgICAgICAgICAgICAgIGFwcGx5
UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgYnJl
YWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzOgorICAgICAg
ICAgICAgQ09NUElMRV9BU1NFUlQoZmlyc3RDU1NQcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUNvbG9y
LCBDU1NfY29sb3JfaXNfZmlyc3RfcHJvcGVydHkpOworICAgICAgICAgICAgQ09NUElMRV9BU1NF
UlQoQ1NTUHJvcGVydHlab29tID09IENTU1Byb3BlcnR5Q29sb3IgKyAxNywgQ1NTX3pvb21faXNf
ZW5kX29mX2ZpcnN0X3Byb3BfcmFuZ2UpOworICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NT
UHJvcGVydHlMaW5lSGVpZ2h0ID09IENTU1Byb3BlcnR5Wm9vbSArIDEsIENTU19saW5lX2hlaWdo
dF9pc19hZnRlcl96b29tKTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgICAg
IGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworI2VuZGlmCisgICAgICAgICAgICAvLyBnaXZlIHNwZWNpYWwgcHJpb3JpdHkgdG8g
Zm9udC14eHgsIGNvbG9yIHByb3BlcnRpZXMsIGV0YworICAgICAgICAgICAgaWYgKHByb3BlcnR5
IDwgQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHko
Y3VycmVudC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgLy8gd2UgYXBwbHkg
bGluZS1oZWlnaHQgbGF0ZXIKKyAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IENTU1By
b3BlcnR5TGluZUhlaWdodCkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRW
YWx1ZShjdXJyZW50LnZhbHVlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
TG93UHJpb3JpdHlQcm9wZXJ0aWVzOgorICAgICAgICAgICAgaWYgKHByb3BlcnR5ID4gQ1NTUHJv
cGVydHlMaW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5p
ZCgpLCBjdXJyZW50LnZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorICAgIEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6ZGlkUHJvY2Vzc1J1bGUoY29va2llKTsKK30KKwordGVtcGxhdGUgPFN0
eWxlUmVzb2x2ZXI6OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Cit2b2lkIFN0eWxlUmVzb2x2
ZXI6OmFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0
LCBib29sIGlzSW1wb3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGlu
aGVyaXRlZE9ubHkpCit7CisgICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpCisgICAgICAgIHJldHVy
bjsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKHN0YXRlLnN0eWxlKCkt
Pmluc2lkZUxpbmsoKSAhPSBOb3RJbnNpZGVMaW5rKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBz
dGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IE1hdGNo
ZWRQcm9wZXJ0aWVzJiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzW2ldOworICAgICAgICAgICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IG1hdGNoZWRQ
cm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGU7CisgICAgICAgICAgICAvLyBGSVhNRTogSXQgd291bGQg
YmUgbmljZXIgdG8gcGFzcyB0aGVzZSBhcyBhcmd1bWVudHMgYnV0IHRoYXQgcmVxdWlyZXMgY2hh
bmdlcyBpbiBtYW55IHBsYWNlcy4KKyAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlU
b1JlZ3VsYXJTdHlsZShsaW5rTWF0Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpNYXRjaExpbmsp
OworICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShs
aW5rTWF0Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpNYXRjaFZpc2l0ZWQpOworCisgICAgICAg
ICAgICBhcHBseVByb3BlcnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJvcGVydGllcy5n
ZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwgaW5oZXJpdGVk
T25seSwgc3RhdGljX2Nhc3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVkUHJvcGVydGll
cy53aGl0ZWxpc3RUeXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpOworICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5
VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBm
b3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7CisgICAgICAgIGNv
bnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzW2ldOworICAgICAgICBhcHBseVByb3BlcnRpZXM8cGFzcz4obWF0Y2hl
ZFByb3BlcnRpZXMucHJvcGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzW2ld
LCBpc0ltcG9ydGFudCwgaW5oZXJpdGVkT25seSwgc3RhdGljX2Nhc3Q8UHJvcGVydHlXaGl0ZWxp
c3RUeXBlPihtYXRjaGVkUHJvcGVydGllcy53aGl0ZWxpc3RUeXBlKSk7CisgICAgfQorfQorCit1
bnNpZ25lZCBTdHlsZVJlc29sdmVyOjpjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNIYXNoKGNvbnN0
IE1hdGNoZWRQcm9wZXJ0aWVzKiBwcm9wZXJ0aWVzLCB1bnNpZ25lZCBzaXplKQoreworICAgIAor
ICAgIHJldHVybiBTdHJpbmdIYXNoZXI6Omhhc2hNZW1vcnkocHJvcGVydGllcywgc2l6ZW9mKE1h
dGNoZWRQcm9wZXJ0aWVzKSAqIHNpemUpOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5
bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFu
Z2VzJiBiKQoreworICAgIHJldHVybiBhLmZpcnN0VUFSdWxlID09IGIuZmlyc3RVQVJ1bGUKKyAg
ICAgICAgJiYgYS5sYXN0VUFSdWxlID09IGIubGFzdFVBUnVsZQorICAgICAgICAmJiBhLmZpcnN0
QXV0aG9yUnVsZSA9PSBiLmZpcnN0QXV0aG9yUnVsZQorICAgICAgICAmJiBhLmxhc3RBdXRob3JS
dWxlID09IGIubGFzdEF1dGhvclJ1bGUKKyAgICAgICAgJiYgYS5maXJzdFVzZXJSdWxlID09IGIu
Zmlyc3RVc2VyUnVsZQorICAgICAgICAmJiBhLmxhc3RVc2VyUnVsZSA9PSBiLmxhc3RVc2VyUnVs
ZTsKK30KKworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2Vz
JiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKK3sKKyAgICByZXR1cm4g
IShhID09IGIpOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVz
JiBiKQoreworICAgIHJldHVybiBhLnByb3BlcnRpZXMgPT0gYi5wcm9wZXJ0aWVzICYmIGEubGlu
a01hdGNoVHlwZSA9PSBiLmxpbmtNYXRjaFR5cGU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25z
dCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZl
cjo6TWF0Y2hlZFByb3BlcnRpZXMmIGIpCit7CisgICAgcmV0dXJuICEoYSA9PSBiKTsKK30KKwor
Y29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIFN0eWxlUmVz
b2x2ZXI6OmZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25z
dCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCit7CisgICAgQVNTRVJUKGhhc2gpOworCisgICAg
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUuZmluZChoYXNoKTsKKyAgICBpZiAoaXQgPT0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hl
LmVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRl
bSYgY2FjaGVJdGVtID0gaXQtPnZhbHVlOworCisgICAgc2l6ZV90IHNpemUgPSBtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7CisgICAgaWYgKHNpemUgIT0gY2FjaGVJdGVtLm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNo
ZWRQcm9wZXJ0aWVzW2ldICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllc1tpXSkKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoY2FjaGVJdGVtLnJhbmdlcyAhPSBtYXRj
aFJlc3VsdC5yYW5nZXMpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAmY2FjaGVJdGVt
OworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShj
b25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwg
dW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQoreworICAgIHN0
YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdl
ZW5Td2VlcHMgPSAxMDA7CisgICAgaWYgKCsrbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRp
b25zU2luY2VMYXN0U3dlZXAgPj0gbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3
ZWVuU3dlZXBzCisgICAgICAgICYmICFtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVy
LmlzQWN0aXZlKCkpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNs
YXJhdGlvbkNhY2hlU3dlZXBUaW1lSW5TZWNvbmRzID0gNjA7CisgICAgICAgIG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIuc3RhcnRPbmVTaG90KG1hdGNoZWREZWNsYXJhdGlvbkNh
Y2hlU3dlZXBUaW1lSW5TZWNvbmRzKTsKKyAgICB9CisKKyAgICBBU1NFUlQoaGFzaCk7CisgICAg
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0gY2FjaGVJdGVtOworICAgIGNhY2hlSXRlbS5tYXRj
aGVkUHJvcGVydGllcy5hcHBlbmQobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMpOworICAg
IGNhY2hlSXRlbS5yYW5nZXMgPSBtYXRjaFJlc3VsdC5yYW5nZXM7CisgICAgLy8gTm90ZSB0aGF0
IHdlIGRvbid0IGNhY2hlIHRoZSBvcmlnaW5hbCBSZW5kZXJTdHlsZSBpbnN0YW5jZS4gSXQgbWF5
IGJlIGZ1cnRoZXIgbW9kaWZpZWQuCisgICAgLy8gVGhlIFJlbmRlclN0eWxlIGluIHRoZSBjYWNo
ZSBpcyByZWFsbHkganVzdCBhIGhvbGRlciBmb3IgdGhlIHN1YnN0cnVjdHVyZXMgYW5kIG5ldmVy
IHVzZWQgYXMtaXMuCisgICAgY2FjaGVJdGVtLnJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNs
b25lKHN0eWxlKTsKKyAgICBjYWNoZUl0ZW0ucGFyZW50UmVuZGVyU3R5bGUgPSBSZW5kZXJTdHls
ZTo6Y2xvbmUocGFyZW50U3R5bGUpOworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5hZGQo
aGFzaCwgY2FjaGVJdGVtKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjppbnZhbGlkYXRlTWF0
Y2hlZFByb3BlcnRpZXNDYWNoZSgpCit7CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmNs
ZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0Nh
Y2hlKGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29u
c3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIC8vIEZJWE1FOiBDU1NQcm9wZXJ0
eVdlYmtpdFdyaXRpbmdNb2RlIG1vZGlmaWVzIHN0YXRlIHdoZW4gYXBwbHlpbmcgdG8gZG9jdW1l
bnQgZWxlbWVudC4gV2UgY2FuJ3Qgc2tpcCB0aGUgYXBwbHlpbmcgYnkgY2FjaGluZy4KKyAgICBp
ZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSAmJiBl
bGVtZW50LT5kb2N1bWVudCgpLT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpIHx8IChzdHlsZS0+
c3R5bGVUeXBlKCkgIT0gTk9QU0VVRE8gJiYgcGFyZW50U3R5bGUtPnVuaXF1ZSgpKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT56b29tKCkgIT0gUmVuZGVyU3R5bGU6Omlu
aXRpYWxab29tKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPndyaXRp
bmdNb2RlKCkgIT0gUmVuZGVyU3R5bGU6OmluaXRpYWxXcml0aW5nTW9kZSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgLy8gVGhlIGNhY2hlIGFzc3VtZXMgc3RhdGljIGtub3dsZWRnZSBh
Ym91dCB3aGljaCBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQuCisgICAgaWYgKHBhcmVudFN0eWxl
LT5oYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRj
aGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IEVsZW1l
bnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7CisgICAgdW5zaWduZWQgY2FjaGVIYXNoID0gbWF0Y2hSZXN1bHQuaXNDYWNoZWFi
bGUgPyBjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNIYXNoKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLmRhdGEoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKSA6IDA7
CisgICAgYm9vbCBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyAgICBjb25zdCBNYXRjaGVk
UHJvcGVydGllc0NhY2hlSXRlbSogY2FjaGVJdGVtID0gMDsKKyAgICBpZiAoY2FjaGVIYXNoICYm
IChjYWNoZUl0ZW0gPSBmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY2FjaGVIYXNoLCBt
YXRjaFJlc3VsdCkpKSB7CisgICAgICAgIC8vIFdlIGNhbiBidWlsZCB1cCB0aGUgc3R5bGUgYnkg
Y29weWluZyBub24taW5oZXJpdGVkIHByb3BlcnRpZXMgZnJvbSBhbiBlYXJsaWVyIHN0eWxlIG9i
amVjdCBidWlsdCB1c2luZyB0aGUgc2FtZSBleGFjdAorICAgICAgICAvLyBzdHlsZSBkZWNsYXJh
dGlvbnMuIFdlIHRoZW4gb25seSBuZWVkIHRvIGFwcGx5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGll
cywgaWYgYW55LCBhcyB0aGVpciB2YWx1ZXMgY2FuIGRlcGVuZCBvbiB0aGUgCisgICAgICAgIC8v
IGVsZW1lbnQgY29udGV4dC4gVGhpcyBpcyBmYXN0IGFuZCBzYXZlcyBtZW1vcnkgYnkgcmV1c2lu
ZyB0aGUgc3R5bGUgZGF0YSBzdHJ1Y3R1cmVzLgorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jb3B5
Tm9uSW5oZXJpdGVkRnJvbShjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKKyAgICAgICAg
aWYgKHN0YXRlLnBhcmVudFN0eWxlKCktPmluaGVyaXRlZERhdGFTaGFyZWQoY2FjaGVJdGVtLT5w
YXJlbnRSZW5kZXJTdHlsZS5nZXQoKSkgJiYgIWlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSkg
eworICAgICAgICAgICAgRUluc2lkZUxpbmsgbGlua1N0YXR1cyA9IHN0YXRlLnN0eWxlKCktPmlu
c2lkZUxpbmsoKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBjYWNoZSBpdGVtIHBhcmVudCBzdHls
ZSBoYXMgaWRlbnRpY2FsIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJyZW50IHBhcmVu
dCBzdHlsZSB0aGVuIHRoZQorICAgICAgICAgICAgLy8gcmVzdWx0aW5nIHN0eWxlIHdpbGwgYmUg
aWRlbnRpY2FsIHRvby4gV2UgY29weSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMgb3ZlciBmcm9t
IHRoZSBjYWNoZSBhbmQgYXJlIGRvbmUuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhl
cml0RnJvbShjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKKworICAgICAgICAgICAgLy8g
VW5mb3J0dW5hdGVseSB0aGUgbGluayBzdGF0dXMgaXMgdHJlYXRlZCBsaWtlIGFuIGluaGVyaXRl
ZCBwcm9wZXJ0eS4gV2UgbmVlZCB0byBleHBsaWNpdGx5IHJlc3RvcmUgaXQuCisgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0dXMpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IHRydWU7IAor
ICAgIH0KKworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIC8vIEZpcnN0IGFwcGx5IGFs
bCB2YXJpYWJsZSBkZWZpbml0aW9ucywgYXMgdGhleSBtYXkgYmUgdXNlZCBkdXJpbmcgYXBwbGlj
YXRpb24gb2YgbGF0ZXIgcHJvcGVydGllcy4KKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZh
cmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVl
LCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMu
bGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJv
cGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1
bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJs
ZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0
VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5
KTsKKyNlbmRpZgorCisgICAgLy8gTm93IHdlIGhhdmUgYWxsIG9mIHRoZSBtYXRjaGVkIHJ1bGVz
IGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlci4gV2FsayB0aGUgcnVsZXMgYW5kIGFwcGx5CisgICAg
Ly8gaGlnaC1wcmlvcml0eSBwcm9wZXJ0aWVzIGZpcnN0LCBpLmUuLCB0aG9zZSBwcm9wZXJ0aWVz
IHRoYXQgb3RoZXIgcHJvcGVydGllcyBkZXBlbmQgb24uCisgICAgLy8gVGhlIG9yZGVyIGlzICgx
KSBoaWdoLXByaW9yaXR5IG5vdCBpbXBvcnRhbnQsICgyKSBoaWdoLXByaW9yaXR5IGltcG9ydGFu
dCwgKDMpIG5vcm1hbCBub3QgaW1wb3J0YW50CisgICAgLy8gYW5kICg0KSBub3JtYWwgaW1wb3J0
YW50LgorICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwg
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRP
bmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+
KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBt
YXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Cisg
ICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJl
c3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0
LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVB
UnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKworICAgIGlmIChjYWNoZUl0ZW0gJiYgY2FjaGVJ
dGVtLT5yZW5kZXJTdHlsZS0+ZWZmZWN0aXZlWm9vbSgpICE9IHN0YXRlLnN0eWxlKCktPmVmZmVj
dGl2ZVpvb20oKSkgeworICAgICAgICBzdGF0ZS5zZXRGb250RGlydHkodHJ1ZSk7CisgICAgICAg
IGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIElmIG91ciBmb250
IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KKyAgICB1cGRhdGVGb250
KCk7CisKKyAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNp
ZGVkIG9uIHRoZSBmb250LXNpemUuCisgICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQor
ICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhl
aWdodFZhbHVlKCkpOworCisgICAgLy8gTWFueSBwcm9wZXJ0aWVzIGRlcGVuZCBvbiB0aGUgZm9u
dC4gSWYgaXQgY2hhbmdlcyB3ZSBqdXN0IGFwcGx5IGFsbCBwcm9wZXJ0aWVzLgorICAgIGlmIChj
YWNoZUl0ZW0gJiYgY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCkgIT0g
c3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkpCisgICAgICAgIGFwcGx5SW5oZXJpdGVk
T25seSA9IGZhbHNlOworCisgICAgLy8gTm93IGRvIHRoZSBub3JtYWwgcHJpb3JpdHkgVUEgcHJv
cGVydGllcy4KKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGll
cz4obWF0Y2hSZXN1bHQsIGZhbHNlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIAor
ICAgIC8vIENhY2hlIG91ciBib3JkZXIgYW5kIGJhY2tncm91bmQgc28gdGhhdCB3ZSBjYW4gZXhh
bWluZSB0aGVtIGxhdGVyLgorICAgIHN0YXRlLmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOwor
ICAgIAorICAgIC8vIE5vdyBkbyB0aGUgYXV0aG9yIGFuZCB1c2VyIG5vcm1hbCBwcmlvcml0eSBw
cm9wZXJ0aWVzIGFuZCBhbGwgdGhlICFpbXBvcnRhbnQgcHJvcGVydGllcy4KKyAgICBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNl
LCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSArIDEsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVy
dGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9y
aXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25s
eSk7CisgICAKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRo
aXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICBBU1NFUlQo
IXN0YXRlLmZvbnREaXJ0eSgpKTsKKyAgICAKKyAgICBpZiAoY2FjaGVJdGVtIHx8ICFjYWNoZUhh
c2gpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVy
dGllc0NhY2hlKHN0YXRlLmVsZW1lbnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5
bGUoKSkpCisgICAgICAgIHJldHVybjsKKyAgICBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUo
c3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgY2FjaGVIYXNoLCBtYXRjaFJlc3Vs
dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxl
UnVsZVBhZ2UqIHIxLCBjb25zdCBTdHlsZVJ1bGVQYWdlKiByMikKK3sKKyAgICByZXR1cm4gcjEt
PnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCkgPCByMi0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHko
KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYg
cmVzdWx0LCBSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdl
LCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGlmICghcnVsZXMpCisgICAgICAgIHJl
dHVybjsKKworICAgIFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VSdWxlczsKKyAg
ICBtYXRjaFBhZ2VSdWxlc0Zvckxpc3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMtPnBhZ2VSdWxl
cygpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpOworICAgIGlmIChtYXRjaGVk
UGFnZVJ1bGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RkOjpzdGFibGVf
c29ydChtYXRjaGVkUGFnZVJ1bGVzLmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMuZW5kKCksIGNv
bXBhcmVQYWdlUnVsZXMpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRQ
YWdlUnVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3Vs
dCwgbWF0Y2hlZFBhZ2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsKK30KKworc3RhdGljIGJvb2wg
Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3Rvciwg
Ym9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1l
KQoreworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVjdG9yOyBj
b21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7CisgICAgICAg
IGlmIChjb21wb25lbnQtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgeworICAgICAgICAg
ICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FOYW1lKCku
bG9jYWxOYW1lKCk7CisgICAgICAgICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIGxv
Y2FsTmFtZSAhPSBwYWdlTmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKworICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29t
cG9uZW50LT5wc2V1ZG9UeXBlKCk7CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxl
Y3Rvcjo6UHNldWRvTGVmdFBhZ2UgJiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNl
dWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisg
ICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdl
ICYmICFpc0ZpcnN0UGFnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHlsZVJlc29s
dmVyOjptYXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hl
ZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQ
YWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQoreworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHls
ZVJ1bGVQYWdlKiBydWxlID0gcnVsZXNbaV07CisKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxl
Y3RvckNvbXBvbmVudHMocnVsZS0+c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2Us
IHBhZ2VOYW1lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIElmIHRoZSBy
dWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4KKyAgICAgICAg
Y29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsK
KyAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qg
b2YgbWF0Y2hlZCBydWxlcy4KKyAgICAgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKKyAg
ICB9Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6aXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBj
b25zdAoreworICAgIGJvb2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAg
ICBpc0ZpcnN0UGFnZUxlZnQgPSB0cnVlOworCisgICAgcmV0dXJuIChwYWdlSW5kZXggKyAoaXNG
aXJzdFBhZ2VMZWZ0ID8gMSA6IDApKSAlIDI7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6aXNG
aXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogSW4gY2FzZSBv
ZiBmb3JjZWQgbGVmdC9yaWdodCBwYWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUg
dGhlIGZpcnN0IHBhZ2UuCisgICAgcmV0dXJuICghcGFnZUluZGV4KTsKK30KKworU3RyaW5nIFN0
eWxlUmVzb2x2ZXI6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0Cit7CisgICAg
Ly8gRklYTUU6IEltcGxlbWVudCBwYWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBwaW5nLgorICAg
IHJldHVybiAiIjsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9TdHls
ZShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSkK
K3sKKyAgICBpbml0RWxlbWVudCgwKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUo
ZG9jdW1lbnQoKSwgMCwgc3R5bGUpOworICAgIG1fc3RhdGUuc2V0U3R5bGUoc3R5bGUpOworICAg
IGFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShpZCwgdmFsdWUpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlEIGlkLCBD
U1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHZhbHVlKQorICAgICAgICBhcHBseVByb3BlcnR5
KGlkLCB2YWx1ZSk7Cit9CisKK2lubGluZSBib29sIGlzVmFsaWRWaXNpdGVkTGlua1Byb3BlcnR5
KENTU1Byb3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xv
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyVG9wQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNv
bG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0
bGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0U3Ryb2tlQ29sb3I6CisjaWYgRU5BQkxFKFNWRykKKyAgICBjYXNlIENTU1Byb3BlcnR5Rmls
bDoKKyAgICBjYXNlIENTU1Byb3BlcnR5U3Ryb2tlOgorI2VuZGlmCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKK30KKworLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdpb25zLyN0aGUt
YXQtcmVnaW9uLXN0eWxlLXJ1bGUKKy8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBm
b3Igb3RoZXIgcmVnaW9uIHN0eWxpbmcgcHJvcGVydGllcy4KK2lubGluZSBib29sIFN0eWxlUmVz
b2x2ZXI6OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCit7Cisg
ICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZh
dWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNp
ZiBFTkFCTEUoVklERU9fVFJBQ0spCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlk
Q3VlU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZEF0dGFjaG1lbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kUG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UG9zaXRpb25ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZFJlcGVhdFk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9u
dFZhcmlhbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZU9mZnNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3V0bGluZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJl
dHVybiBmYWxzZTsKK30KKyNlbmRpZgorLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBpbiBhIGRpZmZl
cmVudCB3YXkgY29tcGFyZWQgdG8gQ1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMgc2NhbGVkIGlu
c3RlYWQKKy8vIG9mIGVhY2ggaW5kaXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhlIHJlbmRlciBz
dHlsZSAvIHRyZWUuIENTU1ByaW1pdGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigpCisvLyBtdWx0
aXBsaWVzIGVhY2ggcmVzb2x2ZWQgbGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlwbGllciAtIHNv
IGZvciBTVkcgd2UgbmVlZCB0byBkaXNhYmxlIHRoYXQuCisvLyBUaG91Z2ggYWxsIENTUyB2YWx1
ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudHMgKHdpZHRo
L2hlaWdodC9ib3JkZXIvcGFkZGluZy4uLikKKy8vIG5lZWQgdG8gcmVzcGVjdCB0aGUgc2NhbGlu
Zy4gUmVuZGVyQm94ICh0aGUgcGFyZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3QpIGdyYWJzIHZh
bHVlcyBsaWtlCisvLyB3aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZyb20gdGhlIFJl
bmRlclN0eWxlIC0+IGZvciBTVkcgdGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNjYWxlLAorLy8g
aWYgd2UnZCBwYXNzIGEgMS4wIHpvb20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdlIG9ubHkgcGFz
cyBhIHpvb20gZmFjdG9yIG9mIDEuMCBmb3Igc3BlY2lmaWMKKy8vIHByb3BlcnRpZXMgdGhhdCBh
cmUgTk9UIGFsbG93ZWQgdG8gc2NhbGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1bWVudCAobGV0
dGVyL3dvcmQtc3BhY2luZy9mb250LXNpemUpLgorYm9vbCBTdHlsZVJlc29sdmVyOjp1c2VTVkda
b29tUnVsZXMoKQoreworICAgIHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBtX3N0YXRlLmVs
ZW1lbnQoKS0+aXNTVkdFbGVtZW50KCk7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFj
a0JyZWFkdGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJl
c29sdmVyOjpTdGF0ZSYgc3RhdGUsIExlbmd0aCYgd29ya2luZ0xlbmd0aCkKK3sKKyAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5Db250ZW50KSB7
CisgICAgICAgIHdvcmtpbmdMZW5ndGggPSBMZW5ndGgoTWluQ29udGVudCk7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9
PSBDU1NWYWx1ZVdlYmtpdE1heENvbnRlbnQpIHsKKyAgICAgICAgd29ya2luZ0xlbmd0aCA9IExl
bmd0aChNYXhDb250ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgd29y
a2luZ0xlbmd0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2Vy
Q29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVy
c2lvbiB8IEF1dG9Db252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7CisgICAgaWYgKHdvcmtpbmdM
ZW5ndGguaXNVbmRlZmluZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICB3b3JraW5nTGVuZ3RoLnNldFF1aXJr
KHByaW1pdGl2ZVZhbHVlLT5pc1F1aXJrVmFsdWUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
Kworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBHcmlkVHJh
Y2tTaXplJiB0cmFja1NpemUpCit7CisgICAgUGFpciogbWluTWF4VHJhY2tCcmVhZHRoID0gcHJp
bWl0aXZlVmFsdWUtPmdldFBhaXJWYWx1ZSgpOworICAgIGlmICghbWluTWF4VHJhY2tCcmVhZHRo
KSB7CisgICAgICAgIExlbmd0aCB3b3JraW5nTGVuZ3RoOworICAgICAgICBpZiAoIWNyZWF0ZUdy
aWRUcmFja0JyZWFkdGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVuZ3RoKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB0cmFja1NpemUuc2V0TGVuZ3RoKHdv
cmtpbmdMZW5ndGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBMZW5ndGgg
bWluVHJhY2tCcmVhZHRoOworICAgIExlbmd0aCBtYXhUcmFja0JyZWFkdGg7CisgICAgaWYgKCFj
cmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3QoKSwgc3RhdGUs
IG1pblRyYWNrQnJlYWR0aCkgfHwgIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tC
cmVhZHRoLT5zZWNvbmQoKSwgc3RhdGUsIG1heFRyYWNrQnJlYWR0aCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHRyYWNrU2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVhZHRoLCBtYXhU
cmFja0JyZWFkdGgpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVH
cmlkVHJhY2tHcm91cChDU1NWYWx1ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRl
JiBzdGF0ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzKQoreworICAgIGlmICgh
dmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAo
Q1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAgaWYg
KCFjdXJyVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBHcmlkVHJhY2tTaXplIHRyYWNrU2l6ZTsKKyAgICAgICAgaWYgKCFjcmVh
dGVHcmlkVHJhY2tNaW5NYXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjdXJyVmFs
dWUpLCBzdGF0ZSwgdHJhY2tTaXplKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
ICAgICB0cmFja1NpemVzLmFwcGVuZCh0cmFja1NpemUpOworICAgIH0KKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1ZSogdmFsdWUs
IFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVSZXNvbHZlcjo6
U3RhdGUmIHN0YXRlKQoreworICAgIC8vIEhhbmRsZSAnbm9uZScuCisgICAgaWYgKHZhbHVlLT5p
c1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2
ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAg
IHJldHVybiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmU7CisgICAg
fQorCisgICAgcmV0dXJuIGNyZWF0ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0ZSwgdHJhY2tT
aXplcyk7Cit9CisKKworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENTU1ZhbHVlKiB2
YWx1ZSwgR3JpZFBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICAvLyBGb3Igbm93LCB3ZSBvbmx5
IGFjY2VwdDogPGludGVnZXI+IHwgJ2F1dG8nCisgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVW
YWx1ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsK
KyAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9O
KHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKTsKKyAgICBwb3NpdGlvbi5zZXRJbnRlZ2VyUG9z
aXRpb24ocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOworICAgIHJldHVybiB0cnVlOwor
fQorCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCitzdGF0aWMgYm9vbCBoYXNWYXJpYWJsZVJl
ZmVyZW5jZShDU1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpIHsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHJldHVybiBwcmlt
aXRpdmVWYWx1ZS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKKyAgICB9CisKKyAgICBpZiAodmFs
dWUtPmlzQ2FsY3VsYXRpb25WYWx1ZSgpKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NT
Q2FsY1ZhbHVlKj4odmFsdWUpLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOworCisgICAgaWYgKHZh
bHVlLT5pc1JlZmxlY3RWYWx1ZSgpKSB7CisgICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVj
dFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOworICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogZGlyZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKTsK
KyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1ZS0+b2Zmc2V0
KCk7CisgICAgICAgIENTU1ZhbHVlKiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNrKCk7CisgICAg
ICAgIHJldHVybiAoZGlyZWN0aW9uICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRpcmVjdGlvbikp
IHx8IChvZmZzZXQgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwgKG1hc2sgJiYg
aGFzVmFyaWFibGVSZWZlcmVuY2UobWFzaykpOworICAgIH0KKworICAgIGZvciAoQ1NTVmFsdWVM
aXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAg
ICAgaWYgKGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGkudmFsdWUoKSkpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6cmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUs
IFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Np
b25zKQoreworICAgIHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4cHJlc3Npb24o
aWQsIHZhbHVlLT5zZXJpYWxpemVSZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUuc3R5bGUoKS0+
dmFyaWFibGVzKCkpKTsKKworICAgIGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRhaW5zKGV4cHJl
c3Npb24pKQorICAgICAgICByZXR1cm47IC8vIGN5Y2xlIGRldGVjdGVkLgorCisgICAga25vd25F
eHByZXNzaW9ucy5hcHBlbmQoZXhwcmVzc2lvbik7CisKKyAgICAvLyBGSVhNRTogSXQgd291bGQg
YmUgZmFzdGVyIG5vdCB0byByZS1wYXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Igbm93IENTUyBw
cm9wZXJ0eSB2YWxpZGF0aW9uIGxpdmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdlIGRvIGl0IHRo
ZXJlLgorICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBTdHlsZVByb3Bl
cnR5U2V0OjpjcmVhdGUoKTsKKyAgICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1ZShyZXN1bHRT
ZXQuZ2V0KCksIGlkLCBleHByZXNzaW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50KCkpKQorICAg
ICAgICByZXR1cm47IC8vIGV4cHJlc3Npb24gZmFpbGVkIHRvIHBhcnNlLgorCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBpKyspIHsKKyAg
ICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVydHkgPSByZXN1
bHRTZXQtPnByb3BlcnR5QXQoaSk7CisgICAgICAgIGlmIChwcm9wZXJ0eS5pZCgpICE9IENTU1By
b3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHkudmFsdWUoKSkp
CisgICAgICAgICAgICByZXNvbHZlVmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZh
bHVlKCksIGtub3duRXhwcmVzc2lvbnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhcHBs
eVByb3BlcnR5KHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCkpOworICAgIH0KK30KKyNl
bmRpZgorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCBp
ZCwgQ1NTVmFsdWUqIHZhbHVlKQoreworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGlm
IChpZCAhPSBDU1NQcm9wZXJ0eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHZhbHVl
KSkgeworICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiBr
bm93bkV4cHJlc3Npb25zOworICAgICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2YWx1ZSwga25v
d25FeHByZXNzaW9ucyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8v
IENTUyB2YXJpYWJsZXMgZG9uJ3QgcmVzb2x2ZSBzaG9ydGhhbmRzIGF0IHBhcnNpbmcgdGltZSwg
c28gdGhpcyBzaG91bGQgYmUgKmFmdGVyKiBoYW5kbGluZyB2YXJpYWJsZXMuCisgICAgQVNTRVJU
X1dJVEhfTUVTU0FHRSghaXNFeHBhbmRlZFNob3J0aGFuZChpZCksICJTaG9ydGhhbmQgcHJvcGVy
dHkgaWQgPSAlZCB3YXNuJ3QgZXhwYW5kZWQgYXQgcGFyc2luZyB0aW1lIiwgaWQpOworCisgICAg
U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBib29sIGlzSW5oZXJpdCA9IHN0YXRlLnBhcmVu
dE5vZGUoKSAmJiB2YWx1ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpOworICAgIGJvb2wgaXNJbml0aWFs
ID0gdmFsdWUtPmlzSW5pdGlhbFZhbHVlKCkgfHwgKCFzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFs
dWUtPmlzSW5oZXJpdGVkVmFsdWUoKSk7CisKKyAgICBBU1NFUlQoIWlzSW5oZXJpdCB8fCAhaXNJ
bml0aWFsKTsgLy8gaXNJbmhlcml0IC0+ICFpc0luaXRpYWwgJiYgaXNJbml0aWFsIC0+ICFpc0lu
aGVyaXQKKyAgICBBU1NFUlQoIWlzSW5oZXJpdCB8fCAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0
YXRlLnBhcmVudFN0eWxlKCkpKTsgLy8gaXNJbmhlcml0IC0+IChzdGF0ZS5wYXJlbnROb2RlKCkg
JiYgc3RhdGUucGFyZW50U3R5bGUoKSkKKworICAgIGlmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRv
UmVndWxhclN0eWxlKCkgJiYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxl
KCkgfHwgIWlzVmFsaWRWaXNpdGVkTGlua1Byb3BlcnR5KGlkKSkpIHsKKyAgICAgICAgLy8gTGlt
aXQgdGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvbmx5IHRoZSBvbmVzIGhv
bm9yZWQgYnkgOnZpc2l0ZWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNJ
bmhlcml0ICYmICFzdGF0ZS5wYXJlbnRTdHlsZSgpLT5oYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJv
cGVydGllcygpICYmICFDU1NQcm9wZXJ0eTo6aXNJbmhlcml0ZWRQcm9wZXJ0eShpZCkpCisgICAg
ICAgIHN0YXRlLnBhcmVudFN0eWxlKCktPnNldEhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0
aWVzKCk7CisKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBpZiAoaWQgPT0gQ1NTUHJv
cGVydHlWYXJpYWJsZSkgeworICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElP
Tih2YWx1ZS0+aXNWYXJpYWJsZVZhbHVlKCkpOworICAgICAgICBDU1NWYXJpYWJsZVZhbHVlKiB2
YXJpYWJsZSA9IHN0YXRpY19jYXN0PENTU1ZhcmlhYmxlVmFsdWUqPih2YWx1ZSk7CisgICAgICAg
IEFTU0VSVCghdmFyaWFibGUtPm5hbWUoKS5pc0VtcHR5KCkpOworICAgICAgICBBU1NFUlQoIXZh
cmlhYmxlLT52YWx1ZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFZh
cmlhYmxlKHZhcmlhYmxlLT5uYW1lKCksIHZhcmlhYmxlLT52YWx1ZSgpKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gQ2hlY2sgbG9va3VwIHRhYmxlIGZvciBpbXBs
ZW1lbnRhdGlvbnMgYW5kIHVzZSB3aGVuIGF2YWlsYWJsZS4KKyAgICBjb25zdCBQcm9wZXJ0eUhh
bmRsZXImIGhhbmRsZXIgPSBtX3N0eWxlQnVpbGRlci5wcm9wZXJ0eUhhbmRsZXIoaWQpOworICAg
IGlmIChoYW5kbGVyLmlzVmFsaWQoKSkgeworICAgICAgICBpZiAoaXNJbmhlcml0KQorICAgICAg
ICAgICAgaGFuZGxlci5hcHBseUluaGVyaXRWYWx1ZShpZCwgdGhpcyk7CisgICAgICAgIGVsc2Ug
aWYgKGlzSW5pdGlhbCkKKyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbml0aWFsVmFsdWUoaWQs
IHRoaXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoYW5kbGVyLmFwcGx5VmFsdWUoaWQs
IHRoaXMsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkgPyBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKSA6IDA7CisKKyAgICBmbG9hdCB6b29t
RmFjdG9yID0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworCisgICAgLy8gV2hhdCBm
b2xsb3dzIGlzIGEgbGlzdCB0aGF0IG1hcHMgdGhlIENTUyBwcm9wZXJ0aWVzIGludG8gdGhlaXIg
Y29ycmVzcG9uZGluZyBmcm9udC1lbmQKKyAgICAvLyBSZW5kZXJTdHlsZSB2YWx1ZXMuCisgICAg
c3dpdGNoIChpZCkgeworICAgIC8vIGxpc3RzCisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6
CisgICAgICAgIC8vIGxpc3Qgb2Ygc3RyaW5nLCB1cmksIGNvdW50ZXIsIGF0dHIsIGkKKyAgICAg
ICAgeworICAgICAgICAgICAgLy8gRklYTUU6IEluIENTUzMsIGl0IHdpbGwgYmUgcG9zc2libGUg
dG8gaW5oZXJpdCBjb250ZW50LiBJbiBDU1MyIGl0IGlzIG5vdC4gVGhpcworICAgICAgICAgICAg
Ly8gbm90ZSBpcyBhIHJlbWluZGVyIHRoYXQgZXZlbnR1YWxseSAiaW5oZXJpdCIgbmVlZHMgdG8g
YmUgc3VwcG9ydGVkLgorCisgICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlz
dCgpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgYm9vbCBkaWRTZXQg
PSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVl
OyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSog
aXRlbSA9IGkudmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZUdlbmVy
YXRvclZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzR3JhZGllbnRW
YWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVu
dChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1
ZSo+KGl0ZW0pLT5ncmFkaWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSksIGRpZFNl
dCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldENvbnRlbnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRp
Y19jYXN0PENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqPihpdGVtKSksIGRpZFNldCk7CisgICAgICAg
ICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisg
ICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLT5pc0ltYWdlU2V0VmFsdWUoKSkgeworICAg
ICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KHNldE9yUGVuZGluZ0Zy
b21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlU2V0VmFsdWUq
PihpdGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Cisj
ZW5kaWYKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJ
bWFnZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29u
dGVudChjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNf
Y2FzdDxDU1NJbWFnZVZhbHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAg
ICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUo
KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogY29udGVudFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPihpdGVtKTsKKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWUtPmlzU3RyaW5n
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb250
ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBkaWRTZXQpOworICAgICAgICAgICAg
ICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVu
dFZhbHVlLT5pc0F0dHIoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2FuIGEg
bmFtZXNwYWNlIGJlIHNwZWNpZmllZCBmb3IgYW4gYXR0cihmb28pPworICAgICAgICAgICAgICAg
ICAgICBpZiAoc3RhdGUuc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8pCisgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAgICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGFyZW50U3R5bGUo
KS0+c2V0VW5pcXVlKCk7CisgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgYXR0cihu
dWxsQXRvbSwgY29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgbnVsbEF0b20p
OworICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlID0gc3RhdGUu
ZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoYXR0cik7CisgICAgICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldENvbnRlbnQodmFsdWUuaXNOdWxsKCkgPyBlbXB0eUF0b20gOiB2YWx1ZS5p
bXBsKCksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAg
ICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2
YWx1ZSBhZmZlY3RzIHRoZSBzdHlsZQorICAgICAgICAgICAgICAgICAgICBtX3J1bGVTZXRzLmZl
YXR1cmVzKCkuYXR0cnNJblJ1bGVzLmFkZChhdHRyLmxvY2FsTmFtZSgpLmltcGwoKSk7CisgICAg
ICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUtPmlzQ291bnRlcigpKSB7CisgICAg
ICAgICAgICAgICAgICAgIENvdW50ZXIqIGNvdW50ZXJWYWx1ZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0
Q291bnRlclZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIEVMaXN0U3R5bGVUeXBlIGxpc3RT
dHlsZVR5cGUgPSBOb25lTGlzdFN0eWxlOworICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdFN0
eWxlSWRlbnQgPSBjb3VudGVyVmFsdWUtPmxpc3RTdHlsZUlkZW50KCk7CisgICAgICAgICAgICAg
ICAgICAgIGlmIChsaXN0U3R5bGVJZGVudCAhPSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICAg
ICAgICAgICAgICBsaXN0U3R5bGVUeXBlID0gc3RhdGljX2Nhc3Q8RUxpc3RTdHlsZVR5cGU+KGxp
c3RTdHlsZUlkZW50IC0gQ1NTVmFsdWVEaXNjKTsKKyAgICAgICAgICAgICAgICAgICAgT3duUHRy
PENvdW50ZXJDb250ZW50PiBjb3VudGVyID0gYWRvcHRQdHIobmV3IENvdW50ZXJDb250ZW50KGNv
dW50ZXJWYWx1ZS0+aWRlbnRpZmllcigpLCBsaXN0U3R5bGVUeXBlLCBjb3VudGVyVmFsdWUtPnNl
cGFyYXRvcigpKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoY291bnRlci5yZWxlYXNlKCksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNl
dCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAg
c3dpdGNoIChjb250ZW50VmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZU9wZW5RdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldENvbnRlbnQoT1BFTl9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUNsb3NlUXVvdGU6CisgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KENMT1NFX1FVT1RFLCBkaWRTZXQp
OworICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9PcGVu
UXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50
KE5PX09QRU5fUVVPVEUsIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
ICAgIGNhc2UgQ1NTVmFsdWVOb0Nsb3NlUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KE5PX0NMT1NFX1FVT1RFLCBkaWRTZXQpOworICAgICAg
ICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAg
ICAgICAgLy8gbm9ybWFsIGFuZCBub25lIGRvIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgICAgICAg
ICAgICAgICAgICAgICAgICB7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGlkU2V0KQorICAgICAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPmNsZWFyQ29udGVudCgpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVF1b3RlczoKKyAgICAgICAgaWYgKGlz
SW5oZXJpdCkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHN0YXRlLnBh
cmVudFN0eWxlKCktPnF1b3RlcygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRR
dW90ZXMoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZh
bHVlLT5pc1ZhbHVlTGlzdCgpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBz
dGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7CisgICAgICAgICAgICBSZWZQdHI8UXVv
dGVzRGF0YT4gcXVvdGVzID0gUXVvdGVzRGF0YTo6Y3JlYXRlKCk7CisgICAgICAgICAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGxpc3QtPmxlbmd0aCgpOyBpICs9IDIpIHsKKyAgICAgICAgICAg
ICAgICBDU1NWYWx1ZSogZmlyc3QgPSBsaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwor
ICAgICAgICAgICAgICAgIC8vIGl0ZW0oKSByZXR1cm5zIG51bGwgaWYgb3V0IG9mIGJvdW5kcyBz
byB0aGlzIGlzIHNhZmUuCisgICAgICAgICAgICAgICAgQ1NTVmFsdWUqIHNlY29uZCA9IGxpc3Qt
Pml0ZW0oaSArIDEpOworICAgICAgICAgICAgICAgIGlmICghc2Vjb25kKQorICAgICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9J
TVBMSUNBVElPTihmaXJzdC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBB
U1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzZWNvbmQtPmlzUHJpbWl0aXZlVmFsdWUo
KSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXJ0UXVvdGUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KGZpcnN0KS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAg
ICBTdHJpbmcgZW5kUXVvdGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHNlY29u
ZCktPmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgcXVvdGVzLT5hZGRQYWlyKHN0
ZDo6bWFrZV9wYWlyKHN0YXJ0UXVvdGUsIGVuZFF1b3RlKSk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMocXVvdGVzKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsKKyAgICAgICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCisgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKFF1b3Rlc0RhdGE6OmNyZWF0ZSgp
KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRG
YW1pbHk6IHsKKyAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmdzIGFuZCBpZHMKKyAgICAgICAgaWYg
KGlzSW5oZXJpdCkgeworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIHBhcmVudEZvbnREZXNj
cmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAg
ICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZv
bnREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSk7CisgICAgICAgICAg
ICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlvbi5maXJzdEZh
bWlseSgpKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmllZEZvbnQo
cGFyZW50Rm9udERlc2NyaXB0aW9uLmlzU3BlY2lmaWVkRm9udCgpKTsKKyAgICAgICAgICAgIHNl
dEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgRm9udERl
c2NyaXB0aW9uIGluaXRpYWxEZXNjID0gRm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBG
b250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2Ny
aXB0aW9uKCk7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCB0aGUgc2l6ZSB0byBh
Y2NvdW50IGZvciB0aGUgZ2VuZXJpYyBmYW1pbHkgY2hhbmdlIGZyb20gbW9ub3NwYWNlCisgICAg
ICAgICAgICAvLyB0byBub24tbW9ub3NwYWNlLgorICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlw
dGlvbi5rZXl3b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXpl
KCkpCisgICAgICAgICAgICAgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6
ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9u
LmtleXdvcmRTaXplKCkgLSAxLCBmYWxzZSkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoaW5pdGlhbERlc2MuZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAgICAg
ICAgIGlmICghaW5pdGlhbERlc2MuZmlyc3RGYW1pbHkoKS5mYW1pbHlJc0VtcHR5KCkpCisgICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZhbWlseShpbml0aWFsRGVzYy5maXJzdEZh
bWlseSgpKTsKKyAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24p
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+
aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRm9udERlc2NyaXB0
aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwor
ICAgICAgICBGb250RmFtaWx5JiBmaXJzdEZhbWlseSA9IGZvbnREZXNjcmlwdGlvbi5maXJzdEZh
bWlseSgpOworICAgICAgICBGb250RmFtaWx5KiBjdXJyRmFtaWx5ID0gMDsKKworICAgICAgICAv
LyBCZWZvcmUgbWFwcGluZyBpbiBhIG5ldyBmb250LWZhbWlseSBwcm9wZXJ0eSwgd2Ugc2hvdWxk
IHJlc2V0IHRoZSBnZW5lcmljIGZhbWlseS4KKyAgICAgICAgYm9vbCBvbGRGYW1pbHlVc2VkRml4
ZWREZWZhdWx0U2l6ZSA9IGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCk7Cisg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6
Tm9GYW1pbHkpOworCisgICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVl
OyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVt
ID0gaS52YWx1ZSgpOworICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVlKCkp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogY29udGVudFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsK
KyAgICAgICAgICAgIEF0b21pY1N0cmluZyBmYWNlOworICAgICAgICAgICAgU2V0dGluZ3MqIHNl
dHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1
ZS0+aXNTdHJpbmcoKSkKKyAgICAgICAgICAgICAgICBmYWNlID0gY29udGVudFZhbHVlLT5nZXRT
dHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MpIHsKKyAgICAgICAg
ICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAg
ICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRCb2R5OgorICAgICAgICAgICAgICAgICAgICBmYWNlID0g
c2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseSgpOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2VyaWY6CisgICAgICAgICAgICAgICAg
ICAgIGZhY2UgPSBzZXJpZkZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0
aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWlseSk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTYW5z
U2VyaWY6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzYW5zU2VyaWZGYW1pbHk7CisgICAg
ICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNj
cmlwdGlvbjo6U2Fuc1NlcmlmRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUN1cnNpdmU6CisgICAgICAgICAgICAgICAgICAg
IGZhY2UgPSBjdXJzaXZlRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OkN1cnNpdmVGYW1pbHkpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFu
dGFzeToKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGZhbnRhc3lGYW1pbHk7CisgICAgICAg
ICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlw
dGlvbjo6RmFudGFzeUZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgIGNhc2UgQ1NTVmFsdWVNb25vc3BhY2U6CisgICAgICAgICAgICAgICAgICAgIGZh
Y2UgPSBtb25vc3BhY2VGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KTsKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdl
YmtpdFBpY3RvZ3JhcGg6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBwaWN0b2dyYXBoRmFt
aWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWls
eShGb250RGVzY3JpcHRpb246OlBpY3RvZ3JhcGhGYW1pbHkpOworICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGlmICghZmFjZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJGYW1pbHkp
IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsbGluZyBpbiB0aGUgZmlyc3QgZmFtaWx5Lgor
ICAgICAgICAgICAgICAgICAgICBmaXJzdEZhbWlseS5zZXRGYW1pbHkoZmFjZSk7CisgICAgICAg
ICAgICAgICAgICAgIGZpcnN0RmFtaWx5LmFwcGVuZEZhbWlseSgwKTsgLy8gUmVtb3ZlIGFueSBp
bmhlcml0ZWQgZmFtaWx5LWZhbGxiYWNrIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIGN1cnJG
YW1pbHkgPSAmZmlyc3RGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRJc1NwZWNpZmllZEZvbnQoZm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSA9PSBG
b250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICBSZWZQdHI8U2hhcmVkRm9udEZhbWlseT4gbmV3RmFtaWx5ID0gU2hh
cmVkRm9udEZhbWlseTo6Y3JlYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZhbWlseS0+
c2V0RmFtaWx5KGZhY2UpOworICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5LT5hcHBlbmRG
YW1pbHkobmV3RmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9IG5ld0Zh
bWlseS5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICAvLyBXZSBjYW4ndCBjYWxsIHVzZUZpeGVkRGVmYXVsdFNpemUoKSB1bnRpbCBh
bGwgbmV3IGZvbnQgZmFtaWxpZXMgaGF2ZSBiZWVuIGFkZGVkCisgICAgICAgIC8vIElmIGN1cnJG
YW1pbHkgaXMgbm9uLXplcm8gdGhlbiB3ZSBzZXQgYXQgbGVhc3Qgb25lIGZhbWlseSBvbiB0aGlz
IGRlc2NyaXB0aW9uLgorICAgICAgICBpZiAoY3VyckZhbWlseSkgeworICAgICAgICAgICAgaWYg
KGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhl
ZERlZmF1bHRTaXplKCkgIT0gb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpCisgICAgICAg
ICAgICAgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQo
ZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXpl
KCkgLSAxLCAhb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpKTsKKworICAgICAgICAgICAg
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICAvLyBTaG9ydGhhbmQgcHJvcGVydGllcy4KKyAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udDoKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAgICAgICAgICAgRm9u
dERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxlKCktPmZvbnRE
ZXNjcmlwdGlvbigpOworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5zcGVjaWZpZWRMaW5lSGVpZ2h0KCkpOworICAgICAgICAgICAg
c3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0
aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNJbml0aWFsKSB7Cisg
ICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAg
ICAgICAgICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0
aW9uLCB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBo
YXZlIHNldHRpbmdzCisgICAgICAgICAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOworICAg
ICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAg
ICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKworICAgICAgICAgICAgRm9u
dERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIFJlbmRlclRoZW1lOjpk
ZWZhdWx0VGhlbWUoKS0+c3lzdGVtRm9udChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSwgZm9u
dERlc2NyaXB0aW9uKTsKKworICAgICAgICAgICAgLy8gRG91YmxlLWNoZWNrIGFuZCBzZWUgaWYg
dGhlIHRoZW1lIGRpZCBhbnl0aGluZy4gSWYgbm90LCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhl
IGZvbnQuCisgICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCkp
IHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBtb2RlIGFuZCBw
cmludGVyIGZvbnQgc2V0dGluZ3MgYXJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgU2V0dGlu
Z3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOworICAgICAgICAgICAgICAgIEFTU0VS
VChzZXR0aW5ncyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9j
dW1lbnQgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MK
KyAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm47CisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0
dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOworICAgICAgICAgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5n
cy0+c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisKKyAgICAgICAgICAgICAgICAv
LyBIYW5kbGUgdGhlIHpvb20gZmFjdG9yLgorICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRDb21wdXRlZFNpemUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1l
bnQoKSwgc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIGZv
bnREZXNjcmlwdGlvbi5zcGVjaWZpZWRTaXplKCksIHVzZVNWR1pvb21SdWxlcygpKSk7CisgICAg
ICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUtPmlzRm9udFZhbHVlKCkpIHsKKyAgICAg
ICAgICAgIEZvbnRWYWx1ZSogZm9udCA9IHN0YXRpY19jYXN0PEZvbnRWYWx1ZSo+KHZhbHVlKTsK
KyAgICAgICAgICAgIGlmICghZm9udC0+c3R5bGUgfHwgIWZvbnQtPnZhcmlhbnQgfHwgIWZvbnQt
PndlaWdodAorICAgICAgICAgICAgICAgIHx8ICFmb250LT5zaXplIHx8ICFmb250LT5saW5lSGVp
Z2h0IHx8ICFmb250LT5mYW1pbHkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAg
ICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTdHlsZSwgZm9udC0+c3R5bGUuZ2V0KCkp
OworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRWYXJpYW50LCBmb250
LT52YXJpYW50LmdldCgpKTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlG
b250V2VpZ2h0LCBmb250LT53ZWlnaHQuZ2V0KCkpOworICAgICAgICAgICAgLy8gVGhlIHByZXZp
b3VzIHByb3BlcnRpZXMgY2FuIGRpcnR5IG91ciBmb250IGJ1dCB0aGV5IGRvbid0IHRyeSB0byBy
ZWFkIHRoZSBmb250J3MKKyAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYmFjaywgd2hpY2ggaXMg
c2FmZS4gSG93ZXZlciBpZiBmb250LXNpemUgaXMgdXNpbmcgdGhlICdleCcgdW5pdCwgaXQgd2ls
bAorICAgICAgICAgICAgLy8gbmVlZCBxdWVyeSB0aGUgZGlydGllZCBmb250J3MgeC1oZWlnaHQg
dG8gZ2V0IHRoZSBjb21wdXRlZCBzaXplLiBUbyBiZSBzYWZlIGluIHRoaXMKKyAgICAgICAgICAg
IC8vIGNhc2UsIGxldCdzIGp1c3QgdXBkYXRlIHRoZSBmb250IG5vdy4KKyAgICAgICAgICAgIHVw
ZGF0ZUZvbnQoKTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U2l6
ZSwgZm9udC0+c2l6ZS5nZXQoKSk7CisKKyAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRW
YWx1ZShmb250LT5saW5lSGVpZ2h0LmdldCgpKTsKKworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0
eShDU1NQcm9wZXJ0eUZvbnRGYW1pbHksIGZvbnQtPmZhbWlseS5nZXQoKSk7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZFJlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJCb3R0b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyTGVmdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmFkaXVzOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJSaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3BhY2lu
ZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlclRvcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUxpc3RTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlPdXRsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvdzoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
QmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbnM6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEZsZXg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhGbG93OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRHcmlkQ29sdW1uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
Um93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Db2xsYXBzZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFycXVlZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
azoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXNrUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
RW1waGFzaXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybU9yaWdpbjoKKyNpZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFdyYXA6CisjZW5kaWYKKyAgICAgICAgQVNTRVJUKGlzRXhwYW5kZWRT
aG9ydGhhbmQoaWQpKTsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJy
ZWFrOworCisgICAgLy8gQ1NTMyBQcm9wZXJ0aWVzCisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRT
aGFkb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJveFNoYWRvdzoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm94U2hhZG93OiB7CisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAg
ICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cpCisgICAgICAgICAgICAgICAgcmV0
dXJuIHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4
dFNoYWRvdygpID8gYWRvcHRQdHIobmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCkt
PnRleHRTaGFkb3coKSkpIDogbnVsbHB0cik7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5
bGUoKS0+c2V0Qm94U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpID8gYWRv
cHRQdHIobmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpKSkg
OiBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNJbml0aWFsIHx8IHByaW1pdGl2
ZVZhbHVlKSAvLyBpbml0aWFsIHwgbm9uZQorICAgICAgICAgICAgcmV0dXJuIGlkID09IENTU1By
b3BlcnR5VGV4dFNoYWRvdyA/IHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3cobnVsbHB0cikg
OiBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7CisKKyAgICAgICAgaWYgKCF2
YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3Ig
KENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgp
KSB7CisgICAgICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAg
ICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hh
ZG93VmFsdWUqPihjdXJyVmFsdWUpOworICAgICAgICAgICAgaW50IHggPSBpdGVtLT54LT5jb21w
dXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6
b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGludCB5ID0gaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxp
bnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7
CisgICAgICAgICAgICBpbnQgYmx1ciA9IGl0ZW0tPmJsdXIgPyBpdGVtLT5ibHVyLT5jb21wdXRl
TGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29t
RmFjdG9yKSA6IDA7CisgICAgICAgICAgICBpbnQgc3ByZWFkID0gaXRlbS0+c3ByZWFkID8gaXRl
bS0+c3ByZWFkLT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVs
ZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSA6IDA7CisgICAgICAgICAgICBTaGFkb3dTdHlsZSBz
aGFkb3dTdHlsZSA9IGl0ZW0tPnN0eWxlICYmIGl0ZW0tPnN0eWxlLT5nZXRJZGVudCgpID09IENT
U1ZhbHVlSW5zZXQgPyBJbnNldCA6IE5vcm1hbDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOwor
ICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQorICAgICAgICAgICAgICAgIGNvbG9yID0gY29s
b3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOworICAgICAgICAgICAgZWxz
ZSBpZiAoc3RhdGUuc3R5bGUoKSkKKyAgICAgICAgICAgICAgICBjb2xvciA9IHN0YXRlLnN0eWxl
KCktPmNvbG9yKCk7CisKKyAgICAgICAgICAgIE93blB0cjxTaGFkb3dEYXRhPiBzaGFkb3dEYXRh
ID0gYWRvcHRQdHIobmV3IFNoYWRvd0RhdGEoSW50UG9pbnQoeCwgeSksIGJsdXIsIHNwcmVhZCwg
c2hhZG93U3R5bGUsIGlkID09IENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93LCBjb2xvci5pc1Zh
bGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCkpOworICAgICAgICAgICAgaWYgKGlk
ID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRUZXh0U2hhZG93KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBpLmluZGV4KCkpOyAvLyBhZGQg
dG8gdGhlIGxpc3QgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGVudHJ5CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KHNoYWRvd0Rh
dGEucmVsZWFzZSgpLCBpLmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYgdGhpcyBpcyBu
b3QgdGhlIGZpcnN0IGVudHJ5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVjdDogeworICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTChib3hSZWZsZWN0LCBCb3hSZWZsZWN0KQorICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3Qo
UmVuZGVyU3R5bGU6OmluaXRpYWxCb3hSZWZsZWN0KCkpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxlY3RWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgUmVmUHRyPFN0
eWxlUmVmbGVjdGlvbj4gcmVmbGVjdGlvbiA9IFN0eWxlUmVmbGVjdGlvbjo6Y3JlYXRlKCk7Cisg
ICAgICAgIHJlZmxlY3Rpb24tPnNldERpcmVjdGlvbigqcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24o
KSk7CisgICAgICAgIGlmIChyZWZsZWN0VmFsdWUtPm9mZnNldCgpKQorICAgICAgICAgICAgcmVm
bGVjdGlvbi0+c2V0T2Zmc2V0KHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCktPmNvbnZlcnRUb0xlbmd0
aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVk
Q29udmVyc2lvbj4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29t
RmFjdG9yKSk7CisgICAgICAgIE5pbmVQaWVjZUltYWdlIG1hc2s7CisgICAgICAgIG1hc2suc2V0
TWFza0RlZmF1bHRzKCk7CisgICAgICAgIG1fc3R5bGVNYXAubWFwTmluZVBpZWNlSW1hZ2UoaWQs
IHJlZmxlY3RWYWx1ZS0+bWFzaygpLCBtYXNrKTsKKyAgICAgICAgcmVmbGVjdGlvbi0+c2V0TWFz
ayhtYXNrKTsKKworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KHJlZmxlY3Rp
b24ucmVsZWFzZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3Bl
cnR5U3JjOiAvLyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KKyAgICAgICAgcmV0dXJu
OworICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlUmFuZ2U6IC8vIE9ubHkgdXNlZCBpbiBAZm9u
dC1mYWNlIHJ1bGVzLgorICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE1hcnF1ZWVSZXBldGl0aW9uOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KG1hcnF1ZWVMb29wQ291bnQsIE1hcnF1ZWVMb29wQ291bnQpCisgICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluZmluaXRlKQorICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVhdCBmb3JldmVy
LgorICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkKKyAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZlVmFsdWUtPmdl
dEludFZhbHVlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXJxdWVlU3BlZWQ6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJ
QUwobWFycXVlZVNwZWVkLCBNYXJxdWVlU3BlZWQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFs
dWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChpbnQgaWRlbnQgPSBwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgeworICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZVNsb3c6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0TWFycXVlZVNwZWVkKDUwMCk7IC8vIDUwMCBtc2VjLgorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKKyAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRoZSBXaW5JRSBk
ZWZhdWx0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZUZhc3Q6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDEw
KTsgLy8gMTBtc2VjLiBTdXBlciBmYXN0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1RpbWUoKSkKKyAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+
Y29tcHV0ZVRpbWU8aW50LCBDU1NQcmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRzPigpKTsKKyAg
ICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZvciBzY3JvbGxh
bW91bnQgc3VwcG9ydC4KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVl
ZChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsKKyAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFycXVlZUluY3Jl
bWVudCkKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBz
d2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlU21hbGw6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUlu
Y3JlbWVudChMZW5ndGgoMSwgRml4ZWQpKTsgLy8gMXB4LgorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKKyAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkpOyAvLyA2cHgu
IFRoZSBXaW5JRSBkZWZhdWx0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZUxhcmdlOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1h
cnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDM2LCBGaXhlZCkpOyAvLyAzNnB4LgorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
TGVuZ3RoIG1hcnF1ZWVMZW5ndGggPSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0aXZlVmFsdWUs
IHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBp
ZiAoIW1hcnF1ZWVMZW5ndGguaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KG1hcnF1ZWVMZW5ndGgpOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvY2FsZTog
eworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExvY2FsZSk7Cisg
ICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCisgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUobnVsbEF0b20pOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFsdWUtPmdldFN0
cmluZ1ZhbHVlKCkpOworICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0g
c3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihzdGF0ZS5zdHls
ZSgpLT5sb2NhbGUoKSkpOworICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBP
UlQpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoKKyAgICB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lvbnMsIERhc2hi
b2FyZFJlZ2lvbnMpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlTm9uZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9u
cyhSZW5kZXJTdHlsZTo6bm9uZURhc2hib2FyZFJlZ2lvbnMoKSk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKworICAgICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lvbiA9IHByaW1p
dGl2ZVZhbHVlLT5nZXREYXNoYm9hcmRSZWdpb25WYWx1ZSgpOworICAgICAgICBpZiAoIXJlZ2lv
bikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0
ID0gcmVnaW9uOworICAgICAgICB3aGlsZSAocmVnaW9uKSB7CisgICAgICAgICAgICBMZW5ndGgg
dG9wID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggcmlnaHQgPSBjb252
ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCkpOworICAgICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNvbnZlcnRUb0lu
dExlbmd0aChyZWdpb24tPmJvdHRvbSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVu
dFN0eWxlKCkpOworICAgICAgICAgICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgo
cmVnaW9uLT5sZWZ0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7
CisKKyAgICAgICAgICAgIGlmICh0b3AuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICB0
b3AgPSBMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5lZCgpKQorICAg
ICAgICAgICAgICAgIHJpZ2h0ID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoYm90dG9tLmlz
VW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7CisgICAgICAg
ICAgICBpZiAobGVmdC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIGxlZnQgPSBMZW5n
dGgoKTsKKworICAgICAgICAgICAgaWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKKyAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdp
b246OkNpcmNsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJl
Z2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgICAgICBlbHNlIGlmIChyZWdp
b24tPm1faXNSZWN0YW5nbGUpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFz
aGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9s
YWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6
IHRydWUpOworICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0KCk7CisgICAg
ICAgIH0KKworICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25z
KHRydWUpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyNpZiBFTkFCTEUoRFJB
R0dBQkxFX1JFR0lPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVnaW9uOiB7Cisg
ICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2Fi
bGVSZWdpb25Nb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRHJhZyA/
IERyYWdnYWJsZVJlZ2lvbkRyYWcgOiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOworICAgICAgICBz
dGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJv
a2VXaWR0aDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tl
V2lkdGgsIFRleHRTdHJva2VXaWR0aCkKKyAgICAgICAgZmxvYXQgd2lkdGggPSAwOworICAgICAg
ICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgIGNhc2UgQ1NT
VmFsdWVUaGluOgorICAgICAgICBjYXNlIENTU1ZhbHVlTWVkaXVtOgorICAgICAgICBjYXNlIENT
U1ZhbHVlVGhpY2s6IHsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAgLyA0ODsKKyAg
ICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1
bSkKKyAgICAgICAgICAgICAgICByZXN1bHQgKj0gMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVGhpY2spCisgICAgICAgICAgICAg
ICAgcmVzdWx0ICo9IDU7CisgICAgICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpj
cmVhdGUocmVzdWx0LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8
ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rv
cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgd2lkdGggPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRT
dHJva2VXaWR0aCh3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFRyYW5zZm9ybTogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTCh0cmFuc2Zvcm0sIFRyYW5zZm9ybSk7CisgICAgICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMg
b3BlcmF0aW9uczsKKyAgICAgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0VHJhbnNmb3JtKG9wZXJhdGlvbnMpOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZTogeworICAg
ICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUp
CisKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7
CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7
CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgICAgIHBl
cnNwZWN0aXZlVmFsdWUgPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAg
ICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKKyAgICAgICAgICAgIC8v
IEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBw
eC4KKyAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3Jl
YXRlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6
Q1NTX1BYKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVs
ZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgaWYgKHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikKKyAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFsdWUpOworICAg
ICAgICByZXR1cm47CisgICAgfQorI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiB7CisgICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKHRhcEhpZ2hsaWdodENvbG9yLCBUYXBIaWdobGlnaHRDb2xvcik7Cisg
ICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAg
ICBDb2xvciBjb2wgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShwcmltaXRpdmVWYWx1ZSk7Cisg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRhcEhpZ2hsaWdodENvbG9yKGNvbCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisjZW5kaWYKKyNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1df
U0NST0xMSU5HKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPdmVyZmxvd1Njcm9sbGluZzog
eworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh1c2VUb3VjaE92ZXJmbG93U2Ny
b2xsaW5nLCBVc2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKTsKKyAgICAgICAgaWYgKCFwcmltaXRp
dmVWYWx1ZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRV
c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENT
U1ZhbHVlVG91Y2gpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgY2FzZSBD
U1NQcm9wZXJ0eUludmFsaWQ6CisgICAgICAgIHJldHVybjsKKyAgICAvLyBEaXJlY3Rpb25hbCBw
cm9wZXJ0aWVzIGFyZSByZXNvbHZlZCBieSByZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eSgp
IGJlZm9yZSB0aGUgc3dpdGNoLgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRD
b2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3JkZXJTdGFydENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJT
dGFydFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFdpZHRoOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckJlZm9yZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJB
ZnRlckNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlclN0eWxlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcldpZHRoOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJnaW5FbmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdp
blN0YXJ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5CZWZvcmU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXJnaW5CZWZvcmVDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2lu
VG9wQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFmdGVyQ29sbGFw
c2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJvdHRvbUNvbGxhcHNlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nRW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRQYWRkaW5nU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdCZWZv
cmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdBZnRlcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRM
b2dpY2FsSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsV2lkdGg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxIZWlnaHQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1heExvZ2ljYWxXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWF4TG9naWNhbEhlaWdodDoKKyAgICB7CisgICAgICAgIENTU1Byb3BlcnR5SUQgbmV3SWQg
PSBDU1NQcm9wZXJ0eTo6cmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoaWQsIHN0YXRlLnN0
eWxlKCktPmRpcmVjdGlvbigpLCBzdGF0ZS5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAg
ICAgQVNTRVJUKG5ld0lkICE9IGlkKTsKKyAgICAgICAgcmV0dXJuIGFwcGx5UHJvcGVydHkobmV3
SWQsIHZhbHVlKTsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHJldGNoOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlQYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91
Z2g6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaENvbG9yOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
TGluZVRocm91Z2hTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoV2lk
dGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dE92ZXJsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZU1v
ZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVN0eWxlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlUZXh0T3ZlcmxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVy
bGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZUNvbG9yOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVu
ZGVybGluZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lV2lkdGg6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRTaXplRGVsdGE6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0OgorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBDU1MgVGV4dCBMYXlvdXQgTW9kdWxlIExldmVsIDM6IFZlcnRpY2FsIHdyaXRpbmcgc3Vw
cG9ydAorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZTogeworICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh3cml0aW5nTW9kZSwgV3JpdGluZ01vZGUpOworICAg
ICAgICAKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgc2V0V3JpdGlu
Z01vZGUoKnByaW1pdGl2ZVZhbHVlKTsKKworICAgICAgICAvLyBGSVhNRTogSXQgaXMgbm90IG9r
IHRvIG1vZGlmeSBkb2N1bWVudCBzdGF0ZSB3aGlsZSBhcHBseWluZyBzdHlsZS4KKyAgICAgICAg
aWYgKHN0YXRlLmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQo
KS0+ZG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRX
cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KHRydWUpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRPcmllbnRhdGlvbjogeworICAg
ICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0T3JpZW50YXRpb24sIFRleHRPcmll
bnRhdGlvbik7CisKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgc2V0
VGV4dE9yaWVudGF0aW9uKCpwcmltaXRpdmVWYWx1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQm94Q29udGFpbjogeworICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChsaW5lQm94Q29udGFpbiwgTGluZUJveENvbnRh
aW4pCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExp
bmVCb3hDb250YWluKExpbmVCb3hDb250YWluTm9uZSk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc0NTU0xpbmVCb3hDb250YWluVmFsdWUo
KSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDU1NMaW5lQm94Q29udGFpblZhbHVl
KiBsaW5lQm94Q29udGFpblZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTTGluZUJveENvbnRhaW5WYWx1
ZSo+KHZhbHVlKTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4obGlu
ZUJveENvbnRhaW5WYWx1ZS0+dmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBDU1MgRm9udHMgTW9kdWxlIExldmVsIDMKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Rm9udEZlYXR1cmVTZXR0aW5nczogeworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJp
bWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb3JtYWwpIHsKKyAgICAgICAgICAg
IHNldEZvbnREZXNjcmlwdGlvbihzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKS5tYWtl
Tm9ybWFsRmVhdHVyZVNldHRpbmdzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5
bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0
YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKKyAgICAgICAgUmVmUHRyPEZvbnRGZWF0
dXJlU2V0dGluZ3M+IHNldHRpbmdzID0gRm9udEZlYXR1cmVTZXR0aW5nczo6Y3JlYXRlKCk7Cisg
ICAgICAgIGludCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBsaXN0LT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKGkpOworICAgICAgICAgICAgaWYgKCFpdGVtLT5pc0ZvbnRGZWF0
dXJlVmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEZvbnRG
ZWF0dXJlVmFsdWUqIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGb250RmVhdHVyZVZhbHVlKj4oaXRl
bSk7CisgICAgICAgICAgICBzZXR0aW5ncy0+YXBwZW5kKEZvbnRGZWF0dXJlKGZlYXR1cmUtPnRh
ZygpLCBmZWF0dXJlLT52YWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9udERlc2NyaXB0
aW9uLnNldEZlYXR1cmVTZXR0aW5ncyhzZXR0aW5ncy5yZWxlYXNlKCkpOworICAgICAgICBzZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmls
dGVyOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGZpbHRlciwgRmlsdGVy
KTsKKyAgICAgICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgICAgICBpZiAoY3Jl
YXRlRmlsdGVyT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1l
bnRTdHlsZSgpLCBvcGVyYXRpb25zKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEZp
bHRlcihvcGVyYXRpb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQ29sdW1uczogeworICAgICAgICBWZWN0b3I8R3JpZFRy
YWNrU2l6ZT4gdHJhY2tTaXplczsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0KHZh
bHVlLCB0cmFja1NpemVzLCBzdGF0ZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEdyaWRDb2x1bW5zKHRyYWNrU2l6ZXMpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93czogeworICAgICAgICBW
ZWN0b3I8R3JpZFRyYWNrU2l6ZT4gdHJhY2tTaXplczsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlk
VHJhY2tMaXN0KHZhbHVlLCB0cmFja1NpemVzLCBzdGF0ZSkpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRSb3dzKHRyYWNrU2l6ZXMpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRTdGFydDog
eworICAgICAgICBHcmlkUG9zaXRpb24gc3RhcnRQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFjcmVh
dGVHcmlkUG9zaXRpb24odmFsdWUsIHN0YXJ0UG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24p
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
RW5kOiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBlbmRQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFj
cmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGVuZFBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRC
ZWZvcmU6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIGJlZm9yZVBvc2l0aW9uOworICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYmVmb3JlUG9zaXRpb24pKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUJlZm9yZShiZWZv
cmVQb3NpdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEdyaWRBZnRlcjogeworICAgICAgICBHcmlkUG9zaXRpb24gYWZ0ZXJQb3NpdGlvbjsK
KyAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGFmdGVyUG9zaXRpb24pKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUFm
dGVyKGFmdGVyUG9zaXRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhl
c2UgcHJvcGVydGllcyBhcmUgYWxpYXNlZCBhbmQgU3R5bGVCdWlsZGVyIGFscmVhZHkgYXBwbGll
ZCB0aGUgcHJvcGVydHkgb24gdGhlIHByZWZpeGVkIHZlcnNpb24uCisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVRyYW5zaXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkR1cmF0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICAgICAgcmV0dXJuOworICAg
IC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGltcGxlbWVudGVkIGluIHRoZSBTdHlsZUJ1aWxkZXIg
bG9va3VwIHRhYmxlLgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kUG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9z
aXRpb25ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tTGVmdFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJv
dHRvbVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21XaWR0aDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckltYWdlT3V0c2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVJlcGVhdDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVySW1hZ2VTb3VyY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlV2lkdGg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Qm9yZGVyTGVmdFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0V2lkdGg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlclJpZ2h0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0V2lk
dGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJUb3BMZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BS
aWdodFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3R0b206
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJveFNpemluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2Fw
dGlvblNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNsZWFyOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
Q291bnRlckluY3JlbWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlclJlc2V0OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlDdXJzb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eURpcmVjdGlvbjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5RGlzcGxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5RW1wdHlD
ZWxsczoKKyAgICBjYXNlIENTU1Byb3BlcnR5RmxvYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZv
bnRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUZvbnRWYXJpYW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlIZWlnaHQ6CisjaWYgRU5BQkxFKENTU19JTUFHRV9PUklFTlRBVElPTikK
KyAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VPcmllbnRhdGlvbjoKKyNlbmRpZgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlJbWFnZVJlbmRlcmluZzoKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1JFU09MVVRJ
T04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVzb2x1dGlvbjoKKyNlbmRpZgorICAgIGNh
c2UgQ1NTUHJvcGVydHlMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5nOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlMaW5lSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0
U3R5bGVJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlUG9zaXRpb246CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVR5cGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdp
bkJvdHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luTGVmdDoKKyAgICBjYXNlIENTU1By
b3BlcnR5TWFyZ2luUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRvcDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5TWF4SGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5TWluSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5X
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3JwaGFuczoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlPdXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3ZlcmZsb3dXcmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1g6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eU92ZXJmbG93WToKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbToK
KyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ0xlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBh
ZGRpbmdSaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1RvcDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5UGFnZUJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0Jl
Zm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrSW5zaWRlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlQb2ludGVyRXZlbnRzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQb3NpdGlvbjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5UmVzaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlSaWdodDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5U3BlYWs6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRhYlNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRhYmxlTGF5b3V0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0QWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHREZWNvcmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0SW5kZW50OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0T3ZlcmZsb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRSZW5kZXJp
bmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRUcmFuc2Zvcm06CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVRvcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZUJpZGk6CisjaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVZhcmlhYmxlOgorI2VuZGlmCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVZlcnRpY2FsQWxpZ246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2li
aWxpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRlbGF5OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEFuaW1hdGlvbkR1cmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bmltYXRpb25GaWxsTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uSXRl
cmF0aW9uQ291bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbk5hbWU6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblBsYXlTdGF0ZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEFwcGVhcmFuY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFzcGVjdFJh
dGlvOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZmFjZVZpc2liaWxpdHk6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCYWNrZ3JvdW5kQ29tcG9zaXRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
YWNrZ3JvdW5kT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kU2l6
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRml0OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJIb3Jpem9udGFsU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVySW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRp
Y2FsU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246CisjaWYgRU5B
QkxFKENTU19CT1hfREVDT1JBVElPTl9CUkVBSykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm94RGVjb3JhdGlvbkJyZWFrOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eERpcmVjdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Qm94RmxleEdyb3VwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3hMaW5lczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdyb3VwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmllbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveFBhY2s6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29ycmVjdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Q29sdW1uQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Q29sdW1uQnJlYWtCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFr
SW5zaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uR2FwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRD
b2x1bW5Qcm9ncmVzc2lvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNv
bG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Q29sdW1uU3BhbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGg6
CisjaWYgRU5BQkxFKENVUlNPUl9WSVNJQklMSVRZKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRDdXJzb3JWaXNpYmlsaXR5OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFs
aWduQ29udGVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVtczoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25TZWxmOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRGbGV4QmFzaXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhHcm93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRGbGV4U2hyaW5rOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4V3JhcDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SnVzdGlmeUNvbnRlbnQ6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE9yZGVyOgorI2lmIEVOQUJMRShDU1NfUkVHSU9OUykKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Rmxvd0Zyb206CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dJbnRv
OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRLZXJuaW5nOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRGb250U21vb3RoaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRGb250VmFyaWFudExpZ2F0dXJlczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SGln
aGxpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVDaGFyYWN0ZXI6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QWZ0ZXI6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRIeXBoZW5hdGVMaW1pdExpbmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRI
eXBoZW5zOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQWxpZ246CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdExpbmVCcmVhazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGlu
ZUNsYW1wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lR3JpZDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TGluZVNuYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1
ZWVEaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXNrQm94SW1hZ2VPdXRzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tCb3hJbWFnZVJlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdl
U2xpY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNvdXJjZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlV2lkdGg6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ29t
cG9zaXRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE1hc2tPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXNrUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE5ic3BNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVy
c3BlY3RpdmVPcmlnaW5YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9y
aWdpblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6CisjaWYg
RU5BQkxFKENTU19SRUdJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVh
a0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFJlZ2lvbk92ZXJmbG93OgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFJ0bE9yZGVyaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRp
b246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRDb21iaW5lOgorI2lmIEVOQUJMRShD
U1MzX1RFWFQpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEFsaWduTGFzdDoKKyNlbmRpZiAvLyBDU1MzX1RFWFQKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1Bvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RW1waGFzaXNTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZp
bGxDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRyYW5zZm9ybU9yaWdpblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5z
Zm9ybU9yaWdpblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblo6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybVN0eWxlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUcmFuc2l0aW9uRGVsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zaXRpb25EdXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlv
blByb3BlcnR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uVGltaW5nRnVu
Y3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJEcmFnOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRVc2VyTW9kaWZ5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2Vy
U2VsZWN0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDbGlwUGF0aDoKKyNpZiBFTkFCTEUo
Q1NTX0VYQ0xVU0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBGbG93OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZU1hcmdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0U2hhcGVQYWRkaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwVGhyb3Vn
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVJbnNpZGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFNoYXBlT3V0c2lkZToKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
aGl0ZVNwYWNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaWRvd3M6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkQnJlYWs6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdvcmRTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkV3JhcDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5WkluZGV4OgorICAgIGNhc2UgQ1NTUHJvcGVydHlab29tOgorI2lmIEVO
QUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFpvb206
CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1pblpvb206CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9yaWVu
dGF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlVc2VyWm9vbToKKyNlbmRpZgorICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisjaWYg
RU5BQkxFKFNWRykKKyAgICAgICAgLy8gVHJ5IHRoZSBTVkcgcHJvcGVydGllcworICAgICAgICBh
cHBseVNWR1Byb3BlcnR5KGlkLCB2YWx1ZSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAg
IH0KK30KKworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUltYWdl
KENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFs
dWUtPmlzSW1hZ2VWYWx1ZSgpKQorICAgICAgICByZXR1cm4gY2FjaGVkT3JQZW5kaW5nRnJvbVZh
bHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZhbHVlKj4odmFsdWUpKTsKKworICAg
IGlmICh2YWx1ZS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKKyAgICAgICAgaWYgKHZhbHVl
LT5pc0dyYWRpZW50VmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRPclBlbmRp
bmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFsdWUqPih2YWx1
ZSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKTsKKyAgICAgICAgcmV0
dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NT
SW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KHZhbHVlKSk7CisgICAgfQorCisjaWYgRU5BQkxFKENTU19J
TUFHRV9TRVQpCisgICAgaWYgKHZhbHVlLT5pc0ltYWdlU2V0VmFsdWUoKSkKKyAgICAgICAgcmV0
dXJuIHNldE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VT
ZXRWYWx1ZSo+KHZhbHVlKSk7CisjZW5kaWYKKworICAgIGlmICh2YWx1ZS0+aXNDdXJzb3JJbWFn
ZVZhbHVlKCkpCisgICAgICAgIHJldHVybiBjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVy
dHksIHN0YXRpY19jYXN0PENTU0N1cnNvckltYWdlVmFsdWUqPih2YWx1ZSkpOworCisgICAgcmV0
dXJuIDA7Cit9CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y2FjaGVk
T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlVmFsdWUq
IHZhbHVlKQoreworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRP
clBlbmRpbmdJbWFnZSgpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2Uo
KSkKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5
LCB2YWx1ZSk7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxT
dHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogdmFsdWUpCit7Cisg
ICAgaWYgKHZhbHVlLT5pc1BlbmRpbmcoKSkgeworICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFn
ZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFN0eWxl
UGVuZGluZ0ltYWdlOjpjcmVhdGUodmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gU3R5bGVHZW5l
cmF0ZWRJbWFnZTo6Y3JlYXRlKHZhbHVlKTsKK30KKworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VU
KQorUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzZXRPclBlbmRpbmdGcm9t
VmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VTZXRWYWx1ZSogdmFsdWUpCit7
CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0lt
YWdlU2V0KGRvY3VtZW50KCkpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1h
Z2UoKSkKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3Bl
cnR5LCB2YWx1ZSk7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKyNlbmRpZgorCitQ
YXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmN1cnNvck9yUGVuZGluZ0Zyb21W
YWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NDdXJzb3JJbWFnZVZhbHVlKiB2YWx1ZSkK
K3sKKyAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5n
SW1hZ2UoZG9jdW1lbnQoKSk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFn
ZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVy
dHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0
eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA9PSBw
YXJlbnRTdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsK
KyAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7CisgICAg
c2V0Rm9udFNpemUobmV3Rm9udERlc2NyaXB0aW9uLCBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgp
KTsKKyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Cit9
CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRl
clN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworCisg
ICAgaWYgKGNoaWxkRm9udC5pc0Fic29sdXRlU2l6ZSgpIHx8ICFwYXJlbnRTdHlsZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250ID0gcGFy
ZW50U3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIGlmIChjaGlsZEZvbnQudXNlRml4ZWRE
ZWZhdWx0U2l6ZSgpID09IHBhcmVudEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBGb3Igbm93LCBsdW1wIGFsbCBmYW1pbGllcyBidXQgbW9ub3Nw
YWNlIHRvZ2V0aGVyLgorICAgIGlmIChjaGlsZEZvbnQuZ2VuZXJpY0ZhbWlseSgpICE9IEZvbnRE
ZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5CisgICAgICAgICYmIHBhcmVudEZvbnQuZ2VuZXJp
Y0ZhbWlseSgpICE9IEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBXZSBrbm93IHRoZSBwYXJlbnQgaXMgbW9ub3NwYWNlIG9yIHRoZSBj
aGlsZCBpcyBtb25vc3BhY2UsIGFuZCB0aGF0IGZvbnQKKyAgICAvLyBzaXplIHdhcyB1bnNwZWNp
ZmllZC4gV2Ugd2FudCB0byBzY2FsZSBvdXIgZm9udCBzaXplIGFzIGFwcHJvcHJpYXRlLgorICAg
IC8vIElmIHRoZSBmb250IHVzZXMgYSBrZXl3b3JkIHNpemUsIHRoZW4gd2UgcmVmZXRjaCBmcm9t
IHRoZSB0YWJsZSByYXRoZXIgdGhhbgorICAgIC8vIG11bHRpcGx5aW5nIGJ5IG91ciBzY2FsZSBm
YWN0b3IuCisgICAgZmxvYXQgc2l6ZTsKKyAgICBpZiAoY2hpbGRGb250LmtleXdvcmRTaXplKCkp
CisgICAgICAgIHNpemUgPSBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVY
eFNtYWxsICsgY2hpbGRGb250LmtleXdvcmRTaXplKCkgLSAxLCBjaGlsZEZvbnQudXNlRml4ZWRE
ZWZhdWx0U2l6ZSgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0g
ZG9jdW1lbnRTZXR0aW5ncygpOworICAgICAgICBmbG9hdCBmaXhlZFNjYWxlRmFjdG9yID0gKHNl
dHRpbmdzICYmIHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpICYmIHNldHRpbmdzLT5k
ZWZhdWx0Rm9udFNpemUoKSkKKyAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNldHRp
bmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpKSAvIHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUo
KQorICAgICAgICAgICAgOiAxOworICAgICAgICBzaXplID0gcGFyZW50Rm9udC51c2VGaXhlZERl
ZmF1bHRTaXplKCkgPworICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkg
LyBmaXhlZFNjYWxlRmFjdG9yIDoKKyAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVk
U2l6ZSgpICogZml4ZWRTY2FsZUZhY3RvcjsKKyAgICB9CisKKyAgICBGb250RGVzY3JpcHRpb24g
bmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7CisgICAgc2V0Rm9udFNpemUobmV3Rm9udERl
c2NyaXB0aW9uLCBzaXplKTsKKyAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnRE
ZXNjcmlwdGlvbik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdGlhbGl6ZUZvbnRTdHls
ZShTZXR0aW5ncyogc2V0dGluZ3MpCit7CisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlw
dGlvbjsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRp
b246OlN0YW5kYXJkRmFtaWx5KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9k
ZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNl
dFVzZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3Jl
ZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0
YW5kYXJkRm9udEZhbWlseSA9IGRvY3VtZW50U2V0dGluZ3MoKS0+c3RhbmRhcmRGb250RmFtaWx5
KCk7CisgICAgaWYgKCFzdGFuZGFyZEZvbnRGYW1pbHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnRGYW1pbHkp
OworICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7
CisgICAgfQorICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1
bSAtIENTU1ZhbHVlWHhTbWFsbCArIDEpOworICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlv
biwgZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSkp
OworICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlh
bExpbmVIZWlnaHQoKSk7CisgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAg
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6c2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGZsb2F0
IHNpemUpCit7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7Cisg
ICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3Bl
Y2lmaWVkU2l6ZShkb2N1bWVudCgpLCBtX3N0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5p
c0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMoKSkpOworfQorCitmbG9hdCBT
dHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCog
ZG9jdW1lbnQsIFJlbmRlclN0eWxlKiBzdHlsZSwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQg
c3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVsZXMpCit7CisgICAgZmxvYXQgem9vbUZh
Y3RvciA9IDEuMGY7CisgICAgaWYgKCF1c2VTVkdab29tUnVsZXMpIHsKKyAgICAgICAgem9vbUZh
Y3RvciA9IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgICAgIGlmIChGcmFtZSogZnJhbWUg
PSBkb2N1bWVudC0+ZnJhbWUoKSkKKyAgICAgICAgICAgIHpvb21GYWN0b3IgKj0gZnJhbWUtPnRl
eHRab29tRmFjdG9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIFN0eWxlUmVzb2x2ZXI6OmdldENv
bXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCB6b29tRmFjdG9yLCBpc0Fic29s
dXRlU2l6ZSwgc3BlY2lmaWVkU2l6ZSk7Cit9CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENv
bXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgZmxvYXQgem9v
bUZhY3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0
TWluaW11bUZvckZvbnRTaXplIHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplKQoreworICAgIC8v
IFRleHQgd2l0aCBhIDBweCBmb250IHNpemUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIGFuZCB0aGVy
ZWZvcmUgbmVlZHMgdG8gYmUKKyAgICAvLyBleGVtcHQgZnJvbSBtaW5pbXVtIGZvbnQgc2l6ZSBy
dWxlcy4gQWNpZDMgcmVsaWVzIG9uIHRoaXMgZm9yIHBpeGVsLXBlcmZlY3QKKyAgICAvLyByZW5k
ZXJpbmcuIFRoaXMgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYnJvd3NlcnMgdGhhdCBo
YXZlIG1pbmltdW0KKyAgICAvLyBmb250IHNpemUgc2V0dGluZ3MgKGUuZy4gRmlyZWZveCkuCisg
ICAgaWYgKGZhYnNmKHNwZWNpZmllZFNpemUpIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46
OmVwc2lsb24oKSkKKyAgICAgICAgcmV0dXJuIDAuMGY7CisKKyAgICAvLyBXZSBzdXBwb3J0IHR3
byB0eXBlcyBvZiBtaW5pbXVtIGZvbnQgc2l6ZS4gVGhlIGZpcnN0IGlzIGEgaGFyZCBvdmVycmlk
ZSB0aGF0IGFwcGxpZXMgdG8KKyAgICAvLyBhbGwgZm9udHMuIFRoaXMgaXMgIm1pblNpemUuIiBU
aGUgc2Vjb25kIHR5cGUgb2YgbWluaW11bSBmb250IHNpemUgaXMgYSAic21hcnQgbWluaW11bSIK
KyAgICAvLyB0aGF0IGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSBXZWIgcGFnZSBjYW4ndCBrbm93
IHdoYXQgc2l6ZSBpdCByZWFsbHkgYXNrZWQgZm9yLCBlLmcuLAorICAgIC8vIHdoZW4gaXQgdXNl
cyBsb2dpY2FsIHNpemVzIGxpa2UgInNtYWxsIiBvciBleHByZXNzZXMgdGhlIGZvbnQtc2l6ZSBh
cyBhIHBlcmNlbnRhZ2Ugb2YKKyAgICAvLyB0aGUgdXNlcidzIGRlZmF1bHQgZm9udCBzZXR0aW5n
LgorCisgICAgLy8gV2l0aCB0aGUgc21hcnQgbWluaW11bSwgd2UgbmV2ZXIgd2FudCB0byBnZXQg
c21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIGZvbnQgc2l6ZSB0byBrZWVwIGZvbnRzIHJlYWRhYmxl
LgorICAgIC8vIEhvd2V2ZXIgd2UgYWx3YXlzIGFsbG93IHRoZSBwYWdlIHRvIHNldCBhbiBleHBs
aWNpdCBwaXhlbCBzaXplIHRoYXQgaXMgc21hbGxlciwKKyAgICAvLyBzaW5jZSBzaXRlcyB3aWxs
IG1pcy1yZW5kZXIgb3RoZXJ3aXNlIChlLmcuLCBodHRwOi8vd3d3LmdhbWVzcG90LmNvbSB3aXRo
IGEgOXB4IG1pbmltdW0pLgorCisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNl
dHRpbmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0dXJuIDEuMGY7CisKKyAg
ICBpbnQgbWluU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtRm9udFNpemUoKTsKKyAgICBpbnQgbWlu
TG9naWNhbFNpemUgPSBzZXR0aW5ncy0+bWluaW11bUxvZ2ljYWxGb250U2l6ZSgpOworICAgIGZs
b2F0IHpvb21lZFNpemUgPSBzcGVjaWZpZWRTaXplICogem9vbUZhY3RvcjsKKworICAgIC8vIEFw
cGx5IHRoZSBoYXJkIG1pbmltdW0gZmlyc3QuIFdlIG9ubHkgYXBwbHkgdGhlIGhhcmQgbWluaW11
bSBpZiBhZnRlciB6b29taW5nIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbC4KKyAgICBpZiAoem9vbWVk
U2l6ZSA8IG1pblNpemUpCisgICAgICAgIHpvb21lZFNpemUgPSBtaW5TaXplOworCisgICAgLy8g
Tm93IGFwcGx5IHRoZSAic21hcnQgbWluaW11bS4iIFRoaXMgbWluaW11bSBpcyBhbHNvIG9ubHkg
YXBwbGllZCBpZiB3ZSdyZSBzdGlsbCB0b28gc21hbGwKKyAgICAvLyBhZnRlciB6b29taW5nLiBU
aGUgZm9udCBzaXplIG11c3QgZWl0aGVyIGJlIHJlbGF0aXZlIHRvIHRoZSB1c2VyIGRlZmF1bHQg
b3IgdGhlIG9yaWdpbmFsIHNpemUKKyAgICAvLyBtdXN0IGhhdmUgYmVlbiBhY2NlcHRhYmxlLiBJ
biBvdGhlciB3b3Jkcywgd2Ugb25seSBhcHBseSB0aGUgc21hcnQgbWluaW11bSB3aGVuZXZlciB3
ZSdyZSBwb3NpdGl2ZQorICAgIC8vIGRvaW5nIHNvIHdvbid0IGRpc3J1cHQgdGhlIGxheW91dC4K
KyAgICBpZiAodXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUgJiYgem9vbWVkU2l6ZSA8IG1pbkxv
Z2ljYWxTaXplICYmIChzcGVjaWZpZWRTaXplID49IG1pbkxvZ2ljYWxTaXplIHx8ICFpc0Fic29s
dXRlU2l6ZSkpCisgICAgICAgIHpvb21lZFNpemUgPSBtaW5Mb2dpY2FsU2l6ZTsKKworICAgIC8v
IEFsc28gY2xhbXAgdG8gYSByZWFzb25hYmxlIG1heGltdW0gdG8gcHJldmVudCBpbnNhbmUgZm9u
dCBzaXplcyBmcm9tIGNhdXNpbmcgY3Jhc2hlcyBvbiB2YXJpb3VzCisgICAgLy8gcGxhdGZvcm1z
IChJJ20gbG9va2luZyBhdCB5b3UsIFdpbmRvd3MuKQorICAgIHJldHVybiBtaW4obWF4aW11bUFs
bG93ZWRGb250U2l6ZSwgem9vbWVkU2l6ZSk7Cit9CisKK2NvbnN0IGludCBmb250U2l6ZVRhYmxl
TWF4ID0gMTY7Citjb25zdCBpbnQgZm9udFNpemVUYWJsZU1pbiA9IDk7Citjb25zdCBpbnQgdG90
YWxLZXl3b3JkcyA9IDg7CisKKy8vIFdpbklFL05hdjQgdGFibGUgZm9yIGZvbnQgc2l6ZXMuIERl
c2lnbmVkIHRvIG1hdGNoIHRoZSBsZWdhY3kgZm9udCBtYXBwaW5nIHN5c3RlbSBvZiBIVE1MLgor
c3RhdGljIGNvbnN0IGludCBxdWlya3NGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBm
b250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQoreworICAgICAgeyA5LCAgICA5
LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI4IH0sCisgICAgICB7IDks
ICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzEgfSwKKyAgICAg
IHsgOSwgICAgOSwgICAgIDksICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzNCB9LAor
ICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM3
IH0sCisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwg
ICAgNDAgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKKyAgICAgIHsgOSwgICAgOSwgICAg
MTEsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAorICAgICAgeyA5LCAgIDEw
LCAgICAxMiwgICAgMTUsICAgIDE3LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCisgICAgICB7IDks
ICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9w
b3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKK307CisvLyBIVE1MICAgICAgIDEgICAgICAyICAg
ICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKKy8vIENTUyAgeHhzICAgeHMgICAgIHMg
ICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAg
IHwKKy8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgorCisvLyBTdHJpY3QgbW9kZSB0
YWJsZSBtYXRjaGVzIE1hY0lFIGFuZCBNb3ppbGxhJ3Mgc2V0dGluZ3MgZXhhY3RseS4KK3N0YXRp
YyBjb25zdCBpbnQgc3RyaWN0Rm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0gZm9udFNp
emVUYWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KK3sKKyAgICAgIHsgOSwgICAgOSwgICAg
IDksICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyNyB9LAorICAgICAgeyA5LCAgICA5
LCAgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMwIH0sCisgICAgICB7IDks
ICAgIDksICAgIDEwLCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzMgfSwKKyAgICAg
IHsgOSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAzNiB9LAor
ICAgICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYsICAgIDM5
IH0sIC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCisgICAgICB7IDksICAgMTAsICAgIDEyLCAg
ICAxNCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKKyAgICAgIHsgOSwgICAxMCwgICAg
MTMsICAgIDE1LCAgICAxOCwgICAgMjMsICAgIDMwLCAgICA0NSB9LAorICAgICAgeyA5LCAgIDEw
LCAgICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJvcG9ydGlv
bmFsIGZvbnQgZGVmYXVsdCAoMTYpCit9OworLy8gSFRNTCAgICAgICAxICAgICAgMiAgICAgIDMg
ICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3CisvLyBDU1MgIHh4cyAgIHhzICAgICBzICAgICAg
bSAgICAgIGwgICAgIHhsICAgICB4eGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB8Cisv
LyAgICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKKworLy8gRm9yIHZhbHVlcyBvdXRzaWRl
IHRoZSByYW5nZSBvZiB0aGUgdGFibGUsIHdlIHVzZSBUb2RkIEZhaHJuZXIncyBzdWdnZXN0ZWQg
c2NhbGUKKy8vIGZhY3RvcnMgZm9yIGVhY2gga2V5d29yZCB2YWx1ZS4KK3N0YXRpYyBjb25zdCBm
bG9hdCBmb250U2l6ZUZhY3RvcnNbdG90YWxLZXl3b3Jkc10gPSB7IDAuNjBmLCAwLjc1ZiwgMC44
OWYsIDEuMGYsIDEuMmYsIDEuNWYsIDIuMGYsIDMuMGYgfTsKKworZmxvYXQgU3R5bGVSZXNvbHZl
cjo6Zm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiBkb2N1bWVudCwgaW50IGtleXdvcmQsIGJv
b2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKK3sKKyAgICBTZXR0aW5ncyogc2V0dGluZ3Mg
PSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICByZXR1
cm4gMS4wZjsKKworICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01vZGUo
KTsKKyAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBzZXR0
aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUo
KTsKKyAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNpemUg
PD0gZm9udFNpemVUYWJsZU1heCkgeworICAgICAgICAvLyBMb29rIHVwIHRoZSBlbnRyeSBpbiB0
aGUgdGFibGUuCisgICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1p
bjsKKyAgICAgICAgaW50IGNvbCA9IChrZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxsKTsKKyAgICAg
ICAgcmV0dXJuIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRhYmxlW3Jvd11bY29sXSA6IHN0
cmljdEZvbnRTaXplVGFibGVbcm93XVtjb2xdOworICAgIH0KKworICAgIC8vIFZhbHVlIGlzIG91
dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZS4gQXBwbHkgdGhlIHNjYWxlIGZhY3RvciBpbnN0
ZWFkLgorICAgIGZsb2F0IG1pbkxvZ2ljYWxTaXplID0gbWF4KHNldHRpbmdzLT5taW5pbXVtTG9n
aWNhbEZvbnRTaXplKCksIDEpOworICAgIHJldHVybiBtYXgoZm9udFNpemVGYWN0b3JzW2tleXdv
cmQgLSBDU1NWYWx1ZVh4U21hbGxdKm1lZGl1bVNpemUsIG1pbkxvZ2ljYWxTaXplKTsKK30KKwor
dGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbnQgZmluZE5lYXJlc3RMZWdhY3lGb250U2l6
ZShpbnQgcGl4ZWxGb250U2l6ZSwgY29uc3QgVCogdGFibGUsIGludCBtdWx0aXBsaWVyKQorewor
ICAgIC8vIElnbm9yZSB0YWJsZVswXSBiZWNhdXNlIHh4LXNtYWxsIGRvZXMgbm90IGNvcnJlc3Bv
bmQgdG8gYW55IGxlZ2FjeSBmb250IHNpemUuCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0b3Rh
bEtleXdvcmRzIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChwaXhlbEZvbnRTaXplICogMiA8ICh0
YWJsZVtpXSArIHRhYmxlW2kgKyAxXSkgKiBtdWx0aXBsaWVyKQorICAgICAgICAgICAgcmV0dXJu
IGk7CisgICAgfQorICAgIHJldHVybiB0b3RhbEtleXdvcmRzIC0gMTsKK30KKworaW50IFN0eWxl
UmVzb2x2ZXI6OmxlZ2FjeUZvbnRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgaW50IHBpeGVsRm9u
dFNpemUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKK3sKKyAgICBTZXR0aW5ncyog
c2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAg
ICAgICByZXR1cm4gMTsKKworICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJr
c01vZGUoKTsKKyAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUg
PyBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9u
dFNpemUoKTsKKyAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1
bVNpemUgPD0gZm9udFNpemVUYWJsZU1heCkgeworICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6
ZSAtIGZvbnRTaXplVGFibGVNaW47CisgICAgICAgIHJldHVybiBmaW5kTmVhcmVzdExlZ2FjeUZv
bnRTaXplPGludD4ocGl4ZWxGb250U2l6ZSwgcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFi
bGVbcm93XSA6IHN0cmljdEZvbnRTaXplVGFibGVbcm93XSwgMSk7CisgICAgfQorCisgICAgcmV0
dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8ZmxvYXQ+KHBpeGVsRm9udFNpemUsIGZvbnRT
aXplRmFjdG9ycywgbWVkaXVtU2l6ZSk7Cit9CisKK3N0YXRpYyBDb2xvciBjb2xvckZvckNTU1Zh
bHVlKGludCBjc3NWYWx1ZUlkKQoreworICAgIHN0cnVjdCBDb2xvclZhbHVlIHsKKyAgICAgICAg
aW50IGNzc1ZhbHVlSWQ7CisgICAgICAgIFJHQkEzMiBjb2xvcjsKKyAgICB9OworCisgICAgc3Rh
dGljIGNvbnN0IENvbG9yVmFsdWUgY29sb3JWYWx1ZXNbXSA9IHsKKyAgICAgICAgeyBDU1NWYWx1
ZUFxdWEsIDB4RkYwMEZGRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUJsYWNrLCAweEZGMDAwMDAw
IH0sCisgICAgICAgIHsgQ1NTVmFsdWVCbHVlLCAweEZGMDAwMEZGIH0sCisgICAgICAgIHsgQ1NT
VmFsdWVGdWNoc2lhLCAweEZGRkYwMEZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmF5LCAweEZG
ODA4MDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmVlbiwgMHhGRjAwODAwMCAgfSwKKyAgICAg
ICAgeyBDU1NWYWx1ZUdyZXksIDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUxpbWUs
IDB4RkYwMEZGMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU1hcm9vbiwgMHhGRjgwMDAwMCB9LAor
ICAgICAgICB7IENTU1ZhbHVlTmF2eSwgMHhGRjAwMDA4MCB9LAorICAgICAgICB7IENTU1ZhbHVl
T2xpdmUsIDB4RkY4MDgwMDAgIH0sCisgICAgICAgIHsgQ1NTVmFsdWVPcmFuZ2UsIDB4RkZGRkE1
MDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVB1cnBsZSwgMHhGRjgwMDA4MCB9LAorICAgICAgICB7
IENTU1ZhbHVlUmVkLCAweEZGRkYwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVTaWx2ZXIsIDB4
RkZDMEMwQzAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVRlYWwsIDB4RkYwMDgwODAgIH0sCisgICAg
ICAgIHsgQ1NTVmFsdWVUcmFuc3BhcmVudCwgMHgwMDAwMDAwMCB9LAorICAgICAgICB7IENTU1Zh
bHVlV2hpdGUsIDB4RkZGRkZGRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVllbGxvdywgMHhGRkZG
RkYwMCB9LAorICAgICAgICB7IDAsIDAgfQorICAgIH07CisKKyAgICBmb3IgKGNvbnN0IENvbG9y
VmFsdWUqIGNvbCA9IGNvbG9yVmFsdWVzOyBjb2wtPmNzc1ZhbHVlSWQ7ICsrY29sKSB7CisgICAg
ICAgIGlmIChjb2wtPmNzc1ZhbHVlSWQgPT0gY3NzVmFsdWVJZCkKKyAgICAgICAgICAgIHJldHVy
biBjb2wtPmNvbG9yOworICAgIH0KKyAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVt
ZSgpLT5zeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpj
b2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZh
bHVlKiB2YWx1ZSkKK3sKKyAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0SWRlbnQoKTsKKyAgICBz
d2l0Y2ggKGlkZW50KSB7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6CisgICAgY2FzZSBD
U1NWYWx1ZVdlYmtpdExpbms6CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxpbms6Cisg
ICAgY2FzZSBDU1NWYWx1ZUN1cnJlbnRjb2xvcjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworQ29sb3IgU3R5bGVS
ZXNvbHZlcjo6Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVl
LCBib29sIGZvclZpc2l0ZWRMaW5rKSBjb25zdAoreworICAgIGlmICh2YWx1ZS0+aXNSR0JDb2xv
cigpKQorICAgICAgICByZXR1cm4gQ29sb3IodmFsdWUtPmdldFJHQkEzMlZhbHVlKCkpOworCisg
ICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+
Z2V0SWRlbnQoKTsKKyAgICBzd2l0Y2ggKGlkZW50KSB7CisgICAgY2FzZSAwOgorICAgICAgICBy
ZXR1cm4gQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKKyAgICAgICAgcmV0
dXJuIHN0YXRlLmRvY3VtZW50KCktPnRleHRDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJr
aXRMaW5rOgorICAgICAgICByZXR1cm4gKHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkgJiYgZm9y
VmlzaXRlZExpbmspID8gc3RhdGUuZG9jdW1lbnQoKS0+dmlzaXRlZExpbmtDb2xvcigpIDogc3Rh
dGUuZG9jdW1lbnQoKS0+bGlua0NvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2
ZWxpbms6CisgICAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudCgpLT5hY3RpdmVMaW5rQ29sb3Io
KTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0Rm9jdXNSaW5nQ29sb3I6CisgICAgICAgIHJldHVy
biBSZW5kZXJUaGVtZTo6Zm9jdXNSaW5nQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVu
dGNvbG9yOgorICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKKyAgICBkZWZh
dWx0OgorICAgICAgICByZXR1cm4gY29sb3JGb3JDU1NWYWx1ZShpZGVudCk7CisgICAgfQorfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3Vs
dChjb25zdCBNZWRpYVF1ZXJ5RXhwKiBleHByLCBib29sIHJlc3VsdCkKK3sKKyAgICBtX3ZpZXdw
b3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuYXBwZW5kKGFkb3B0UHRyKG5ldyBNZWRpYVF1
ZXJ5UmVzdWx0KCpleHByLCByZXN1bHQpKSk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6YWZm
ZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3QKK3sKKyAgICB1bnNpZ25lZCBzID0gbV92aWV3
cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgczsgaSsrKSB7CisgICAgICAgIGlmIChtX21lZGl1bS0+ZXZhbCgmbV92aWV3
cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX2V4cHJlc3Npb24pICE9IG1fdmll
d3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9yZXN1bHQpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgVHJh
bnNmb3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zZm9ybU9wZXJhdGlvblR5cGUgdHlwZSkKK3sK
KyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpT
Y2FsZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU7
CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9YOworICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6U0NBTEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlND
QUxFX1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfM0Q7CisgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJh
dGlvbjo6VFJBTlNMQVRFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJh
bnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJB
TlNMQVRFX1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV8z
RDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFuc2Zvcm1PcGVy
YXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURTsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9u
OjpST1RBVEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJh
bnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWjsKKyAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFXzNEOworICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlNLRVc7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tl
d1hUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWDsK
KyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19ZOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6TUFUUklYOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1h
dHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRS
SVhfM0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlBFUlNQRUNUSVZFOwor
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok5PTkU7CisgICAgfQorICAgIHJldHVybiBU
cmFuc2Zvcm1PcGVyYXRpb246Ok5PTkU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRl
VHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRp
b25zKQoreworICAgIGlmICghaW5WYWx1ZSB8fCAhaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkgewor
ICAgICAgICBvdXRPcGVyYXRpb25zLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpIDogMTsKKyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgZm9yIChD
U1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgp
KSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisKKyAgICAgICAg
aWYgKCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKiB0cmFuc2Zvcm1W
YWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKj4oaS52YWx1ZSgpKTsK
KyAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZhbHNlOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpOyAr
K2opIHsKKyAgICAgICAgICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGhhdmVOb25Q
cmltaXRpdmVWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1ZSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygwKSk7CisKKyAgICAgICAgc3dpdGNoICh0cmFuc2Zvcm1WYWx1ZS0+
b3BlcmF0aW9uVHlwZSgpKSB7CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAg
ZG91YmxlIHN4ID0gMS4wOworICAgICAgICAgICAgZG91YmxlIHN5ID0gMS4wOworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBzeSA9
IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygx
KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVW
YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHN5ID0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9u
OjpjcmVhdGUoc3gsIHN5LCAxLjAsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3Jt
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9w
ZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRy
YW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIHN4ID0gMS4wOworICAgICAg
ICAgICAgZG91YmxlIHN5ID0gMS4wOworICAgICAgICAgICAgZG91YmxlIHN6ID0gMS4wOworICAg
ICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICBzeiA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgc3kgPSBmaXJz
dFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICAgICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9y
bVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAg
ICAgICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAg
ICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHN4OworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3Bl
cmF0aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHN4LCBzeSwg
c3osIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5
cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJh
dGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRy
YW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3RoIHR4ID0gTGVuZ3RoKDAsIEZp
eGVkKTsKKyAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAg
ICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUs
IHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHggPSBj
b252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFj
dG9yKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlv
bikgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4g
MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNv
bnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFj
dG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmlu
ZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIG9wZXJh
dGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZSh0eCwgdHksIExlbmd0aCgwLCBGaXhlZCksIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0
ZVpUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlRyYW5zbGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGgg
dHggPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAs
IEZpeGVkKTsKKyAgICAgICAgICAgIExlbmd0aCB0eiA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAg
ICAgICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5
bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9w
ZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5z
Zm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3Ro
KGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZh
bHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgodGhpcmRWYWx1
ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0
VG9GbG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisKKyAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZpbmVkKCkg
fHwgdHouaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZSh0eCwgdHksIHR6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFs
dWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMo
KS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoMCwgMCwgMSwgYW5nbGUs
IGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246Cisg
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVy
YXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSB5
ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSB6ID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmds
ZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisKKyAgICAgICAgICAgIGlmICh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpS
b3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHggPSAxOworICAgICAg
ICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAg
ICAgICB5ID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB6ID0gMTsKKyAg
ICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1P
cGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRl
M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
bGVuZ3RoKCkgPCA0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOworICAg
ICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZvdXJ0aFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygz
KSk7CisgICAgICAgICAgICBkb3VibGUgeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICBkb3VibGUgeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwor
ICAgICAgICAgICAgZG91YmxlIHogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAg
ICAgICAgICAgZG91YmxlIGFuZ2xlID0gZm91cnRoVmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Cisg
ICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3Jt
T3BlcmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5
cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdU
cmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNrZXdYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFu
Z2xlWCA9IDA7CisgICAgICAgICAgICBkb3VibGUgYW5nbGVZID0gMDsKKyAgICAgICAgICAgIGRv
dWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgYW5nbGVZID0g
YW5nbGU7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbmdsZVggPSBhbmds
ZTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9
PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbikgeworICAg
ICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmdsZVkgPSBzZWNvbmRW
YWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9u
cygpLmFwcGVuZChTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGVYLCBhbmdsZVks
IGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDYpCisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBkb3VibGUgYSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICBkb3VibGUgYiA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgZG91YmxlIGMgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91Ymxl
VmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSktPmdldERv
dWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZSA9IHpvb21GYWN0b3IgKiBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBmID0gem9v
bUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeFRyYW5zZm9ybU9wZXJhdGlv
bjo6Y3JlYXRlKGEsIGIsIGMsIGQsIGUsIGYpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeDNEVHJhbnNm
b3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgp
IDwgMTYpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBtYXRyaXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSktPmdldERvdWJsZVZhbHVlKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZh
bHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSkt
PmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygzKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg2KSktPmdldERvdWJs
ZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg3
KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjayg4KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg5KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMCkpLT5nZXREb3VibGVWYWx1ZSgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTEpKS0+Z2V0
RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9y
ICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxMikpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEzKSktPmdldERvdWJs
ZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygx
NCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMTUpKS0+Z2V0RG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICBvcGVyYXRp
b25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0
ZShtYXRyaXgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOiB7
CisgICAgICAgICAgICBMZW5ndGggcCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBp
ZiAoZmlyc3RWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBwID0gY29udmVydFRv
RmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcXVpcmsgdGhh
dCBzaG91bGQgZ28gYXdheSB3aGVuIDNkIHRyYW5zZm9ybXMgYXJlIGZpbmFsaXplZC4KKyAgICAg
ICAgICAgICAgICBkb3VibGUgdmFsID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAg
ICAgICAgICAgICAgICBwID0gdmFsID49IDAgPyBMZW5ndGgoY2xhbXBUb1Bvc2l0aXZlSW50ZWdl
cih2YWwpLCBGaXhlZCkgOiBMZW5ndGgoVW5kZWZpbmVkKTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKHAuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChQZXJzcGVj
dGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHApKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25U
cmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0T3BlcmF0aW9ucyA9
IG9wZXJhdGlvbnM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRF
UlMpCitzdGF0aWMgRmlsdGVyT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGZpbHRlck9wZXJhdGlv
bkZvclR5cGUoV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkZpbHRlck9wZXJhdGlvblR5cGUgdHlwZSkK
K3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpS
ZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246
OlJFRkVSRU5DRTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0
ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkdSQVlTQ0FMRTsK
KyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKKyAg
ICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0VQSUE7CisgICAgY2FzZSBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0
ZXJPcGVyYXRpb246OlNBVFVSQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1
ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
SFVFX1JPVEFURTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJP
cGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OklOVkVSVDsKKyAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9uOgorICAgICAg
ICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpPUEFDSVRZOworICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0
ZXJPcGVyYXRpb246OkJSSUdIVE5FU1M7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246
OkNPTlRSQVNUOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVy
YXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkJMVVI7CisgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6RFJPUF9TSEFET1c7CisjaWYgRU5BQkxFKENTU19TSEFE
RVJTKQorICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkN1c3RvbUZpbHRlck9wZXJhdGlv
bjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NOworI2VuZGlmCisgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKKyAgICAg
ICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Tk9ORTsKKyAgICB9CisgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6Tk9ORTsKK30KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxF
KFNWRykKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKQorewor
ICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKCFzdGF0ZS5zdHlsZSgpLT5oYXNG
aWx0ZXIoKSB8fCBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2Fk
ZXIgPSBzdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworICAgIFZlY3Rv
cjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gc3RhdGUuc3R5
bGUoKS0+bXV0YWJsZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgZmlsdGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8
RmlsdGVyT3BlcmF0aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkp
OworICAgICAgICBpZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmls
dGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUZpbHRlck9w
ZXJhdGlvbiogcmVmZXJlbmNlRmlsdGVyID0gc3RhdGljX2Nhc3Q8UmVmZXJlbmNlRmlsdGVyT3Bl
cmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9uLmdldCgpKTsKKworICAgICAgICAgICAgV2ViS2l0Q1NT
U1ZHRG9jdW1lbnRWYWx1ZSogdmFsdWUgPSBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuZ2V0
KHJlZmVyZW5jZUZpbHRlcikuZ2V0KCk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ2FjaGVkU1ZHRG9jdW1lbnQqIGNhY2hl
ZERvY3VtZW50ID0gdmFsdWUtPmxvYWQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgICAgICAg
ICAgaWYgKCFjYWNoZWREb2N1bWVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICAgICAgLy8gU3Rhc2ggdGhlIENhY2hlZFNWR0RvY3VtZW50IG9uIHRoZSByZWZlcmVuY2Ug
ZmlsdGVyLgorICAgICAgICAgICAgcmVmZXJlbmNlRmlsdGVyLT5zZXRDYWNoZWRTVkdEb2N1bWVu
dFJlZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UoY2FjaGVk
RG9jdW1lbnQpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGUucGVuZGluZ1NWR0RvY3Vt
ZW50cygpLmNsZWFyKCk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKK1N0
eWxlU2hhZGVyKiBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYWRlcihDU1NWYWx1ZSogdmFsdWUpCit7
CisgICAgaWYgKHZhbHVlLT5pc1dlYktpdENTU1NoYWRlclZhbHVlKCkpCisgICAgICAgIHJldHVy
biBjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShzdGF0aWNfY2FzdDxXZWJLaXRD
U1NTaGFkZXJWYWx1ZSo+KHZhbHVlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK1N0eWxlU2hhZGVy
KiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJL
aXRDU1NTaGFkZXJWYWx1ZSogdmFsdWUpCit7CisgICAgU3R5bGVTaGFkZXIqIHNoYWRlciA9IHZh
bHVlLT5jYWNoZWRPclBlbmRpbmdTaGFkZXIoKTsKKyAgICBpZiAoc2hhZGVyICYmIHNoYWRlci0+
aXNQZW5kaW5nU2hhZGVyKCkpCisgICAgICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMo
dHJ1ZSk7CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpsb2Fk
UGVuZGluZ1NoYWRlcnMoKQoreworICAgIGlmICghbV9zdGF0ZS5zdHlsZSgpLT5oYXNGaWx0ZXIo
KSB8fCAhbV9zdGF0ZS5oYXNQZW5kaW5nU2hhZGVycygpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBtX3N0YXRlLmRv
Y3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisKKyAgICBWZWN0b3I8UmVmUHRyPEZp
bHRlck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IG1fc3RhdGUuc3R5bGUoKS0+bXV0
YWJsZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
ZmlsdGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8RmlsdGVyT3Bl
cmF0aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOworICAgICAg
ICBpZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVyT3BlcmF0
aW9uOjpDVVNUT00pIHsKKyAgICAgICAgICAgIEN1c3RvbUZpbHRlck9wZXJhdGlvbiogY3VzdG9t
RmlsdGVyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0
aW9uLmdldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVChjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7
CisgICAgICAgICAgICBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qIHByb2dyYW0gPSBzdGF0aWNf
Y2FzdDxTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qPihjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7
CisgICAgICAgICAgICBpZiAocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkgJiYgcHJvZ3JhbS0+dmVy
dGV4U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7CisgICAgICAgICAgICAgICAgV2ViS2l0
Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hh
ZGVyKj4ocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOworICAgICAg
ICAgICAgICAgIHByb2dyYW0tPnNldFZlcnRleFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hh
ZGVyKGNhY2hlZFJlc291cmNlTG9hZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiAocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSAmJiBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigp
LT5pc1BlbmRpbmdTaGFkZXIoKSkgeworICAgICAgICAgICAgICAgIFdlYktpdENTU1NoYWRlclZh
bHVlKiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRlcio+KHByb2dy
YW0tPmZyYWdtZW50U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOworICAgICAgICAgICAgICAg
IHByb2dyYW0tPnNldEZyYWdtZW50U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2Fj
aGVkUmVzb3VyY2VMb2FkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAg
ICBtX3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKTsKK30KKworc3RhdGljIGJvb2wg
c29ydFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXI+JiBhLCBjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiYgYikKK3sK
KyAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZUxlc3NUaGFuKGEtPm5hbWUoKSwgYi0+bmFtZSgp
KTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6
OnBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NW
YWx1ZUxpc3QqIHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0
ZXI+IGFycmF5UGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI6OmNyZWF0ZShu
YW1lKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBsZW5ndGggPSB2YWx1ZXMtPmxlbmd0aCgp
OyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOworICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2
ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1
ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1By
aW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IGFycmF5UGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUo
KSk7CisgICAgfQorICAgIHJldHVybiBhcnJheVBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bh
c3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3Rv
bUZpbHRlck51bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCog
dmFsdWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI+IG51bWJl
clBhcmFtZXRlciA9IEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YWx1ZXMtPmxlbmd0aCgpOyArK2kpIHsKKyAg
ICAgICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkp
OworICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVS
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG51bWJlclBhcmFtZXRlci0+YWRkVmFs
dWUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4g
bnVtYmVyUGFyYW1ldGVyLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1l
dGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVm
UHRyPEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcj4gdHJhbnNmb3JtUGFyYW1ldGVyID0g
Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7CisgICAgVHJhbnNm
b3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMo
dmFsdWVzLCBtX3N0YXRlLnN0eWxlKCksIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVy
YXRpb25zKTsKKyAgICB0cmFuc2Zvcm1QYXJhbWV0ZXItPnNldE9wZXJhdGlvbnMob3BlcmF0aW9u
cyk7CisgICAgcmV0dXJuIHRyYW5zZm9ybVBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZp
bHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKiBwYXJhbWV0ZXJWYWx1
ZSkKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IG90aGVyIHBhcmFtZXRlcnMgdHlwZXMgcGFy
c2luZy4KKyAgICAvLyBib29sZWFuczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTc2NDM4CisgICAgLy8gdGV4dHVyZXM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD03MTQ0MgorICAgIC8vIG1hdDIsIG1hdDMsIG1hdDQ6IGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTQ0NAorICAgIC8vIE51bWJlciBwYXJhbWV0
ZXJzIGFyZSB3cmFwcGVkIGluc2lkZSBhIENTU1ZhbHVlTGlzdCBhbmQgYWxsCisgICAgLy8gdGhl
IG90aGVyIGZ1bmN0aW9ucyB2YWx1ZXMgaW5oZXJpdCBmcm9tIENTU1ZhbHVlTGlzdC4KKyAgICBp
ZiAoIXBhcmFtZXRlclZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIENTU1ZhbHVlTGlzdCogdmFsdWVzID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4ocGFy
YW1ldGVyVmFsdWUpOworICAgIGlmICghdmFsdWVzLT5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBpZiAocGFyYW1ldGVyVmFsdWUtPmlzV2ViS2l0Q1NTQXJyYXlGdW5jdGlvblZh
bHVlKCkpCisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKG5h
bWUsIHZhbHVlcyk7CisKKyAgICAvLyBJZiB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGxpc3QgaXMg
YSB0cmFuc2Zvcm0gZnVuY3Rpb24sCisgICAgLy8gdGhlbiB3ZSBjb3VsZCBzYWZlbHkgYXNzdW1l
IHRoYXQgYWxsIHRoZSByZW1haW5pbmcgaXRlbXMKKyAgICAvLyBhcmUgdHJhbnNmb3Jtcy4gcGFy
c2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIgd2lsbAorICAgIC8vIHJldHVybiAwIGlm
IHRoYXQgYXNzdW1wdGlvbiBpcyBpbmNvcnJlY3QuCisgICAgaWYgKHZhbHVlcy0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygwKS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQorICAgICAgICBy
ZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsK
KworICAgIC8vIFdlIGNhbiBoYXZlIG9ubHkgYXJyYXlzIG9mIGJvb2xlYW5zIG9yIG51bWJlcnMs
IHNvIHVzZSB0aGUgZmlyc3QgdmFsdWUgdG8gY2hvb3NlIGJldHdlZW4gdGhvc2UgdHdvLgorICAg
IC8vIFdlIG5lZWQgdXAgdG8gNCB2YWx1ZXMgKGFsbCBib29sZWFucyBvciBhbGwgbnVtYmVycyku
CisgICAgaWYgKCF2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZl
VmFsdWUoKSB8fCB2YWx1ZXMtPmxlbmd0aCgpID4gNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
CisgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0UHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7
CisgICAgaWYgKGZpcnN0UHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmlt
aXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVy
TnVtYmVyUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7CisKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50
IHRoZSBib29sZWFuIGFycmF5IHBhcmFtZXRlciBoZXJlLgorICAgIC8vIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQzOAorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jv
b2wgU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVl
KiBwYXJhbWV0ZXJzVmFsdWUsIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmIHBhcmFtZXRlckxp
c3QpCit7CisgICAgSGFzaFNldDxTdHJpbmc+IGtub3duUGFyYW1ldGVyTmFtZXM7CisgICAgQ1NT
VmFsdWVMaXN0SXRlcmF0b3IgcGFyYW1ldGVySXRlcmF0b3IocGFyYW1ldGVyc1ZhbHVlKTsKKyAg
ICBmb3IgKDsgcGFyYW1ldGVySXRlcmF0b3IuaGFzTW9yZSgpOyBwYXJhbWV0ZXJJdGVyYXRvci5h
ZHZhbmNlKCkpIHsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpLT5pc1Zh
bHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBDU1NWYWx1ZUxp
c3RJdGVyYXRvciBpdGVyYXRvcihwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAg
aWYgKCFpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1Nf
U1RSSU5HKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAgU3Ry
aW5nIG5hbWUgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgLy8g
RG8gbm90IGFsbG93IGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMuCisgICAgICAgIGlmIChrbm93
blBhcmFtZXRlck5hbWVzLmNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBrbm93blBhcmFtZXRlck5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgCisgICAg
ICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghaXRlcmF0b3Iu
aGFzTW9yZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAgICAg
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyYW1ldGVyID0gcGFyc2VDdXN0b21GaWx0
ZXJQYXJhbWV0ZXIobmFtZSwgaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmICghcGFyYW1l
dGVyKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBwYXJhbWV0ZXJMaXN0LmFw
cGVuZChwYXJhbWV0ZXIucmVsZWFzZSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gTWFrZSBzdXJl
IHdlIHNvcnQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHBhc3NpbmcgdGhlbSBkb3duIHRvIHRoZSBD
dXN0b21GaWx0ZXJPcGVyYXRpb24uCisgICAgc3RkOjpzb3J0KHBhcmFtZXRlckxpc3QuYmVnaW4o
KSwgcGFyYW1ldGVyTGlzdC5lbmQoKSwgc29ydFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKTsK
KyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVy
YXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1
bGVSZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQorewor
ICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgc3R5bGUgcmVzb2x1dGlvbiBmb3IgdGhlIGN1c3RvbSBm
aWx0ZXIgYXQtcnVsZSByZWZlcmVuY2Ugc3ludGF4LgorICAgIFVOVVNFRF9QQVJBTShmaWx0ZXJW
YWx1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5l
U3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICBDU1NWYWx1
ZSogc2hhZGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7
CisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2hhZGVyc1ZhbHVlLT5pc1Zh
bHVlTGlzdCgpKTsKKyAgICBDU1NWYWx1ZUxpc3QqIHNoYWRlcnNMaXN0ID0gc3RhdGljX2Nhc3Q8
Q1NTVmFsdWVMaXN0Kj4oc2hhZGVyc1ZhbHVlKTsKKworICAgIHVuc2lnbmVkIHNoYWRlcnNMaXN0
TGVuZ3RoID0gc2hhZGVyc0xpc3QtPmxlbmd0aCgpOworICAgIEFTU0VSVChzaGFkZXJzTGlzdExl
bmd0aCk7CisKKyAgICBSZWZQdHI8U3R5bGVTaGFkZXI+IHZlcnRleFNoYWRlciA9IHN0eWxlU2hh
ZGVyKHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKyAgICBSZWZQdHI8
U3R5bGVTaGFkZXI+IGZyYWdtZW50U2hhZGVyOworICAgIEN1c3RvbUZpbHRlclByb2dyYW1UeXBl
IHByb2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX0JMRU5EU19FTEVNRU5UX1RFWFRVUkU7CisgICAg
Q3VzdG9tRmlsdGVyUHJvZ3JhbU1peFNldHRpbmdzIG1peFNldHRpbmdzOworCisgICAgaWYgKHNo
YWRlcnNMaXN0TGVuZ3RoID4gMSkgeworICAgICAgICBDU1NWYWx1ZSogZnJhZ21lbnRTaGFkZXJP
ck1peEZ1bmN0aW9uID0gc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7CisK
KyAgICAgICAgaWYgKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbi0+aXNXZWJLaXRDU1NNaXhG
dW5jdGlvblZhbHVlKCkpIHsKKyAgICAgICAgICAgIFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUq
IG1peEZ1bmN0aW9uID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSo+KGZy
YWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7CisgICAgICAgICAgICBDU1NWYWx1ZUxpc3RJdGVy
YXRvciBpdGVyYXRvcihtaXhGdW5jdGlvbik7CisKKyAgICAgICAgICAgIEFTU0VSVChtaXhGdW5j
dGlvbi0+bGVuZ3RoKCkpOworICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRl
cihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKwor
ICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSA8PSAzKTsKKyAgICAgICAg
ICAgIHdoaWxlIChpdGVyYXRvci5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmIChDU1NQYXJzZXI6Omlz
QmxlbmRNb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAgICAgICAgICAgICAg
ICAgbWl4U2V0dGluZ3MuYmxlbmRNb2RlID0gKnByaW1pdGl2ZVZhbHVlOworICAgICAgICAgICAg
ICAgIGVsc2UgaWYgKENTU1BhcnNlcjo6aXNDb21wb3NpdGVPcGVyYXRvcihwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSkpCisgICAgICAgICAgICAgICAgICAgIG1peFNldHRpbmdzLmNvbXBvc2l0
ZU9wZXJhdG9yID0gKnByaW1pdGl2ZVZhbHVlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICAgICAgaXRl
cmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfTk9fRUxFTUVOVF9URVhUVVJFOworICAg
ICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihmcmFnbWVudFNoYWRlck9yTWl4
RnVuY3Rpb24pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHVuc2lnbmVkIG1lc2hSb3dz
ID0gMTsKKyAgICB1bnNpZ25lZCBtZXNoQ29sdW1ucyA9IDE7CisgICAgQ3VzdG9tRmlsdGVyTWVz
aFR5cGUgbWVzaFR5cGUgPSBNZXNoVHlwZUF0dGFjaGVkOworICAgIAorICAgIENTU1ZhbHVlKiBw
YXJhbWV0ZXJzVmFsdWUgPSAwOworICAgIAorICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkg
PiAxKSB7CisgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKGZpbHRlclZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBz
ZWNvbmQgdmFsdWUgbWlnaHQgYmUgdGhlIG1lc2ggYm94IG9yIHRoZSBsaXN0IG9mIHBhcmFtZXRl
cnM6CisgICAgICAgIC8vIElmIGl0IHN0YXJ0cyB3aXRoIGEgbnVtYmVyIG9yIGFueSBvZiB0aGUg
bWVzaC1ib3ggaWRlbnRpZmllcnMgaXQgaXMgCisgICAgICAgIC8vIHRoZSBtZXNoLWJveCBsaXN0
LCBpZiBub3QgaXQgbWVhbnMgaXQgaXMgdGhlIHBhcmFtZXRlcnMgbGlzdC4KKworICAgICAgICBp
ZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgewor
ICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIG9u
bHkgb25lIGludGVnZXIgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHNldCBib3RoCisgICAg
ICAgICAgICAgICAgLy8gdGhlIHJvd3MgYW5kIHRoZSBjb2x1bW5zLgorICAgICAgICAgICAgICAg
IG1lc2hDb2x1bW5zID0gbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsK
KyAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGFub3RoZXIgbnVtYmVyIGZvciB0aGUgcm93
cy4KKyAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlz
UHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1
ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJh
dG9yLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlz
TnVtYmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc2hSb3dzID0gcHJpbWl0aXZl
VmFsdWUtPmdldEludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5h
ZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChpdGVyYXRvci5oYXNN
b3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlRGV0YWNoZWQpIHsKKyAgICAgICAgICAgICAgICBtZXNo
VHlwZSA9IE1lc2hUeXBlRGV0YWNoZWQ7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5j
ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWl0
ZXJhdG9yLmluZGV4KCkpIHsKKyAgICAgICAgICAgIC8vIElmIG5vIHZhbHVlIHdhcyBjb25zdW1l
ZCBmcm9tIHRoZSBtZXNoIHZhbHVlLCB0aGVuIGl0IGlzIGp1c3QgYSBwYXJhbWV0ZXIgbGlzdCwg
bWVhbmluZyB0aGF0IHdlIGVuZCB1cAorICAgICAgICAgICAgLy8gaGF2aW5nIGp1c3QgdHdvIENT
U0xpc3RWYWx1ZXM6IGxpc3Qgb2Ygc2hhZGVycyBhbmQgbGlzdCBvZiBwYXJhbWV0ZXJzLgorICAg
ICAgICAgICAgQVNTRVJUKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAyKTsKKyAgICAgICAgICAg
IHBhcmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEp
OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkg
PiAyICYmICFwYXJhbWV0ZXJzVmFsdWUpCisgICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IGZpbHRl
clZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpOworICAgIAorICAgIEN1c3RvbUZpbHRl
clBhcmFtZXRlckxpc3QgcGFyYW1ldGVyTGlzdDsKKyAgICBpZiAocGFyYW1ldGVyc1ZhbHVlICYm
ICFwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QocGFyYW1ldGVyc1ZhbHVlLCBwYXJhbWV0
ZXJMaXN0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgUmVmUHRyPFN0eWxlQ3VzdG9t
RmlsdGVyUHJvZ3JhbT4gcHJvZ3JhbSA9IFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbTo6Y3JlYXRl
KHZlcnRleFNoYWRlci5yZWxlYXNlKCksIGZyYWdtZW50U2hhZGVyLnJlbGVhc2UoKSwgcHJvZ3Jh
bVR5cGUsIG1peFNldHRpbmdzLCBtZXNoVHlwZSk7CisgICAgcmV0dXJuIEN1c3RvbUZpbHRlck9w
ZXJhdGlvbjo6Y3JlYXRlKHByb2dyYW0ucmVsZWFzZSgpLCBwYXJhbWV0ZXJMaXN0LCBtZXNoUm93
cywgbWVzaENvbHVtbnMsIG1lc2hUeXBlKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJP
cGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCit7CisgICAgQVNTRVJUKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSk7CisgICAgYm9vbCBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA9IGZpbHRlclZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVlKCk7CisgICAg
cmV0dXJuIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID8gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChmaWx0ZXJWYWx1ZSkgOiBjcmVhdGVDdXN0b21G
aWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KGZpbHRlclZhbHVlKTsKK30KKworI2VuZGlm
CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NWYWx1ZSog
aW5WYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0
ZXJPcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKQoreworICAgIEFTU0VSVChvdXRPcGVyYXRpb25z
LmlzRW1wdHkoKSk7CisgICAgCisgICAgaWYgKCFpblZhbHVlKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgCisgICAgaWYgKGluVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KGluVmFsdWUpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIAorICAgIGlmICghaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpv
b20oKSA6IDE7CisgICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGZvciAoQ1NT
VmFsdWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkg
eworICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICBpZiAo
IWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NGaWx0ZXJWYWx1ZSgpKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlID0gc3RhdGlj
X2Nhc3Q8V2ViS2l0Q1NTRmlsdGVyVmFsdWUqPihpLnZhbHVlKCkpOworICAgICAgICBGaWx0ZXJP
cGVyYXRpb246Ok9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9IGZpbHRlck9wZXJhdGlvbkZv
clR5cGUoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX1NI
QURFUlMpCisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6VkFM
SURBVEVEX0NVU1RPTSkgeworICAgICAgICAgICAgLy8gVmFsaWRhdGVkQ3VzdG9tRmlsdGVyT3Bl
cmF0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBlbmQgdXAgaW4gdGhlIFJlbmRlclN0eWxlLgorICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgfQorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OkNV
U1RPTSkgeworICAgICAgICAgICAgUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0
aW9uID0gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKGZpbHRlclZhbHVlKTsKKyAgICAgICAg
ICAgIGlmICghb3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJh
dGlvbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAg
IGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7CisjaWYg
RU5BQkxFKFNWRykKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBhcmd1bWVu
dCA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworCisgICAgICAgICAg
ICBpZiAoIWFyZ3VtZW50LT5pc1dlYktpdENTU1NWR0RvY3VtZW50VmFsdWUoKSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1
ZSogc3ZnRG9jdW1lbnRWYWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1NWR0RvY3VtZW50VmFs
dWUqPihhcmd1bWVudCk7CisgICAgICAgICAgICBLVVJMIHVybCA9IG1fc3RhdGUuZG9jdW1lbnQo
KS0+Y29tcGxldGVVUkwoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCkpOworCisgICAgICAgICAgICBS
ZWZQdHI8UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBSZWZlcmVuY2VGaWx0
ZXJPcGVyYXRpb246OmNyZWF0ZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgdXJsLmZyYWdtZW50
SWRlbnRpZmllcigpLCBvcGVyYXRpb25UeXBlKTsKKyAgICAgICAgICAgIGlmIChTVkdVUklSZWZl
cmVuY2U6OmlzRXh0ZXJuYWxVUklSZWZlcmVuY2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIG1f
c3RhdGUuZG9jdW1lbnQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN2Z0RvY3VtZW50VmFs
dWUtPmxvYWRSZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZS5wZW5kaW5n
U1ZHRG9jdW1lbnRzKCkuc2V0KG9wZXJhdGlvbi5nZXQoKSwgc3ZnRG9jdW1lbnRWYWx1ZSk7Cisg
ICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1l
bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLT5zZXRDYWNoZWRTVkdEb2N1bWVu
dFJlZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2Uoc3ZnRG9j
dW1lbnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24pOworI2VuZGlm
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRo
YXQgYWxsIHBhcmFtZXRlcnMgYXJlIHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggdGhlCisgICAgICAg
IC8vIGV4Y2VwdGlvbiBvZiBkcm9wIHNoYWRvdyB3aGljaCBoYXMgYSBTaGFkb3dWYWx1ZSBwYXJh
bWV0ZXIuCisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlICE9IEZpbHRlck9wZXJhdGlvbjo6RFJP
UF9TSEFET1cpIHsKKyAgICAgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFs
c2U7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgZmlsdGVyVmFsdWUtPmxl
bmd0aCgpOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYg
KGhhdmVOb25QcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgfQorCisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0gZmlsdGVyVmFs
dWUtPmxlbmd0aCgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmaWx0ZXJWYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSkgOiAwOworICAgICAgICBzd2l0Y2ggKGZpbHRl
clZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6R3JheXNjYWxlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJs
ZSBhbW91bnQgPSAxOworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAx
KSB7CisgICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUo
KTsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNQZXJjZW50YWdlKCkpCisgICAg
ICAgICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVy
T3BlcmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpIdWVS
b3RhdGVGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IDA7Cisg
ICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpCisgICAgICAgICAgICAg
ICAgYW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworCisgICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJh
dGlvbjo6Y3JlYXRlKGFuZ2xlLCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0
ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5l
c3NGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkNv
bnRyYXN0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVl
OjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW1vdW50ID0g
KGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJy
aWdodG5lc3NGaWx0ZXJPcGVyYXRpb24pID8gMCA6IDE7CisgICAgICAgICAgICBpZiAoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5p
c1BlcmNlbnRhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKKyAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJh
c2ljQ29tcG9uZW50VHJhbnNmZXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJh
dGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAg
IExlbmd0aCBzdGREZXZpYXRpb24gPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgaWYg
KGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+PSAxKQorICAgICAgICAgICAgICAgIHN0ZERldmlhdGlv
biA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgaWYgKHN0ZERldmlhdGlvbi5pc1VuZGVmaW5lZCgpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKEJsdXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShzdGREZXZpYXRp
b24sIG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246
IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIENTU1ZhbHVlKiBjc3NWYWx1ZSA9
IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworICAgICAgICAgICAgaWYg
KCFjc3NWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVl
Kj4oY3NzVmFsdWUpOworICAgICAgICAgICAgSW50UG9pbnQgbG9jYXRpb24oaXRlbS0+eC0+Y29t
cHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCBy
b290U3R5bGUsIHpvb21GYWN0b3IpKTsKKyAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1
ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29t
RmFjdG9yKSA6IDA7CisgICAgICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgIGlmIChp
dGVtLT5jb2xvcikKKyAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZh
bHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKERyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShsb2NhdGlvbiwg
Ymx1ciwgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQsIG9wZXJh
dGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0T3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+
IFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqIHBlbmRp
bmdJbWFnZSkKK3sKKyAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2Fk
ZXIgPSBtX3N0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisKKyAgICBp
ZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VWYWx1
ZSogaW1hZ2VWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpOworICAgICAgICBy
ZXR1cm4gaW1hZ2VWYWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAg
IH0KKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewor
ICAgICAgICBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiBpbWFnZUdlbmVyYXRvclZhbHVlID0gcGVu
ZGluZ0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCk7CisgICAgICAgIGltYWdlR2VuZXJh
dG9yVmFsdWUtPmxvYWRTdWJpbWFnZXMoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgICAgICBy
ZXR1cm4gU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKGltYWdlR2VuZXJhdG9yVmFsdWUpOwor
ICAgIH0KKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKSkgewor
ICAgICAgICBDU1NDdXJzb3JJbWFnZVZhbHVlKiBjdXJzb3JJbWFnZVZhbHVlID0gcGVuZGluZ0lt
YWdlLT5jc3NDdXJzb3JJbWFnZVZhbHVlKCk7CisgICAgICAgIHJldHVybiBjdXJzb3JJbWFnZVZh
bHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgfQorCisjaWYgRU5B
QkxFKENTU19JTUFHRV9TRVQpCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1
ZSgpKSB7CisgICAgICAgIENTU0ltYWdlU2V0VmFsdWUqIGltYWdlU2V0VmFsdWUgPSBwZW5kaW5n
SW1hZ2UtPmNzc0ltYWdlU2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGltYWdlU2V0VmFsdWUt
PmNhY2hlZEltYWdlU2V0KGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9CisjZW5kaWYKKwor
ICAgIHJldHVybiAwOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2Vz
KCkKK3sKKyAgICBpZiAobV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3Rf
aXRlcmF0b3I6OktleXMgZW5kID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuZW5k
KCkua2V5cygpOworICAgIGZvciAoUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0X2l0ZXJh
dG9yOjpLZXlzIGl0ID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuYmVnaW4oKS5r
ZXlzKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBDU1NQcm9wZXJ0eUlEIGN1cnJlbnRQ
cm9wZXJ0eSA9ICppdDsKKworICAgICAgICBzd2l0Y2ggKGN1cnJlbnRQcm9wZXJ0eSkgeworICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOiB7CisgICAgICAgICAgICBmb3Ig
KEZpbGxMYXllciogYmFja2dyb3VuZExheWVyID0gbV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NCYWNr
Z3JvdW5kTGF5ZXJzKCk7IGJhY2tncm91bmRMYXllcjsgYmFja2dyb3VuZExheWVyID0gYmFja2dy
b3VuZExheWVyLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZExheWVy
LT5pbWFnZSgpICYmIGJhY2tncm91bmRMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkK
KyAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZExheWVyLT5zZXRJbWFnZShsb2FkUGVuZGlu
Z0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oYmFja2dyb3VuZExheWVyLT5p
bWFnZSgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6IHsKKyAgICAgICAgICAgIGZvciAoQ29u
dGVudERhdGEqIGNvbnRlbnREYXRhID0gY29uc3RfY2FzdDxDb250ZW50RGF0YSo+KG1fc3RhdGUu
c3R5bGUoKS0+Y29udGVudERhdGEoKSk7IGNvbnRlbnREYXRhOyBjb250ZW50RGF0YSA9IGNvbnRl
bnREYXRhLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudERhdGEtPmlzSW1h
Z2UoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHlsZUltYWdlKiBpbWFnZSA9IHN0YXRpY19j
YXN0PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPmltYWdlKCk7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGltYWdlKSk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAobG9hZGVkSW1hZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+c2V0SW1hZ2UobG9h
ZGVkSW1hZ2UucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGNhc2UgQ1NTUHJvcGVydHlDdXJzb3I6IHsKKyAgICAgICAgICAgIGlmIChDdXJzb3JMaXN0
KiBjdXJzb3JMaXN0ID0gbV9zdGF0ZS5zdHlsZSgpLT5jdXJzb3JzKCkpIHsKKyAgICAgICAgICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGN1cnNvckxpc3QtPnNpemUoKTsgKytpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIEN1cnNvckRhdGEmIGN1cnJlbnRDdXJzb3IgPSBjdXJzb3JMaXN0
LT5hdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0eWxlSW1hZ2UqIGltYWdlID0gY3Vy
cmVudEN1cnNvci5pbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2Ut
PmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN1
cnNvci5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0lt
YWdlKj4oaW1hZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRl
LnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJ
bWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUo
KS0+c2V0TGlzdFN0eWxlSW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBl
bmRpbmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSkpKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJ
bWFnZVNvdXJjZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1h
Z2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCktPmlzUGVu
ZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRCb3JkZXJJ
bWFnZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdl
Kj4obV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpKSkpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxl
Y3Q6IHsKKyAgICAgICAgICAgIGlmIChTdHlsZVJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtX3N0
YXRlLnN0eWxlKCktPmJveFJlZmxlY3QoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IE5pbmVQ
aWVjZUltYWdlJiBtYXNrSW1hZ2UgPSByZWZsZWN0aW9uLT5tYXNrKCk7CisgICAgICAgICAgICAg
ICAgaWYgKG1hc2tJbWFnZS5pbWFnZSgpICYmIG1hc2tJbWFnZS5pbWFnZSgpLT5pc1BlbmRpbmdJ
bWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJ
bWFnZSA9IGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPiht
YXNrSW1hZ2UuaW1hZ2UoKSkpOworICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRN
YXNrKE5pbmVQaWVjZUltYWdlKGxvYWRlZEltYWdlLnJlbGVhc2UoKSwgbWFza0ltYWdlLmltYWdl
U2xpY2VzKCksIG1hc2tJbWFnZS5maWxsKCksIG1hc2tJbWFnZS5ib3JkZXJTbGljZXMoKSwgbWFz
a0ltYWdlLm91dHNldCgpLCBtYXNrSW1hZ2UuaG9yaXpvbnRhbFJ1bGUoKSwgbWFza0ltYWdlLnZl
cnRpY2FsUnVsZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tCb3hJbWFnZVNvdXJjZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bWFz
a0JveEltYWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2Uo
KS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNl
dE1hc2tCb3hJbWFnZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVu
ZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSkpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrSW1hZ2U6IHsKKyAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBtYXNrTGF5ZXIgPSBt
X3N0YXRlLnN0eWxlKCktPmFjY2Vzc01hc2tMYXllcnMoKTsgbWFza0xheWVyOyBtYXNrTGF5ZXIg
PSBtYXNrTGF5ZXItPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChtYXNrTGF5ZXItPmlt
YWdlKCkgJiYgbWFza0xheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAg
ICAgICAgICAgICBtYXNrTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nh
c3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNrTGF5ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAg
ICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBt
X3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5jbGVhcigpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmxvYWRQZW5kaW5nUmVzb3VyY2VzKCkKK3sKKyAgICAvLyBTdGFydCBsb2FkaW5n
IGltYWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdJbWFnZXMo
KTsKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAvLyBTdGFydCBsb2FkaW5nIHRoZSBz
aGFkZXJzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1NoYWRlcnMo
KTsKKyNlbmRpZgorICAgIAorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykK
KyAgICAvLyBTdGFydCBsb2FkaW5nIHRoZSBTVkcgRG9jdW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhp
cyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOworI2VuZGlmCit9CisKK2lu
bGluZSBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6TWF0Y2hlZFByb3BlcnRpZXMo
KQorICAgIDogcG9zc2libHlQYWRkZWRNZW1iZXIoMCkKK3sKK30KKworaW5saW5lIFN0eWxlUmVz
b2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjp+TWF0Y2hlZFByb3BlcnRpZXMoKQoreworfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpyZXBvcnRNZW1vcnlVc2FnZShN
ZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNs
YXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6
Q1NTKTsKKyAgICBpbmZvLmFkZE1lbWJlcihwcm9wZXJ0aWVzLCAicHJvcGVydGllcyIpOworfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtOjpyZXBvcnRN
ZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAorewor
ICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVN
ZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtYXRjaGVkUHJvcGVydGllcywg
Im1hdGNoZWRQcm9wZXJ0aWVzIik7CisgICAgaW5mby5hZGRNZW1iZXIocmFuZ2VzLCAicmFuZ2Vz
Iik7CisgICAgaW5mby5hZGRNZW1iZXIocmVuZGVyU3R5bGUsICJyZW5kZXJTdHlsZSIpOworICAg
IGluZm8uYWRkTWVtYmVyKHBhcmVudFJlbmRlclN0eWxlLCAicGFyZW50UmVuZGVyU3R5bGUiKTsK
K30KKwordm9pZCBNZWRpYVF1ZXJ5UmVzdWx0OjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmpl
Y3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNzSW5mbyBp
bmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKKyAg
ICBpbmZvLmFkZE1lbWJlcihtX2V4cHJlc3Npb24sICJleHByZXNzaW9uIik7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5
T2JqZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmpl
Y3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1i
ZXIobV9ydWxlU2V0cywgInJ1bGVTZXRzIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9rZXlmcmFt
ZXNSdWxlTWFwLCAia2V5ZnJhbWVzUnVsZU1hcCIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZSwgIm1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUiKTsKKyAgICBpbmZv
LmFkZE1lbWJlcihtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLCAibWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fbWVkaXVt
LCAibWVkaXVtIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9yb290RGVmYXVsdFN0eWxlLCAicm9v
dERlZmF1bHRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZG9jdW1lbnQsICJkb2N1bWVu
dCIpOworCisgICAgaW5mby5hZGRNZW1iZXIobV9mb250U2VsZWN0b3IsICJmb250U2VsZWN0b3Ii
KTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3Vs
dHMsICJ2aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzIik7CisgICAgaW5mby5pZ25v
cmVNZW1iZXIobV9zdHlsZUJ1aWxkZXIpOworICAgIGluZm8uYWRkTWVtYmVyKG1faW5zcGVjdG9y
Q1NTT01XcmFwcGVycyk7CisgICAgaW5mby5hZGRNZW1iZXIobV9zY29wZVJlc29sdmVyLCAic2Nv
cGVSZXNvbHZlciIpOworCisgICAgaW5mby5hZGRNZW1iZXIobV9zdGF0ZSwgInN0YXRlIik7CisK
KyAgICAvLyBGSVhNRTogbW92ZSB0aGlzIHRvIGEgcGxhY2Ugd2hlcmUgaXQgd291bGQgYmUgY2Fs
bGVkIG9ubHkgb25jZT8KKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6
OmRlZmF1bHRTdHlsZSwgImRlZmF1bHRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENTU0Rl
ZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlLCAiZGVmYXVsdFF1aXJrc1N0eWxl
Iik7CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJp
bnRTdHlsZSwiZGVmYXVsdFByaW50U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OmRlZmF1bHRWaWV3U291cmNlU3R5bGUsICJkZWZhdWx0Vmlld1NvdXJj
ZVN0eWxlIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAkocmV2aXNpb24gMTQ1MTgxKQorKysg
U291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjcsMTg5ICsyNywyNiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNs
dWRlICJTdHlsZVJlc29sdmVyLmgiCisjaW5jbHVkZSAiRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCIK
IAotI2luY2x1ZGUgIkF0dHJpYnV0ZS5oIgotI2luY2x1ZGUgIkNTU0JvcmRlckltYWdlLmgiCi0j
aW5jbHVkZSAiQ1NTQ2FsY3VsYXRpb25WYWx1ZS5oIgotI2luY2x1ZGUgIkNTU0N1cnNvckltYWdl
VmFsdWUuaCIKICNpbmNsdWRlICJDU1NEZWZhdWx0U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJD
U1NGb250RmFjZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NGb250U2VsZWN0b3IuaCIKLSNpbmNsdWRl
ICJDU1NMaW5lQm94Q29udGFpblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NTUGFnZVJ1bGUuaCIKLSNp
bmNsdWRlICJDU1NQYXJzZXIuaCIKLSNpbmNsdWRlICJDU1NQcmltaXRpdmVWYWx1ZU1hcHBpbmdz
LmgiCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgotI2luY2x1ZGUgIkNTU1JlZmxlY3RW
YWx1ZS5oIgorI2luY2x1ZGUgIkNTU1J1bGUuaCIKKyNpbmNsdWRlICJDU1NSdWxlTGlzdC5oIgog
I2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCiAjaW5jbHVkZSAiQ1NTU2VsZWN0b3JMaXN0LmgiCi0j
aW5jbHVkZSAiQ1NTU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTU3VwcG9ydHNSdWxlLmgiCi0j
aW5jbHVkZSAiQ1NTVGltaW5nRnVuY3Rpb25WYWx1ZS5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlTGlz
dC5oIgotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotI2luY2x1ZGUgIkNTU1ZhcmlhYmxlVmFs
dWUuaCIKLSNlbmRpZgotI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCi0jaW5jbHVkZSAiQ2FsY3Vs
YXRpb25WYWx1ZS5oIgotI2luY2x1ZGUgIkNvbnRlbnREYXRhLmgiCi0jaW5jbHVkZSAiQ29udGV4
dEZlYXR1cmVzLmgiCi0jaW5jbHVkZSAiQ291bnRlci5oIgotI2luY2x1ZGUgIkNvdW50ZXJDb250
ZW50LmgiCi0jaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgotI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJFbGVtZW50U2hhZG93LmgiCi0jaW5jbHVkZSAi
Rm9udEZlYXR1cmVWYWx1ZS5oIgotI2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgotI2luY2x1ZGUgIkZy
YW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVTZWxlY3Rpb24uaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcu
aCIKLSNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSUZyYW1lRWxlbWVu
dC5oIgotI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZXMu
aCIKLSNpbmNsdWRlICJIVE1MT3B0aW9uRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxQcm9ncmVz
c0VsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MU3R5bGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRN
TFRleHRBcmVhRWxlbWVudC5oIgotI2luY2x1ZGUgIkluc2VydGlvblBvaW50LmgiCi0jaW5jbHVk
ZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVkZSAiS2V5ZnJhbWVMaXN0Lmgi
Ci0jaW5jbHVkZSAiTGlua0hhc2guaCIKLSNpbmNsdWRlICJMb2NhbGVUb1NjcmlwdE1hcHBpbmcu
aCIKLSNpbmNsdWRlICJNYXRoTUxOYW1lcy5oIgotI2luY2x1ZGUgIk1hdHJpeDNEVHJhbnNmb3Jt
T3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5j
bHVkZSAiTWVkaWFMaXN0LmgiCi0jaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgotI2lu
Y2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgotI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0
LmgiCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlBhaXIuaCIKLSNpbmNsdWRlICJQZXJz
cGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlF1b3Rlc0RhdGEuaCIKLSNp
bmNsdWRlICJSZWN0LmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUg
IkhUTUxFbGVtZW50LmgiCiAjaW5jbHVkZSAiUmVuZGVyUmVnaW9uLmgiCi0jaW5jbHVkZSAiUmVu
ZGVyU2Nyb2xsYmFyLmgiCi0jaW5jbHVkZSAiUmVuZGVyU2Nyb2xsYmFyVGhlbWUuaCIKLSNpbmNs
dWRlICJSZW5kZXJTdHlsZUNvbnN0YW50cy5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCi0j
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUgIlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bi5oIgotI2luY2x1ZGUgIlJ1bGVTZXQuaCIKLSNpbmNsdWRlICJTVkdEb2N1bWVudEV4dGVuc2lv
bnMuaCIKLSNpbmNsdWRlICJTVkdGb250RmFjZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJTY2FsZVRy
YW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVk
ZSAiU1ZHRWxlbWVudC5oIgogI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLmgiCi0j
aW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCi0jaW5jbHVkZSAi
U2hhZG93Um9vdC5oIgotI2luY2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCiAjaW5jbHVkZSAiU2libGlu
Z1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKLSNpbmNsdWRlICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9u
LmgiCi0jaW5jbHVkZSAiU3R5bGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFn
ZS5oIgotI2luY2x1ZGUgIlN0eWxlR2VuZXJhdGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJTdHlsZVBl
bmRpbmdJbWFnZS5oIgogI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTZXQuaCIKLSNpbmNsdWRlICJT
dHlsZVByb3BlcnR5U2hvcnRoYW5kLmgiCi0jaW5jbHVkZSAiU3R5bGVSdWxlLmgiCi0jaW5jbHVk
ZSAiU3R5bGVSdWxlSW1wb3J0LmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCi0j
aW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAi
VHJhbnNmb3JtYXRpb25NYXRyaXguaCIKLSNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVy
YXRpb24uaCIKLSNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIlZp
ZXdwb3J0U3R5bGVSZXNvbHZlci5oIgotI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKLSNp
bmNsdWRlICJXZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVkZSAiV2ViS2l0
Q1NTS2V5ZnJhbWVSdWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgot
I2luY2x1ZGUgIldlYktpdENTU1JlZ2lvblJ1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZS5oIgotI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgotI2luY2x1
ZGUgIlhNTE5hbWVzLmgiCi0jaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hN
YXAuaD4KLSNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgotI2lu
Y2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYv
U3RkTGliRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotCi0jaWYgRU5BQkxFKENT
U19GSUxURVJTKQotI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIldlYktp
dENTU0ZpbHRlclZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9S
VCkKLSNpbmNsdWRlICJEYXNoYm9hcmRSZWdpb24uaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFNW
RykKLSNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hlZFNWR0Rv
Y3VtZW50UmVmZXJlbmNlLmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJT
VkdFbGVtZW50LmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdVUklSZWZl
cmVuY2UuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCi0jZW5kaWYK
LQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBh
cmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgotI2luY2x1ZGUg
IkN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9w
ZXJhdGlvbi5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgotI2luY2x1ZGUg
IkN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlci5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVk
U2hhZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCi0jaW5jbHVk
ZSAiU3R5bGVQZW5kaW5nU2hhZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKLSNpbmNs
dWRlICJXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU2hh
ZGVyVmFsdWUuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0jaW5jbHVk
ZSAiQ1NTSW1hZ2VTZXRWYWx1ZS5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIK
LSNlbmRpZgotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotI2luY2x1ZGUgIldlYlZUVEVsZW1l
bnQuaCIKLSNlbmRpZgorI2luY2x1ZGUgIlN0eWxlZEVsZW1lbnQuaCIKIAotdXNpbmcgbmFtZXNw
YWNlIHN0ZDsKLQotbmFtZXNwYWNlIFdURiB7Ci0KLXRlbXBsYXRlPD4gc3RydWN0IFNlcXVlbmNl
TWVtb3J5SW5zdHJ1bWVudGF0aW9uVHJhaXRzPGNvbnN0IFdlYkNvcmU6OlJ1bGVEYXRhKj4gewot
ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJPiBzdGF0aWMgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShJ
LCBJLCBNZW1vcnlDbGFzc0luZm8mKSB7IH0KLX07Ci0KLX0KKyNpbmNsdWRlIDx3dGYvVGVtcG9y
YXJ5Q2hhbmdlLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEhU
TUxOYW1lczsKLQotI2RlZmluZSBIQU5ETEVfSU5IRVJJVChwcm9wLCBQcm9wKSBcCi1pZiAoaXNJ
bmhlcml0KSB7IFwKLSAgICBtX3N0YXRlLnN0eWxlKCktPnNldCMjUHJvcChtX3N0YXRlLnBhcmVu
dFN0eWxlKCktPnByb3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotI2RlZmluZSBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTChwcm9wLCBQcm9wKSBcCi1IQU5ETEVfSU5IRVJJVChwcm9wLCBQ
cm9wKSBcCi1pZiAoaXNJbml0aWFsKSB7IFwKLSAgICBtX3N0YXRlLnN0eWxlKCktPnNldCMjUHJv
cChSZW5kZXJTdHlsZTo6aW5pdGlhbCMjUHJvcCgpKTsgXAotICAgIHJldHVybjsgXAotfQotCi1S
ZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6c19zdHlsZU5vdFlldEF2YWlsYWJsZTsKLQogc3Rh
dGljIFN0eWxlUHJvcGVydHlTZXQqIGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKQogewogICAgIERF
RklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCBsZWZ0VG9SaWdodERl
Y2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKSkpOwpAQCAtMjI2LDIwNSArNjMsNDkgQEAg
c3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIHJpZ2h0VG9MZWZ0RGVjbAogICAgIHJldHVybiByaWdo
dFRvTGVmdERlY2wuZ2V0KCk7CiB9CiAKLQotaW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHls
ZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVsZUxpc3QoKQotewotICAgIGlmICghbV9ydWxlTGlz
dCkKLSAgICAgICAgbV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKLSAg
ICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZl
cjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpCi17Ci0gICAgbV9oYXNVQUFwcGVh
cmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJhbmNlKCk7Ci0gICAgaWYgKG1faGFzVUFBcHBlYXJh
bmNlKSB7Ci0gICAgICAgIG1fYm9yZGVyRGF0YSA9IG1fc3R5bGUtPmJvcmRlcigpOwotICAgICAg
ICBtX2JhY2tncm91bmREYXRhID0gKm1fc3R5bGUtPmJhY2tncm91bmRMYXllcnMoKTsKLSAgICAg
ICAgbV9iYWNrZ3JvdW5kQ29sb3IgPSBtX3N0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKLSAgICB9
Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigpCi17Ci0gICAg
bV9lbGVtZW50ID0gMDsKLSAgICBtX3N0eWxlZEVsZW1lbnQgPSAwOwotICAgIG1fcGFyZW50U3R5
bGUgPSAwOwotICAgIG1fcGFyZW50Tm9kZSA9IDA7Ci0gICAgbV9yZWdpb25Gb3JTdHlsaW5nID0g
MDsKLSAgICBtX3J1bGVMaXN0ID0gMDsKLSAgICBtX21hdGNoZWRSdWxlcy5jbGVhcigpOwotICAg
IG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwotI2lmIEVOQUJMRShDU1NfU0hBREVS
UykKLSAgICBtX2hhc1BlbmRpbmdTaGFkZXJzID0gZmFsc2U7Ci0jZW5kaWYKLSNpZiBFTkFCTEUo
Q1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCi0gICAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzLmNs
ZWFyKCk7Ci0jZW5kaWYKLX0KLQotU3R5bGVSZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVu
dCogZG9jdW1lbnQsIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgIDogbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAoMCkKLSAgICAsIG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3ZWVw
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZSkKLSAgICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCi0gICAg
LCBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyhtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0g
ICAgLCBtX2ZvbnRTZWxlY3RvcihDU1NGb250U2VsZWN0b3I6OmNyZWF0ZShkb2N1bWVudCkpCi0j
aWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICAsIG1fdmlld3BvcnRTdHlsZVJl
c29sdmVyKFZpZXdwb3J0U3R5bGVSZXNvbHZlcjo6Y3JlYXRlKGRvY3VtZW50KSkKLSNlbmRpZgot
ICAgICwgbV9zdHlsZUJ1aWxkZXIoU3R5bGVCdWlsZGVyOjpzaGFyZWRTdHlsZUJ1aWxkZXIoKSkK
LSAgICAsIG1fc3R5bGVNYXAodGhpcykKLXsKLSAgICBFbGVtZW50KiByb290ID0gZG9jdW1lbnQt
PmRvY3VtZW50RWxlbWVudCgpOwotCi0gICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjppbml0RGVm
YXVsdFN0eWxlKHJvb3QpOwotCi0gICAgLy8gY29uc3RydWN0IGRvY3VtZW50IHJvb3QgZWxlbWVu
dCBkZWZhdWx0IHN0eWxlLiB0aGlzIGlzIG5lZWRlZAotICAgIC8vIHRvIGV2YWx1YXRlIG1lZGlh
IHF1ZXJpZXMgdGhhdCBjb250YWluIHJlbGF0aXZlIGNvbnN0cmFpbnRzLCBsaWtlICJzY3JlZW4g
YW5kIChtYXgtd2lkdGg6IDEwZW0pIgotICAgIC8vIFRoaXMgaXMgaGVyZSBpbnN0ZWFkIG9mIGNv
bnN0cnVjdG9yLCBiZWNhdXNlIHdoZW4gY29uc3RydWN0b3IgaXMgcnVuLAotICAgIC8vIGRvY3Vt
ZW50IGRvZXNuJ3QgaGF2ZSBkb2N1bWVudEVsZW1lbnQKLSAgICAvLyBOT1RFOiB0aGlzIGFzc3Vt
ZXMgdGhhdCBlbGVtZW50IHRoYXQgZ2V0cyBwYXNzZWQgdG8gc3R5bGVGb3JFbGVtZW50IC1jYWxs
Ci0gICAgLy8gaXMgYWx3YXlzIGZyb20gdGhlIGRvY3VtZW50IHRoYXQgb3ducyB0aGUgc3R5bGUg
c2VsZWN0b3IKLSAgICBGcmFtZVZpZXcqIHZpZXcgPSBkb2N1bWVudC0+dmlldygpOwotICAgIGlm
ICh2aWV3KQotICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVh
dG9yKHZpZXctPm1lZGlhVHlwZSgpKSk7Ci0gICAgZWxzZQotICAgICAgICBtX21lZGl1bSA9IGFk
b3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKCJhbGwiKSk7Ci0KLSAgICBpZiAocm9vdCkK
LSAgICAgICAgbV9yb290RGVmYXVsdFN0eWxlID0gc3R5bGVGb3JFbGVtZW50KHJvb3QsIDAsIERp
c2FsbG93U3R5bGVTaGFyaW5nLCBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcyk7Ci0KLSAgICBpZiAo
bV9yb290RGVmYXVsdFN0eWxlICYmIHZpZXcpCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIo
bmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmlldy0+bWVkaWFUeXBlKCksIHZpZXctPmZyYW1lKCks
IG1fcm9vdERlZmF1bHRTdHlsZS5nZXQoKSkpOwotCi0gICAgbV9ydWxlU2V0cy5yZXNldEF1dGhv
clN0eWxlKCk7Ci0KLSAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0
Q29sbGVjdGlvbiA9IGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpOwotICAgIG1fcnVs
ZVNldHMuaW5pdFVzZXJTdHlsZShzdHlsZVNoZWV0Q29sbGVjdGlvbiwgKm1fbWVkaXVtLCAqdGhp
cyk7Ci0KLSNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQotICAgIGlmIChkb2N1bWVudC0+c3ZnRXh0ZW5z
aW9ucygpKSB7Ci0gICAgICAgIGNvbnN0IEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj4mIHN2
Z0ZvbnRGYWNlRWxlbWVudHMgPSBkb2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpLT5zdmdGb250RmFj
ZUVsZW1lbnRzKCk7Ci0gICAgICAgIEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IHN2Z0ZvbnRGYWNlRWxlbWVudHMuZW5kKCk7Ci0gICAgICAgIGZvciAo
SGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdmdGb250
RmFjZUVsZW1lbnRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgICAgIGZvbnRT
ZWxlY3RvcigpLT5hZGRGb250RmFjZVJ1bGUoKCppdCktPmZvbnRGYWNlUnVsZSgpKTsKLSAgICB9
Ci0jZW5kaWYKLQotICAgIGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKDAsIHN0eWxlU2hlZXRDb2xs
ZWN0aW9uLT5hY3RpdmVBdXRob3JTdHlsZVNoZWV0cygpKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjphcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVj
dG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+JiBzdHlsZVNoZWV0cykKLXsKLSAgICBtX3J1bGVT
ZXRzLmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKGZpcnN0TmV3LCBzdHlsZVNoZWV0cywgbV9tZWRp
dW0uZ2V0KCksIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVycywgZG9jdW1lbnQoKS0+aXNWaWV3U291
cmNlKCksIHRoaXMpOwotICAgIGlmIChkb2N1bWVudCgpLT5yZW5kZXJlcigpICYmIGRvY3VtZW50
KCktPnJlbmRlcmVyKCktPnN0eWxlKCkpCi0gICAgICAgIGRvY3VtZW50KCktPnJlbmRlcmVyKCkt
PnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKCkpOwotCi0jaWYgRU5BQkxFKENT
U19ERVZJQ0VfQURBUFRBVElPTikKLSAgICB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKS0+cmVzb2x2
ZSgpOwotI2VuZGlmCi19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudEVsZW1lbnQo
RWxlbWVudCogcGFyZW50KQotewotICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudHNQYXJl
bnQgPSBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9zdEVsZW1lbnQoKTsKLQotICAgIC8vIFdlIGFy
ZSBub3QgYWx3YXlzIGludm9rZWQgY29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgc2NyaXB0IGV4
ZWN1dGlvbiBjYW4gY2F1c2UgdXMgdG8gZW50ZXIKLSAgICAvLyBzdHlsZSByZWNhbGMgaW4gdGhl
IG1pZGRsZSBvZiB0cmVlIGJ1aWxkaW5nLiBXZSBtYXkgYWxzbyBiZSBpbnZva2VkIGZyb20gc29t
ZXdoZXJlIHdpdGhpbiB0aGUgdHJlZS4KLSAgICAvLyBSZXNldCB0aGUgc3RhY2sgaW4gdGhpcyBj
YXNlLCBvciBpZiB3ZSBzZWUgYSBuZXcgcm9vdCBlbGVtZW50LgotICAgIC8vIE90aGVyd2lzZSBq
dXN0IHB1c2ggdGhlIG5ldyBwYXJlbnQuCi0gICAgaWYgKCFwYXJlbnRzUGFyZW50IHx8IG1fc2Vs
ZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0VtcHR5KCkpCi0gICAgICAgIG1fc2VsZWN0b3JGaWx0
ZXIuc2V0dXBQYXJlbnRTdGFjayhwYXJlbnQpOwotICAgIGVsc2UKLSAgICAgICAgbV9zZWxlY3Rv
ckZpbHRlci5wdXNoUGFyZW50KHBhcmVudCk7Ci0KLSAgICAvLyBOb3RlOiBXZSBtdXN0bid0IHNr
aXAgU2hhZG93Um9vdCBub2RlcyBmb3IgdGhlIHNjb3BlIHN0YWNrLgotICAgIGlmIChtX3Njb3Bl
UmVzb2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cHVzaChwYXJlbnQsIHBhcmVudC0+
cGFyZW50T3JTaGFkb3dIb3N0Tm9kZSgpKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQ
YXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkKLXsKLSAgICAvLyBOb3RlIHRoYXQgd2UgbWF5
IGdldCBpbnZva2VkIGZvciBzb21lIHJhbmRvbSBlbGVtZW50cyBpbiBzb21lIHdhY2t5IGNhc2Vz
IGR1cmluZyBzdHlsZSByZXNvbHZlLgotICAgIC8vIFBhdXNlIG1haW50YWluaW5nIHRoZSBzdGFj
ayBpbiB0aGlzIGNhc2UuCi0gICAgaWYgKG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0Nv
bnNpc3RlbnQocGFyZW50KSkKLSAgICAgICAgbV9zZWxlY3RvckZpbHRlci5wb3BQYXJlbnQoKTsK
LSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnBvcChw
YXJlbnQpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRTaGFkb3dSb290KGNv
bnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCitTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCYg
RWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoZWRSZXN1bHQoKQogewotICAgIEFTU0VSVChzaGFk
b3dSb290LT5ob3N0KCkpOwotICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIG1fc2Nv
cGVSZXNvbHZlci0+cHVzaChzaGFkb3dSb290LCBzaGFkb3dSb290LT5ob3N0KCkpOworICAgIEFT
U0VSVChtX21vZGUgPT0gU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgcmV0
dXJuIG1fcmVzdWx0OwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudFNoYWRvd1Jv
b3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUnVsZUxpc3QoKQogewotICAgIEFTU0VSVChz
aGFkb3dSb290LT5ob3N0KCkpOwotICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIG1f
c2NvcGVSZXNvbHZlci0+cG9wKHNoYWRvd1Jvb3QpOworICAgIEFTU0VSVChtX21vZGUgPT0gU2Vs
ZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOworICAgIHJldHVybiBtX3J1bGVMaXN0LnJl
bGVhc2UoKTsKIH0KIAotLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgc3R5bGUgc2V0dGluZyBmdW5j
dGlvbiBmb3Iga2V5ZnJhbWUgc3R5bGVzCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEtleWZyYW1l
U3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+IHJ1bGUpCitpbmxpbmUgdm9pZCBF
bGVtZW50UnVsZUNvbGxlY3Rvcjo6YWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUp
CiB7Ci0gICAgQXRvbWljU3RyaW5nIHMocnVsZS0+bmFtZSgpKTsKLSAgICBtX2tleWZyYW1lc1J1
bGVNYXAuc2V0KHMuaW1wbCgpLCBydWxlKTsKKyAgICBpZiAoIW1fbWF0Y2hlZFJ1bGVzKQorICAg
ICAgICBtX21hdGNoZWRSdWxlcyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8Y29uc3QgUnVsZURhdGEq
LCAzMj4pOworICAgIG1fbWF0Y2hlZFJ1bGVzLT5hcHBlbmQocnVsZSk7CiB9CiAKLVN0eWxlUmVz
b2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpjbGVhck1hdGNoZWRSdWxlcygpCiB7Ci0gICAgbV9mb250U2VsZWN0b3ItPmNsZWFyRG9jdW1l
bnQoKTsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAgbV92aWV3cG9y
dFN0eWxlUmVzb2x2ZXItPmNsZWFyRG9jdW1lbnQoKTsKLSNlbmRpZgotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVy
PiopCi17Ci0gICAgLy8gTG9vayBmb3IgY2FjaGUgZW50cmllcyBjb250YWluaW5nIGEgc3R5bGUg
ZGVjbGFyYXRpb24gd2l0aCBhIHNpbmdsZSByZWYgYW5kIHJlbW92ZSB0aGVtLgotICAgIC8vIFRo
aXMgbWF5IGhhcHBlbiB3aGVuIGFuIGVsZW1lbnQgYXR0cmlidXRlIG11dGF0aW9uIGNhdXNlcyBp
dCB0byBnZW5lcmF0ZSBhIG5ldyBpbmxpbmVTdHlsZSgpCi0gICAgLy8gb3IgcHJlc2VudGF0aW9u
QXR0cmlidXRlU3R5bGUoKSwgcG90ZW50aWFsbHkgbGVhdmluZyB0aGlzIGNhY2hlIHdpdGggdGhl
IGxhc3QgcmVmIG9uIHRoZSBvbGQgb25lLgotICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+IHRvUmVt
b3ZlOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVk
UHJvcGVydGllc0NhY2hlLmJlZ2luKCk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRl
cmF0b3IgZW5kID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpOwotICAgIGZvciAoOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiYgbWF0
Y2hlZFByb3BlcnRpZXMgPSBpdC0+dmFsdWUubWF0Y2hlZFByb3BlcnRpZXM7Ci0gICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgICAgIGlmIChtYXRjaGVkUHJvcGVydGllc1tpXS5wcm9wZXJ0aWVzLT5oYXNPbmVSZWYo
KSkgewotICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChpdC0+a2V5KTsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgKytpKQotICAgICAgICBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUucmVtb3ZlKHRvUmVtb3ZlW2ldKTsKLQotICAgIG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsKKyAgICBpZiAoIW1fbWF0
Y2hlZFJ1bGVzKQorICAgICAgICByZXR1cm47CisgICAgbV9tYXRjaGVkUnVsZXMtPmNsZWFyKCk7
CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1
bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHls
ZVJ1bGUqIHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUsIFByb3BlcnR5V2hpdGVsaXN0VHlw
ZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCitpbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIEVsZW1l
bnRSdWxlQ29sbGVjdG9yOjplbnN1cmVSdWxlTGlzdCgpCiB7Ci0gICAgbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
KyAxKTsKLSAgICBNYXRjaGVkUHJvcGVydGllcyYgbmV3UHJvcGVydGllcyA9IG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKLSAgICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXMg
PSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9wZXJ0aWVzKTsKLSAgICBuZXdQcm9w
ZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBlOwotICAgIG5ld1Byb3BlcnRpZXMu
d2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlwZTsKLSAgICBtYXRjaFJlc3VsdC5t
YXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworICAgIGlmICghbV9ydWxlTGlzdCkKKyAgICAgICAg
bV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKKyAgICByZXR1cm4gbV9y
dWxlTGlzdC5nZXQoKTsKIH0KIAotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVu
dFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5
U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKK2lubGluZSB2b2lkIEVsZW1lbnRS
dWxlQ29sbGVjdG9yOjphZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVy
dHlTZXQqIHByb3BlcnR5U2V0LCBib29sIGlzQ2FjaGVhYmxlKQogewogICAgIGlmICghcHJvcGVy
dHlTZXQpCiAgICAgICAgIHJldHVybjsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxl
ID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKLSAgICBpZiAocmVzdWx0LnJhbmdl
cy5maXJzdEF1dGhvclJ1bGUgPT0gLTEpCi0gICAgICAgIHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRo
b3JSdWxlID0gcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZTsKLSAgICBhZGRNYXRjaGVkUHJv
cGVydGllcyhyZXN1bHQsIHByb3BlcnR5U2V0KTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1
dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7CisgICAgaWYgKG1f
cmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPT0gLTEpCisgICAgICAgIG1fcmVzdWx0LnJh
bmdlcy5maXJzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Cisg
ICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXMocHJvcGVydHlTZXQpOwogICAgIGlmICgh
aXNDYWNoZWFibGUpCi0gICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOworICAgICAg
ICBtX3Jlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOwogfQogCiBjbGFzcyBNYXRjaGluZ1VBUnVs
ZXNTY29wZSB7CkBAIC00NTYsMTIgKzEzNywxMiBAQCBpbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVs
ZXNTY29wZTo6aXNNYXRjCiAKIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdV
QVJ1bGVzID0gZmFsc2U7CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVs
ZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdl
KQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3Qg
TWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYgcnVs
ZVJhbmdlKQogewogICAgIEFTU0VSVChtYXRjaFJlcXVlc3QucnVsZVNldCk7CiAgICAgQVNTRVJU
KG1fc3RhdGUuZWxlbWVudCgpKTsKIAotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKICAgICBFbGVtZW50
KiBlbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpOwogICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0
eWxlZEVsZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7CiAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBwc2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7CkBAIC00ODIsNyArMTYz
LDcgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcwogICAgIGlmICgh
TWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKICAgICAgICAgJiYgIXRy
ZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQogICAgICAgICAmJiAoIW1hdGNoUmVxdWVzdC5z
Y29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29wZSkKLSAg
ICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3RvckNoZWNr
ZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICAmJiBtX2JlaGF2aW9yQXRCb3VuZGFy
eSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQogICAgICAgICByZXR1
cm47CiAKICAgICAvLyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3Ms
IHRhZywgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZApAQCAtNTAyLDE1ICsx
ODMsMTUgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcwogICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2Fs
UnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0
Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0
b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0
Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsKLSAgICBp
ZiAoIW1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKQorICAgIGlmICghbV9yZWdpb25Gb3JTdHls
aW5nKQogICAgICAgICByZXR1cm47CiAKICAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hSZXF1ZXN0
LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwogICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgY29uc3QgQ1NTU2VsZWN0
b3IqIHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0
b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7Ci0gICAgICAgIGlmIChjaGVja1JlZ2lvblNl
bGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9zdGF0ZS5yZWdp
b25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVj
dG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9yZWdpb25Gb3JTdHls
aW5nLT5ub2RlKCkpKSkgewogICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMgPSBtYXRj
aFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxl
U2V0LmdldCgpOwogICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKICAgICAgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1
ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOwpA
QCAtNTE4LDE4ICsxOTksMTkgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdS
dWxlcwogICAgIH0KIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRj
aGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcygpCiB7Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9IHN0
YXRlLm1hdGNoZWRSdWxlcygpOwotICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQorICAg
IGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAo
IW1fbWF0Y2hlZFJ1bGVzIHx8IG1fbWF0Y2hlZFJ1bGVzLT5pc0VtcHR5KCkpCiAgICAgICAgIHJl
dHVybjsKIAogICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKIAotICAgIGlmIChzdGF0ZS5tb2RlKCkg
PT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICBWZWN0b3I8Y29uc3Qg
UnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9ICptX21hdGNoZWRSdWxlczsKKyAgICBpZiAo
bV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CiAgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kpCi0gICAgICAg
ICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRjaGVkUnVsZXNb
aV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOworICAgICAgICAgICAgZW5zdXJlUnVs
ZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNyZWF0ZUNT
U09NV3JhcHBlcigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTM3LDExICsyMTks
MTEgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaAogICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAg
aWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0
cmlidXRlU2VsZWN0b3IoKSkKICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgp
OwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tpXS0+
cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVs
ZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlz
dFR5cGUoKSk7CisgICAgICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoZWRS
dWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBt
YXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0
eVdoaXRlbGlzdFR5cGUoKSk7CiAgICAgfQogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNo
U2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcykKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMo
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBF
TkFCTEUoU0hBRE9XX0RPTSkKICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKQEAgLTU1Myw4ICsy
MzUsOCBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsCiAgICAgICAg
IGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7CiAgICAgICAgIHVuc2lnbmVkIHNjb3BlU2l6ZSA9
IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9zdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9
IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgICAgICAgICAgY2xlYXJN
YXRjaGVkUnVsZXMoKTsKKyAgICAgICAgICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVs
ZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CiAKICAgICAgICAgICAg
IGNvbnN0IFN0eWxlU2NvcGVSZXNvbHZlcjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Njb3BlUmVz
b2x2ZXItPnN0YWNrRnJhbWVBdChpKTsKICAgICAgICAgICAgIGRvY3VtZW50U2NvcGUgPSBkb2N1
bWVudFNjb3BlICYmICFmcmFtZS5tX3Njb3BlLT5pc0luU2hhZG93VHJlZSgpOwpAQCAtNTY3LDM2
ICsyNDksMjYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bAogICAg
ICAgICAgICAgfQogCiAgICAgICAgICAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KGZyYW1l
Lm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVsZXMsIGZyYW1lLm1fc2NvcGUpOwotICAgICAgICAg
ICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7
CisgICAgICAgICAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0gbV9yZXN1
bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwogICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogICAgICAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAg
c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgICAgICAgICBzb3J0QW5k
VHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1hdGNoSG9z
dFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIG1hdGNoSG9zdFJ1bGVzKGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKICNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CiAgICAg
VU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKICNlbmRpZgogfQogCi1pbmxpbmUgYm9v
bCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkK
LXsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYm
IG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyht
X3N0YXRlLmVsZW1lbnQoKSk7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQs
IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRj
aEhvc3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQogewogI2lmIEVOQUJMRShTSEFET1df
RE9NKQogICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2ZXIpOwogCi0gICAgbV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBjbGVhck1hdGNoZWRSdWxlcygp
OworICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSAtIDE7CiAKICAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNoZWRSdWxl
czsKICAgICBtX3Njb3BlUmVzb2x2ZXItPm1hdGNoSG9zdFJ1bGVzKG1fc3RhdGUuZWxlbWVudCgp
LCBtYXRjaGVkUnVsZXMpOwpAQCAtNjA0LDg4ICsyNzYsMTU2IEBAIHZvaWQgU3R5bGVSZXNvbHZl
cjo6bWF0Y2hIb3N0UnVsZXMoTWF0Y2gKICAgICAgICAgcmV0dXJuOwogCiAgICAgZm9yICh1bnNp
Z25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAgICBSdWxl
UmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAg
ICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJhbmdlcy5h
dXRob3JSdWxlUmFuZ2UoKTsKICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1
ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVt
ZW50KCkpLCBydWxlUmFuZ2UpOwogICAgIH0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVs
ZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKICNlbHNlCi0g
ICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CiAgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1
bGVzKTsKICNlbmRpZgogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMo
TWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKKyNpZiBFTkFCTEUo
U0hBRE9XX0RPTSkKK2lubGluZSB2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFNoYWRv
d0Rpc3RyaWJ1dGVkUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcywgU3R5bGVSZXNvbHZlcjo6
UnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYgKG1fcnVsZVNldHMuc2hhZG93RGlzdHJp
YnV0ZWRSdWxlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVGVtcG9yYXJ5
Q2hhbmdlPGJvb2w+IGNhblVzZUZhc3RSZWplY3QobV9jYW5Vc2VGYXN0UmVqZWN0LCBmYWxzZSk7
CisgICAgVGVtcG9yYXJ5Q2hhbmdlPFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5
PiBiZWhhdmlvckF0Qm91bmRhcnkobV9iZWhhdmlvckF0Qm91bmRhcnksIFNlbGVjdG9yQ2hlY2tl
cjo6Q3Jvc3Nlc0JvdW5kYXJ5KTsKKworICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVx
dWVzdHM7CisgICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1h
dGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKKyAgICAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKK30KKyNlbmRp
ZgorCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEF1dGhvclJ1bGVzKGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpCiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwot
ICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMTsKKyAgICBjbGVhck1hdGNoZWRSdWxlcygpOworICAgIG1fcmVzdWx0LnJh
bmdlcy5sYXN0QXV0aG9yUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAt
IDE7CiAKICAgICBpZiAoIW1fc3RhdGUuZWxlbWVudCgpKQogICAgICAgICByZXR1cm47CiAKICAg
ICAvLyBNYXRjaCBnbG9iYWwgYXV0aG9yIHJ1bGVzLgogICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJl
cXVlc3QobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAg
UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7Cisg
ICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJhbmdlcy5h
dXRob3JSdWxlUmFuZ2UoKTsKICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7CiAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwogI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3RvcjxNYXRj
aFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRl
ZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVx
dWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7
ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVs
ZVJhbmdlKTsKKyAgICBtYXRjaFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoaW5jbHVkZUVtcHR5UnVs
ZXMsIHJ1bGVSYW5nZSk7CiAjZW5kaWYKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMo
KTsKIAotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOwotCi0gICAgbWF0
Y2hTY29wZWRBdXRob3JSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBtYXRj
aFNjb3BlZEF1dGhvclJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKTsKIH0KIAotdm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVsZXMoYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkp
CiAgICAgICAgIHJldHVybjsKICAgICAKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFy
KCk7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKIAotICAgIHJlc3VsdC5yYW5nZXMubGFzdFVz
ZXJSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgbV9yZXN1
bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDE7CiAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLnVzZXJTdHls
ZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3Vs
dC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBy
dWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOwogICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CiAKLSAgICBzb3J0QW5k
VHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMoKTsKK30KKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVQVJ1bGVzKCkK
K3sKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSBzY29wZTsKKworICAgIC8vIEZpcnN0IHdlIG1h
dGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYgKENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCisgICAgICAgIG1fcmVzdWx0Lmlz
Q2FjaGVhYmxlID0gZmFsc2U7CisgICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9IG1f
aXNQcmludFN0eWxlCisgICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJp
bnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOworICAgIG1hdGNo
VUFSdWxlcyh1c2VyQWdlbnRTdHlsZVNoZWV0KTsKKworICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3
ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVldC4KKyAgICBpZiAo
ZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCisgICAgICAgIG1hdGNoVUFSdWxlcyhDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7CisKKyAgICAvLyBJZiBkb2N1bWVu
dCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBpbiB4bWwg
dmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291cmNlIHN0
eWxlIHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKKyAgICAgICAg
bWF0Y2hVQVJ1bGVzKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOwog
fQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0
LCBSdWxlU2V0KiBydWxlcykKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxl
cyhSdWxlU2V0KiBydWxlcykKIHsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKICAgICAKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBSdWxlUmFu
Z2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIG1fcmVzdWx0
LnJhbmdlcy5sYXN0VUFSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0gbV9yZXN1bHQucmFu
Z2VzLlVBUnVsZVJhbmdlKCk7CiAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0
KHJ1bGVzKSwgcnVsZVJhbmdlKTsKIAotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhy
ZXN1bHQpOworICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcygpOworfQorCitpbmxpbmUg
Ym9vbCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6cnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmIHJ1
bGVEYXRhLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmIGR5bmFtaWNQc2V1
ZG8pCit7CisgICAgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
KworICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgeworICAgICAg
ICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNldWRvIGVs
ZW1lbnRzLgorICAgICAgICBpZiAobV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQgIT0gTk9Q
U0VVRE8pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIFdlIGtub3cgYSBz
dWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJl
Y2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgorICAgICAgICAvLyBUaGlzIGlz
IGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVz
cGFjZS4KKyAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdI
VE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkp
IHsKKyAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVsZURh
dGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNo
ZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50
YWdRTmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgU2VsZWN0b3JD
aGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgocnVsZURhdGEuc2VsZWN0b3Io
KSwgc3RhdGUuZWxlbWVudCgpKTsKKyAgICAgICAgaWYgKCFzZWxlY3RvckNoZWNrZXJGYXN0UGF0
aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hl
cygpOworICAgIH0KKworICAgIC8vIFNsb3cgcGF0aC4KKyAgICBTZWxlY3RvckNoZWNrZXIgc2Vs
ZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIG1fbW9kZSk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpT
ZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRl
LmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hFbmFibGVkKTsKKyAgICBj
b250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxlKCk7CisgICAgY29udGV4dC5zY29wZSA9
IHNjb3BlOworICAgIGNvbnRleHQucHNldWRvSWQgPSBtX3BzZXVkb1N0eWxlUmVxdWVzdC5wc2V1
ZG9JZDsKKyAgICBjb250ZXh0LnNjcm9sbGJhciA9IG1fcHNldWRvU3R5bGVSZXF1ZXN0LnNjcm9s
bGJhcjsKKyAgICBjb250ZXh0LnNjcm9sbGJhclBhcnQgPSBtX3BzZXVkb1N0eWxlUmVxdWVzdC5z
Y3JvbGxiYXJQYXJ0OworICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gbV9iZWhhdmlv
ckF0Qm91bmRhcnk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9y
Q2hlY2tlci5tYXRjaChjb250ZXh0LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2Fs
U3RyYXRlZ3koKSk7CisgICAgaWYgKG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JN
YXRjaGVzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1fcHNldWRvU3R5bGVSZXF1
ZXN0LnBzZXVkb0lkICE9IE5PUFNFVURPICYmIG1fcHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lk
ICE9IGR5bmFtaWNQc2V1ZG8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1
ZTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qo
Y29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hS
ZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiBydWxl
cywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVS
YW5nZSYgcnVsZVJhbmdlKQogewogICAgIGlmICghcnVsZXMpCiAgICAgICAgIHJldHVybjsKIAot
ICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkg
ZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxl
IG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KLSAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVy
IGZpbHRlciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNl
IHRoZSBmYXN0IHBhdGguCi0gICAgYm9vbCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZp
bHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNo
UmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jv
c3NCb3VuZGFyeTsKKyAgICBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUgPSBtX3N0
YXRlOwogCiAgICAgdW5zaWduZWQgc2l6ZSA9IHJ1bGVzLT5zaXplKCk7CiAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVs
ZURhdGEgPSBydWxlcy0+YXQoaSk7Ci0gICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1f
c2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRp
ZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkp
KQorICAgICAgICBpZiAobV9jYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFz
dFJlamVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0
YS5kZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQogICAgICAgICAgICAgY29u
dGludWU7CiAKICAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOwotICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworICAg
ICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIG1faW5zcGVjdG9y
Q1NTT01XcmFwcGVycywgZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKSk7CiAgICAg
ICAgIFBzZXVkb0lkIGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYgKHJ1bGVN
YXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQc2V1ZG8sIG1hdGNo
UmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkpKSB7CisgICAgICAgIGlmIChydWxlTWF0Y2hlcyhy
dWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvKSkgewogICAgICAgICAg
ICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3Jl
IGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4KICAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVy
dHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICBpZiAo
IXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0Lmlu
Y2x1ZGVFbXB0eVJ1bGVzKSkgewpAQCAtNjkzLDE0ICs0MzMsMTQgQEAgdm9pZCBTdHlsZVJlc29s
dmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAg
ICAgICAgICAgfQogICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRh
cmQgZ2V0TWF0Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMg
aXMgbmVlZGVkLgotICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAh
cnVsZURhdGEuaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigpKSB7CisgICAgICAgICAgICBpZiAo
bV9zYW1lT3JpZ2luT25seSAmJiAhcnVsZURhdGEuaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigp
KSB7CiAgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1
bGUoY29va2llLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBub3JtYWwgcnVsZXMsIHNldCBh
IHBzZXVkbyBiaXQgaWYKICAgICAgICAgICAgIC8vIHdlIHJlYWxseSBqdXN0IG1hdGNoZWQgYSBw
c2V1ZG8tZWxlbWVudC4KLSAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvICE9IE5PUFNFVURP
ICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkID09IE5PUFNFVURPKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxl
Y3RpbmdSdWxlcykgeworICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8g
JiYgbV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKKyAgICAgICAg
ICAgICAgICBpZiAobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7
CiAgICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hS
dWxlKGNvb2tpZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAg
ICAgICAgICAgICB9CkBAIC03MTMsNyArNDUzLDcgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xs
ZWN0TWF0Y2hpbmdSdWxlcwogICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxl
SW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKIAogICAgICAgICAgICAgICAgIC8vIEFk
ZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAgICAgICAgICAgICAg
ICBtX3N0YXRlLmFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7CisgICAgICAgICAgICAgICAgYWRk
TWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKICAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIHRydWUpOwogICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzI5LDQ0NTkgKzQ2OSw2OSBAQCBzdGF0aWMgaW5s
aW5lIGJvb2wgY29tcGFyZVJ1bGVzKGNvbnN0IFJ1CiAgICAgcmV0dXJuIChzcGVjaWZpY2l0eTEg
PT0gc3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlvbigpIDwgcjItPnBvc2l0aW9uKCkgOiBzcGVj
aWZpY2l0eTEgPCBzcGVjaWZpY2l0eTI7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydE1h
dGNoZWRSdWxlcygpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0TWF0Y2hlZFJ1bGVz
KCkKIHsKLSAgICBzdGQ6OnNvcnQobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5iZWdpbigpLCBtX3N0
YXRlLm1hdGNoZWRSdWxlcygpLmVuZCgpLCBjb21wYXJlUnVsZXMpOworICAgIEFTU0VSVChtX21h
dGNoZWRSdWxlcyk7CisgICAgc3RkOjpzb3J0KG1fbWF0Y2hlZFJ1bGVzLT5iZWdpbigpLCBtX21h
dGNoZWRSdWxlcy0+ZW5kKCksIGNvbXBhcmVSdWxlcyk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZl
cjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVTTUlMUHJv
cGVydGllcykKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoQWxsUnVsZXMoYm9vbCBt
YXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQogewot
ICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQpOworICAgIG1hdGNoVUFSdWxlcygpOwogCiAgICAgLy8g
Tm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzKQotICAgICAgICBtYXRjaFVzZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKyAgICBp
ZiAobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaFVzZXJSdWxlcyhmYWxz
ZSk7CiAKICAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmlyc3Qgd2l0
aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwuCiAgICAgaWYgKG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRp
ZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRl
U3R5bGUoKSk7CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwogCiAgICAgICAgIC8v
IE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFsIG1hcHBlZCBkZWNsYXJhdGlvbnMuCiAgICAgICAgIC8v
IFRhYmxlcyBhbmQgdGFibGUgY2VsbHMgc2hhcmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0
aGF0IG11c3QgYmUgYXBwbGllZAogICAgICAgICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2lu
Y2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBh
dHRyaWJ1dGVzLgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHls
ZSgpKTsKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhtX3N0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwogCiAgICAg
ICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7CiAgICAg
ICAgICAgICBib29sIGlzQXV0bzsKICAgICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVj
dGlvbiA9IHRvSFRNTEVsZW1lbnQobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25h
bGl0eUlmaGFzRGlyQXV0b0F0dHJpYnV0ZShpc0F1dG8pOwogICAgICAgICAgICAgaWYgKGlzQXV0
bykKLSAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJl
Y3Rpb24gPT0gTFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNs
YXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtX3Jlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGll
cyh0ZXh0RGlyZWN0aW9uID09IExUUiA/IGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKSA6IHJpZ2h0
VG9MZWZ0RGVjbGFyYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgLy8gQ2hl
Y2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMgbmV4dC4KLSAgICBpZiAobV9tYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMocmVzdWx0LCBmYWxzZSk7
CisgICAgaWYgKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hBdXRob3JS
dWxlcyhmYWxzZSk7CiAKICAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBzdHlsZSBhdHRyaWJ1
dGUuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKSB7Cisg
ICAgaWYgKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgewogICAgICAgICAv
LyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00g
d3JhcHBlci4KICAgICAgICAgLy8gRklYTUU6IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNl
ZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcuCiAgICAgICAgIGJvb2wgaXNJbmxpbmVT
dHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+
aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgp
OwogICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVBy
b3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwg
aXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRp
ZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVD
YWNoZWFibGUpOwogICAgIH0KIAogI2lmIEVOQUJMRShTVkcpCiAgICAgLy8gTm93IGNoZWNrIFNN
SUwgYW5pbWF0aW9uIG92ZXJyaWRlIHN0eWxlLgotICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRp
ZXMgJiYgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQotICAgICAgICBh
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+
KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCks
IGZhbHNlIC8qIGlzQ2FjaGVhYmxlICovKTsKKyAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVz
ICYmIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAm
JiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIGFkZEVs
ZW1lbnRTdHlsZVByb3BlcnRpZXMoc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUuc3R5
bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlz
Q2FjaGVhYmxlICovKTsKICNlbHNlCiAgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVy
dGllcyk7CiAjZW5kaWYKIH0KIAotYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZmZWN0
ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0Ci17Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgaWYgKG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhj
bGFzc05hbWVzW2ldLmltcGwoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6
aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKLXsKLSAgICBtX2VsZW1lbnQgPSBlOwotICAgIG1fc3R5
bGVkRWxlbWVudCA9IGUgJiYgZS0+aXNTdHlsZWRFbGVtZW50KCkgPyBzdGF0aWNfY2FzdDxTdHls
ZWRFbGVtZW50Kj4oZSkgOiAwOwotICAgIG1fZWxlbWVudExpbmtTdGF0ZSA9IGUgPyBlLT5kb2N1
bWVudCgpLT52aXNpdGVkTGlua1N0YXRlKCktPmRldGVybWluZUxpbmtTdGF0ZShlKSA6IE5vdElu
c2lkZUxpbms7Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KEVs
ZW1lbnQqIGUpCi17Ci0gICAgaWYgKG1fc3RhdGUuZWxlbWVudCgpICE9IGUpIHsKLSAgICAgICAg
bV9zdGF0ZS5pbml0RWxlbWVudChlKTsKLSAgICAgICAgaWYgKGUgJiYgZSA9PSBlLT5kb2N1bWVu
dCgpLT5kb2N1bWVudEVsZW1lbnQoKSkgewotICAgICAgICAgICAgZS0+ZG9jdW1lbnQoKS0+c2V0
RGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOwotICAgICAgICAgICAgZS0+ZG9j
dW1lbnQoKS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0
Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVuZGVyU3R5
bGUqIHBhcmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVx
dWVzdCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQotewotICAgIG1fcHNldWRvU3R5
bGVSZXF1ZXN0ID0gcHNldWRvU3R5bGVSZXF1ZXN0OwotICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9
IHJlZ2lvbkZvclN0eWxpbmc7Ci0KLSAgICBpZiAoZSkgewotICAgICAgICBOb2RlUmVuZGVyaW5n
Q29udGV4dCBjb250ZXh0KGUpOwotICAgICAgICBtX3BhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVu
dE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOwotICAgICAgICBtX3BhcmVudFN0eWxlID0gY29u
dGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSA/IDAgOgotICAgICAgICAgICAgcGFyZW50U3R5
bGUgPyBwYXJlbnRTdHlsZSA6Ci0gICAgICAgICAgICBtX3BhcmVudE5vZGUgPyBtX3BhcmVudE5v
ZGUtPnJlbmRlclN0eWxlKCkgOiAwOwotICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Q
b2ludCA9IGNvbnRleHQuaW5zZXJ0aW9uUG9pbnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBt
X3BhcmVudE5vZGUgPSAwOwotICAgICAgICBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7Ci0g
ICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gZmFsc2U7Ci0gICAgfQotCi0g
ICAgTm9kZSogZG9jRWxlbWVudCA9IGUgPyBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQo
KSA6IDA7Ci0gICAgUmVuZGVyU3R5bGUqIGRvY1N0eWxlID0gZG9jdW1lbnQtPnJlbmRlclN0eWxl
KCk7Ci0gICAgbV9yb290RWxlbWVudFN0eWxlID0gZG9jRWxlbWVudCAmJiBlICE9IGRvY0VsZW1l
bnQgPyBkb2NFbGVtZW50LT5yZW5kZXJTdHlsZSgpIDogZG9jU3R5bGU7Ci0KLSAgICBtX3N0eWxl
ID0gMDsKLSAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKLSAgICBtX3J1bGVM
aXN0ID0gMDsKLSAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwotfQotCi1zdGF0aWMgY29uc3QgdW5z
aWduZWQgY1N0eWxlU2VhcmNoVGhyZXNob2xkID0gMTA7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQg
Y1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgPSAxMDsKLQotc3RhdGljIGlubGluZSBib29sIHBh
cmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoY29uc3QgRWxlbWVudCogcGFyZW50RWxlbWVudCkK
LXsKLSAgICBpZiAoIXBhcmVudEVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBy
ZXR1cm4gcGFyZW50RWxlbWVudC0+aGFzRmxhZ3NTZXREdXJpbmdTdHlsaW5nT2ZDaGlsZHJlbigp
OwotfQotCi1Ob2RlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBh
cmVudCwgdW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNvbnN0Ci17Ci0gICAgaWYgKHZpc2l0
ZWROb2RlQ291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkICogY1N0eWxlU2VhcmNoTGV2ZWxU
aHJlc2hvbGQpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQt
PmlzU3R5bGVkRWxlbWVudCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAocGFyZW50LT5o
YXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBTdHlsZWRF
bGVtZW50KiBwID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KHBhcmVudCk7Ci0gICAgaWYg
KHAtPmlubGluZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiAwOwotI2lmIEVOQUJMRShTVkcpCi0g
ICAgaWYgKHAtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihwKS0+
YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVybiAwOwotI2VuZGlm
Ci0gICAgaWYgKHAtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMu
Y29udGFpbnMocC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IHAtPnJlbmRlclN0eWxlKCk7
Ci0gICAgdW5zaWduZWQgc3ViY291bnQgPSAwOwotICAgIE5vZGUqIHRoaXNDb3VzaW4gPSBwOwot
ICAgIE5vZGUqIGN1cnJlbnROb2RlID0gcC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0KLSAgICAvLyBS
ZXNlcnZlIHRoZSB0cmllcyBmb3IgdGhpcyBsZXZlbC4gVGhpcyBlZmZlY3RpdmVseSBtYWtlcyBz
dXJlIHRoYXQgdGhlIGFsZ29yaXRobQotICAgIC8vIHdpbGwgbmV2ZXIgZ28gZGVlcGVyIHRoYW4g
Y1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgbGV2ZWxzIGludG8gcmVjdXJzaW9uLgotICAgIHZp
c2l0ZWROb2RlQ291bnQgKz0gY1N0eWxlU2VhcmNoVGhyZXNob2xkOwotICAgIHdoaWxlICh0aGlz
Q291c2luKSB7Ci0gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkgewotICAgICAgICAgICAgKytz
dWJjb3VudDsKLSAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA9PSBw
YXJlbnRTdHlsZSAmJiBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCkKLSAgICAgICAgICAgICAgICAm
JiBjdXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmICFwYXJlbnRFbGVtZW50UHJldmVudHNT
aGFyaW5nKHRvRWxlbWVudChjdXJyZW50Tm9kZSkpCi0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0g
ICAgICAgICAgICAgICAgJiYgIXRvRWxlbWVudChjdXJyZW50Tm9kZSktPnNoYWRvdygpCi0jZW5k
aWYKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHVu
dXNlZCByZXNlcnZlZCB0cmllcy4KLSAgICAgICAgICAgICAgICB2aXNpdGVkTm9kZUNvdW50IC09
IGNTdHlsZVNlYXJjaFRocmVzaG9sZCAtIHN1YmNvdW50OwotICAgICAgICAgICAgICAgIHJldHVy
biBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBp
ZiAoc3ViY291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQotICAgICAgICAgICAgICAgIHJl
dHVybiAwOwotICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS0+cHJldmlvdXNT
aWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudE5vZGUgPSBsb2NhdGVDb3VzaW5M
aXN0KHRoaXNDb3VzaW4tPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7Ci0gICAg
ICAgIHRoaXNDb3VzaW4gPSBjdXJyZW50Tm9kZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNl
dChSdWxlU2V0KiBydWxlU2V0KQorYm9vbCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0
Y2hpbmdSdWxlcyhSdWxlU2V0KiBydWxlU2V0KQogewotICAgIGlmICghcnVsZVNldCkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAg
ICBjbGVhck1hdGNoZWRSdWxlcygpOwogCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hl
Y2tlcjo6U2hhcmluZ1J1bGVzKTsKKyAgICBtX21vZGUgPSBTZWxlY3RvckNoZWNrZXI6OlNoYXJp
bmdSdWxlczsKICAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0x
OwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgp
OworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgs
IGxhc3RSdWxlSW5kZXgpOwogICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChy
dWxlU2V0KSwgcnVsZVJhbmdlKTsKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2Vy
OjpSZXNvbHZpbmdTdHlsZSk7Ci0gICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5j
bGVhcigpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNo
YXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAotewotICAg
IGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgSFRNTElucHV0RWxlbWVudCogdGhp
c0lucHV0RWxlbWVudCA9IGVsZW1lbnQtPnRvSW5wdXRFbGVtZW50KCk7Ci0gICAgSFRNTElucHV0
RWxlbWVudCogb3RoZXJJbnB1dEVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCktPnRvSW5wdXRFbGVt
ZW50KCk7Ci0KLSAgICBpZiAoIXRoaXNJbnB1dEVsZW1lbnQgfHwgIW90aGVySW5wdXRFbGVtZW50
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZWxl
bWVudERhdGEoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSkgewotICAgICAg
ICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZSh0eXBlQXR0cikgIT0gb3Ro
ZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJp
YnV0ZShyZWFkb25seUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRl
KHJlYWRvbmx5QXR0cikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAg
aWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzQXV0b2ZpbGxlZCgpICE9IG90aGVySW5wdXRFbGVtZW50
LT5pc0F1dG9maWxsZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlzSW5w
dXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPnNo
b3VsZEFwcGVhckNoZWNrZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlz
SW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5hdGUoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNJ
bmRldGVybWluYXRlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0
RWxlbWVudC0+aXNSZXF1aXJlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0VuYWJsZWRGb3Jt
Q29udHJvbCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGVsZW1lbnQtPmlzRGVmYXVsdEJ1dHRvbkZv
ckZvcm0oKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHN0YXRlLmRvY3VtZW50KCktPmNvbnRhaW5z
VmFsaWRpdHlTdHlsZVJ1bGVzKCkpIHsKLSAgICAgICAgYm9vbCB3aWxsVmFsaWRhdGUgPSBlbGVt
ZW50LT53aWxsVmFsaWRhdGUoKTsKLQotICAgICAgICBpZiAod2lsbFZhbGlkYXRlICE9IHN0YXRl
LmVsZW1lbnQoKS0+d2lsbFZhbGlkYXRlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9s
RWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgp
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoZWxlbWVudC0+aXNJ
blJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0luUmFuZ2UoKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkgIT0gc3Rh
dGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2UoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGVsZW1l
bnRIYXNEaXJlY3Rpb25BdXRvKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgLy8gRklYTUU6IFRo
aXMgbGluZSBpcyBzdXJwcmlzaW5nbHkgaG90LCB3ZSBtYXkgd2lzaCB0byBpbmxpbmUgaGFzRGly
ZWN0aW9uQXV0byBpbnRvIFN0eWxlUmVzb2x2ZXIuCi0gICAgcmV0dXJuIGVsZW1lbnQtPmlzSFRN
TEVsZW1lbnQoKSAmJiB0b0hUTUxFbGVtZW50KGVsZW1lbnQpLT5oYXNEaXJlY3Rpb25BdXRvKCk7
Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6c2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0
eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KiBzaGFyaW5nQ2FuZGlkYXRlKSBj
b25zdAotewotICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgaWYgKHN0YXRl
LmVsZW1lbnQoKS0+ZWxlbWVudERhdGEoKSA9PSBzaGFyaW5nQ2FuZGlkYXRlLT5lbGVtZW50RGF0
YSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0
R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFz
dEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikgIT0g
c2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIGlmICghc3RhdGUuZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVz
KCkpIHsKLSAgICAgICAgaWYgKHNoYXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkgJiYgY2xhc3NO
YW1lc0FmZmVjdGVkQnlSdWxlcyhzaGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+
aGFzQ2xhc3MoKSkgewotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIC8vIFNWRyBlbGVtZW50cyBy
ZXF1aXJlIGEgKHNsb3chKSBnZXRBdHRyaWJ1dGUgY29tcGFyaXNpb24gYmVjYXVzZSAiY2xhc3Mi
IGlzIGFuIGFuaW1hdGFibGUgYXR0cmlidXRlIGZvciBTVkcuCi0gICAgICAgIGlmIChzdGF0ZS5l
bGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVu
dCgpLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5nZXRBdHRy
aWJ1dGUoY2xhc3NBdHRyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IH0gZWxzZSB7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmNsYXNz
TmFtZXMoKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIH0KLSNlbmRpZgotICAg
IH0gZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHNoYXJpbmdDYW5kaWRhdGUt
PnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
I2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmhh
c1RhZ05hbWUocHJvZ3Jlc3NUYWcpKSB7Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MUHJv
Z3Jlc3NFbGVtZW50Kj4oc3RhdGUuZWxlbWVudCgpKS0+aXNEZXRlcm1pbmF0ZSgpICE9IHN0YXRp
Y19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihzaGFyaW5nQ2FuZGlkYXRlKS0+aXNEZXRlcm1p
bmF0ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gICAg
cmV0dXJuIHRydWU7Ci19CiAKLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhF
bGVtZW50KFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Ci17Ci0gICAgUmVuZGVyU3R5bGUq
IHN0eWxlID0gZWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOwotCi0gICAgaWYgKCFzdHlsZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGlmIChzdHlsZS0+dW5pcXVlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5
bGUtPmhhc1VuaXF1ZVBzZXVkb1N0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
ZiAoZWxlbWVudC0+dGFnUU5hbWUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPnRhZ1FOYW1lKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+aW5saW5lU3R5bGUoKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5uZWVkc1N0eWxlUmVjYWxjKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChlbGVtZW50
LT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oZWxlbWVudCktPmFu
aW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0jZW5k
aWYKLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0xpbmso
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5ob3ZlcmVkKCkgIT0g
c3RhdGUuZWxlbWVudCgpLT5ob3ZlcmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
ZiAoZWxlbWVudC0+YWN0aXZlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5hY3RpdmUoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5mb2N1c2VkKCkgIT0gc3RhdGUuZWxl
bWVudCgpLT5mb2N1c2VkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVu
dC0+c2hhZG93UHNldWRvSWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPnNoYWRvd1BzZXVkb0lkKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1
bWVudCgpLT5jc3NUYXJnZXQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghc2hh
cmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhlbGVtZW50
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5hZGRpdGlvbmFsUHJl
c2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0
aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRz
SW5SdWxlcy5jb250YWlucyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+aGFzU2NvcGVkSFRNTFN0
eWxlQ2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6IFdlIHNo
b3VsZCBzaGFyZSBzdHlsZSBmb3Igb3B0aW9uIGFuZCBvcHRncm91cCB3aGVuZXZlciBwb3NzaWJs
ZS4KLSAgICAvLyBCZWZvcmUgZG9pbmcgc28sIHdlIG5lZWQgdG8gcmVzb2x2ZSBpc3N1ZXMgaW4g
SFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcwotICAgIC8vIGFuZCBSZW5kZXJNZW51
TGlzdDo6c2V0VGV4dC4gU2VlIGFsc28gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTg4NDA1Ci0gICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBl
bGVtZW50LT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgYm9vbCBpc0NvbnRyb2wgPSBlbGVtZW50LT5pc0Zvcm1Db250cm9sRWxlbWVudCgpOwot
Ci0gICAgaWYgKGlzQ29udHJvbCAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRm9ybUNvbnRyb2xFbGVt
ZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChpc0NvbnRyb2wgJiYgIWNh
blNoYXJlU3R5bGVXaXRoQ29udHJvbChlbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgaWYgKHN0eWxlLT50cmFuc2l0aW9ucygpIHx8IHN0eWxlLT5hbmltYXRpb25zKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
LSAgICAvLyBUdXJuIG9mZiBzdHlsZSBzaGFyaW5nIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnYWlu
IGxheWVycyBmb3IgcmVhc29ucyBvdXRzaWRlIG9mIHRoZSBzdHlsZSBzeXN0ZW0uCi0gICAgLy8g
U2VlIGNvbW1lbnRzIGluIFJlbmRlck9iamVjdDo6c2V0U3R5bGUoKS4KLSAgICBpZiAoZWxlbWVu
dC0+aGFzVGFnTmFtZShpZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZnJhbWVUYWcp
IHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUo
b2JqZWN0VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGFwcGxldFRhZykgfHwgZWxlbWVudC0+
aGFzVGFnTmFtZShjYW52YXNUYWcpCi0jaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8p
Ci0gICAgICAgIC8vIFdpdGggcHJveHlpbmcsIHRoZSBtZWRpYSBlbGVtZW50cyBhcmUgYmFja2Vk
IGJ5IGEgUmVuZGVyRW1iZWRkZWRPYmplY3QuCi0gICAgICAgIHx8IGVsZW1lbnQtPmhhc1RhZ05h
bWUodmlkZW9UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXVkaW9UYWcpCi0jZW5kaWYKLSAg
ICAgICAgKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotICAgIGlmIChlbGVtZW50
SGFzRGlyZWN0aW9uQXV0byhlbGVtZW50KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
aWYgKGVsZW1lbnQtPmlzTGluaygpICYmIHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUoKSAhPSBzdHls
ZS0+aW5zaWRlTGluaygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBFTkFCTEUoVklE
RU9fVFJBQ0spCi0gICAgLy8gRGVueSBzaGFyaW5nIHN0eWxlcyBiZXR3ZWVuIFdlYlZUVCBhbmQg
bm9uLVdlYlZUVCBub2Rlcy4KLSAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgIT0g
c3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQo
KS0+aXNXZWJWVFRFbGVtZW50KCkgJiYgdG9XZWJWVFRFbGVtZW50KGVsZW1lbnQpLT5pc1Bhc3RO
b2RlKCkgIT0gdG9XZWJWVFRFbGVtZW50KHN0YXRlLmVsZW1lbnQoKSktPmlzUGFzdE5vZGUoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSNpZiBFTkFCTEUoRlVMTFNDUkVFTl9B
UEkpCi0gICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVu
dEZ1bGxTY3JlZW5FbGVtZW50KCkgfHwgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50
KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0jZW5kaWYKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW5saW5lIFN0eWxlZEVsZW1lbnQq
IFN0eWxlUmVzb2x2ZXI6OmZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKE5vZGUqIG5vZGUsIHVu
c2lnbmVkJiBjb3VudCkgY29uc3QKLXsKLSAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPnBy
ZXZpb3VzU2libGluZygpKSB7Ci0gICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkp
Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGNhblNoYXJlU3R5bGVXaXRoRWxl
bWVudChzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSkpKQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGlmIChjb3VudCsrID09IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKLSAgICAg
ICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3R5bGVkRWxl
bWVudCo+KG5vZGUpOwotfQotCi1SZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hh
cmVkU3R5bGUoKQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgaWYgKCFzdGF0
ZS5zdHlsZWRFbGVtZW50KCkgfHwgIXN0YXRlLnBhcmVudFN0eWxlKCkpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGlubGluZSBzdHlsZSBpdCBpcyBwcm9i
YWJseSB1bmlxdWUuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4o
c3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCi0g
ICAgICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgLy8gSWRzIHN0b3Agc3R5bGUgc2hhcmluZyBp
ZiB0aGV5IHNob3cgdXAgaW4gdGhlIHN0eWxlc2hlZXRzLgotICAgIGlmIChzdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29u
dGFpbnMoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwo
KSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFy
aW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5k
b2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGVsZW1l
bnRIYXNEaXJlY3Rpb25BdXRvKHN0YXRlLmVsZW1lbnQoKSkpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgLy8gQ2FjaGUgd2hldGhlciBzdGF0ZS5lbGVtZW50IGlzIGFmZmVjdGVkIGJ5IGFueSBr
bm93biBjbGFzcyBzZWxlY3RvcnMuCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkbid0IGJlIGEg
bWVtYmVyIHZhcmlhYmxlLiBUaGUgc3R5bGUgc2hhcmluZyBjb2RlIGNvdWxkIGJlIGZhY3RvcmVk
IG91dCBvZiBTdHlsZVJlc29sdmVyLgotICAgIHN0YXRlLnNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xh
c3NSdWxlcyhzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5oYXNDbGFzcygpICYm
IGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkp
KTsKLQotICAgIC8vIENoZWNrIHByZXZpb3VzIHNpYmxpbmdzIGFuZCB0aGVpciBjb3VzaW5zLgot
ICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKLSAgICB1bnNpZ25lZCB2aXNpdGVkTm9kZUNvdW50ID0g
MDsKLSAgICBTdHlsZWRFbGVtZW50KiBzaGFyZUVsZW1lbnQgPSAwOwotICAgIE5vZGUqIGNvdXNp
bkxpc3QgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXZpb3VzU2libGluZygpOwotICAgIHdo
aWxlIChjb3VzaW5MaXN0KSB7Ci0gICAgICAgIHNoYXJlRWxlbWVudCA9IGZpbmRTaWJsaW5nRm9y
U3R5bGVTaGFyaW5nKGNvdXNpbkxpc3QsIGNvdW50KTsKLSAgICAgICAgaWYgKHNoYXJlRWxlbWVu
dCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjb3VzaW5MaXN0ID0gbG9jYXRlQ291c2lu
TGlzdChjb3VzaW5MaXN0LT5wYXJlbnRFbGVtZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOwotICAg
IH0KLQotICAgIC8vIElmIHdlIGhhdmUgZXhoYXVzdGVkIGFsbCBvdXIgYnVkZ2V0IG9yIG91ciBj
b3VzaW5zLgotICAgIGlmICghc2hhcmVFbGVtZW50KQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IC8vIENhbid0IHNoYXJlIGlmIHNpYmxpbmcgcnVsZXMgYXBwbHkuIFRoaXMgaXMgY2hlY2tlZCBh
dCB0aGUgZW5kIGFzIGl0IHNob3VsZCByYXJlbHkgZmFpbC4KLSAgICBpZiAoc3R5bGVTaGFyaW5n
Q2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy5zaWJsaW5nKCkpKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICAvLyBDYW4ndCBzaGFyZSBpZiBhdHRyaWJ1dGUgcnVsZXMgYXBwbHkuCi0g
ICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMudW5j
b21tb25BdHRyaWJ1dGUoKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8vIENhbid0IHNoYXJl
IGlmIEBob3N0IEAtcnVsZXMgYXBwbHkuCi0gICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1h
dGNoZXNIb3N0UnVsZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8gVHJhY2tpbmcgY2hp
bGQgaW5kZXggcmVxdWlyZXMgdW5pcXVlIHN0eWxlIGZvciBlYWNoIG5vZGUuIFRoaXMgbWF5IGdl
dCBzZXQgYnkgdGhlIHNpYmxpbmcgcnVsZSBtYXRjaCBhYm92ZS4KLSAgICBpZiAocGFyZW50RWxl
bWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzaGFyZUVsZW1lbnQtPnJlbmRlclN0eWxlKCk7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1
bHQpCi17Ci0gICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7Ci0KLSAgICAvLyBGaXJzdCB3
ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgotICAgIGlmIChDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQotICAgICAgICByZXN1bHQu
aXNDYWNoZWFibGUgPSBmYWxzZTsKLSAgICBSdWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0g
bV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3BlY2lmaWMoInByaW50IikKLSAgICAgICAgPyBDU1NE
ZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjpkZWZhdWx0U3R5bGU7Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgdXNlckFnZW50U3R5
bGVTaGVldCk7Ci0KLSAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0
aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtz
TW9kZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVl
dHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7Ci0KLSAgICAvLyBJZiBkb2N1bWVudCB1c2VzIHZpZXcg
c291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBpbiB4bWwgdmlld2VyIG1vZGUp
LCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291cmNlIHN0eWxlIHNoZWV0Lgot
ICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKLSAgICAgICAgbWF0Y2hVQVJ1bGVz
KHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Ci19Ci0K
LXN0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFBhZ2luYXRpb246Ok1vZGUg
cGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICBpZiAocGFnaW5hdGlv
bk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpCi0gICAgICAgIHJldHVybjsKLSAgICAg
ICAgCi0gICAgc3dpdGNoIChwYWdpbmF0aW9uTW9kZSkgewotICAgIGNhc2UgUGFnaW5hdGlvbjo6
TGVmdFRvUmlnaHRQYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6
b250YWxDb2x1bW5BeGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5p
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVy
c2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0eWxlLT5z
ZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/
IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpSaWdodFRvTGVmdFBhZ2luYXRlZDoK
LSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOwotICAg
ICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBz
dHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0
eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Np
b24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBicmVhazsKLSAgICBjYXNl
IFBhZ2luYXRpb246OlRvcFRvQm90dG9tUGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29s
dW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMpOwotICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpv
bnRhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Np
b24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJv
Z3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERp
cmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jl
c3Npb24pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBhZ2luYXRpb246OkJvdHRvbVRvVG9w
UGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4
aXMpOwotICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nr
c1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Q
cm9ncmVzc2lvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Q
cm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVt
blByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBicmVhazsK
LSAgICBjYXNlIFBhZ2luYXRpb246OlVucGFnaW5hdGVkOgotICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBnZXRGb250
QW5kR2x5cGhPcmllbnRhdGlvbihjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIEZvbnRPcmllbnRh
dGlvbiYgZm9udE9yaWVudGF0aW9uLCBOb25DSktHbHlwaE9yaWVudGF0aW9uJiBnbHlwaE9yaWVu
dGF0aW9uKQotewotICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgewot
ICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVu
dGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0eWxlLT50ZXh0T3JpZW50YXRpb24oKSkgewot
ICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVmVydGljYWxSaWdodDoKLSAgICAgICAgZm9udE9yaWVu
dGF0aW9uID0gVmVydGljYWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlw
aE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgVGV4
dE9yaWVudGF0aW9uVXByaWdodDoKLSAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7
Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVXByaWdo
dDsKLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXM6Ci0g
ICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSA9PSBMZWZ0VG9SaWdodFdyaXRpbmdNb2Rl
KSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbWFwIHRvIHNpZGV3YXlzLWxl
ZnQsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotICAgICAgICAgICAgZm9udE9yaWVudGF0
aW9uID0gVmVydGljYWw7Ci0gICAgICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5
cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLSAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhP
cmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAg
ICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5c1JpZ2h0OgotICAgICAg
ICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9u
ID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsK
LSAgICBkZWZhdWx0OgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgZm9u
dE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5v
bkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAg
fQotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRv
Y3VtZW50KERvY3VtZW50KiBkb2N1bWVudCwgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3Ip
Ci17Ci0gICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7Ci0KLSAgICAvLyBIVE1M
NSBzdGF0ZXMgdGhhdCBzZWFtbGVzcyBpZnJhbWVzIHNob3VsZCByZXBsYWNlIGRlZmF1bHQgQ1NT
IHZhbHVlcwotICAgIC8vIHdpdGggdmFsdWVzIGluaGVyaXRlZCBmcm9tIHRoZSBjb250YWluaW5n
IGlmcmFtZSBlbGVtZW50LiBIb3dldmVyLAotICAgIC8vIHNvbWUgdmFsdWVzIChzdWNoIGFzIHRo
ZSBjYXNlIG9mIGRlc2lnbk1vZGUgPSAib24iKSBzdGlsbCBuZWVkIHRvCi0gICAgLy8gYmUgc2V0
IGJ5IHRoaXMgImRvY3VtZW50IHN0eWxlIi4KLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGRvY3Vt
ZW50U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7Ci0gICAgYm9vbCBzZWFtbGVzc1dpdGhQ
YXJlbnQgPSBkb2N1bWVudC0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCk7Ci0g
ICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkgewotICAgICAgICBSZW5kZXJTdHlsZSogaWZyYW1l
U3R5bGUgPSBkb2N1bWVudC0+c2VhbWxlc3NQYXJlbnRJRnJhbWUoKS0+cmVuZGVyU3R5bGUoKTsK
LSAgICAgICAgaWYgKGlmcmFtZVN0eWxlKQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+aW5o
ZXJpdEZyb20oaWZyYW1lU3R5bGUpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBJdCdzIG5vdCBj
bGVhciB3aGljaCB2YWx1ZXMgYmVsb3cgd2Ugd2FudCB0byBvdmVycmlkZSBpbiB0aGUgc2VhbWxl
c3MgY2FzZSEKLSAgICBkb2N1bWVudFN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLSAgICBpZiAo
IXNlYW1sZXNzV2l0aFBhcmVudCkgewotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRSVExPcmRl
cmluZyhkb2N1bWVudC0+dmlzdWFsbHlPcmRlcmVkKCkgPyBWaXN1YWxPcmRlciA6IExvZ2ljYWxP
cmRlcik7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFpvb20oZnJhbWUgJiYgIWRvY3VtZW50
LT5wcmludGluZygpID8gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCkgOiAxKTsKLSAgICAgICAgZG9j
dW1lbnRTdHlsZS0+c2V0UGFnZVNjYWxlVHJhbnNmb3JtKGZyYW1lID8gZnJhbWUtPmZyYW1lU2Nh
bGVGYWN0b3IoKSA6IDEpOwotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRMb2NhbGUoZG9jdW1l
bnQtPmNvbnRlbnRMYW5ndWFnZSgpKTsKLSAgICB9Ci0gICAgLy8gVGhpcyBvdmVycmlkZXMgYW55
IC13ZWJraXQtdXNlci1tb2RpZnkgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBpZnJhbWUuCi0g
ICAgZG9jdW1lbnRTdHlsZS0+c2V0VXNlck1vZGlmeShkb2N1bWVudC0+aW5EZXNpZ25Nb2RlKCkg
PyBSRUFEX1dSSVRFIDogUkVBRF9PTkxZKTsKLQotICAgIEVsZW1lbnQqIGRvY0VsZW1lbnQgPSBk
b2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgUmVuZGVyT2JqZWN0KiBkb2NFbGVtZW50
UmVuZGVyZXIgPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVyZXIoKSA6IDA7Ci0gICAg
aWYgKGRvY0VsZW1lbnRSZW5kZXJlcikgewotICAgICAgICAvLyBVc2UgdGhlIGRpcmVjdGlvbiBh
bmQgd3JpdGluZy1tb2RlIG9mIHRoZSBib2R5IHRvIHNldCB0aGUKLSAgICAgICAgLy8gdmlld3Bv
cnQncyBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSB1bmxlc3MgdGhlIHByb3BlcnR5IGlzIHNl
dCBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYm9k
eSwgdGhlbiB1c2UgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICAgIFJlbmRlck9iamVjdCog
Ym9keVJlbmRlcmVyID0gZG9jdW1lbnQtPmJvZHkoKSA/IGRvY3VtZW50LT5ib2R5KCktPnJlbmRl
cmVyKCkgOiAwOwotICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+d3JpdGlu
Z01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+
c2V0V3JpdGluZ01vZGUoYm9keVJlbmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoZG9j
RWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKLSAgICAgICAgaWYgKGJv
ZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPmRpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KCkp
Ci0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oYm9keVJlbmRlcmVyLT5z
dHlsZSgpLT5kaXJlY3Rpb24oKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRvY3VtZW50
U3R5bGUtPnNldERpcmVjdGlvbihkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlv
bigpKTsKLSAgICB9Ci0KLSAgICBpZiAoZnJhbWUpIHsKLSAgICAgICAgaWYgKEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKSkgewotICAgICAgICAgICAgY29uc3QgUGFnaW5hdGlv
biYgcGFnaW5hdGlvbiA9IGZyYW1lVmlldy0+cGFnaW5hdGlvbigpOwotICAgICAgICAgICAgaWYg
KHBhZ2luYXRpb24ubW9kZSAhPSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkgewotICAgICAgICAg
ICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb24ubW9kZSwgZG9jdW1l
bnRTdHlsZS5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Q29sdW1u
R2FwKHBhZ2luYXRpb24uZ2FwKTsKLSAgICAgICAgICAgICAgICBpZiAoUmVuZGVyVmlldyogdmll
dyA9IGRvY3VtZW50LT5yZW5kZXJWaWV3KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZp
ZXctPmhhc0NvbHVtbnMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZXctPnVwZGF0ZUNv
bHVtbkluZm9Gcm9tU3R5bGUoZG9jdW1lbnRTdHlsZS5nZXQoKSk7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2VhbWxlc3MgaWZy
YW1lcyB3YW50IHRvIGluaGVyaXQgdGhlaXIgZm9udCBmcm9tIHRoZWlyIHBhcmVudCBpZnJhbWUs
IHNvIGVhcmx5IHJldHVybiBiZWZvcmUgc2V0dGluZyB0aGUgZm9udC4KLSAgICBpZiAoc2VhbWxl
c3NXaXRoUGFyZW50KQotICAgICAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7Ci0K
LSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihkb2N1bWVudFN0
eWxlLT5sb2NhbGUoKSkpOwotICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+
c2V0dGluZ3MoKSkgewotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQo
ZG9jdW1lbnQtPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9u
RW5hYmxlZCgpKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0
dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOwotICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcm
IHN0YW5kYXJkRm9udCA9IHNldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoZm9udERlc2NyaXB0
aW9uLnNjcmlwdCgpKTsKLSAgICAgICAgaWYgKCFzdGFuZGFyZEZvbnQuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRp
b246OlN0YW5kYXJkRmFtaWx5KTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZh
bWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnQpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0
aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5KDApOwotICAgICAgICB9Ci0gICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAtIENTU1ZhbHVlWHhT
bWFsbCArIDEpOwotICAgICAgICBpbnQgc2l6ZSA9IFN0eWxlUmVzb2x2ZXI6OmZvbnRTaXplRm9y
S2V5d29yZChkb2N1bWVudCwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKTsKLSAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7Ci0gICAgICAgIGJvb2wgdXNlU1ZHWm9v
bVJ1bGVzID0gZG9jdW1lbnQtPmlzU1ZHRG9jdW1lbnQoKTsKLSAgICAgICAgZm9udERlc2NyaXB0
aW9uLnNldENvbXB1dGVkU2l6ZShTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3Bl
Y2lmaWVkU2l6ZShkb2N1bWVudCwgZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udERlc2NyaXB0aW9u
LmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcykpOwotICAgIH0gZWxzZQot
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50
aW5nKCkpOwotCi0gICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKLSAgICBOb25D
SktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247Ci0gICAgZ2V0Rm9udEFuZEdseXBo
T3JpZW50YXRpb24oZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9y
aWVudGF0aW9uKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVu
dGF0aW9uKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihn
bHlwaE9yaWVudGF0aW9uKTsKLQotICAgIGRvY3VtZW50U3R5bGUtPnNldEZvbnREZXNjcmlwdGlv
bihmb250RGVzY3JpcHRpb24pOwotICAgIGRvY3VtZW50U3R5bGUtPmZvbnQoKS51cGRhdGUoZm9u
dFNlbGVjdG9yKTsKLQotICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKLX0KLQot
c3RhdGljIGlubGluZSBib29sIGlzQXRTaGFkb3dCb3VuZGFyeShjb25zdCBFbGVtZW50KiBlbGVt
ZW50KQotewotICAgIGlmICghZWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIENv
bnRhaW5lck5vZGUqIHBhcmVudE5vZGUgPSBlbGVtZW50LT5wYXJlbnROb2RlKCk7Ci0gICAgcmV0
dXJuIHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS0+aXNTaGFkb3dSb290KCk7Ci19Ci0KLVBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVudChFbGVtZW50
KiBlbGVtZW50LCBSZW5kZXJTdHlsZSogZGVmYXVsdFBhcmVudCwKLSAgICBTdHlsZVNoYXJpbmdC
ZWhhdmlvciBzaGFyaW5nQmVoYXZpb3IsIFJ1bGVNYXRjaGluZ0JlaGF2aW9yIG1hdGNoaW5nQmVo
YXZpb3IsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKLXsKLSAgICAvLyBPbmNlIGFu
IGVsZW1lbnQgaGFzIGEgcmVuZGVyZXIsIHdlIGRvbid0IHRyeSB0byBkZXN0cm95IGl0LCBzaW5j
ZSBvdGhlcndpc2UgdGhlIHJlbmRlcmVyCi0gICAgLy8gd2lsbCB2YW5pc2ggaWYgYSBzdHlsZSBy
ZWNhbGMgaGFwcGVucyBkdXJpbmcgbG9hZGluZy4KLSAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09
IEFsbG93U3R5bGVTaGFyaW5nICYmICFlbGVtZW50LT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVl
dHNMb2FkZWQoKSAmJiAhZWxlbWVudC0+cmVuZGVyZXIoKSkgewotICAgICAgICBpZiAoIXNfc3R5
bGVOb3RZZXRBdmFpbGFibGUpIHsKLSAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUg
PSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgc19zdHlsZU5v
dFlldEF2YWlsYWJsZS0+c2V0RGlzcGxheShOT05FKTsKLSAgICAgICAgICAgIHNfc3R5bGVOb3RZ
ZXRBdmFpbGFibGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOwotICAgICAgICB9Ci0g
ICAgICAgIGVsZW1lbnQtPmRvY3VtZW50KCktPnNldEhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5
bGUoKTsKLSAgICAgICAgcmV0dXJuIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0gICAgfQotCi0g
ICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpbml0RWxlbWVudChlbGVtZW50KTsKLSAg
ICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGVsZW1lbnQsIGRlZmF1bHRQ
YXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JTdHlsaW5nKTsKLSAgICBpZiAoc2hhcmluZ0JlaGF2
aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9u
UG9pbnQoKSkgewotICAgICAgICBSZW5kZXJTdHlsZSogc2hhcmVkU3R5bGUgPSBsb2NhdGVTaGFy
ZWRTdHlsZSgpOwotICAgICAgICBpZiAoc2hhcmVkU3R5bGUpCi0gICAgICAgICAgICByZXR1cm4g
c2hhcmVkU3R5bGU7Ci0gICAgfQotCi0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBjbG9uZUZvclBh
cmVudDsKLQotICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpKSB7Ci0gICAgICAgIHN0YXRlLnNl
dFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPmlu
aGVyaXRGcm9tKHN0YXRlLnBhcmVudFN0eWxlKCksIGlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50
KSA/IFJlbmRlclN0eWxlOjpBdFNoYWRvd0JvdW5kYXJ5IDogUmVuZGVyU3R5bGU6Ok5vdEF0U2hh
ZG93Qm91bmRhcnkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRlLnNldFN0eWxlKGRlZmF1
bHRTdHlsZUZvckVsZW1lbnQoKSk7Ci0gICAgICAgIGNsb25lRm9yUGFyZW50ID0gUmVuZGVyU3R5
bGU6OmNsb25lKHN0YXRlLnN0eWxlKCkpOwotICAgICAgICBzdGF0ZS5zZXRQYXJlbnRTdHlsZShj
bG9uZUZvclBhcmVudC5nZXQoKSk7Ci0gICAgfQotICAgIC8vIGNvbnRlbnRlZGl0YWJsZSBhdHRy
aWJ1dGUgKGltcGxlbWVudGVkIGJ5IC13ZWJraXQtdXNlci1tb2RpZnkpIHNob3VsZAotICAgIC8v
IGJlIHByb3BhZ2F0ZWQgZnJvbSBzaGFkb3cgaG9zdCB0byBkaXN0cmlidXRlZCBub2RlLgotICAg
IGlmIChzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgewotICAgICAgICBpZiAo
RWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+cGFyZW50RWxlbWVudCgpKSB7Ci0gICAgICAgICAg
ICBpZiAoUmVuZGVyU3R5bGUqIHN0eWxlT2ZTaGFkb3dIb3N0ID0gcGFyZW50LT5yZW5kZXJTdHls
ZSgpKQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZXJNb2RpZnkoc3R5bGVP
ZlNoYWRvd0hvc3QtPnVzZXJNb2RpZnkoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAo
ZWxlbWVudC0+aXNMaW5rKCkpIHsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SXNMaW5rKHRy
dWUpOwotICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdGUgPSBzdGF0ZS5lbGVtZW50TGlua1N0
YXRlKCk7Ci0gICAgICAgIGlmIChsaW5rU3RhdGUgIT0gTm90SW5zaWRlTGluaykgewotICAgICAg
ICAgICAgYm9vbCBmb3JjZVZpc2l0ZWQgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmZvcmNl
UHNldWRvU3RhdGUoZWxlbWVudCwgQ1NTU2VsZWN0b3I6OlBzZXVkb1Zpc2l0ZWQpOwotICAgICAg
ICAgICAgaWYgKGZvcmNlVmlzaXRlZCkKLSAgICAgICAgICAgICAgICBsaW5rU3RhdGUgPSBJbnNp
ZGVWaXNpdGVkTGluazsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJbnNp
ZGVMaW5rKGxpbmtTdGF0ZSk7Ci0gICAgfQotCi0gICAgYm9vbCBuZWVkc0NvbGxlY3Rpb24gPSBm
YWxzZTsKLSAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmVuc3VyZURlZmF1bHRTdHlsZVNoZWV0
c0ZvckVsZW1lbnQoZWxlbWVudCwgbmVlZHNDb2xsZWN0aW9uKTsKLSAgICBpZiAobmVlZHNDb2xs
ZWN0aW9uKQotICAgICAgICBtX3J1bGVTZXRzLmNvbGxlY3RGZWF0dXJlcyhkb2N1bWVudCgpLT5p
c1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29sdmVyLmdldCgpKTsKLQotICAgIE1hdGNoUmVzdWx0
IG1hdGNoUmVzdWx0OwotICAgIGlmIChtYXRjaGluZ0JlaGF2aW9yID09IE1hdGNoT25seVVzZXJB
Z2VudFJ1bGVzKQotICAgICAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOwotICAgIGVsc2UK
LSAgICAgICAgbWF0Y2hBbGxSdWxlcyhtYXRjaFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlvciAhPSBN
YXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7Ci0KLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
KG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKLQotICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmpl
Y3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgot
ICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCks
IGVsZW1lbnQpOwotCi0gICAgc3RhdGUuY2xlYXIoKTsgLy8gQ2xlYXIgb3V0IGZvciB0aGUgbmV4
dCByZXNvbHZlLgotCi0gICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOwot
Ci0gICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCi0gICAgcmV0dXJuIHN0YXRlLnRha2VTdHls
ZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZv
cktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIGNvbnN0IFN0eWxlS2V5
ZnJhbWUqIGtleWZyYW1lLCBLZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQotewotICAgIE1h
dGNoUmVzdWx0IHJlc3VsdDsKLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAg
ICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsK
LQotICAgIEFTU0VSVCghbV9zdGF0ZS5zdHlsZSgpKTsKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIHN0eWxlCi0gICAgc3RhdGUuc2V0U3R5bGUoUmVu
ZGVyU3R5bGU6OmNsb25lKGVsZW1lbnRTdHlsZSkpOwotICAgIHN0YXRlLnNldExpbmVIZWlnaHRW
YWx1ZSgwKTsKLQotICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gYm90aGVyIHdpdGggIWltcG9ydGFu
dC4gU2luY2UgdGhlcmUgaXMgb25seSBldmVyIG9uZQotICAgIC8vIGRlY2wsIHRoZXJlJ3Mgbm90
aGluZyB0byBvdmVycmlkZS4gU28ganVzdCBhZGQgdGhlIGZpcnN0IHByb3BlcnRpZXMuCi0gICAg
Ym9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVz
KCkpCi0gICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGll
cz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEs
IGluaGVyaXRlZE9ubHkpOwotCi0gICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFo
ZWFkIGFuZCB1cGRhdGUgaXQgbm93LgotICAgIHVwZGF0ZUZvbnQoKTsKLQotICAgIC8vIExpbmUt
aGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6
ZQotICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0
eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAg
IC8vIE5vdyBkbyByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzLgotICAgIGlmIChrZXlmcmFtZS0+cHJv
cGVydGllcygpKQotICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJv
cGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGluaGVyaXRlZE9ubHkpOwotCi0gICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQg
Ynkgb25lIG9mIHRoZSBub24tZXNzZW50aWFsIGZvbnQgcHJvcHMsCi0gICAgLy8gZ28gYWhlYWQg
YW5kIHVwZGF0ZSBpdCBhIHNlY29uZCB0aW1lLgotICAgIHVwZGF0ZUZvbnQoKTsKLQotICAgIC8v
IFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBs
b2FkUGVuZGluZ1Jlc291cmNlcygpOwotICAgIAotICAgIC8vIEFkZCBhbGwgdGhlIGFuaW1hdGlu
ZyBwcm9wZXJ0aWVzIHRvIHRoZSBrZXlmcmFtZS4KLSAgICBpZiAoY29uc3QgU3R5bGVQcm9wZXJ0
eVNldCogc3R5bGVEZWNsYXJhdGlvbiA9IGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpIHsKLSAgICAg
ICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5Q291
bnQoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3BlcnR5Q291bnQ7ICsr
aSkgewotICAgICAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IHN0eWxlRGVjbGFyYXRp
b24tPnByb3BlcnR5QXQoaSkuaWQoKTsKLSAgICAgICAgICAgIC8vIFRpbWluZy1mdW5jdGlvbiB3
aXRoaW4ga2V5ZnJhbWVzIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgaXMgbm90IGFuaW1hdGVkOyBp
dCBqdXN0Ci0gICAgICAgICAgICAvLyBkZXNjcmliZXMgdGhlIHRpbWluZyBmdW5jdGlvbiBiZXR3
ZWVuIHRoaXMga2V5ZnJhbWUgYW5kIHRoZSBuZXh0LgotICAgICAgICAgICAgaWYgKHByb3BlcnR5
ICE9IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb24pCi0gICAgICAgICAg
ICAgICAga2V5ZnJhbWVWYWx1ZS5hZGRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICBy
ZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6a2V5ZnJh
bWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCogZSwgY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1l
bnRTdHlsZSwgS2V5ZnJhbWVMaXN0JiBsaXN0KQotewotICAgIGxpc3QuY2xlYXIoKTsKLQotICAg
IC8vIEdldCB0aGUga2V5ZnJhbWVzUnVsZSBmb3IgdGhpcyBuYW1lCi0gICAgaWYgKCFlIHx8IGxp
c3QuYW5pbWF0aW9uTmFtZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9r
ZXlmcmFtZXNSdWxlTWFwLmNoZWNrQ29uc2lzdGVuY3koKTsKLQotICAgIEtleWZyYW1lc1J1bGVN
YXA6Oml0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXNSdWxlTWFwLmZpbmQobGlzdC5hbmltYXRpb25O
YW1lKCkuaW1wbCgpKTsKLSAgICBpZiAoaXQgPT0gbV9rZXlmcmFtZXNSdWxlTWFwLmVuZCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBTdHlsZVJ1bGVLZXlmcmFtZXMqIGtleWZyYW1l
c1J1bGUgPSBpdC0+dmFsdWUuZ2V0KCk7Ci0KLSAgICAvLyBDb25zdHJ1Y3QgYW5kIHBvcHVsYXRl
IHRoZSBzdHlsZSBmb3IgZWFjaCBrZXlmcmFtZQotICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5
bGVLZXlmcmFtZT4gPiYga2V5ZnJhbWVzID0ga2V5ZnJhbWVzUnVsZS0+a2V5ZnJhbWVzKCk7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGtleWZyYW1lcy5zaXplKCk7ICsraSkgewotICAg
ICAgICAvLyBBcHBseSB0aGUgZGVjbGFyYXRpb24gdG8gdGhlIHN0eWxlLiBUaGlzIGlzIGEgc2lt
cGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBsb2dpYyBpbiBzdHlsZUZvckVsZW1lbnQKLSAgICAgICAg
aW5pdEVsZW1lbnQoZSk7Ci0gICAgICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1
bWVudCgpLCBlKTsKLQotICAgICAgICBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSA9IGtl
eWZyYW1lc1tpXS5nZXQoKTsKLQotICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUo
MCwgMCk7Ci0gICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShl
bGVtZW50U3R5bGUsIGtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7Ci0KLSAgICAgICAgLy8gQWRk
IHRoaXMga2V5ZnJhbWUgc3R5bGUgdG8gYWxsIHRoZSBpbmRpY2F0ZWQga2V5IHRpbWVzCi0gICAg
ICAgIFZlY3RvcjxmbG9hdD4ga2V5czsKLSAgICAgICAga2V5ZnJhbWUtPmdldEtleXMoa2V5cyk7
Ci0gICAgICAgIGZvciAoc2l6ZV90IGtleUluZGV4ID0gMDsga2V5SW5kZXggPCBrZXlzLnNpemUo
KTsgKytrZXlJbmRleCkgewotICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRLZXkoa2V5c1tr
ZXlJbmRleF0pOwotICAgICAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3Jl
YXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUp
Ci0gICAgaW50IGluaXRpYWxMaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgIGlmIChpbml0aWFs
TGlzdFNpemUgPiAwICYmIGxpc3RbMF0ua2V5KCkpIHsKLSAgICAgICAgc3RhdGljIFN0eWxlS2V5
ZnJhbWUqIHplcm9QZXJjZW50S2V5ZnJhbWU7Ci0gICAgICAgIGlmICghemVyb1BlcmNlbnRLZXlm
cmFtZSkgewotICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6
OmNyZWF0ZSgpLmxlYWtSZWYoKTsKLSAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUtPnNl
dEtleVRleHQoIjAlIik7Ci0gICAgICAgIH0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFt
ZVZhbHVlKDAsIDApOwotICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5
ZnJhbWUoZWxlbWVudFN0eWxlLCB6ZXJvUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7
Ci0gICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOwotICAgIH0KLQotICAgIC8vIElm
IHRoZSAxMDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhl
cmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1lKQotICAgIGlmIChpbml0aWFsTGlzdFNp
emUgPiAwICYmIChsaXN0W2xpc3Quc2l6ZSgpIC0gMV0ua2V5KCkgIT0gMSkpIHsKLSAgICAgICAg
c3RhdGljIFN0eWxlS2V5ZnJhbWUqIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWU7Ci0gICAgICAgIGlm
ICghaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSkgewotICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRL
ZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKLSAgICAgICAgICAg
IGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUtPnNldEtleVRleHQoIjEwMCUiKTsKLSAgICAgICAgfQot
ICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMSwgMCk7Ci0gICAgICAgIGtleWZy
YW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIGh1bmRyZWRQ
ZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLSAgICAgICAgbGlzdC5pbnNlcnQoa2V5
ZnJhbWVWYWx1ZSk7Ci0gICAgfQotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJl
c29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZSwgY29uc3QgUHNldWRvU3R5
bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkK
LXsKLSAgICBBU1NFUlQocGFyZW50U3R5bGUpOwotICAgIGlmICghZSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgaW5pdEVsZW1lbnQoZSk7
Ci0KLSAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0
eWxlLCBwc2V1ZG9TdHlsZVJlcXVlc3QpOwotICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxl
OjpjcmVhdGUoKSk7Ci0gICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5wYXJl
bnRTdHlsZSgpKTsKLQotICAgIC8vIFNpbmNlIHdlIGRvbid0IHVzZSBwc2V1ZG8tZWxlbWVudHMg
aW4gYW55IG9mIG91ciBxdWlyay9wcmludCB1c2VyIGFnZW50IHJ1bGVzLCBkb24ndCB3YXN0ZSB0
aW1lIHdhbGtpbmcKLSAgICAvLyB0aG9zZSBydWxlcy4KLQotICAgIC8vIENoZWNrIFVBLCB1c2Vy
IGFuZCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7Ci0gICAgbWF0
Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKLQotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0
eWxlcykgewotICAgICAgICBtYXRjaFVzZXJSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOwotICAg
ICAgICBtYXRjaEF1dGhvclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgfQotCi0gICAg
aWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICBzdGF0ZS5zdHlsZSgpLT5zZXRTdHlsZVR5cGUocHNldWRvU3R5bGVSZXF1
ZXN0LnBzZXVkb0lkKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQs
IGUpOwotCi0gICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRl
eHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCi0gICAgYWRqdXN0UmVuZGVyU3R5
bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKLQotICAgIC8vIFN0
YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2Fk
UGVuZGluZ1Jlc291cmNlcygpOwotCi0gICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNv
bHZlcigpOwotCi0gICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCi0gICAgcmV0dXJuIHN0YXRl
LnRha2VTdHlsZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRleCkKLXsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpOyAvLyBt
X3Jvb3RFbGVtZW50U3R5bGUgd2lsbCBiZSBzZXQgdG8gdGhlIGRvY3VtZW50IHN0eWxlLgotCi0g
ICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwotICAgIG1fc3RhdGUu
c3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotCi0gICAg
Y29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgYm9v
bCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBTdHJpbmcgcGFn
ZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7Ci0gICAgCi0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0Owot
ICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0
UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICBtYXRjaFBhZ2VSdWxlcyhy
ZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0g
ICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFsIGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBy
dWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwg
bV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIG1f
c3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZh
bHNlOwotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRp
ZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwotI2VuZGlmCi0gICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAw
LCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0K
LSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBu
b3cuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4g
d2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgotICAgIGlmIChtX3N0YXRl
LmxpbmVIZWlnaHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGlu
ZUhlaWdodCwgbV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7Ci0KLSAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwotCi0gICAgLy8g
U3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxv
YWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJl
c29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gbV9z
dGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNv
bHZlcjo6ZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpCi17Ci0gICAgbV9zdGF0ZS5zZXRTdHlsZShS
ZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwotICAgIC8vIE1ha2Ugc3VyZSBvdXIgZm9udHMgYXJlIGlu
aXRpYWxpemVkIGlmIHdlIGRvbid0IGluaGVyaXQgdGhlbSBmcm9tIG91ciBwYXJlbnQgc3R5bGUu
Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKSkgewotICAg
ICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsKLSAgICAgICAgbV9zdGF0ZS5zdHls
ZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3RvcigpKTsKLSAgICB9IGVsc2UKLSAgICAgICAg
bV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKDApOwotCi0gICAgcmV0dXJuIG1fc3RhdGUu
dGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6
OnN0eWxlRm9yVGV4dChUZXh0KiB0ZXh0Tm9kZSkKLXsKLSAgICBBU1NFUlQodGV4dE5vZGUpOwot
Ci0gICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dCh0ZXh0Tm9kZSk7Ci0gICAgTm9kZSog
cGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7Ci0g
ICAgcmV0dXJuIGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRhbmNlKCkgfHwgIXBhcmVudE5vZGUg
PwotICAgICAgICBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkgOiBwYXJlbnROb2RlLT5yZW5kZXJT
dHlsZSgpOwotfQotCi1zdGF0aWMgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRlclN0eWxl
KiBzdHlsZSkKLXsKLSAgICAvLyBJbnRyaW5zaWMgbWFyZ2luIHZhbHVlLgotICAgIGNvbnN0IGlu
dCBpbnRyaW5zaWNNYXJnaW4gPSAyICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIC8v
IEZJWE1FOiBVc2luZyB3aWR0aC9oZWlnaHQgYWxvbmUgYW5kIG5vdCBhbHNvIGRlYWxpbmcgd2l0
aCBtaW4td2lkdGgvbWF4LXdpZHRoIGlzIGZsYXdlZC4KLSAgICAvLyBGSVhNRTogVXNpbmcgInF1
aXJrIiB0byBkZWNpZGUgdGhlIG1hcmdpbiB3YXNuJ3Qgc2V0IGlzIGtpbmQgb2YgbGFtZS4KLSAg
ICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkgewotICAgICAgICBpZiAo
c3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdp
bkxlZnQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKLSAgICAgICAgaWYgKHN0eWxl
LT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luUmln
aHQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKLSAgICB9Ci0KLSAgICBpZiAoc3R5
bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luVG9wKCku
cXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKGludHJpbnNp
Y01hcmdpbiwgRml4ZWQpKTsKLSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Cb3R0b20oKS5xdWly
aygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShMZW5ndGgoaW50cmluc2lj
TWFyZ2luLCBGaXhlZCkpOwotICAgIH0KLX0KLQotc3RhdGljIEVEaXNwbGF5IGVxdWl2YWxlbnRC
bG9ja0Rpc3BsYXkoRURpc3BsYXkgZGlzcGxheSwgYm9vbCBpc0Zsb2F0aW5nLCBib29sIHN0cmlj
dFBhcnNpbmcpCi17Ci0gICAgc3dpdGNoIChkaXNwbGF5KSB7Ci0gICAgY2FzZSBCTE9DSzoKLSAg
ICBjYXNlIFRBQkxFOgotICAgIGNhc2UgQk9YOgotICAgIGNhc2UgRkxFWDoKLSAgICBjYXNlIEdS
SUQ6Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotCi0gICAgY2FzZSBMSVNUX0lURU06Ci0gICAg
ICAgIC8vIEl0IGlzIGEgV2luSUUgYnVnIHRoYXQgZmxvYXRlZCBsaXN0IGl0ZW1zIGxvc2UgdGhl
aXIgYnVsbGV0cywgc28gd2UnbGwgZW11bGF0ZSB0aGUgcXVpcmssIGJ1dCBvbmx5IGluIHF1aXJr
cyBtb2RlLgotICAgICAgICBpZiAoIXN0cmljdFBhcnNpbmcgJiYgaXNGbG9hdGluZykKLSAgICAg
ICAgICAgIHJldHVybiBCTE9DSzsKLSAgICAgICAgcmV0dXJuIGRpc3BsYXk7Ci0gICAgY2FzZSBJ
TkxJTkVfVEFCTEU6Ci0gICAgICAgIHJldHVybiBUQUJMRTsKLSAgICBjYXNlIElOTElORV9CT1g6
Ci0gICAgICAgIHJldHVybiBCT1g7Ci0gICAgY2FzZSBJTkxJTkVfRkxFWDoKLSAgICAgICAgcmV0
dXJuIEZMRVg7Ci0gICAgY2FzZSBJTkxJTkVfR1JJRDoKLSAgICAgICAgcmV0dXJuIEdSSUQ7Ci0K
LSAgICBjYXNlIElOTElORToKLSAgICBjYXNlIFJVTl9JTjoKLSAgICBjYXNlIENPTVBBQ1Q6Ci0g
ICAgY2FzZSBJTkxJTkVfQkxPQ0s6Ci0gICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6Ci0gICAgY2Fz
ZSBUQUJMRV9IRUFERVJfR1JPVVA6Ci0gICAgY2FzZSBUQUJMRV9GT09URVJfR1JPVVA6Ci0gICAg
Y2FzZSBUQUJMRV9ST1c6Ci0gICAgY2FzZSBUQUJMRV9DT0xVTU5fR1JPVVA6Ci0gICAgY2FzZSBU
QUJMRV9DT0xVTU46Ci0gICAgY2FzZSBUQUJMRV9DRUxMOgotICAgIGNhc2UgVEFCTEVfQ0FQVElP
TjoKLSAgICAgICAgcmV0dXJuIEJMT0NLOwotICAgIGNhc2UgTk9ORToKLSAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBOT05FOwotICAgIH0KLSAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gQkxPQ0s7Ci19Ci0KLS8vIENTUyByZXF1aXJlcyB0
ZXh0LWRlY29yYXRpb24gdG8gYmUgcmVzZXQgYXQgZWFjaCBET00gZWxlbWVudCBmb3IgdGFibGVz
LCAKLS8vIGlubGluZSBibG9ja3MsIGlubGluZSB0YWJsZXMsIHJ1bi1pbnMsIHNoYWRvdyBET00g
Y3Jvc3NpbmdzLCBmbG9hdGluZyBlbGVtZW50cywKLS8vIGFuZCBhYnNvbHV0ZSBvciByZWxhdGl2
ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMuCi1zdGF0aWMgYm9vbCBkb2VzTm90SW5oZXJpdFRleHRE
ZWNvcmF0aW9uKFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkKLXsKLSAgICByZXR1cm4g
c3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9U
QUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFJVTl9JTgotICAgICAgICB8fCBzdHlsZS0+ZGlz
cGxheSgpID09IElOTElORV9CTE9DSyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gg
fHwgaXNBdFNoYWRvd0JvdW5kYXJ5KGUpCi0gICAgICAgIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkg
fHwgc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCk7Ci19Ci0KLXN0YXRpYyBib29sIGlzRGlz
cGxheUZsZXhpYmxlQm94KEVEaXNwbGF5IGRpc3BsYXkpCi17Ci0gICAgcmV0dXJuIGRpc3BsYXkg
PT0gRkxFWCB8fCBkaXNwbGF5ID09IElOTElORV9GTEVYOwotfQotCi12b2lkIFN0eWxlUmVzb2x2
ZXI6OmFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBh
cmVudFN0eWxlLCBFbGVtZW50ICplKQotewotICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7Ci0KLSAg
ICAvLyBDYWNoZSBvdXIgb3JpZ2luYWwgZGlzcGxheS4KLSAgICBzdHlsZS0+c2V0T3JpZ2luYWxE
aXNwbGF5KHN0eWxlLT5kaXNwbGF5KCkpOwotCi0gICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgIT0g
Tk9ORSkgewotICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgPHRkPiB0aGF0IHNwZWNpZmllcyBhIGZs
b2F0IHByb3BlcnR5LCBpbiBxdWlya3MgbW9kZSB3ZSBqdXN0IGRyb3AgdGhlIGZsb2F0Ci0gICAg
ICAgIC8vIHByb3BlcnR5LgotICAgICAgICAvLyBTaXRlcyBhbHNvIGNvbW1vbmx5IHVzZSBkaXNw
bGF5OmlubGluZS9ibG9jayBvbiA8dGQ+cyBhbmQgPHRhYmxlPnMuIEluIHF1aXJrcyBtb2RlIHdl
IGZvcmNlCi0gICAgICAgIC8vIHRoZXNlIHRhZ3MgdG8gcmV0YWluIHRoZWlyIGRpc3BsYXkgdHlw
ZXMuCi0gICAgICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSAmJiBlKSB7Ci0gICAg
ICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZSh0ZFRhZykpIHsKLSAgICAgICAgICAgICAgICBzdHls
ZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsKLSAgICAgICAgICAgICAgICBzdHlsZS0+c2V0Rmxv
YXRpbmcoTm9GbG9hdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGUtPmhhc1RhZ05hbWUodGFi
bGVUYWcpKQotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KHN0eWxlLT5pc0Rpc3Bs
YXlJbmxpbmVUeXBlKCkgPyBJTkxJTkVfVEFCTEUgOiBUQUJMRSk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZSh0ZFRhZykgfHwgZS0+aGFzVGFnTmFtZSh0aFRh
ZykpKSB7Ci0gICAgICAgICAgICBpZiAoc3R5bGUtPndoaXRlU3BhY2UoKSA9PSBLSFRNTF9OT1dS
QVApIHsKLSAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIGFyZSByZWFsbHkgbm93
cmFwcGluZyBvciBpZiB3ZSBzaG91bGQganVzdAotICAgICAgICAgICAgICAgIC8vIHVzZSBub3Jt
YWwgaW5zdGVhZC4gSWYgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGlzIGZpeGVkLCB0aGVuCi0gICAg
ICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIE5PV1JBUC4KLSAgICAgICAgICAg
ICAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNGaXhlZCgpKQotICAgICAgICAgICAgICAgICAgICBz
dHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9XUkFQKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRhYmxlcyBuZXZlciBzdXBwb3J0IHRoZSAtd2Vi
a2l0LSogdmFsdWVzIGZvciB0ZXh0LWFsaWduIGFuZCB3aWxsIHJlc2V0IGJhY2sgdG8gdGhlIGRl
ZmF1bHQuCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGFibGVUYWcpICYmIChzdHls
ZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0xFRlQgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdF
QktJVF9DRU5URVIgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKFRBU1RBUlQpOwotCi0gICAgICAgIC8vIEZyYW1l
cyBhbmQgZnJhbWVzZXRzIG5ldmVyIGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9u
OmFic29sdXRlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0bwotICAgICAgICAvLyBmaXggYSBjcmFzaCB3
aGVyZSBhIHNpdGUgdHJpZXMgdG8gcG9zaXRpb24gdGhlc2Ugb2JqZWN0cy4gVGhleSBhbHNvIG5l
dmVyIGhvbm9yIGRpc3BsYXkuCi0gICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdOYW1lKGZyYW1l
VGFnKSB8fCBlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkpIHsKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RGlz
cGxheShCTE9DSyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdWJ5IHRleHQgZG9lcyBub3Qg
c3VwcG9ydCBmbG9hdCBvciBwb3NpdGlvbi4gVGhpcyBtaWdodCBjaGFuZ2Ugd2l0aCBldm9sdXRp
b24gb2YgdGhlIHNwZWNpZmljYXRpb24uCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUo
cnRUYWcpKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24p
OwotICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBvdmVycmlkaW5nIHN0YXJ0Ly13ZWJr
aXQtYXV0byBsaWtlIHRoaXMuIERvIGl0IGluIGh0bWwuY3NzIGluc3RlYWQuCi0gICAgICAgIC8v
IFRhYmxlIGhlYWRlcnMgd2l0aCBhIHRleHQtYWxpZ24gb2YgLXdlYmtpdC1hdXRvIHdpbGwgY2hh
bmdlIHRoZSB0ZXh0LWFsaWduIHRvIGNlbnRlci4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFn
TmFtZSh0aFRhZykgJiYgc3R5bGUtPnRleHRBbGlnbigpID09IFRBU1RBUlQpCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0VGV4dEFsaWduKENFTlRFUik7Ci0KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFz
VGFnTmFtZShsZWdlbmRUYWcpKQotICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0sp
OwotCi0gICAgICAgIC8vIEFic29sdXRlL2ZpeGVkIHBvc2l0aW9uZWQgZWxlbWVudHMsIGZsb2F0
aW5nIGVsZW1lbnRzIGFuZCB0aGUgZG9jdW1lbnQgZWxlbWVudCBuZWVkIGJsb2NrLWxpa2Ugb3V0
c2lkZSBkaXNwbGF5LgotICAgICAgICBpZiAoc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCkg
fHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCAoZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVs
ZW1lbnQoKSA9PSBlKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRC
bG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3Vt
ZW50KCktPmluUXVpcmtzTW9kZSgpKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IERvbid0IHN1cHBv
cnQgdGhpcyBtdXRhdGlvbiBmb3IgcHNldWRvIHN0eWxlcyBsaWtlIGZpcnN0LWxldHRlciBvciBm
aXJzdC1saW5lLCBzaW5jZSBpdCdzIG5vdCBjb21wbGV0ZWx5Ci0gICAgICAgIC8vIGNsZWFyIGhv
dyB0aGF0IHNob3VsZCB3b3JrLgotICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJ
TkUgJiYgc3R5bGUtPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmIHN0eWxlLT53cml0aW5nTW9k
ZSgpICE9IHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNl
dERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKLQotICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRo
ZSBkaXNwbGF5IG11dGF0aW9uLCBjaGVjayB0YWJsZSByb3dzLiBXZSBkbyBub3QgaG9ub3IgcG9z
aXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246c3RpY2t5IG9uCi0gICAgICAgIC8vIHRhYmxlIHJv
d3Mgb3IgY2VsbHMuIFRoaXMgaGFzIGJlZW4gZXN0YWJsaXNoZWQgZm9yIHBvc2l0aW9uOnJlbGF0
aXZlIGluIENTUzIuMSAoYW5kIGNhdXNlZCBhIGNyYXNoIGluIGNvbnRhaW5pbmdCbG9jaygpCi0g
ICAgICAgIC8vIG9uIHNvbWUgc2l0ZXMpLgotICAgICAgICBpZiAoKHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dS
T1VQCi0gICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9V
UCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVykKLSAgICAgICAgICAgICYmIHN0eWxl
LT5oYXNJbkZsb3dQb3NpdGlvbigpKQotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0
YXRpY1Bvc2l0aW9uKTsKLQotICAgICAgICAvLyB3cml0aW5nLW1vZGUgZG9lcyBub3QgYXBwbHkg
dG8gdGFibGUgcm93IGdyb3VwcywgdGFibGUgY29sdW1uIGdyb3VwcywgdGFibGUgcm93cywgYW5k
IHRhYmxlIGNvbHVtbnMuCi0gICAgICAgIC8vIEZJWE1FOiBUYWJsZSBjZWxscyBzaG91bGQgYmUg
YWxsb3dlZCB0byBiZSBwZXJwZW5kaWN1bGFyIG9yIGZsaXBwZWQgd2l0aCByZXNwZWN0IHRvIHRo
ZSB0YWJsZSwgdGhvdWdoLgotICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9D
T0xVTU4gfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVAgfHwgc3R5bGUt
PmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxlLT5k
aXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfUk9XIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCi0gICAgICAgICAg
ICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NFTEwpCi0gICAgICAgICAgICBzdHlsZS0+
c2V0V3JpdGluZ01vZGUocGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpOwotCi0gICAgICAgIC8v
IEZJWE1FOiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGJsb2NrLWZsb3cgb24gZmxleGlibGUgYm94
ZXMgeWV0LCBkaXNhbGxvdyBzZXR0aW5nCi0gICAgICAgIC8vIG9mIGJsb2NrLWZsb3cgdG8gYW55
dGhpbmcgb3RoZXIgdGhhbiBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlLgotICAgICAgICAvLyBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY0MTggLSBGbGV4aWJsZSBib3gg
c3VwcG9ydC4KLSAgICAgICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFRvcFRvQm90dG9t
V3JpdGluZ01vZGUgJiYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gQk9YIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gSU5MSU5FX0JPWCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUoVG9w
VG9Cb3R0b21Xcml0aW5nTW9kZSk7Ci0KLSAgICAgICAgaWYgKGlzRGlzcGxheUZsZXhpYmxlQm94
KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRp
bmcoTm9GbG9hdCk7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50Qmxv
Y2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVu
dCgpLT5pblF1aXJrc01vZGUoKSkpOwotICAgICAgICB9Ci0KLSNpZiBFTkFCTEUoRElBTE9HX0VM
RU1FTlQpCi0gICAgICAgIC8vIFBlciB0aGUgc3BlYywgcG9zaXRpb24gJ3N0YXRpYycgYW5kICdy
ZWxhdGl2ZScgaW4gdGhlIHRvcCBsYXllciBjb21wdXRlIHRvICdhYnNvbHV0ZScuCi0gICAgICAg
IGlmIChlICYmIGUtPmlzSW5Ub3BMYXllcigpICYmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0
aWNQb3NpdGlvbiB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBSZWxhdGl2ZVBvc2l0aW9uKSkgewot
ICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKEFic29sdXRlUG9zaXRpb24pOwotICAgICAg
ICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9
Ci0KLSAgICAvLyBNYWtlIHN1cmUgb3VyIHotaW5kZXggdmFsdWUgaXMgb25seSBhcHBsaWVkIGlm
IHRoZSBvYmplY3QgaXMgcG9zaXRpb25lZC4KLSAgICBpZiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0g
U3RhdGljUG9zaXRpb24gJiYgIWlzRGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNw
bGF5KCkpKQotICAgICAgICBzdHlsZS0+c2V0SGFzQXV0b1pJbmRleCgpOwotCi0gICAgLy8gQXV0
byB6LWluZGV4IGJlY29tZXMgMCBmb3IgdGhlIHJvb3QgZWxlbWVudCBhbmQgdHJhbnNwYXJlbnQg
b2JqZWN0cy4gVGhpcyBwcmV2ZW50cwotICAgIC8vIGNhc2VzIHdoZXJlIG9iamVjdHMgdGhhdCBz
aG91bGQgYmUgYmxlbmRlZCBhcyBhIHNpbmdsZSB1bml0IGVuZCB1cCB3aXRoIGEgbm9uLXRyYW5z
cGFyZW50Ci0gICAgLy8gb2JqZWN0IHdlZGdlZCBpbiBiZXR3ZWVuIHRoZW0uIEF1dG8gei1pbmRl
eCBhbHNvIGJlY29tZXMgMCBmb3Igb2JqZWN0cyB0aGF0IHNwZWNpZnkgdHJhbnNmb3Jtcy9tYXNr
cy9yZWZsZWN0aW9ucy4KLSAgICBpZiAoc3R5bGUtPmhhc0F1dG9aSW5kZXgoKSAmJiAoKGUgJiYg
ZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkKLSAgICAgICAgfHwgc3R5bGUt
Pm9wYWNpdHkoKSA8IDEuMGYKLSAgICAgICAgfHwgc3R5bGUtPmhhc1RyYW5zZm9ybVJlbGF0ZWRQ
cm9wZXJ0eSgpCi0gICAgICAgIHx8IHN0eWxlLT5oYXNNYXNrKCkKLSAgICAgICAgfHwgc3R5bGUt
PmNsaXBQYXRoKCkKLSAgICAgICAgfHwgc3R5bGUtPmJveFJlZmxlY3QoKQotICAgICAgICB8fCBz
dHlsZS0+aGFzRmlsdGVyKCkKLSAgICAgICAgfHwgc3R5bGUtPmhhc0JsZW5kTW9kZSgpCi0gICAg
ICAgIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFN0aWNreVBvc2l0aW9uCi0gICAgICAgIHx8IChz
dHlsZS0+cG9zaXRpb24oKSA9PSBGaXhlZFBvc2l0aW9uICYmIGUgJiYgZS0+ZG9jdW1lbnQoKS0+
cGFnZSgpICYmIGUtPmRvY3VtZW50KCktPnBhZ2UoKS0+c2V0dGluZ3MoKS0+Zml4ZWRQb3NpdGlv
bkNyZWF0ZXNTdGFja2luZ0NvbnRleHQoKSkKLSNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZM
T1dfU0NST0xMSU5HKQotICAgICAgICAvLyBUb3VjaCBvdmVyZmxvdyBzY3JvbGxpbmcgY3JlYXRl
cyBhIHN0YWNraW5nIGNvbnRleHQuCi0gICAgICAgIHx8ICgoc3R5bGUtPm92ZXJmbG93WCgpICE9
IE9ISURERU4gfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pICYmIHN0eWxlLT51c2VU
b3VjaE92ZXJmbG93U2Nyb2xsaW5nKCkpCi0jZW5kaWYKLSNpZiBFTkFCTEUoRElBTE9HX0VMRU1F
TlQpCi0gICAgICAgIHx8IChlICYmIGUtPmlzSW5Ub3BMYXllcigpKQotI2VuZGlmCi0gICAgICAg
ICkpCi0gICAgICAgIHN0eWxlLT5zZXRaSW5kZXgoMCk7Ci0KLSAgICAvLyBUZXh0YXJlYSBjb25z
aWRlcnMgb3ZlcmZsb3cgdmlzaWJsZSBhcyBhdXRvLgotICAgIGlmIChlICYmIGUtPmhhc1RhZ05h
bWUodGV4dGFyZWFUYWcpKSB7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goc3R5bGUtPm92
ZXJmbG93WCgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dYKCkpOwotICAg
ICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/
IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WSgpKTsKLSAgICB9Ci0KLSAgICBpZiAoZG9lc05vdElu
aGVyaXRUZXh0RGVjb3JhdGlvbihzdHlsZSwgZSkpCi0gICAgICAgIHN0eWxlLT5zZXRUZXh0RGVj
b3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29yYXRpb24oKSk7Ci0gICAgZWxzZQotICAg
ICAgICBzdHlsZS0+YWRkVG9UZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29y
YXRpb24oKSk7Ci0KLSAgICAvLyBJZiBlaXRoZXIgb3ZlcmZsb3cgdmFsdWUgaXMgbm90IHZpc2li
bGUsIGNoYW5nZSB0byBhdXRvLgotICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT01BUlFV
RUUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9NQVJRVUVFKQotICAgICAgICBzdHlsZS0+c2V0
T3ZlcmZsb3dZKE9NQVJRVUVFKTsKLSAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0g
T01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9NQVJRVUVFKQotICAgICAgICBzdHls
ZS0+c2V0T3ZlcmZsb3dYKE9NQVJRVUVFKTsKLSAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dY
KCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFKSB7Ci0gICAg
ICAgIC8vIEZJWE1FOiBPbmNlIHdlIGltcGxlbWVudCBwYWdpbmF0aW9uIGNvbnRyb2xzLCBvdmVy
Zmxvdy14IHNob3VsZCBkZWZhdWx0IHRvIGhpZGRlbgotICAgICAgICAvLyBpZiBvdmVyZmxvdy15
IGlzIHNldCB0byAtd2Via2l0LXBhZ2VkLXggb3IgLXdlYmtpdC1wYWdlLXkuIEZvciBub3csIHdl
J2xsIGxldCBpdAotICAgICAgICAvLyBkZWZhdWx0IHRvIGF1dG8gc28gd2UgY2FuIGF0IGxlYXN0
IHNjcm9sbCB0aHJvdWdoIHRoZSBwYWdlcy4KLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChP
QVVUTyk7Ci0gICAgfSBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgJiYg
c3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFKQotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZs
b3dZKE9BVVRPKTsKLQotICAgIC8vIENhbGwgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoKSBp
ZiBhIHBhZ2luYXRpb24gbW9kZSBpcyBzZXQgZm9yIGFueSBub24tcm9vdCBlbGVtZW50cy4gSWYg
dGhlc2UKLSAgICAvLyBzdHlsZXMgYXJlIHNwZWNpZmllZCBvbiBhIHJvb3QgZWxlbWVudCwgdGhl
biB0aGV5IHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGluCi0gICAgLy8gU3R5bGVSZXNvbHZlcjo6c3R5
bGVGb3JEb2N1bWVudCgpLgotICAgIGlmICgoc3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFgg
fHwgc3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFkpICYmICEoZSAmJiAoZS0+aGFzVGFnTmFt
ZShodG1sVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGJvZHlUYWcpKSkpCi0gICAgICAgIHNldFN0eWxl
c0ZvclBhZ2luYXRpb25Nb2RlKFdlYkNvcmU6OnBhZ2luYXRpb25Nb2RlRm9yUmVuZGVyU3R5bGUo
c3R5bGUpLCBzdHlsZSk7Ci0KLSAgICAvLyBUYWJsZSByb3dzLCBzZWN0aW9ucyBhbmQgdGhlIHRh
YmxlIGl0c2VsZiB3aWxsIHN1cHBvcnQgb3ZlcmZsb3c6aGlkZGVuIGFuZCB3aWxsIGlnbm9yZSBz
Y3JvbGwvYXV0by4KLSAgICAvLyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZSBzZWN0aW9ucyB3aWxs
IHN1cHBvcnQgYXV0byBhbmQgc2Nyb2xsLgotICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFCi0gICAgICAgIHx8IHN0eWxl
LT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfUk9XKSB7Ci0gICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUgJiYg
c3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURERU4pCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3Zl
cmZsb3dYKE9WSVNJQkxFKTsKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklT
SUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwotICAgIH0KLQotICAgIC8vIE1lbnVsaXN0cyBzaG91
bGQgaGF2ZSB2aXNpYmxlIG92ZXJmbG93Ci0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0g
TWVudWxpc3RQYXJ0KSB7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOwot
ICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKLSAgICB9Ci0KLSAgICAvLyBD
dWxsIG91dCBhbnkgdXNlbGVzcyBsYXllcnMgYW5kIGFsc28gcmVwZWF0IHBhdHRlcm5zIGludG8g
YWRkaXRpb25hbCBsYXllcnMuCi0gICAgc3R5bGUtPmFkanVzdEJhY2tncm91bmRMYXllcnMoKTsK
LSAgICBzdHlsZS0+YWRqdXN0TWFza0xheWVycygpOwotCi0gICAgLy8gRG8gdGhlIHNhbWUgZm9y
IGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25zLgotICAgIHN0eWxlLT5hZGp1c3RBbmltYXRpb25z
KCk7Ci0gICAgc3R5bGUtPmFkanVzdFRyYW5zaXRpb25zKCk7Ci0KLSAgICAvLyBJbXBvcnRhbnQ6
IEludHJpbnNpYyBtYXJnaW5zIGdldCBhZGRlZCB0byBjb250cm9scyBiZWZvcmUgdGhlIHRoZW1l
IGhhcyBhZGp1c3RlZCB0aGUgc3R5bGUsIHNpbmNlIHRoZSB0aGVtZSB3aWxsCi0gICAgLy8gYWx0
ZXIgZm9udHMgYW5kIGhlaWdodHMvd2lkdGhzLgotICAgIGlmIChlICYmIGUtPmlzRm9ybUNvbnRy
b2xFbGVtZW50KCkgJiYgc3R5bGUtPmZvbnRTaXplKCkgPj0gMTEpIHsKLSAgICAgICAgLy8gRG9u
J3QgYXBwbHkgaW50cmluc2ljIG1hcmdpbnMgdG8gaW1hZ2UgYnV0dG9ucy4gVGhlIGRlc2lnbmVy
IGtub3dzIGhvdyBiaWcgdGhlIGltYWdlcyBhcmUsCi0gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8g
dHJlYXQgYWxsIGltYWdlIGJ1dHRvbnMgYXMgdGhvdWdoIHRoZXkgd2VyZSBleHBsaWNpdGx5IHNp
emVkLgotICAgICAgICBpZiAoIWUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpIHx8ICFzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50Kj4oZSktPmlzSW1hZ2VCdXR0b24oKSkKLSAgICAgICAgICAgIGFk
ZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOwotICAgIH0KLQotICAgIC8vIExldCB0aGUgdGhlbWUg
YWxzbyBoYXZlIGEgY3JhY2sgYXQgYWRqdXN0aW5nIHRoZSBzdHlsZS4KLSAgICBpZiAoc3R5bGUt
Pmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5h
ZGp1c3RTdHlsZSh0aGlzLCBzdHlsZSwgZSwgbV9zdGF0ZS5oYXNVQUFwcGVhcmFuY2UoKSwgbV9z
dGF0ZS5ib3JkZXJEYXRhKCksIG1fc3RhdGUuYmFja2dyb3VuZERhdGEoKSwgbV9zdGF0ZS5iYWNr
Z3JvdW5kQ29sb3IoKSk7Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGZpcnN0LWxldHRlciBwc2V1ZG8g
c3R5bGUsIGRvIG5vdCBzaGFyZSB0aGlzIHN0eWxlLgotICAgIGlmIChzdHlsZS0+aGFzUHNldWRv
U3R5bGUoRklSU1RfTEVUVEVSKSkKLSAgICAgICAgc3R5bGUtPnNldFVuaXF1ZSgpOwotCi0gICAg
Ly8gRklYTUU6IHdoZW4gZHJvcHBpbmcgdGhlIC13ZWJraXQgcHJlZml4IG9uIHRyYW5zZm9ybS1z
dHlsZSwgd2Ugc2hvdWxkIGFsc28gaGF2ZSBvcGFjaXR5IDwgMSBjYXVzZSBmbGF0dGVuaW5nLgot
ICAgIGlmIChzdHlsZS0+cHJlc2VydmVzM0QoKSAmJiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9W
SVNJQkxFCi0gICAgICAgIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRQotICAgICAg
ICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkpKQotICAgICAgICBzdHlsZS0+c2V0VHJhbnNmb3JtU3R5
bGUzRChUcmFuc2Zvcm1TdHlsZTNERmxhdCk7Ci0KLSAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIGJl
aGF2ZSBsaWtlIGJsb2Nrcy4gTWFwIHRoZWlyIGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrIHdoZW4g
bWFya2VkIGlubGluZS4KLSAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYg
c3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgJiYgc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1l
bnQqPihlKS0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHkoKSkKLSAgICAgICAgc3R5bGUtPnNldERp
c3BsYXkoSU5MSU5FX0JMT0NLKTsKLQotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKGUgJiYgZS0+
aXNTVkdFbGVtZW50KCkpIHsKLSAgICAgICAgLy8gU3BlYzogaHR0cDovL3d3dy53My5vcmcvVFIv
U1ZHL21hc2tpbmcuaHRtbCNPdmVyZmxvd1Byb3BlcnR5Ci0gICAgICAgIGlmIChzdHlsZS0+b3Zl
cmZsb3dZKCkgPT0gT1NDUk9MTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0hJ
RERFTik7Ci0gICAgICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPQVVUTykKLSAg
ICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwotCi0gICAgICAgIGlmIChz
dHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1NDUk9MTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVy
Zmxvd1goT0hJRERFTik7Ci0gICAgICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBP
QVVUTykKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOwotCi0gICAg
ICAgIC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4gZWxlbWVudCBpbiBhbiBTVkcgZG9jdW1lbnQgZnJh
Z21lbnQgdHJlZSBob25vcnMgY3NzIHBvc2l0aW9uCi0gICAgICAgIGlmICghKGUtPmhhc1RhZ05h
bWUoU1ZHTmFtZXM6OnN2Z1RhZykgJiYgZS0+cGFyZW50Tm9kZSgpICYmICFlLT5wYXJlbnROb2Rl
KCktPmlzU1ZHRWxlbWVudCgpKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihSZW5k
ZXJTdHlsZTo6aW5pdGlhbFBvc2l0aW9uKCkpOwotCi0gICAgICAgIC8vIFJlbmRlclNWR1Jvb3Qg
aGFuZGxlcyB6b29taW5nIGZvciB0aGUgd2hvbGUgU1ZHIHN1YnRyZWUsIHNvIGZvcmVpZ25PYmpl
Y3QgY29udGVudCBzaG91bGQKLSAgICAgICAgLy8gbm90IGJlIHNjYWxlZCBhZ2Fpbi4KLSAgICAg
ICAgaWYgKGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OmZvcmVpZ25PYmplY3RUYWcpKQotICAgICAg
ICAgICAgc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkp
OwotICAgIH0KLSNlbmRpZgotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU3R5
bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCkKLXsKLSAgICAvLyBGSVhNRSAoQlVHIDcyNDcyKTog
V2UgZG9uJ3QgYWRkIEAtd2Via2l0LXJlZ2lvbiBydWxlcyBvZiBzY29wZWQgc3R5bGUgc2hlZXRz
IGZvciB0aGUgbW9tZW50LAotICAgIC8vIHNvIGFsbCByZWdpb24gcnVsZXMgYXJlIGdsb2JhbCBi
eSBkZWZhdWx0LiBWZXJpZnkgd2hldGhlciB0aGF0IGNhbiBzdGFuZCBvciBuZWVkcyBjaGFuZ2lu
Zy4KLQotICAgIHVuc2lnbmVkIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+
bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7Ci0gICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLmF1
dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5n
ZXQoKSk7Ci0gICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMuYXV0aG9y
U3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVn
aW9uRWxlbWVudCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAo
bV9ydWxlU2V0cy51c2VyU3R5bGUoKSkgewotICAgICAgICBydWxlc1NpemUgPSBtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7Ci0gICAgICAgICAg
ICBBU1NFUlQobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxl
U2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsKLSAgICAgICAgICAgIGlmIChjaGVja1JlZ2lvblNl
bGVjdG9yKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNl
dHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQotICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0
aWMgdm9pZCBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSkKLXsK
LSAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOwotICAgIE5vbkNKS0dseXBoT3Jp
ZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKLSAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlv
bihzdHlsZSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKLQotICAgIGNvbnN0
IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uID0gc3R5bGUtPmZvbnREZXNjcmlwdGlv
bigpOwotICAgIGlmIChmb250RGVzY3JpcHRpb24ub3JpZW50YXRpb24oKSA9PSBmb250T3JpZW50
YXRpb24gJiYgZm9udERlc2NyaXB0aW9uLm5vbkNKS0dseXBoT3JpZW50YXRpb24oKSA9PSBnbHlw
aE9yaWVudGF0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBGb250RGVzY3JpcHRpb24gbmV3
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgbmV3Rm9udERlc2NyaXB0aW9u
LnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7Ci0gICAgbmV3Rm9u
dERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmllbnRhdGlvbik7Ci0gICAgc3R5bGUt
PnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OnVwZGF0ZUZvbnQoKQotewotICAgIGlmICghbV9zdGF0ZS5mb250RGlydHkoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHls
ZSgpOwotICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJl
bnRTdHlsZSgpKTsKLSAgICBjaGVja0Zvclpvb21DaGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50
U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShzdHlsZSk7Ci0gICAgc3R5
bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOwotICAgIG1fc3RhdGUuc2V0Rm9udERp
cnR5KGZhbHNlKTsKLX0KLQotUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6
c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUp
Ci17Ci0gICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KGUsIE5PUFNFVURPLCBy
dWxlc1RvSW5jbHVkZSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2
ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzZXVkb0lkIHBzZXVk
b0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKLXsKLSAgICBpZiAoIWUgfHwgIWUtPmRvY3Vt
ZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7Ci0KLSAg
ICBpbml0RWxlbWVudChlKTsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1l
bnQoKSwgZSwgMCwgcHNldWRvSWQpOwotCi0gICAgTWF0Y2hSZXN1bHQgZHVtbXk7Ci0gICAgaWYg
KHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMpIHsKLSAgICAgICAgLy8gRmlyc3Qg
d2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICAgICAgbWF0Y2hV
QVJ1bGVzKGR1bW15KTsKLQotICAgICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxl
cy4KLSAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICAgICAg
bWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0g
ICAgfQotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5j
bHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAgICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5P
bmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7Ci0KLSAgICAgICAg
Ly8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCi0gICAgICAgIG1hdGNoQXV0aG9y
UnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0KLSAgICAgICAg
bV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxzZSk7Ci0gICAgfQotCi0gICAgbV9zdGF0ZS5z
ZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwotCi0gICAgcmV0dXJuIG1f
c3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1
bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSog
c2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9y
QXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLQotICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgewot
ICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNl
dWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNl
dWRvSWQgIT0gTk9QU0VVRE8pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8v
IFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNo
ZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgotICAgICAg
ICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hl
Y2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVj
dG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hU
TUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2Vs
ZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYm
ICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5z
ZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgocnVsZURh
dGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFzZWxlY3RvckNo
ZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVja2VyRmFz
dFBhdGgubWF0Y2hlcygpOwotICAgIH0KLQotICAgIC8vIFNsb3cgcGF0aC4KLSAgICBTZWxlY3Rv
ckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUoKSk7Ci0gICAg
U2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1bGVEYXRh
LnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0
Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxlKCk7Ci0g
ICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAgIGNvbnRleHQucHNldWRvSWQgPSBzdGF0ZS5w
c2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsKLSAgICBjb250ZXh0LnNjcm9sbGJhciA9IHN0
YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhcjsKLSAgICBjb250ZXh0LnNjcm9sbGJh
clBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0OwotICAgIGNv
bnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OwotICAgIFNlbGVj
dG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwg
ZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOwotICAgIGlmICht
YXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBO
T1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBkeW5hbWlj
UHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJv
b2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3Rvciog
cmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCi17Ci0gICAgaWYgKCFyZWdp
b25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX3N0YXRlLm1v
ZGUoKSk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBz
OyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKSB7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tl
cjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRleHQocywgcmVn
aW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxlZCk7Ci0gICAg
ICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYg
KHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwgaWdub3JlRHlu
YW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNlbGVjdG9yQ2hl
Y2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0vLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1ZmYgb24gaG93IHRvIGFwcGx5IGEgY2VydGFp
biBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgotCi1MZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29u
dmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVy
U3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikK
LXsKLSAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRv
TGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1
bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdl
Q29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZp
bmVkKTsKLX0KLQotTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0TGVuZ3RoKENT
U1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5k
ZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKLXsKLSAgICByZXR1cm4gcHJp
bWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkRmxvYXRD
b252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8IEZy
YWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0eWxlLCBy
b290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Ci19Ci0KLXRlbXBsYXRl
IDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotdm9pZCBTdHlsZVJl
c29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGll
cywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHks
IFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCi17Ci0gICAgQVNT
RVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24pIHx8
IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsKLSAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUHJvY2Vzc1J1
bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0KLSAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50
ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJv
cGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5QXQoaSk7Ci0gICAg
ICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50LmlzSW1wb3J0YW50KCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgaWYgKGluaGVyaXRlZE9ubHkgJiYgIWN1cnJlbnQuaXNJbmhl
cml0ZWQoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGV4cGxp
Y2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFwcGx5IGZ1cnRoZXIgbm9uLWluaGVyaXRlZCBw
cm9wZXJ0aWVzCi0gICAgICAgICAgICAvLyBhcyB0aGV5IG1pZ2h0IG92ZXJyaWRlIHRoZSB2YWx1
ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvbid0IGFsbG93IGRlY2xhcmF0
aW9ucyB3aXRoCi0gICAgICAgICAgICAvLyBleHBsaWNpdGx5IGluaGVyaXRlZCBwcm9wZXJ0aWVz
IHRvIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIEFTU0VSVCghY3VycmVudC52YWx1ZSgpLT5pc0lu
aGVyaXRlZFZhbHVlKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1cnJlbnQuaWQoKTsKLQotICAgICAgICBpZiAo
cHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uICYmICFTdHls
ZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgICAgIGlmIChwcm9w
ZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RDdWUgJiYgIVN0eWxlUmVzb2x2
ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotI2VuZGlmCi0gICAgICAgIHN3aXRjaCAocGFzcykgewotI2lmIEVOQUJMRShDU1NfVkFS
SUFCTEVTKQotICAgICAgICBjYXNlIFZhcmlhYmxlRGVmaW5pdGlvbnM6Ci0gICAgICAgICAgICBD
T01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlhYmxlIDwgZmlyc3RDU1NQcm9wZXJ0eSwgQ1NT
X3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9wZXJ0eSk7Ci0gICAgICAgICAgICBpZiAocHJv
cGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKLSAgICAgICAgICAgICAgICBhcHBseVByb3Bl
cnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
I2VuZGlmCi0gICAgICAgIGNhc2UgSGlnaFByaW9yaXR5UHJvcGVydGllczoKLSAgICAgICAgICAg
IENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVydHkgPT0gQ1NTUHJvcGVydHlDb2xvciwgQ1NT
X2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENT
U1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNvbG9yICsgMTcsIENTU196b29tX2lzX2VuZF9v
Zl9maXJzdF9wcm9wX3JhbmdlKTsKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3Bl
cnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpvb20gKyAxLCBDU1NfbGluZV9oZWlnaHRfaXNf
YWZ0ZXJfem9vbSk7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAgICAgICBpZiAo
cHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSNlbmRpZgotICAgICAgICAgICAgLy8gZ2l2ZSBzcGVjaWFsIHByaW9yaXR5IHRvIGZvbnQt
eHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA8IENT
U1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJl
bnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIHdlIGFwcGx5IGxpbmUt
aGVpZ2h0IGxhdGVyCi0gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0
eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
Y3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExvd1By
aW9yaXR5UHJvcGVydGllczoKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA+IENTU1Byb3BlcnR5
TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwg
Y3VycmVudC52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tpZSk7Ci19Ci0KLXRlbXBsYXRlIDxTdHlsZVJl
c29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotdm9pZCBTdHlsZVJlc29sdmVyOjph
cHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgYm9v
bCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0
ZWRPbmx5KQotewotICAgIGlmIChzdGFydEluZGV4ID09IC0xKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5pbnNp
ZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgewotICAgICAgICBmb3IgKGludCBpID0gc3RhcnRJ
bmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBNYXRjaGVkUHJv
cGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGll
c1tpXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBtYXRjaGVkUHJvcGVy
dGllcy5saW5rTWF0Y2hUeXBlOwotICAgICAgICAgICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5p
Y2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRzIGJ1dCB0aGF0IHJlcXVpcmVzIGNoYW5nZXMg
aW4gbWFueSBwbGFjZXMuCi0gICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1
bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hMaW5rKTsKLSAg
ICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUobGlua01h
dGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hWaXNpdGVkKTsKLQotICAgICAgICAgICAg
YXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCks
IG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHks
IHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hp
dGVsaXN0VHlwZSkpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlU
b1JlZ3VsYXJTdHlsZSh0cnVlKTsKLSAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlz
aXRlZExpbmtTdHlsZShmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChp
bnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgewotICAgICAgICBjb25zdCBN
YXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllc1tpXTsKLSAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9w
ZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJ
bXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlw
ZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOwotICAgIH0KLX0KLQotdW5zaWdu
ZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRj
aGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICAKLSAgICBy
ZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KHByb3BlcnRpZXMsIHNpemVvZihNYXRjaGVk
UHJvcGVydGllcykgKiBzaXplKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVz
b2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYg
YikKLXsKLSAgICByZXR1cm4gYS5maXJzdFVBUnVsZSA9PSBiLmZpcnN0VUFSdWxlCi0gICAgICAg
ICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1bGUKLSAgICAgICAgJiYgYS5maXJzdEF1dGhv
clJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0QXV0aG9yUnVsZSA9
PSBiLmxhc3RBdXRob3JSdWxlCi0gICAgICAgICYmIGEuZmlyc3RVc2VyUnVsZSA9PSBiLmZpcnN0
VXNlclJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VXNlclJ1bGUgPT0gYi5sYXN0VXNlclJ1bGU7Ci19
Ci0KLWJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCi17Ci0gICAgcmV0dXJuICEoYSA9
PSBiKTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQ
cm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYikK
LXsKLSAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09IGIucHJvcGVydGllcyAmJiBhLmxpbmtNYXRj
aFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOwotfQotCi1ib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5
bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzJiBiKQotewotICAgIHJldHVybiAhKGEgPT0gYik7Ci19Ci0KLWNvbnN0
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBTdHlsZVJlc29sdmVy
OjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0
Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQotewotICAgIEFTU0VSVChoYXNoKTsKLQotICAgIE1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hl
LmZpbmQoaGFzaCk7Ci0gICAgaWYgKGl0ID09IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5lbmQo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0mIGNh
Y2hlSXRlbSA9IGl0LT52YWx1ZTsKLQotICAgIHNpemVfdCBzaXplID0gbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOwotICAgIGlmIChzaXplICE9IGNhY2hlSXRlbS5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXNbaV0pCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNhY2hlSXRlbS5yYW5nZXMgIT0gbWF0Y2hSZXN1
bHQucmFuZ2VzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gJmNhY2hlSXRlbTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3Qg
UmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2ln
bmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKLXsKLSAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dl
ZXBzID0gMTAwOwotICAgIGlmICgrK21fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1Np
bmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3
ZWVwcwotICAgICAgICAmJiAhbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lci5pc0Fj
dGl2ZSgpKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVjbGFyYXRp
b25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYwOwotICAgICAgICBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hvdChtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3
ZWVwVGltZUluU2Vjb25kcyk7Ci0gICAgfQotCi0gICAgQVNTRVJUKGhhc2gpOwotICAgIE1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRlbTsKLSAgICBjYWNoZUl0ZW0ubWF0Y2hlZFBy
b3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzKTsKLSAgICBjYWNo
ZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFuZ2VzOwotICAgIC8vIE5vdGUgdGhhdCB3ZSBk
b24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVyU3R5bGUgaW5zdGFuY2UuIEl0IG1heSBiZSBm
dXJ0aGVyIG1vZGlmaWVkLgotICAgIC8vIFRoZSBSZW5kZXJTdHlsZSBpbiB0aGUgY2FjaGUgaXMg
cmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBzdWJzdHJ1Y3R1cmVzIGFuZCBuZXZlciB1c2Vk
IGFzLWlzLgotICAgIGNhY2hlSXRlbS5yZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShz
dHlsZSk7Ci0gICAgY2FjaGVJdGVtLnBhcmVudFJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNs
b25lKHBhcmVudFN0eWxlKTsKLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYWRkKGhhc2gs
IGNhY2hlSXRlbSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6aW52YWxpZGF0ZU1hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGUoKQotewotICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5jbGVhcigp
OwotfQotCi1zdGF0aWMgYm9vbCBpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShj
b25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFJl
bmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAgICAvLyBGSVhNRTogQ1NTUHJvcGVydHlXZWJr
aXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3aGVuIGFwcGx5aW5nIHRvIGRvY3VtZW50IGVs
ZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5aW5nIGJ5IGNhY2hpbmcuCi0gICAgaWYgKGVs
ZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgJiYgZWxlbWVu
dC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlxdWUoKSB8fCAoc3R5bGUtPnN0eWxl
VHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0eWxlLT51bmlxdWUoKSkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+em9vbSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFs
Wm9vbSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT53cml0aW5nTW9k
ZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIC8vIFRoZSBjYWNoZSBhc3N1bWVzIHN0YXRpYyBrbm93bGVkZ2UgYWJvdXQg
d2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkLgotICAgIGlmIChwYXJlbnRTdHlsZS0+aGFz
RXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBFbGVtZW50KiBl
bGVtZW50KQotewotICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0
YXRlOwotICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IG1hdGNoUmVzdWx0LmlzQ2FjaGVhYmxlID8g
Y29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkgOiAwOwotICAg
IGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0gICAgY29uc3QgTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7Ci0gICAgaWYgKGNhY2hlSGFzaCAmJiAoY2Fj
aGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNhY2hlSGFzaCwgbWF0Y2hS
ZXN1bHQpKSkgewotICAgICAgICAvLyBXZSBjYW4gYnVpbGQgdXAgdGhlIHN0eWxlIGJ5IGNvcHlp
bmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gYW4gZWFybGllciBzdHlsZSBvYmplY3Qg
YnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKLSAgICAgICAgLy8gc3R5bGUgZGVjbGFyYXRpb25z
LiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMsIGlm
IGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBlbmQgb24gdGhlIAotICAgICAgICAvLyBlbGVt
ZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQgc2F2ZXMgbWVtb3J5IGJ5IHJldXNpbmcgdGhl
IHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y29weU5vbklu
aGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7Ci0gICAgICAgIGlmIChz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWREYXRhU2hhcmVkKGNhY2hlSXRlbS0+cGFyZW50
UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkpIHsKLSAg
ICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0dXMgPSBzdGF0ZS5zdHlsZSgpLT5pbnNpZGVM
aW5rKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgY2FjaGUgaXRlbSBwYXJlbnQgc3R5bGUgaGFz
IGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwYXJlbnQgc3R5
bGUgdGhlbiB0aGUKLSAgICAgICAgICAgIC8vIHJlc3VsdGluZyBzdHlsZSB3aWxsIGJlIGlkZW50
aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG92ZXIgZnJvbSB0aGUg
Y2FjaGUgYW5kIGFyZSBkb25lLgotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZy
b20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFVuZm9y
dHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmhlcml0ZWQgcHJv
cGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSByZXN0b3JlIGl0LgotICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgfQotICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSB0cnVlOyAKLSAgICB9
Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAvLyBGaXJzdCBhcHBseSBhbGwgdmFy
aWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5IGJlIHVzZWQgZHVyaW5nIGFwcGxpY2F0aW9u
IG9mIGxhdGVyIHByb3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJs
ZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RB
dXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRp
ZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBs
eUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZp
bml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0j
ZW5kaWYKLQotICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgbWF0Y2hlZCBydWxlcyBpbiB0
aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhlIHJ1bGVzIGFuZCBhcHBseQotICAgIC8vIGhp
Z2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwgaS5lLiwgdGhvc2UgcHJvcGVydGllcyB0aGF0
IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgotICAgIC8vIFRoZSBvcmRlciBpcyAoMSkgaGln
aC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikgaGlnaC1wcmlvcml0eSBpbXBvcnRhbnQsICgz
KSBub3JtYWwgbm90IGltcG9ydGFudAotICAgIC8vIGFuZCAoNCkgbm9ybWFsIGltcG9ydGFudC4K
LSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVy
dGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNo
UmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7
Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRj
aFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFw
cGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQs
IHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5n
ZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNo
UmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7Ci0KLSAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+
cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVa
b29tKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0Rm9udERpcnR5KHRydWUpOwotICAgICAgICBhcHBs
eUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3Qg
ZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwot
Ci0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBv
biB0aGUgZm9udC1zaXplLgotICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKLSAgICAg
ICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRW
YWx1ZSgpKTsKLQotICAgIC8vIE1hbnkgcHJvcGVydGllcyBkZXBlbmQgb24gdGhlIGZvbnQuIElm
IGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwgcHJvcGVydGllcy4KLSAgICBpZiAoY2FjaGVJ
dGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmZvbnREZXNjcmlwdGlvbigpICE9IHN0YXRl
LnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQotICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkg
PSBmYWxzZTsKLQotICAgIC8vIE5vdyBkbyB0aGUgbm9ybWFsIHByaW9yaXR5IFVBIHByb3BlcnRp
ZXMuCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1h
dGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJl
c3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICAKLSAgICAv
LyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3JvdW5kIHNvIHRoYXQgd2UgY2FuIGV4YW1pbmUg
dGhlbSBsYXRlci4KLSAgICBzdGF0ZS5jYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKLSAgICAK
LSAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQgdXNlciBub3JtYWwgcHJpb3JpdHkgcHJvcGVy
dGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHByb3BlcnRpZXMuCi0gICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAxLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRo
b3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8
TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5
SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVBy
b3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1
bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
ICAgCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0
eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0gICAgCi0gICAgQVNTRVJUKCFzdGF0
ZS5mb250RGlydHkoKSk7Ci0gICAgCi0gICAgaWYgKGNhY2hlSXRlbSB8fCAhY2FjaGVIYXNoKQot
ICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXND
YWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCkp
KQotICAgICAgICByZXR1cm47Ci0gICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRl
LnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpOwot
fQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBTdHlsZVJ1bGVQ
YWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCi17Ci0gICAgcmV0dXJuIHIxLT5zZWxl
Y3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCk7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29u
c3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBpZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7Ci0gICAgbWF0
Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwg
aXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKLSAgICBpZiAobWF0Y2hlZFBhZ2VS
dWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN0ZDo6c3RhYmxlX3NvcnQo
bWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJl
UGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1
bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1h
dGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNr
UGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wg
aXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsK
LSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9u
ZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgewotICAgICAgICBpZiAo
Y29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKLSAgICAgICAgICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2Fs
TmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5h
bWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9
Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVu
dC0+cHNldWRvVHlwZSgpOwotICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6
OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5
cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQotICAgICAg
ICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAh
aXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxl
cywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3R5bGVSdWxl
UGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0gICAgICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JD
b21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdl
TmFtZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBJZiB0aGUgcnVsZSBo
YXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCi0gICAgICAgIGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAg
ICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1h
dGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Ci0gICAgfQot
fQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QK
LXsKLSAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9IGZhbHNlOwotICAgIGlmICghbV9zdGF0ZS5y
b290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgaXNG
aXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQ
YWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzRmlyc3RQ
YWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9y
Y2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBm
aXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBhZ2VJbmRleCk7Ci19Ci0KLVN0cmluZyBTdHlsZVJl
c29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAotewotICAgIC8vIEZJ
WE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KLSAgICByZXR1
cm4gIiI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NT
UHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0g
ICAgaW5pdEVsZW1lbnQoMCk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3Vt
ZW50KCksIDAsIHN0eWxlKTsKLSAgICBtX3N0YXRlLnNldFN0eWxlKHN0eWxlKTsKLSAgICBhcHBs
eVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZhbHVlKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFs
dWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0eShpZCwg
dmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlclRvcENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0
cm9rZUNvbG9yOgotI2lmIEVOQUJMRShTVkcpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUZpbGw6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVN0cm9rZToKLSNlbmRpZgotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLS8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtcmVnaW9ucy8jdGhlLWF0LXJl
Z2lvbi1zdHlsZS1ydWxlCi0vLyBGSVhNRTogYWRkIGluY3JlbWVudGFsIHN1cHBvcnQgZm9yIG90
aGVyIHJlZ2lvbiBzdHlsaW5nIHByb3BlcnRpZXMuCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
Ojppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3
aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlDb2xvcjoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWYgRU5B
QkxFKFZJREVPX1RSQUNLKQotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNWYWxpZEN1ZVN0
eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKLXsKLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRBdHRhY2htZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZFBvc2l0aW9uWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0
aW9uWToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRSZXBlYXRZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUZvbnRGYW1pbHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRWYXJp
YW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlMaW5lSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlPdXRsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxp
bmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlWaXNpYmlsaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4
dFNoYWRvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3R5bGU6Ci0gICAgICAgIHJldHVy
biB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0jZW5kaWYKLS8vIFNWRyBoYW5kbGVzIHpvb21pbmcgaW4gYSBkaWZmZXJlbnQg
d2F5IGNvbXBhcmVkIHRvIENTUy4gVGhlIHdob2xlIGRvY3VtZW50IGlzIHNjYWxlZCBpbnN0ZWFk
Ci0vLyBvZiBlYWNoIGluZGl2aWR1YWwgbGVuZ3RoIHZhbHVlIGluIHRoZSByZW5kZXIgc3R5bGUg
LyB0cmVlLiBDU1NQcmltaXRpdmVWYWx1ZTo6Y29tcHV0ZUxlbmd0aCooKQotLy8gbXVsdGlwbGll
cyBlYWNoIHJlc29sdmVkIGxlbmd0aCB3aXRoIHRoZSB6b29tIG11bHRpcGxpZXIgLSBzbyBmb3Ig
U1ZHIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGF0LgotLy8gVGhvdWdoIGFsbCBDU1MgdmFsdWVzIHRo
YXQgY2FuIGJlIGFwcGxpZWQgdG8gb3V0ZXJtb3N0IDxzdmc+IGVsZW1lbnRzICh3aWR0aC9oZWln
aHQvYm9yZGVyL3BhZGRpbmcuLi4pCi0vLyBuZWVkIHRvIHJlc3BlY3QgdGhlIHNjYWxpbmcuIFJl
bmRlckJveCAodGhlIHBhcmVudCBjbGFzcyBvZiBSZW5kZXJTVkdSb290KSBncmFicyB2YWx1ZXMg
bGlrZQotLy8gd2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5nLy4uLiBmcm9tIHRoZSBSZW5kZXJT
dHlsZSAtPiBmb3IgU1ZHIHRoZXNlIHZhbHVlcyB3b3VsZCBuZXZlciBzY2FsZSwKLS8vIGlmIHdl
J2QgcGFzcyBhIDEuMCB6b29tIGZhY3RvciBldmVyeWh3ZXJlLiBTbyB3ZSBvbmx5IHBhc3MgYSB6
b29tIGZhY3RvciBvZiAxLjAgZm9yIHNwZWNpZmljCi0vLyBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5P
VCBhbGxvd2VkIHRvIHNjYWxlIHdpdGhpbiBhIHpvb21lZCBTVkcgZG9jdW1lbnQgKGxldHRlci93
b3JkLXNwYWNpbmcvZm9udC1zaXplKS4KLWJvb2wgU3R5bGVSZXNvbHZlcjo6dXNlU1ZHWm9vbVJ1
bGVzKCkKLXsKLSAgICByZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCkgJiYgbV9zdGF0ZS5lbGVtZW50
KCktPmlzU1ZHRWxlbWVudCgpOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tCcmVh
ZHRoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZl
cjo6U3RhdGUmIHN0YXRlLCBMZW5ndGgmIHdvcmtpbmdMZW5ndGgpCi17Ci0gICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlV2Via2l0TWluQ29udGVudCkgewotICAg
ICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3RoKE1pbkNvbnRlbnQpOwotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NT
VmFsdWVXZWJraXRNYXhDb250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdMZW5ndGggPSBMZW5ndGgo
TWF4Q29udGVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHdvcmtpbmdM
ZW5ndGggPSBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZl
cnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24g
fCBBdXRvQ29udmVyc2lvbj4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LCBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOwotICAgIGlmICh3b3JraW5nTGVuZ3Ro
LmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+aXNMZW5ndGgoKSkKLSAgICAgICAgd29ya2luZ0xlbmd0aC5zZXRRdWlyayhwcmlt
aXRpdmVWYWx1ZS0+aXNRdWlya1ZhbHVlKCkpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0
YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja01pbk1heChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0
aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgR3JpZFRyYWNrU2l6
ZSYgdHJhY2tTaXplKQotewotICAgIFBhaXIqIG1pbk1heFRyYWNrQnJlYWR0aCA9IHByaW1pdGl2
ZVZhbHVlLT5nZXRQYWlyVmFsdWUoKTsKLSAgICBpZiAoIW1pbk1heFRyYWNrQnJlYWR0aCkgewot
ICAgICAgICBMZW5ndGggd29ya2luZ0xlbmd0aDsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJh
Y2tCcmVhZHRoKHByaW1pdGl2ZVZhbHVlLCBzdGF0ZSwgd29ya2luZ0xlbmd0aCkpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdHJhY2tTaXplLnNldExlbmd0aCh3b3JraW5n
TGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgTGVuZ3RoIG1pblRy
YWNrQnJlYWR0aDsKLSAgICBMZW5ndGggbWF4VHJhY2tCcmVhZHRoOwotICAgIGlmICghY3JlYXRl
R3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFkdGgtPmZpcnN0KCksIHN0YXRlLCBtaW5U
cmFja0JyZWFkdGgpIHx8ICFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0
aC0+c2Vjb25kKCksIHN0YXRlLCBtYXhUcmFja0JyZWFkdGgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICB0cmFja1NpemUuc2V0TWluTWF4KG1pblRyYWNrQnJlYWR0aCwgbWF4VHJhY2tC
cmVhZHRoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRy
YWNrR3JvdXAoQ1NTVmFsdWUqIHZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3Rh
dGUsIFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcykKLXsKLSAgICBpZiAoIXZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBmb3IgKENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0g
ICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgIGlmICghY3Vy
clZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgR3JpZFRyYWNrU2l6ZSB0cmFja1NpemU7Ci0gICAgICAgIGlmICghY3JlYXRlR3Jp
ZFRyYWNrTWluTWF4KHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oY3VyclZhbHVlKSwg
c3RhdGUsIHRyYWNrU2l6ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
dHJhY2tTaXplcy5hcHBlbmQodHJhY2tTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0xpc3QoQ1NTVmFsdWUqIHZhbHVlLCBWZWN0
b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRl
JiBzdGF0ZSkKLXsKLSAgICAvLyBIYW5kbGUgJ25vbmUnLgotICAgIGlmICh2YWx1ZS0+aXNQcmlt
aXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1
ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwotICAgICAgICByZXR1
cm4gcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lOwotICAgIH0KLQot
ICAgIHJldHVybiBjcmVhdGVHcmlkVHJhY2tHcm91cCh2YWx1ZSwgc3RhdGUsIHRyYWNrU2l6ZXMp
OwotfQotCi0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRQb3NpdGlvbihDU1NWYWx1ZSogdmFsdWUs
IEdyaWRQb3NpdGlvbiYgcG9zaXRpb24pCi17Ci0gICAgLy8gRm9yIG5vdywgd2Ugb25seSBhY2Nl
cHQ6IDxpbnRlZ2VyPiB8ICdhdXRvJwotICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1p
dGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihwcmlt
aXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSk7Ci0gICAgcG9zaXRpb24uc2V0SW50ZWdlclBvc2l0aW9u
KHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
I2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotc3RhdGljIGJvb2wgaGFzVmFyaWFibGVSZWZlcmVu
Y2UoQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgp
KSB7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwotICAgICAgICByZXR1cm4gcHJpbWl0aXZl
VmFsdWUtPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlLT5p
c0NhbGN1bGF0aW9uVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENTU0NhbGNW
YWx1ZSo+KHZhbHVlKS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKLQotICAgIGlmICh2YWx1ZS0+
aXNSZWZsZWN0VmFsdWUoKSkgewotICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxlY3RWYWx1
ZSA9IHN0YXRpY19jYXN0PENTU1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIGRpcmVjdGlvbiA9IHJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCk7Ci0gICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBvZmZzZXQgPSByZWZsZWN0VmFsdWUtPm9mZnNldCgpOwot
ICAgICAgICBDU1NWYWx1ZSogbWFzayA9IHJlZmxlY3RWYWx1ZS0+bWFzaygpOwotICAgICAgICBy
ZXR1cm4gKGRpcmVjdGlvbiAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShkaXJlY3Rpb24pKSB8fCAo
b2Zmc2V0ICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKG9mZnNldCkpIHx8IChtYXNrICYmIGhhc1Zh
cmlhYmxlUmVmZXJlbmNlKG1hc2spKTsKLSAgICB9Ci0KLSAgICBmb3IgKENTU1ZhbHVlTGlzdEl0
ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgIGlm
IChoYXNWYXJpYWJsZVJlZmVyZW5jZShpLnZhbHVlKCkpKQotICAgICAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OnJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBWZWN0
b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNzaW9ucykK
LXsKLSAgICBzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiBleHByZXNzaW9uKGlkLCB2
YWx1ZS0+c2VyaWFsaXplUmVzb2x2aW5nVmFyaWFibGVzKCptX3N0YXRlLnN0eWxlKCktPnZhcmlh
YmxlcygpKSk7Ci0KLSAgICBpZiAoa25vd25FeHByZXNzaW9ucy5jb250YWlucyhleHByZXNzaW9u
KSkKLSAgICAgICAgcmV0dXJuOyAvLyBjeWNsZSBkZXRlY3RlZC4KLQotICAgIGtub3duRXhwcmVz
c2lvbnMuYXBwZW5kKGV4cHJlc3Npb24pOwotCi0gICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIGZh
c3RlciBub3QgdG8gcmUtcGFyc2UgZnJvbSBzdHJpbmdzLCBidXQgZm9yIG5vdyBDU1MgcHJvcGVy
dHkgdmFsaWRhdGlvbiBsaXZlcyBpbnNpZGUgdGhlIHBhcnNlciBzbyB3ZSBkbyBpdCB0aGVyZS4K
LSAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcmVzdWx0U2V0ID0gU3R5bGVQcm9wZXJ0eVNl
dDo6Y3JlYXRlKCk7Ci0gICAgaWYgKCFDU1NQYXJzZXI6OnBhcnNlVmFsdWUocmVzdWx0U2V0Lmdl
dCgpLCBpZCwgZXhwcmVzc2lvbi5zZWNvbmQsIGZhbHNlLCBkb2N1bWVudCgpKSkKLSAgICAgICAg
cmV0dXJuOyAvLyBleHByZXNzaW9uIGZhaWxlZCB0byBwYXJzZS4KLQotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCByZXN1bHRTZXQtPnByb3BlcnR5Q291bnQoKTsgaSsrKSB7Ci0gICAgICAg
IFN0eWxlUHJvcGVydHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIHByb3BlcnR5ID0gcmVzdWx0U2V0
LT5wcm9wZXJ0eUF0KGkpOwotICAgICAgICBpZiAocHJvcGVydHkuaWQoKSAhPSBDU1NQcm9wZXJ0
eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHByb3BlcnR5LnZhbHVlKCkpKQotICAg
ICAgICAgICAgcmVzb2x2ZVZhcmlhYmxlcyhwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0eS52YWx1ZSgp
LCBrbm93bkV4cHJlc3Npb25zKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXBwbHlQcm9w
ZXJ0eShwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0eS52YWx1ZSgpKTsKLSAgICB9Ci19Ci0jZW5kaWYK
LQotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQsIENT
U1ZhbHVlKiB2YWx1ZSkKLXsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICBpZiAoaWQg
IT0gQ1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZSh2YWx1ZSkpIHsK
LSAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4ga25vd25F
eHByZXNzaW9uczsKLSAgICAgICAgcmVzb2x2ZVZhcmlhYmxlcyhpZCwgdmFsdWUsIGtub3duRXhw
cmVzc2lvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBDU1Mg
dmFyaWFibGVzIGRvbid0IHJlc29sdmUgc2hvcnRoYW5kcyBhdCBwYXJzaW5nIHRpbWUsIHNvIHRo
aXMgc2hvdWxkIGJlICphZnRlciogaGFuZGxpbmcgdmFyaWFibGVzLgotICAgIEFTU0VSVF9XSVRI
X01FU1NBR0UoIWlzRXhwYW5kZWRTaG9ydGhhbmQoaWQpLCAiU2hvcnRoYW5kIHByb3BlcnR5IGlk
ID0gJWQgd2Fzbid0IGV4cGFuZGVkIGF0IHBhcnNpbmcgdGltZSIsIGlkKTsKLQotICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgYm9vbCBpc0luaGVyaXQgPSBzdGF0ZS5wYXJlbnROb2Rl
KCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUoKTsKLSAgICBib29sIGlzSW5pdGlhbCA9IHZh
bHVlLT5pc0luaXRpYWxWYWx1ZSgpIHx8ICghc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5p
c0luaGVyaXRlZFZhbHVlKCkpOwotCi0gICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgIWlzSW5pdGlh
bCk7IC8vIGlzSW5oZXJpdCAtPiAhaXNJbml0aWFsICYmIGlzSW5pdGlhbCAtPiAhaXNJbmhlcml0
Ci0gICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5w
YXJlbnRTdHlsZSgpKSk7IC8vIGlzSW5oZXJpdCAtPiAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0
YXRlLnBhcmVudFN0eWxlKCkpCi0KLSAgICBpZiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1JlZ3Vs
YXJTdHlsZSgpICYmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIHx8
ICFpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShpZCkpKSB7Ci0gICAgICAgIC8vIExpbWl0IHRo
ZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gb25seSB0aGUgb25lcyBob25vcmVk
IGJ5IDp2aXNpdGVkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGlzSW5oZXJp
dCAmJiAhc3RhdGUucGFyZW50U3R5bGUoKS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRp
ZXMoKSAmJiAhQ1NTUHJvcGVydHk6OmlzSW5oZXJpdGVkUHJvcGVydHkoaWQpKQotICAgICAgICBz
dGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRIYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygp
OwotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgaWYgKGlkID09IENTU1Byb3BlcnR5
VmFyaWFibGUpIHsKLSAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04odmFs
dWUtPmlzVmFyaWFibGVWYWx1ZSgpKTsKLSAgICAgICAgQ1NTVmFyaWFibGVWYWx1ZSogdmFyaWFi
bGUgPSBzdGF0aWNfY2FzdDxDU1NWYXJpYWJsZVZhbHVlKj4odmFsdWUpOwotICAgICAgICBBU1NF
UlQoIXZhcmlhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgQVNTRVJUKCF2YXJpYWJs
ZS0+dmFsdWUoKS5pc0VtcHR5KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRWYXJpYWJs
ZSh2YXJpYWJsZS0+bmFtZSgpLCB2YXJpYWJsZS0+dmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIENoZWNrIGxvb2t1cCB0YWJsZSBmb3IgaW1wbGVtZW50
YXRpb25zIGFuZCB1c2Ugd2hlbiBhdmFpbGFibGUuCi0gICAgY29uc3QgUHJvcGVydHlIYW5kbGVy
JiBoYW5kbGVyID0gbV9zdHlsZUJ1aWxkZXIucHJvcGVydHlIYW5kbGVyKGlkKTsKLSAgICBpZiAo
aGFuZGxlci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkKLSAgICAgICAgICAg
IGhhbmRsZXIuYXBwbHlJbmhlcml0VmFsdWUoaWQsIHRoaXMpOwotICAgICAgICBlbHNlIGlmIChp
c0luaXRpYWwpCi0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5pdGlhbFZhbHVlKGlkLCB0aGlz
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGFuZGxlci5hcHBseVZhbHVlKGlkLCB0aGlz
LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDU1NQcmltaXRpdmVWYWx1
ZSogcHJpbWl0aXZlVmFsdWUgPSB2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpID8gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSkgOiAwOwotCi0gICAgZmxvYXQgem9vbUZhY3Rv
ciA9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKLQotICAgIC8vIFdoYXQgZm9sbG93
cyBpcyBhIGxpc3QgdGhhdCBtYXBzIHRoZSBDU1MgcHJvcGVydGllcyBpbnRvIHRoZWlyIGNvcnJl
c3BvbmRpbmcgZnJvbnQtZW5kCi0gICAgLy8gUmVuZGVyU3R5bGUgdmFsdWVzLgotICAgIHN3aXRj
aCAoaWQpIHsKLSAgICAvLyBsaXN0cwotICAgIGNhc2UgQ1NTUHJvcGVydHlDb250ZW50OgotICAg
ICAgICAvLyBsaXN0IG9mIHN0cmluZywgdXJpLCBjb3VudGVyLCBhdHRyLCBpCi0gICAgICAgIHsK
LSAgICAgICAgICAgIC8vIEZJWE1FOiBJbiBDU1MzLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGlu
aGVyaXQgY29udGVudC4gSW4gQ1NTMiBpdCBpcyBub3QuIFRoaXMKLSAgICAgICAgICAgIC8vIG5v
dGUgaXMgYSByZW1pbmRlciB0aGF0IGV2ZW50dWFsbHkgImluaGVyaXQiIG5lZWRzIHRvIGJlIHN1
cHBvcnRlZC4KLQotICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPmNsZWFyQ29udGVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGJvb2wgZGlkU2V0ID0gZmFs
c2U7Ci0gICAgICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5o
YXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0g
PSBpLnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzSW1hZ2VHZW5lcmF0b3JW
YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0dyYWRpZW50VmFsdWUo
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoU3R5
bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFsdWUqPihp
dGVtKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpLCBkaWRTZXQpOwot
ICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2Fz
dDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4oaXRlbSkpLCBkaWRTZXQpOwotICAgICAgICAgICAg
ICAgICAgICBkaWRTZXQgPSB0cnVlOwotI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQotICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+aXNJbWFnZVNldFZhbHVlKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChzZXRPclBlbmRpbmdGcm9tVmFs
dWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVlKj4oaXRl
bSkpLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotI2VuZGlm
Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzSW1hZ2VW
YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
Y2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8
Q1NTSW1hZ2VWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlk
U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0g
ICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIGNvbnRlbnRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
aXRlbSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY29udGVudFZh
bHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAg
ICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1
ZS0+aXNBdHRyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IENhbiBhIG5hbWVz
cGFjZSBiZSBzcGVjaWZpZWQgZm9yIGFuIGF0dHIoZm9vKT8KLSAgICAgICAgICAgICAgICAgICAg
aWYgKHN0YXRlLnN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPKQotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhcmVudFN0eWxlKCktPnNl
dFVuaXF1ZSgpOwotICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIGF0dHIobnVsbEF0
b20sIGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIG51bGxBdG9tKTsKLSAg
ICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRlLmVsZW1l
bnQoKS0+Z2V0QXR0cmlidXRlKGF0dHIpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRDb250ZW50KHZhbHVlLmlzTnVsbCgpID8gZW1wdHlBdG9tIDogdmFsdWUuaW1wbCgp
LCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgZmFjdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUg
YWZmZWN0cyB0aGUgc3R5bGUKLSAgICAgICAgICAgICAgICAgICAgbV9ydWxlU2V0cy5mZWF0dXJl
cygpLmF0dHJzSW5SdWxlcy5hZGQoYXR0ci5sb2NhbE5hbWUoKS5pbXBsKCkpOwotICAgICAgICAg
ICAgICAgIH0gZWxzZSBpZiAoY29udGVudFZhbHVlLT5pc0NvdW50ZXIoKSkgewotICAgICAgICAg
ICAgICAgICAgICBDb3VudGVyKiBjb3VudGVyVmFsdWUgPSBjb250ZW50VmFsdWUtPmdldENvdW50
ZXJWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBFTGlzdFN0eWxlVHlwZSBsaXN0U3R5bGVU
eXBlID0gTm9uZUxpc3RTdHlsZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RTdHlsZUlk
ZW50ID0gY291bnRlclZhbHVlLT5saXN0U3R5bGVJZGVudCgpOwotICAgICAgICAgICAgICAgICAg
ICBpZiAobGlzdFN0eWxlSWRlbnQgIT0gQ1NTVmFsdWVOb25lKQotICAgICAgICAgICAgICAgICAg
ICAgICAgbGlzdFN0eWxlVHlwZSA9IHN0YXRpY19jYXN0PEVMaXN0U3R5bGVUeXBlPihsaXN0U3R5
bGVJZGVudCAtIENTU1ZhbHVlRGlzYyk7Ci0gICAgICAgICAgICAgICAgICAgIE93blB0cjxDb3Vu
dGVyQ29udGVudD4gY291bnRlciA9IGFkb3B0UHRyKG5ldyBDb3VudGVyQ29udGVudChjb3VudGVy
VmFsdWUtPmlkZW50aWZpZXIoKSwgbGlzdFN0eWxlVHlwZSwgY291bnRlclZhbHVlLT5zZXBhcmF0
b3IoKSkpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNv
dW50ZXIucmVsZWFzZSgpLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0
cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRj
aCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
Q1NTVmFsdWVPcGVuUXVvdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRDb250ZW50KE9QRU5fUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVDbG9zZVF1b3RlOgotICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChDTE9TRV9RVU9URSwgZGlkU2V0KTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vT3BlblF1b3Rl
OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChOT19P
UEVOX1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlTm9DbG9zZVF1b3RlOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0Q29udGVudChOT19DTE9TRV9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAg
IC8vIG5vcm1hbCBhbmQgbm9uZSBkbyBub3QgaGF2ZSBhbnkgZWZmZWN0LgotICAgICAgICAgICAg
ICAgICAgICAgICAgeyB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpZFNldCkKLSAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlRdW90ZXM6Ci0gICAgICAgIGlmIChpc0luaGVy
aXQpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhzdGF0ZS5wYXJlbnRT
dHlsZSgpLT5xdW90ZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVz
KDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZS0+
aXNWYWx1ZUxpc3QoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0gc3RhdGlj
X2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOwotICAgICAgICAgICAgUmVmUHRyPFF1b3Rlc0Rh
dGE+IHF1b3RlcyA9IFF1b3Rlc0RhdGE6OmNyZWF0ZSgpOwotICAgICAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBsaXN0LT5sZW5ndGgoKTsgaSArPSAyKSB7Ci0gICAgICAgICAgICAgICAg
Q1NTVmFsdWUqIGZpcnN0ID0gbGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKLSAgICAg
ICAgICAgICAgICAvLyBpdGVtKCkgcmV0dXJucyBudWxsIGlmIG91dCBvZiBib3VuZHMgc28gdGhp
cyBpcyBzYWZlLgotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBzZWNvbmQgPSBsaXN0LT5pdGVt
KGkgKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNlY29uZCkKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElD
QVRJT04oZmlyc3QtPmlzUHJpbWl0aXZlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJU
X1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2Vjb25kLT5pc1ByaW1pdGl2ZVZhbHVlKCkpOwot
ICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFF1b3RlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPihmaXJzdCktPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3Ry
aW5nIGVuZFF1b3RlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihzZWNvbmQpLT5n
ZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHF1b3Rlcy0+YWRkUGFpcihzdGQ6Om1h
a2VfcGFpcihzdGFydFF1b3RlLCBlbmRRdW90ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHF1b3Rlcyk7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7Ci0gICAgICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKQotICAgICAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhRdW90ZXNEYXRhOjpjcmVhdGUoKSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFtaWx5
OiB7Ci0gICAgICAgIC8vIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgaWRzCi0gICAgICAgIGlmIChpc0lu
aGVyaXQpIHsKLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBwYXJlbnRGb250RGVzY3JpcHRp
b24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVz
Y3JpcHRpb24oKTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5
KHBhcmVudEZvbnREZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkpOwotICAgICAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldEZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHko
KSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0SXNTcGVjaWZpZWRGb250KHBhcmVu
dEZvbnREZXNjcmlwdGlvbi5pc1NwZWNpZmllZEZvbnQoKSk7Ci0gICAgICAgICAgICBzZXRGb250
RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIEZvbnREZXNjcmlw
dGlvbiBpbml0aWFsRGVzYyA9IEZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgRm9udERl
c2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlv
bigpOwotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgdGhlIHNpemUgdG8gYWNjb3Vu
dCBmb3IgdGhlIGdlbmVyaWMgZmFtaWx5IGNoYW5nZSBmcm9tIG1vbm9zcGFjZQotICAgICAgICAg
ICAgLy8gdG8gbm9uLW1vbm9zcGFjZS4KLSAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24u
a2V5d29yZFNpemUoKSAmJiBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgpKQot
ICAgICAgICAgICAgICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNpemVGb3JL
ZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlwdGlvbi5rZXl3
b3JkU2l6ZSgpIC0gMSwgZmFsc2UpKTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRH
ZW5lcmljRmFtaWx5KGluaXRpYWxEZXNjLmdlbmVyaWNGYW1pbHkoKSk7Ci0gICAgICAgICAgICBp
ZiAoIWluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkuZmFtaWx5SXNFbXB0eSgpKQotICAgICAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkoaW5pdGlhbERlc2MuZmlyc3RGYW1pbHko
KSk7Ci0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzVmFs
dWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBm
b250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAg
ICAgRm9udEZhbWlseSYgZmlyc3RGYW1pbHkgPSBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHko
KTsKLSAgICAgICAgRm9udEZhbWlseSogY3VyckZhbWlseSA9IDA7Ci0KLSAgICAgICAgLy8gQmVm
b3JlIG1hcHBpbmcgaW4gYSBuZXcgZm9udC1mYW1pbHkgcHJvcGVydHksIHdlIHNob3VsZCByZXNl
dCB0aGUgZ2VuZXJpYyBmYW1pbHkuCi0gICAgICAgIGJvb2wgb2xkRmFtaWx5VXNlZEZpeGVkRGVm
YXVsdFNpemUgPSBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgpOwotICAgICAg
ICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok5vRmFt
aWx5KTsKLQotICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5o
YXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGku
dmFsdWUoKTsKLSAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGNv
bnRlbnRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlbSk7Ci0gICAg
ICAgICAgICBBdG9taWNTdHJpbmcgZmFjZTsKLSAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5n
cyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWUtPmlz
U3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgZmFjZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5n
VmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbmdzKSB7Ci0gICAgICAgICAgICAg
ICAgc3dpdGNoIChjb250ZW50VmFsdWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlV2Via2l0Qm9keToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNldHRp
bmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNlcmlmOgotICAgICAgICAgICAgICAgICAgICBm
YWNlID0gc2VyaWZGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHkpOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2Fuc1Nlcmlm
OgotICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2Fuc1NlcmlmRmFtaWx5OwotICAgICAgICAg
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRp
b246OlNhbnNTZXJpZkZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgIGNhc2UgQ1NTVmFsdWVDdXJzaXZlOgotICAgICAgICAgICAgICAgICAgICBmYWNl
ID0gY3Vyc2l2ZUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpDdXJzaXZlRmFtaWx5KTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhbnRhc3k6
Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBmYW50YXN5RmFtaWx5OwotICAgICAgICAgICAg
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246
OkZhbnRhc3lGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlTW9ub3NwYWNlOgotICAgICAgICAgICAgICAgICAgICBmYWNlID0g
bW9ub3NwYWNlRmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRQ
aWN0b2dyYXBoOgotICAgICAgICAgICAgICAgICAgICBmYWNlID0gcGljdG9ncmFwaEZhbWlseTsK
LSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpQaWN0b2dyYXBoRmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAo
IWZhY2UuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJyRmFtaWx5KSB7Ci0g
ICAgICAgICAgICAgICAgICAgIC8vIEZpbGxpbmcgaW4gdGhlIGZpcnN0IGZhbWlseS4KLSAgICAg
ICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuc2V0RmFtaWx5KGZhY2UpOwotICAgICAgICAgICAg
ICAgICAgICBmaXJzdEZhbWlseS5hcHBlbmRGYW1pbHkoMCk7IC8vIFJlbW92ZSBhbnkgaW5oZXJp
dGVkIGZhbWlseS1mYWxsYmFjayBsaXN0LgotICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5
ID0gJmZpcnN0RmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
SXNTcGVjaWZpZWRGb250KGZvbnREZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkgPT0gRm9udERl
c2NyaXB0aW9uOjpOb0ZhbWlseSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgICAgICAgICAgUmVmUHRyPFNoYXJlZEZvbnRGYW1pbHk+IG5ld0ZhbWlseSA9IFNoYXJlZEZv
bnRGYW1pbHk6OmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBuZXdGYW1pbHktPnNldEZh
bWlseShmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseS0+YXBwZW5kRmFtaWx5
KG5ld0ZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSBuZXdGYW1pbHku
Z2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gV2UgY2FuJ3QgY2FsbCB1c2VGaXhlZERlZmF1bHRTaXplKCkgdW50aWwgYWxsIG5l
dyBmb250IGZhbWlsaWVzIGhhdmUgYmVlbiBhZGRlZAotICAgICAgICAvLyBJZiBjdXJyRmFtaWx5
IGlzIG5vbi16ZXJvIHRoZW4gd2Ugc2V0IGF0IGxlYXN0IG9uZSBmYW1pbHkgb24gdGhpcyBkZXNj
cmlwdGlvbi4KLSAgICAgICAgaWYgKGN1cnJGYW1pbHkpIHsKLSAgICAgICAgICAgIGlmIChmb250
RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAmJiBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZh
dWx0U2l6ZSgpICE9IG9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplKQotICAgICAgICAgICAg
ICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3b3JkKGRvY3Vt
ZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpIC0g
MSwgIW9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplKSk7Ci0KLSAgICAgICAgICAgIHNldEZv
bnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgLy8gU2hvcnRoYW5kIHByb3BlcnRpZXMuCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUZvbnQ6Ci0gICAgICAgIGlmIChpc0luaGVyaXQpIHsKLSAgICAgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3Jp
cHRpb24oKTsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoc3RhdGUu
cGFyZW50U3R5bGUoKS0+c3BlY2lmaWVkTGluZUhlaWdodCgpKTsKLSAgICAgICAgICAgIHN0YXRl
LnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihm
b250RGVzY3JpcHRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkgewotICAgICAg
ICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOwotICAgICAgICAg
ICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwg
dGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBz
ZXR0aW5ncwotICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsKLSAgICAgICAg
fSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci0gICAgICAg
ICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0KLSAgICAgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVs
dFRoZW1lKCktPnN5c3RlbUZvbnQocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCksIGZvbnREZXNj
cmlwdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIERvdWJsZS1jaGVjayBhbmQgc2VlIGlmIHRoZSB0
aGVtZSBkaWQgYW55dGhpbmcuIElmIG5vdCwgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBmb250
LgotICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZW5kZXJpbmcgbW9kZSBhbmQgcHJpbnRl
ciBmb250IHNldHRpbmdzIGFyZSB1cGRhdGVkLgotICAgICAgICAgICAgICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQoc2V0
dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3VtZW50
IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCi0gICAg
ICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdz
LT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNj
cmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gSGFu
ZGxlIHRoZSB6b29tIGZhY3Rvci4KLSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCks
IHN0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBmb250RGVz
Y3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpLCB1c2VTVkdab29tUnVsZXMoKSkpOwotICAgICAgICAg
ICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICAgICAg
fQotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5pc0ZvbnRWYWx1ZSgpKSB7Ci0gICAgICAgICAg
ICBGb250VmFsdWUqIGZvbnQgPSBzdGF0aWNfY2FzdDxGb250VmFsdWUqPih2YWx1ZSk7Ci0gICAg
ICAgICAgICBpZiAoIWZvbnQtPnN0eWxlIHx8ICFmb250LT52YXJpYW50IHx8ICFmb250LT53ZWln
aHQKLSAgICAgICAgICAgICAgICB8fCAhZm9udC0+c2l6ZSB8fCAhZm9udC0+bGluZUhlaWdodCB8
fCAhZm9udC0+ZmFtaWx5KQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGFw
cGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U3R5bGUsIGZvbnQtPnN0eWxlLmdldCgpKTsKLSAg
ICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250VmFyaWFudCwgZm9udC0+dmFy
aWFudC5nZXQoKSk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFdl
aWdodCwgZm9udC0+d2VpZ2h0LmdldCgpKTsKLSAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBw
cm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIgZm9udCBidXQgdGhleSBkb24ndCB0cnkgdG8gcmVhZCB0
aGUgZm9udCdzCi0gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGJhY2ssIHdoaWNoIGlzIHNhZmUu
IEhvd2V2ZXIgaWYgZm9udC1zaXplIGlzIHVzaW5nIHRoZSAnZXgnIHVuaXQsIGl0IHdpbGwKLSAg
ICAgICAgICAgIC8vIG5lZWQgcXVlcnkgdGhlIGRpcnRpZWQgZm9udCdzIHgtaGVpZ2h0IHRvIGdl
dCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8gYmUgc2FmZSBpbiB0aGlzCi0gICAgICAgICAgICAvLyBj
YXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0aGUgZm9udCBub3cuCi0gICAgICAgICAgICB1cGRhdGVG
b250KCk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNpemUsIGZv
bnQtPnNpemUuZ2V0KCkpOwotCi0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
Zm9udC0+bGluZUhlaWdodC5nZXQoKSk7Ci0KLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NT
UHJvcGVydHlGb250RmFtaWx5LCBmb250LT5mYW1pbHkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybjsKLQotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQm90dG9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckxlZnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJhZGl1czoKLSAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyUmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclNwYWNpbmc6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJUb3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcldpZHRoOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlMaXN0U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3V0bGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3c6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9y
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJTdGFydDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5zOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4RmxvdzoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0R3JpZENvbHVtbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvdzoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcnF1ZWU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2s6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza1JlcGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhh
c2lzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2Zvcm1PcmlnaW46Ci0jaWYgRU5BQkxFKENTU19FWENMVVNJT05TKQotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRXcmFwOgotI2VuZGlmCi0gICAgICAgIEFTU0VSVChpc0V4cGFuZGVkU2hvcnRo
YW5kKGlkKSk7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsK
LQotICAgIC8vIENTUzMgUHJvcGVydGllcwotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaGFkb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJveFNoYWRvdzogewotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBp
ZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQotICAgICAgICAgICAgICAgIHJldHVybiBz
dGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFk
b3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0
U2hhZG93KCkpKSA6IG51bGxwdHIpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCkt
PnNldEJveFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSA/IGFkb3B0UHRy
KG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSkpIDogbnVs
bHB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzSW5pdGlhbCB8fCBwcmltaXRpdmVWYWx1
ZSkgLy8gaW5pdGlhbCB8IG5vbmUKLSAgICAgICAgICAgIHJldHVybiBpZCA9PSBDU1NQcm9wZXJ0
eVRleHRTaGFkb3cgPyBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KG51bGxwdHIpIDogc3Rh
dGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOwotCi0gICAgICAgIGlmICghdmFsdWUt
PmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewot
ICAgICAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgICAg
IGlmICghY3VyclZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1Zh
bHVlKj4oY3VyclZhbHVlKTsKLSAgICAgICAgICAgIGludCB4ID0gaXRlbS0+eC0+Y29tcHV0ZUxl
bmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZh
Y3Rvcik7Ci0gICAgICAgICAgICBpbnQgeSA9IGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50Pihz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAg
ICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0
aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rv
cikgOiAwOwotICAgICAgICAgICAgaW50IHNwcmVhZCA9IGl0ZW0tPnNwcmVhZCA/IGl0ZW0tPnNw
cmVhZC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50
U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOwotICAgICAgICAgICAgU2hhZG93U3R5bGUgc2hhZG93
U3R5bGUgPSBpdGVtLT5zdHlsZSAmJiBpdGVtLT5zdHlsZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1
ZUluc2V0ID8gSW5zZXQgOiBOb3JtYWw7Ci0gICAgICAgICAgICBDb2xvciBjb2xvcjsKLSAgICAg
ICAgICAgIGlmIChpdGVtLT5jb2xvcikKLSAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJv
bVByaW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKLSAgICAgICAgICAgIGVsc2UgaWYg
KHN0YXRlLnN0eWxlKCkpCi0gICAgICAgICAgICAgICAgY29sb3IgPSBzdGF0ZS5zdHlsZSgpLT5j
b2xvcigpOwotCi0gICAgICAgICAgICBPd25QdHI8U2hhZG93RGF0YT4gc2hhZG93RGF0YSA9IGFk
b3B0UHRyKG5ldyBTaGFkb3dEYXRhKEludFBvaW50KHgsIHkpLCBibHVyLCBzcHJlYWQsIHNoYWRv
d1N0eWxlLCBpZCA9PSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgY29sb3IuaXNWYWxpZCgp
ID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQpKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBD
U1NQcm9wZXJ0eVRleHRTaGFkb3cpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VGV4dFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRo
ZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzaGFkb3dEYXRhLnJl
bGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRo
ZSBmaXJzdCBlbnRyeQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwoYm94UmVmbGVjdCwgQm94UmVmbGVjdCkKLSAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KFJlbmRl
clN0eWxlOjppbml0aWFsQm94UmVmbGVjdCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpCi0gICAgICAgICAg
ICByZXR1cm47Ci0KLSAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxTdHlsZVJl
ZmxlY3Rpb24+IHJlZmxlY3Rpb24gPSBTdHlsZVJlZmxlY3Rpb246OmNyZWF0ZSgpOwotICAgICAg
ICByZWZsZWN0aW9uLT5zZXREaXJlY3Rpb24oKnJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCkpOwot
ICAgICAgICBpZiAocmVmbGVjdFZhbHVlLT5vZmZzZXQoKSkKLSAgICAgICAgICAgIHJlZmxlY3Rp
b24tPnNldE9mZnNldChyZWZsZWN0VmFsdWUtPm9mZnNldCgpLT5jb252ZXJ0VG9MZW5ndGg8Rml4
ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZl
cnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rv
cikpOwotICAgICAgICBOaW5lUGllY2VJbWFnZSBtYXNrOwotICAgICAgICBtYXNrLnNldE1hc2tE
ZWZhdWx0cygpOwotICAgICAgICBtX3N0eWxlTWFwLm1hcE5pbmVQaWVjZUltYWdlKGlkLCByZWZs
ZWN0VmFsdWUtPm1hc2soKSwgbWFzayk7Ci0gICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2sobWFz
ayk7Ci0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChyZWZsZWN0aW9uLnJl
bGVhc2UoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNy
YzogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCi0gICAgICAgIHJldHVybjsKLSAg
ICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZVJhbmdlOiAvLyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFj
ZSBydWxlcy4KLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJx
dWVlUmVwZXRpdGlvbjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJx
dWVlTG9vcENvdW50LCBNYXJxdWVlTG9vcENvdW50KQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZh
bHVlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVJbmZpbml0ZSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldE1hcnF1ZWVMb29wQ291bnQoLTEpOyAvLyAtMSBtZWFucyByZXBlYXQgZm9yZXZlci4KLSAg
ICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpCi0gICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRW
YWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFycXVlZVNwZWVkOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1h
cnF1ZWVTcGVlZCwgTWFycXVlZVNwZWVkKQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoaW50IGlkZW50ID0gcHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICAgICAg
ICAgIGNhc2UgQ1NTVmFsdWVTbG93OgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dE1hcnF1ZWVTcGVlZCg1MDApOyAvLyA1MDAgbXNlYy4KLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb3JtYWw6Ci0gICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDg1KTsgLy8gODVtc2VjLiBUaGUgV2luSUUgZGVmYXVs
dC4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYXN0
OgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCgxMCk7IC8v
IDEwbXNlYy4gU3VwZXIgZmFzdC4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNUaW1lKCkpCi0gICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQocHJpbWl0aXZlVmFsdWUtPmNvbXB1
dGVUaW1lPGludCwgQ1NTUHJpbWl0aXZlVmFsdWU6Ok1pbGxpc2Vjb25kcz4oKSk7Ci0gICAgICAg
IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSAvLyBGb3Igc2Nyb2xsYW1vdW50
IHN1cHBvcnQuCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQocHJp
bWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlSW5jcmVtZW50OiB7Ci0gICAgICAgIEhBTkRM
RV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVJbmNyZW1lbnQsIE1hcnF1ZWVJbmNyZW1lbnQp
Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgc3dpdGNo
IChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZVNtYWxsOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1l
bnQoTGVuZ3RoKDEsIEZpeGVkKSk7IC8vIDFweC4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb3JtYWw6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoNiwgRml4ZWQpKTsgLy8gNnB4LiBUaGUg
V2luSUUgZGVmYXVsdC4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2Ug
Q1NTVmFsdWVMYXJnZToKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVl
SW5jcmVtZW50KExlbmd0aCgzNiwgRml4ZWQpKTsgLy8gMzZweC4KLSAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExlbmd0
aCBtYXJxdWVlTGVuZ3RoID0gY29udmVydFRvSW50TGVuZ3RoKHByaW1pdGl2ZVZhbHVlLCBzdGF0
ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgaWYgKCFt
YXJxdWVlTGVuZ3RoLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0TWFycXVlZUluY3JlbWVudChtYXJxdWVlTGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2NhbGU6IHsKLSAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobG9jYWxlLCBMb2NhbGUpOwotICAgICAg
ICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQotICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0TG9jYWxlKG51bGxBdG9tKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TG9jYWxlKHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdW
YWx1ZSgpKTsKLSAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRl
LnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24oc3RhdGUuc3R5bGUoKS0+
bG9jYWxlKCkpKTsKLSAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXREYXNoYm9hcmRSZWdpb246Ci0gICAgewotICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChkYXNoYm9hcmRSZWdpb25zLCBEYXNoYm9hcmRS
ZWdpb25zKQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5v
bmUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbnMoUmVu
ZGVyU3R5bGU6Om5vbmVEYXNoYm9hcmRSZWdpb25zKCkpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0KLSAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiByZWdpb24gPSBwcmltaXRpdmVW
YWx1ZS0+Z2V0RGFzaGJvYXJkUmVnaW9uVmFsdWUoKTsKLSAgICAgICAgaWYgKCFyZWdpb24pCi0g
ICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiBmaXJzdCA9IHJl
Z2lvbjsKLSAgICAgICAgd2hpbGUgKHJlZ2lvbikgewotICAgICAgICAgICAgTGVuZ3RoIHRvcCA9
IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnRvcCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVuZ3RoIHJpZ2h0ID0gY29udmVydFRv
SW50TGVuZ3RoKHJlZ2lvbi0+cmlnaHQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1l
bnRTdHlsZSgpKTsKLSAgICAgICAgICAgIExlbmd0aCBib3R0b20gPSBjb252ZXJ0VG9JbnRMZW5n
dGgocmVnaW9uLT5ib3R0b20oKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpKTsKLSAgICAgICAgICAgIExlbmd0aCBsZWZ0ID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lv
bi0+bGVmdCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotCi0g
ICAgICAgICAgICBpZiAodG9wLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgdG9wID0g
TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAocmlnaHQuaXNVbmRlZmluZWQoKSkKLSAgICAgICAg
ICAgICAgICByaWdodCA9IExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGJvdHRvbS5pc1VuZGVm
aW5lZCgpKQotICAgICAgICAgICAgICAgIGJvdHRvbSA9IExlbmd0aCgpOwotICAgICAgICAgICAg
aWYgKGxlZnQuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBsZWZ0ID0gTGVuZ3RoKCk7
Ci0KLSAgICAgICAgICAgIGlmIChyZWdpb24tPm1faXNDaXJjbGUpCi0gICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpD
aXJjbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24g
PT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwotICAgICAgICAgICAgZWxzZSBpZiAocmVnaW9uLT5t
X2lzUmVjdGFuZ2xlKQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2Fy
ZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6UmVjdGFuZ2xlLCByZWdpb24tPm1fbGFiZWws
IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2UgOiB0cnVl
KTsKLSAgICAgICAgICAgIHJlZ2lvbiA9IHJlZ2lvbi0+bV9uZXh0LmdldCgpOwotICAgICAgICB9
Ci0KLSAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVnaW9ucyh0cnVl
KTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0jaWYgRU5BQkxFKERSQUdHQUJM
RV9SRUdJT04pCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFwcFJlZ2lvbjogewotICAgICAg
ICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RHJhZ2dhYmxlUmVn
aW9uTW9kZShwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURyYWcgPyBEcmFn
Z2FibGVSZWdpb25EcmFnIDogRHJhZ2dhYmxlUmVnaW9uTm9EcmFnKTsKLSAgICAgICAgc3RhdGUu
ZG9jdW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVnaW9ucyh0cnVlKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlV2lk
dGg6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFN0cm9rZVdpZHRo
LCBUZXh0U3Ryb2tlV2lkdGgpCi0gICAgICAgIGZsb2F0IHdpZHRoID0gMDsKLSAgICAgICAgc3dp
dGNoIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICBjYXNlIENTU1ZhbHVl
VGhpbjoKLSAgICAgICAgY2FzZSBDU1NWYWx1ZU1lZGl1bToKLSAgICAgICAgY2FzZSBDU1NWYWx1
ZVRoaWNrOiB7Ci0gICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gMS4wIC8gNDg7Ci0gICAgICAg
ICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVNZWRpdW0pCi0g
ICAgICAgICAgICAgICAgcmVzdWx0ICo9IDM7Ci0gICAgICAgICAgICBlbHNlIGlmIChwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVRoaWNrKQotICAgICAgICAgICAgICAgIHJl
c3VsdCAqPSA1OwotICAgICAgICAgICAgd2lkdGggPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRl
KHJlc3VsdCwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19FTVMpLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAg
ICAgIHdpZHRoID0gcHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U3Ryb2tl
V2lkdGgod2lkdGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUcmFuc2Zvcm06IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwo
dHJhbnNmb3JtLCBUcmFuc2Zvcm0pOwotICAgICAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJh
dGlvbnM7Ci0gICAgICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucyk7Ci0gICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldFRyYW5zZm9ybShvcGVyYXRpb25zKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmU6IHsKLSAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocGVyc3BlY3RpdmUsIFBlcnNwZWN0aXZlKQotCi0g
ICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAg
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewotICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUoMCk7Ci0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBwZXJzcGVjdGl2ZVZhbHVlOwotICAg
ICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCi0gICAgICAgICAgICBwZXJzcGVj
dGl2ZVZhbHVlID0gcHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgIGVs
c2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7Ci0gICAgICAgICAgICAvLyBGb3Ig
YmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdHJlYXQgdmFsdWVsZXNzIG51bWJlcnMgYXMgcHguCi0g
ICAgICAgICAgICBwZXJzcGVjdGl2ZVZhbHVlID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShw
cmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19Q
WCktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50
U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIGlmIChwZXJzcGVjdGl2ZVZhbHVlID49IDAuMGYpCi0gICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZVZhbHVlKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9B
TkRfSU5JVElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0Q29sb3IpOwotICAgICAg
ICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgQ29s
b3IgY29sID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZlVmFsdWUpOwotICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotI2VuZGlmCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9M
TElORykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6IHsKLSAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hPdmVyZmxvd1Njcm9sbGlu
ZywgVXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFs
dWUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlVG91
Y2hPdmVyZmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1
ZVRvdWNoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJv
cGVydHlJbnZhbGlkOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gRGlyZWN0aW9uYWwgcHJvcGVy
dGllcyBhcmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoKSBiZWZv
cmUgdGhlIHN3aXRjaC4KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kQ29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFN0eWxlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRCb3JkZXJFbmRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyU3RhcnRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRT
dHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRXaWR0aDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJCZWZvcmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFyZ2luRW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5TdGFy
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJnaW5BZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFy
Z2luQmVmb3JlQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpblRvcENv
bGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlckNvbGxhcHNlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Cb3R0b21Db2xsYXBzZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0VuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
UGFkZGluZ1N0YXJ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nQmVmb3JlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdExvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9naWNh
bEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbFdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXhMb2dpY2FsV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
eExvZ2ljYWxIZWlnaHQ6Ci0gICAgewotICAgICAgICBDU1NQcm9wZXJ0eUlEIG5ld0lkID0gQ1NT
UHJvcGVydHk6OnJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KGlkLCBzdGF0ZS5zdHlsZSgp
LT5kaXJlY3Rpb24oKSwgc3RhdGUuc3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIEFT
U0VSVChuZXdJZCAhPSBpZCk7Ci0gICAgICAgIHJldHVybiBhcHBseVByb3BlcnR5KG5ld0lkLCB2
YWx1ZSk7Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3RyZXRjaDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5UGFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5VGV4dExpbmVUaHJvdWdoTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVU
aHJvdWdoU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFdpZHRoOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHRPdmVybGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVNb2RlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dE92ZXJsaW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5VGV4dFVuZGVybGluZU1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxp
bmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZVdpZHRoOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRGb250U2l6ZURlbHRhOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdDoKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8g
Q1NTIFRleHQgTGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0aW5nIHN1cHBvcnQK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKLSAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2RlKTsKLSAgICAgICAg
Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNldFdyaXRpbmdNb2Rl
KCpwcmltaXRpdmVWYWx1ZSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IEl0IGlzIG5vdCBvayB0byBt
b2RpZnkgZG9jdW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCi0gICAgICAgIGlmIChz
dGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmRv
Y3VtZW50RWxlbWVudCgpKQotICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0V3JpdGlu
Z01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCh0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246IHsKLSAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBUZXh0T3JpZW50YXRp
b24pOwotCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHNldFRleHRP
cmllbnRhdGlvbigqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsKLSAgICAgICAgSEFO
RExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVCb3hDb250YWluKQot
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkg
PT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94
Q29udGFpbihMaW5lQm94Q29udGFpbk5vbmUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFpblZhbHVlKCkpCi0g
ICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ1NTTGluZUJveENvbnRhaW5WYWx1ZSogbGlu
ZUJveENvbnRhaW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250YWluVmFsdWUqPih2
YWx1ZSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250YWluKGxpbmVCb3hD
b250YWluVmFsdWUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8g
Q1NTIEZvbnRzIE1vZHVsZSBMZXZlbCAzCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRG
ZWF0dXJlU2V0dGluZ3M6IHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7Ci0gICAgICAgICAgICBzZXRG
b250RGVzY3JpcHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkubWFrZU5vcm1h
bEZlYXR1cmVTZXR0aW5ncygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0g
ICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCkt
PmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNf
Y2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7Ci0gICAgICAgIFJlZlB0cjxGb250RmVhdHVyZVNl
dHRpbmdzPiBzZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0ZSgpOwotICAgICAg
ICBpbnQgbGVuID0gbGlzdC0+bGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bGVuOyArK2kpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlzdC0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjayhpKTsKLSAgICAgICAgICAgIGlmICghaXRlbS0+aXNGb250RmVhdHVyZVZh
bHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBGb250RmVhdHVy
ZVZhbHVlKiBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1ZSo+KGl0ZW0pOwot
ICAgICAgICAgICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0dXJlLT50YWcoKSwg
ZmVhdHVyZS0+dmFsdWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRGZWF0dXJlU2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKLSAgICAgICAgc2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNp
ZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZpbHRlcjog
ewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIsIEZpbHRlcik7Ci0g
ICAgICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgaWYgKGNyZWF0ZUZp
bHRlck9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5
bGUoKSwgb3BlcmF0aW9ucykpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRGaWx0ZXIo
b3BlcmF0aW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbnM6IHsKLSAgICAgICAgVmVjdG9yPEdyaWRUcmFja1Np
emU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwg
dHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKLSAgICAgICAgVmVjdG9y
PEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNr
TGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkU3RhcnQ6IHsKLSAg
ICAgICAgR3JpZFBvc2l0aW9uIHN0YXJ0UG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRlR3Jp
ZFBvc2l0aW9uKHZhbHVlLCBzdGFydFBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1TdGFydChzdGFydFBvc2l0aW9uKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEVuZDog
ewotICAgICAgICBHcmlkUG9zaXRpb24gZW5kUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRl
R3JpZFBvc2l0aW9uKHZhbHVlLCBlbmRQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtRW5kKGVuZFBvc2l0aW9uKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQmVmb3Jl
OiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBiZWZvcmVQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFj
cmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGJlZm9yZVBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1CZWZvcmUoYmVmb3JlUG9z
aXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRHcmlkQWZ0ZXI6IHsKLSAgICAgICAgR3JpZFBvc2l0aW9uIGFmdGVyUG9zaXRpb247Ci0gICAg
ICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBhZnRlclBvc2l0aW9uKSkKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1BZnRlcihh
ZnRlclBvc2l0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRoZXNlIHBy
b3BlcnRpZXMgYXJlIGFsaWFzZWQgYW5kIFN0eWxlQnVpbGRlciBhbHJlYWR5IGFwcGxpZWQgdGhl
IHByb3BlcnR5IG9uIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLgotICAgIGNhc2UgQ1NTUHJvcGVydHlU
cmFuc2l0aW9uRGVsYXk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25EdXJhdGlvbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblByb3BlcnR5OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlUcmFuc2l0aW9uVGltaW5nRnVuY3Rpb246Ci0gICAgICAgIHJldHVybjsKLSAgICAvLyBU
aGVzZSBwcm9wZXJ0aWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgU3R5bGVCdWlsZGVyIGxvb2t1
cCB0YWJsZS4KLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZFBvc2l0aW9uWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9u
WToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRSZXBlYXRZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
U2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbUxlZnRSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJv
cmRlckJvdHRvbVJpZ2h0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21T
dHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tV2lkdGg6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckNvbGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFn
ZU91dHNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VSZXBlYXQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU2xpY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckltYWdlU291cmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJv
cmRlckxlZnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJSaWdodFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRoOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyVG9wTGVmdFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wUmlnaHRS
YWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJUb3BXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm90dG9tOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3hTaXppbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNhcHRpb25T
aWRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDbGVhcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q2xp
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvdW50
ZXJJbmNyZW1lbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvdW50ZXJSZXNldDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Q3Vyc29yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlEaXJlY3Rpb246Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eURpc3BsYXk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUVtcHR5Q2VsbHM6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZsb2F0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlG
b250VmFyaWFudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5SGVpZ2h0OgotI2lmIEVOQUJMRShDU1NfSU1BR0VfT1JJRU5UQVRJT04pCi0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUltYWdlT3JpZW50YXRpb246Ci0jZW5kaWYKLSAgICBjYXNlIENTU1By
b3BlcnR5SW1hZ2VSZW5kZXJpbmc6Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9SRVNPTFVUSU9OKQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZVJlc29sdXRpb246Ci0jZW5kaWYKLSAgICBjYXNlIENT
U1Byb3BlcnR5TGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGV0dGVyU3BhY2luZzoKLSAgICBj
YXNlIENTU1Byb3BlcnR5TGluZUhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxl
SW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVBvc2l0aW9uOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5Cb3R0
b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkxlZnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eU1hcmdpblJpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5Ub3A6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eU1heEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4V2lkdGg6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eU1pbkhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluV2lkdGg6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU9ycGhh
bnM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5T3V0bGluZU9mZnNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJm
bG93V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dYOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlPdmVyZmxvd1k6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0b206Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5n
UmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdUb3A6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVBhZ2VCcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtCZWZvcmU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0luc2lkZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5UG9pbnRlckV2ZW50czoKLSAgICBjYXNlIENTU1Byb3BlcnR5UG9zaXRpb246Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVJlc2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5UmlnaHQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVNwZWFrOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUYWJTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJsZUxheW91dDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVj
b3JhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEluZGVudDoKLSAgICBjYXNlIENTU1By
b3BlcnR5VGV4dE92ZXJmbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0UmVuZGVyaW5nOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNmb3JtOgotICAgIGNhc2UgQ1NTUHJvcGVydHlU
b3A6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpOgotI2lmIEVOQUJMRShDU1NfVkFS
SUFCTEVTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlWYXJpYWJsZToKLSNlbmRpZgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgotICAgIGNhc2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EZWxheToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRBbmltYXRpb25EdXJhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0
aW9uRmlsbE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlv
bkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25OYW1lOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25QbGF5U3RhdGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRBcHBlYXJhbmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBc3BlY3RSYXRpbzoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QmFja2dyb3VuZENvbXBvc2l0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dy
b3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZFNpemU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckZpdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJWZXJ0aWNhbFNw
YWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEFsaWduOgotI2lmIEVOQUJMRShD
U1NfQk9YX0RFQ09SQVRJT05fQlJFQUspCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERl
Y29yYXRpb25CcmVhazoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hEaXJl
Y3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEZsZXg6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveEZsZXhHcm91cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94
TGluZXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yZGluYWxHcm91cDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JpZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3hQYWNrOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2xvckNvcnJlY3Rpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkF4aXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdENvbHVtbkJyZWFrQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVt
bkJyZWFrQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0luc2lk
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQ291bnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdENvbHVtbkdhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1u
UHJvZ3Jlc3Npb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVN0eWxlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5SdWxlV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dENvbHVtblNwYW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbldpZHRoOgotI2lm
IEVOQUJMRShDVVJTT1JfVklTSUJJTElUWSkKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q3Vy
c29yVmlzaWJpbGl0eToKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnbkNv
bnRlbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduSXRlbXM6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFsaWduU2VsZjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxl
eEJhc2lzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4RGlyZWN0aW9uOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4R3JvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
RmxleFNocmluazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFdyYXA6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3RpZnlDb250ZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRPcmRlcjoKLSNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEZsb3dGcm9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93SW50bzoKLSNl
bmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250S2VybmluZzoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Rm9udFNtb290aGluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Rm9udFZhcmlhbnRMaWdhdHVyZXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEhpZ2hsaWdo
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlQ2hhcmFjdGVyOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEFmdGVyOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEJlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0SHlwaGVuYXRlTGltaXRMaW5lczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVu
czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUFsaWduOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRMaW5lQnJlYWs6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVDbGFt
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUdyaWQ6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdExpbmVTbmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlRGly
ZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3R5bGU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlT3V0c2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2VSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNsaWNl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXNrQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NvbXBvc2l0
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0ltYWdlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXNrT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9z
aXRpb25YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb25ZOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza1JlcGVhdFk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tTaXplOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXROYnNwTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0UGVyc3BlY3RpdmVPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0
aXZlT3JpZ2luWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW5Z
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQcmludENvbG9yQWRqdXN0OgotI2lmIEVOQUJM
RShDU1NfUkVHSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtBZnRl
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtCZWZvcmU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrSW5zaWRlOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRSZWdpb25PdmVyZmxvdzoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRSdGxPcmRlcmluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UnVieVBvc2l0aW9uOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0Q29tYmluZToKLSNpZiBFTkFCTEUoQ1NTM19U
RVhUKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbkxpbmU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uU3R5bGU6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRBbGlnbkxhc3Q6Ci0jZW5kaWYgLy8gQ1NTM19URVhUCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUZXh0RW1waGFzaXNQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dEVtcGhhc2lzU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29s
b3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTZWN1cml0eToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRUcmFuc2Zvcm1PcmlnaW5YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1P
cmlnaW5ZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5aOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1TdHlsZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VHJhbnNpdGlvbkRlbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2l0aW9uRHVyYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25Qcm9w
ZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9u
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyRHJhZzoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VXNlck1vZGlmeToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlclNlbGVj
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q2xpcFBhdGg6Ci0jaWYgRU5BQkxFKENTU19F
WENMVVNJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwRmxvdzoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0U2hhcGVNYXJnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFNoYXBlUGFkZGluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcFRocm91Z2g6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlSW5zaWRlOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRTaGFwZU91dHNpZGU6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVT
cGFjZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2lkb3dzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
aWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V29yZEJyZWFrOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXb3JkU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V29yZFdyYXA6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVpJbmRleDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Wm9vbToKLSNpZiBFTkFCTEUo
Q1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhab29tOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlNaW5ab29tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcmllbnRhdGlv
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VXNlclpvb206Ci0jZW5kaWYKLSAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotI2lmIEVOQUJM
RShTVkcpCi0gICAgICAgIC8vIFRyeSB0aGUgU1ZHIHByb3BlcnRpZXMKLSAgICAgICAgYXBwbHlT
VkdQcm9wZXJ0eShpZCwgdmFsdWUpOwotI2VuZGlmCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci19
Ci0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVJbWFnZShDU1NQ
cm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5p
c0ltYWdlVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShw
cm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VWYWx1ZSo+KHZhbHVlKSk7Ci0KLSAgICBpZiAo
dmFsdWUtPmlzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7Ci0gICAgICAgIGlmICh2YWx1ZS0+aXNH
cmFkaWVudFZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJv
bVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4odmFsdWUpLT5n
cmFkaWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSk7Ci0gICAgICAgIHJldHVybiBn
ZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdl
R2VuZXJhdG9yVmFsdWUqPih2YWx1ZSkpOwotICAgIH0KLQotI2lmIEVOQUJMRShDU1NfSU1BR0Vf
U0VUKQotICAgIGlmICh2YWx1ZS0+aXNJbWFnZVNldFZhbHVlKCkpCi0gICAgICAgIHJldHVybiBz
ZXRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlU2V0VmFs
dWUqPih2YWx1ZSkpOwotI2VuZGlmCi0KLSAgICBpZiAodmFsdWUtPmlzQ3Vyc29ySW1hZ2VWYWx1
ZSgpKQotICAgICAgICByZXR1cm4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBz
dGF0aWNfY2FzdDxDU1NDdXJzb3JJbWFnZVZhbHVlKj4odmFsdWUpKTsKLQotICAgIHJldHVybiAw
OwotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVu
ZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVZhbHVlKiB2YWx1
ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5k
aW5nSW1hZ2UoKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0g
ICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFs
dWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8U3R5bGVJ
bWFnZT4gU3R5bGVSZXNvbHZlcjo6Z2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3Bl
cnR5SUQgcHJvcGVydHksIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIHZhbHVlKQotewotICAgIGlm
ICh2YWx1ZS0+aXNQZW5kaW5nKCkpIHsKLSAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9w
ZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBTdHlsZVBlbmRp
bmdJbWFnZTo6Y3JlYXRlKHZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0eWxlR2VuZXJhdGVk
SW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLVBh
c3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6c2V0T3JQZW5kaW5nRnJvbVZhbHVl
KENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlU2V0VmFsdWUqIHZhbHVlKQotewotICAg
IFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZVNl
dChkb2N1bWVudCgpKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkp
Ci0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwg
dmFsdWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19Ci0jZW5kaWYKLQotUGFzc1Jl
ZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUo
Q1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogdmFsdWUpCi17Ci0g
ICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdl
KGRvY3VtZW50KCkpOwotICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkK
LSAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2
YWx1ZSk7Ci0gICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSog
cGFyZW50U3R5bGUpCi17Ci0gICAgaWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgPT0gcGFyZW50
U3R5bGUtPmVmZmVjdGl2ZVpvb20oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
Rm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOwotICAgIHNldEZv
bnRTaXplKG5ld0ZvbnREZXNjcmlwdGlvbiwgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSk7Ci0g
ICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHls
ZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAgICBjb25zdCBGb250RGVz
Y3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKLQotICAgIGlm
IChjaGlsZEZvbnQuaXNBYnNvbHV0ZVNpemUoKSB8fCAhcGFyZW50U3R5bGUpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udCA9IHBhcmVudFN0
eWxlLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICBpZiAoY2hpbGRGb250LnVzZUZpeGVkRGVmYXVs
dFNpemUoKSA9PSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgLy8gRm9yIG5vdywgbHVtcCBhbGwgZmFtaWxpZXMgYnV0IG1vbm9zcGFjZSB0
b2dldGhlci4KLSAgICBpZiAoY2hpbGRGb250LmdlbmVyaWNGYW1pbHkoKSAhPSBGb250RGVzY3Jp
cHRpb246Ok1vbm9zcGFjZUZhbWlseQotICAgICAgICAmJiBwYXJlbnRGb250LmdlbmVyaWNGYW1p
bHkoKSAhPSBGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gV2Uga25vdyB0aGUgcGFyZW50IGlzIG1vbm9zcGFjZSBvciB0aGUgY2hpbGQg
aXMgbW9ub3NwYWNlLCBhbmQgdGhhdCBmb250Ci0gICAgLy8gc2l6ZSB3YXMgdW5zcGVjaWZpZWQu
IFdlIHdhbnQgdG8gc2NhbGUgb3VyIGZvbnQgc2l6ZSBhcyBhcHByb3ByaWF0ZS4KLSAgICAvLyBJ
ZiB0aGUgZm9udCB1c2VzIGEga2V5d29yZCBzaXplLCB0aGVuIHdlIHJlZmV0Y2ggZnJvbSB0aGUg
dGFibGUgcmF0aGVyIHRoYW4KLSAgICAvLyBtdWx0aXBseWluZyBieSBvdXIgc2NhbGUgZmFjdG9y
LgotICAgIGZsb2F0IHNpemU7Ci0gICAgaWYgKGNoaWxkRm9udC5rZXl3b3JkU2l6ZSgpKQotICAg
ICAgICBzaXplID0gZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFs
bCArIGNoaWxkRm9udC5rZXl3b3JkU2l6ZSgpIC0gMSwgY2hpbGRGb250LnVzZUZpeGVkRGVmYXVs
dFNpemUoKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3Vt
ZW50U2V0dGluZ3MoKTsKLSAgICAgICAgZmxvYXQgZml4ZWRTY2FsZUZhY3RvciA9IChzZXR0aW5n
cyAmJiBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSAmJiBzZXR0aW5ncy0+ZGVmYXVs
dEZvbnRTaXplKCkpCi0gICAgICAgICAgICA/IHN0YXRpY19jYXN0PGZsb2F0PihzZXR0aW5ncy0+
ZGVmYXVsdEZpeGVkRm9udFNpemUoKSkgLyBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCkKLSAg
ICAgICAgICAgIDogMTsKLSAgICAgICAgc2l6ZSA9IHBhcmVudEZvbnQudXNlRml4ZWREZWZhdWx0
U2l6ZSgpID8KLSAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgpIC8gZml4
ZWRTY2FsZUZhY3RvciA6Ci0gICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUo
KSAqIGZpeGVkU2NhbGVGYWN0b3I7Ci0gICAgfQotCi0gICAgRm9udERlc2NyaXB0aW9uIG5ld0Zv
bnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOwotICAgIHNldEZvbnRTaXplKG5ld0ZvbnREZXNjcmlw
dGlvbiwgc2l6ZSk7Ci0gICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3Jp
cHRpb24pOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRpYWxpemVGb250U3R5bGUoU2V0
dGluZ3MqIHNldHRpbmdzKQotewotICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247
Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpT
dGFuZGFyZEZhbWlseSk7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0
dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQ
cmludGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9u
dFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBzdGFuZGFy
ZEZvbnRGYW1pbHkgPSBkb2N1bWVudFNldHRpbmdzKCktPnN0YW5kYXJkRm9udEZhbWlseSgpOwot
ICAgIGlmICghc3RhbmRhcmRGb250RmFtaWx5LmlzRW1wdHkoKSkgewotICAgICAgICBmb250RGVz
Y3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250RmFtaWx5KTsKLSAg
ICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5KDApOwotICAg
IH0KLSAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRpdW0gLSBD
U1NWYWx1ZVh4U21hbGwgKyAxKTsKLSAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZv
bnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpKTsKLSAg
ICBtX3N0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5l
SGVpZ2h0KCkpOwotICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotICAgIHNldEZv
bnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OnNldEZvbnRTaXplKEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9hdCBzaXpl
KQotewotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOwotICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmll
ZFNpemUoZG9jdW1lbnQoKSwgbV9zdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNv
bHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKLX0KLQotZmxvYXQgU3R5bGVS
ZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3Vt
ZW50LCBSZW5kZXJTdHlsZSogc3R5bGUsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNp
ZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKQotewotICAgIGZsb2F0IHpvb21GYWN0b3Ig
PSAxLjBmOwotICAgIGlmICghdXNlU1ZHWm9vbVJ1bGVzKSB7Ci0gICAgICAgIHpvb21GYWN0b3Ig
PSBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9j
dW1lbnQtPmZyYW1lKCkpCi0gICAgICAgICAgICB6b29tRmFjdG9yICo9IGZyYW1lLT50ZXh0Wm9v
bUZhY3RvcigpOwotICAgIH0KLQotICAgIHJldHVybiBTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRl
ZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgem9vbUZhY3RvciwgaXNBYnNvbHV0ZVNp
emUsIHNwZWNpZmllZFNpemUpOwotfQotCi1mbG9hdCBTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRl
ZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIGZsb2F0IHpvb21GYWN0
b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVTbWFydE1pbmlt
dW1Gb3JGb250U2l6ZSB1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSkKLXsKLSAgICAvLyBUZXh0
IHdpdGggYSAwcHggZm9udCBzaXplIHNob3VsZCBub3QgYmUgdmlzaWJsZSBhbmQgdGhlcmVmb3Jl
IG5lZWRzIHRvIGJlCi0gICAgLy8gZXhlbXB0IGZyb20gbWluaW11bSBmb250IHNpemUgcnVsZXMu
IEFjaWQzIHJlbGllcyBvbiB0aGlzIGZvciBwaXhlbC1wZXJmZWN0Ci0gICAgLy8gcmVuZGVyaW5n
LiBUaGlzIGlzIGFsc28gY29tcGF0aWJsZSB3aXRoIG90aGVyIGJyb3dzZXJzIHRoYXQgaGF2ZSBt
aW5pbXVtCi0gICAgLy8gZm9udCBzaXplIHNldHRpbmdzIChlLmcuIEZpcmVmb3gpLgotICAgIGlm
IChmYWJzZihzcGVjaWZpZWRTaXplKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNp
bG9uKCkpCi0gICAgICAgIHJldHVybiAwLjBmOwotCi0gICAgLy8gV2Ugc3VwcG9ydCB0d28gdHlw
ZXMgb2YgbWluaW11bSBmb250IHNpemUuIFRoZSBmaXJzdCBpcyBhIGhhcmQgb3ZlcnJpZGUgdGhh
dCBhcHBsaWVzIHRvCi0gICAgLy8gYWxsIGZvbnRzLiBUaGlzIGlzICJtaW5TaXplLiIgVGhlIHNl
Y29uZCB0eXBlIG9mIG1pbmltdW0gZm9udCBzaXplIGlzIGEgInNtYXJ0IG1pbmltdW0iCi0gICAg
Ly8gdGhhdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgV2ViIHBhZ2UgY2FuJ3Qga25vdyB3aGF0
IHNpemUgaXQgcmVhbGx5IGFza2VkIGZvciwgZS5nLiwKLSAgICAvLyB3aGVuIGl0IHVzZXMgbG9n
aWNhbCBzaXplcyBsaWtlICJzbWFsbCIgb3IgZXhwcmVzc2VzIHRoZSBmb250LXNpemUgYXMgYSBw
ZXJjZW50YWdlIG9mCi0gICAgLy8gdGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgc2V0dGluZy4KLQot
ICAgIC8vIFdpdGggdGhlIHNtYXJ0IG1pbmltdW0sIHdlIG5ldmVyIHdhbnQgdG8gZ2V0IHNtYWxs
ZXIgdGhhbiB0aGUgbWluaW11bSBmb250IHNpemUgdG8ga2VlcCBmb250cyByZWFkYWJsZS4KLSAg
ICAvLyBIb3dldmVyIHdlIGFsd2F5cyBhbGxvdyB0aGUgcGFnZSB0byBzZXQgYW4gZXhwbGljaXQg
cGl4ZWwgc2l6ZSB0aGF0IGlzIHNtYWxsZXIsCi0gICAgLy8gc2luY2Ugc2l0ZXMgd2lsbCBtaXMt
cmVuZGVyIG90aGVyd2lzZSAoZS5nLiwgaHR0cDovL3d3dy5nYW1lc3BvdC5jb20gd2l0aCBhIDlw
eCBtaW5pbXVtKS4KLQotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5n
cygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxLjBmOwotCi0gICAgaW50
IG1pblNpemUgPSBzZXR0aW5ncy0+bWluaW11bUZvbnRTaXplKCk7Ci0gICAgaW50IG1pbkxvZ2lj
YWxTaXplID0gc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKTsKLSAgICBmbG9hdCB6
b29tZWRTaXplID0gc3BlY2lmaWVkU2l6ZSAqIHpvb21GYWN0b3I7Ci0KLSAgICAvLyBBcHBseSB0
aGUgaGFyZCBtaW5pbXVtIGZpcnN0LiBXZSBvbmx5IGFwcGx5IHRoZSBoYXJkIG1pbmltdW0gaWYg
YWZ0ZXIgem9vbWluZyB3ZSdyZSBzdGlsbCB0b28gc21hbGwuCi0gICAgaWYgKHpvb21lZFNpemUg
PCBtaW5TaXplKQotICAgICAgICB6b29tZWRTaXplID0gbWluU2l6ZTsKLQotICAgIC8vIE5vdyBh
cHBseSB0aGUgInNtYXJ0IG1pbmltdW0uIiBUaGlzIG1pbmltdW0gaXMgYWxzbyBvbmx5IGFwcGxp
ZWQgaWYgd2UncmUgc3RpbGwgdG9vIHNtYWxsCi0gICAgLy8gYWZ0ZXIgem9vbWluZy4gVGhlIGZv
bnQgc2l6ZSBtdXN0IGVpdGhlciBiZSByZWxhdGl2ZSB0byB0aGUgdXNlciBkZWZhdWx0IG9yIHRo
ZSBvcmlnaW5hbCBzaXplCi0gICAgLy8gbXVzdCBoYXZlIGJlZW4gYWNjZXB0YWJsZS4gSW4gb3Ro
ZXIgd29yZHMsIHdlIG9ubHkgYXBwbHkgdGhlIHNtYXJ0IG1pbmltdW0gd2hlbmV2ZXIgd2UncmUg
cG9zaXRpdmUKLSAgICAvLyBkb2luZyBzbyB3b24ndCBkaXNydXB0IHRoZSBsYXlvdXQuCi0gICAg
aWYgKHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplICYmIHpvb21lZFNpemUgPCBtaW5Mb2dpY2Fs
U2l6ZSAmJiAoc3BlY2lmaWVkU2l6ZSA+PSBtaW5Mb2dpY2FsU2l6ZSB8fCAhaXNBYnNvbHV0ZVNp
emUpKQotICAgICAgICB6b29tZWRTaXplID0gbWluTG9naWNhbFNpemU7Ci0KLSAgICAvLyBBbHNv
IGNsYW1wIHRvIGEgcmVhc29uYWJsZSBtYXhpbXVtIHRvIHByZXZlbnQgaW5zYW5lIGZvbnQgc2l6
ZXMgZnJvbSBjYXVzaW5nIGNyYXNoZXMgb24gdmFyaW91cwotICAgIC8vIHBsYXRmb3JtcyAoSSdt
IGxvb2tpbmcgYXQgeW91LCBXaW5kb3dzLikKLSAgICByZXR1cm4gbWluKG1heGltdW1BbGxvd2Vk
Rm9udFNpemUsIHpvb21lZFNpemUpOwotfQotCi1jb25zdCBpbnQgZm9udFNpemVUYWJsZU1heCA9
IDE2OwotY29uc3QgaW50IGZvbnRTaXplVGFibGVNaW4gPSA5OwotY29uc3QgaW50IHRvdGFsS2V5
d29yZHMgPSA4OwotCi0vLyBXaW5JRS9OYXY0IHRhYmxlIGZvciBmb250IHNpemVzLiBEZXNpZ25l
ZCB0byBtYXRjaCB0aGUgbGVnYWN5IGZvbnQgbWFwcGluZyBzeXN0ZW0gb2YgSFRNTC4KLXN0YXRp
YyBjb25zdCBpbnQgcXVpcmtzRm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0gZm9udFNp
emVUYWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KLXsKLSAgICAgIHsgOSwgICAgOSwgICAg
IDksICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyOCB9LAotICAgICAgeyA5LCAgICA5
LCAgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMxIH0sCi0gICAgICB7IDks
ICAgIDksICAgICA5LCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzQgfSwKLSAgICAg
IHsgOSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAzNyB9LAot
ICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYsICAgIDQw
IH0sIC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCi0gICAgICB7IDksICAgIDksICAgIDExLCAg
ICAxNCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKLSAgICAgIHsgOSwgICAxMCwgICAg
MTIsICAgIDE1LCAgICAxNywgICAgMjMsICAgIDMwLCAgICA0NSB9LAotICAgICAgeyA5LCAgIDEw
LCAgICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJvcG9ydGlv
bmFsIGZvbnQgZGVmYXVsdCAoMTYpCi19OwotLy8gSFRNTCAgICAgICAxICAgICAgMiAgICAgIDMg
ICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3Ci0vLyBDU1MgIHh4cyAgIHhzICAgICBzICAgICAg
bSAgICAgIGwgICAgIHhsICAgICB4eGwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0v
LyAgICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKLQotLy8gU3RyaWN0IG1vZGUgdGFibGUg
bWF0Y2hlcyBNYWNJRSBhbmQgTW96aWxsYSdzIHNldHRpbmdzIGV4YWN0bHkuCi1zdGF0aWMgY29u
c3QgaW50IHN0cmljdEZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFi
bGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Ci17Ci0gICAgICB7IDksICAgIDksICAgICA5LCAg
ICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjcgfSwKLSAgICAgIHsgOSwgICAgOSwgICAg
IDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMCB9LAotICAgICAgeyA5LCAgICA5
LCAgICAxMCwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDMzIH0sCi0gICAgICB7IDks
ICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzYgfSwKLSAgICAg
IHsgOSwgICAxMCwgICAgMTIsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICAzOSB9LCAv
LyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQotICAgICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTQs
ICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCi0gICAgICB7IDksICAgMTAsICAgIDEzLCAg
ICAxNSwgICAgMTgsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKLSAgICAgIHsgOSwgICAxMCwgICAg
MTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBm
b250IGRlZmF1bHQgKDE2KQotfTsKLS8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAg
NCAgICAgIDUgICAgICA2ICAgICAgNwotLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAg
ICBsICAgICB4bCAgICAgeHhsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gICAg
ICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCi0KLS8vIEZvciB2YWx1ZXMgb3V0c2lkZSB0aGUg
cmFuZ2Ugb2YgdGhlIHRhYmxlLCB3ZSB1c2UgVG9kZCBGYWhybmVyJ3Mgc3VnZ2VzdGVkIHNjYWxl
Ci0vLyBmYWN0b3JzIGZvciBlYWNoIGtleXdvcmQgdmFsdWUuCi1zdGF0aWMgY29uc3QgZmxvYXQg
Zm9udFNpemVGYWN0b3JzW3RvdGFsS2V5d29yZHNdID0geyAwLjYwZiwgMC43NWYsIDAuODlmLCAx
LjBmLCAxLjJmLCAxLjVmLCAyLjBmLCAzLjBmIH07Ci0KLWZsb2F0IFN0eWxlUmVzb2x2ZXI6OmZv
bnRTaXplRm9yS2V5d29yZChEb2N1bWVudCogZG9jdW1lbnQsIGludCBrZXl3b3JkLCBib29sIHNo
b3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpCi17Ci0gICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9j
dW1lbnQtPnNldHRpbmdzKCk7Ci0gICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAgcmV0dXJuIDEu
MGY7Ci0KLSAgICBib29sIHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5RdWlya3NNb2RlKCk7Ci0g
ICAgaW50IG1lZGl1bVNpemUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplID8gc2V0dGluZ3Mt
PmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCk7Ci0g
ICAgaWYgKG1lZGl1bVNpemUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBtZWRpdW1TaXplIDw9IGZv
bnRTaXplVGFibGVNYXgpIHsKLSAgICAgICAgLy8gTG9vayB1cCB0aGUgZW50cnkgaW4gdGhlIHRh
YmxlLgotICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6ZSAtIGZvbnRTaXplVGFibGVNaW47Ci0g
ICAgICAgIGludCBjb2wgPSAoa2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbCk7Ci0gICAgICAgIHJl
dHVybiBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddW2NvbF0gOiBzdHJpY3RG
b250U2l6ZVRhYmxlW3Jvd11bY29sXTsKLSAgICB9Ci0KLSAgICAvLyBWYWx1ZSBpcyBvdXRzaWRl
IHRoZSByYW5nZSBvZiB0aGUgdGFibGUuIEFwcGx5IHRoZSBzY2FsZSBmYWN0b3IgaW5zdGVhZC4K
LSAgICBmbG9hdCBtaW5Mb2dpY2FsU2l6ZSA9IG1heChzZXR0aW5ncy0+bWluaW11bUxvZ2ljYWxG
b250U2l6ZSgpLCAxKTsKLSAgICByZXR1cm4gbWF4KGZvbnRTaXplRmFjdG9yc1trZXl3b3JkIC0g
Q1NTVmFsdWVYeFNtYWxsXSptZWRpdW1TaXplLCBtaW5Mb2dpY2FsU2l6ZSk7Ci19Ci0KLXRlbXBs
YXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW50IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemUoaW50
IHBpeGVsRm9udFNpemUsIGNvbnN0IFQqIHRhYmxlLCBpbnQgbXVsdGlwbGllcikKLXsKLSAgICAv
LyBJZ25vcmUgdGFibGVbMF0gYmVjYXVzZSB4eC1zbWFsbCBkb2VzIG5vdCBjb3JyZXNwb25kIHRv
IGFueSBsZWdhY3kgZm9udCBzaXplLgotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdG90YWxLZXl3
b3JkcyAtIDE7IGkrKykgewotICAgICAgICBpZiAocGl4ZWxGb250U2l6ZSAqIDIgPCAodGFibGVb
aV0gKyB0YWJsZVtpICsgMV0pICogbXVsdGlwbGllcikKLSAgICAgICAgICAgIHJldHVybiBpOwot
ICAgIH0KLSAgICByZXR1cm4gdG90YWxLZXl3b3JkcyAtIDE7Ci19Ci0KLWludCBTdHlsZVJlc29s
dmVyOjpsZWdhY3lGb250U2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIGludCBwaXhlbEZvbnRTaXpl
LCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpCi17Ci0gICAgU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7Ci0gICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAg
cmV0dXJuIDE7Ci0KLSAgICBib29sIHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5RdWlya3NNb2Rl
KCk7Ci0gICAgaW50IG1lZGl1bVNpemUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplID8gc2V0
dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXpl
KCk7Ci0gICAgaWYgKG1lZGl1bVNpemUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBtZWRpdW1TaXpl
IDw9IGZvbnRTaXplVGFibGVNYXgpIHsKLSAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBm
b250U2l6ZVRhYmxlTWluOwotICAgICAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6
ZTxpbnQ+KHBpeGVsRm9udFNpemUsIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRhYmxlW3Jv
d10gOiBzdHJpY3RGb250U2l6ZVRhYmxlW3Jvd10sIDEpOwotICAgIH0KLQotICAgIHJldHVybiBm
aW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplPGZsb2F0PihwaXhlbEZvbnRTaXplLCBmb250U2l6ZUZh
Y3RvcnMsIG1lZGl1bVNpemUpOwotfQotCi1zdGF0aWMgQ29sb3IgY29sb3JGb3JDU1NWYWx1ZShp
bnQgY3NzVmFsdWVJZCkKLXsKLSAgICBzdHJ1Y3QgQ29sb3JWYWx1ZSB7Ci0gICAgICAgIGludCBj
c3NWYWx1ZUlkOwotICAgICAgICBSR0JBMzIgY29sb3I7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBj
b25zdCBDb2xvclZhbHVlIGNvbG9yVmFsdWVzW10gPSB7Ci0gICAgICAgIHsgQ1NTVmFsdWVBcXVh
LCAweEZGMDBGRkZGIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVCbGFjaywgMHhGRjAwMDAwMCB9LAot
ICAgICAgICB7IENTU1ZhbHVlQmx1ZSwgMHhGRjAwMDBGRiB9LAotICAgICAgICB7IENTU1ZhbHVl
RnVjaHNpYSwgMHhGRkZGMDBGRiB9LAotICAgICAgICB7IENTU1ZhbHVlR3JheSwgMHhGRjgwODA4
MCB9LAotICAgICAgICB7IENTU1ZhbHVlR3JlZW4sIDB4RkYwMDgwMDAgIH0sCi0gICAgICAgIHsg
Q1NTVmFsdWVHcmV5LCAweEZGODA4MDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVMaW1lLCAweEZG
MDBGRjAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVNYXJvb24sIDB4RkY4MDAwMDAgfSwKLSAgICAg
ICAgeyBDU1NWYWx1ZU5hdnksIDB4RkYwMDAwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZU9saXZl
LCAweEZGODA4MDAwICB9LAotICAgICAgICB7IENTU1ZhbHVlT3JhbmdlLCAweEZGRkZBNTAwIH0s
Ci0gICAgICAgIHsgQ1NTVmFsdWVQdXJwbGUsIDB4RkY4MDAwODAgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZVJlZCwgMHhGRkZGMDAwMCB9LAotICAgICAgICB7IENTU1ZhbHVlU2lsdmVyLCAweEZGQzBD
MEMwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVUZWFsLCAweEZGMDA4MDgwICB9LAotICAgICAgICB7
IENTU1ZhbHVlVHJhbnNwYXJlbnQsIDB4MDAwMDAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVdo
aXRlLCAweEZGRkZGRkZGIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVZZWxsb3csIDB4RkZGRkZGMDAg
fSwKLSAgICAgICAgeyAwLCAwIH0KLSAgICB9OwotCi0gICAgZm9yIChjb25zdCBDb2xvclZhbHVl
KiBjb2wgPSBjb2xvclZhbHVlczsgY29sLT5jc3NWYWx1ZUlkOyArK2NvbCkgewotICAgICAgICBp
ZiAoY29sLT5jc3NWYWx1ZUlkID09IGNzc1ZhbHVlSWQpCi0gICAgICAgICAgICByZXR1cm4gY29s
LT5jb2xvcjsKLSAgICB9Ci0gICAgcmV0dXJuIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+
c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y29sb3JG
cm9tUHJpbWl0aXZlVmFsdWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVWYWx1ZSog
dmFsdWUpCi17Ci0gICAgaW50IGlkZW50ID0gdmFsdWUtPmdldElkZW50KCk7Ci0gICAgc3dpdGNo
IChpZGVudCkgewotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgotICAgIGNhc2UgQ1NTVmFs
dWVXZWJraXRMaW5rOgotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRBY3RpdmVsaW5rOgotICAgIGNh
c2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1
bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLUNvbG9yIFN0eWxlUmVzb2x2
ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiB2YWx1ZSwgYm9v
bCBmb3JWaXNpdGVkTGluaykgY29uc3QKLXsKLSAgICBpZiAodmFsdWUtPmlzUkdCQ29sb3IoKSkK
LSAgICAgICAgcmV0dXJuIENvbG9yKHZhbHVlLT5nZXRSR0JBMzJWYWx1ZSgpKTsKLQotICAgIGNv
bnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgaW50IGlkZW50ID0gdmFsdWUtPmdldElk
ZW50KCk7Ci0gICAgc3dpdGNoIChpZGVudCkgewotICAgIGNhc2UgMDoKLSAgICAgICAgcmV0dXJu
IENvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6Ci0gICAgICAgIHJldHVybiBz
dGF0ZS5kb2N1bWVudCgpLT50ZXh0Q29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGlu
azoKLSAgICAgICAgcmV0dXJuIChzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpICYmIGZvclZpc2l0
ZWRMaW5rKSA/IHN0YXRlLmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rQ29sb3IoKSA6IHN0YXRlLmRv
Y3VtZW50KCktPmxpbmtDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRBY3RpdmVsaW5r
OgotICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+YWN0aXZlTGlua0NvbG9yKCk7Ci0g
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEZvY3VzUmluZ0NvbG9yOgotICAgICAgICByZXR1cm4gUmVu
ZGVyVGhlbWU6OmZvY3VzUmluZ0NvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZUN1cnJlbnRjb2xv
cjoKLSAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPmNvbG9yKCk7Ci0gICAgZGVmYXVsdDoK
LSAgICAgICAgcmV0dXJuIGNvbG9yRm9yQ1NTVmFsdWUoaWRlbnQpOwotICAgIH0KLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjphZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHQoY29u
c3QgTWVkaWFRdWVyeUV4cCogZXhwciwgYm9vbCByZXN1bHQpCi17Ci0gICAgbV92aWV3cG9ydERl
cGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmFwcGVuZChhZG9wdFB0cihuZXcgTWVkaWFRdWVyeVJl
c3VsdCgqZXhwciwgcmVzdWx0KSkpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmFmZmVjdGVk
QnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0Ci17Ci0gICAgdW5zaWduZWQgcyA9IG1fdmlld3BvcnRE
ZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHM7IGkrKykgewotICAgICAgICBpZiAobV9tZWRpdW0tPmV2YWwoJm1fdmlld3BvcnRE
ZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9leHByZXNzaW9uKSAhPSBtX3ZpZXdwb3J0
RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fcmVzdWx0KQotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIFRyYW5zZm9y
bU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2Zvcm1PcGVyYXRpb25UeXBlIHR5cGUpCi17Ci0gICAg
c3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFOwotICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlNDQUxFX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2Nh
bGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9a
OwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RUcmFuc2Zvcm1PcGVy
YXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFXzNEOwotICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJu
IFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlRSQU5TTEFURV9YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
OlRSQU5TTEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0
ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFU
RV9aOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZTNEVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfM0Q7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6Uk9UQVRFX1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9U
QVRFX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1o7Ci0gICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHJl
dHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV8zRDsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpTS0VXOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdYVHJh
bnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1g7Ci0gICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb246IHJl
dHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246Ok1BVFJJWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXgz
RFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYXzNE
OwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJhbnNmb3Jt
T3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpQRVJTUEVDVElWRTsKLSAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtub3duVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOwotICAgIH0KLSAgICByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpOT05FOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZVRyYW5z
Zm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucykK
LXsKLSAgICBpZiAoIWluVmFsdWUgfHwgIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsKLSAgICAg
ICAgb3V0T3BlcmF0aW9ucy5jbGVhcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA6
IDE7Ci0gICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgIGZvciAoQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewot
ICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOwotCi0gICAgICAgIGlmICgh
Y3VyclZhbHVlLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSogdHJhbnNmb3JtVmFsdWUg
PSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSo+KGkudmFsdWUoKSk7Ci0gICAg
ICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpKQotICAgICAgICAgICAgY29udGludWU7
Ci0KLSAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKTsgKytqKSB7
Ci0gICAgICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0
aXZlVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIGlmIChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMCkpOwotCi0gICAgICAgIHN3aXRjaCAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSkgewotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2Fs
ZVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJs
ZSBzeCA9IDEuMDsKLSAgICAgICAgICAgIGRvdWJsZSBzeSA9IDEuMDsKLSAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgc3kgPSBmaXJz
dFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAg
ICAgICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUo
KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBz
eSA9IHN4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3Jl
YXRlKHN4LCBzeSwgMS4wLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVl
LT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRp
b246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RUcmFuc2Zv
cm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBzeCA9IDEuMDsKLSAgICAgICAgICAg
IGRvdWJsZSBzeSA9IDEuMDsKLSAgICAgICAgICAgIGRvdWJsZSBzeiA9IDEuMDsKLSAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgc3og
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZWxzZSBpZiAodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1
ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAg
IHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgc3ogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAg
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIHN6LCBn
ZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkp
KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246
Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zv
cm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7
Ci0gICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgdHkg
PSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29t
RmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHR4ID0gY29udmVy
dFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7
Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0g
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsK
LSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0
VG9GbG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7
Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZpbmVkKCkp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvcGVyYXRpb25z
Lm9wZXJhdGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUo
dHgsIHR5LCBMZW5ndGgoMCwgRml4ZWQpLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJh
bnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgTGVuZ3RoIHR4ID0g
TGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgwLCBGaXhl
ZCk7Ci0gICAgICAgICAgICBMZW5ndGggdHogPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAg
dHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6
b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRp
b25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1P
cGVyYXRpb24pCi0gICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJz
dFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2Ug
ewotICAgICAgICAgICAgICAgIHR4ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwg
c3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRy
YW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRy
YW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHRoaXJkVmFsdWUsIHN0
eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxv
YXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0g
ICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpIHx8IHR6
LmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAg
ICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uOjpjcmVhdGUodHgsIHR5LCB0eiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlVHJhbnNm
b3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmaXJzdFZhbHVlLT5j
b21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKDAsIDAsIDEsIGFuZ2xlLCBnZXRU
cmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNmb3JtT3BlcmF0aW9u
OiB7Ci0gICAgICAgICAgICBkb3VibGUgeCA9IDA7Ci0gICAgICAgICAgICBkb3VibGUgeSA9IDA7
Ci0gICAgICAgICAgICBkb3VibGUgeiA9IDA7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBm
aXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotCi0gICAgICAgICAgICBpZiAodHJhbnNmb3Jt
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRl
WFRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB4ID0gMTsKLSAgICAgICAgICAg
IGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAg
eSA9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeiA9IDE7Ci0gICAgICAg
ICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0
aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJh
bnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0
aCgpIDwgNCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmb3VydGhWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpOwot
ICAgICAgICAgICAgZG91YmxlIHggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAg
ICAgICAgICAgZG91YmxlIHkgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAg
ICAgICAgIGRvdWJsZSB6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAg
ICAgIGRvdWJsZSBhbmdsZSA9IGZvdXJ0aFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJh
dGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNm
b3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3
WFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZVgg
PSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlWSA9IDA7Ci0gICAgICAgICAgICBkb3VibGUg
YW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAgaWYgKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIGFuZ2xlWSA9IGFuZ2xl
OwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYW5nbGVYID0gYW5nbGU7Ci0g
ICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb24pIHsKLSAgICAgICAg
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGVZID0gc2Vjb25kVmFsdWUt
PmNvbXB1dGVEZWdyZWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5h
cHBlbmQoU2tld1RyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGFuZ2xlWCwgYW5nbGVZLCBnZXRU
cmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCA2KQotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgZG91YmxlIGEgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAg
ICAgICAgICAgZG91YmxlIGIgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGRvdWJsZSBjID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSktPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICBkb3VibGUgZCA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpLT5nZXREb3VibGVW
YWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGUgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
ayg0KSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgZiA9IHpvb21GYWN0
b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZShhLCBiLCBjLCBkLCBlLCBmKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXgzRFRyYW5zZm9ybU9w
ZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDE2
KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggbWF0cml4KHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVWYWx1ZSgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXRE
b3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMykpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNikpLT5nZXREb3VibGVWYWx1
ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNykpLT5n
ZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soOCkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soOSkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3Jt
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTApKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDExKSktPmdldERvdWJs
ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMTIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMykpLT5nZXREb3VibGVWYWx1
ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTQpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDE1KSktPmdldERvdWJsZVZhbHVlKCkpOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUobWF0
cml4KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAg
ICAgICAgICAgTGVuZ3RoIHAgPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgaWYgKGZp
cnN0VmFsdWUtPmlzTGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgcCA9IGNvbnZlcnRUb0Zsb2F0
TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHF1aXJrIHRoYXQgc2hv
dWxkIGdvIGF3YXkgd2hlbiAzZCB0cmFuc2Zvcm1zIGFyZSBmaW5hbGl6ZWQuCi0gICAgICAgICAg
ICAgICAgZG91YmxlIHZhbCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAg
ICAgICAgICAgcCA9IHZhbCA+PSAwID8gTGVuZ3RoKGNsYW1wVG9Qb3NpdGl2ZUludGVnZXIodmFs
KSwgRml4ZWQpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGlmIChwLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUGVyc3BlY3RpdmVU
cmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtub3duVHJhbnNm
b3JtT3BlcmF0aW9uOgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG91dE9wZXJhdGlvbnMgPSBvcGVy
YXRpb25zOwotICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKQot
c3RhdGljIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBmaWx0ZXJPcGVyYXRpb25Gb3JU
eXBlKFdlYktpdENTU0ZpbHRlclZhbHVlOjpGaWx0ZXJPcGVyYXRpb25UeXBlIHR5cGUpCi17Ci0g
ICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6UmVmZXJl
bmNlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpSRUZF
UkVOQ0U7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6R3JheXNjYWxlRmlsdGVyT3Bl
cmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpHUkFZU0NBTEU7Ci0gICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAg
IHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlNFUElBOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OlNhdHVyYXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3Bl
cmF0aW9uOjpTQVRVUkFURTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpIdWVSb3Rh
dGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkhVRV9S
T1RBVEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0RmlsdGVyT3BlcmF0
aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpJTlZFUlQ7Ci0gICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6T3BhY2l0eUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6T1BBQ0lUWTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpCcmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3Bl
cmF0aW9uOjpCUklHSFRORVNTOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkNvbnRy
YXN0RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDT05U
UkFTVDsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpCTFVSOwotICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVy
biBGaWx0ZXJPcGVyYXRpb246OkRST1BfU0hBRE9XOwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykK
LSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDdXN0b21GaWx0ZXJPcGVyYXRpb246Ci0g
ICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTTsKLSNlbmRpZgotICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJl
dHVybiBGaWx0ZXJPcGVyYXRpb246Ok5PTkU7Ci0gICAgfQotICAgIHJldHVybiBGaWx0ZXJPcGVy
YXRpb246Ok5PTkU7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcp
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCkKLXsKLSAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmICghc3RhdGUuc3R5bGUoKS0+aGFzRmlsdGVy
KCkgfHwgc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0g
c3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLSAgICBWZWN0b3I8UmVm
UHRyPEZpbHRlck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IHN0YXRlLnN0eWxlKCkt
Pm11dGFibGVGaWx0ZXIoKS5vcGVyYXRpb25zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGZpbHRlck9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgUmVmUHRyPEZpbHRl
ck9wZXJhdGlvbj4gZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5hdChpKTsKLSAg
ICAgICAgaWYgKGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09IEZpbHRlck9w
ZXJhdGlvbjo6UkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICBSZWZlcmVuY2VGaWx0ZXJPcGVyYXRp
b24qIHJlZmVyZW5jZUZpbHRlciA9IHN0YXRpY19jYXN0PFJlZmVyZW5jZUZpbHRlck9wZXJhdGlv
bio+KGZpbHRlck9wZXJhdGlvbi5nZXQoKSk7Ci0KLSAgICAgICAgICAgIFdlYktpdENTU1NWR0Rv
Y3VtZW50VmFsdWUqIHZhbHVlID0gc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmdldChyZWZl
cmVuY2VGaWx0ZXIpLmdldCgpOwotICAgICAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENhY2hlZFNWR0RvY3VtZW50KiBjYWNoZWREb2N1
bWVudCA9IHZhbHVlLT5sb2FkKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICAgICAgICAgIGlm
ICghY2FjaGVkRG9jdW1lbnQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
ICAgIC8vIFN0YXNoIHRoZSBDYWNoZWRTVkdEb2N1bWVudCBvbiB0aGUgcmVmZXJlbmNlIGZpbHRl
ci4KLSAgICAgICAgICAgIHJlZmVyZW5jZUZpbHRlci0+c2V0Q2FjaGVkU1ZHRG9jdW1lbnRSZWZl
cmVuY2UoYWRvcHRQdHIobmV3IENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGNhY2hlZERvY3Vt
ZW50KSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMo
KS5jbGVhcigpOwotfQotI2VuZGlmCi0KLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi1TdHlsZVNo
YWRlciogU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFkZXIoQ1NTVmFsdWUqIHZhbHVlKQotewotICAg
IGlmICh2YWx1ZS0+aXNXZWJLaXRDU1NTaGFkZXJWYWx1ZSgpKQotICAgICAgICByZXR1cm4gY2Fj
aGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU2hh
ZGVyVmFsdWUqPih2YWx1ZSkpOwotICAgIHJldHVybiAwOwotfQotCi1TdHlsZVNoYWRlciogU3R5
bGVSZXNvbHZlcjo6Y2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2ViS2l0Q1NT
U2hhZGVyVmFsdWUqIHZhbHVlKQotewotICAgIFN0eWxlU2hhZGVyKiBzaGFkZXIgPSB2YWx1ZS0+
Y2FjaGVkT3JQZW5kaW5nU2hhZGVyKCk7Ci0gICAgaWYgKHNoYWRlciAmJiBzaGFkZXItPmlzUGVu
ZGluZ1NoYWRlcigpKQotICAgICAgICBtX3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJzKHRydWUp
OwotICAgIHJldHVybiBzaGFkZXI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRp
bmdTaGFkZXJzKCkKLXsKLSAgICBpZiAoIW1fc3RhdGUuc3R5bGUoKS0+aGFzRmlsdGVyKCkgfHwg
IW1fc3RhdGUuaGFzUGVuZGluZ1NoYWRlcnMoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQ2Fj
aGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0gbV9zdGF0ZS5kb2N1bWVu
dCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOwotCi0gICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJP
cGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBtX3N0YXRlLnN0eWxlKCktPm11dGFibGVG
aWx0ZXIoKS5vcGVyYXRpb25zKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpbHRl
ck9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgUmVmUHRyPEZpbHRlck9wZXJhdGlv
bj4gZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5hdChpKTsKLSAgICAgICAgaWYg
KGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09IEZpbHRlck9wZXJhdGlvbjo6
Q1VTVE9NKSB7Ci0gICAgICAgICAgICBDdXN0b21GaWx0ZXJPcGVyYXRpb24qIGN1c3RvbUZpbHRl
ciA9IHN0YXRpY19jYXN0PEN1c3RvbUZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbi5n
ZXQoKSk7Ci0gICAgICAgICAgICBBU1NFUlQoY3VzdG9tRmlsdGVyLT5wcm9ncmFtKCkpOwotICAg
ICAgICAgICAgU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtKiBwcm9ncmFtID0gc3RhdGljX2Nhc3Q8
U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtKj4oY3VzdG9tRmlsdGVyLT5wcm9ncmFtKCkpOwotICAg
ICAgICAgICAgaWYgKHByb2dyYW0tPnZlcnRleFNoYWRlcigpICYmIHByb2dyYW0tPnZlcnRleFNo
YWRlcigpLT5pc1BlbmRpbmdTaGFkZXIoKSkgewotICAgICAgICAgICAgICAgIFdlYktpdENTU1No
YWRlclZhbHVlKiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRlcio+
KHByb2dyYW0tPnZlcnRleFNoYWRlcigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKLSAgICAgICAgICAg
ICAgICBwcm9ncmFtLT5zZXRWZXJ0ZXhTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihj
YWNoZWRSZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBy
b2dyYW0tPmZyYWdtZW50U2hhZGVyKCkgJiYgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS0+aXNQ
ZW5kaW5nU2hhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSog
c2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT5m
cmFnbWVudFNoYWRlcigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBwcm9n
cmFtLT5zZXRGcmFnbWVudFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVyKGNhY2hlZFJl
c291cmNlTG9hZGVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9z
dGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyhmYWxzZSk7Ci19Ci0KLXN0YXRpYyBib29sIHNvcnRQ
YXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRvcihjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1l
dGVyPiYgYSwgY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGIpCi17Ci0gICAg
cmV0dXJuIGNvZGVQb2ludENvbXBhcmVMZXNzVGhhbihhLT5uYW1lKCksIGItPm5hbWUoKSk7Ci19
Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJz
ZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVM
aXN0KiB2YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyPiBh
cnJheVBhcmFtZXRlciA9IEN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbGVuZ3RoID0gdmFsdWVzLT5sZW5ndGgoKTsgaSA8
IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVlcy0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjayhpKTsKLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1
ZSgpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwot
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRp
dmVWYWx1ZTo6Q1NTX05VTUJFUikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBhcnJh
eVBhcmFtZXRlci0+YWRkVmFsdWUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCkpOwot
ICAgIH0KLSAgICByZXR1cm4gYXJyYXlQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNzUmVm
UHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0
ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVl
cykKLXsKLSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyPiBudW1iZXJQYXJh
bWV0ZXIgPSBDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFsdWVzLT5sZW5ndGgoKTsgKytpKSB7Ci0gICAgICAg
IENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKLSAg
ICAgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwotICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikKLSAg
ICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBudW1iZXJQYXJhbWV0ZXItPmFkZFZhbHVlKHBy
aW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bWJl
clBhcmFtZXRlci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1l
dGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihj
b25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI+IHRyYW5zZm9ybVBhcmFtZXRlciA9IEN1c3Rv
bUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwotICAgIFRyYW5zZm9ybU9w
ZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVl
cywgbV9zdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9u
cyk7Ci0gICAgdHJhbnNmb3JtUGFyYW1ldGVyLT5zZXRPcGVyYXRpb25zKG9wZXJhdGlvbnMpOwot
ICAgIHJldHVybiB0cmFuc2Zvcm1QYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRy
PEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZSogcGFyYW1ldGVyVmFsdWUpCi17
Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudCBvdGhlciBwYXJhbWV0ZXJzIHR5cGVzIHBhcnNpbmcu
Ci0gICAgLy8gYm9vbGVhbnM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD03NjQzOAotICAgIC8vIHRleHR1cmVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NzE0NDIKLSAgICAvLyBtYXQyLCBtYXQzLCBtYXQ0OiBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NDQKLSAgICAvLyBOdW1iZXIgcGFyYW1ldGVycyBh
cmUgd3JhcHBlZCBpbnNpZGUgYSBDU1NWYWx1ZUxpc3QgYW5kIGFsbAotICAgIC8vIHRoZSBvdGhl
ciBmdW5jdGlvbnMgdmFsdWVzIGluaGVyaXQgZnJvbSBDU1NWYWx1ZUxpc3QuCi0gICAgaWYgKCFw
YXJhbWV0ZXJWYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBD
U1NWYWx1ZUxpc3QqIHZhbHVlcyA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHBhcmFtZXRl
clZhbHVlKTsKLSAgICBpZiAoIXZhbHVlcy0+bGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgaWYgKHBhcmFtZXRlclZhbHVlLT5pc1dlYktpdENTU0FycmF5RnVuY3Rpb25WYWx1ZSgp
KQotICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihuYW1lLCB2
YWx1ZXMpOwotCi0gICAgLy8gSWYgdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBsaXN0IGlzIGEgdHJh
bnNmb3JtIGZ1bmN0aW9uLAotICAgIC8vIHRoZW4gd2UgY291bGQgc2FmZWx5IGFzc3VtZSB0aGF0
IGFsbCB0aGUgcmVtYWluaW5nIGl0ZW1zCi0gICAgLy8gYXJlIHRyYW5zZm9ybXMuIHBhcnNlQ3Vz
dG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyIHdpbGwKLSAgICAvLyByZXR1cm4gMCBpZiB0aGF0
IGFzc3VtcHRpb24gaXMgaW5jb3JyZWN0LgotICAgIGlmICh2YWx1ZXMtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMCktPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKLSAgICAgICAgcmV0dXJu
IHBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7Ci0KLSAg
ICAvLyBXZSBjYW4gaGF2ZSBvbmx5IGFycmF5cyBvZiBib29sZWFucyBvciBudW1iZXJzLCBzbyB1
c2UgdGhlIGZpcnN0IHZhbHVlIHRvIGNob29zZSBiZXR3ZWVuIHRob3NlIHR3by4KLSAgICAvLyBX
ZSBuZWVkIHVwIHRvIDQgdmFsdWVzIChhbGwgYm9vbGVhbnMgb3IgYWxsIG51bWJlcnMpLgotICAg
IGlmICghdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVl
KCkgfHwgdmFsdWVzLT5sZW5ndGgoKSA+IDQpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOwotICAg
IGlmIChmaXJzdFByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZl
VmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlck51bWJl
clBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOwotCi0gICAgLy8gRklYTUU6IEltcGxlbWVudCB0aGUg
Ym9vbGVhbiBhcnJheSBwYXJhbWV0ZXIgaGVyZS4KLSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIFN0
eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NWYWx1ZSogcGFy
YW1ldGVyc1ZhbHVlLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0JiBwYXJhbWV0ZXJMaXN0KQot
ewotICAgIEhhc2hTZXQ8U3RyaW5nPiBrbm93blBhcmFtZXRlck5hbWVzOwotICAgIENTU1ZhbHVl
TGlzdEl0ZXJhdG9yIHBhcmFtZXRlckl0ZXJhdG9yKHBhcmFtZXRlcnNWYWx1ZSk7Ci0gICAgZm9y
ICg7IHBhcmFtZXRlckl0ZXJhdG9yLmhhc01vcmUoKTsgcGFyYW1ldGVySXRlcmF0b3IuYWR2YW5j
ZSgpKSB7Ci0gICAgICAgIGlmICghcGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKS0+aXNWYWx1ZUxp
c3QoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRl
cmF0b3IgaXRlcmF0b3IocGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgIGlmICgh
aXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBpZiAocHJpbWl0
aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1NUUklO
RykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBu
YW1lID0gcHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgIC8vIERvIG5v
dCBhbGxvdyBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzLgotICAgICAgICBpZiAoa25vd25QYXJh
bWV0ZXJOYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAga25vd25QYXJhbWV0ZXJOYW1lcy5hZGQobmFtZSk7Ci0gICAgICAgIAotICAgICAgICBp
dGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc01v
cmUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIFJlZlB0
cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcmFtZXRlciA9IHBhcnNlQ3VzdG9tRmlsdGVyUGFy
YW1ldGVyKG5hbWUsIGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBpZiAoIXBhcmFtZXRlcikK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcGFyYW1ldGVyTGlzdC5hcHBlbmQo
cGFyYW1ldGVyLnJlbGVhc2UoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIE1ha2Ugc3VyZSB3ZSBz
b3J0IHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBwYXNzaW5nIHRoZW0gZG93biB0byB0aGUgQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uLgotICAgIHN0ZDo6c29ydChwYXJhbWV0ZXJMaXN0LmJlZ2luKCksIHBh
cmFtZXRlckxpc3QuZW5kKCksIHNvcnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRvcik7Ci0gICAg
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
PiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVm
ZXJlbmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAgICAv
LyBGSVhNRTogSW1wbGVtZW50IHN0eWxlIHJlc29sdXRpb24gZm9yIHRoZSBjdXN0b20gZmlsdGVy
IGF0LXJ1bGUgcmVmZXJlbmNlIHN5bnRheC4KLSAgICBVTlVTRURfUEFSQU0oZmlsdGVyVmFsdWUp
OwotICAgIHJldHVybiAwOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4g
U3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRh
eChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAgQ1NTVmFsdWUqIHNo
YWRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOwotICAg
IEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNoYWRlcnNWYWx1ZS0+aXNWYWx1ZUxp
c3QoKSk7Ci0gICAgQ1NTVmFsdWVMaXN0KiBzaGFkZXJzTGlzdCA9IHN0YXRpY19jYXN0PENTU1Zh
bHVlTGlzdCo+KHNoYWRlcnNWYWx1ZSk7Ci0KLSAgICB1bnNpZ25lZCBzaGFkZXJzTGlzdExlbmd0
aCA9IHNoYWRlcnNMaXN0LT5sZW5ndGgoKTsKLSAgICBBU1NFUlQoc2hhZGVyc0xpc3RMZW5ndGgp
OwotCi0gICAgUmVmUHRyPFN0eWxlU2hhZGVyPiB2ZXJ0ZXhTaGFkZXIgPSBzdHlsZVNoYWRlcihz
aGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7Ci0gICAgUmVmUHRyPFN0eWxl
U2hhZGVyPiBmcmFnbWVudFNoYWRlcjsKLSAgICBDdXN0b21GaWx0ZXJQcm9ncmFtVHlwZSBwcm9n
cmFtVHlwZSA9IFBST0dSQU1fVFlQRV9CTEVORFNfRUxFTUVOVF9URVhUVVJFOwotICAgIEN1c3Rv
bUZpbHRlclByb2dyYW1NaXhTZXR0aW5ncyBtaXhTZXR0aW5nczsKLQotICAgIGlmIChzaGFkZXJz
TGlzdExlbmd0aCA+IDEpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGZyYWdtZW50U2hhZGVyT3JNaXhG
dW5jdGlvbiA9IHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpOwotCi0gICAg
ICAgIGlmIChmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24tPmlzV2ViS2l0Q1NTTWl4RnVuY3Rp
b25WYWx1ZSgpKSB7Ci0gICAgICAgICAgICBXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKiBtaXhG
dW5jdGlvbiA9IHN0YXRpY19jYXN0PFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUqPihmcmFnbWVu
dFNoYWRlck9yTWl4RnVuY3Rpb24pOwotICAgICAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aXRlcmF0b3IobWl4RnVuY3Rpb24pOwotCi0gICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24t
Pmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVTaGFkZXIoaXRl
cmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0KLSAgICAg
ICAgICAgIEFTU0VSVChtaXhGdW5jdGlvbi0+bGVuZ3RoKCkgPD0gMyk7Ci0gICAgICAgICAgICB3
aGlsZSAoaXRlcmF0b3IuaGFzTW9yZSgpKSB7Ci0gICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihp
dGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoQ1NTUGFyc2VyOjppc0JsZW5k
TW9kZShwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkpCi0gICAgICAgICAgICAgICAgICAgIG1p
eFNldHRpbmdzLmJsZW5kTW9kZSA9ICpwcmltaXRpdmVWYWx1ZTsKLSAgICAgICAgICAgICAgICBl
bHNlIGlmIChDU1NQYXJzZXI6OmlzQ29tcG9zaXRlT3BlcmF0b3IocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkpKQotICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5jb21wb3NpdGVPcGVy
YXRvciA9ICpwcmltaXRpdmVWYWx1ZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9y
LmFkdmFuY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IHByb2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX05PX0VMRU1FTlRfVEVYVFVSRTsKLSAgICAgICAg
ICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVTaGFkZXIoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0
aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB1bnNpZ25lZCBtZXNoUm93cyA9IDE7
Ci0gICAgdW5zaWduZWQgbWVzaENvbHVtbnMgPSAxOwotICAgIEN1c3RvbUZpbHRlck1lc2hUeXBl
IG1lc2hUeXBlID0gTWVzaFR5cGVBdHRhY2hlZDsKLSAgICAKLSAgICBDU1NWYWx1ZSogcGFyYW1l
dGVyc1ZhbHVlID0gMDsKLSAgICAKLSAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID4gMSkg
ewotICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihmaWx0ZXJWYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgc2Vjb25k
IHZhbHVlIG1pZ2h0IGJlIHRoZSBtZXNoIGJveCBvciB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzOgot
ICAgICAgICAvLyBJZiBpdCBzdGFydHMgd2l0aCBhIG51bWJlciBvciBhbnkgb2YgdGhlIG1lc2gt
Ym94IGlkZW50aWZpZXJzIGl0IGlzIAotICAgICAgICAvLyB0aGUgbWVzaC1ib3ggbGlzdCwgaWYg
bm90IGl0IG1lYW5zIGl0IGlzIHRoZSBwYXJhbWV0ZXJzIGxpc3QuCi0KLSAgICAgICAgaWYgKGl0
ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAg
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBvbmx5IG9u
ZSBpbnRlZ2VyIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBzZXQgYm90aAotICAgICAgICAg
ICAgICAgIC8vIHRoZSByb3dzIGFuZCB0aGUgY29sdW1ucy4KLSAgICAgICAgICAgICAgICBtZXNo
Q29sdW1ucyA9IG1lc2hSb3dzID0gcHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCk7Ci0gICAg
ICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhbm90aGVyIG51bWJlciBmb3IgdGhlIHJvd3MuCi0g
ICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1p
dGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHBy
aW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52
YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJl
cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVl
LT5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5j
ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgp
ICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
PihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0
SWRlbnQoKSA9PSBDU1NWYWx1ZURldGFjaGVkKSB7Ci0gICAgICAgICAgICAgICAgbWVzaFR5cGUg
PSBNZXNoVHlwZURldGFjaGVkOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFpdGVyYXRv
ci5pbmRleCgpKSB7Ci0gICAgICAgICAgICAvLyBJZiBubyB2YWx1ZSB3YXMgY29uc3VtZWQgZnJv
bSB0aGUgbWVzaCB2YWx1ZSwgdGhlbiBpdCBpcyBqdXN0IGEgcGFyYW1ldGVyIGxpc3QsIG1lYW5p
bmcgdGhhdCB3ZSBlbmQgdXAKLSAgICAgICAgICAgIC8vIGhhdmluZyBqdXN0IHR3byBDU1NMaXN0
VmFsdWVzOiBsaXN0IG9mIHNoYWRlcnMgYW5kIGxpc3Qgb2YgcGFyYW1ldGVycy4KLSAgICAgICAg
ICAgIEFTU0VSVChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMik7Ci0gICAgICAgICAgICBwYXJh
bWV0ZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKLSAg
ICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID4gMiAm
JiAhcGFyYW1ldGVyc1ZhbHVlKQotICAgICAgICBwYXJhbWV0ZXJzVmFsdWUgPSBmaWx0ZXJWYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKTsKLSAgICAKLSAgICBDdXN0b21GaWx0ZXJQYXJh
bWV0ZXJMaXN0IHBhcmFtZXRlckxpc3Q7Ci0gICAgaWYgKHBhcmFtZXRlcnNWYWx1ZSAmJiAhcGFy
c2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KHBhcmFtZXRlcnNWYWx1ZSwgcGFyYW1ldGVyTGlz
dCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIFJlZlB0cjxTdHlsZUN1c3RvbUZpbHRl
clByb2dyYW0+IHByb2dyYW0gPSBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW06OmNyZWF0ZSh2ZXJ0
ZXhTaGFkZXIucmVsZWFzZSgpLCBmcmFnbWVudFNoYWRlci5yZWxlYXNlKCksIHByb2dyYW1UeXBl
LCBtaXhTZXR0aW5ncywgbWVzaFR5cGUpOwotICAgIHJldHVybiBDdXN0b21GaWx0ZXJPcGVyYXRp
b246OmNyZWF0ZShwcm9ncmFtLnJlbGVhc2UoKSwgcGFyYW1ldGVyTGlzdCwgbWVzaFJvd3MsIG1l
c2hDb2x1bW5zLCBtZXNoVHlwZSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oV2ViS2l0Q1NT
RmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQotewotICAgIEFTU0VSVChmaWx0ZXJWYWx1ZS0+bGVu
Z3RoKCkpOwotICAgIGJvb2wgaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPSBmaWx0ZXJWYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpOwotICAgIHJldHVy
biBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA/IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldp
dGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoZmlsdGVyVmFsdWUpIDogY3JlYXRlQ3VzdG9tRmlsdGVy
T3BlcmF0aW9uV2l0aElubGluZVN5bnRheChmaWx0ZXJWYWx1ZSk7Ci19Ci0KLSNlbmRpZgotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFs
dWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3Bl
cmF0aW9ucyYgb3V0T3BlcmF0aW9ucykKLXsKLSAgICBBU1NFUlQob3V0T3BlcmF0aW9ucy5pc0Vt
cHR5KCkpOwotICAgIAotICAgIGlmICghaW5WYWx1ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIAotICAgIGlmIChpblZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPihpblZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
ID09IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAK
LSAgICBpZiAoIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29tKCkg
OiAxOwotICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICBmb3IgKENTU1ZhbHVl
TGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAg
ICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgaWYgKCFjdXJy
VmFsdWUtPmlzV2ViS2l0Q1NTRmlsdGVyVmFsdWUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgIFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSA9IHN0YXRpY19jYXN0
PFdlYktpdENTU0ZpbHRlclZhbHVlKj4oaS52YWx1ZSgpKTsKLSAgICAgICAgRmlsdGVyT3BlcmF0
aW9uOjpPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBmaWx0ZXJPcGVyYXRpb25Gb3JUeXBl
KGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkpOwotCi0jaWYgRU5BQkxFKENTU19TSEFERVJT
KQotICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OlZBTElEQVRF
RF9DVVNUT00pIHsKLSAgICAgICAgICAgIC8vIFZhbGlkYXRlZEN1c3RvbUZpbHRlck9wZXJhdGlv
biBpcyBub3Qgc3VwcG9zZWQgdG8gZW5kIHVwIGluIHRoZSBSZW5kZXJTdHlsZS4KLSAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IH0KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT00p
IHsKLSAgICAgICAgICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9
IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihmaWx0ZXJWYWx1ZSk7Ci0gICAgICAgICAgICBp
ZiAoIW9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24p
OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBpZiAo
b3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewotI2lmIEVOQUJM
RShTVkcpCi0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9IDEpCi0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDU1NWYWx1ZSogYXJndW1lbnQgPSBm
aWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKLQotICAgICAgICAgICAgaWYg
KCFhcmd1bWVudC0+aXNXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKCkpCi0gICAgICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWUqIHN2
Z0RvY3VtZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKj4o
YXJndW1lbnQpOwotICAgICAgICAgICAgS1VSTCB1cmwgPSBtX3N0YXRlLmRvY3VtZW50KCktPmNv
bXBsZXRlVVJMKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpKTsKLQotICAgICAgICAgICAgUmVmUHRy
PFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0aW9uID0gUmVmZXJlbmNlRmlsdGVyT3Bl
cmF0aW9uOjpjcmVhdGUoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIHVybC5mcmFnbWVudElkZW50
aWZpZXIoKSwgb3BlcmF0aW9uVHlwZSk7Ci0gICAgICAgICAgICBpZiAoU1ZHVVJJUmVmZXJlbmNl
Ojppc0V4dGVybmFsVVJJUmVmZXJlbmNlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCBtX3N0YXRl
LmRvY3VtZW50KCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdmdEb2N1bWVudFZhbHVlLT5s
b2FkUmVxdWVzdGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIG1fc3RhdGUucGVuZGluZ1NWR0Rv
Y3VtZW50cygpLnNldChvcGVyYXRpb24uZ2V0KCksIHN2Z0RvY3VtZW50VmFsdWUpOwotICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKHN2Z0RvY3VtZW50VmFsdWUtPmNhY2hlZFNWR0RvY3VtZW50KCkp
Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi0+c2V0Q2FjaGVkU1ZHRG9jdW1lbnRSZWZl
cmVuY2UoYWRvcHRQdHIobmV3IENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKHN2Z0RvY3VtZW50
VmFsdWUtPmNhY2hlZFNWR0RvY3VtZW50KCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKLSNlbmRpZgotICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0aGF0IGFs
bCBwYXJhbWV0ZXJzIGFyZSBwcmltaXRpdmUgdmFsdWVzLCB3aXRoIHRoZQotICAgICAgICAvLyBl
eGNlcHRpb24gb2YgZHJvcCBzaGFkb3cgd2hpY2ggaGFzIGEgU2hhZG93VmFsdWUgcGFyYW1ldGVy
LgotICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSAhPSBGaWx0ZXJPcGVyYXRpb246OkRST1BfU0hB
RE9XKSB7Ci0gICAgICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZhbHNlOwot
ICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZpbHRlclZhbHVlLT5sZW5ndGgo
KTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXZl
Tm9uUHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K
LQotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RWYWx1ZSA9IGZpbHRlclZhbHVlLT5s
ZW5ndGgoKSA/IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlsdGVyVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpIDogMDsKLSAgICAgICAgc3dpdGNoIChmaWx0ZXJWYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OlNhdHVyYXRlRmlsdGVyT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW1v
dW50ID0gMTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgewot
ICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0g
ICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQotICAgICAgICAg
ICAgICAgICAgICBhbW91bnQgLz0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJh
dGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRl
RmlsdGVyT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUgPSAwOwotICAgICAg
ICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKQotICAgICAgICAgICAgICAgIGFu
Z2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLQotICAgICAgICAgICAgb3BlcmF0
aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246
OmNyZWF0ZShhbmdsZSwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0RmlsdGVyT3Bl
cmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmlnaHRuZXNzRmls
dGVyT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFz
dEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6T3Bh
Y2l0eUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IChmaWx0
ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmlnaHRu
ZXNzRmlsdGVyT3BlcmF0aW9uKSA/IDAgOiAxOwotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RWYWx1ZS0+
Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNQZXJj
ZW50YWdlKCkpCi0gICAgICAgICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0Nv
bXBvbmVudFRyYW5zZmVyRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVyYXRpb25U
eXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVyT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5n
dGggc3RkRGV2aWF0aW9uID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmIChmaWx0
ZXJWYWx1ZS0+bGVuZ3RoKCkgPj0gMSkKLSAgICAgICAgICAgICAgICBzdGREZXZpYXRpb24gPSBj
b252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFj
dG9yKTsKLSAgICAgICAgICAgIGlmIChzdGREZXZpYXRpb24uaXNVbmRlZmluZWQoKSkKLSAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0
aW9ucygpLmFwcGVuZChCbHVyRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoc3RkRGV2aWF0aW9uLCBv
cGVyYXRpb25UeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOiB7Ci0g
ICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9IDEpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBDU1NWYWx1ZSogY3NzVmFsdWUgPSBmaWx0
ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKLSAgICAgICAgICAgIGlmICghY3Nz
VmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAg
ICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dWYWx1ZSo+KGNz
c1ZhbHVlKTsKLSAgICAgICAgICAgIEludFBvaW50IGxvY2F0aW9uKGl0ZW0tPngtPmNvbXB1dGVM
ZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKSk7Ci0gICAgICAgICAgICBpbnQgYmx1ciA9IGl0ZW0tPmJsdXIgPyBp
dGVtLT5ibHVyLT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rv
cikgOiAwOwotICAgICAgICAgICAgQ29sb3IgY29sb3I7Ci0gICAgICAgICAgICBpZiAoaXRlbS0+
Y29sb3IpCi0gICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShp
dGVtLT5jb2xvci5nZXQoKSk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUobG9jYXRpb24sIGJsdXIs
IGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50LCBvcGVyYXRpb25U
eXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBkZWZhdWx0
OgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIG91dE9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAg
IHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHls
ZVJlc29sdmVyOjpsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKiBwZW5kaW5nSW1h
Z2UpCi17Ci0gICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0g
bV9zdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOwotCi0gICAgaWYgKHBl
bmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0ltYWdlVmFsdWUqIGlt
YWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKTsKLSAgICAgICAgcmV0dXJu
IGltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0K
LSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKLSAgICAg
ICAgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogaW1hZ2VHZW5lcmF0b3JWYWx1ZSA9IHBlbmRpbmdJ
bWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpOwotICAgICAgICBpbWFnZUdlbmVyYXRvclZh
bHVlLT5sb2FkU3ViaW1hZ2VzKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICAgICAgcmV0dXJu
IFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShpbWFnZUdlbmVyYXRvclZhbHVlKTsKLSAgICB9
Ci0KLSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NDdXJzb3JJbWFnZVZhbHVlKCkpIHsKLSAgICAg
ICAgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogY3Vyc29ySW1hZ2VWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+
Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY3Vyc29ySW1hZ2VWYWx1ZS0+
Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIH0KLQotI2lmIEVOQUJMRShD
U1NfSU1BR0VfU0VUKQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlU2V0VmFsdWUoKSkg
ewotICAgICAgICBDU1NJbWFnZVNldFZhbHVlKiBpbWFnZVNldFZhbHVlID0gcGVuZGluZ0ltYWdl
LT5jc3NJbWFnZVNldFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBpbWFnZVNldFZhbHVlLT5jYWNo
ZWRJbWFnZVNldChjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBy
ZXR1cm4gMDsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ0ltYWdlcygpCi17
Ci0gICAgaWYgKG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0X2l0ZXJh
dG9yOjpLZXlzIGVuZCA9IG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmVuZCgpLmtl
eXMoKTsKLSAgICBmb3IgKFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6
S2V5cyBpdCA9IG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmJlZ2luKCkua2V5cygp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgQ1NTUHJvcGVydHlJRCBjdXJyZW50UHJvcGVy
dHkgPSAqaXQ7Ci0KLSAgICAgICAgc3dpdGNoIChjdXJyZW50UHJvcGVydHkpIHsKLSAgICAgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZTogewotICAgICAgICAgICAgZm9yIChGaWxs
TGF5ZXIqIGJhY2tncm91bmRMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzQmFja2dyb3Vu
ZExheWVycygpOyBiYWNrZ3JvdW5kTGF5ZXI7IGJhY2tncm91bmRMYXllciA9IGJhY2tncm91bmRM
YXllci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRMYXllci0+aW1h
Z2UoKSAmJiBiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAg
ICAgICAgICAgICAgICAgIGJhY2tncm91bmRMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGJhY2tncm91bmRMYXllci0+aW1hZ2Uo
KSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICAgIGNhc2UgQ1NTUHJvcGVydHlDb250ZW50OiB7Ci0gICAgICAgICAgICBmb3IgKENvbnRlbnRE
YXRhKiBjb250ZW50RGF0YSA9IGNvbnN0X2Nhc3Q8Q29udGVudERhdGEqPihtX3N0YXRlLnN0eWxl
KCktPmNvbnRlbnREYXRhKCkpOyBjb250ZW50RGF0YTsgY29udGVudERhdGEgPSBjb250ZW50RGF0
YS0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREYXRhLT5pc0ltYWdlKCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgU3R5bGVJbWFnZSogaW1hZ2UgPSBzdGF0aWNfY2FzdDxJ
bWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5pbWFnZSgpOwotICAgICAgICAgICAgICAg
ICAgICBpZiAoaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJbWFnZSA9IGxvYWRQZW5kaW5nSW1hZ2Uoc3Rh
dGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGxvYWRlZEltYWdlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPnNldEltYWdlKGxvYWRlZElt
YWdlLnJlbGVhc2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIENTU1Byb3BlcnR5Q3Vyc29yOiB7Ci0gICAgICAgICAgICBpZiAoQ3Vyc29yTGlzdCogY3Vy
c29yTGlzdCA9IG1fc3RhdGUuc3R5bGUoKS0+Y3Vyc29ycygpKSB7Ci0gICAgICAgICAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBjdXJzb3JMaXN0LT5zaXplKCk7ICsraSkgewotICAgICAg
ICAgICAgICAgICAgICBDdXJzb3JEYXRhJiBjdXJyZW50Q3Vyc29yID0gY3Vyc29yTGlzdC0+YXQo
aSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTdHlsZUltYWdlKiBpbWFnZSA9IGN1cnJlbnRD
dXJzb3IuaW1hZ2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1Bl
bmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDdXJzb3Iu
c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+
KGltYWdlKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBD
U1NQcm9wZXJ0eUxpc3RTdHlsZUltYWdlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHls
ZSgpLT5saXN0U3R5bGVJbWFnZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2Uo
KS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNl
dExpc3RTdHlsZUltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5n
SW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCkpKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VT
b3VyY2U6IHsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291
cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJ
bWFnZSgpKQotICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0Qm9yZGVySW1hZ2VT
b3VyY2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1f
c3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKSkpKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZsZWN0OiB7
Ci0gICAgICAgICAgICBpZiAoU3R5bGVSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbV9zdGF0ZS5z
dHlsZSgpLT5ib3hSZWZsZWN0KCkpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBOaW5lUGllY2VJ
bWFnZSYgbWFza0ltYWdlID0gcmVmbGVjdGlvbi0+bWFzaygpOwotICAgICAgICAgICAgICAgIGlm
IChtYXNrSW1hZ2UuaW1hZ2UoKSAmJiBtYXNrSW1hZ2UuaW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2Uo
KSkgewotICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2Ug
PSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obWFza0lt
YWdlLmltYWdlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+c2V0TWFzayhO
aW5lUGllY2VJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCksIG1hc2tJbWFnZS5pbWFnZVNsaWNl
cygpLCBtYXNrSW1hZ2UuZmlsbCgpLCBtYXNrSW1hZ2UuYm9yZGVyU2xpY2VzKCksIG1hc2tJbWFn
ZS5vdXRzZXQoKSwgbWFza0ltYWdlLmhvcml6b250YWxSdWxlKCksIG1hc2tJbWFnZS52ZXJ0aWNh
bFJ1bGUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2VTb3VyY2U6IHsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJ
bWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNlKCktPmlz
UGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRNYXNr
Qm94SW1hZ2VTb3VyY2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJ
bWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNlKCkpKSk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
a0ltYWdlOiB7Ci0gICAgICAgICAgICBmb3IgKEZpbGxMYXllciogbWFza0xheWVyID0gbV9zdGF0
ZS5zdHlsZSgpLT5hY2Nlc3NNYXNrTGF5ZXJzKCk7IG1hc2tMYXllcjsgbWFza0xheWVyID0gbWFz
a0xheWVyLT5uZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWFza0xheWVyLT5pbWFnZSgp
ICYmIG1hc2tMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAg
ICAgICAgbWFza0xheWVyLT5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0
eWxlUGVuZGluZ0ltYWdlKj4obWFza0xheWVyLT5pbWFnZSgpKSkpOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9zdGF0
ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpsb2FkUGVuZGluZ1Jlc291cmNlcygpCi17Ci0gICAgLy8gU3RhcnQgbG9hZGluZyBpbWFn
ZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nSW1hZ2VzKCk7Ci0K
LSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgLy8gU3RhcnQgbG9hZGluZyB0aGUgc2hhZGVy
cyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdTaGFkZXJzKCk7Ci0j
ZW5kaWYKLSAgICAKLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCi0gICAg
Ly8gU3RhcnQgbG9hZGluZyB0aGUgU1ZHIERvY3VtZW50cyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5
bGUuCi0gICAgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKLSNlbmRpZgotfQotCi1pbmxpbmUg
U3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6Ok1hdGNoZWRQcm9wZXJ0aWVzKCkKLSAg
ICA6IHBvc3NpYmx5UGFkZGVkTWVtYmVyKDApCi17Ci19Ci0KLWlubGluZSBTdHlsZVJlc29sdmVy
OjpNYXRjaGVkUHJvcGVydGllczo6fk1hdGNoZWRQcm9wZXJ0aWVzKCkKLXsKLX0KLQotdm9pZCBT
dHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5
T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKLXsKLSAgICBNZW1vcnlDbGFzc0lu
Zm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7
Ci0gICAgaW5mby5hZGRNZW1iZXIocHJvcGVydGllcywgInByb3BlcnRpZXMiKTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbTo6cmVwb3J0TWVtb3J5
VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKLXsKLSAgICBN
ZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5
VHlwZXM6OkNTUyk7Ci0gICAgaW5mby5hZGRNZW1iZXIobWF0Y2hlZFByb3BlcnRpZXMsICJtYXRj
aGVkUHJvcGVydGllcyIpOwotICAgIGluZm8uYWRkTWVtYmVyKHJhbmdlcywgInJhbmdlcyIpOwot
ICAgIGluZm8uYWRkTWVtYmVyKHJlbmRlclN0eWxlLCAicmVuZGVyU3R5bGUiKTsKLSAgICBpbmZv
LmFkZE1lbWJlcihwYXJlbnRSZW5kZXJTdHlsZSwgInBhcmVudFJlbmRlclN0eWxlIik7Ci19Ci0K
LXZvaWQgTWVkaWFRdWVyeVJlc3VsdDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5m
byogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKLXsKLSAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyht
ZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7Ci0gICAgaW5m
by5hZGRNZW1iZXIobV9leHByZXNzaW9uLCAiZXhwcmVzc2lvbiIpOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVj
dEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5m
bywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1f
cnVsZVNldHMsICJydWxlU2V0cyIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fa2V5ZnJhbWVzUnVs
ZU1hcCwgImtleWZyYW1lc1J1bGVNYXAiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGUsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlIik7Ci0gICAgaW5mby5hZGRN
ZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciwgIm1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVTd2VlcFRpbWVyIik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX21lZGl1bSwgIm1l
ZGl1bSIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fcm9vdERlZmF1bHRTdHlsZSwgInJvb3REZWZh
dWx0U3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2RvY3VtZW50LCAiZG9jdW1lbnQiKTsK
LQotICAgIGluZm8uYWRkTWVtYmVyKG1fZm9udFNlbGVjdG9yLCAiZm9udFNlbGVjdG9yIik7Ci0g
ICAgaW5mby5hZGRNZW1iZXIobV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLCAi
dmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cyIpOwotICAgIGluZm8uaWdub3JlTWVt
YmVyKG1fc3R5bGVCdWlsZGVyKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2luc3BlY3RvckNTU09N
V3JhcHBlcnMpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fc2NvcGVSZXNvbHZlciwgInNjb3BlUmVz
b2x2ZXIiKTsKLQotICAgIGluZm8uYWRkTWVtYmVyKG1fc3RhdGUsICJzdGF0ZSIpOwotCi0gICAg
Ly8gRklYTUU6IG1vdmUgdGhpcyB0byBhIHBsYWNlIHdoZXJlIGl0IHdvdWxkIGJlIGNhbGxlZCBv
bmx5IG9uY2U/Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZh
dWx0U3R5bGUsICJkZWZhdWx0U3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0
U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSwgImRlZmF1bHRRdWlya3NTdHlsZSIpOwot
ICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5
bGUsImRlZmF1bHRQcmludFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzOjpkZWZhdWx0Vmlld1NvdXJjZVN0eWxlLCAiZGVmYXVsdFZpZXdTb3VyY2VTdHls
ZSIpOworICAgIHJldHVybiBtX21hdGNoZWRSdWxlcyAmJiAhbV9tYXRjaGVkUnVsZXMtPmlzRW1w
dHkoKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUv
Y3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgJKHJldmlzaW9uIDE0NTE4MSkJKGZyb20gU291cmNl
L1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaDoxNDUxODEpCisrKyBTb3VyY2UvV2ViQ29yZS9j
c3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY5NyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQor
ICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5
LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYg
U3R5bGVSZXNvbHZlcl9oCisjZGVmaW5lIFN0eWxlUmVzb2x2ZXJfaAorCisjaW5jbHVkZSAiQ1NT
UnVsZUxpc3QuaCIKKyNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgiCisjaW5jbHVkZSAiQ1NTVmFs
dWVMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgorI2luY2x1ZGUgIkluc3Bl
Y3RvckNTU09NV3JhcHBlcnMuaCIKKyNpbmNsdWRlICJMaW5rSGFzaC5oIgorI2luY2x1ZGUgIk1l
ZGlhUXVlcnlFeHAuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlJ1bGVG
ZWF0dXJlLmgiCisjaW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVk
RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgorI2luY2x1ZGUgIlNlbGVjdG9y
Q2hlY2tlci5oIgorI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCisjaW5jbHVkZSAiU3R5bGVJ
bmhlcml0ZWREYXRhLmgiCisjaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCisjaW5jbHVk
ZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQorI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3VtZW50VmFsdWUuaCIKKyNlbmRp
ZgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdI
YXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworZW51bSBFU21hcnRNaW5pbXVtRm9yRm9u
dFNpemUgeyBEb05vdFVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplLCBVc2VTbWFydE1pbmltdW1G
b3JGb250Rml6ZSB9OworCitjbGFzcyBDU1NDdXJzb3JJbWFnZVZhbHVlOworY2xhc3MgQ1NTRm9u
dFNlbGVjdG9yOworY2xhc3MgQ1NTRm9udEZhY2U7CitjbGFzcyBDU1NGb250RmFjZVJ1bGU7Citj
bGFzcyBDU1NJbWFnZUdlbmVyYXRvclZhbHVlOworY2xhc3MgQ1NTSW1hZ2VTZXRWYWx1ZTsKK2Ns
YXNzIENTU0ltYWdlVmFsdWU7CitjbGFzcyBDU1NQYWdlUnVsZTsKK2NsYXNzIENTU1ByaW1pdGl2
ZVZhbHVlOworY2xhc3MgQ1NTUHJvcGVydHk7CitjbGFzcyBDU1NSdWxlTGlzdDsKK2NsYXNzIENT
U1NlbGVjdG9yOworY2xhc3MgQ1NTU3R5bGVTaGVldDsKK2NsYXNzIENTU1ZhbHVlOworY2xhc3Mg
Q29udGFpbmVyTm9kZTsKK2NsYXNzIEN1c3RvbUZpbHRlck9wZXJhdGlvbjsKK2NsYXNzIEN1c3Rv
bUZpbHRlclBhcmFtZXRlcjsKK2NsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3Q7CitjbGFz
cyBEb2N1bWVudDsKK2NsYXNzIEVsZW1lbnQ7CitjbGFzcyBGcmFtZTsKK2NsYXNzIEZyYW1lVmll
dzsKK2NsYXNzIEtVUkw7CitjbGFzcyBLZXlmcmFtZUxpc3Q7CitjbGFzcyBLZXlmcmFtZVZhbHVl
OworY2xhc3MgTWVkaWFRdWVyeUV2YWx1YXRvcjsKK2NsYXNzIE5vZGU7CitjbGFzcyBSZW5kZXJS
ZWdpb247CitjbGFzcyBSZW5kZXJTY3JvbGxiYXI7CitjbGFzcyBSdWxlRGF0YTsKK2NsYXNzIFJ1
bGVTZXQ7CitjbGFzcyBTZXR0aW5nczsKK2NsYXNzIFN0YXRpY0NTU1J1bGVMaXN0OworY2xhc3Mg
U3R5bGVCdWlsZGVyOworY2xhc3MgU3R5bGVTY29wZVJlc29sdmVyOworY2xhc3MgU3R5bGVJbWFn
ZTsKK2NsYXNzIFN0eWxlS2V5ZnJhbWU7CitjbGFzcyBTdHlsZVBlbmRpbmdJbWFnZTsKK2NsYXNz
IFN0eWxlUHJvcGVydHlTZXQ7CitjbGFzcyBTdHlsZVJ1bGU7CisjaWYgRU5BQkxFKFNIQURPV19E
T00pCitjbGFzcyBTdHlsZVJ1bGVIb3N0OworI2VuZGlmCitjbGFzcyBTdHlsZVJ1bGVLZXlmcmFt
ZXM7CitjbGFzcyBTdHlsZVJ1bGVQYWdlOworY2xhc3MgU3R5bGVSdWxlUmVnaW9uOworY2xhc3Mg
U3R5bGVTaGFkZXI7CitjbGFzcyBTdHlsZVNoZWV0OworY2xhc3MgU3R5bGVTaGVldExpc3Q7Citj
bGFzcyBTdHlsZWRFbGVtZW50OworY2xhc3MgVmlld3BvcnRTdHlsZVJlc29sdmVyOworY2xhc3Mg
V2ViS2l0Q1NTRmlsdGVyVmFsdWU7CitjbGFzcyBXZWJLaXRDU1NTaGFkZXJWYWx1ZTsKK2NsYXNz
IFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU7CisKK2NsYXNzIE1lZGlhUXVlcnlSZXN1bHQgewor
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE1lZGlhUXVlcnlSZXN1bHQpOyBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVl
cnlFeHAmIGV4cHIsIGJvb2wgcmVzdWx0KQorICAgICAgICA6IG1fZXhwcmVzc2lvbihleHByKQor
ICAgICAgICAsIG1fcmVzdWx0KHJlc3VsdCkKKyAgICB7CisgICAgfQorICAgIHZvaWQgcmVwb3J0
TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworCisgICAgTWVkaWFRdWVyeUV4
cCBtX2V4cHJlc3Npb247CisgICAgYm9vbCBtX3Jlc3VsdDsKK307CisKK2VudW0gU3R5bGVTaGFy
aW5nQmVoYXZpb3IgeworICAgIEFsbG93U3R5bGVTaGFyaW5nLAorICAgIERpc2FsbG93U3R5bGVT
aGFyaW5nLAorfTsKKworLy8gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMgaXMgdXNlZCBpbiBtZWRp
YSBxdWVyaWVzLCB3aGVyZSByZWxhdGl2ZSB1bml0cworLy8gYXJlIGludGVycHJldGVkIGFjY29y
ZGluZyB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50IHN0eWxlLCBhbmQgc3R5bGVkIG9ubHkK
Ky8vIGZyb20gdGhlIFVzZXIgQWdlbnQgU3R5bGVzaGVldCBydWxlcy4KKworZW51bSBSdWxlTWF0
Y2hpbmdCZWhhdmlvciB7CisgICAgTWF0Y2hBbGxSdWxlcywKKyAgICBNYXRjaEFsbFJ1bGVzRXhj
bHVkaW5nU01JTCwKKyAgICBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcywKK307CisKK2NsYXNzIFBz
ZXVkb1N0eWxlUmVxdWVzdCB7CitwdWJsaWM6CisgICAgUHNldWRvU3R5bGVSZXF1ZXN0KFBzZXVk
b0lkIHBzZXVkb0lkLCBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhciA9IDAsIFNjcm9sbGJhclBh
cnQgc2Nyb2xsYmFyUGFydCA9IE5vUGFydCkKKyAgICAgICAgOiBwc2V1ZG9JZChwc2V1ZG9JZCkK
KyAgICAgICAgLCBzY3JvbGxiYXJQYXJ0KHNjcm9sbGJhclBhcnQpCisgICAgICAgICwgc2Nyb2xs
YmFyKHNjcm9sbGJhcikKKyAgICB7CisgICAgfQorCisgICAgUHNldWRvSWQgcHNldWRvSWQ7Cisg
ICAgU2Nyb2xsYmFyUGFydCBzY3JvbGxiYXJQYXJ0OworICAgIFJlbmRlclNjcm9sbGJhciogc2Ny
b2xsYmFyOworfTsKKworY2xhc3MgTWF0Y2hSZXF1ZXN0IHsKK3B1YmxpYzoKKyAgICBNYXRjaFJl
cXVlc3QoUnVsZVNldCogcnVsZVNldCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyA9IGZhbHNlLCBj
b25zdCBDb250YWluZXJOb2RlKiBzY29wZSA9IDAsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JB
dEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENy
b3NzQm91bmRhcnkpCisgICAgICAgIDogcnVsZVNldChydWxlU2V0KQorICAgICAgICAsIGluY2x1
ZGVFbXB0eVJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKQorICAgICAgICAsIHNjb3BlKHNjb3BlKQor
ICAgICAgICAsIGJlaGF2aW9yQXRCb3VuZGFyeShiZWhhdmlvckF0Qm91bmRhcnkpIHsgfQorICAg
IGNvbnN0IFJ1bGVTZXQqIHJ1bGVTZXQ7CisgICAgY29uc3QgYm9vbCBpbmNsdWRlRW1wdHlSdWxl
czsKKyAgICBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZTsKKyAgICBjb25zdCBTZWxlY3RvckNo
ZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnk7Cit9OworCisvLyBU
aGlzIGNsYXNzIHNlbGVjdHMgYSBSZW5kZXJTdHlsZSBmb3IgYSBnaXZlbiBlbGVtZW50IGJhc2Vk
IG9uIGEgY29sbGVjdGlvbiBvZiBzdHlsZXNoZWV0cy4KK2NsYXNzIFN0eWxlUmVzb2x2ZXIgewor
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0eWxlUmVzb2x2ZXIpOyBXVEZfTUFLRV9GQVNUX0FM
TE9DQVRFRDsKK3B1YmxpYzoKKyAgICBTdHlsZVJlc29sdmVyKERvY3VtZW50KiwgYm9vbCBtYXRj
aEF1dGhvckFuZFVzZXJTdHlsZXMpOworICAgIH5TdHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBV
c2luZyB0aGVzZSBkdXJpbmcgdHJlZSB3YWxrIHdpbGwgYWxsb3cgc3R5bGUgc2VsZWN0b3IgdG8g
b3B0aW1pemUgY2hpbGQgYW5kIGRlc2NlbmRhbnQgc2VsZWN0b3IgbG9va3Vwcy4KKyAgICB2b2lk
IHB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHBvcFBhcmVudEVsZW1lbnQo
RWxlbWVudCopOworICAgIHZvaWQgcHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9v
dCopOworICAgIHZvaWQgcG9wUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7Cisj
aWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgdm9pZCBhZGRIb3N0UnVsZShTdHlsZVJ1bGVIb3N0
KiBydWxlLCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIGNvbnN0IENvbnRhaW5lck5v
ZGUqIHNjb3BlKSB7IGVuc3VyZVNjb3BlUmVzb2x2ZXIoKS0+YWRkSG9zdFJ1bGUocnVsZSwgaGFz
RG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgc2NvcGUpOyB9CisjZW5kaWYKKworICAgIFBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRWxlbWVudChFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBh
cmVudFN0eWxlID0gMCwgU3R5bGVTaGFyaW5nQmVoYXZpb3IgPSBBbGxvd1N0eWxlU2hhcmluZywK
KyAgICAgICAgUnVsZU1hdGNoaW5nQmVoYXZpb3IgPSBNYXRjaEFsbFJ1bGVzLCBSZW5kZXJSZWdp
b24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKworICAgIHZvaWQga2V5ZnJhbWVTdHlsZXNGb3JB
bmltYXRpb24oRWxlbWVudCosIGNvbnN0IFJlbmRlclN0eWxlKiwgS2V5ZnJhbWVMaXN0Jik7CisK
KyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBwc2V1ZG9TdHlsZUZvckVsZW1lbnQoRWxlbWVu
dCosIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7
CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRl
eCk7CisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgp
OworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yVGV4dChUZXh0Kik7CisKKyAg
ICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JEb2N1bWVudChEb2N1bWVu
dCosIENTU0ZvbnRTZWxlY3RvciogPSAwKTsKKworICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3RhdGUuc3R5bGUoKTsgfQorICAgIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50U3R5bGUoKTsgfQorICAgIFJlbmRl
clN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5yb290RWxl
bWVudFN0eWxlKCk7IH0KKyAgICBFbGVtZW50KiBlbGVtZW50KCkgeyByZXR1cm4gbV9zdGF0ZS5l
bGVtZW50KCk7IH0KKyAgICBEb2N1bWVudCogZG9jdW1lbnQoKSB7IHJldHVybiBtX2RvY3VtZW50
OyB9CisgICAgU3R5bGVTY29wZVJlc29sdmVyKiBzY29wZVJlc29sdmVyKCkgY29uc3QgeyByZXR1
cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOyB9CisgICAgYm9vbCBoYXNQYXJlbnROb2RlKCkgY29u
c3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnROb2RlKCk7IH0KKworICAgIC8vIEZJWE1FOiBJdCBj
b3VsZCBiZSBiZXR0ZXIgdG8gY2FsbCBtX3J1bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxlU2hlZXRz
KCkgZGlyZWN0bHkgYWZ0ZXIgd2UgZmFjdG9yIFN0eWxlUnNvbHZlciBmdXJ0aGVyLgorICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDg4OTAKKyAgICB2b2lk
IGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8
UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mKTsKKworICAgIERvY3VtZW50UnVsZVNldHMmIHJ1bGVT
ZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQorICAgIGNvbnN0IERvY3VtZW50UnVsZVNldHMm
IHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsgfQorCisjaWYgRU5BQkxFKFNU
WUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgU3R5bGVTY29wZVJlc29sdmVy
KiBlbnN1cmVTY29wZVJlc29sdmVyKCkKKyAgICB7CisjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkK
KyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVh
dHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSB8fCBSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzdHls
ZVNjb3BlZEVuYWJsZWQoKSk7CisjZWxzZQorICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRG
ZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2VuZGlmCisjZWxzZQorICAgICAgICBB
U1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93RE9NRW5hYmxlZCgpKTsKKyNlbmRp
ZgorICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgICAgIG1fc2NvcGVSZXNv
bHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVNjb3BlUmVzb2x2ZXIoKSk7CisgICAgICAgIHJldHVy
biBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCk7CisgICAgfQorI2VuZGlmCisKK3ByaXZhdGU6CisgICAg
dm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7CisgICAgUmVuZGVyU3R5bGUqIGxvY2F0ZVNoYXJl
ZFN0eWxlKCk7CisgICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChS
dWxlU2V0Kik7CisgICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVz
KCk7CisgICAgTm9kZSogbG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVk
JiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdDsKKyAgICBTdHlsZWRFbGVtZW50KiBmaW5kU2libGlu
Z0ZvclN0eWxlU2hhcmluZyhOb2RlKiwgdW5zaWduZWQmIGNvdW50KSBjb25zdDsKKyAgICBib29s
IGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50KikgY29uc3Q7CisKKyAgICBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxl
KiwgY29uc3QgU3R5bGVLZXlmcmFtZSosIEtleWZyYW1lVmFsdWUmKTsKKworcHVibGljOgorICAg
IC8vIFRoZXNlIG1ldGhvZHMgd2lsbCBnaXZlIGJhY2sgdGhlIHNldCBvZiBydWxlcyB0aGF0IG1h
dGNoZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudCAob3IgYSBwc2V1ZG8tZWxlbWVudCkuCisgICAgZW51
bSBDU1NSdWxlRmlsdGVyIHsKKyAgICAgICAgVUFBbmRVc2VyQ1NTUnVsZXMgICA9IDEgPDwgMSwK
KyAgICAgICAgQXV0aG9yQ1NTUnVsZXMgICAgICA9IDEgPDwgMiwKKyAgICAgICAgRW1wdHlDU1NS
dWxlcyAgICAgICA9IDEgPDwgMywKKyAgICAgICAgQ3Jvc3NPcmlnaW5DU1NSdWxlcyA9IDEgPDwg
NCwKKyAgICAgICAgQWxsQnV0RW1wdHlDU1NSdWxlcyA9IFVBQW5kVXNlckNTU1J1bGVzIHwgQXV0
aG9yQ1NTUnVsZXMgfCBDcm9zc09yaWdpbkNTU1J1bGVzLAorICAgICAgICBBbGxDU1NSdWxlcyAg
ICAgICAgID0gQWxsQnV0RW1wdHlDU1NSdWxlcyB8IEVtcHR5Q1NTUnVsZXMsCisgICAgfTsKKyAg
ICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBzdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50Kiwg
dW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1bGVzKTsKKyAgICBQYXNz
UmVmUHRyPENTU1J1bGVMaXN0PiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50Kiwg
UHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7
CisKKyAgICAvLyBHaXZlbiBhIENTUyBrZXl3b3JkIGluIHRoZSByYW5nZSAoeHgtc21hbGwgdG8g
LXdlYmtpdC14eHgtbGFyZ2UpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgICAgLy8gdGhl
IGNvcnJlY3QgZm9udCBzaXplIHNjYWxlZCByZWxhdGl2ZSB0byB0aGUgdXNlcidzIGRlZmF1bHQg
KG1lZGl1bSkuCisgICAgc3RhdGljIGZsb2F0IGZvbnRTaXplRm9yS2V5d29yZChEb2N1bWVudCos
IGludCBrZXl3b3JkLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpOworCisgICAgLy8g
R2l2ZW4gYSBmb250IHNpemUgaW4gcGl4ZWwsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gbGVn
YWN5IGZvbnQgc2l6ZSBiZXR3ZWVuIDEgYW5kIDcuCisgICAgc3RhdGljIGludCBsZWdhY3lGb250
U2l6ZShEb2N1bWVudCosIGludCBwaXhlbEZvbnRTaXplLCBib29sIHNob3VsZFVzZUZpeGVkRGVm
YXVsdFNpemUpOworCitwdWJsaWM6CisgICAgdm9pZCBhcHBseVByb3BlcnR5VG9TdHlsZShDU1NQ
cm9wZXJ0eUlELCBDU1NWYWx1ZSosIFJlbmRlclN0eWxlKik7CisKKyAgICB2b2lkIGFwcGx5UHJv
cGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworCisgICAgdm9p
ZCB1cGRhdGVGb250KCk7CisgICAgdm9pZCBpbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKik7
CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9j
dW1lbnQqLCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVj
aWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgPSBVc2VTbWFydE1pbmltdW1Gb3JG
b250Rml6ZSk7CisKKyAgICB2b2lkIHNldEZvbnRTaXplKEZvbnREZXNjcmlwdGlvbiYsIGZsb2F0
IHNpemUpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9t
U3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIFJlbmRlclN0eWxlKiwgYm9vbCBpc0Fic29sdXRlU2l6
ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVsZXMpOworCitwdWJsaWM6
CisgICAgYm9vbCB1c2VTVkdab29tUnVsZXMoKTsKKworICAgIHN0YXRpYyBib29sIGNvbG9yRnJv
bVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqKTsK
KyAgICBDb2xvciBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSosIGJv
b2wgZm9yVmlzaXRlZExpbmsgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBib29sIGhhc1NlbGVjdG9y
Rm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7CisgICAgYm9vbCBoYXNTZWxlY3RvckZv
ckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0b3JG
b3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7CisKKyAgICBDU1NGb250U2Vs
ZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZm9udFNlbGVjdG9yLmdldCgp
OyB9CisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBWaWV3cG9ydFN0eWxl
UmVzb2x2ZXIqIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpIHsgcmV0dXJuIG1fdmlld3BvcnRTdHls
ZVJlc29sdmVyLmdldCgpOyB9CisjZW5kaWYKKworICAgIHZvaWQgYWRkVmlld3BvcnREZXBlbmRl
bnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqLCBib29sIHJlc3VsdCk7Cisg
ICAgYm9vbCBoYXNWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcmllcygpIGNvbnN0IHsgcmV0dXJu
ICFtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuaXNFbXB0eSgpOyB9CisgICAg
Ym9vbCBhZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdDsKKworICAgIHZvaWQgYWRkS2V5
ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4pOworCisgICAgYm9vbCBj
aGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOworCisgICAgYm9vbCB1c2Vz
U2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fcnVsZVNldHMuZmVhdHVyZXMoKS5zaWJs
aW5nUnVsZXMuaXNFbXB0eSgpOyB9CisgICAgYm9vbCB1c2VzRmlyc3RMaW5lUnVsZXMoKSBjb25z
dCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0ZpcnN0TGluZVJ1bGVzOyB9Cisg
ICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHMu
ZmVhdHVyZXMoKS51c2VzQmVmb3JlQWZ0ZXJSdWxlczsgfQorCisgICAgc3RhdGljIGJvb2wgY3Jl
YXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGlu
U3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9w
ZXJhdGlvbnMpOworICAgIAorICAgIHZvaWQgaW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUoKTsKKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyAgICBib29sIGNyZWF0ZUZpbHRlck9w
ZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJT
dHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKKyNpZiBF
TkFCTEUoQ1NTX1NIQURFUlMpCisgICAgU3R5bGVTaGFkZXIqIHN0eWxlU2hhZGVyKENTU1ZhbHVl
Kik7CisgICAgU3R5bGVTaGFkZXIqIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVl
KFdlYktpdENTU1NoYWRlclZhbHVlKik7CisgICAgYm9vbCBwYXJzZUN1c3RvbUZpbHRlclBhcmFt
ZXRlckxpc3QoQ1NTVmFsdWUqLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0Jik7CisgICAgUGFz
c1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVy
KGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZp
bHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJp
bmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFy
YW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5h
bWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVy
PiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUs
IENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBj
cmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KFdlYktp
dENTU0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+
IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmls
dGVyVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRl
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKik7CisgICAgdm9pZCBs
b2FkUGVuZGluZ1NoYWRlcnMoKTsKKyNlbmRpZgorI2lmIEVOQUJMRShTVkcpCisgICAgdm9pZCBs
b2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOworI2VuZGlmCisjZW5kaWYgLy8gRU5BQkxFKENTU19G
SUxURVJTKQorCisgICAgdm9pZCBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCitwcml2YXRlOgor
ICAgIC8vIFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRlZmF1bHQgZm9udCBzaXplIGlmIGl0
IGRldGVjdHMgdGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZvbnQgZmFtaWx5IGhhcyBjaGFuZ2Vk
LiAtZHdoCisgICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUq
LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdl
KFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKworICAgIHZvaWQgYWRq
dXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSwgRWxlbWVudCopOworCisgICAgc3RydWN0IFJ1bGVSYW5nZSB7CisgICAgICAg
IFJ1bGVSYW5nZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQmIGxhc3RSdWxlSW5kZXgpOiBmaXJz
dFJ1bGVJbmRleChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxlSW5kZXgobGFzdFJ1bGVJbmRleCkg
eyB9CisgICAgICAgIGludCYgZmlyc3RSdWxlSW5kZXg7CisgICAgICAgIGludCYgbGFzdFJ1bGVJ
bmRleDsKKyAgICB9OworCisgICAgc3RydWN0IE1hdGNoUmFuZ2VzIHsKKyAgICAgICAgTWF0Y2hS
YW5nZXMoKSA6IGZpcnN0VUFSdWxlKC0xKSwgbGFzdFVBUnVsZSgtMSksIGZpcnN0QXV0aG9yUnVs
ZSgtMSksIGxhc3RBdXRob3JSdWxlKC0xKSwgZmlyc3RVc2VyUnVsZSgtMSksIGxhc3RVc2VyUnVs
ZSgtMSkgeyB9CisgICAgICAgIGludCBmaXJzdFVBUnVsZTsKKyAgICAgICAgaW50IGxhc3RVQVJ1
bGU7CisgICAgICAgIGludCBmaXJzdEF1dGhvclJ1bGU7CisgICAgICAgIGludCBsYXN0QXV0aG9y
UnVsZTsKKyAgICAgICAgaW50IGZpcnN0VXNlclJ1bGU7CisgICAgICAgIGludCBsYXN0VXNlclJ1
bGU7CisgICAgICAgIFJ1bGVSYW5nZSBVQVJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShm
aXJzdFVBUnVsZSwgbGFzdFVBUnVsZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIGF1dGhvclJ1bGVS
YW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdEF1dGhvclJ1bGUsIGxhc3RBdXRob3JSdWxl
KTsgfQorICAgICAgICBSdWxlUmFuZ2UgdXNlclJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5n
ZShmaXJzdFVzZXJSdWxlLCBsYXN0VXNlclJ1bGUpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBN
YXRjaGVkUHJvcGVydGllcyB7CisgICAgICAgIE1hdGNoZWRQcm9wZXJ0aWVzKCk7CisgICAgICAg
IH5NYXRjaGVkUHJvcGVydGllcygpOworICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1l
bW9yeU9iamVjdEluZm8qKSBjb25zdDsKKyAgICAgICAgCisgICAgICAgIFJlZlB0cjxTdHlsZVBy
b3BlcnR5U2V0PiBwcm9wZXJ0aWVzOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBzdHJ1
Y3QgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgOiAyOworICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIHdoaXRlbGlzdFR5cGUgOiAyOworICAgICAgICAgICAgfTsKKyAg
ICAgICAgICAgIC8vIFVzZWQgdG8gbWFrZSBzdXJlIGFsbCBtZW1vcnkgaXMgemVyby1pbml0aWFs
aXplZCBzaW5jZSB3ZSBjb21wdXRlIHRoZSBoYXNoIG92ZXIgdGhlIGJ5dGVzIG9mIHRoaXMgb2Jq
ZWN0LgorICAgICAgICAgICAgdm9pZCogcG9zc2libHlQYWRkZWRNZW1iZXI7CisgICAgICAgIH07
CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRjaFJlc3VsdCB7CisgICAgICAgIE1hdGNoUmVzdWx0
KCkgOiBpc0NhY2hlYWJsZSh0cnVlKSB7IH0KKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0
aWVzLCA2ND4gbWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIFZlY3RvcjxTdHlsZVJ1bGUqLCA2
ND4gbWF0Y2hlZFJ1bGVzOworICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7CisgICAgICAgIGJv
b2wgaXNDYWNoZWFibGU7CisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywg
U3R5bGVSdWxlKiA9IDAsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBTZWxlY3RvckNoZWNrZXI6
Ok1hdGNoQWxsLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUp
OworICAgIHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lk
IG1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcyk7
CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmKTsKKyAgICB2b2lkIG1hdGNoVUFS
dWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqKTsKKyAgICB2b2lkIG1hdGNoQXV0aG9yUnVsZXMo
TWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNl
clJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBt
YXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxl
cyk7CisgICAgdm9pZCBtYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVt
cHR5UnVsZXMpOworCisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJl
cXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVn
aW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJl
cXVlc3QmLCBSdWxlUmFuZ2UmKTsKKworICAgIGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0
IFJ1bGVEYXRhJikgY29uc3Q7CisgICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisgICAgdm9p
ZCBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmKTsKKworICAgIGJvb2wg
cnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwg
UHNldWRvSWQmLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9y
Q2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpOworICAgIGJvb2wgY2hlY2tSZWdpb25TZWxl
Y3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVs
ZW1lbnQpOworICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3Vs
dCYsIGNvbnN0IEVsZW1lbnQqKTsKKyAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKKyNp
ZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgVmFyaWFibGVEZWZpbml0aW9ucywKKyNl
bmRpZgorICAgICAgICBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzLAorICAgICAgICBMb3dQcmlvcml0
eVByb3BlcnRpZXMKKyAgICB9OworICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBw
YXNzPgorICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYs
IGJvb2wgaW1wb3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVy
aXRlZE9ubHkpOworICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgorICAg
IHZvaWQgYXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMs
IFN0eWxlUnVsZSosIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVy
dHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyNpZiBFTkFCTEUoQ1NT
X1ZBUklBQkxFUykKKyAgICB2b2lkIHJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCwgQ1NT
VmFsdWUqLCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25F
eHByZXNzaW9ucyk7CisjZW5kaWYKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkUmVnaW9uU3R5bGVQ
cm9wZXJ0eShDU1NQcm9wZXJ0eUlEKTsKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgc3Rh
dGljIGJvb2wgaXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7CisjZW5kaWYK
KyAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCosIGJvb2wgaXNM
ZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAg
dm9pZCBtYXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hl
ZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiwgYm9vbCBpc0xlZnRQYWdlLCBi
b29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKKyAgICBTZXR0aW5ncyog
ZG9jdW1lbnRTZXR0aW5ncygpIHsgcmV0dXJuIG1fZG9jdW1lbnQtPnNldHRpbmdzKCk7IH0KKwor
ICAgIGJvb2wgaXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBib29sIGlzUmln
aHRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0IHsgcmV0dXJuICFpc0xlZnRQYWdlKHBhZ2VJbmRl
eCk7IH0KKyAgICBib29sIGlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OworICAgIFN0
cmluZyBwYWdlTmFtZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKworICAgIERvY3VtZW50UnVsZVNl
dHMgbV9ydWxlU2V0czsKKworICAgIHR5cGVkZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwg
UmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4gPiBLZXlmcmFtZXNSdWxlTWFwOworICAgIEtleWZy
YW1lc1J1bGVNYXAgbV9rZXlmcmFtZXNSdWxlTWFwOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBI
YXNoTWFwPENTU1Byb3BlcnR5SUQsIFJlZlB0cjxDU1NWYWx1ZT4gPiBQZW5kaW5nSW1hZ2VQcm9w
ZXJ0eU1hcDsKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgdHlw
ZWRlZiBIYXNoTWFwPEZpbHRlck9wZXJhdGlvbiosIFJlZlB0cjxXZWJLaXRDU1NTVkdEb2N1bWVu
dFZhbHVlPiA+IFBlbmRpbmdTVkdEb2N1bWVudE1hcDsKKyNlbmRpZgorCisgICAgY2xhc3MgU3Rh
dGUgeworICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdGF0ZSk7CisgICAgcHVibGljOgor
ICAgICAgICBTdGF0ZSgpCisgICAgICAgIDogbV9lbGVtZW50KDApCisgICAgICAgICwgbV9zdHls
ZWRFbGVtZW50KDApCisgICAgICAgICwgbV9wYXJlbnROb2RlKDApCisgICAgICAgICwgbV9wYXJl
bnRTdHlsZSgwKQorICAgICAgICAsIG1fcm9vdEVsZW1lbnRTdHlsZSgwKQorICAgICAgICAsIG1f
cmVnaW9uRm9yU3R5bGluZygwKQorICAgICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCisg
ICAgICAgICwgbV9wc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pCisgICAgICAgICwgbV9lbGVt
ZW50TGlua1N0YXRlKE5vdEluc2lkZUxpbmspCisgICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQoZmFsc2UpCisgICAgICAgICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVs
ZXMoZmFsc2UpCisgICAgICAgICwgbV9tb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5
bGUpCisgICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSkKKyAgICAg
ICAgLCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpCisjaWYgRU5BQkxF
KENTU19TSEFERVJTKQorICAgICAgICAsIG1faGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpCisjZW5k
aWYKKyAgICAgICAgLCBtX2xpbmVIZWlnaHRWYWx1ZSgwKQorICAgICAgICAsIG1fZm9udERpcnR5
KGZhbHNlKQorICAgICAgICAsIG1faGFzVUFBcHBlYXJhbmNlKGZhbHNlKQorICAgICAgICAsIG1f
YmFja2dyb3VuZERhdGEoQmFja2dyb3VuZEZpbGxMYXllcikgeyB9CisKKyAgICBwdWJsaWM6Cisg
ICAgICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgICAgICB2b2lkIGluaXRGb3JT
dHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxl
ID0gMCwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BT
RVVETyksIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lk
IGNsZWFyKCk7CisKKyAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4g
bV9lbGVtZW50LT5kb2N1bWVudCgpOyB9CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQoKSBjb25z
dCB7IHJldHVybiBtX2VsZW1lbnQ7IH0KKyAgICAgICAgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxl
bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVkRWxlbWVudDsgfQorICAgICAgICB2b2lkIHNl
dFN0eWxlKFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlKSB7IG1fc3R5bGUgPSBzdHlsZTsg
fQorICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdl
dCgpOyB9CisgICAgICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHRha2VTdHlsZSgpIHsgcmV0
dXJuIG1fc3R5bGUucmVsZWFzZSgpOyB9CisKKyAgICAgICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVu
c3VyZVJ1bGVMaXN0KCk7CisgICAgICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHRha2VSdWxl
TGlzdCgpIHsgcmV0dXJuIG1fcnVsZUxpc3QucmVsZWFzZSgpOyB9CisKKyAgICAgICAgY29uc3Qg
Q29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50Tm9kZTsg
fQorICAgICAgICB2b2lkIHNldFBhcmVudFN0eWxlKFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkg
eyBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHBh
cmVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnRTdHlsZTsgfQorICAgICAgICBSZW5k
ZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcm9vdEVsZW1lbnRT
dHlsZTsgfQorCisgICAgICAgIGNvbnN0IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZygp
IGNvbnN0IHsgcmV0dXJuIG1fcmVnaW9uRm9yU3R5bGluZzsgfQorICAgICAgICB2b2lkIHNldFNh
bWVPcmlnaW5Pbmx5KGJvb2wgaXNTYW1lT3JpZ2luT25seSkgeyBtX3NhbWVPcmlnaW5Pbmx5ID0g
aXNTYW1lT3JpZ2luT25seTsgfQorICAgICAgICBib29sIGlzU2FtZU9yaWdpbk9ubHkoKSBjb25z
dCB7IHJldHVybiBtX3NhbWVPcmlnaW5Pbmx5OyB9CisgICAgICAgIGNvbnN0IFBzZXVkb1N0eWxl
UmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0KCkgY29uc3QgeyByZXR1cm4gbV9wc2V1ZG9TdHls
ZVJlcXVlc3Q7IH0KKyAgICAgICAgRUluc2lkZUxpbmsgZWxlbWVudExpbmtTdGF0ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fZWxlbWVudExpbmtTdGF0ZTsgfQorICAgICAgICBib29sIGRpc3RyaWJ1dGVk
VG9JbnNlcnRpb25Qb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlv
blBvaW50OyB9CisgICAgICAgIHZvaWQgc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGJv
b2wgaXNBZmZlY3RlZCkgeyBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyA9IGlzQWZmZWN0
ZWQ7IH0KKyAgICAgICAgYm9vbCBlbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSBjb25zdCB7
IHJldHVybiBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsgfQorICAgICAgICB2b2lkIHNl
dE1vZGUoU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUpIHsgbV9tb2RlID0gbW9kZTsgfQorICAg
ICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kZTsg
fQorICAgICAgICAKKyAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUo
Ym9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsg
fQorICAgICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBp
c0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0K
KyAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVy
biBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsgfQorICAgICAgICBib29sIGFwcGx5UHJv
cGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGU7IH0KKyAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAmIHBl
bmRpbmdJbWFnZVByb3BlcnRpZXMoKSB7IHJldHVybiBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7
IH0KKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRp
bmdTVkdEb2N1bWVudE1hcCYgcGVuZGluZ1NWR0RvY3VtZW50cygpIHsgcmV0dXJuIG1fcGVuZGlu
Z1NWR0RvY3VtZW50czsgfQorI2VuZGlmCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAg
ICB2b2lkIHNldEhhc1BlbmRpbmdTaGFkZXJzKGJvb2wgaGFzUGVuZGluZ1NoYWRlcnMpIHsgbV9o
YXNQZW5kaW5nU2hhZGVycyA9IGhhc1BlbmRpbmdTaGFkZXJzOyB9CisgICAgICAgIGJvb2wgaGFz
UGVuZGluZ1NoYWRlcnMoKSBjb25zdCB7IHJldHVybiBtX2hhc1BlbmRpbmdTaGFkZXJzOyB9Cisj
ZW5kaWYKKworICAgICAgICB2b2lkIHNldExpbmVIZWlnaHRWYWx1ZShDU1NWYWx1ZSogdmFsdWUp
IHsgbV9saW5lSGVpZ2h0VmFsdWUgPSB2YWx1ZTsgfQorICAgICAgICBDU1NWYWx1ZSogbGluZUhl
aWdodFZhbHVlKCkgeyByZXR1cm4gbV9saW5lSGVpZ2h0VmFsdWU7IH0KKyAgICAgICAgdm9pZCBz
ZXRGb250RGlydHkoYm9vbCBpc0RpcnR5KSB7IG1fZm9udERpcnR5ID0gaXNEaXJ0eTsgfQorICAg
ICAgICBib29sIGZvbnREaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udERpcnR5OyB9CisKKyAg
ICAgICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKKyAgICAgICAgYm9vbCBoYXNV
QUFwcGVhcmFuY2UoKSBjb25zdCB7IHJldHVybiBtX2hhc1VBQXBwZWFyYW5jZTsgfQorICAgICAg
ICBCb3JkZXJEYXRhIGJvcmRlckRhdGEoKSBjb25zdCB7IHJldHVybiBtX2JvcmRlckRhdGE7IH0K
KyAgICAgICAgRmlsbExheWVyIGJhY2tncm91bmREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9iYWNr
Z3JvdW5kRGF0YTsgfQorICAgICAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7IHJl
dHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQorCisgICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlv
biYgZm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7
IH0KKyAgICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24o
KSB7IHJldHVybiBtX3BhcmVudFN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQorICAgICAgICB2
b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlw
dGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERl
c2NyaXB0aW9uKTsgfQorICAgICAgICB2b2lkIHNldFpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0
eSB8PSBtX3N0eWxlLT5zZXRab29tKGYpOyB9CisgICAgICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9v
bShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oZik7
IH0KKyAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkg
eyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0K
KyAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmll
bnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0T3JpZW50YXRpb24odGV4
dE9yaWVudGF0aW9uKTsgfQorCisgICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYg
bWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRjaGVkUnVsZXM7IH0KKyAgICAgICAgdm9pZCBh
ZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSogcnVsZSkgeyBtX21hdGNoZWRSdWxlcy5hcHBl
bmQocnVsZSk7IH0KKyAgICAgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gRklYTUUoYnVn
IDEwODU2Myk6IHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJldmlldywgdGhlc2UgbWVtYmVyCisgICAg
ICAgIC8vIHZhcmlhYmxlcyBhcmUgcHVibGljLiBIb3dldmVyIHdlIHNob3VsZCBhZGQgbWV0aG9k
cyB0byBhY2Nlc3MKKyAgICAgICAgLy8gdGhlc2UgdmFyaWFibGVzLgorICAgICAgICBFbGVtZW50
KiBtX2VsZW1lbnQ7CisgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbV9zdHlsZTsKKyAgICAg
ICAgU3R5bGVkRWxlbWVudCogbV9zdHlsZWRFbGVtZW50OworICAgICAgICBDb250YWluZXJOb2Rl
KiBtX3BhcmVudE5vZGU7CisgICAgICAgIFJlbmRlclN0eWxlKiBtX3BhcmVudFN0eWxlOworICAg
ICAgICBSZW5kZXJTdHlsZSogbV9yb290RWxlbWVudFN0eWxlOworICAgICAgICAKKyAgICAgICAg
UmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7CisgICAgICAgIGJvb2wgbV9zYW1lT3Jp
Z2luT25seTsKKyAgICAgICAgUHNldWRvU3R5bGVSZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0
OworCisgICAgICAgIEVJbnNpZGVMaW5rIG1fZWxlbWVudExpbmtTdGF0ZTsKKworICAgICAgICBi
b29sIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50OworCisgICAgICAgIGJvb2wgbV9lbGVt
ZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7CisKKyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2Rl
IG1fbW9kZTsKKworICAgICAgICAvLyBBIGJ1ZmZlciB1c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBt
YXRjaGVkIHJ1bGVzIGZvciBhbiBlbGVtZW50LAorICAgICAgICAvLyBhbmQgYSB0ZW1wb3Jhcnkg
YnVmZmVyIHVzZWQgZm9yIG1lcmdlIHNvcnRpbmcuCisgICAgICAgIFZlY3Rvcjxjb25zdCBSdWxl
RGF0YSosIDMyPiBtX21hdGNoZWRSdWxlczsKKyAgICAgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVM
aXN0PiBtX3J1bGVMaXN0OworCisgICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFy
U3R5bGU7CisgICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOwor
CisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwIG1fcGVuZGluZ0ltYWdlUHJvcGVydGll
czsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgICAgIGJvb2wgbV9oYXNQZW5kaW5nU2hh
ZGVyczsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAg
ICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwIG1fcGVuZGluZ1NWR0RvY3VtZW50czsKKyNlbmRp
ZgorICAgICAgICBDU1NWYWx1ZSogbV9saW5lSGVpZ2h0VmFsdWU7CisgICAgICAgIGJvb2wgbV9m
b250RGlydHk7CisKKyAgICAgICAgYm9vbCBtX2hhc1VBQXBwZWFyYW5jZTsKKyAgICAgICAgQm9y
ZGVyRGF0YSBtX2JvcmRlckRhdGE7CisgICAgICAgIEZpbGxMYXllciBtX2JhY2tncm91bmREYXRh
OworICAgICAgICBDb2xvciBtX2JhY2tncm91bmRDb2xvcjsKKyAgICB9OworCisgICAgc3RhdGlj
IFJlbmRlclN0eWxlKiBzdHlsZU5vdFlldEF2YWlsYWJsZSgpIHsgcmV0dXJuIHNfc3R5bGVOb3RZ
ZXRBdmFpbGFibGU7IH0KKworICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gc3R5bGVJbWFnZShD
U1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY2Fj
aGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlVmFsdWUqKTsKKyAg
ICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQ
cm9wZXJ0eUlELCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKik7CisjaWYgRU5BQkxFKENTU19JTUFH
RV9TRVQpCisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzZXRPclBlbmRpbmdGcm9tVmFsdWUo
Q1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VTZXRWYWx1ZSopOworI2VuZGlmCisgICAgUGFzc1JlZlB0
cjxTdHlsZUltYWdlPiBjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NT
Q3Vyc29ySW1hZ2VWYWx1ZSopOworCisgICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgp
OyB9CisgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCk7IH0KKworICAg
IHN0YXRpYyBMZW5ndGggY29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVu
ZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEp
OworICAgIHN0YXRpYyBMZW5ndGggY29udmVydFRvRmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFs
dWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBs
aWVyID0gMSk7CisKKyAgICBDU1NUb1N0eWxlTWFwKiBzdHlsZU1hcCgpIHsgcmV0dXJuICZtX3N0
eWxlTWFwOyB9CisgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFw
cGVycygpIHsgcmV0dXJuIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVyczsgfQorICAgIGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdGF0ZS5mb250RGVz
Y3JpcHRpb24oKTsgfQorICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2Ny
aXB0aW9uKCkgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnRGb250RGVzY3JpcHRpb24oKTsgfQorICAg
IHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2Ny
aXB0aW9uKSB7IG1fc3RhdGUuc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0K
KyAgICB2b2lkIHNldFpvb20oZmxvYXQgZikgeyBtX3N0YXRlLnNldFpvb20oZik7IH0KKyAgICB2
b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX3N0YXRlLnNldEVmZmVjdGl2ZVpvb20o
Zik7IH0KKyAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2RlKSB7
IG1fc3RhdGUuc2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9CisgICAgdm9pZCBzZXRUZXh0
T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX3N0YXRlLnNl
dFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9CisgICAgCisgICAgdm9pZCByZXBv
cnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7CisgICAgCitwcml2YXRlOgor
ICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKKworICAgIHZv
aWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBjYW5T
aGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAgdm9pZCBh
cHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7CisKKyNpZiBFTkFCTEUoU1ZH
KQorICAgIHZvaWQgYXBwbHlTVkdQcm9wZXJ0eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOwor
I2VuZGlmCisKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRQZW5kaW5nSW1hZ2UoU3R5
bGVQZW5kaW5nSW1hZ2UqKTsKKyAgICB2b2lkIGxvYWRQZW5kaW5nSW1hZ2VzKCk7CisKKyAgICBz
dGF0aWMgdW5zaWduZWQgY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVk
UHJvcGVydGllcyosIHVuc2lnbmVkIHNpemUpOworICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGll
c0NhY2hlSXRlbSB7CisgICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0
SW5mbyopIGNvbnN0OworICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+IG1hdGNoZWRQ
cm9wZXJ0aWVzOworICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7CisgICAgICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gcmVuZGVyU3R5bGU7CisgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcGFy
ZW50UmVuZGVyU3R5bGU7CisgICAgfTsKKyAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hl
SXRlbSogZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0
IE1hdGNoUmVzdWx0Jik7CisgICAgdm9pZCBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29u
c3QgUmVuZGVyU3R5bGUqLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVk
IGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7CisKKyAgICAvLyBFdmVyeSBOIGFkZGl0aW9ucyB0
byB0aGUgbWF0Y2hlZCBkZWNsYXJhdGlvbiBjYWNoZSB0cmlnZ2VyIGEgc3dlZXAgd2hlcmUgZW50
cmllcyBob2xkaW5nCisgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgc3R5bGUgZGVjbGFy
YXRpb24gYXJlIGdhcmJhZ2UgY29sbGVjdGVkLgorICAgIHZvaWQgc3dlZXBNYXRjaGVkUHJvcGVy
dGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+Kik7CisKKyAgICBib29sIGNsYXNzTmFtZXNB
ZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYpIGNvbnN0OworICAgIGJvb2wg
c2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHls
ZWRFbGVtZW50KikgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcDsKKworICAgIHR5cGVkZWYgSGFzaE1hcDx1bnNpZ25l
ZCwgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0+IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU7Cisg
ICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU7CisKKyAg
ICBUaW1lcjxTdHlsZVJlc29sdmVyPiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVy
OworCisgICAgT3duUHRyPE1lZGlhUXVlcnlFdmFsdWF0b3I+IG1fbWVkaXVtOworICAgIFJlZlB0
cjxSZW5kZXJTdHlsZT4gbV9yb290RGVmYXVsdFN0eWxlOworCisgICAgRG9jdW1lbnQqIG1fZG9j
dW1lbnQ7CisgICAgU2VsZWN0b3JGaWx0ZXIgbV9zZWxlY3RvckZpbHRlcjsKKworICAgIGJvb2wg
bV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXM7CisKKyAgICBSZWZQdHI8Q1NTRm9udFNlbGVjdG9y
PiBtX2ZvbnRTZWxlY3RvcjsKKyAgICBWZWN0b3I8T3duUHRyPE1lZGlhUXVlcnlSZXN1bHQ+ID4g
bV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzOworCisjaWYgRU5BQkxFKENTU19E
RVZJQ0VfQURBUFRBVElPTikKKyAgICBSZWZQdHI8Vmlld3BvcnRTdHlsZVJlc29sdmVyPiBtX3Zp
ZXdwb3J0U3R5bGVSZXNvbHZlcjsKKyNlbmRpZgorCisgICAgY29uc3QgU3R5bGVCdWlsZGVyJiBt
X3N0eWxlQnVpbGRlcjsKKworICAgIE93blB0cjxTdHlsZVNjb3BlUmVzb2x2ZXI+IG1fc2NvcGVS
ZXNvbHZlcjsKKyAgICBDU1NUb1N0eWxlTWFwIG1fc3R5bGVNYXA7CisgICAgSW5zcGVjdG9yQ1NT
T01XcmFwcGVycyBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7CisKKyAgICBTdGF0ZSBtX3N0YXRl
OworCisgICAgZnJpZW5kIGNsYXNzIFN0eWxlQnVpbGRlcjsKKyAgICBmcmllbmQgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMm
KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiwg
Y29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmKTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNv
bnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsKKyAgICBmcmllbmQgYm9vbCBv
cGVyYXRvciE9KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsKK307CisK
K2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0
IEF0b21pY1N0cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWF0dHJp
YnV0ZU5hbWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0
dHJzSW5SdWxlcy5jb250YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7Cit9CisKK2lubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5n
JiBjbGFzc1ZhbHVlKSBjb25zdAoreworICAgIEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkp
OworICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFp
bnMoY2xhc3NWYWx1ZS5pbXBsKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpo
YXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoIWlkVmFsdWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0
dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCShyZXZpc2lvbiAxNDUxODEpCisr
KyBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaAkod29ya2luZyBjb3B5
KQpAQCAtMTksNjc5ICsxOSwxMDQgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBTdHlsZVJlc29sdmVy
X2gKLSNkZWZpbmUgU3R5bGVSZXNvbHZlcl9oCisjaWZuZGVmIEVsZW1lbnRSdWxlQ29sbGVjdG9y
X2gKKyNkZWZpbmUgRWxlbWVudFJ1bGVDb2xsZWN0b3JfaAogCi0jaW5jbHVkZSAiQ1NTUnVsZUxp
c3QuaCIKLSNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVMaXN0
LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgotI2luY2x1ZGUgIkluc3BlY3RvckNT
U09NV3JhcHBlcnMuaCIKLSNpbmNsdWRlICJMaW5rSGFzaC5oIgotI2luY2x1ZGUgIk1lZGlhUXVl
cnlFeHAuaCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgotI2luY2x1ZGUgIlJ1bGVGZWF0dXJl
LmgiCi0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVy
ZXMuaCIKLSNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFs
dWF0b3IuaCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIKLSNpbmNsdWRlICJTZWxlY3Rv
ckZpbHRlci5oIgotI2luY2x1ZGUgIlN0eWxlSW5oZXJpdGVkRGF0YS5oIgotI2luY2x1ZGUgIlN0
eWxlU2NvcGVSZXNvbHZlci5oIgotI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgot
I2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSNpbmNsdWRlICJXZWJLaXRD
U1NTVkdEb2N1bWVudFZhbHVlLmgiCi0jZW5kaWYKLSNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgot
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgogI2lu
Y2x1ZGUgPHd0Zi9SZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8
d3RmL3RleHQvQXRvbWljU3RyaW5nSGFzaC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hh
c2guaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1lbnVtIEVTbWFydE1pbmltdW1Gb3JGb250
U2l6ZSB7IERvTm90VXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUsIFVzZVNtYXJ0TWluaW11bUZv
ckZvbnRGaXplIH07Ci0KLWNsYXNzIENTU0N1cnNvckltYWdlVmFsdWU7Ci1jbGFzcyBDU1NGb250
U2VsZWN0b3I7Ci1jbGFzcyBDU1NGb250RmFjZTsKLWNsYXNzIENTU0ZvbnRGYWNlUnVsZTsKLWNs
YXNzIENTU0ltYWdlR2VuZXJhdG9yVmFsdWU7Ci1jbGFzcyBDU1NJbWFnZVNldFZhbHVlOwotY2xh
c3MgQ1NTSW1hZ2VWYWx1ZTsKLWNsYXNzIENTU1BhZ2VSdWxlOwotY2xhc3MgQ1NTUHJpbWl0aXZl
VmFsdWU7Ci1jbGFzcyBDU1NQcm9wZXJ0eTsKIGNsYXNzIENTU1J1bGVMaXN0OwotY2xhc3MgQ1NT
U2VsZWN0b3I7Ci1jbGFzcyBDU1NTdHlsZVNoZWV0OwotY2xhc3MgQ1NTVmFsdWU7Ci1jbGFzcyBD
b250YWluZXJOb2RlOwotY2xhc3MgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uOwotY2xhc3MgQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyOwotY2xhc3MgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdDsKLWNsYXNz
IERvY3VtZW50OwotY2xhc3MgRWxlbWVudDsKLWNsYXNzIEZyYW1lOwotY2xhc3MgRnJhbWVWaWV3
OwotY2xhc3MgS1VSTDsKLWNsYXNzIEtleWZyYW1lTGlzdDsKLWNsYXNzIEtleWZyYW1lVmFsdWU7
Ci1jbGFzcyBNZWRpYVF1ZXJ5RXZhbHVhdG9yOwotY2xhc3MgTm9kZTsKK2NsYXNzIERvY3VtZW50
UnVsZVNldHM7CiBjbGFzcyBSZW5kZXJSZWdpb247Ci1jbGFzcyBSZW5kZXJTY3JvbGxiYXI7CiBj
bGFzcyBSdWxlRGF0YTsKIGNsYXNzIFJ1bGVTZXQ7Ci1jbGFzcyBTZXR0aW5nczsKLWNsYXNzIFN0
YXRpY0NTU1J1bGVMaXN0OwotY2xhc3MgU3R5bGVCdWlsZGVyOworY2xhc3MgU2VsZWN0b3JGaWx0
ZXI7CiBjbGFzcyBTdHlsZVNjb3BlUmVzb2x2ZXI7Ci1jbGFzcyBTdHlsZUltYWdlOwotY2xhc3Mg
U3R5bGVLZXlmcmFtZTsKLWNsYXNzIFN0eWxlUGVuZGluZ0ltYWdlOwotY2xhc3MgU3R5bGVQcm9w
ZXJ0eVNldDsKLWNsYXNzIFN0eWxlUnVsZTsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLWNsYXNz
IFN0eWxlUnVsZUhvc3Q7Ci0jZW5kaWYKLWNsYXNzIFN0eWxlUnVsZUtleWZyYW1lczsKLWNsYXNz
IFN0eWxlUnVsZVBhZ2U7Ci1jbGFzcyBTdHlsZVJ1bGVSZWdpb247Ci1jbGFzcyBTdHlsZVNoYWRl
cjsKLWNsYXNzIFN0eWxlU2hlZXQ7Ci1jbGFzcyBTdHlsZVNoZWV0TGlzdDsKLWNsYXNzIFN0eWxl
ZEVsZW1lbnQ7Ci1jbGFzcyBWaWV3cG9ydFN0eWxlUmVzb2x2ZXI7Ci1jbGFzcyBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTsKLWNsYXNzIFdlYktpdENTU1NoYWRlclZhbHVlOwotY2xhc3MgV2ViS2l0Q1NT
U1ZHRG9jdW1lbnRWYWx1ZTsKLQotY2xhc3MgTWVkaWFRdWVyeVJlc3VsdCB7Ci0gICAgV1RGX01B
S0VfTk9OQ09QWUFCTEUoTWVkaWFRdWVyeVJlc3VsdCk7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OwotcHVibGljOgotICAgIE1lZGlhUXVlcnlSZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCYgZXhw
ciwgYm9vbCByZXN1bHQpCi0gICAgICAgIDogbV9leHByZXNzaW9uKGV4cHIpCi0gICAgICAgICwg
bV9yZXN1bHQocmVzdWx0KQotICAgIHsKLSAgICB9Ci0gICAgdm9pZCByZXBvcnRNZW1vcnlVc2Fn
ZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0KLSAgICBNZWRpYVF1ZXJ5RXhwIG1fZXhwcmVz
c2lvbjsKLSAgICBib29sIG1fcmVzdWx0OwotfTsKLQotZW51bSBTdHlsZVNoYXJpbmdCZWhhdmlv
ciB7Ci0gICAgQWxsb3dTdHlsZVNoYXJpbmcsCi0gICAgRGlzYWxsb3dTdHlsZVNoYXJpbmcsCi19
OwotCi0vLyBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcyBpcyB1c2VkIGluIG1lZGlhIHF1ZXJpZXMs
IHdoZXJlIHJlbGF0aXZlIHVuaXRzCi0vLyBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvIHRo
ZSBkb2N1bWVudCByb290IGVsZW1lbnQgc3R5bGUsIGFuZCBzdHlsZWQgb25seQotLy8gZnJvbSB0
aGUgVXNlciBBZ2VudCBTdHlsZXNoZWV0IHJ1bGVzLgotCi1lbnVtIFJ1bGVNYXRjaGluZ0JlaGF2
aW9yIHsKLSAgICBNYXRjaEFsbFJ1bGVzLAotICAgIE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlM
LAotICAgIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzLAotfTsKLQotY2xhc3MgUHNldWRvU3R5bGVS
ZXF1ZXN0IHsKLXB1YmxpYzoKLSAgICBQc2V1ZG9TdHlsZVJlcXVlc3QoUHNldWRvSWQgcHNldWRv
SWQsIFJlbmRlclNjcm9sbGJhciogc2Nyb2xsYmFyID0gMCwgU2Nyb2xsYmFyUGFydCBzY3JvbGxi
YXJQYXJ0ID0gTm9QYXJ0KQotICAgICAgICA6IHBzZXVkb0lkKHBzZXVkb0lkKQotICAgICAgICAs
IHNjcm9sbGJhclBhcnQoc2Nyb2xsYmFyUGFydCkKLSAgICAgICAgLCBzY3JvbGxiYXIoc2Nyb2xs
YmFyKQotICAgIHsKLSAgICB9Ci0KLSAgICBQc2V1ZG9JZCBwc2V1ZG9JZDsKLSAgICBTY3JvbGxi
YXJQYXJ0IHNjcm9sbGJhclBhcnQ7Ci0gICAgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXI7Ci19
OwotCi1jbGFzcyBNYXRjaFJlcXVlc3QgewotcHVibGljOgotICAgIE1hdGNoUmVxdWVzdChSdWxl
U2V0KiBydWxlU2V0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzID0gZmFsc2UsIGNvbnN0IENvbnRh
aW5lck5vZGUqIHNjb3BlID0gMCwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkg
YmVoYXZpb3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFy
eSkKLSAgICAgICAgOiBydWxlU2V0KHJ1bGVTZXQpCi0gICAgICAgICwgaW5jbHVkZUVtcHR5UnVs
ZXMoaW5jbHVkZUVtcHR5UnVsZXMpCi0gICAgICAgICwgc2NvcGUoc2NvcGUpCi0gICAgICAgICwg
YmVoYXZpb3JBdEJvdW5kYXJ5KGJlaGF2aW9yQXRCb3VuZGFyeSkgeyB9Ci0gICAgY29uc3QgUnVs
ZVNldCogcnVsZVNldDsKLSAgICBjb25zdCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzOwotICAgIGNv
bnN0IENvbnRhaW5lck5vZGUqIHNjb3BlOwotICAgIGNvbnN0IFNlbGVjdG9yQ2hlY2tlcjo6QmVo
YXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeTsKLX07Ci0KLS8vIFRoaXMgY2xhc3Mg
c2VsZWN0cyBhIFJlbmRlclN0eWxlIGZvciBhIGdpdmVuIGVsZW1lbnQgYmFzZWQgb24gYSBjb2xs
ZWN0aW9uIG9mIHN0eWxlc2hlZXRzLgotY2xhc3MgU3R5bGVSZXNvbHZlciB7Ci0gICAgV1RGX01B
S0VfTk9OQ09QWUFCTEUoU3R5bGVSZXNvbHZlcik7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwot
cHVibGljOgotICAgIFN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqLCBib29sIG1hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcyk7Ci0gICAgflN0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIFVzaW5nIHRoZXNl
IGR1cmluZyB0cmVlIHdhbGsgd2lsbCBhbGxvdyBzdHlsZSBzZWxlY3RvciB0byBvcHRpbWl6ZSBj
aGlsZCBhbmQgZGVzY2VuZGFudCBzZWxlY3RvciBsb29rdXBzLgotICAgIHZvaWQgcHVzaFBhcmVu
dEVsZW1lbnQoRWxlbWVudCopOwotICAgIHZvaWQgcG9wUGFyZW50RWxlbWVudChFbGVtZW50Kik7
Ci0gICAgdm9pZCBwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7Ci0gICAg
dm9pZCBwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSNpZiBFTkFCTEUo
U0hBRE9XX0RPTSkKLSAgICB2b2lkIGFkZEhvc3RSdWxlKFN0eWxlUnVsZUhvc3QqIHJ1bGUsIGJv
b2wgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUp
IHsgZW5zdXJlU2NvcGVSZXNvbHZlcigpLT5hZGRIb3N0UnVsZShydWxlLCBoYXNEb2N1bWVudFNl
Y3VyaXR5T3JpZ2luLCBzY29wZSk7IH0KLSNlbmRpZgotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gc3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUg
PSAwLCBTdHlsZVNoYXJpbmdCZWhhdmlvciA9IEFsbG93U3R5bGVTaGFyaW5nLAotICAgICAgICBS
dWxlTWF0Y2hpbmdCZWhhdmlvciA9IE1hdGNoQWxsUnVsZXMsIFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZyA9IDApOwotCi0gICAgdm9pZCBrZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihF
bGVtZW50KiwgY29uc3QgUmVuZGVyU3R5bGUqLCBLZXlmcmFtZUxpc3QmKTsKLQotICAgIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IHBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiwgY29uc3Qg
UHNldWRvU3R5bGVSZXF1ZXN0JiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLQotICAgIFBh
c3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KTsKLSAgICBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCk7Ci0gICAgUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JUZXh0KFRleHQqKTsKLQotICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiwgQ1NTRm9u
dFNlbGVjdG9yKiA9IDApOwotCi0gICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1
cm4gbV9zdGF0ZS5zdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29u
c3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnRTdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHJv
b3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KTsgfQotICAgIEVsZW1lbnQqIGVsZW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKTsg
fQotICAgIERvY3VtZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fZG9jdW1lbnQ7IH0KLSAgICBT
dHlsZVNjb3BlUmVzb2x2ZXIqIHNjb3BlUmVzb2x2ZXIoKSBjb25zdCB7IHJldHVybiBtX3Njb3Bl
UmVzb2x2ZXIuZ2V0KCk7IH0KLSAgICBib29sIGhhc1BhcmVudE5vZGUoKSBjb25zdCB7IHJldHVy
biBtX3N0YXRlLnBhcmVudE5vZGUoKTsgfQotCi0gICAgLy8gRklYTUU6IEl0IGNvdWxkIGJlIGJl
dHRlciB0byBjYWxsIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoKSBkaXJlY3Rs
eSBhZnRlciB3ZSBmYWN0b3IgU3R5bGVSc29sdmVyIGZ1cnRoZXIuCi0gICAgLy8gaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwODg5MAotICAgIHZvaWQgYXBwZW5kQXV0
aG9yU3R5bGVTaGVldHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NT
U3R5bGVTaGVldD4gPiYpOwotCi0gICAgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSB7IHJl
dHVybiBtX3J1bGVTZXRzOyB9Ci0gICAgY29uc3QgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMo
KSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzOyB9Ci0KLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVE
KSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIGVuc3VyZVNj
b3BlUmVzb2x2ZXIoKQotICAgIHsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKQotI2lmIEVOQUJM
RShTSEFET1dfRE9NKQotICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hh
ZG93RE9NRW5hYmxlZCgpIHx8IFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5h
YmxlZCgpKTsKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpz
dHlsZVNjb3BlZEVuYWJsZWQoKSk7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50
aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkpOwotI2VuZGlmCi0gICAgICAg
IGlmICghbV9zY29wZVJlc29sdmVyKQotICAgICAgICAgICAgbV9zY29wZVJlc29sdmVyID0gYWRv
cHRQdHIobmV3IFN0eWxlU2NvcGVSZXNvbHZlcigpKTsKLSAgICAgICAgcmV0dXJuIG1fc2NvcGVS
ZXNvbHZlci5nZXQoKTsKLSAgICB9Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgICB2b2lkIGluaXRF
bGVtZW50KEVsZW1lbnQqKTsKLSAgICBSZW5kZXJTdHlsZSogbG9jYXRlU2hhcmVkU3R5bGUoKTsK
LSAgICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqKTsK
LSAgICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKTsKLSAgICBO
b2RlKiBsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5zaWduZWQmIHZpc2l0ZWRO
b2RlQ291bnQpIGNvbnN0OwotICAgIFN0eWxlZEVsZW1lbnQqIGZpbmRTaWJsaW5nRm9yU3R5bGVT
aGFyaW5nKE5vZGUqLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0OwotICAgIGJvb2wgY2FuU2hhcmVT
dHlsZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIFBhc3NSZWZQdHI8
UmVuZGVyU3R5bGU+IHN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBT
dHlsZUtleWZyYW1lKiwgS2V5ZnJhbWVWYWx1ZSYpOwotCi1wdWJsaWM6Ci0gICAgLy8gVGhlc2Ug
bWV0aG9kcyB3aWxsIGdpdmUgYmFjayB0aGUgc2V0IG9mIHJ1bGVzIHRoYXQgbWF0Y2hlZCBmb3Ig
YSBnaXZlbiBlbGVtZW50IChvciBhIHBzZXVkby1lbGVtZW50KS4KLSAgICBlbnVtIENTU1J1bGVG
aWx0ZXIgewotICAgICAgICBVQUFuZFVzZXJDU1NSdWxlcyAgID0gMSA8PCAxLAotICAgICAgICBB
dXRob3JDU1NSdWxlcyAgICAgID0gMSA8PCAyLAotICAgICAgICBFbXB0eUNTU1J1bGVzICAgICAg
ID0gMSA8PCAzLAotICAgICAgICBDcm9zc09yaWdpbkNTU1J1bGVzID0gMSA8PCA0LAotICAgICAg
ICBBbGxCdXRFbXB0eUNTU1J1bGVzID0gVUFBbmRVc2VyQ1NTUnVsZXMgfCBBdXRob3JDU1NSdWxl
cyB8IENyb3NzT3JpZ2luQ1NTUnVsZXMsCi0gICAgICAgIEFsbENTU1J1bGVzICAgICAgICAgPSBB
bGxCdXRFbXB0eUNTU1J1bGVzIHwgRW1wdHlDU1NSdWxlcywKLSAgICB9OwotICAgIFBhc3NSZWZQ
dHI8Q1NTUnVsZUxpc3Q+IHN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCB1bnNpZ25lZCBy
dWxlc1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOwotICAgIFBhc3NSZWZQdHI8Q1NT
UnVsZUxpc3Q+IHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCBQc2V1ZG9JZCwg
dW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1bGVzKTsKLQotICAgIC8v
IEdpdmVuIGEgQ1NTIGtleXdvcmQgaW4gdGhlIHJhbmdlICh4eC1zbWFsbCB0byAtd2Via2l0LXh4
eC1sYXJnZSksIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KLSAgICAvLyB0aGUgY29ycmVjdCBm
b250IHNpemUgc2NhbGVkIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgZGVmYXVsdCAobWVkaXVtKS4K
LSAgICBzdGF0aWMgZmxvYXQgZm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiwgaW50IGtleXdv
cmQsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0KLSAgICAvLyBHaXZlbiBhIGZv
bnQgc2l6ZSBpbiBwaXhlbCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBsZWdhY3kgZm9udCBz
aXplIGJldHdlZW4gMSBhbmQgNy4KLSAgICBzdGF0aWMgaW50IGxlZ2FjeUZvbnRTaXplKERvY3Vt
ZW50KiwgaW50IHBpeGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7
Ci0KLXB1YmxpYzoKLSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQs
IENTU1ZhbHVlKiwgUmVuZGVyU3R5bGUqKTsKLQotICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvQ3Vy
cmVudFN0eWxlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0KLSAgICB2b2lkIHVwZGF0ZUZv
bnQoKTsKLSAgICB2b2lkIGluaXRpYWxpemVGb250U3R5bGUoU2V0dGluZ3MqKTsKLQotICAgIHN0
YXRpYyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIGZs
b2F0IHpvb21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUs
IEVTbWFydE1pbmltdW1Gb3JGb250U2l6ZSA9IFVzZVNtYXJ0TWluaW11bUZvckZvbnRGaXplKTsK
LQotICAgIHZvaWQgc2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiwgZmxvYXQgc2l6ZSk7Ci0K
LXByaXZhdGU6Ci0gICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRT
aXplKERvY3VtZW50KiwgUmVuZGVyU3R5bGUqLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBz
cGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcyk7Ci0KLXB1YmxpYzoKLSAgICBib29s
IHVzZVNWR1pvb21SdWxlcygpOwotCi0gICAgc3RhdGljIGJvb2wgY29sb3JGcm9tUHJpbWl0aXZl
VmFsdWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVWYWx1ZSopOwotICAgIENvbG9y
IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiwgYm9vbCBmb3JWaXNp
dGVkTGluayA9IGZhbHNlKSBjb25zdDsKLQotICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JJZChjb25z
dCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLSAgICBib29sIGhhc1NlbGVjdG9yRm9yQ2xhc3MoY29u
c3QgQXRvbWljU3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBoYXNTZWxlY3RvckZvckF0dHJpYnV0
ZShjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLQotICAgIENTU0ZvbnRTZWxlY3RvciogZm9u
dFNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mb250U2VsZWN0b3IuZ2V0KCk7IH0KLSNpZiBF
TkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIFZpZXdwb3J0U3R5bGVSZXNvbHZlciog
dmlld3BvcnRTdHlsZVJlc29sdmVyKCkgeyByZXR1cm4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIu
Z2V0KCk7IH0KLSNlbmRpZgotCi0gICAgdm9pZCBhZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cnlSZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCosIGJvb2wgcmVzdWx0KTsKLSAgICBib29sIGhh
c1ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyaWVzKCkgY29uc3QgeyByZXR1cm4gIW1fdmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5pc0VtcHR5KCk7IH0KLSAgICBib29sIGFmZmVj
dGVkQnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0OwotCi0gICAgdm9pZCBhZGRLZXlmcmFtZVN0eWxl
KFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPik7Ci0KLSAgICBib29sIGNoZWNrUmVnaW9u
U3R5bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0KLSAgICBib29sIHVzZXNTaWJsaW5nUnVs
ZXMoKSBjb25zdCB7IHJldHVybiAhbV9ydWxlU2V0cy5mZWF0dXJlcygpLnNpYmxpbmdSdWxlcy5p
c0VtcHR5KCk7IH0KLSAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0IHsgcmV0dXJu
IG1fcnVsZVNldHMuZmVhdHVyZXMoKS51c2VzRmlyc3RMaW5lUnVsZXM7IH0KLSAgICBib29sIHVz
ZXNCZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygp
LnVzZXNCZWZvcmVBZnRlclJ1bGVzOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBjcmVhdGVUcmFuc2Zv
cm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7
Ci0gICAgCi0gICAgdm9pZCBpbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSgpOwotCi0j
aWYgRU5BQkxFKENTU19GSUxURVJTKQotICAgIGJvb2wgY3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhD
U1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290
U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwotI2lmIEVOQUJMRShDU1Nf
U0hBREVSUykKLSAgICBTdHlsZVNoYWRlciogc3R5bGVTaGFkZXIoQ1NTVmFsdWUqKTsKLSAgICBT
dHlsZVNoYWRlciogY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2ViS2l0Q1NT
U2hhZGVyVmFsdWUqKTsKLSAgICBib29sIHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChD
U1NWYWx1ZSosIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmKTsKLSAgICBQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3Ry
aW5nJiBuYW1lLCBDU1NWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1l
dGVyPiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwg
Q1NTVmFsdWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBh
cnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFs
dWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3Vz
dG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVM
aXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3Rv
bUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVy
VmFsdWUqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3Vz
dG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSop
OwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0
ZXJPcGVyYXRpb24oV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5n
U2hhZGVycygpOwotI2VuZGlmCi0jaWYgRU5BQkxFKFNWRykKLSAgICB2b2lkIGxvYWRQZW5kaW5n
U1ZHRG9jdW1lbnRzKCk7Ci0jZW5kaWYKLSNlbmRpZiAvLyBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0K
LSAgICB2b2lkIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhp
cyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0
aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKLSAg
ICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0
eWxlKiBwYXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5
bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAgdm9pZCBhZGp1c3RSZW5kZXJT
dHlsZShSZW5kZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxl
LCBFbGVtZW50Kik7Ci0KLSAgICBzdHJ1Y3QgUnVsZVJhbmdlIHsKLSAgICAgICAgUnVsZVJhbmdl
KGludCYgZmlyc3RSdWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJbmRleCk6IGZpcnN0UnVsZUluZGV4
KGZpcnN0UnVsZUluZGV4KSwgbGFzdFJ1bGVJbmRleChsYXN0UnVsZUluZGV4KSB7IH0KLSAgICAg
ICAgaW50JiBmaXJzdFJ1bGVJbmRleDsKLSAgICAgICAgaW50JiBsYXN0UnVsZUluZGV4OwotICAg
IH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hSYW5nZXMgewotICAgICAgICBNYXRjaFJhbmdlcygpIDog
Zmlyc3RVQVJ1bGUoLTEpLCBsYXN0VUFSdWxlKC0xKSwgZmlyc3RBdXRob3JSdWxlKC0xKSwgbGFz
dEF1dGhvclJ1bGUoLTEpLCBmaXJzdFVzZXJSdWxlKC0xKSwgbGFzdFVzZXJSdWxlKC0xKSB7IH0K
LSAgICAgICAgaW50IGZpcnN0VUFSdWxlOwotICAgICAgICBpbnQgbGFzdFVBUnVsZTsKLSAgICAg
ICAgaW50IGZpcnN0QXV0aG9yUnVsZTsKLSAgICAgICAgaW50IGxhc3RBdXRob3JSdWxlOwotICAg
ICAgICBpbnQgZmlyc3RVc2VyUnVsZTsKLSAgICAgICAgaW50IGxhc3RVc2VyUnVsZTsKLSAgICAg
ICAgUnVsZVJhbmdlIFVBUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VUFSdWxl
LCBsYXN0VUFSdWxlKTsgfQotICAgICAgICBSdWxlUmFuZ2UgYXV0aG9yUnVsZVJhbmdlKCkgeyBy
ZXR1cm4gUnVsZVJhbmdlKGZpcnN0QXV0aG9yUnVsZSwgbGFzdEF1dGhvclJ1bGUpOyB9Ci0gICAg
ICAgIFJ1bGVSYW5nZSB1c2VyUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VXNl
clJ1bGUsIGxhc3RVc2VyUnVsZSk7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoZWRQcm9w
ZXJ0aWVzIHsKLSAgICAgICAgTWF0Y2hlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgfk1hdGNoZWRQ
cm9wZXJ0aWVzKCk7Ci0gICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0
SW5mbyopIGNvbnN0OwotICAgICAgICAKLSAgICAgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+
IHByb3BlcnRpZXM7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIHN0cnVjdCB7Ci0gICAg
ICAgICAgICAgICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA6IDI7Ci0gICAgICAgICAgICAgICAg
dW5zaWduZWQgd2hpdGVsaXN0VHlwZSA6IDI7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAg
Ly8gVXNlZCB0byBtYWtlIHN1cmUgYWxsIG1lbW9yeSBpcyB6ZXJvLWluaXRpYWxpemVkIHNpbmNl
IHdlIGNvbXB1dGUgdGhlIGhhc2ggb3ZlciB0aGUgYnl0ZXMgb2YgdGhpcyBvYmplY3QuCi0gICAg
ICAgICAgICB2b2lkKiBwb3NzaWJseVBhZGRlZE1lbWJlcjsKLSAgICAgICAgfTsKLSAgICB9Owot
Ci0gICAgc3RydWN0IE1hdGNoUmVzdWx0IHsKLSAgICAgICAgTWF0Y2hSZXN1bHQoKSA6IGlzQ2Fj
aGVhYmxlKHRydWUpIHsgfQotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXMsIDY0PiBt
YXRjaGVkUHJvcGVydGllczsKLSAgICAgICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVk
UnVsZXM7Ci0gICAgICAgIE1hdGNoUmFuZ2VzIHJhbmdlczsKLSAgICAgICAgYm9vbCBpc0NhY2hl
YWJsZTsKLSAgICB9OwotCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0
Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUq
ID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGws
IFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAgdm9p
ZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9w
ZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKLQotICAgIHZvaWQgbWF0Y2hBbGxS
dWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSAgICB2b2lk
IG1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNo
UmVzdWx0JiwgUnVsZVNldCopOwotICAgIHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3Vs
dCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoTWF0
Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoU2NvcGVk
QXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2
b2lkIG1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7
Ci0KLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1
bGVSYW5nZSYpOwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3Qg
TWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxl
c0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiosIGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1
bGVSYW5nZSYpOwotCi0gICAgYm9vbCBmYXN0UmVqZWN0U2VsZWN0b3IoY29uc3QgUnVsZURhdGEm
KSBjb25zdDsKLSAgICB2b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKLSAgICB2b2lkIHNvcnRBbmRU
cmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRjaFJlc3VsdCYpOwotCi0gICAgYm9vbCBydWxlTWF0Y2hl
cyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYs
IFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpE
b2VzTm90Q3Jvc3NCb3VuZGFyeSk7Ci0gICAgYm9vbCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0
IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0g
ICAgdm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgY29uc3Qg
RWxlbWVudCopOwotICAgIGVudW0gU3R5bGVBcHBsaWNhdGlvblBhc3MgewotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgICAgICBWYXJpYWJsZURlZmluaXRpb25zLAotI2VuZGlmCi0gICAg
ICAgIEhpZ2hQcmlvcml0eVByb3BlcnRpZXMsCi0gICAgICAgIExvd1ByaW9yaXR5UHJvcGVydGll
cwotICAgIH07Ci0gICAgdGVtcGxhdGUgPFN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci0gICAg
dm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgYm9vbCBpbXBv
cnRhbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSk7
Ci0gICAgdGVtcGxhdGUgPFN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBs
eVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxl
KiwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlz
dFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOwotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVT
KQotICAgIHZvaWQgcmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFZl
Y3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25z
KTsKLSNlbmRpZgotICAgIHN0YXRpYyBib29sIGlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENT
U1Byb3BlcnR5SUQpOwotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICBzdGF0aWMgYm9vbCBp
c1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEKTsKLSNlbmRpZgotICAgIHZvaWQg
bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0KiwgYm9vbCBpc0xlZnRQYWdlLCBi
b29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKLSAgICB2b2lkIG1hdGNo
UGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNv
bnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJz
dFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwotICAgIFNldHRpbmdzKiBkb2N1bWVudFNl
dHRpbmdzKCkgeyByZXR1cm4gbV9kb2N1bWVudC0+c2V0dGluZ3MoKTsgfQotCi0gICAgYm9vbCBp
c0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OwotICAgIGJvb2wgaXNSaWdodFBhZ2UoaW50
IHBhZ2VJbmRleCkgY29uc3QgeyByZXR1cm4gIWlzTGVmdFBhZ2UocGFnZUluZGV4KTsgfQotICAg
IGJvb2wgaXNGaXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7Ci0gICAgU3RyaW5nIHBhZ2VO
YW1lKGludCBwYWdlSW5kZXgpIGNvbnN0OwotCi0gICAgRG9jdW1lbnRSdWxlU2V0cyBtX3J1bGVT
ZXRzOwotCi0gICAgdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBSZWZQdHI8U3R5
bGVSdWxlS2V5ZnJhbWVzPiA+IEtleWZyYW1lc1J1bGVNYXA7Ci0gICAgS2V5ZnJhbWVzUnVsZU1h
cCBtX2tleWZyYW1lc1J1bGVNYXA7CitjbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKIAorY2xhc3Mg
RWxlbWVudFJ1bGVDb2xsZWN0b3IgewogcHVibGljOgotICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NQ
cm9wZXJ0eUlELCBSZWZQdHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA7Ci0j
aWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIHR5cGVkZWYgSGFzaE1h
cDxGaWx0ZXJPcGVyYXRpb24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZT4gPiBQ
ZW5kaW5nU1ZHRG9jdW1lbnRNYXA7Ci0jZW5kaWYKLQotICAgIGNsYXNzIFN0YXRlIHsKLSAgICAg
ICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3RhdGUpOwotICAgIHB1YmxpYzoKLSAgICAgICAgU3Rh
dGUoKQotICAgICAgICA6IG1fZWxlbWVudCgwKQotICAgICAgICAsIG1fc3R5bGVkRWxlbWVudCgw
KQotICAgICAgICAsIG1fcGFyZW50Tm9kZSgwKQotICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkK
LSAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKKyAgICBFbGVtZW50UnVsZUNvbGxlY3Rv
cihTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0
ZSYgc3RhdGUpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgLCBtX3J1bGVTZXRz
KHN0eWxlUmVzb2x2ZXItPnJ1bGVTZXRzKCkpCisgICAgICAgICwgbV9zZWxlY3RvckZpbHRlcihz
dHlsZVJlc29sdmVyLT5zZWxlY3RvckZpbHRlcigpKQorICAgICAgICAsIG1faW5zcGVjdG9yQ1NT
T01XcmFwcGVycyhzdHlsZVJlc29sdmVyLT5pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkpCisgICAg
ICAgICwgbV9zY29wZVJlc29sdmVyKHN0eWxlUmVzb2x2ZXItPnNjb3BlUmVzb2x2ZXIoKSkKKyAg
ICAgICAgLCBtX2lzUHJpbnRTdHlsZShmYWxzZSkKICAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxp
bmcoMCkKLSAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQogICAgICAgICAsIG1fcHNl
dWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKQotICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShO
b3RJbnNpZGVMaW5rKQotICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZh
bHNlKQotICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQorICAg
ICAgICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCiAgICAgICAgICwgbV9tb2RlKFNlbGVjdG9y
Q2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpCi0gICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9SZWd1
bGFyU3R5bGUodHJ1ZSkKLSAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5
bGUoZmFsc2UpCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgICAgICAsIG1faGFzUGVuZGlu
Z1NoYWRlcnMoZmFsc2UpCi0jZW5kaWYKLSAgICAgICAgLCBtX2xpbmVIZWlnaHRWYWx1ZSgwKQot
ICAgICAgICAsIG1fZm9udERpcnR5KGZhbHNlKQotICAgICAgICAsIG1faGFzVUFBcHBlYXJhbmNl
KGZhbHNlKQotICAgICAgICAsIG1fYmFja2dyb3VuZERhdGEoQmFja2dyb3VuZEZpbGxMYXllcikg
eyB9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOwot
ICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVtZW50KiwgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiA9IFBz
ZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyksIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGlu
ZyA9IDApOwotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50LT5kb2N1bWVudCgpOyB9Ci0gICAgICAgIEVs
ZW1lbnQqIGVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQ7IH0KLSAgICAgICAgU3R5
bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGVkRWxlbWVu
dDsgfQotICAgICAgICB2b2lkIHNldFN0eWxlKFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxl
KSB7IG1fc3R5bGUgPSBzdHlsZTsgfQotICAgICAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25z
dCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9Ci0gICAgICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5
bGU+IHRha2VTdHlsZSgpIHsgcmV0dXJuIG1fc3R5bGUucmVsZWFzZSgpOyB9Ci0KLSAgICAgICAg
U3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0KCk7Ci0gICAgICAgIFBhc3NSZWZQdHI8
Q1NTUnVsZUxpc3Q+IHRha2VSdWxlTGlzdCgpIHsgcmV0dXJuIG1fcnVsZUxpc3QucmVsZWFzZSgp
OyB9Ci0KLSAgICAgICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSgpIGNvbnN0IHsg
cmV0dXJuIG1fcGFyZW50Tm9kZTsgfQotICAgICAgICB2b2lkIHNldFBhcmVudFN0eWxlKFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSkgeyBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7IH0KLSAg
ICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnRT
dHlsZTsgfQotICAgICAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsg
cmV0dXJuIG1fcm9vdEVsZW1lbnRTdHlsZTsgfQotCi0gICAgICAgIGNvbnN0IFJlbmRlclJlZ2lv
biogcmVnaW9uRm9yU3R5bGluZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnaW9uRm9yU3R5bGluZzsg
fQotICAgICAgICB2b2lkIHNldFNhbWVPcmlnaW5Pbmx5KGJvb2wgaXNTYW1lT3JpZ2luT25seSkg
eyBtX3NhbWVPcmlnaW5Pbmx5ID0gaXNTYW1lT3JpZ2luT25seTsgfQotICAgICAgICBib29sIGlz
U2FtZU9yaWdpbk9ubHkoKSBjb25zdCB7IHJldHVybiBtX3NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAg
ICAgIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0KCkgY29uc3Qg
eyByZXR1cm4gbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7IH0KLSAgICAgICAgRUluc2lkZUxpbmsgZWxl
bWVudExpbmtTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudExpbmtTdGF0ZTsgfQotICAg
ICAgICBib29sIGRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1f
ZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50OyB9Ci0gICAgICAgIHZvaWQgc2V0RWxlbWVudEFm
ZmVjdGVkQnlDbGFzc1J1bGVzKGJvb2wgaXNBZmZlY3RlZCkgeyBtX2VsZW1lbnRBZmZlY3RlZEJ5
Q2xhc3NSdWxlcyA9IGlzQWZmZWN0ZWQ7IH0KLSAgICAgICAgYm9vbCBlbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxl
czsgfQotICAgICAgICB2b2lkIHNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUpIHsg
bV9tb2RlID0gbW9kZTsgfQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSgpIGNv
bnN0IHsgcmV0dXJuIG1fbW9kZTsgfQotICAgICAgICAKLSAgICAgICAgdm9pZCBzZXRBcHBseVBy
b3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlID0gaXNBcHBseTsgfQotICAgICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1Zp
c2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExp
bmtTdHlsZSA9IGlzQXBwbHk7IH0KLSAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFy
U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsgfQot
ICAgICAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7IH0KLSAgICAgICAgUGVuZGlu
Z0ltYWdlUHJvcGVydHlNYXAmIHBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKSB7IHJldHVybiBtX3Bl
bmRpbmdJbWFnZVByb3BlcnRpZXM7IH0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJM
RShTVkcpCi0gICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCYgcGVuZGluZ1NWR0RvY3VtZW50
cygpIHsgcmV0dXJuIG1fcGVuZGluZ1NWR0RvY3VtZW50czsgfQotI2VuZGlmCi0jaWYgRU5BQkxF
KENTU19TSEFERVJTKQotICAgICAgICB2b2lkIHNldEhhc1BlbmRpbmdTaGFkZXJzKGJvb2wgaGFz
UGVuZGluZ1NoYWRlcnMpIHsgbV9oYXNQZW5kaW5nU2hhZGVycyA9IGhhc1BlbmRpbmdTaGFkZXJz
OyB9Ci0gICAgICAgIGJvb2wgaGFzUGVuZGluZ1NoYWRlcnMoKSBjb25zdCB7IHJldHVybiBtX2hh
c1BlbmRpbmdTaGFkZXJzOyB9Ci0jZW5kaWYKLQotICAgICAgICB2b2lkIHNldExpbmVIZWlnaHRW
YWx1ZShDU1NWYWx1ZSogdmFsdWUpIHsgbV9saW5lSGVpZ2h0VmFsdWUgPSB2YWx1ZTsgfQotICAg
ICAgICBDU1NWYWx1ZSogbGluZUhlaWdodFZhbHVlKCkgeyByZXR1cm4gbV9saW5lSGVpZ2h0VmFs
dWU7IH0KLSAgICAgICAgdm9pZCBzZXRGb250RGlydHkoYm9vbCBpc0RpcnR5KSB7IG1fZm9udERp
cnR5ID0gaXNEaXJ0eTsgfQotICAgICAgICBib29sIGZvbnREaXJ0eSgpIGNvbnN0IHsgcmV0dXJu
IG1fZm9udERpcnR5OyB9Ci0KLSAgICAgICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQo
KTsKLSAgICAgICAgYm9vbCBoYXNVQUFwcGVhcmFuY2UoKSBjb25zdCB7IHJldHVybiBtX2hhc1VB
QXBwZWFyYW5jZTsgfQotICAgICAgICBCb3JkZXJEYXRhIGJvcmRlckRhdGEoKSBjb25zdCB7IHJl
dHVybiBtX2JvcmRlckRhdGE7IH0KLSAgICAgICAgRmlsbExheWVyIGJhY2tncm91bmREYXRhKCkg
Y29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kRGF0YTsgfQotICAgICAgICBDb2xvciBiYWNrZ3Jv
dW5kQ29sb3IoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQotCi0gICAgICAg
IGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdHls
ZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBw
YXJlbnRGb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3BhcmVudFN0eWxlLT5mb250RGVzY3Jp
cHRpb24oKTsgfQotICAgICAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVz
Y3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQotICAgICAgICB2b2lkIHNldFpvb20o
ZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRab29tKGYpOyB9Ci0gICAgICAg
IHZvaWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUt
PnNldEVmZmVjdGl2ZVpvb20oZik7IH0KLSAgICAgICAgdm9pZCBzZXRXcml0aW5nTW9kZShXcml0
aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRXcml0aW5n
TW9kZSh3cml0aW5nTW9kZSk7IH0KLSAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4
dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5z
ZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQotCi0gICAgICAgIFZlY3Rvcjxj
b25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9tYXRjaGVkUnVs
ZXM7IH0KLSAgICAgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSogcnVsZSkg
eyBtX21hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7IH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZToK
LSAgICAgICAgLy8gRklYTUUoYnVnIDEwODU2Myk6IHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJldmll
dywgdGhlc2UgbWVtYmVyCi0gICAgICAgIC8vIHZhcmlhYmxlcyBhcmUgcHVibGljLiBIb3dldmVy
IHdlIHNob3VsZCBhZGQgbWV0aG9kcyB0byBhY2Nlc3MKLSAgICAgICAgLy8gdGhlc2UgdmFyaWFi
bGVzLgotICAgICAgICBFbGVtZW50KiBtX2VsZW1lbnQ7Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJT
dHlsZT4gbV9zdHlsZTsKLSAgICAgICAgU3R5bGVkRWxlbWVudCogbV9zdHlsZWRFbGVtZW50Owot
ICAgICAgICBDb250YWluZXJOb2RlKiBtX3BhcmVudE5vZGU7Ci0gICAgICAgIFJlbmRlclN0eWxl
KiBtX3BhcmVudFN0eWxlOwotICAgICAgICBSZW5kZXJTdHlsZSogbV9yb290RWxlbWVudFN0eWxl
OwotICAgICAgICAKLSAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7Ci0g
ICAgICAgIGJvb2wgbV9zYW1lT3JpZ2luT25seTsKLSAgICAgICAgUHNldWRvU3R5bGVSZXF1ZXN0
IG1fcHNldWRvU3R5bGVSZXF1ZXN0OwotCi0gICAgICAgIEVJbnNpZGVMaW5rIG1fZWxlbWVudExp
bmtTdGF0ZTsKLQotICAgICAgICBib29sIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50Owot
Ci0gICAgICAgIGJvb2wgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7CisgICAgICAgICwg
bV9jYW5Vc2VGYXN0UmVqZWN0KG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3Rl
bnQoc3RhdGUucGFyZW50Tm9kZSgpKSkKKyAgICAgICAgLCBtX2JlaGF2aW9yQXRCb3VuZGFyeShT
ZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KSB7IH0KIAotICAgICAgICBTZWxl
Y3RvckNoZWNrZXI6Ok1vZGUgbV9tb2RlOworICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhib29sIG1h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcywgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOworICAg
IHZvaWQgbWF0Y2hVQVJ1bGVzKCk7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcyk7CisKKyAgICB2b2lkIHNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUp
IHsgbV9tb2RlID0gbW9kZTsgfQorICAgIHZvaWQgc2V0UHNldWRvU3R5bGVSZXF1ZXN0KGNvbnN0
IFBzZXVkb1N0eWxlUmVxdWVzdCYgcmVxdWVzdCkgeyBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHJl
cXVlc3Q7IH0KKyAgICB2b2lkIHNldFNhbWVPcmlnaW5Pbmx5KGJvb2wgZikgeyBtX3NhbWVPcmln
aW5Pbmx5ID0gZjsgfSAKKyAgICB2b2lkIHNldFJlZ2lvbkZvclN0eWxpbmcoUmVuZGVyUmVnaW9u
KiByZWdpb25Gb3JTdHlsaW5nKSB7IG1fcmVnaW9uRm9yU3R5bGluZyA9IHJlZ2lvbkZvclN0eWxp
bmc7IH0KKyAgICB2b2lkIHNldE1lZGl1bShjb25zdCBNZWRpYVF1ZXJ5RXZhbHVhdG9yKiBtZWRp
dW0pIHsgbV9pc1ByaW50U3R5bGUgPSBtZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3BlY2lmaWMoInBy
aW50Iik7IH0KIAotICAgICAgICAvLyBBIGJ1ZmZlciB1c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBt
YXRjaGVkIHJ1bGVzIGZvciBhbiBlbGVtZW50LAotICAgICAgICAvLyBhbmQgYSB0ZW1wb3Jhcnkg
YnVmZmVyIHVzZWQgZm9yIG1lcmdlIHNvcnRpbmcuCi0gICAgICAgIFZlY3Rvcjxjb25zdCBSdWxl
RGF0YSosIDMyPiBtX21hdGNoZWRSdWxlczsKLSAgICAgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVM
aXN0PiBtX3J1bGVMaXN0OworICAgIGJvb2wgaGFzQW55TWF0Y2hpbmdSdWxlcyhSdWxlU2V0Kik7
CiAKLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsKLSAgICAgICAg
Ym9vbCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7CisgICAgU3R5bGVSZXNvbHZl
cjo6TWF0Y2hSZXN1bHQmIG1hdGNoZWRSZXN1bHQoKTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVM
aXN0PiBtYXRjaGVkUnVsZUxpc3QoKTsKIAotICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1h
cCBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAg
ICAgICBib29sIG1faGFzUGVuZGluZ1NoYWRlcnM7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoQ1NTX0ZJ
TFRFUlMpICYmIEVOQUJMRShTVkcpCi0gICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCBtX3Bl
bmRpbmdTVkdEb2N1bWVudHM7Ci0jZW5kaWYKLSAgICAgICAgQ1NTVmFsdWUqIG1fbGluZUhlaWdo
dFZhbHVlOwotICAgICAgICBib29sIG1fZm9udERpcnR5OwotCi0gICAgICAgIGJvb2wgbV9oYXNV
QUFwcGVhcmFuY2U7Ci0gICAgICAgIEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOwotICAgICAgICBG
aWxsTGF5ZXIgbV9iYWNrZ3JvdW5kRGF0YTsKLSAgICAgICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29s
b3I7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRBdmFpbGFi
bGUoKSB7IHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOyB9Ci0KLSAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IHN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKLSAgICBQ
YXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0
eUlELCBDU1NJbWFnZVZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBnZW5lcmF0
ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1
ZSopOwotI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFn
ZT4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0VmFsdWUq
KTsKLSNlbmRpZgotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5kaW5nRnJv
bVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0N1cnNvckltYWdlVmFsdWUqKTsKLQotICAgIGJvb2wg
YXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBs
eVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKTsgfQotICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlz
aXRlZExpbmtTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlz
aXRlZExpbmtTdHlsZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0ludExlbmd0
aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHls
ZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsKLSAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0Zs
b2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSog
cm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOwotCi0gICAgQ1NTVG9TdHlsZU1hcCog
c3R5bGVNYXAoKSB7IHJldHVybiAmbV9zdHlsZU1hcDsgfQotICAgIEluc3BlY3RvckNTU09NV3Jh
cHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3RvckNTU09N
V3JhcHBlcnM7IH0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigp
IHsgcmV0dXJuIG1fc3RhdGUuZm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICBjb25zdCBGb250RGVz
Y3JpcHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUucGFyZW50
Rm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnREZXNjcmlw
dGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9z
dGF0ZS5zZXRab29tKGYpOyB9Ci0gICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsg
bV9zdGF0ZS5zZXRFZmZlY3RpdmVab29tKGYpOyB9Ci0gICAgdm9pZCBzZXRXcml0aW5nTW9kZShX
cml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX3N0YXRlLnNldFdyaXRpbmdNb2RlKHdyaXRpbmdN
b2RlKTsgfQotICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0
T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9u
KTsgfQotICAgIAotICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyop
IGNvbnN0OwotICAgIAogcHJpdmF0ZToKLSAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHNfc3R5bGVO
b3RZZXRBdmFpbGFibGU7CisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9zdGF0
ZS5kb2N1bWVudCgpOyB9CisgICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7CiAKLSAgICB2b2lk
IGNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOwotCi1wcml2YXRlOgotICAgIGJvb2wgY2FuU2hh
cmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIHZvaWQgYXBw
bHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOwotCi0jaWYgRU5BQkxFKFNWRykK
LSAgICB2b2lkIGFwcGx5U1ZHUHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyAg
ICB2b2lkIG1hdGNoVUFSdWxlcyhSdWxlU2V0Kik7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisg
ICAgdm9pZCBtYXRjaFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxl
cywgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7CiAjZW5kaWYKKyAgICB2b2lkIG1hdGNoU2Nv
cGVkQXV0aG9yUnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaEhv
c3RSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKIAotICAgIFBhc3NSZWZQdHI8U3R5bGVJ
bWFnZT4gbG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSopOwotICAgIHZvaWQgbG9h
ZFBlbmRpbmdJbWFnZXMoKTsKLQotICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlTWF0Y2hlZFBy
b3BlcnRpZXNIYXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzKiwgdW5zaWduZWQgc2l6ZSk7Ci0g
ICAgc3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIHsKLSAgICAgICAgdm9pZCByZXBv
cnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAgICAgIFZlY3RvcjxN
YXRjaGVkUHJvcGVydGllcz4gbWF0Y2hlZFByb3BlcnRpZXM7Ci0gICAgICAgIE1hdGNoUmFuZ2Vz
IHJhbmdlczsKLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiByZW5kZXJTdHlsZTsKLSAgICAg
ICAgUmVmUHRyPFJlbmRlclN0eWxlPiBwYXJlbnRSZW5kZXJTdHlsZTsKLSAgICB9OwotICAgIGNv
bnN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsKLSAgICB2b2lkIGFkZFRv
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFJlbmRlclN0
eWxlKiBwYXJlbnRTdHlsZSwgdW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsKLQot
ICAgIC8vIEV2ZXJ5IE4gYWRkaXRpb25zIHRvIHRoZSBtYXRjaGVkIGRlY2xhcmF0aW9uIGNhY2hl
IHRyaWdnZXIgYSBzd2VlcCB3aGVyZSBlbnRyaWVzIGhvbGRpbmcKLSAgICAvLyB0aGUgbGFzdCBy
ZWZlcmVuY2UgdG8gYSBzdHlsZSBkZWNsYXJhdGlvbiBhcmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0g
ICAgdm9pZCBzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZlcj4q
KTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFN0
eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJik7
CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVE
YXRhPiosIGNvbnN0IE1hdGNoUmVxdWVzdCYsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYpOwor
ICAgIGJvb2wgcnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBDb250YWluZXJOb2Rl
KiBzY29wZSwgUHNldWRvSWQmKTsKIAotICAgIGJvb2wgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxl
cyhjb25zdCBTcGFjZVNwbGl0U3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBzaGFyaW5nQ2FuZGlk
YXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqKSBj
b25zdDsKLQotICAgIHVuc2lnbmVkIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1Np
bmNlTGFzdFN3ZWVwOwotCi0gICAgdHlwZWRlZiBIYXNoTWFwPHVuc2lnbmVkLCBNYXRjaGVkUHJv
cGVydGllc0NhY2hlSXRlbT4gTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKLSAgICBNYXRjaGVkUHJv
cGVydGllc0NhY2hlIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKLQotICAgIFRpbWVyPFN0eWxl
UmVzb2x2ZXI+IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXI7Ci0KLSAgICBPd25Q
dHI8TWVkaWFRdWVyeUV2YWx1YXRvcj4gbV9tZWRpdW07Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxl
PiBtX3Jvb3REZWZhdWx0U3R5bGU7Ci0KLSAgICBEb2N1bWVudCogbV9kb2N1bWVudDsKLSAgICBT
ZWxlY3RvckZpbHRlciBtX3NlbGVjdG9yRmlsdGVyOwotCi0gICAgYm9vbCBtX21hdGNoQXV0aG9y
QW5kVXNlclN0eWxlczsKLQotICAgIFJlZlB0cjxDU1NGb250U2VsZWN0b3I+IG1fZm9udFNlbGVj
dG9yOwotICAgIFZlY3RvcjxPd25QdHI8TWVkaWFRdWVyeVJlc3VsdD4gPiBtX3ZpZXdwb3J0RGVw
ZW5kZW50TWVkaWFRdWVyeVJlc3VsdHM7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFU
SU9OKQotICAgIFJlZlB0cjxWaWV3cG9ydFN0eWxlUmVzb2x2ZXI+IG1fdmlld3BvcnRTdHlsZVJl
c29sdmVyOwotI2VuZGlmCisgICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisgICAgdm9pZCBz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKIAotICAgIGNvbnN0IFN0eWxlQnVpbGRlciYg
bV9zdHlsZUJ1aWxkZXI7CisgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0YSop
OworICAgIHZvaWQgY2xlYXJNYXRjaGVkUnVsZXMoKTsKIAotICAgIE93blB0cjxTdHlsZVNjb3Bl
UmVzb2x2ZXI+IG1fc2NvcGVSZXNvbHZlcjsKLSAgICBDU1NUb1N0eWxlTWFwIG1fc3R5bGVNYXA7
Ci0gICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7Ci0K
LSAgICBTdGF0ZSBtX3N0YXRlOwotCi0gICAgZnJpZW5kIGNsYXNzIFN0eWxlQnVpbGRlcjsKLSAg
ICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiwgY29uc3Qg
TWF0Y2hlZFByb3BlcnRpZXMmKTsKLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1h
dGNoZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmKTsKLSAgICBmcmllbmQg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsK
LSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0
Y2hSYW5nZXMmKTsKKyAgICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKKyAg
ICAgICAgCitwcml2YXRlOgorICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBtX3N0YXRl
OworICAgIERvY3VtZW50UnVsZVNldHMmIG1fcnVsZVNldHM7CisgICAgU2VsZWN0b3JGaWx0ZXIm
IG1fc2VsZWN0b3JGaWx0ZXI7CisgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyYgbV9pbnNwZWN0
b3JDU1NPTVdyYXBwZXJzOworICAgIFN0eWxlU2NvcGVSZXNvbHZlciogbV9zY29wZVJlc29sdmVy
OworCisgICAgYm9vbCBtX2lzUHJpbnRTdHlsZTsKKyAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9u
Rm9yU3R5bGluZzsKKyAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7
CisgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5OworICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBt
X21vZGU7CisgICAgYm9vbCBtX2NhblVzZUZhc3RSZWplY3Q7CisgICAgU2VsZWN0b3JDaGVja2Vy
OjpCZWhhdmlvckF0Qm91bmRhcnkgbV9iZWhhdmlvckF0Qm91bmRhcnk7CisKKyAgICBPd25QdHI8
VmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+ID4gbV9tYXRjaGVkUnVsZXM7CisKKyAgICAvLyBP
dXRwdXQuCisgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OworICAgIFN0
eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0IG1fcmVzdWx0OwogfTsKIAotaW5saW5lIGJvb2wgU3R5
bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nICZh
dHRyaWJ1dGVOYW1lKSBjb25zdAotewotICAgIEFTU0VSVCghYXR0cmlidXRlTmFtZS5pc0VtcHR5
KCkpOwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJblJ1bGVzLmNvbnRh
aW5zKGF0dHJpYnV0ZU5hbWUuaW1wbCgpKTsKLX0KLQotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZl
cjo6aGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmIGNsYXNzVmFsdWUpIGNv
bnN0Ci17Ci0gICAgQVNTRVJUKCFjbGFzc1ZhbHVlLmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIG1f
cnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFzc1ZhbHVlLmlt
cGwoKSk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9ySWQo
Y29uc3QgQXRvbWljU3RyaW5nJiBpZFZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVCghaWRWYWx1
ZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxl
cy5jb250YWlucyhpZFZhbHVlLmltcGwoKSk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
IAotI2VuZGlmIC8vIFN0eWxlUmVzb2x2ZXJfaAorI2VuZGlmIC8vIEVsZW1lbnRSdWxlQ29sbGVj
dG9yX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAkocmV2
aXNpb24gMTQ1MTgxKQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHA6
MTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDUxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkg
TGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFs
bGFuIFNhbmRmZWxkIEplbnNlbiAoa2RlQGNhcmV3b2xmLmNvbSkKKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNyBOaWNob2xhcyBTaGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNvbSkKKyAqIENv
cHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAx
MiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDcgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAo
QykgMjAwNywgMjAwOCBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0
IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICho
dHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUg
QXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCisKKyNpbmNsdWRlICJBdHRy
aWJ1dGUuaCIKKyNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5oIgorI2luY2x1ZGUgIkNTU0NhbGN1
bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NDdXJzb3JJbWFnZVZhbHVlLmgiCisjaW5jbHVk
ZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiQ1NTRm9udEZhY2VSdWxlLmgi
CisjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiQ1NTTGluZUJveENvbnRh
aW5WYWx1ZS5oIgorI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCisjaW5jbHVkZSAiQ1NTUGFyc2Vy
LmgiCisjaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBwaW5ncy5oIgorI2luY2x1ZGUgIkNT
U1Byb3BlcnR5TmFtZXMuaCIKKyNpbmNsdWRlICJDU1NSZWZsZWN0VmFsdWUuaCIKKyNpbmNsdWRl
ICJDU1NTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgorI2luY2x1ZGUg
IkNTU1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgorI2luY2x1ZGUg
IkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKKyNp
ZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyNpbmNsdWRlICJDU1NWYXJpYWJsZVZhbHVlLmgiCisj
ZW5kaWYKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkNhbGN1bGF0aW9uVmFs
dWUuaCIKKyNpbmNsdWRlICJDb250ZW50RGF0YS5oIgorI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJl
cy5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJDb3VudGVyQ29udGVudC5oIgor
I2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xs
ZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5oIgorI2luY2x1ZGUgIkZvbnRGZWF0
dXJlVmFsdWUuaCIKKyNpbmNsdWRlICJGb250VmFsdWUuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgor
I2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5j
bHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSFRNTElGcmFtZUVsZW1lbnQuaCIKKyNp
bmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5j
bHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MUHJvZ3Jlc3NFbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxUZXh0QXJl
YUVsZW1lbnQuaCIKKyNpbmNsdWRlICJJbnNlcnRpb25Qb2ludC5oIgorI2luY2x1ZGUgIkluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIktleWZyYW1lTGlzdC5oIgorI2luY2x1
ZGUgIkxpbmtIYXNoLmgiCisjaW5jbHVkZSAiTG9jYWxlVG9TY3JpcHRNYXBwaW5nLmgiCisjaW5j
bHVkZSAiTWF0aE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlv
bi5oIgorI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIk1l
ZGlhTGlzdC5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIKKyNpbmNsdWRlICJO
b2RlUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWlyLmgiCisjaW5jbHVkZSAiUGVyc3BlY3RpdmVU
cmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJRdW90ZXNEYXRhLmgiCisjaW5jbHVkZSAi
UmVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9s
bGJhci5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhclRoZW1lLmgiCisjaW5jbHVkZSAiUmVu
ZGVyU3R5bGVDb25zdGFudHMuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUg
IlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNp
bmNsdWRlICJSdWxlU2V0LmgiCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRlbnNpb25zLmgiCisj
aW5jbHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50LmgiCisjaW5jbHVkZSAiU2NhbGVUcmFuc2Zvcm1P
cGVyYXRpb24uaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNlbGVj
dG9yQ2hlY2tlckZhc3RQYXRoLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJT
aGFkb3dEYXRhLmgiCisjaW5jbHVkZSAiU2hhZG93Um9vdC5oIgorI2luY2x1ZGUgIlNoYWRvd1Zh
bHVlLmgiCisjaW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKKyNpbmNsdWRl
ICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiU3R5bGVCdWlsZGVyLmgiCisj
aW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIlN0eWxlR2VuZXJhdGVkSW1h
Z2UuaCIKKyNpbmNsdWRlICJTdHlsZVBlbmRpbmdJbWFnZS5oIgorI2luY2x1ZGUgIlN0eWxlUHJv
cGVydHlTZXQuaCIKKyNpbmNsdWRlICJTdHlsZVByb3BlcnR5U2hvcnRoYW5kLmgiCisjaW5jbHVk
ZSAiU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlSW1wb3J0LmgiCisjaW5jbHVkZSAi
U3R5bGVTaGVldENvbnRlbnRzLmgiCisjaW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIKKyNpbmNs
dWRlICJUZXh0LmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRl
ICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJVc2VyQWdlbnRTdHls
ZVNoZWV0cy5oIgorI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgorI2luY2x1ZGUg
IlZpc2l0ZWRMaW5rU3RhdGUuaCIKKyNpbmNsdWRlICJXZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0
aW9uLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVSdWxlLmgiCisjaW5jbHVkZSAiV2Vi
S2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1ZGUgIldlYktpdENTU1JlZ2lvblJ1bGUuaCIK
KyNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZS5oIgorI2luY2x1ZGUgIldlYktpdEZv
bnRGYW1pbHlOYW1lcy5oIgorI2luY2x1ZGUgIlhNTE5hbWVzLmgiCisjaW5jbHVkZSA8d3RmL01l
bW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1
bWVudGF0aW9uSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25W
ZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1Zl
Y3Rvci5oPgorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQorI2luY2x1ZGUgIkZpbHRlck9wZXJh
dGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0ZpbHRlclZhbHVlLmgiCisjZW5kaWYKKworI2lm
IEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKKyNpbmNsdWRlICJEYXNoYm9hcmRSZWdpb24uaCIK
KyNlbmRpZgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudC5o
IgorI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiU1ZH
RG9jdW1lbnQuaCIKKyNpbmNsdWRlICJTVkdFbGVtZW50LmgiCisjaW5jbHVkZSAiU1ZHTmFtZXMu
aCIKKyNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdE
b2N1bWVudFZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyNpbmNs
dWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRl
ckNvbnN0YW50cy5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlci5oIgor
I2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRl
clBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlci5o
IgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVDdXN0b21G
aWx0ZXJQcm9ncmFtLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5kaW5nU2hhZGVyLmgiCisjaW5jbHVk
ZSAiU3R5bGVTaGFkZXIuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlLmgi
CisjaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxF
KENTU19JTUFHRV9TRVQpCisjaW5jbHVkZSAiQ1NTSW1hZ2VTZXRWYWx1ZS5oIgorI2luY2x1ZGUg
IlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNL
KQorI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ug
c3RkOworCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgU2VxdWVuY2VNZW1v
cnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2ViQ29yZTo6UnVsZURhdGEqPiB7CisgICAg
dGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKEksIEks
IE1lbW9yeUNsYXNzSW5mbyYpIHsgfQorfTsKKworfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKyNkZWZpbmUgSEFORExFX0lOSEVSSVQocHJv
cCwgUHJvcCkgXAoraWYgKGlzSW5oZXJpdCkgeyBcCisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQj
I1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCisgICAgcmV0dXJuOyBcCit9
CisKKyNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwgUHJvcCkgXAorSEFO
RExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5pdGlhbCkgeyBcCisgICAgbV9zdGF0
ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1Byb3AoKSk7IFwKKyAg
ICByZXR1cm47IFwKK30KKworUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZ
ZXRBdmFpbGFibGU7CisKK3N0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xh
cmF0aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5
U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKKyAg
ICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCisgICAgICAgIGxlZnRUb1JpZ2h0RGVj
bC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlTHRyKTsKKyAgICBy
ZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOworfQorCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNl
dCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChS
ZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlT
ZXQ6OmNyZWF0ZSgpKSk7CisgICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQorICAg
ICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBD
U1NWYWx1ZVJ0bCk7CisgICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQoKTsKK30KKworCitp
bmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxl
TGlzdCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0KQorICAgICAgICBtX3J1bGVMaXN0ID0gU3Rh
dGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOwor
fQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNr
Z3JvdW5kKCkKK3sKKyAgICBtX2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFu
Y2UoKTsKKyAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2UpIHsKKyAgICAgICAgbV9ib3JkZXJEYXRh
ID0gbV9zdHlsZS0+Ym9yZGVyKCk7CisgICAgICAgIG1fYmFja2dyb3VuZERhdGEgPSAqbV9zdHls
ZS0+YmFja2dyb3VuZExheWVycygpOworICAgICAgICBtX2JhY2tncm91bmRDb2xvciA9IG1fc3R5
bGUtPmJhY2tncm91bmRDb2xvcigpOworICAgIH0KK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNv
bHZlcjo6U3RhdGU6OmNsZWFyKCkKK3sKKyAgICBtX2VsZW1lbnQgPSAwOworICAgIG1fc3R5bGVk
RWxlbWVudCA9IDA7CisgICAgbV9wYXJlbnRTdHlsZSA9IDA7CisgICAgbV9wYXJlbnROb2RlID0g
MDsKKyAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOworICAgIG1fcnVsZUxpc3QgPSAwOworICAg
IG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7CisgICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNs
ZWFyKCk7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIG1faGFzUGVuZGluZ1NoYWRlcnMg
PSBmYWxzZTsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykK
KyAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIoKTsKKyNlbmRpZgorfQorCitTdHlsZVJl
c29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBtYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMpCisgICAgOiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNT
aW5jZUxhc3RTd2VlcCgwKQorICAgICwgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
cih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKQorICAg
ICwgbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
KG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAsIG1fZm9udFNlbGVjdG9yKENTU0ZvbnRT
ZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFU
SU9OKQorICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIoVmlld3BvcnRTdHlsZVJlc29sdmVy
OjpjcmVhdGUoZG9jdW1lbnQpKQorI2VuZGlmCisgICAgLCBtX3N0eWxlQnVpbGRlcihTdHlsZUJ1
aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQorICAgICwgbV9zdHlsZU1hcCh0aGlzKQorewor
ICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBD
U1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0U3R5bGUocm9vdCk7CisKKyAgICAvLyBj
b25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRlZmF1bHQgc3R5bGUuIHRoaXMgaXMgbmVl
ZGVkCisgICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmllcyB0aGF0IGNvbnRhaW4gcmVsYXRp
dmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQgKG1heC13aWR0aDogMTBlbSkiCisgICAg
Ly8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3RydWN0b3IsIGJlY2F1c2Ugd2hlbiBjb25z
dHJ1Y3RvciBpcyBydW4sCisgICAgLy8gZG9jdW1lbnQgZG9lc24ndCBoYXZlIGRvY3VtZW50RWxl
bWVudAorICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0IGVsZW1lbnQgdGhhdCBnZXRzIHBh
c3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKKyAgICAvLyBpcyBhbHdheXMgZnJvbSB0aGUg
ZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxlY3RvcgorICAgIEZyYW1lVmlldyogdmll
dyA9IGRvY3VtZW50LT52aWV3KCk7CisgICAgaWYgKHZpZXcpCisgICAgICAgIG1fbWVkaXVtID0g
YWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmlldy0+bWVkaWFUeXBlKCkpKTsKKyAg
ICBlbHNlCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0
b3IoImFsbCIpKTsKKworICAgIGlmIChyb290KQorICAgICAgICBtX3Jvb3REZWZhdWx0U3R5bGUg
PSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxsb3dTdHlsZVNoYXJpbmcsIE1hdGNoT25s
eVVzZXJBZ2VudFJ1bGVzKTsKKworICAgIGlmIChtX3Jvb3REZWZhdWx0U3R5bGUgJiYgdmlldykK
KyAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3
LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9yb290RGVmYXVsdFN0eWxlLmdldCgpKSk7
CisKKyAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5bGUoKTsKKworICAgIERvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxl
U2hlZXRDb2xsZWN0aW9uKCk7CisgICAgbV9ydWxlU2V0cy5pbml0VXNlclN0eWxlKHN0eWxlU2hl
ZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsKKworI2lmIEVOQUJMRShTVkdfRk9OVFMp
CisgICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCkpIHsKKyAgICAgICAgY29uc3QgSGFz
aFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9udEZhY2VFbGVtZW50cyA9IGRvY3VtZW50
LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxlbWVudHMoKTsKKyAgICAgICAgSGFzaFNl
dDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc3ZnRm9udEZhY2VF
bGVtZW50cy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+
Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNlRWxlbWVudHMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KQorICAgICAgICAgICAgZm9udFNlbGVjdG9yKCktPmFkZEZvbnRGYWNlUnVsZSgo
Kml0KS0+Zm9udEZhY2VSdWxlKCkpOworICAgIH0KKyNlbmRpZgorCisgICAgYXBwZW5kQXV0aG9y
U3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rpb24tPmFjdGl2ZUF1dGhvclN0eWxlU2hl
ZXRzKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGVuZEF1dGhvclN0eWxlU2hlZXRz
KHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4m
IHN0eWxlU2hlZXRzKQoreworICAgIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMo
Zmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5nZXQoKSwgbV9pbnNwZWN0b3JDU1NPTVdy
YXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgdGhpcyk7CisgICAgaWYgKGRvY3Vt
ZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUoKSkKKyAg
ICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250
U2VsZWN0b3IoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIHZp
ZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7CisjZW5kaWYKK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJlbnQpCit7CisgICAgY29u
c3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9IHBhcmVudC0+cGFyZW50T3JTaGFkb3dI
b3N0RWxlbWVudCgpOworCisgICAgLy8gV2UgYXJlIG5vdCBhbHdheXMgaW52b2tlZCBjb25zaXN0
ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0aW9uIGNhbiBjYXVzZSB1cyB0byBlbnRl
cgorICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlkZGxlIG9mIHRyZWUgYnVpbGRpbmcuIFdl
IG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hlcmUgd2l0aGluIHRoZSB0cmVlLgorICAg
IC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2UsIG9yIGlmIHdlIHNlZSBhIG5ldyByb290
IGVsZW1lbnQuCisgICAgLy8gT3RoZXJ3aXNlIGp1c3QgcHVzaCB0aGUgbmV3IHBhcmVudC4KKyAg
ICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzRW1w
dHkoKSkKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5zZXR1cFBhcmVudFN0YWNrKHBhcmVudCk7
CisgICAgZWxzZQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnB1c2hQYXJlbnQocGFyZW50KTsK
KworICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBTaGFkb3dSb290IG5vZGVzIGZvciB0aGUg
c2NvcGUgc3RhY2suCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJl
c29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJlbnRPclNoYWRvd0hvc3ROb2RlKCkpOwor
fQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50
KQoreworICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0IGludm9rZWQgZm9yIHNvbWUgcmFuZG9t
IGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVyaW5nIHN0eWxlIHJlc29sdmUuCisgICAg
Ly8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGluIHRoaXMgY2FzZS4KKyAgICBpZiAobV9z
ZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChwYXJlbnQpKQorICAgICAgICBt
X3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOworICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisg
ICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVudCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkK
K3sKKyAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsKKyAgICBpZiAobV9zY29wZVJlc29s
dmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2goc2hhZG93Um9vdCwgc2hhZG93Um9v
dC0+aG9zdCgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRTaGFkb3dSb290
KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3Qt
Pmhvc3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29s
dmVyLT5wb3Aoc2hhZG93Um9vdCk7Cit9CisKKy8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxl
IHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0eWxlcwordm9pZCBTdHlsZVJlc29sdmVy
OjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQor
eworICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUoKSk7CisgICAgbV9rZXlmcmFtZXNSdWxl
TWFwLnNldChzLmltcGwoKSwgcnVsZSk7Cit9CisKK1N0eWxlUmVzb2x2ZXI6On5TdHlsZVJlc29s
dmVyKCkKK3sKKyAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xlYXJEb2N1bWVudCgpOworCisjaWYgRU5B
QkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+
Y2xlYXJEb2N1bWVudCgpOworI2VuZGlmCit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBN
YXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+KikKK3sKKyAgICAvLyBM
b29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRo
IGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdo
ZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24gY2F1c2VzIGl0IHRvIGdlbmVyYXRlIGEg
bmV3IGlubGluZVN0eWxlKCkKKyAgICAvLyBvciBwcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgp
LCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUgd2l0aCB0aGUgbGFzdCByZWYgb24gdGhl
IG9sZCBvbmUuCisgICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4gdG9SZW1vdmU7CisgICAgTWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUu
YmVnaW4oKTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBlbmQgPSBtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7CisgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+JiBtYXRjaGVkUHJvcGVydGllcyA9
IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1h
dGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhhc09uZVJlZigpKSB7CisgICAgICAgICAg
ICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZS5yZW1vdmUodG9SZW1vdmVbaV0pOworCisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRk
aXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1h
dGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9w
ZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hU
eXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAg
IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpICsgMSk7CisgICAgTWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRp
ZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7CisgICAgbmV3UHJvcGVy
dGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGll
cyk7CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKKyAg
ICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7Cisg
ICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKK30KKworaW5saW5lIHZv
aWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYg
cmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hl
YWJsZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0KQorICAgICAgICByZXR1cm47CisgICAgcmVz
dWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXpl
KCk7CisgICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQorICAgICAg
ICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhv
clJ1bGU7CisgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7Cisg
ICAgaWYgKCFpc0NhY2hlYWJsZSkKKyAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7
Cit9CisKK2NsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsKK3B1YmxpYzoKKyAgICBNYXRjaGlu
Z1VBUnVsZXNTY29wZSgpOworICAgIH5NYXRjaGluZ1VBUnVsZXNTY29wZSgpOworCisgICAgc3Rh
dGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9v
bCBtX21hdGNoaW5nVUFSdWxlczsKK307CisKK01hdGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGlu
Z1VBUnVsZXNTY29wZSgpCit7CisgICAgQVNTRVJUKCFtX21hdGNoaW5nVUFSdWxlcyk7CisgICAg
bV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOworfQorCitNYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1h
dGNoaW5nVUFSdWxlc1Njb3BlKCkKK3sKKyAgICBtX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwor
fQorCitpbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMo
KQoreworICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsKK30KKworYm9vbCBNYXRjaGluZ1VB
UnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKKwordm9pZCBTdHlsZVJlc29s
dmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVz
dCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgQVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxl
U2V0KTsKKyAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkpOworCisgICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpOworICAg
IGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50
KCk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1Bz
ZXVkb0lkKCk7CisgICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJU
KHN0eWxlZEVsZW1lbnQpOworICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0
Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBs
KCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgfQorCisjaWYgRU5BQkxFKFZJREVP
X1RSQUNLKQorICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSkKKyAgICAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9S
dWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisjZW5kaWYKKyAgICAvLyBDaGVjayB3
aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBsaWNhYmxlIGluIHRoZSBjdXJyZW50
IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgorICAgIC8vIGEpIGl0J3MgYSBVQSBydWxl
CisgICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1dGhvciBydWxlcworICAgIC8vIGMp
IHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2Ft
ZSB0cmVlIHNjb3BlCisgICAgVHJlZVNjb3BlKiB0cmVlU2NvcGUgPSBlbGVtZW50LT50cmVlU2Nv
cGUoKTsKKyAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygp
CisgICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkKKyAgICAgICAgJiYg
KCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAh
PSB0cmVlU2NvcGUpCisgICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkg
PT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0
YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKKyAgICAvLyB0aGVuIHNv
cnQgdGhlIGJ1ZmZlci4KKyAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSkKKyAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1l
bnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOworICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkp
IHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZWRFbGVtZW50LT5jbGFzc05h
bWVzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxp
c3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NO
YW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICB9CisKKyAg
ICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9y
TGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChTZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1
c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxp
c3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBt
YXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0
KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVs
ZVJhbmdlKQoreworICAgIGlmICghbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIHVuc2lnbmVkIHNpemUgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2Vs
ZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0
cy5hdChpKS5zZWxlY3RvcjsKKyAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9u
U2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmco
KS0+bm9kZSgpKSkpIHsKKyAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNl
dC5nZXQoKTsKKyAgICAgICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7CisgICAgICAgICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVz
dC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKKyAg
ICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJN
YXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOworICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0g
c3RhdGUubWF0Y2hlZFJ1bGVzKCk7CisgICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKKworICAgIGlmIChzdGF0
ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7ICsraSkKKyAgICAg
ICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxl
c1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIg
dG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCkg
JiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0cmlidXRlU2VsZWN0b3IoKSkK
KyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICBhZGRNYXRj
aGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVz
KCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5
cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7CisgICAgfQor
fQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyNpZiBFTkFCTEUoU1RZTEVf
U0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggc2NvcGVkIGF1dGhvciBydWxlcyBieSB0
cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAocmVidWlsZCBpdCBpZiBpdCBnb3Qg
aW5jb25zaXN0ZW50KS4KKyAgICBpZiAobV9zY29wZVJlc29sdmVyLT5oYXNTY29wZWRTdHlsZXMo
KSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29uc2lzdGVuY3kobV9zdGF0ZS5lbGVt
ZW50KCkpKSB7CisgICAgICAgIGJvb2wgYXBwbHlBdXRob3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1l
bnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVzKCk7CisgICAgICAgIGJvb2wgZG9j
dW1lbnRTY29wZSA9IHRydWU7CisgICAgICAgIHVuc2lnbmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVS
ZXNvbHZlci0+c3RhY2tTaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBz
Y29wZVNpemU7ICsraSkgeworICAgICAgICAgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVh
cigpOworICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgICAgICAgICBjb25zdCBTdHlsZVNj
b3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0Zy
YW1lQXQoaSk7CisgICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAh
ZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgICAgIGlmIChkb2N1bWVu
dFNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykKKyAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0
eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAgICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2Ug
PSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgICAgICAgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgICAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgICAg
ICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNl
bHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVF
bXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHls
ZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkKK3sKKyNpZiBFTkFCTEUoU0hBRE9X
X0RPTSkKKyAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7Cisj
ZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCit7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgQVNTRVJUKG1fc2NvcGVSZXNvbHZl
cik7CisKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgcmVzdWx0LnJh
bmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAx
OworCisgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7CisgICAgbV9zY29wZVJlc29s
dmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKKyAg
ICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9y
ICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgeworICAgICAg
ICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsK
KyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5h
dChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2Up
OworICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyNlbHNl
CisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0
eVJ1bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVs
ZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBt
X3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0
aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgaWYg
KCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggZ2xv
YmFsIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNl
dHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxl
UmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRj
aGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisjaWYgRU5BQkxFKFNIQURP
V19ET00pCisgICAgVmVjdG9yPE1hdGNoUmVxdWVzdD4gbWF0Y2hSZXF1ZXN0czsKKyAgICBtX3J1
bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5jb2xsZWN0TWF0Y2hSZXF1ZXN0cyhpbmNs
dWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtYXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
cyhtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOworI2VuZGlmCisKKyAgICBzb3J0QW5kVHJh
bnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKworICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMo
cmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0
Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykK
K3sKKyAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkpCisgICAgICAgIHJldHVybjsKKyAg
ICAKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisKKyAgICByZXN1bHQucmFu
Z2VzLmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwor
ICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaW5j
bHVkZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2Vz
LnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3Vs
dCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQoreworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xl
YXIoKTsKKyAgICAKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgPSByZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0
LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVx
dWVzdChydWxlcyksIHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVs
ZXMocmVzdWx0KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxl
c0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3sKKyAgICBpZiAoIXJ1bGVz
KQorICAgICAgICByZXR1cm47CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIC8v
IEluIHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZvciByYW5kb20g
ZWxlbWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29sdmUuCisgICAg
Ly8gQW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0
IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRoLgorICAgIGJvb2wgY2FuVXNlRmFz
dFJlamVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQoc3RhdGUu
cGFyZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVj
dG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnk7CisKKyAgICB1bnNpZ25lZCBzaXplID0g
cnVsZXMtPnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7
CisgICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChpKTsKKyAgICAg
ICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2Vs
ZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRh
bnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxlKCk7CisgICAgICAgIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b246OndpbGxNYXRjaFJ1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7CisgICAgICAgIFBzZXVk
b0lkIGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1
bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQc2V1ZG8sIG1hdGNoUmVxdWVzdC5i
ZWhhdmlvckF0Qm91bmRhcnkpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8g
cHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2Rl
LgorICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUt
PnByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmICghcHJvcGVydGllcyB8fCAocHJvcGVydGll
cy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMpKSB7CisgICAg
ICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2ll
LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICAvLyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NT
UnVsZXMgQVBJIHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVkZWQuCisgICAg
ICAgICAgICBpZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgpICYmICFydWxlRGF0YS5oYXNEb2N1
bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKKyAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIG1hdGNoaW5n
IG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgorICAgICAgICAgICAgLy8gd2UgcmVh
bGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50LgorICAgICAgICAgICAgaWYgKGR5bmFt
aWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRv
SWQgPT0gTk9QU0VVRE8pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUubW9kZSgpID09IFNl
bGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAgICAgICAgICAgICAgIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJTVF9JTlRFUk5BTF9QU0VVRE9JRCkKKyAgICAg
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SGFzUHNldWRvU3R5bGUoZHluYW1pY1Bz
ZXVkbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBv
dXIgZmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4gdGhlIG1hdGNoZWQgcnVsZXMgYXJyYXkuCisg
ICAgICAgICAgICAgICAgKytydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKKyAgICAgICAgICAgICAg
ICBpZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID09IC0xKQorICAgICAgICAgICAgICAgICAg
ICBydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKKwor
ICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBy
dWxlcy4KKyAgICAgICAgICAgICAgICBtX3N0YXRlLmFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7
CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUo
Y29va2llLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVs
ZShjb29raWUsIGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJl
UnVsZXMoY29uc3QgUnVsZURhdGEqIHIxLCBjb25zdCBSdWxlRGF0YSogcjIpCit7CisgICAgdW5z
aWduZWQgc3BlY2lmaWNpdHkxID0gcjEtPnNwZWNpZmljaXR5KCk7CisgICAgdW5zaWduZWQgc3Bl
Y2lmaWNpdHkyID0gcjItPnNwZWNpZmljaXR5KCk7CisgICAgcmV0dXJuIChzcGVjaWZpY2l0eTEg
PT0gc3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlvbigpIDwgcjItPnBvc2l0aW9uKCkgOiBzcGVj
aWZpY2l0eTEgPCBzcGVjaWZpY2l0eTI7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydE1h
dGNoZWRSdWxlcygpCit7CisgICAgc3RkOjpzb3J0KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVn
aW4oKSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKK30KKwor
dm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJv
b2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQoreworICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQpOwor
CisgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCisgICAgaWYgKG1fbWF0Y2hB
dXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaFVzZXJSdWxlcyhyZXN1bHQsIGZhbHNl
KTsKKworICAgIC8vIE5vdyBjaGVjayBhdXRob3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRo
IHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMgbWFwcGVkIGZyb20gSFRNTC4KKyAgICBpZiAobV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGll
cyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVT
dHlsZSgpKTsKKworICAgICAgICAvLyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBtYXBwZWQgZGVj
bGFyYXRpb25zLgorICAgICAgICAvLyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNoYXJlIGFuIGFk
ZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFwcGxpZWQKKyAgICAgICAgLy8gYWZ0
ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBlbmRzIG9uIHRo
ZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KKyAgICAgICAgYWRkRWxlbWVudFN0eWxl
UHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJl
c2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBdXRvOwor
ICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudCht
X3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmli
dXRlKGlzQXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRvKQorICAgICAgICAgICAgICAgIGFk
ZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9S
aWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOworICAgICAgICB9
CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzIG5l
eHQuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaEF1
dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworCisgICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUg
c3R5bGUgYXR0cmlidXRlLgorICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBt
X3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5l
U3R5bGUoKSkgeworICAgICAgICAvLyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxvbmcg
YXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KKyAgICAgICAgLy8gRklYTUU6IE1lZGlhIGNv
bnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcuCisg
ICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pc0luU2hhZG93VHJlZSgpOworICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCisgICAg
ICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7CisgICAgfQorCisj
aWYgRU5BQkxFKFNWRykKKyAgICAvLyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUg
c3R5bGUuCisgICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRp
ZXMocmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUg
Ki8pOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKKyNl
bmRpZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMo
Y29uc3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NOYW1lcykgY29uc3QKK3sKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAo
bV9ydWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzTmFtZXNb
aV0uaW1wbCgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0RWxlbWVu
dChFbGVtZW50KiBlKQoreworICAgIG1fZWxlbWVudCA9IGU7CisgICAgbV9zdHlsZWRFbGVtZW50
ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQq
PihlKSA6IDA7CisgICAgbV9lbGVtZW50TGlua1N0YXRlID0gZSA/IGUtPmRvY3VtZW50KCktPnZp
c2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUpIDogTm90SW5zaWRlTGluazsK
K30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkK
K3sKKyAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkgeworICAgICAgICBtX3N0YXRlLmlu
aXRFbGVtZW50KGUpOworICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3Vt
ZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25T
ZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5z
ZXRXcml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKKyAgICAgICAgfQorICAg
IH0KK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJl
c29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5k
ZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7CisgICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3Qg
PSBwc2V1ZG9TdHlsZVJlcXVlc3Q7CisgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9y
U3R5bGluZzsKKworICAgIGlmIChlKSB7CisgICAgICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNv
bnRleHQoZSk7CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJl
bmRlcmluZ0FuZFN0eWxlKCk7CisgICAgICAgIG1fcGFyZW50U3R5bGUgPSBjb250ZXh0LnJlc2V0
U3R5bGVJbmhlcml0YW5jZSgpID8gMCA6CisgICAgICAgICAgICBwYXJlbnRTdHlsZSA/IHBhcmVu
dFN0eWxlIDoKKyAgICAgICAgICAgIG1fcGFyZW50Tm9kZSA/IG1fcGFyZW50Tm9kZS0+cmVuZGVy
U3R5bGUoKSA6IDA7CisgICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gY29u
dGV4dC5pbnNlcnRpb25Qb2ludCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcGFyZW50Tm9k
ZSA9IDA7CisgICAgICAgIG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsKKyAgICAgICAgbV9k
aXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBOb2RlKiBk
b2NFbGVtZW50ID0gZSA/IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpIDogMDsKKyAg
ICBSZW5kZXJTdHlsZSogZG9jU3R5bGUgPSBkb2N1bWVudC0+cmVuZGVyU3R5bGUoKTsKKyAgICBt
X3Jvb3RFbGVtZW50U3R5bGUgPSBkb2NFbGVtZW50ICYmIGUgIT0gZG9jRWxlbWVudCA/IGRvY0Vs
ZW1lbnQtPnJlbmRlclN0eWxlKCkgOiBkb2NTdHlsZTsKKworICAgIG1fc3R5bGUgPSAwOworICAg
IG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOworICAgIG1fcnVsZUxpc3QgPSAwOwor
ICAgIG1fZm9udERpcnR5ID0gZmFsc2U7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5
bGVTZWFyY2hUaHJlc2hvbGQgPSAxMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFy
Y2hMZXZlbFRocmVzaG9sZCA9IDEwOworCitzdGF0aWMgaW5saW5lIGJvb2wgcGFyZW50RWxlbWVu
dFByZXZlbnRzU2hhcmluZyhjb25zdCBFbGVtZW50KiBwYXJlbnRFbGVtZW50KQoreworICAgIGlm
ICghcGFyZW50RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBwYXJl
bnRFbGVtZW50LT5oYXNGbGFnc1NldER1cmluZ1N0eWxpbmdPZkNoaWxkcmVuKCk7Cit9CisKK05v
ZGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNp
Z25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3QKK3sKKyAgICBpZiAodmlzaXRlZE5vZGVDb3Vu
dCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgKiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+aXNTdHlsZWRF
bGVtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwYXJlbnQtPmhhc1Njb3BlZEhU
TUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIFN0eWxlZEVsZW1lbnQqIHAg
PSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4ocGFyZW50KTsKKyAgICBpZiAocC0+aW5saW5l
U3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAocC0+
aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHApLT5hbmltYXRlZFNN
SUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICBpZiAo
cC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhw
LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gcC0+cmVuZGVyU3R5bGUoKTsKKyAgICB1bnNp
Z25lZCBzdWJjb3VudCA9IDA7CisgICAgTm9kZSogdGhpc0NvdXNpbiA9IHA7CisgICAgTm9kZSog
Y3VycmVudE5vZGUgPSBwLT5wcmV2aW91c1NpYmxpbmcoKTsKKworICAgIC8vIFJlc2VydmUgdGhl
IHRyaWVzIGZvciB0aGlzIGxldmVsLiBUaGlzIGVmZmVjdGl2ZWx5IG1ha2VzIHN1cmUgdGhhdCB0
aGUgYWxnb3JpdGhtCisgICAgLy8gd2lsbCBuZXZlciBnbyBkZWVwZXIgdGhhbiBjU3R5bGVTZWFy
Y2hMZXZlbFRocmVzaG9sZCBsZXZlbHMgaW50byByZWN1cnNpb24uCisgICAgdmlzaXRlZE5vZGVD
b3VudCArPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQ7CisgICAgd2hpbGUgKHRoaXNDb3VzaW4pIHsK
KyAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7CisgICAgICAgICAgICArK3N1YmNvdW50Owor
ICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLT5yZW5kZXJTdHlsZSgpID09IHBhcmVudFN0eWxl
ICYmIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKQorICAgICAgICAgICAgICAgICYmIGN1cnJlbnRO
b2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgIXBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcodG9F
bGVtZW50KGN1cnJlbnROb2RlKSkKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICAgICAgICAg
ICAgICAmJiAhdG9FbGVtZW50KGN1cnJlbnROb2RlKS0+c2hhZG93KCkKKyNlbmRpZgorICAgICAg
ICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdW51c2VkIHJlc2Vy
dmVkIHRyaWVzLgorICAgICAgICAgICAgICAgIHZpc2l0ZWROb2RlQ291bnQgLT0gY1N0eWxlU2Vh
cmNoVGhyZXNob2xkIC0gc3ViY291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRO
b2RlLT5sYXN0Q2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWJjb3Vu
dCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsK
KyAgICAgICAgfQorICAgICAgICBjdXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0Nv
dXNpbi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKKyAgICAgICAgdGhpc0Nv
dXNpbiA9IGN1cnJlbnROb2RlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitib29sIFN0
eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQq
IHJ1bGVTZXQpCit7CisgICAgaWYgKCFydWxlU2V0KQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworCisgICAgbV9zdGF0ZS5zZXRNb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKKyAgICBpbnQgZmlyc3RSdWxlSW5kZXgg
PSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RS
dWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNo
UmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKKyAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0
b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVz
KCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2
ZXI6OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25z
dAoreworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgSFRNTElucHV0RWxl
bWVudCogdGhpc0lucHV0RWxlbWVudCA9IGVsZW1lbnQtPnRvSW5wdXRFbGVtZW50KCk7CisgICAg
SFRNTElucHV0RWxlbWVudCogb3RoZXJJbnB1dEVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCktPnRv
SW5wdXRFbGVtZW50KCk7CisKKyAgICBpZiAoIXRoaXNJbnB1dEVsZW1lbnQgfHwgIW90aGVySW5w
dXRFbGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAodGhpc0lucHV0RWxl
bWVudC0+ZWxlbWVudERhdGEoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSkg
eworICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZSh0eXBlQXR0
cikgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFz
dEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0
QXR0cmlidXRlKHJlYWRvbmx5QXR0cikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorCisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzQXV0b2ZpbGxlZCgpICE9IG90aGVySW5w
dXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
ICh0aGlzSW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkgIT0gb3RoZXJJbnB1dEVs
ZW1lbnQtPnNob3VsZEFwcGVhckNoZWNrZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5hdGUoKSAhPSBvdGhlcklucHV0RWxl
bWVudC0+aXNJbmRldGVybWluYXRlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAo
dGhpc0lucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc1Jl
cXVpcmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc0Vu
YWJsZWRGb3JtQ29udHJvbCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNFbmFibGVkRm9ybUNvbnRy
b2woKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzRGVmYXVs
dEJ1dHRvbkZvckZvcm0oKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRGVmYXVsdEJ1dHRvbkZvckZv
cm0oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0YXRlLmRvY3VtZW50KCkt
PmNvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKCkpIHsKKyAgICAgICAgYm9vbCB3aWxsVmFsaWRh
dGUgPSBlbGVtZW50LT53aWxsVmFsaWRhdGUoKTsKKworICAgICAgICBpZiAod2lsbFZhbGlkYXRl
ICE9IHN0YXRlLmVsZW1lbnQoKS0+d2lsbFZhbGlkYXRlKCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZv
cm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNWYWxpZEZvcm1Db250cm9s
RWxlbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZWxl
bWVudC0+aXNJblJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0luUmFuZ2UoKSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZWxlbWVudC0+aXNPdXRPZlJhbmdl
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBi
b29sIGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8g
RklYTUU6IFRoaXMgbGluZSBpcyBzdXJwcmlzaW5nbHkgaG90LCB3ZSBtYXkgd2lzaCB0byBpbmxp
bmUgaGFzRGlyZWN0aW9uQXV0byBpbnRvIFN0eWxlUmVzb2x2ZXIuCisgICAgcmV0dXJuIGVsZW1l
bnQtPmlzSFRNTEVsZW1lbnQoKSAmJiB0b0hUTUxFbGVtZW50KGVsZW1lbnQpLT5oYXNEaXJlY3Rp
b25BdXRvKCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6c2hhcmluZ0NhbmRpZGF0ZUhhc0lk
ZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KiBzaGFyaW5nQ2Fu
ZGlkYXRlKSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAg
aWYgKHN0YXRlLmVsZW1lbnQoKS0+ZWxlbWVudERhdGEoKSA9PSBzaGFyaW5nQ2FuZGlkYXRlLT5l
bGVtZW50RGF0YSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoc3RhdGUuZWxlbWVu
dCgpLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRp
ZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5n
QXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghc3RhdGUuZWxlbWVudEFmZmVjdGVkQnlD
bGFzc1J1bGVzKCkpIHsKKyAgICAgICAgaWYgKHNoYXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkg
JiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzaGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVz
KCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc2hhcmluZ0Nh
bmRpZGF0ZS0+aGFzQ2xhc3MoKSkgeworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIC8vIFNWRyBl
bGVtZW50cyByZXF1aXJlIGEgKHNsb3chKSBnZXRBdHRyaWJ1dGUgY29tcGFyaXNpb24gYmVjYXVz
ZSAiY2xhc3MiIGlzIGFuIGFuaW1hdGFibGUgYXR0cmlidXRlIGZvciBTVkcuCisgICAgICAgIGlm
IChzdGF0ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoc3Rh
dGUuZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRl
LT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50
KCktPmNsYXNzTmFtZXMoKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIH0KKyNl
bmRpZgorICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHNoYXJpbmdD
YW5kaWRhdGUtPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQorICAgIGlmIChzdGF0ZS5lbGVt
ZW50KCktPmhhc1RhZ05hbWUocHJvZ3Jlc3NUYWcpKSB7CisgICAgICAgIGlmIChzdGF0aWNfY2Fz
dDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc3RhdGUuZWxlbWVudCgpKS0+aXNEZXRlcm1pbmF0ZSgp
ICE9IHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihzaGFyaW5nQ2FuZGlkYXRlKS0+
aXNEZXRlcm1pbmF0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRp
ZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVT
dHlsZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgUmVu
ZGVyU3R5bGUqIHN0eWxlID0gZWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKKyAgICBjb25zdCBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoc3R5bGUtPmhhc1VuaXF1ZVBzZXVkb1N0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoZWxlbWVudC0+dGFnUU5hbWUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPnRhZ1FO
YW1lKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+aW5saW5lU3R5
bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5uZWVkc1N0eWxl
UmVjYWxjKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlm
IChlbGVtZW50LT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oZWxl
bWVudCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisjZW5kaWYKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgIT0gc3RhdGUuZWxlbWVudCgp
LT5pc0xpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5ob3Zl
cmVkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5ob3ZlcmVkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoZWxlbWVudC0+YWN0aXZlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5hY3RpdmUo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5mb2N1c2VkKCkgIT0g
c3RhdGUuZWxlbWVudCgpLT5mb2N1c2VkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPnNoYWRvd1Bz
ZXVkb0lkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudCA9PSBlbGVt
ZW50LT5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmICghc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRl
cyhlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5hZGRp
dGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1
cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigp
LmltcGwoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+aGFzU2Nv
cGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklY
TUU6IFdlIHNob3VsZCBzaGFyZSBzdHlsZSBmb3Igb3B0aW9uIGFuZCBvcHRncm91cCB3aGVuZXZl
ciBwb3NzaWJsZS4KKyAgICAvLyBCZWZvcmUgZG9pbmcgc28sIHdlIG5lZWQgdG8gcmVzb2x2ZSBp
c3N1ZXMgaW4gSFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcworICAgIC8vIGFuZCBS
ZW5kZXJNZW51TGlzdDo6c2V0VGV4dC4gU2VlIGFsc28gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTg4NDA1CisgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0aW9u
VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgYm9vbCBpc0NvbnRyb2wgPSBlbGVtZW50LT5pc0Zvcm1Db250cm9sRWxl
bWVudCgpOworCisgICAgaWYgKGlzQ29udHJvbCAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRm9ybUNv
bnRyb2xFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpc0NvbnRy
b2wgJiYgIWNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChlbGVtZW50KSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKHN0eWxlLT50cmFuc2l0aW9ucygpIHx8IHN0eWxlLT5hbmltYXRp
b25zKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKyAgICAvLyBUdXJuIG9mZiBzdHlsZSBzaGFyaW5nIGZvciBlbGVtZW50cyB0aGF0
IGNhbiBnYWluIGxheWVycyBmb3IgcmVhc29ucyBvdXRzaWRlIG9mIHRoZSBzdHlsZSBzeXN0ZW0u
CisgICAgLy8gU2VlIGNvbW1lbnRzIGluIFJlbmRlck9iamVjdDo6c2V0U3R5bGUoKS4KKyAgICBp
ZiAoZWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUo
ZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpIHx8IGVsZW1lbnQtPmhh
c1RhZ05hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGFwcGxldFRhZykgfHwg
ZWxlbWVudC0+aGFzVGFnTmFtZShjYW52YXNUYWcpCisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9G
T1JfVklERU8pCisgICAgICAgIC8vIFdpdGggcHJveHlpbmcsIHRoZSBtZWRpYSBlbGVtZW50cyBh
cmUgYmFja2VkIGJ5IGEgUmVuZGVyRW1iZWRkZWRPYmplY3QuCisgICAgICAgIHx8IGVsZW1lbnQt
Pmhhc1RhZ05hbWUodmlkZW9UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXVkaW9UYWcpCisj
ZW5kaWYKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICAgIGlm
IChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICYmIHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUo
KSAhPSBzdHlsZS0+aW5zaWRlTGluaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBF
TkFCTEUoVklERU9fVFJBQ0spCisgICAgLy8gRGVueSBzaGFyaW5nIHN0eWxlcyBiZXR3ZWVuIFdl
YlZUVCBhbmQgbm9uLVdlYlZUVCBub2Rlcy4KKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVt
ZW50KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICYmIHN0YXRl
LmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkgJiYgdG9XZWJWVFRFbGVtZW50KGVsZW1lbnQp
LT5pc1Bhc3ROb2RlKCkgIT0gdG9XZWJWVFRFbGVtZW50KHN0YXRlLmVsZW1lbnQoKSktPmlzUGFz
dE5vZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyNpZiBFTkFCTEUoRlVM
TFNDUkVFTl9BUEkpCisgICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+d2Vi
a2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkgfHwgc3RhdGUuZWxlbWVudCgpID09IHN0YXRl
LmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIFN0eWxl
ZEVsZW1lbnQqIFN0eWxlUmVzb2x2ZXI6OmZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKE5vZGUq
IG5vZGUsIHVuc2lnbmVkJiBjb3VudCkgY29uc3QKK3sKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9
IG5vZGUtPnByZXZpb3VzU2libGluZygpKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRF
bGVtZW50KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNhblNoYXJlU3R5
bGVXaXRoRWxlbWVudChzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSkpKQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjb3VudCsrID09IGNTdHlsZVNlYXJjaFRocmVzaG9s
ZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
U3R5bGVkRWxlbWVudCo+KG5vZGUpOworfQorCitSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6
bG9jYXRlU2hhcmVkU3R5bGUoKQoreworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAg
aWYgKCFzdGF0ZS5zdHlsZWRFbGVtZW50KCkgfHwgIXN0YXRlLnBhcmVudFN0eWxlKCkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGlubGluZSBzdHlsZSBp
dCBpcyBwcm9iYWJseSB1bmlxdWUuCisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5s
aW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAo
c3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdF
bGVtZW50Kj4oc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0
aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgLy8gSWRzIHN0b3Agc3R5bGUg
c2hhcmluZyBpZiB0aGV5IHNob3cgdXAgaW4gdGhlIHN0eWxlc2hlZXRzLgorICAgIGlmIChzdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0lu
UnVsZXMuY29udGFpbnMoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pZEZvclN0eWxlUmVzb2x1dGlv
bigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwYXJlbnRFbGVtZW50UHJl
dmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzU2NvcGVkSFRNTFN0
eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKSA9
PSBzdGF0ZS5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
aWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKHN0YXRlLmVsZW1lbnQoKSkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgLy8gQ2FjaGUgd2hldGhlciBzdGF0ZS5lbGVtZW50IGlzIGFmZmVjdGVk
IGJ5IGFueSBrbm93biBjbGFzcyBzZWxlY3RvcnMuCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxk
bid0IGJlIGEgbWVtYmVyIHZhcmlhYmxlLiBUaGUgc3R5bGUgc2hhcmluZyBjb2RlIGNvdWxkIGJl
IGZhY3RvcmVkIG91dCBvZiBTdHlsZVJlc29sdmVyLgorICAgIHN0YXRlLnNldEVsZW1lbnRBZmZl
Y3RlZEJ5Q2xhc3NSdWxlcyhzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5oYXND
bGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc3RhdGUuZWxlbWVudCgpLT5jbGFz
c05hbWVzKCkpKTsKKworICAgIC8vIENoZWNrIHByZXZpb3VzIHNpYmxpbmdzIGFuZCB0aGVpciBj
b3VzaW5zLgorICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgICB1bnNpZ25lZCB2aXNpdGVkTm9k
ZUNvdW50ID0gMDsKKyAgICBTdHlsZWRFbGVtZW50KiBzaGFyZUVsZW1lbnQgPSAwOworICAgIE5v
ZGUqIGNvdXNpbkxpc3QgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXZpb3VzU2libGluZygp
OworICAgIHdoaWxlIChjb3VzaW5MaXN0KSB7CisgICAgICAgIHNoYXJlRWxlbWVudCA9IGZpbmRT
aWJsaW5nRm9yU3R5bGVTaGFyaW5nKGNvdXNpbkxpc3QsIGNvdW50KTsKKyAgICAgICAgaWYgKHNo
YXJlRWxlbWVudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjb3VzaW5MaXN0ID0gbG9j
YXRlQ291c2luTGlzdChjb3VzaW5MaXN0LT5wYXJlbnRFbGVtZW50KCksIHZpc2l0ZWROb2RlQ291
bnQpOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZXhoYXVzdGVkIGFsbCBvdXIgYnVkZ2V0
IG9yIG91ciBjb3VzaW5zLgorICAgIGlmICghc2hhcmVFbGVtZW50KQorICAgICAgICByZXR1cm4g
MDsKKworICAgIC8vIENhbid0IHNoYXJlIGlmIHNpYmxpbmcgcnVsZXMgYXBwbHkuIFRoaXMgaXMg
Y2hlY2tlZCBhdCB0aGUgZW5kIGFzIGl0IHNob3VsZCByYXJlbHkgZmFpbC4KKyAgICBpZiAoc3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy5zaWJsaW5nKCkpKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBDYW4ndCBzaGFyZSBpZiBhdHRyaWJ1dGUgcnVsZXMg
YXBwbHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVs
ZVNldHMudW5jb21tb25BdHRyaWJ1dGUoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIENh
bid0IHNoYXJlIGlmIEBob3N0IEAtcnVsZXMgYXBwbHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0Nh
bmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gVHJh
Y2tpbmcgY2hpbGQgaW5kZXggcmVxdWlyZXMgdW5pcXVlIHN0eWxlIGZvciBlYWNoIG5vZGUuIFRo
aXMgbWF5IGdldCBzZXQgYnkgdGhlIHNpYmxpbmcgcnVsZSBtYXRjaCBhYm92ZS4KKyAgICBpZiAo
cGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1l
bnQoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzaGFyZUVsZW1lbnQtPnJlbmRl
clN0eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQpCit7CisgICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7CisKKyAgICAv
LyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlm
IChDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQorICAgICAg
ICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICBSdWxlU2V0KiB1c2VyQWdlbnRTdHls
ZVNoZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3BlY2lmaWMoInByaW50IikKKyAgICAg
ICAgPyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVs
dFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7CisgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgdXNl
ckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgbWF0Y2ggcnVs
ZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYgKGRvY3VtZW50KCkt
PmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0
U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7CisKKyAgICAvLyBJZiBkb2N1bWVudCB1
c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBpbiB4bWwgdmll
d2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291cmNlIHN0eWxl
IHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKKyAgICAgICAgbWF0
Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUo
KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFBhZ2luYXRp
b246Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBpZiAo
cGFnaW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpCisgICAgICAgIHJldHVy
bjsKKyAgICAgICAgCisgICAgc3dpdGNoIChwYWdpbmF0aW9uTW9kZSkgeworICAgIGNhc2UgUGFn
aW5hdGlvbjo6TGVmdFRvUmlnaHRQYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5B
eGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250
YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9u
KHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lv
biA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGlu
Z01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNz
aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpSaWdodFRvTGVmdFBh
Z2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4
aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAg
ICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHRE
aXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dy
ZXNzaW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dy
ZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1u
UHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFBhZ2luYXRpb246OlRvcFRvQm90dG9tUGFnaW5hdGVkOgorICAgICAgICBzdHls
ZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUt
PmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1u
UHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNl
Q29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0
VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29s
dW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OkJv
dHRvbVRvVG9wUGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNh
bENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
KCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxp
cHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVy
c2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2
ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlVucGFnaW5hdGVkOgorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9p
ZCBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIEZv
bnRPcmllbnRhdGlvbiYgZm9udE9yaWVudGF0aW9uLCBOb25DSktHbHlwaE9yaWVudGF0aW9uJiBn
bHlwaE9yaWVudGF0aW9uKQoreworICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKSkgeworICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOworICAgICAgICBn
bHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0eWxlLT50ZXh0T3JpZW50YXRp
b24oKSkgeworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVmVydGljYWxSaWdodDoKKyAgICAgICAg
Zm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBO
b25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgcmV0dXJuOworICAg
IGNhc2UgVGV4dE9yaWVudGF0aW9uVXByaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0g
VmVydGljYWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0
aW9uVXByaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lk
ZXdheXM6CisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSA9PSBMZWZ0VG9SaWdodFdy
aXRpbmdNb2RlKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbWFwIHRvIHNp
ZGV3YXlzLWxlZnQsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorICAgICAgICAgICAgZm9u
dE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0g
Tm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAg
ICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0
OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5c1JpZ2h0
OgorICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOworICAgICAgICBnbHlwaE9y
aWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAg
IHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRh
dGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1
cm47CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpz
dHlsZUZvckRvY3VtZW50KERvY3VtZW50KiBkb2N1bWVudCwgQ1NTRm9udFNlbGVjdG9yKiBmb250
U2VsZWN0b3IpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisKKyAg
ICAvLyBIVE1MNSBzdGF0ZXMgdGhhdCBzZWFtbGVzcyBpZnJhbWVzIHNob3VsZCByZXBsYWNlIGRl
ZmF1bHQgQ1NTIHZhbHVlcworICAgIC8vIHdpdGggdmFsdWVzIGluaGVyaXRlZCBmcm9tIHRoZSBj
b250YWluaW5nIGlmcmFtZSBlbGVtZW50LiBIb3dldmVyLAorICAgIC8vIHNvbWUgdmFsdWVzIChz
dWNoIGFzIHRoZSBjYXNlIG9mIGRlc2lnbk1vZGUgPSAib24iKSBzdGlsbCBuZWVkIHRvCisgICAg
Ly8gYmUgc2V0IGJ5IHRoaXMgImRvY3VtZW50IHN0eWxlIi4KKyAgICBSZWZQdHI8UmVuZGVyU3R5
bGU+IGRvY3VtZW50U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7CisgICAgYm9vbCBzZWFt
bGVzc1dpdGhQYXJlbnQgPSBkb2N1bWVudC0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFy
ZW50KCk7CisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkgeworICAgICAgICBSZW5kZXJTdHls
ZSogaWZyYW1lU3R5bGUgPSBkb2N1bWVudC0+c2VhbWxlc3NQYXJlbnRJRnJhbWUoKS0+cmVuZGVy
U3R5bGUoKTsKKyAgICAgICAgaWYgKGlmcmFtZVN0eWxlKQorICAgICAgICAgICAgZG9jdW1lbnRT
dHlsZS0+aW5oZXJpdEZyb20oaWZyYW1lU3R5bGUpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBJ
dCdzIG5vdCBjbGVhciB3aGljaCB2YWx1ZXMgYmVsb3cgd2Ugd2FudCB0byBvdmVycmlkZSBpbiB0
aGUgc2VhbWxlc3MgY2FzZSEKKyAgICBkb2N1bWVudFN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsK
KyAgICBpZiAoIXNlYW1sZXNzV2l0aFBhcmVudCkgeworICAgICAgICBkb2N1bWVudFN0eWxlLT5z
ZXRSVExPcmRlcmluZyhkb2N1bWVudC0+dmlzdWFsbHlPcmRlcmVkKCkgPyBWaXN1YWxPcmRlciA6
IExvZ2ljYWxPcmRlcik7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFpvb20oZnJhbWUgJiYg
IWRvY3VtZW50LT5wcmludGluZygpID8gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCkgOiAxKTsKKyAg
ICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UGFnZVNjYWxlVHJhbnNmb3JtKGZyYW1lID8gZnJhbWUt
PmZyYW1lU2NhbGVGYWN0b3IoKSA6IDEpOworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRMb2Nh
bGUoZG9jdW1lbnQtPmNvbnRlbnRMYW5ndWFnZSgpKTsKKyAgICB9CisgICAgLy8gVGhpcyBvdmVy
cmlkZXMgYW55IC13ZWJraXQtdXNlci1tb2RpZnkgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBp
ZnJhbWUuCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0VXNlck1vZGlmeShkb2N1bWVudC0+aW5EZXNp
Z25Nb2RlKCkgPyBSRUFEX1dSSVRFIDogUkVBRF9PTkxZKTsKKworICAgIEVsZW1lbnQqIGRvY0Vs
ZW1lbnQgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7CisgICAgUmVuZGVyT2JqZWN0KiBk
b2NFbGVtZW50UmVuZGVyZXIgPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVyZXIoKSA6
IDA7CisgICAgaWYgKGRvY0VsZW1lbnRSZW5kZXJlcikgeworICAgICAgICAvLyBVc2UgdGhlIGRp
cmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIG9mIHRoZSBib2R5IHRvIHNldCB0aGUKKyAgICAgICAg
Ly8gdmlld3BvcnQncyBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSB1bmxlc3MgdGhlIHByb3Bl
cnR5IGlzIHNldCBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KKyAgICAgICAgLy8gSWYgdGhlcmUg
aXMgbm8gYm9keSwgdGhlbiB1c2UgdGhlIGRvY3VtZW50IGVsZW1lbnQuCisgICAgICAgIFJlbmRl
ck9iamVjdCogYm9keVJlbmRlcmVyID0gZG9jdW1lbnQtPmJvZHkoKSA/IGRvY3VtZW50LT5ib2R5
KCktPnJlbmRlcmVyKCkgOiAwOworICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVu
dC0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgZG9jdW1l
bnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoYm9keVJlbmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9k
ZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGlu
Z01vZGUoZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAg
ICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPmRpcmVjdGlvblNldE9uRG9jdW1lbnRF
bGVtZW50KCkpCisgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oYm9keVJl
bmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCkt
PmRpcmVjdGlvbigpKTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKSkgeworICAgICAgICAgICAgY29uc3Qg
UGFnaW5hdGlvbiYgcGFnaW5hdGlvbiA9IGZyYW1lVmlldy0+cGFnaW5hdGlvbigpOworICAgICAg
ICAgICAgaWYgKHBhZ2luYXRpb24ubW9kZSAhPSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkgewor
ICAgICAgICAgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb24ubW9k
ZSwgZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+
c2V0Q29sdW1uR2FwKHBhZ2luYXRpb24uZ2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoUmVuZGVy
VmlldyogdmlldyA9IGRvY3VtZW50LT5yZW5kZXJWaWV3KCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKHZpZXctPmhhc0NvbHVtbnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXct
PnVwZGF0ZUNvbHVtbkluZm9Gcm9tU3R5bGUoZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2Vh
bWxlc3MgaWZyYW1lcyB3YW50IHRvIGluaGVyaXQgdGhlaXIgZm9udCBmcm9tIHRoZWlyIHBhcmVu
dCBpZnJhbWUsIHNvIGVhcmx5IHJldHVybiBiZWZvcmUgc2V0dGluZyB0aGUgZm9udC4KKyAgICBp
ZiAoc2VhbWxlc3NXaXRoUGFyZW50KQorICAgICAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxl
YXNlKCk7CisKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihk
b2N1bWVudFN0eWxlLT5sb2NhbGUoKSkpOworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBk
b2N1bWVudC0+c2V0dGluZ3MoKSkgeworICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJp
bnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vi
c3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmlu
Z01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOworICAgICAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIHN0YW5kYXJkRm9udCA9IHNldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoZm9u
dERlc2NyaXB0aW9uLnNjcmlwdCgpKTsKKyAgICAgICAgaWYgKCFzdGFuZGFyZEZvbnQuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250
RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnQpOworICAgICAgICAgICAgZm9u
dERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5KDApOworICAgICAgICB9Cisg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAtIENT
U1ZhbHVlWHhTbWFsbCArIDEpOworICAgICAgICBpbnQgc2l6ZSA9IFN0eWxlUmVzb2x2ZXI6OmZv
bnRTaXplRm9yS2V5d29yZChkb2N1bWVudCwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKTsKKyAgICAg
ICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7CisgICAgICAgIGJvb2wg
dXNlU1ZHWm9vbVJ1bGVzID0gZG9jdW1lbnQtPmlzU1ZHRG9jdW1lbnQoKTsKKyAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNp
emVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udERl
c2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcykpOworICAg
IH0gZWxzZQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1l
bnQtPnByaW50aW5nKCkpOworCisgICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsK
KyAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247CisgICAgZ2V0Rm9u
dEFuZEdseXBoT3JpZW50YXRpb24oZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udE9yaWVudGF0aW9u
LCBnbHlwaE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRpb24o
Zm9udE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmll
bnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKKworICAgIGRvY3VtZW50U3R5bGUtPnNldEZvbnRE
ZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIGRvY3VtZW50U3R5bGUtPmZvbnQoKS51
cGRhdGUoZm9udFNlbGVjdG9yKTsKKworICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2Uo
KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzQXRTaGFkb3dCb3VuZGFyeShjb25zdCBFbGVt
ZW50KiBlbGVtZW50KQoreworICAgIGlmICghZWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUgPSBlbGVtZW50LT5wYXJlbnROb2RlKCk7
CisgICAgcmV0dXJuIHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS0+aXNTaGFkb3dSb290KCk7Cit9
CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVu
dChFbGVtZW50KiBlbGVtZW50LCBSZW5kZXJTdHlsZSogZGVmYXVsdFBhcmVudCwKKyAgICBTdHls
ZVNoYXJpbmdCZWhhdmlvciBzaGFyaW5nQmVoYXZpb3IsIFJ1bGVNYXRjaGluZ0JlaGF2aW9yIG1h
dGNoaW5nQmVoYXZpb3IsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKK3sKKyAgICAv
LyBPbmNlIGFuIGVsZW1lbnQgaGFzIGEgcmVuZGVyZXIsIHdlIGRvbid0IHRyeSB0byBkZXN0cm95
IGl0LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlbmRlcmVyCisgICAgLy8gd2lsbCB2YW5pc2ggaWYg
YSBzdHlsZSByZWNhbGMgaGFwcGVucyBkdXJpbmcgbG9hZGluZy4KKyAgICBpZiAoc2hhcmluZ0Jl
aGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFlbGVtZW50LT5kb2N1bWVudCgpLT5oYXZl
U3R5bGVzaGVldHNMb2FkZWQoKSAmJiAhZWxlbWVudC0+cmVuZGVyZXIoKSkgeworICAgICAgICBp
ZiAoIXNfc3R5bGVOb3RZZXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRB
dmFpbGFibGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCkubGVha1JlZigpOworICAgICAgICAgICAg
c19zdHlsZU5vdFlldEF2YWlsYWJsZS0+c2V0RGlzcGxheShOT05FKTsKKyAgICAgICAgICAgIHNf
c3R5bGVOb3RZZXRBdmFpbGFibGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOworICAg
ICAgICB9CisgICAgICAgIGVsZW1lbnQtPmRvY3VtZW50KCktPnNldEhhc05vZGVzV2l0aFBsYWNl
aG9sZGVyU3R5bGUoKTsKKyAgICAgICAgcmV0dXJuIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Cisg
ICAgfQorCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpbml0RWxlbWVudChlbGVt
ZW50KTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGVsZW1lbnQs
IGRlZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JTdHlsaW5nKTsKKyAgICBpZiAoc2hh
cmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFzdGF0ZS5kaXN0cmlidXRlZFRv
SW5zZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBSZW5kZXJTdHlsZSogc2hhcmVkU3R5bGUgPSBs
b2NhdGVTaGFyZWRTdHlsZSgpOworICAgICAgICBpZiAoc2hhcmVkU3R5bGUpCisgICAgICAgICAg
ICByZXR1cm4gc2hhcmVkU3R5bGU7CisgICAgfQorCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBj
bG9uZUZvclBhcmVudDsKKworICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpKSB7CisgICAgICAg
IHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgICAgIHN0YXRlLnN0
eWxlKCktPmluaGVyaXRGcm9tKHN0YXRlLnBhcmVudFN0eWxlKCksIGlzQXRTaGFkb3dCb3VuZGFy
eShlbGVtZW50KSA/IFJlbmRlclN0eWxlOjpBdFNoYWRvd0JvdW5kYXJ5IDogUmVuZGVyU3R5bGU6
Ok5vdEF0U2hhZG93Qm91bmRhcnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRlLnNldFN0
eWxlKGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSk7CisgICAgICAgIGNsb25lRm9yUGFyZW50ID0g
UmVuZGVyU3R5bGU6OmNsb25lKHN0YXRlLnN0eWxlKCkpOworICAgICAgICBzdGF0ZS5zZXRQYXJl
bnRTdHlsZShjbG9uZUZvclBhcmVudC5nZXQoKSk7CisgICAgfQorICAgIC8vIGNvbnRlbnRlZGl0
YWJsZSBhdHRyaWJ1dGUgKGltcGxlbWVudGVkIGJ5IC13ZWJraXQtdXNlci1tb2RpZnkpIHNob3Vs
ZAorICAgIC8vIGJlIHByb3BhZ2F0ZWQgZnJvbSBzaGFkb3cgaG9zdCB0byBkaXN0cmlidXRlZCBu
b2RlLgorICAgIGlmIChzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgeworICAg
ICAgICBpZiAoRWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+cGFyZW50RWxlbWVudCgpKSB7Cisg
ICAgICAgICAgICBpZiAoUmVuZGVyU3R5bGUqIHN0eWxlT2ZTaGFkb3dIb3N0ID0gcGFyZW50LT5y
ZW5kZXJTdHlsZSgpKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZXJNb2Rp
Znkoc3R5bGVPZlNoYWRvd0hvc3QtPnVzZXJNb2RpZnkoKSk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpIHsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
SXNMaW5rKHRydWUpOworICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdGUgPSBzdGF0ZS5lbGVt
ZW50TGlua1N0YXRlKCk7CisgICAgICAgIGlmIChsaW5rU3RhdGUgIT0gTm90SW5zaWRlTGluaykg
eworICAgICAgICAgICAgYm9vbCBmb3JjZVZpc2l0ZWQgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b246OmZvcmNlUHNldWRvU3RhdGUoZWxlbWVudCwgQ1NTU2VsZWN0b3I6OlBzZXVkb1Zpc2l0ZWQp
OworICAgICAgICAgICAgaWYgKGZvcmNlVmlzaXRlZCkKKyAgICAgICAgICAgICAgICBsaW5rU3Rh
dGUgPSBJbnNpZGVWaXNpdGVkTGluazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0ZSk7CisgICAgfQorCisgICAgYm9vbCBuZWVkc0NvbGxl
Y3Rpb24gPSBmYWxzZTsKKyAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmVuc3VyZURlZmF1bHRT
dHlsZVNoZWV0c0ZvckVsZW1lbnQoZWxlbWVudCwgbmVlZHNDb2xsZWN0aW9uKTsKKyAgICBpZiAo
bmVlZHNDb2xsZWN0aW9uKQorICAgICAgICBtX3J1bGVTZXRzLmNvbGxlY3RGZWF0dXJlcyhkb2N1
bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29sdmVyLmdldCgpKTsKKworICAgIE1h
dGNoUmVzdWx0IG1hdGNoUmVzdWx0OworICAgIGlmIChtYXRjaGluZ0JlaGF2aW9yID09IE1hdGNo
T25seVVzZXJBZ2VudFJ1bGVzKQorICAgICAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOwor
ICAgIGVsc2UKKyAgICAgICAgbWF0Y2hBbGxSdWxlcyhtYXRjaFJlc3VsdCwgbWF0Y2hpbmdCZWhh
dmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7CisKKyAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKKworICAgIC8vIENsZWFuIHVwIG91ciBz
dHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBm
aXh1cHMpLgorICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVu
dFN0eWxlKCksIGVsZW1lbnQpOworCisgICAgc3RhdGUuY2xlYXIoKTsgLy8gQ2xlYXIgb3V0IGZv
ciB0aGUgbmV4dCByZXNvbHZlLgorCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNv
bHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCisgICAgcmV0dXJuIHN0YXRl
LnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIGNvbnN0
IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lLCBLZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQor
eworICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKKyAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMo
KSkKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVy
dGllcygpKTsKKworICAgIEFTU0VSVCghbV9zdGF0ZS5zdHlsZSgpKTsKKworICAgIFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisKKyAgICAvLyBDcmVhdGUgdGhlIHN0eWxlCisgICAgc3RhdGUuc2V0
U3R5bGUoUmVuZGVyU3R5bGU6OmNsb25lKGVsZW1lbnRTdHlsZSkpOworICAgIHN0YXRlLnNldExp
bmVIZWlnaHRWYWx1ZSgwKTsKKworICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gYm90aGVyIHdpdGgg
IWltcG9ydGFudC4gU2luY2UgdGhlcmUgaXMgb25seSBldmVyIG9uZQorICAgIC8vIGRlY2wsIHRo
ZXJlJ3Mgbm90aGluZyB0byBvdmVycmlkZS4gU28ganVzdCBhZGQgdGhlIGZpcnN0IHByb3BlcnRp
ZXMuCisgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgaWYgKGtleWZyYW1lLT5w
cm9wZXJ0aWVzKCkpCisgICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5
UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRp
ZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAg
IC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhl
IGZvbnQtc2l6ZQorICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBw
bHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgp
KTsKKworICAgIC8vIE5vdyBkbyByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzLgorICAgIGlmIChrZXlm
cmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1By
aW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0
aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290
IGRpcnRpZWQgYnkgb25lIG9mIHRoZSBub24tZXNzZW50aWFsIGZvbnQgcHJvcHMsCisgICAgLy8g
Z28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBhIHNlY29uZCB0aW1lLgorICAgIHVwZGF0ZUZvbnQoKTsK
KworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHls
ZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAgIAorICAgIC8vIEFkZCBhbGwgdGhl
IGFuaW1hdGluZyBwcm9wZXJ0aWVzIHRvIHRoZSBrZXlmcmFtZS4KKyAgICBpZiAoY29uc3QgU3R5
bGVQcm9wZXJ0eVNldCogc3R5bGVEZWNsYXJhdGlvbiA9IGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkp
IHsKKyAgICAgICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHN0eWxlRGVjbGFyYXRpb24tPnBy
b3BlcnR5Q291bnQoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3BlcnR5
Q291bnQ7ICsraSkgeworICAgICAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IHN0eWxl
RGVjbGFyYXRpb24tPnByb3BlcnR5QXQoaSkuaWQoKTsKKyAgICAgICAgICAgIC8vIFRpbWluZy1m
dW5jdGlvbiB3aXRoaW4ga2V5ZnJhbWVzIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgaXMgbm90IGFu
aW1hdGVkOyBpdCBqdXN0CisgICAgICAgICAgICAvLyBkZXNjcmliZXMgdGhlIHRpbWluZyBmdW5j
dGlvbiBiZXR3ZWVuIHRoaXMga2V5ZnJhbWUgYW5kIHRoZSBuZXh0LgorICAgICAgICAgICAgaWYg
KHByb3BlcnR5ICE9IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb24pCisg
ICAgICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5hZGRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7
CisKKyAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6a2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCogZSwgY29uc3QgUmVuZGVyU3R5
bGUqIGVsZW1lbnRTdHlsZSwgS2V5ZnJhbWVMaXN0JiBsaXN0KQoreworICAgIGxpc3QuY2xlYXIo
KTsKKworICAgIC8vIEdldCB0aGUga2V5ZnJhbWVzUnVsZSBmb3IgdGhpcyBuYW1lCisgICAgaWYg
KCFlIHx8IGxpc3QuYW5pbWF0aW9uTmFtZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLmNoZWNrQ29uc2lzdGVuY3koKTsKKworICAgIEtleWZy
YW1lc1J1bGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXNSdWxlTWFwLmZpbmQobGlzdC5h
bmltYXRpb25OYW1lKCkuaW1wbCgpKTsKKyAgICBpZiAoaXQgPT0gbV9rZXlmcmFtZXNSdWxlTWFw
LmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBTdHlsZVJ1bGVLZXlmcmFtZXMq
IGtleWZyYW1lc1J1bGUgPSBpdC0+dmFsdWUuZ2V0KCk7CisKKyAgICAvLyBDb25zdHJ1Y3QgYW5k
IHBvcHVsYXRlIHRoZSBzdHlsZSBmb3IgZWFjaCBrZXlmcmFtZQorICAgIGNvbnN0IFZlY3RvcjxS
ZWZQdHI8U3R5bGVLZXlmcmFtZT4gPiYga2V5ZnJhbWVzID0ga2V5ZnJhbWVzUnVsZS0+a2V5ZnJh
bWVzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGtleWZyYW1lcy5zaXplKCk7ICsr
aSkgeworICAgICAgICAvLyBBcHBseSB0aGUgZGVjbGFyYXRpb24gdG8gdGhlIHN0eWxlLiBUaGlz
IGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBsb2dpYyBpbiBzdHlsZUZvckVsZW1lbnQK
KyAgICAgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVz
b2x2ZShkb2N1bWVudCgpLCBlKTsKKworICAgICAgICBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlm
cmFtZSA9IGtleWZyYW1lc1tpXS5nZXQoKTsKKworICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZy
YW1lVmFsdWUoMCwgMCk7CisgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JL
ZXlmcmFtZShlbGVtZW50U3R5bGUsIGtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisKKyAgICAg
ICAgLy8gQWRkIHRoaXMga2V5ZnJhbWUgc3R5bGUgdG8gYWxsIHRoZSBpbmRpY2F0ZWQga2V5IHRp
bWVzCisgICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5czsKKyAgICAgICAga2V5ZnJhbWUtPmdldEtl
eXMoa2V5cyk7CisgICAgICAgIGZvciAoc2l6ZV90IGtleUluZGV4ID0gMDsga2V5SW5kZXggPCBr
ZXlzLnNpemUoKTsgKytrZXlJbmRleCkgeworICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRL
ZXkoa2V5c1trZXlJbmRleF0pOworICAgICAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1
ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgMCUga2V5ZnJhbWUgaXMgbWlz
c2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIg
a2V5ZnJhbWUpCisgICAgaW50IGluaXRpYWxMaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgIGlm
IChpbml0aWFsTGlzdFNpemUgPiAwICYmIGxpc3RbMF0ua2V5KCkpIHsKKyAgICAgICAgc3RhdGlj
IFN0eWxlS2V5ZnJhbWUqIHplcm9QZXJjZW50S2V5ZnJhbWU7CisgICAgICAgIGlmICghemVyb1Bl
cmNlbnRLZXlmcmFtZSkgeworICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZSA9IFN0eWxl
S2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAgIHplcm9QZXJjZW50S2V5
ZnJhbWUtPnNldEtleVRleHQoIjAlIik7CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWVWYWx1
ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0
eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCB6ZXJvUGVyY2VudEtleWZyYW1lLCBrZXlmcmFt
ZVZhbHVlKSk7CisgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAgIH0KKwor
ICAgIC8vIElmIHRoZSAxMDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9u
bHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1lKQorICAgIGlmIChpbml0
aWFsTGlzdFNpemUgPiAwICYmIChsaXN0W2xpc3Quc2l6ZSgpIC0gMV0ua2V5KCkgIT0gMSkpIHsK
KyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWU7Cisg
ICAgICAgIGlmICghaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSkgeworICAgICAgICAgICAgaHVuZHJl
ZFBlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAg
ICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUtPnNldEtleVRleHQoIjEwMCUiKTsKKyAg
ICAgICAgfQorICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMSwgMCk7CisgICAg
ICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUs
IGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKKyAgICAgICAgbGlzdC5p
bnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZSwgY29uc3Qg
UHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclN0eWxlKiBwYXJl
bnRTdHlsZSkKK3sKKyAgICBBU1NFUlQocGFyZW50U3R5bGUpOworICAgIGlmICghZSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaW5pdEVs
ZW1lbnQoZSk7CisKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUs
IHBhcmVudFN0eWxlLCBwc2V1ZG9TdHlsZVJlcXVlc3QpOworICAgIHN0YXRlLnNldFN0eWxlKFJl
bmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9z
dGF0ZS5wYXJlbnRTdHlsZSgpKTsKKworICAgIC8vIFNpbmNlIHdlIGRvbid0IHVzZSBwc2V1ZG8t
ZWxlbWVudHMgaW4gYW55IG9mIG91ciBxdWlyay9wcmludCB1c2VyIGFnZW50IHJ1bGVzLCBkb24n
dCB3YXN0ZSB0aW1lIHdhbGtpbmcKKyAgICAvLyB0aG9zZSBydWxlcy4KKworICAgIC8vIENoZWNr
IFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCisgICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7
CisgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKworICAgIGlmIChtX21hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcykgeworICAgICAgICBtYXRjaFVzZXJSdWxlcyhtYXRjaFJlc3VsdCwgZmFs
c2UpOworICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7CisgICAg
fQorCisgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0ZS5zdHlsZSgpLT5zZXRTdHlsZVR5cGUocHNldWRv
U3R5bGVSZXF1ZXN0LnBzZXVkb0lkKTsKKworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0
Y2hSZXN1bHQsIGUpOworCisgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3Bs
YXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCisgICAgYWRqdXN0
UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKKwor
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4K
KyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNz
U3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCisgICAgcmV0
dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHls
ZVJlc29sdmVyOjpzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBtX3N0YXRlLmlu
aXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50
KCkpOyAvLyBtX3Jvb3RFbGVtZW50U3R5bGUgd2lsbCBiZSBzZXQgdG8gdGhlIGRvY3VtZW50IHN0
eWxlLgorCisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAg
IG1fc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCkp
OworCisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7CisgICAg
Y29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBT
dHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CisgICAgCisgICAgTWF0Y2hSZXN1bHQg
cmVzdWx0OworICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBh
Z2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwg
cGFnZSk7CisgICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFsIGF1dGhvciBSdWxlU2V0IGZv
ciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgorICAgIG1hdGNoUGFnZVJ1bGVz
KHJlc3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2Up
OworICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgIGJvb2wgaW5oZXJpdGVk
T25seSA9IGZhbHNlOworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworI2VuZGlmCisg
ICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQs
IGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVk
T25seSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVw
ZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgpOworCisgICAgLy8gTGluZS1oZWlnaHQgaXMg
c2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgorICAgIGlm
IChtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAgICBhcHBseVByb3BlcnR5KENTU1By
b3BlcnR5TGluZUhlaWdodCwgbV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7CisKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwg
MCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwor
CisgICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxl
LgorICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nl
c3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KKyAgICBy
ZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4g
U3R5bGVSZXNvbHZlcjo6ZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpCit7CisgICAgbV9zdGF0ZS5z
ZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIC8vIE1ha2Ugc3VyZSBvdXIgZm9u
dHMgYXJlIGluaXRpYWxpemVkIGlmIHdlIGRvbid0IGluaGVyaXQgdGhlbSBmcm9tIG91ciBwYXJl
bnQgc3R5bGUuCisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3Mo
KSkgeworICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsKKyAgICAgICAgbV9z
dGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3RvcigpKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKDApOworCisgICAgcmV0dXJu
IG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxl
UmVzb2x2ZXI6OnN0eWxlRm9yVGV4dChUZXh0KiB0ZXh0Tm9kZSkKK3sKKyAgICBBU1NFUlQodGV4
dE5vZGUpOworCisgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dCh0ZXh0Tm9kZSk7Cisg
ICAgTm9kZSogcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0
eWxlKCk7CisgICAgcmV0dXJuIGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRhbmNlKCkgfHwgIXBh
cmVudE5vZGUgPworICAgICAgICBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkgOiBwYXJlbnROb2Rl
LT5yZW5kZXJTdHlsZSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zKFJl
bmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICAvLyBJbnRyaW5zaWMgbWFyZ2luIHZhbHVlLgorICAg
IGNvbnN0IGludCBpbnRyaW5zaWNNYXJnaW4gPSAyICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsK
KworICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9oZWlnaHQgYWxvbmUgYW5kIG5vdCBhbHNvIGRl
YWxpbmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRoIGlzIGZsYXdlZC4KKyAgICAvLyBGSVhNRTog
VXNpbmcgInF1aXJrIiB0byBkZWNpZGUgdGhlIG1hcmdpbiB3YXNuJ3Qgc2V0IGlzIGtpbmQgb2Yg
bGFtZS4KKyAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkgeworICAg
ICAgICBpZiAoc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUt
PnNldE1hcmdpbkxlZnQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAg
aWYgKHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0
TWFyZ2luUmlnaHQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICB9CisKKyAg
ICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7CisgICAgICAgIGlmIChzdHlsZS0+bWFy
Z2luVG9wKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3Ro
KGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Cb3R0
b20oKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShMZW5ndGgo
aW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgIH0KK30KKworc3RhdGljIEVEaXNwbGF5IGVx
dWl2YWxlbnRCbG9ja0Rpc3BsYXkoRURpc3BsYXkgZGlzcGxheSwgYm9vbCBpc0Zsb2F0aW5nLCBi
b29sIHN0cmljdFBhcnNpbmcpCit7CisgICAgc3dpdGNoIChkaXNwbGF5KSB7CisgICAgY2FzZSBC
TE9DSzoKKyAgICBjYXNlIFRBQkxFOgorICAgIGNhc2UgQk9YOgorICAgIGNhc2UgRkxFWDoKKyAg
ICBjYXNlIEdSSUQ6CisgICAgICAgIHJldHVybiBkaXNwbGF5OworCisgICAgY2FzZSBMSVNUX0lU
RU06CisgICAgICAgIC8vIEl0IGlzIGEgV2luSUUgYnVnIHRoYXQgZmxvYXRlZCBsaXN0IGl0ZW1z
IGxvc2UgdGhlaXIgYnVsbGV0cywgc28gd2UnbGwgZW11bGF0ZSB0aGUgcXVpcmssIGJ1dCBvbmx5
IGluIHF1aXJrcyBtb2RlLgorICAgICAgICBpZiAoIXN0cmljdFBhcnNpbmcgJiYgaXNGbG9hdGlu
ZykKKyAgICAgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICAgICAgcmV0dXJuIGRpc3BsYXk7Cisg
ICAgY2FzZSBJTkxJTkVfVEFCTEU6CisgICAgICAgIHJldHVybiBUQUJMRTsKKyAgICBjYXNlIElO
TElORV9CT1g6CisgICAgICAgIHJldHVybiBCT1g7CisgICAgY2FzZSBJTkxJTkVfRkxFWDoKKyAg
ICAgICAgcmV0dXJuIEZMRVg7CisgICAgY2FzZSBJTkxJTkVfR1JJRDoKKyAgICAgICAgcmV0dXJu
IEdSSUQ7CisKKyAgICBjYXNlIElOTElORToKKyAgICBjYXNlIFJVTl9JTjoKKyAgICBjYXNlIENP
TVBBQ1Q6CisgICAgY2FzZSBJTkxJTkVfQkxPQ0s6CisgICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6
CisgICAgY2FzZSBUQUJMRV9IRUFERVJfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9GT09URVJfR1JP
VVA6CisgICAgY2FzZSBUQUJMRV9ST1c6CisgICAgY2FzZSBUQUJMRV9DT0xVTU5fR1JPVVA6Cisg
ICAgY2FzZSBUQUJMRV9DT0xVTU46CisgICAgY2FzZSBUQUJMRV9DRUxMOgorICAgIGNhc2UgVEFC
TEVfQ0FQVElPTjoKKyAgICAgICAgcmV0dXJuIEJMT0NLOworICAgIGNhc2UgTk9ORToKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBOT05FOworICAgIH0KKyAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gQkxPQ0s7Cit9CisKKy8vIENTUyBy
ZXF1aXJlcyB0ZXh0LWRlY29yYXRpb24gdG8gYmUgcmVzZXQgYXQgZWFjaCBET00gZWxlbWVudCBm
b3IgdGFibGVzLCAKKy8vIGlubGluZSBibG9ja3MsIGlubGluZSB0YWJsZXMsIHJ1bi1pbnMsIHNo
YWRvdyBET00gY3Jvc3NpbmdzLCBmbG9hdGluZyBlbGVtZW50cywKKy8vIGFuZCBhYnNvbHV0ZSBv
ciByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMuCitzdGF0aWMgYm9vbCBkb2VzTm90SW5o
ZXJpdFRleHREZWNvcmF0aW9uKFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkKK3sKKyAg
ICByZXR1cm4gc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09
IElOTElORV9UQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFJVTl9JTgorICAgICAgICB8fCBz
dHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CTE9DSyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElO
TElORV9CT1ggfHwgaXNBdFNoYWRvd0JvdW5kYXJ5KGUpCisgICAgICAgIHx8IHN0eWxlLT5pc0Zs
b2F0aW5nKCkgfHwgc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCk7Cit9CisKK3N0YXRpYyBi
b29sIGlzRGlzcGxheUZsZXhpYmxlQm94KEVEaXNwbGF5IGRpc3BsYXkpCit7CisgICAgcmV0dXJu
IGRpc3BsYXkgPT0gRkxFWCB8fCBkaXNwbGF5ID09IElOTElORV9GTEVYOworfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVy
U3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50ICplKQoreworICAgIEFTU0VSVChwYXJlbnRTdHls
ZSk7CisKKyAgICAvLyBDYWNoZSBvdXIgb3JpZ2luYWwgZGlzcGxheS4KKyAgICBzdHlsZS0+c2V0
T3JpZ2luYWxEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCkpOworCisgICAgaWYgKHN0eWxlLT5kaXNw
bGF5KCkgIT0gTk9ORSkgeworICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgPHRkPiB0aGF0IHNwZWNp
ZmllcyBhIGZsb2F0IHByb3BlcnR5LCBpbiBxdWlya3MgbW9kZSB3ZSBqdXN0IGRyb3AgdGhlIGZs
b2F0CisgICAgICAgIC8vIHByb3BlcnR5LgorICAgICAgICAvLyBTaXRlcyBhbHNvIGNvbW1vbmx5
IHVzZSBkaXNwbGF5OmlubGluZS9ibG9jayBvbiA8dGQ+cyBhbmQgPHRhYmxlPnMuIEluIHF1aXJr
cyBtb2RlIHdlIGZvcmNlCisgICAgICAgIC8vIHRoZXNlIHRhZ3MgdG8gcmV0YWluIHRoZWlyIGRp
c3BsYXkgdHlwZXMuCisgICAgICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSAmJiBl
KSB7CisgICAgICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZSh0ZFRhZykpIHsKKyAgICAgICAgICAg
ICAgICBzdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsKKyAgICAgICAgICAgICAgICBzdHls
ZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUtPmhhc1Rh
Z05hbWUodGFibGVUYWcpKQorICAgICAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KHN0eWxl
LT5pc0Rpc3BsYXlJbmxpbmVUeXBlKCkgPyBJTkxJTkVfVEFCTEUgOiBUQUJMRSk7CisgICAgICAg
IH0KKworICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZSh0ZFRhZykgfHwgZS0+aGFzVGFn
TmFtZSh0aFRhZykpKSB7CisgICAgICAgICAgICBpZiAoc3R5bGUtPndoaXRlU3BhY2UoKSA9PSBL
SFRNTF9OT1dSQVApIHsKKyAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIGFyZSBy
ZWFsbHkgbm93cmFwcGluZyBvciBpZiB3ZSBzaG91bGQganVzdAorICAgICAgICAgICAgICAgIC8v
IHVzZSBub3JtYWwgaW5zdGVhZC4gSWYgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGlzIGZpeGVkLCB0
aGVuCisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIE5PV1JBUC4KKyAg
ICAgICAgICAgICAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNGaXhlZCgpKQorICAgICAgICAgICAg
ICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwpOworICAgICAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9XUkFQKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRhYmxlcyBuZXZlciBzdXBwb3J0
IHRoZSAtd2Via2l0LSogdmFsdWVzIGZvciB0ZXh0LWFsaWduIGFuZCB3aWxsIHJlc2V0IGJhY2sg
dG8gdGhlIGRlZmF1bHQuCisgICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGFibGVUYWcp
ICYmIChzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0xFRlQgfHwgc3R5bGUtPnRleHRBbGln
bigpID09IFdFQktJVF9DRU5URVIgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9SSUdI
VCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKFRBU1RBUlQpOworCisgICAgICAg
IC8vIEZyYW1lcyBhbmQgZnJhbWVzZXRzIG5ldmVyIGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9y
IHBvc2l0aW9uOmFic29sdXRlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0bworICAgICAgICAvLyBmaXgg
YSBjcmFzaCB3aGVyZSBhIHNpdGUgdHJpZXMgdG8gcG9zaXRpb24gdGhlc2Ugb2JqZWN0cy4gVGhl
eSBhbHNvIG5ldmVyIGhvbm9yIGRpc3BsYXkuCisgICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdO
YW1lKGZyYW1lVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkpIHsKKyAgICAgICAg
ICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7CisgICAgICAgICAgICBzdHls
ZS0+c2V0RGlzcGxheShCTE9DSyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSdWJ5IHRleHQg
ZG9lcyBub3Qgc3VwcG9ydCBmbG9hdCBvciBwb3NpdGlvbi4gVGhpcyBtaWdodCBjaGFuZ2Ugd2l0
aCBldm9sdXRpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICAgIGlmIChlICYmIGUtPmhh
c1RhZ05hbWUocnRUYWcpKSB7CisgICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGlj
UG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBvdmVycmlkaW5nIHN0
YXJ0Ly13ZWJraXQtYXV0byBsaWtlIHRoaXMuIERvIGl0IGluIGh0bWwuY3NzIGluc3RlYWQuCisg
ICAgICAgIC8vIFRhYmxlIGhlYWRlcnMgd2l0aCBhIHRleHQtYWxpZ24gb2YgLXdlYmtpdC1hdXRv
IHdpbGwgY2hhbmdlIHRoZSB0ZXh0LWFsaWduIHRvIGNlbnRlci4KKyAgICAgICAgaWYgKGUgJiYg
ZS0+aGFzVGFnTmFtZSh0aFRhZykgJiYgc3R5bGUtPnRleHRBbGlnbigpID09IFRBU1RBUlQpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKENFTlRFUik7CisKKyAgICAgICAgaWYgKGUg
JiYgZS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQorICAgICAgICAgICAgc3R5bGUtPnNldERpc3Bs
YXkoQkxPQ0spOworCisgICAgICAgIC8vIEFic29sdXRlL2ZpeGVkIHBvc2l0aW9uZWQgZWxlbWVu
dHMsIGZsb2F0aW5nIGVsZW1lbnRzIGFuZCB0aGUgZG9jdW1lbnQgZWxlbWVudCBuZWVkIGJsb2Nr
LWxpa2Ugb3V0c2lkZSBkaXNwbGF5LgorICAgICAgICBpZiAoc3R5bGUtPmhhc091dE9mRmxvd1Bv
c2l0aW9uKCkgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCAoZSAmJiBlLT5kb2N1bWVudCgpLT5k
b2N1bWVudEVsZW1lbnQoKSA9PSBlKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVx
dWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmco
KSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7CisKKyAgICAgICAgLy8gRklYTUU6IERv
bid0IHN1cHBvcnQgdGhpcyBtdXRhdGlvbiBmb3IgcHNldWRvIHN0eWxlcyBsaWtlIGZpcnN0LWxl
dHRlciBvciBmaXJzdC1saW5lLCBzaW5jZSBpdCdzIG5vdCBjb21wbGV0ZWx5CisgICAgICAgIC8v
IGNsZWFyIGhvdyB0aGF0IHNob3VsZCB3b3JrLgorICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXko
KSA9PSBJTkxJTkUgJiYgc3R5bGUtPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmIHN0eWxlLT53
cml0aW5nTW9kZSgpICE9IHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgpKQorICAgICAgICAgICAg
c3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKworICAgICAgICAvLyBBZnRlciBwZXJm
b3JtaW5nIHRoZSBkaXNwbGF5IG11dGF0aW9uLCBjaGVjayB0YWJsZSByb3dzLiBXZSBkbyBub3Qg
aG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246c3RpY2t5IG9uCisgICAgICAgIC8v
IHRhYmxlIHJvd3Mgb3IgY2VsbHMuIFRoaXMgaGFzIGJlZW4gZXN0YWJsaXNoZWQgZm9yIHBvc2l0
aW9uOnJlbGF0aXZlIGluIENTUzIuMSAoYW5kIGNhdXNlZCBhIGNyYXNoIGluIGNvbnRhaW5pbmdC
bG9jaygpCisgICAgICAgIC8vIG9uIHNvbWUgc2l0ZXMpLgorICAgICAgICBpZiAoKHN0eWxlLT5k
aXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZP
T1RFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVykKKyAgICAgICAgICAg
ICYmIHN0eWxlLT5oYXNJbkZsb3dQb3NpdGlvbigpKQorICAgICAgICAgICAgc3R5bGUtPnNldFBv
c2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKworICAgICAgICAvLyB3cml0aW5nLW1vZGUgZG9lcyBu
b3QgYXBwbHkgdG8gdGFibGUgcm93IGdyb3VwcywgdGFibGUgY29sdW1uIGdyb3VwcywgdGFibGUg
cm93cywgYW5kIHRhYmxlIGNvbHVtbnMuCisgICAgICAgIC8vIEZJWE1FOiBUYWJsZSBjZWxscyBz
aG91bGQgYmUgYWxsb3dlZCB0byBiZSBwZXJwZW5kaWN1bGFyIG9yIGZsaXBwZWQgd2l0aCByZXNw
ZWN0IHRvIHRoZSB0YWJsZSwgdGhvdWdoLgorICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9DT0xVTU4gfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVAg
fHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAKKyAgICAgICAgICAgIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gVEFCTEVfUk9XIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCisg
ICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NFTEwpCisgICAgICAgICAg
ICBzdHlsZS0+c2V0V3JpdGluZ01vZGUocGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpOworCisg
ICAgICAgIC8vIEZJWE1FOiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGJsb2NrLWZsb3cgb24gZmxl
eGlibGUgYm94ZXMgeWV0LCBkaXNhbGxvdyBzZXR0aW5nCisgICAgICAgIC8vIG9mIGJsb2NrLWZs
b3cgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlLgorICAgICAg
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY0MTggLSBGbGV4
aWJsZSBib3ggc3VwcG9ydC4KKyAgICAgICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFRv
cFRvQm90dG9tV3JpdGluZ01vZGUgJiYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gQk9YIHx8IHN0eWxl
LT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGlu
Z01vZGUoVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSk7CisKKyAgICAgICAgaWYgKGlzRGlzcGxheUZs
ZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKSB7CisgICAgICAgICAgICBzdHlsZS0+
c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVp
dmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCks
ICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworICAgICAgICB9CisKKyNpZiBFTkFCTEUo
RElBTE9HX0VMRU1FTlQpCisgICAgICAgIC8vIFBlciB0aGUgc3BlYywgcG9zaXRpb24gJ3N0YXRp
YycgYW5kICdyZWxhdGl2ZScgaW4gdGhlIHRvcCBsYXllciBjb21wdXRlIHRvICdhYnNvbHV0ZScu
CisgICAgICAgIGlmIChlICYmIGUtPmlzSW5Ub3BMYXllcigpICYmIChzdHlsZS0+cG9zaXRpb24o
KSA9PSBTdGF0aWNQb3NpdGlvbiB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBSZWxhdGl2ZVBvc2l0
aW9uKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKEFic29sdXRlUG9zaXRpb24p
OworICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAgICAgICB9CisjZW5k
aWYKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgb3VyIHotaW5kZXggdmFsdWUgaXMgb25seSBh
cHBsaWVkIGlmIHRoZSBvYmplY3QgaXMgcG9zaXRpb25lZC4KKyAgICBpZiAoc3R5bGUtPnBvc2l0
aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gJiYgIWlzRGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0
eWxlLT5kaXNwbGF5KCkpKQorICAgICAgICBzdHlsZS0+c2V0SGFzQXV0b1pJbmRleCgpOworCisg
ICAgLy8gQXV0byB6LWluZGV4IGJlY29tZXMgMCBmb3IgdGhlIHJvb3QgZWxlbWVudCBhbmQgdHJh
bnNwYXJlbnQgb2JqZWN0cy4gVGhpcyBwcmV2ZW50cworICAgIC8vIGNhc2VzIHdoZXJlIG9iamVj
dHMgdGhhdCBzaG91bGQgYmUgYmxlbmRlZCBhcyBhIHNpbmdsZSB1bml0IGVuZCB1cCB3aXRoIGEg
bm9uLXRyYW5zcGFyZW50CisgICAgLy8gb2JqZWN0IHdlZGdlZCBpbiBiZXR3ZWVuIHRoZW0uIEF1
dG8gei1pbmRleCBhbHNvIGJlY29tZXMgMCBmb3Igb2JqZWN0cyB0aGF0IHNwZWNpZnkgdHJhbnNm
b3Jtcy9tYXNrcy9yZWZsZWN0aW9ucy4KKyAgICBpZiAoc3R5bGUtPmhhc0F1dG9aSW5kZXgoKSAm
JiAoKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkKKyAgICAgICAg
fHwgc3R5bGUtPm9wYWNpdHkoKSA8IDEuMGYKKyAgICAgICAgfHwgc3R5bGUtPmhhc1RyYW5zZm9y
bVJlbGF0ZWRQcm9wZXJ0eSgpCisgICAgICAgIHx8IHN0eWxlLT5oYXNNYXNrKCkKKyAgICAgICAg
fHwgc3R5bGUtPmNsaXBQYXRoKCkKKyAgICAgICAgfHwgc3R5bGUtPmJveFJlZmxlY3QoKQorICAg
ICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkKKyAgICAgICAgfHwgc3R5bGUtPmhhc0JsZW5kTW9k
ZSgpCisgICAgICAgIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFN0aWNreVBvc2l0aW9uCisgICAg
ICAgIHx8IChzdHlsZS0+cG9zaXRpb24oKSA9PSBGaXhlZFBvc2l0aW9uICYmIGUgJiYgZS0+ZG9j
dW1lbnQoKS0+cGFnZSgpICYmIGUtPmRvY3VtZW50KCktPnBhZ2UoKS0+c2V0dGluZ3MoKS0+Zml4
ZWRQb3NpdGlvbkNyZWF0ZXNTdGFja2luZ0NvbnRleHQoKSkKKyNpZiBFTkFCTEUoQUNDRUxFUkFU
RURfT1ZFUkZMT1dfU0NST0xMSU5HKQorICAgICAgICAvLyBUb3VjaCBvdmVyZmxvdyBzY3JvbGxp
bmcgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHQuCisgICAgICAgIHx8ICgoc3R5bGUtPm92ZXJm
bG93WCgpICE9IE9ISURERU4gfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pICYmIHN0
eWxlLT51c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKCkpCisjZW5kaWYKKyNpZiBFTkFCTEUoRElB
TE9HX0VMRU1FTlQpCisgICAgICAgIHx8IChlICYmIGUtPmlzSW5Ub3BMYXllcigpKQorI2VuZGlm
CisgICAgICAgICkpCisgICAgICAgIHN0eWxlLT5zZXRaSW5kZXgoMCk7CisKKyAgICAvLyBUZXh0
YXJlYSBjb25zaWRlcnMgb3ZlcmZsb3cgdmlzaWJsZSBhcyBhdXRvLgorICAgIGlmIChlICYmIGUt
Pmhhc1RhZ05hbWUodGV4dGFyZWFUYWcpKSB7CisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1go
c3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dY
KCkpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBP
VklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WSgpKTsKKyAgICB9CisKKyAgICBpZiAo
ZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihzdHlsZSwgZSkpCisgICAgICAgIHN0eWxlLT5z
ZXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29yYXRpb24oKSk7CisgICAg
ZWxzZQorICAgICAgICBzdHlsZS0+YWRkVG9UZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+
dGV4dERlY29yYXRpb24oKSk7CisKKyAgICAvLyBJZiBlaXRoZXIgb3ZlcmZsb3cgdmFsdWUgaXMg
bm90IHZpc2libGUsIGNoYW5nZSB0byBhdXRvLgorICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkg
PT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9NQVJRVUVFKQorICAgICAgICBz
dHlsZS0+c2V0T3ZlcmZsb3dZKE9NQVJRVUVFKTsKKyAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZs
b3dZKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9NQVJRVUVFKQorICAg
ICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9NQVJRVUVFKTsKKyAgICBlbHNlIGlmIChzdHlsZS0+
b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxF
KSB7CisgICAgICAgIC8vIEZJWE1FOiBPbmNlIHdlIGltcGxlbWVudCBwYWdpbmF0aW9uIGNvbnRy
b2xzLCBvdmVyZmxvdy14IHNob3VsZCBkZWZhdWx0IHRvIGhpZGRlbgorICAgICAgICAvLyBpZiBv
dmVyZmxvdy15IGlzIHNldCB0byAtd2Via2l0LXBhZ2VkLXggb3IgLXdlYmtpdC1wYWdlLXkuIEZv
ciBub3csIHdlJ2xsIGxldCBpdAorICAgICAgICAvLyBkZWZhdWx0IHRvIGF1dG8gc28gd2UgY2Fu
IGF0IGxlYXN0IHNjcm9sbCB0aHJvdWdoIHRoZSBwYWdlcy4KKyAgICAgICAgc3R5bGUtPnNldE92
ZXJmbG93WChPQVVUTyk7CisgICAgfSBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJ
U0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFKQorICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dZKE9BVVRPKTsKKworICAgIC8vIENhbGwgc2V0U3R5bGVzRm9yUGFnaW5hdGlv
bk1vZGUoKSBpZiBhIHBhZ2luYXRpb24gbW9kZSBpcyBzZXQgZm9yIGFueSBub24tcm9vdCBlbGVt
ZW50cy4gSWYgdGhlc2UKKyAgICAvLyBzdHlsZXMgYXJlIHNwZWNpZmllZCBvbiBhIHJvb3QgZWxl
bWVudCwgdGhlbiB0aGV5IHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGluCisgICAgLy8gU3R5bGVSZXNv
bHZlcjo6c3R5bGVGb3JEb2N1bWVudCgpLgorICAgIGlmICgoc3R5bGUtPm92ZXJmbG93WSgpID09
IE9QQUdFRFggfHwgc3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFkpICYmICEoZSAmJiAoZS0+
aGFzVGFnTmFtZShodG1sVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGJvZHlUYWcpKSkpCisgICAgICAg
IHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFdlYkNvcmU6OnBhZ2luYXRpb25Nb2RlRm9yUmVu
ZGVyU3R5bGUoc3R5bGUpLCBzdHlsZSk7CisKKyAgICAvLyBUYWJsZSByb3dzLCBzZWN0aW9ucyBh
bmQgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIHN1cHBvcnQgb3ZlcmZsb3c6aGlkZGVuIGFuZCB3aWxs
IGlnbm9yZSBzY3JvbGwvYXV0by4KKyAgICAvLyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZSBzZWN0
aW9ucyB3aWxsIHN1cHBvcnQgYXV0byBhbmQgc2Nyb2xsLgorICAgIGlmIChzdHlsZS0+ZGlzcGxh
eSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFCisgICAgICAg
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gVEFCTEVfUk9XKSB7CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJ
U0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURERU4pCisgICAgICAgICAgICBzdHls
ZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKyAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1ko
KSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikKKyAgICAgICAg
ICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOworICAgIH0KKworICAgIC8vIE1lbnVs
aXN0cyBzaG91bGQgaGF2ZSB2aXNpYmxlIG92ZXJmbG93CisgICAgaWYgKHN0eWxlLT5hcHBlYXJh
bmNlKCkgPT0gTWVudWxpc3RQYXJ0KSB7CisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJ
U0lCTEUpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKyAgICB9CisK
KyAgICAvLyBDdWxsIG91dCBhbnkgdXNlbGVzcyBsYXllcnMgYW5kIGFsc28gcmVwZWF0IHBhdHRl
cm5zIGludG8gYWRkaXRpb25hbCBsYXllcnMuCisgICAgc3R5bGUtPmFkanVzdEJhY2tncm91bmRM
YXllcnMoKTsKKyAgICBzdHlsZS0+YWRqdXN0TWFza0xheWVycygpOworCisgICAgLy8gRG8gdGhl
IHNhbWUgZm9yIGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25zLgorICAgIHN0eWxlLT5hZGp1c3RB
bmltYXRpb25zKCk7CisgICAgc3R5bGUtPmFkanVzdFRyYW5zaXRpb25zKCk7CisKKyAgICAvLyBJ
bXBvcnRhbnQ6IEludHJpbnNpYyBtYXJnaW5zIGdldCBhZGRlZCB0byBjb250cm9scyBiZWZvcmUg
dGhlIHRoZW1lIGhhcyBhZGp1c3RlZCB0aGUgc3R5bGUsIHNpbmNlIHRoZSB0aGVtZSB3aWxsCisg
ICAgLy8gYWx0ZXIgZm9udHMgYW5kIGhlaWdodHMvd2lkdGhzLgorICAgIGlmIChlICYmIGUtPmlz
Rm9ybUNvbnRyb2xFbGVtZW50KCkgJiYgc3R5bGUtPmZvbnRTaXplKCkgPj0gMTEpIHsKKyAgICAg
ICAgLy8gRG9uJ3QgYXBwbHkgaW50cmluc2ljIG1hcmdpbnMgdG8gaW1hZ2UgYnV0dG9ucy4gVGhl
IGRlc2lnbmVyIGtub3dzIGhvdyBiaWcgdGhlIGltYWdlcyBhcmUsCisgICAgICAgIC8vIHNvIHdl
IGhhdmUgdG8gdHJlYXQgYWxsIGltYWdlIGJ1dHRvbnMgYXMgdGhvdWdoIHRoZXkgd2VyZSBleHBs
aWNpdGx5IHNpemVkLgorICAgICAgICBpZiAoIWUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpIHx8ICFz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZSktPmlzSW1hZ2VCdXR0b24oKSkKKyAgICAg
ICAgICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOworICAgIH0KKworICAgIC8vIExldCB0
aGUgdGhlbWUgYWxzbyBoYXZlIGEgY3JhY2sgYXQgYWRqdXN0aW5nIHRoZSBzdHlsZS4KKyAgICBp
ZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRU
aGVtZSgpLT5hZGp1c3RTdHlsZSh0aGlzLCBzdHlsZSwgZSwgbV9zdGF0ZS5oYXNVQUFwcGVhcmFu
Y2UoKSwgbV9zdGF0ZS5ib3JkZXJEYXRhKCksIG1fc3RhdGUuYmFja2dyb3VuZERhdGEoKSwgbV9z
dGF0ZS5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGZpcnN0LWxldHRl
ciBwc2V1ZG8gc3R5bGUsIGRvIG5vdCBzaGFyZSB0aGlzIHN0eWxlLgorICAgIGlmIChzdHlsZS0+
aGFzUHNldWRvU3R5bGUoRklSU1RfTEVUVEVSKSkKKyAgICAgICAgc3R5bGUtPnNldFVuaXF1ZSgp
OworCisgICAgLy8gRklYTUU6IHdoZW4gZHJvcHBpbmcgdGhlIC13ZWJraXQgcHJlZml4IG9uIHRy
YW5zZm9ybS1zdHlsZSwgd2Ugc2hvdWxkIGFsc28gaGF2ZSBvcGFjaXR5IDwgMSBjYXVzZSBmbGF0
dGVuaW5nLgorICAgIGlmIChzdHlsZS0+cHJlc2VydmVzM0QoKSAmJiAoc3R5bGUtPm92ZXJmbG93
WCgpICE9IE9WSVNJQkxFCisgICAgICAgIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJM
RQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkpKQorICAgICAgICBzdHlsZS0+c2V0VHJh
bnNmb3JtU3R5bGUzRChUcmFuc2Zvcm1TdHlsZTNERmxhdCk7CisKKyAgICAvLyBTZWFtbGVzcyBp
ZnJhbWVzIGJlaGF2ZSBsaWtlIGJsb2Nrcy4gTWFwIHRoZWlyIGRpc3BsYXkgdG8gaW5saW5lLWJs
b2NrIHdoZW4gbWFya2VkIGlubGluZS4KKyAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGlmcmFt
ZVRhZykgJiYgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgJiYgc3RhdGljX2Nhc3Q8SFRNTElG
cmFtZUVsZW1lbnQqPihlKS0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHkoKSkKKyAgICAgICAgc3R5
bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgaWYg
KGUgJiYgZS0+aXNTVkdFbGVtZW50KCkpIHsKKyAgICAgICAgLy8gU3BlYzogaHR0cDovL3d3dy53
My5vcmcvVFIvU1ZHL21hc2tpbmcuaHRtbCNPdmVyZmxvd1Byb3BlcnR5CisgICAgICAgIGlmIChz
dHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1NDUk9MTCkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVy
Zmxvd1koT0hJRERFTik7CisgICAgICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBP
QVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOworCisgICAg
ICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1NDUk9MTCkKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRPdmVyZmxvd1goT0hJRERFTik7CisgICAgICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxv
d1goKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUp
OworCisgICAgICAgIC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4gZWxlbWVudCBpbiBhbiBTVkcgZG9j
dW1lbnQgZnJhZ21lbnQgdHJlZSBob25vcnMgY3NzIHBvc2l0aW9uCisgICAgICAgIGlmICghKGUt
Pmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZykgJiYgZS0+cGFyZW50Tm9kZSgpICYmICFlLT5w
YXJlbnROb2RlKCktPmlzU1ZHRWxlbWVudCgpKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3Np
dGlvbihSZW5kZXJTdHlsZTo6aW5pdGlhbFBvc2l0aW9uKCkpOworCisgICAgICAgIC8vIFJlbmRl
clNWR1Jvb3QgaGFuZGxlcyB6b29taW5nIGZvciB0aGUgd2hvbGUgU1ZHIHN1YnRyZWUsIHNvIGZv
cmVpZ25PYmplY3QgY29udGVudCBzaG91bGQKKyAgICAgICAgLy8gbm90IGJlIHNjYWxlZCBhZ2Fp
bi4KKyAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OmZvcmVpZ25PYmplY3RUYWcp
KQorICAgICAgICAgICAgc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oUmVuZGVyU3R5bGU6OmluaXRp
YWxab29tKCkpOworICAgIH0KKyNlbmRpZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNr
UmVnaW9uU3R5bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICAvLyBGSVhNRSAoQlVH
IDcyNDcyKTogV2UgZG9uJ3QgYWRkIEAtd2Via2l0LXJlZ2lvbiBydWxlcyBvZiBzY29wZWQgc3R5
bGUgc2hlZXRzIGZvciB0aGUgbW9tZW50LAorICAgIC8vIHNvIGFsbCByZWdpb24gcnVsZXMgYXJl
IGdsb2JhbCBieSBkZWZhdWx0LiBWZXJpZnkgd2hldGhlciB0aGF0IGNhbiBzdGFuZCBvciBuZWVk
cyBjaGFuZ2luZy4KKworICAgIHVuc2lnbmVkIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMuYXV0aG9y
U3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7CisgICAgICAgIEFTU0VSVChtX3J1
bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSku
cnVsZVNldC5nZXQoKSk7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNl
dHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxl
Y3RvciwgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICBpZiAobV9ydWxlU2V0cy51c2VyU3R5bGUoKSkgeworICAgICAgICBydWxlc1NpemUgPSBt
X3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUo
KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7Cisg
ICAgICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3Rv
cnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjaGVj
a1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQorICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitzdGF0aWMgdm9pZCBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKFJlbmRlclN0eWxlKiBz
dHlsZSkKK3sKKyAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOworICAgIE5vbkNK
S0dseXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKKyAgICBnZXRGb250QW5kR2x5cGhP
cmllbnRhdGlvbihzdHlsZSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKKwor
ICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uID0gc3R5bGUtPmZvbnRE
ZXNjcmlwdGlvbigpOworICAgIGlmIChmb250RGVzY3JpcHRpb24ub3JpZW50YXRpb24oKSA9PSBm
b250T3JpZW50YXRpb24gJiYgZm9udERlc2NyaXB0aW9uLm5vbkNKS0dseXBoT3JpZW50YXRpb24o
KSA9PSBnbHlwaE9yaWVudGF0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBGb250RGVzY3Jp
cHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgbmV3Rm9udERl
c2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7Cisg
ICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmllbnRhdGlvbik7Cisg
ICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOworfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6OnVwZGF0ZUZvbnQoKQoreworICAgIGlmICghbV9zdGF0ZS5mb250
RGlydHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9z
dGF0ZS5zdHlsZSgpOworICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShzdHlsZSwgbV9z
dGF0ZS5wYXJlbnRTdHlsZSgpKTsKKyAgICBjaGVja0Zvclpvb21DaGFuZ2Uoc3R5bGUsIG1fc3Rh
dGUucGFyZW50U3R5bGUoKSk7CisgICAgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShzdHlsZSk7
CisgICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOworICAgIG1fc3RhdGUu
c2V0Rm9udERpcnR5KGZhbHNlKTsKK30KKworUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVS
ZXNvbHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgdW5zaWduZWQgcnVsZXNU
b0luY2x1ZGUpCit7CisgICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KGUsIE5P
UFNFVURPLCBydWxlc1RvSW5jbHVkZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0
eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzZXVk
b0lkIHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKK3sKKyAgICBpZiAoIWUgfHwg
IWUtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxl
cyk7CisKKyAgICBpbml0RWxlbWVudChlKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29s
dmUoZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOworCisgICAgTWF0Y2hSZXN1bHQgZHVtbXk7
CisgICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMpIHsKKyAgICAgICAg
Ly8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KKyAgICAg
ICAgbWF0Y2hVQVJ1bGVzKGR1bW15KTsKKworICAgICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBz
aGVldCBydWxlcy4KKyAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAg
ICAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NS
dWxlcyk7CisgICAgfQorCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChy
dWxlc1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgeworICAgICAgICBtX3N0YXRlLnNldFNh
bWVPcmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisK
KyAgICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCisgICAgICAgIG1h
dGNoQXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CisK
KyAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxzZSk7CisgICAgfQorCisgICAg
bV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOworCisgICAg
cmV0dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7Cit9CisKK2lubGluZSBib29sIFN0eWxlUmVz
b2x2ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFp
bmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6
OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCit7CisgICAgU3RhdGUmIHN0
YXRlID0gbV9zdGF0ZTsKKworICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0
b3IoKSkgeworICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVk
ZSBhbnkgcHNldWRvIGVsZW1lbnRzLgorICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1
ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVj
dG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNo
LgorICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5l
ZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KKyAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0
bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVu
dCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVs
dGlwYXJ0U2VsZWN0b3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rv
cjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBy
dWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBh
dGgocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKKyAgICAgICAgaWYgKCFz
ZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3Io
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gc2VsZWN0b3JD
aGVja2VyRmFzdFBhdGgubWF0Y2hlcygpOworICAgIH0KKworICAgIC8vIFNsb3cgcGF0aC4KKyAg
ICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUo
KSk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0
KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpW
aXNpdGVkTWF0Y2hFbmFibGVkKTsKKyAgICBjb250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0
eWxlKCk7CisgICAgY29udGV4dC5zY29wZSA9IHNjb3BlOworICAgIGNvbnRleHQucHNldWRvSWQg
PSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsKKyAgICBjb250ZXh0LnNjcm9s
bGJhciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhcjsKKyAgICBjb250ZXh0
LnNjcm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0
OworICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5Owor
ICAgIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2go
Y29udGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOwor
ICAgIGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1
ZG9JZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAh
PSBkeW5hbWljUHNldWRvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NT
ZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAg
aWYgKCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBt
X3N0YXRlLm1vZGUoKSk7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNl
bGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKSB7CisgICAgICAgIFNlbGVj
dG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRl
eHQocywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxl
ZCk7CisgICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAg
ICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwg
aWdub3JlRHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNl
bGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisvLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1ZmYgb24gaG93IHRvIGFwcGx5
IGEgY2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgorCitMZW5ndGggU3R5bGVSZXNv
bHZlcjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1
ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVs
dGlwbGllcikKK3sKKyAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+
Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lv
biB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQ
ZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5n
dGgoVW5kZWZpbmVkKTsKK30KKworTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0
TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0
eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKK3sKKyAgICBy
ZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZp
eGVkRmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVy
c2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+
KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Cit9CisK
K3RlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgordm9p
ZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCog
cHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVy
aXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCit7
CisgICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RS
ZWdpb24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsKKyAgICBJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxs
UHJvY2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7CisKKyAgICB1bnNpZ25lZCBwcm9w
ZXJ0eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKKyAgICAgICAgU3R5bGVQcm9wZXJ0
eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5QXQo
aSk7CisgICAgICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50LmlzSW1wb3J0YW50KCkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGluaGVyaXRlZE9ubHkgJiYgIWN1cnJl
bnQuaXNJbmhlcml0ZWQoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVl
IGlzIGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFwcGx5IGZ1cnRoZXIgbm9uLWlu
aGVyaXRlZCBwcm9wZXJ0aWVzCisgICAgICAgICAgICAvLyBhcyB0aGV5IG1pZ2h0IG92ZXJyaWRl
IHRoZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvbid0IGFsbG93
IGRlY2xhcmF0aW9ucyB3aXRoCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGluaGVyaXRlZCBw
cm9wZXJ0aWVzIHRvIGJlIGNhY2hlZC4KKyAgICAgICAgICAgIEFTU0VSVCghY3VycmVudC52YWx1
ZSgpLT5pc0luaGVyaXRlZFZhbHVlKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1cnJlbnQuaWQoKTsKKworICAg
ICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9u
ICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkp
CisgICAgICAgICAgICBjb250aW51ZTsKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgICAg
IGlmIChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RDdWUgJiYgIVN0
eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworI2VuZGlmCisgICAgICAgIHN3aXRjaCAocGFzcykgeworI2lmIEVOQUJM
RShDU1NfVkFSSUFCTEVTKQorICAgICAgICBjYXNlIFZhcmlhYmxlRGVmaW5pdGlvbnM6CisgICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlhYmxlIDwgZmlyc3RDU1NQcm9w
ZXJ0eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9wZXJ0eSk7CisgICAgICAgICAg
ICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKKyAgICAgICAgICAgICAgICBh
cHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAg
IGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgSGlnaFByaW9yaXR5UHJvcGVydGllczoKKyAg
ICAgICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVydHkgPT0gQ1NTUHJvcGVydHlD
b2xvciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKKyAgICAgICAgICAgIENPTVBJTEVf
QVNTRVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNvbG9yICsgMTcsIENTU196b29t
X2lzX2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsKKyAgICAgICAgICAgIENPTVBJTEVfQVNTRVJU
KENTU1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpvb20gKyAxLCBDU1NfbGluZV9o
ZWlnaHRfaXNfYWZ0ZXJfem9vbSk7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgICAg
ICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZ2l2ZSBzcGVjaWFsIHByaW9yaXR5
IHRvIGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKKyAgICAgICAgICAgIGlmIChwcm9w
ZXJ0eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkKKyAgICAgICAgICAgICAgICBhcHBseVByb3Bl
cnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAgIC8vIHdlIGFw
cGx5IGxpbmUtaGVpZ2h0IGxhdGVyCisgICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBD
U1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zZXRMaW5lSGVp
Z2h0VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIExvd1ByaW9yaXR5UHJvcGVydGllczoKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA+IENT
U1Byb3BlcnR5TGluZUhlaWdodCkKKyAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJl
bnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tpZSk7Cit9CisKK3RlbXBsYXRl
IDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgordm9pZCBTdHlsZVJl
c29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJl
c3VsdCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9v
bCBpbmhlcml0ZWRPbmx5KQoreworICAgIGlmIChzdGFydEluZGV4ID09IC0xKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGlmIChzdGF0ZS5zdHls
ZSgpLT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgeworICAgICAgICBmb3IgKGludCBp
ID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBN
YXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllc1tpXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBtYXRj
aGVkUHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOworICAgICAgICAgICAgLy8gRklYTUU6IEl0IHdv
dWxkIGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRzIGJ1dCB0aGF0IHJlcXVpcmVz
IGNoYW5nZXMgaW4gbWFueSBwbGFjZXMuCisgICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hM
aW5rKTsKKyAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5
bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hWaXNpdGVkKTsKKworICAg
ICAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRp
ZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVy
aXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3Bl
cnRpZXMud2hpdGVsaXN0VHlwZSkpOworICAgICAgICB9CisgICAgICAgIHN0YXRlLnNldEFwcGx5
UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsKKyAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgeworICAgICAg
ICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllc1tpXTsKKyAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1h
dGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxl
c1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hp
dGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOworICAgIH0KK30K
KwordW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChj
b25zdCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAg
ICAKKyAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KHByb3BlcnRpZXMsIHNpemVv
ZihNYXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsKK30KKworYm9vbCBvcGVyYXRvcj09KGNvbnN0
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRj
aFJhbmdlcyYgYikKK3sKKyAgICByZXR1cm4gYS5maXJzdFVBUnVsZSA9PSBiLmZpcnN0VUFSdWxl
CisgICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1bGUKKyAgICAgICAgJiYgYS5m
aXJzdEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKKyAgICAgICAgJiYgYS5sYXN0QXV0
aG9yUnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCisgICAgICAgICYmIGEuZmlyc3RVc2VyUnVsZSA9
PSBiLmZpcnN0VXNlclJ1bGUKKyAgICAgICAgJiYgYS5sYXN0VXNlclJ1bGUgPT0gYi5sYXN0VXNl
clJ1bGU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJh
bmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCit7CisgICAgcmV0
dXJuICEoYSA9PSBiKTsKK30KKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6
Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVy
dGllcyYgYikKK3sKKyAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09IGIucHJvcGVydGllcyAmJiBh
LmxpbmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOworfQorCitib29sIG9wZXJhdG9yIT0o
Y29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVz
b2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQoreworICAgIHJldHVybiAhKGEgPT0gYik7Cit9
CisKK2NvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBTdHls
ZVJlc29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwg
Y29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQoreworICAgIEFTU0VSVChoYXNoKTsKKwor
ICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVy
dGllc0NhY2hlLmZpbmQoaGFzaCk7CisgICAgaWYgKGl0ID09IG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZS5lbmQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZUl0ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsKKworICAgIHNpemVfdCBzaXplID0gbWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChzaXplICE9IGNhY2hlSXRl
bS5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGlmIChtYXRjaFJlc3VsdC5t
YXRjaGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXNbaV0pCisg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGNhY2hlSXRlbS5yYW5nZXMgIT0g
bWF0Y2hSZXN1bHQucmFuZ2VzKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gJmNhY2hl
SXRlbTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKK3sKKyAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNC
ZXR3ZWVuU3dlZXBzID0gMTAwOworICAgIGlmICgrK21fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFk
ZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25z
QmV0d2VlblN3ZWVwcworICAgICAgICAmJiAhbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBU
aW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVk
RGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYwOworICAgICAgICBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hvdChtYXRjaGVkRGVjbGFyYXRp
b25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7CisgICAgfQorCisgICAgQVNTRVJUKGhhc2gpOwor
ICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRlbTsKKyAgICBjYWNoZUl0ZW0u
bWF0Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzKTsK
KyAgICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFuZ2VzOworICAgIC8vIE5vdGUg
dGhhdCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVyU3R5bGUgaW5zdGFuY2UuIEl0
IG1heSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgorICAgIC8vIFRoZSBSZW5kZXJTdHlsZSBpbiB0aGUg
Y2FjaGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBzdWJzdHJ1Y3R1cmVzIGFuZCBu
ZXZlciB1c2VkIGFzLWlzLgorICAgIGNhY2hlSXRlbS5yZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxl
OjpjbG9uZShzdHlsZSk7CisgICAgY2FjaGVJdGVtLnBhcmVudFJlbmRlclN0eWxlID0gUmVuZGVy
U3R5bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUu
YWRkKGhhc2gsIGNhY2hlSXRlbSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6aW52YWxpZGF0
ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQoreworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZS5jbGVhcigpOworfQorCitzdGF0aWMgYm9vbCBpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUs
IGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICAvLyBGSVhNRTogQ1NTUHJv
cGVydHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3aGVuIGFwcGx5aW5nIHRvIGRv
Y3VtZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5aW5nIGJ5IGNhY2hpbmcuCisg
ICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkg
JiYgZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT51bmlxdWUoKSB8fCAoc3R5
bGUtPnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0eWxlLT51bmlxdWUoKSkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+em9vbSgpICE9IFJlbmRlclN0eWxl
Ojppbml0aWFsWm9vbSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT53
cml0aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3JpdGluZ01vZGUoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIC8vIFRoZSBjYWNoZSBhc3N1bWVzIHN0YXRpYyBrbm93bGVk
Z2UgYWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkLgorICAgIGlmIChwYXJlbnRT
dHlsZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5
TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBF
bGVtZW50KiBlbGVtZW50KQoreworICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICBTdGF0ZSYgc3Rh
dGUgPSBtX3N0YXRlOworICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IG1hdGNoUmVzdWx0LmlzQ2Fj
aGVhYmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkg
OiAwOworICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7CisgICAgaWYgKGNhY2hlSGFz
aCAmJiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNhY2hlSGFz
aCwgbWF0Y2hSZXN1bHQpKSkgeworICAgICAgICAvLyBXZSBjYW4gYnVpbGQgdXAgdGhlIHN0eWxl
IGJ5IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gYW4gZWFybGllciBzdHls
ZSBvYmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKKyAgICAgICAgLy8gc3R5bGUgZGVj
bGFyYXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0aGUgaW5oZXJpdGVkIHByb3Bl
cnRpZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBlbmQgb24gdGhlIAorICAgICAg
ICAvLyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQgc2F2ZXMgbWVtb3J5IGJ5IHJl
dXNpbmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+
Y29weU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7CisgICAg
ICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWREYXRhU2hhcmVkKGNhY2hlSXRl
bS0+cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVu
dCkpIHsKKyAgICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0dXMgPSBzdGF0ZS5zdHlsZSgp
LT5pbnNpZGVMaW5rKCk7CisgICAgICAgICAgICAvLyBJZiB0aGUgY2FjaGUgaXRlbSBwYXJlbnQg
c3R5bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBw
YXJlbnQgc3R5bGUgdGhlbiB0aGUKKyAgICAgICAgICAgIC8vIHJlc3VsdGluZyBzdHlsZSB3aWxs
IGJlIGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG92ZXIg
ZnJvbSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
aW5oZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7CisKKyAgICAgICAgICAg
IC8vIFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmhl
cml0ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSByZXN0b3JlIGl0LgorICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdHVzKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSB0cnVl
OyAKKyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAvLyBGaXJzdCBhcHBs
eSBhbGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5IGJlIHVzZWQgZHVyaW5nIGFw
cGxpY2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMuCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
czxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAg
YXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwg
dHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNo
UmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJS
dWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFy
aWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5m
aXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVk
T25seSk7CisjZW5kaWYKKworICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgbWF0Y2hlZCBy
dWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhlIHJ1bGVzIGFuZCBhcHBseQor
ICAgIC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwgaS5lLiwgdGhvc2UgcHJvcGVy
dGllcyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgorICAgIC8vIFRoZSBvcmRlciBp
cyAoMSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikgaGlnaC1wcmlvcml0eSBpbXBv
cnRhbnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFudAorICAgIC8vIGFuZCAoNCkgbm9ybWFsIGlt
cG9ydGFudC4KKyAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2Us
IDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJp
dGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0
aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkp
OworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0
Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJl
c3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRy
dWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxh
c3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisKKyAgICBpZiAoY2FjaGVJdGVtICYmIGNh
Y2hlSXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSBzdGF0ZS5zdHlsZSgpLT5l
ZmZlY3RpdmVab29tKCkpIHsKKyAgICAgICAgc3RhdGUuc2V0Rm9udERpcnR5KHRydWUpOworICAg
ICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiBvdXIg
Zm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRl
Rm9udCgpOworCisgICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2Ug
ZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgorICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUo
KSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxp
bmVIZWlnaHRWYWx1ZSgpKTsKKworICAgIC8vIE1hbnkgcHJvcGVydGllcyBkZXBlbmQgb24gdGhl
IGZvbnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwgcHJvcGVydGllcy4KKyAgICBp
ZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmZvbnREZXNjcmlwdGlvbigp
ICE9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQorICAgICAgICBhcHBseUluaGVy
aXRlZE9ubHkgPSBmYWxzZTsKKworICAgIC8vIE5vdyBkbyB0aGUgbm9ybWFsIHByaW9yaXR5IFVB
IHByb3BlcnRpZXMuCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3Bl
cnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxl
LCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAg
ICAKKyAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3JvdW5kIHNvIHRoYXQgd2UgY2Fu
IGV4YW1pbmUgdGhlbSBsYXRlci4KKyAgICBzdGF0ZS5jYWNoZUJvcmRlckFuZEJhY2tncm91bmQo
KTsKKyAgICAKKyAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQgdXNlciBub3JtYWwgcHJpb3Jp
dHkgcHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHByb3BlcnRpZXMuCisgICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBm
YWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAxLCBtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1
bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQ
cmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMu
Zmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRl
ZE9ubHkpOworICAgCisgICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBi
eSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisgICAgCisgICAgQVNT
RVJUKCFzdGF0ZS5mb250RGlydHkoKSk7CisgICAgCisgICAgaWYgKGNhY2hlSXRlbSB8fCAhY2Fj
aGVIYXNoKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFpc0NhY2hlYWJsZUluTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVu
dFN0eWxlKCkpKQorICAgICAgICByZXR1cm47CisgICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0Nh
Y2hlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hS
ZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBT
dHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCit7CisgICAgcmV0dXJu
IHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmlj
aXR5KCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0
UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBpZiAoIXJ1bGVzKQorICAgICAg
ICByZXR1cm47CisKKyAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7
CisgICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdl
UnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKKyAgICBpZiAobWF0
Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0ZDo6c3Rh
YmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgp
LCBjb21wYXJlUGFnZVJ1bGVzKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRj
aGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhy
ZXN1bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Cit9CisKK3N0YXRpYyBi
b29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0
b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdl
TmFtZSkKK3sKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3Rv
cjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAg
ICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAg
ICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFt
ZSgpLmxvY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAm
JiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisKKyAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9
IGNvbXBvbmVudC0+cHNldWRvVHlwZSgpOworICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NT
U2VsZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQorICAgICAgICAgICAgfHwg
KHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdl
KQorICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0
UGFnZSAmJiAhaXNGaXJzdFBhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1h
dGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNM
ZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAg
U3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOworCisgICAgICAgIGlmICghY2hlY2tQYWdl
U2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQ
YWdlLCBwYWdlTmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiB0
aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCisgICAg
ICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVz
KCk7CisgICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBs
aXN0IG9mIG1hdGNoZWQgcnVsZXMuCisgICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7
CisgICAgfQorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRl
eCkgY29uc3QKK3sKKyAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9IGZhbHNlOworICAgIGlmICgh
bV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAg
ICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKKworICAgIHJldHVybiAocGFnZUluZGV4ICsg
KGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6
OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEluIGNh
c2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2Fu
IGJlIHRoZSBmaXJzdCBwYWdlLgorICAgIHJldHVybiAoIXBhZ2VJbmRleCk7Cit9CisKK1N0cmlu
ZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAorewor
ICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4K
KyAgICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRv
U3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBSZW5kZXJTdHlsZSogc3R5
bGUpCit7CisgICAgaW5pdEVsZW1lbnQoMCk7CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNv
bHZlKGRvY3VtZW50KCksIDAsIHN0eWxlKTsKKyAgICBtX3N0YXRlLnNldFN0eWxlKHN0eWxlKTsK
KyAgICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZhbHVlKTsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCBp
ZCwgQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgYXBwbHlQcm9w
ZXJ0eShpZCwgdmFsdWUpOworfQorCitpbmxpbmUgYm9vbCBpc1ZhbGlkVmlzaXRlZExpbmtQcm9w
ZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0
b21Db2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU91dGxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VGV4dFN0cm9rZUNvbG9yOgorI2lmIEVOQUJMRShTVkcpCisgICAgY2FzZSBDU1NQcm9wZXJ0
eUZpbGw6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVN0cm9rZToKKyNlbmRpZgorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKKy8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtcmVnaW9ucy8j
dGhlLWF0LXJlZ2lvbi1zdHlsZS1ydWxlCisvLyBGSVhNRTogYWRkIGluY3JlbWVudGFsIHN1cHBv
cnQgZm9yIG90aGVyIHJlZ2lvbiBzdHlsaW5nIHByb3BlcnRpZXMuCitpbmxpbmUgYm9vbCBTdHls
ZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQor
eworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQoraW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNW
YWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlk
KSB7CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRBdHRhY2htZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xp
cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmln
aW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dy
b3VuZFBvc2l0aW9uWToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRT
aXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUZvbnRWYXJpYW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29s
b3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eU91dGxpbmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNw
YWNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5VGV4dFNoYWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3R5bGU6CisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKy8vIFNWRyBoYW5kbGVzIHpvb21pbmcgaW4gYSBk
aWZmZXJlbnQgd2F5IGNvbXBhcmVkIHRvIENTUy4gVGhlIHdob2xlIGRvY3VtZW50IGlzIHNjYWxl
ZCBpbnN0ZWFkCisvLyBvZiBlYWNoIGluZGl2aWR1YWwgbGVuZ3RoIHZhbHVlIGluIHRoZSByZW5k
ZXIgc3R5bGUgLyB0cmVlLiBDU1NQcmltaXRpdmVWYWx1ZTo6Y29tcHV0ZUxlbmd0aCooKQorLy8g
bXVsdGlwbGllcyBlYWNoIHJlc29sdmVkIGxlbmd0aCB3aXRoIHRoZSB6b29tIG11bHRpcGxpZXIg
LSBzbyBmb3IgU1ZHIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGF0LgorLy8gVGhvdWdoIGFsbCBDU1Mg
dmFsdWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gb3V0ZXJtb3N0IDxzdmc+IGVsZW1lbnRzICh3
aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcuLi4pCisvLyBuZWVkIHRvIHJlc3BlY3QgdGhlIHNj
YWxpbmcuIFJlbmRlckJveCAodGhlIHBhcmVudCBjbGFzcyBvZiBSZW5kZXJTVkdSb290KSBncmFi
cyB2YWx1ZXMgbGlrZQorLy8gd2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5nLy4uLiBmcm9tIHRo
ZSBSZW5kZXJTdHlsZSAtPiBmb3IgU1ZHIHRoZXNlIHZhbHVlcyB3b3VsZCBuZXZlciBzY2FsZSwK
Ky8vIGlmIHdlJ2QgcGFzcyBhIDEuMCB6b29tIGZhY3RvciBldmVyeWh3ZXJlLiBTbyB3ZSBvbmx5
IHBhc3MgYSB6b29tIGZhY3RvciBvZiAxLjAgZm9yIHNwZWNpZmljCisvLyBwcm9wZXJ0aWVzIHRo
YXQgYXJlIE5PVCBhbGxvd2VkIHRvIHNjYWxlIHdpdGhpbiBhIHpvb21lZCBTVkcgZG9jdW1lbnQg
KGxldHRlci93b3JkLXNwYWNpbmcvZm9udC1zaXplKS4KK2Jvb2wgU3R5bGVSZXNvbHZlcjo6dXNl
U1ZHWm9vbVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCkgJiYgbV9zdGF0
ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlk
VHJhY2tCcmVhZHRoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5
bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBMZW5ndGgmIHdvcmtpbmdMZW5ndGgpCit7CisgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlV2Via2l0TWluQ29udGVu
dCkgeworICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3RoKE1pbkNvbnRlbnQpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkgPT0gQ1NTVmFsdWVXZWJraXRNYXhDb250ZW50KSB7CisgICAgICAgIHdvcmtpbmdMZW5ndGgg
PSBMZW5ndGgoTWF4Q29udGVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IHdvcmtpbmdMZW5ndGggPSBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50
ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNv
bnZlcnNpb24gfCBBdXRvQ29udmVyc2lvbj4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1l
bnRTdHlsZSgpLCBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOworICAgIGlmICh3b3Jr
aW5nTGVuZ3RoLmlzVW5kZWZpbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgd29ya2luZ0xlbmd0aC5zZXRR
dWlyayhwcmltaXRpdmVWYWx1ZS0+aXNRdWlya1ZhbHVlKCkpOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja01pbk1heChDU1NQcmltaXRpdmVWYWx1
ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgR3Jp
ZFRyYWNrU2l6ZSYgdHJhY2tTaXplKQoreworICAgIFBhaXIqIG1pbk1heFRyYWNrQnJlYWR0aCA9
IHByaW1pdGl2ZVZhbHVlLT5nZXRQYWlyVmFsdWUoKTsKKyAgICBpZiAoIW1pbk1heFRyYWNrQnJl
YWR0aCkgeworICAgICAgICBMZW5ndGggd29ya2luZ0xlbmd0aDsKKyAgICAgICAgaWYgKCFjcmVh
dGVHcmlkVHJhY2tCcmVhZHRoKHByaW1pdGl2ZVZhbHVlLCBzdGF0ZSwgd29ya2luZ0xlbmd0aCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdHJhY2tTaXplLnNldExlbmd0
aCh3b3JraW5nTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgTGVu
Z3RoIG1pblRyYWNrQnJlYWR0aDsKKyAgICBMZW5ndGggbWF4VHJhY2tCcmVhZHRoOworICAgIGlm
ICghY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFkdGgtPmZpcnN0KCksIHN0
YXRlLCBtaW5UcmFja0JyZWFkdGgpIHx8ICFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRy
YWNrQnJlYWR0aC0+c2Vjb25kKCksIHN0YXRlLCBtYXhUcmFja0JyZWFkdGgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICB0cmFja1NpemUuc2V0TWluTWF4KG1pblRyYWNrQnJlYWR0aCwg
bWF4VHJhY2tCcmVhZHRoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY3Jl
YXRlR3JpZFRyYWNrR3JvdXAoQ1NTVmFsdWUqIHZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpT
dGF0ZSYgc3RhdGUsIFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcykKK3sKKyAgICBp
ZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBm
b3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5j
ZSgpKSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAg
IGlmICghY3VyclZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgR3JpZFRyYWNrU2l6ZSB0cmFja1NpemU7CisgICAgICAgIGlmICgh
Y3JlYXRlR3JpZFRyYWNrTWluTWF4KHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oY3Vy
clZhbHVlKSwgc3RhdGUsIHRyYWNrU2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgdHJhY2tTaXplcy5hcHBlbmQodHJhY2tTaXplKTsKKyAgICB9CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0xpc3QoQ1NTVmFsdWUqIHZh
bHVlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6OlN0YXRlJiBzdGF0ZSkKK3sKKyAgICAvLyBIYW5kbGUgJ25vbmUnLgorICAgIGlmICh2YWx1
ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmlt
aXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAg
ICAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lOwor
ICAgIH0KKworICAgIHJldHVybiBjcmVhdGVHcmlkVHJhY2tHcm91cCh2YWx1ZSwgc3RhdGUsIHRy
YWNrU2l6ZXMpOworfQorCisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRQb3NpdGlvbihDU1NWYWx1
ZSogdmFsdWUsIEdyaWRQb3NpdGlvbiYgcG9zaXRpb24pCit7CisgICAgLy8gRm9yIG5vdywgd2Ug
b25seSBhY2NlcHQ6IDxpbnRlZ2VyPiB8ICdhdXRvJworICAgIGlmICghdmFsdWUtPmlzUHJpbWl0
aXZlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1
ZSk7CisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNB
VElPTihwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSk7CisgICAgcG9zaXRpb24uc2V0SW50ZWdl
clBvc2l0aW9uKHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorc3RhdGljIGJvb2wgaGFzVmFyaWFi
bGVSZWZlcmVuY2UoQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAgICByZXR1cm4g
cHJpbWl0aXZlVmFsdWUtPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7CisgICAgfQorCisgICAgaWYg
KHZhbHVlLT5pc0NhbGN1bGF0aW9uVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PENTU0NhbGNWYWx1ZSo+KHZhbHVlKS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKKworICAgIGlm
ICh2YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkgeworICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJl
ZmxlY3RWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKKyAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGRpcmVjdGlvbiA9IHJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9u
KCk7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBvZmZzZXQgPSByZWZsZWN0VmFsdWUtPm9m
ZnNldCgpOworICAgICAgICBDU1NWYWx1ZSogbWFzayA9IHJlZmxlY3RWYWx1ZS0+bWFzaygpOwor
ICAgICAgICByZXR1cm4gKGRpcmVjdGlvbiAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShkaXJlY3Rp
b24pKSB8fCAob2Zmc2V0ICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKG9mZnNldCkpIHx8IChtYXNr
ICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKG1hc2spKTsKKyAgICB9CisKKyAgICBmb3IgKENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Cisg
ICAgICAgIGlmIChoYXNWYXJpYWJsZVJlZmVyZW5jZShpLnZhbHVlKCkpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OnJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZh
bHVlLCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHBy
ZXNzaW9ucykKK3sKKyAgICBzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiBleHByZXNz
aW9uKGlkLCB2YWx1ZS0+c2VyaWFsaXplUmVzb2x2aW5nVmFyaWFibGVzKCptX3N0YXRlLnN0eWxl
KCktPnZhcmlhYmxlcygpKSk7CisKKyAgICBpZiAoa25vd25FeHByZXNzaW9ucy5jb250YWlucyhl
eHByZXNzaW9uKSkKKyAgICAgICAgcmV0dXJuOyAvLyBjeWNsZSBkZXRlY3RlZC4KKworICAgIGtu
b3duRXhwcmVzc2lvbnMuYXBwZW5kKGV4cHJlc3Npb24pOworCisgICAgLy8gRklYTUU6IEl0IHdv
dWxkIGJlIGZhc3RlciBub3QgdG8gcmUtcGFyc2UgZnJvbSBzdHJpbmdzLCBidXQgZm9yIG5vdyBD
U1MgcHJvcGVydHkgdmFsaWRhdGlvbiBsaXZlcyBpbnNpZGUgdGhlIHBhcnNlciBzbyB3ZSBkbyBp
dCB0aGVyZS4KKyAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcmVzdWx0U2V0ID0gU3R5bGVQ
cm9wZXJ0eVNldDo6Y3JlYXRlKCk7CisgICAgaWYgKCFDU1NQYXJzZXI6OnBhcnNlVmFsdWUocmVz
dWx0U2V0LmdldCgpLCBpZCwgZXhwcmVzc2lvbi5zZWNvbmQsIGZhbHNlLCBkb2N1bWVudCgpKSkK
KyAgICAgICAgcmV0dXJuOyAvLyBleHByZXNzaW9uIGZhaWxlZCB0byBwYXJzZS4KKworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCByZXN1bHRTZXQtPnByb3BlcnR5Q291bnQoKTsgaSsrKSB7
CisgICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIHByb3BlcnR5ID0g
cmVzdWx0U2V0LT5wcm9wZXJ0eUF0KGkpOworICAgICAgICBpZiAocHJvcGVydHkuaWQoKSAhPSBD
U1NQcm9wZXJ0eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHByb3BlcnR5LnZhbHVl
KCkpKQorICAgICAgICAgICAgcmVzb2x2ZVZhcmlhYmxlcyhwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0
eS52YWx1ZSgpLCBrbm93bkV4cHJlc3Npb25zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
YXBwbHlQcm9wZXJ0eShwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0eS52YWx1ZSgpKTsKKyAgICB9Cit9
CisjZW5kaWYKKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5KENTU1Byb3BlcnR5
SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAg
ICBpZiAoaWQgIT0gQ1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZSh2
YWx1ZSkpIHsKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+
ID4ga25vd25FeHByZXNzaW9uczsKKyAgICAgICAgcmVzb2x2ZVZhcmlhYmxlcyhpZCwgdmFsdWUs
IGtub3duRXhwcmVzc2lvbnMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAg
ICAvLyBDU1MgdmFyaWFibGVzIGRvbid0IHJlc29sdmUgc2hvcnRoYW5kcyBhdCBwYXJzaW5nIHRp
bWUsIHNvIHRoaXMgc2hvdWxkIGJlICphZnRlciogaGFuZGxpbmcgdmFyaWFibGVzLgorICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UoIWlzRXhwYW5kZWRTaG9ydGhhbmQoaWQpLCAiU2hvcnRoYW5kIHBy
b3BlcnR5IGlkID0gJWQgd2Fzbid0IGV4cGFuZGVkIGF0IHBhcnNpbmcgdGltZSIsIGlkKTsKKwor
ICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgYm9vbCBpc0luaGVyaXQgPSBzdGF0ZS5w
YXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUoKTsKKyAgICBib29sIGlzSW5p
dGlhbCA9IHZhbHVlLT5pc0luaXRpYWxWYWx1ZSgpIHx8ICghc3RhdGUucGFyZW50Tm9kZSgpICYm
IHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpOworCisgICAgQVNTRVJUKCFpc0luaGVyaXQgfHwg
IWlzSW5pdGlhbCk7IC8vIGlzSW5oZXJpdCAtPiAhaXNJbml0aWFsICYmIGlzSW5pdGlhbCAtPiAh
aXNJbmhlcml0CisgICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgKHN0YXRlLnBhcmVudE5vZGUoKSAm
JiBzdGF0ZS5wYXJlbnRTdHlsZSgpKSk7IC8vIGlzSW5oZXJpdCAtPiAoc3RhdGUucGFyZW50Tm9k
ZSgpICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpCisKKyAgICBpZiAoIXN0YXRlLmFwcGx5UHJvcGVy
dHlUb1JlZ3VsYXJTdHlsZSgpICYmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtT
dHlsZSgpIHx8ICFpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShpZCkpKSB7CisgICAgICAgIC8v
IExpbWl0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gb25seSB0aGUgb25l
cyBob25vcmVkIGJ5IDp2aXNpdGVkLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYg
KGlzSW5oZXJpdCAmJiAhc3RhdGUucGFyZW50U3R5bGUoKS0+aGFzRXhwbGljaXRseUluaGVyaXRl
ZFByb3BlcnRpZXMoKSAmJiAhQ1NTUHJvcGVydHk6OmlzSW5oZXJpdGVkUHJvcGVydHkoaWQpKQor
ICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRIYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJv
cGVydGllcygpOworCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgaWYgKGlkID09IENT
U1Byb3BlcnR5VmFyaWFibGUpIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElD
QVRJT04odmFsdWUtPmlzVmFyaWFibGVWYWx1ZSgpKTsKKyAgICAgICAgQ1NTVmFyaWFibGVWYWx1
ZSogdmFyaWFibGUgPSBzdGF0aWNfY2FzdDxDU1NWYXJpYWJsZVZhbHVlKj4odmFsdWUpOworICAg
ICAgICBBU1NFUlQoIXZhcmlhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJU
KCF2YXJpYWJsZS0+dmFsdWUoKS5pc0VtcHR5KCkpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRWYXJpYWJsZSh2YXJpYWJsZS0+bmFtZSgpLCB2YXJpYWJsZS0+dmFsdWUoKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIENoZWNrIGxvb2t1cCB0YWJsZSBmb3Ig
aW1wbGVtZW50YXRpb25zIGFuZCB1c2Ugd2hlbiBhdmFpbGFibGUuCisgICAgY29uc3QgUHJvcGVy
dHlIYW5kbGVyJiBoYW5kbGVyID0gbV9zdHlsZUJ1aWxkZXIucHJvcGVydHlIYW5kbGVyKGlkKTsK
KyAgICBpZiAoaGFuZGxlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkKKyAg
ICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbmhlcml0VmFsdWUoaWQsIHRoaXMpOworICAgICAgICBl
bHNlIGlmIChpc0luaXRpYWwpCisgICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5pdGlhbFZhbHVl
KGlkLCB0aGlzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGFuZGxlci5hcHBseVZhbHVl
KGlkLCB0aGlzLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSB2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpID8g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSkgOiAwOworCisgICAgZmxvYXQg
em9vbUZhY3RvciA9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIFdo
YXQgZm9sbG93cyBpcyBhIGxpc3QgdGhhdCBtYXBzIHRoZSBDU1MgcHJvcGVydGllcyBpbnRvIHRo
ZWlyIGNvcnJlc3BvbmRpbmcgZnJvbnQtZW5kCisgICAgLy8gUmVuZGVyU3R5bGUgdmFsdWVzLgor
ICAgIHN3aXRjaCAoaWQpIHsKKyAgICAvLyBsaXN0cworICAgIGNhc2UgQ1NTUHJvcGVydHlDb250
ZW50OgorICAgICAgICAvLyBsaXN0IG9mIHN0cmluZywgdXJpLCBjb3VudGVyLCBhdHRyLCBpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJbiBDU1MzLCBpdCB3aWxsIGJlIHBvc3Np
YmxlIHRvIGluaGVyaXQgY29udGVudC4gSW4gQ1NTMiBpdCBpcyBub3QuIFRoaXMKKyAgICAgICAg
ICAgIC8vIG5vdGUgaXMgYSByZW1pbmRlciB0aGF0IGV2ZW50dWFsbHkgImluaGVyaXQiIG5lZWRz
IHRvIGJlIHN1cHBvcnRlZC4KKworICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmNsZWFyQ29udGVudCgpOworICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1
ZUxpc3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGJvb2wgZGlk
U2V0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2
YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgICAgICAgICAgQ1NTVmFs
dWUqIGl0ZW0gPSBpLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzSW1hZ2VH
ZW5lcmF0b3JWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0dyYWRp
ZW50VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENv
bnRlbnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRpY19jYXN0PENTU0dyYWRpZW50
VmFsdWUqPihpdGVtKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpLCBk
aWRTZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShz
dGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAg
ICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VU
KQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+aXNJbWFnZVNldFZhbHVlKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChzZXRPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZh
bHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVl
OworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0t
PmlzSW1hZ2VWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dENvbnRlbnQoY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3Rh
dGljX2Nhc3Q8Q1NTSW1hZ2VWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIGNvbnRlbnRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oaXRlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0
cmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
Y29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgZGlkU2V0KTsKKyAgICAgICAg
ICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNv
bnRlbnRWYWx1ZS0+aXNBdHRyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IENh
biBhIG5hbWVzcGFjZSBiZSBzcGVjaWZpZWQgZm9yIGFuIGF0dHIoZm9vKT8KKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPKQorICAg
ICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7CisgICAgICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhcmVudFN0
eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIGF0
dHIobnVsbEF0b20sIGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIG51bGxB
dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0
YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGF0dHIpOworICAgICAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KHZhbHVlLmlzTnVsbCgpID8gZW1wdHlBdG9tIDogdmFs
dWUuaW1wbCgpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgZmFjdCB0aGF0IHRoZSBhdHRyaWJ1
dGUgdmFsdWUgYWZmZWN0cyB0aGUgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgbV9ydWxlU2V0
cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxlcy5hZGQoYXR0ci5sb2NhbE5hbWUoKS5pbXBsKCkpOwor
ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFZhbHVlLT5pc0NvdW50ZXIoKSkgewor
ICAgICAgICAgICAgICAgICAgICBDb3VudGVyKiBjb3VudGVyVmFsdWUgPSBjb250ZW50VmFsdWUt
PmdldENvdW50ZXJWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBFTGlzdFN0eWxlVHlwZSBs
aXN0U3R5bGVUeXBlID0gTm9uZUxpc3RTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxp
c3RTdHlsZUlkZW50ID0gY291bnRlclZhbHVlLT5saXN0U3R5bGVJZGVudCgpOworICAgICAgICAg
ICAgICAgICAgICBpZiAobGlzdFN0eWxlSWRlbnQgIT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAg
ICAgICAgICAgICAgICAgbGlzdFN0eWxlVHlwZSA9IHN0YXRpY19jYXN0PEVMaXN0U3R5bGVUeXBl
PihsaXN0U3R5bGVJZGVudCAtIENTU1ZhbHVlRGlzYyk7CisgICAgICAgICAgICAgICAgICAgIE93
blB0cjxDb3VudGVyQ29udGVudD4gY291bnRlciA9IGFkb3B0UHRyKG5ldyBDb3VudGVyQ29udGVu
dChjb3VudGVyVmFsdWUtPmlkZW50aWZpZXIoKSwgbGlzdFN0eWxlVHlwZSwgY291bnRlclZhbHVl
LT5zZXBhcmF0b3IoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRD
b250ZW50KGNvdW50ZXIucmVsZWFzZSgpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBk
aWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
ICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGNhc2UgQ1NTVmFsdWVPcGVuUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRDb250ZW50KE9QRU5fUVVPVEUsIGRpZFNldCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVDbG9zZVF1b3RlOgorICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChDTE9TRV9RVU9URSwgZGlk
U2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5v
T3BlblF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29u
dGVudChOT19PUEVOX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlk
U2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgICAgICBjYXNlIENTU1ZhbHVlTm9DbG9zZVF1b3RlOgorICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChOT19DTE9TRV9RVU9URSwgZGlkU2V0KTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIG5vcm1hbCBhbmQgbm9uZSBkbyBub3QgaGF2ZSBhbnkgZWZmZWN0LgorICAg
ICAgICAgICAgICAgICAgICAgICAgeyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRpZFNldCkKKyAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlRdW90ZXM6CisgICAgICAgIGlm
IChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhzdGF0
ZS5wYXJlbnRTdHlsZSgpLT5xdW90ZXMoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0UXVvdGVzKDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlm
ICh2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0
ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOworICAgICAgICAgICAgUmVmUHRy
PFF1b3Rlc0RhdGE+IHF1b3RlcyA9IFF1b3Rlc0RhdGE6OmNyZWF0ZSgpOworICAgICAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LT5sZW5ndGgoKTsgaSArPSAyKSB7CisgICAgICAg
ICAgICAgICAgQ1NTVmFsdWUqIGZpcnN0ID0gbGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhp
KTsKKyAgICAgICAgICAgICAgICAvLyBpdGVtKCkgcmV0dXJucyBudWxsIGlmIG91dCBvZiBib3Vu
ZHMgc28gdGhpcyBpcyBzYWZlLgorICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBzZWNvbmQgPSBs
aXN0LT5pdGVtKGkgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlY29uZCkKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJ
VFlfSU1QTElDQVRJT04oZmlyc3QtPmlzUHJpbWl0aXZlVmFsdWUoKSk7CisgICAgICAgICAgICAg
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2Vjb25kLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFF1b3RlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPihmaXJzdCktPmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAg
ICAgICAgU3RyaW5nIGVuZFF1b3RlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihz
ZWNvbmQpLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgIHF1b3Rlcy0+YWRkUGFp
cihzdGQ6Om1ha2VfcGFpcihzdGFydFF1b3RlLCBlbmRRdW90ZSkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHF1b3Rlcyk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7CisgICAg
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKQor
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhRdW90ZXNEYXRhOjpjcmVh
dGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1NTUHJvcGVydHlG
b250RmFtaWx5OiB7CisgICAgICAgIC8vIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgaWRzCisgICAgICAg
IGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBwYXJlbnRGb250
RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAg
ICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgp
LT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5l
cmljRmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkpOworICAgICAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZmly
c3RGYW1pbHkoKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0SXNTcGVjaWZpZWRG
b250KHBhcmVudEZvbnREZXNjcmlwdGlvbi5pc1NwZWNpZmllZEZvbnQoKSk7CisgICAgICAgICAg
ICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBpbml0aWFsRGVzYyA9IEZvbnREZXNjcmlwdGlvbigpOworICAgICAgICAg
ICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnRE
ZXNjcmlwdGlvbigpOworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgdGhlIHNpemUg
dG8gYWNjb3VudCBmb3IgdGhlIGdlbmVyaWMgZmFtaWx5IGNoYW5nZSBmcm9tIG1vbm9zcGFjZQor
ICAgICAgICAgICAgLy8gdG8gbm9uLW1vbm9zcGFjZS4KKyAgICAgICAgICAgIGlmIChmb250RGVz
Y3JpcHRpb24ua2V5d29yZFNpemUoKSAmJiBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0
U2l6ZSgpKQorICAgICAgICAgICAgICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9u
dFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlw
dGlvbi5rZXl3b3JkU2l6ZSgpIC0gMSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRHZW5lcmljRmFtaWx5KGluaXRpYWxEZXNjLmdlbmVyaWNGYW1pbHkoKSk7CisgICAg
ICAgICAgICBpZiAoIWluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkuZmFtaWx5SXNFbXB0eSgpKQor
ICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkoaW5pdGlhbERlc2MuZmly
c3RGYW1pbHkoKSk7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFs
dWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KTsKKyAgICAgICAgRm9udEZhbWlseSYgZmlyc3RGYW1pbHkgPSBmb250RGVzY3JpcHRpb24uZmly
c3RGYW1pbHkoKTsKKyAgICAgICAgRm9udEZhbWlseSogY3VyckZhbWlseSA9IDA7CisKKyAgICAg
ICAgLy8gQmVmb3JlIG1hcHBpbmcgaW4gYSBuZXcgZm9udC1mYW1pbHkgcHJvcGVydHksIHdlIHNo
b3VsZCByZXNldCB0aGUgZ2VuZXJpYyBmYW1pbHkuCisgICAgICAgIGJvb2wgb2xkRmFtaWx5VXNl
ZEZpeGVkRGVmYXVsdFNpemUgPSBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgp
OworICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRp
b246Ok5vRmFtaWx5KTsKKworICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2
YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZSog
aXRlbSA9IGkudmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1
ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIGNvbnRlbnRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRl
bSk7CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgZmFjZTsKKyAgICAgICAgICAgIFNldHRpbmdz
KiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50
VmFsdWUtPmlzU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgZmFjZSA9IGNvbnRlbnRWYWx1ZS0+
Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbmdzKSB7CisgICAg
ICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAg
ICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0Qm9keToKKyAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IHNldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKKyAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNlcmlmOgorICAgICAgICAgICAg
ICAgICAgICBmYWNlID0gc2VyaWZGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHkpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVl
U2Fuc1NlcmlmOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2Fuc1NlcmlmRmFtaWx5Owor
ICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250
RGVzY3JpcHRpb246OlNhbnNTZXJpZkZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVDdXJzaXZlOgorICAgICAgICAgICAgICAg
ICAgICBmYWNlID0gY3Vyc2l2ZUZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpDdXJzaXZlRmFtaWx5KTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZUZhbnRhc3k6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBmYW50YXN5RmFtaWx5OworICAg
ICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVz
Y3JpcHRpb246OkZhbnRhc3lGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTW9ub3NwYWNlOgorICAgICAgICAgICAgICAgICAg
ICBmYWNlID0gbW9ub3NwYWNlRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSk7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVXZWJraXRQaWN0b2dyYXBoOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gcGljdG9ncmFw
aEZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNG
YW1pbHkoRm9udERlc2NyaXB0aW9uOjpQaWN0b2dyYXBoRmFtaWx5KTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIWZhY2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjdXJyRmFt
aWx5KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGxpbmcgaW4gdGhlIGZpcnN0IGZhbWls
eS4KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuc2V0RmFtaWx5KGZhY2UpOworICAg
ICAgICAgICAgICAgICAgICBmaXJzdEZhbWlseS5hcHBlbmRGYW1pbHkoMCk7IC8vIFJlbW92ZSBh
bnkgaW5oZXJpdGVkIGZhbWlseS1mYWxsYmFjayBsaXN0LgorICAgICAgICAgICAgICAgICAgICBj
dXJyRmFtaWx5ID0gJmZpcnN0RmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0SXNTcGVjaWZpZWRGb250KGZvbnREZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkg
PT0gRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFNoYXJlZEZvbnRGYW1pbHk+IG5ld0ZhbWlseSA9
IFNoYXJlZEZvbnRGYW1pbHk6OmNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdGYW1p
bHktPnNldEZhbWlseShmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseS0+YXBw
ZW5kRmFtaWx5KG5ld0ZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSBu
ZXdGYW1pbHkuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCB1c2VGaXhlZERlZmF1bHRTaXplKCkgdW50
aWwgYWxsIG5ldyBmb250IGZhbWlsaWVzIGhhdmUgYmVlbiBhZGRlZAorICAgICAgICAvLyBJZiBj
dXJyRmFtaWx5IGlzIG5vbi16ZXJvIHRoZW4gd2Ugc2V0IGF0IGxlYXN0IG9uZSBmYW1pbHkgb24g
dGhpcyBkZXNjcmlwdGlvbi4KKyAgICAgICAgaWYgKGN1cnJGYW1pbHkpIHsKKyAgICAgICAgICAg
IGlmIChmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAmJiBmb250RGVzY3JpcHRpb24udXNl
Rml4ZWREZWZhdWx0U2l6ZSgpICE9IG9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplKQorICAg
ICAgICAgICAgICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3
b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlwdGlvbi5rZXl3b3Jk
U2l6ZSgpIC0gMSwgIW9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplKSk7CisKKyAgICAgICAg
ICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gU2hvcnRoYW5kIHByb3BlcnRpZXMuCisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUZvbnQ6CisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5m
b250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWln
aHQoc3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lmaWVkTGluZUhlaWdodCgpKTsKKyAgICAgICAg
ICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICAgICAgICAgIHNldEZvbnREZXNj
cmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkg
eworICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOwor
ICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVz
b2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRo
dXMgaGF2ZSBzZXR0aW5ncworICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsK
KyAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7
CisgICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisKKyAgICAgICAgICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgICAgICAgICBSZW5kZXJUaGVt
ZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCks
IGZvbnREZXNjcmlwdGlvbik7CisKKyAgICAgICAgICAgIC8vIERvdWJsZS1jaGVjayBhbmQgc2Vl
IGlmIHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElmIG5vdCwgZG9uJ3QgYm90aGVyIHVwZGF0aW5n
IHRoZSBmb250LgorICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6
ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZW5kZXJpbmcgbW9kZSBh
bmQgcHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIFNl
dHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBB
U1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlz
IGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRp
bmdzCisgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2Rl
KHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICAgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0
dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOworCisgICAgICAgICAgICAg
ICAgLy8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4KKyAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRv
Y3VtZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgp
LCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpLCB1c2VTVkdab29tUnVsZXMoKSkpOwor
ICAgICAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5pc0ZvbnRWYWx1ZSgpKSB7Cisg
ICAgICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBzdGF0aWNfY2FzdDxGb250VmFsdWUqPih2YWx1
ZSk7CisgICAgICAgICAgICBpZiAoIWZvbnQtPnN0eWxlIHx8ICFmb250LT52YXJpYW50IHx8ICFm
b250LT53ZWlnaHQKKyAgICAgICAgICAgICAgICB8fCAhZm9udC0+c2l6ZSB8fCAhZm9udC0+bGlu
ZUhlaWdodCB8fCAhZm9udC0+ZmFtaWx5KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U3R5bGUsIGZvbnQtPnN0eWxlLmdl
dCgpKTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250VmFyaWFudCwg
Zm9udC0+dmFyaWFudC5nZXQoKSk7CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3Bl
cnR5Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0LmdldCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSBw
cmV2aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIgZm9udCBidXQgdGhleSBkb24ndCB0cnkg
dG8gcmVhZCB0aGUgZm9udCdzCisgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGJhY2ssIHdoaWNo
IGlzIHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXplIGlzIHVzaW5nIHRoZSAnZXgnIHVuaXQsIGl0
IHdpbGwKKyAgICAgICAgICAgIC8vIG5lZWQgcXVlcnkgdGhlIGRpcnRpZWQgZm9udCdzIHgtaGVp
Z2h0IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8gYmUgc2FmZSBpbiB0aGlzCisgICAgICAg
ICAgICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0aGUgZm9udCBub3cuCisgICAgICAgICAg
ICB1cGRhdGVGb250KCk7CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9u
dFNpemUsIGZvbnQtPnNpemUuZ2V0KCkpOworCisgICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVp
Z2h0VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQoKSk7CisKKyAgICAgICAgICAgIGFwcGx5UHJv
cGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmb250LT5mYW1pbHkuZ2V0KCkpOworICAgICAg
ICB9CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJD
b2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2U6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckxlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJhZGl1czoKKyAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclNw
YWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJUb3A6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcldpZHRoOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlMaXN0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3c6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5z
aXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckJlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyUmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5zOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRGbGV4OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4RmxvdzoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
R3JpZFJvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQ29sbGFwc2U6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE1hc2s6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvbjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dEVtcGhhc2lzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUcmFuc2Zvcm1PcmlnaW46CisjaWYgRU5BQkxFKENTU19FWENMVVNJT05TKQorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwOgorI2VuZGlmCisgICAgICAgIEFTU0VSVChpc0V4cGFu
ZGVkU2hvcnRoYW5kKGlkKSk7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAg
ICBicmVhazsKKworICAgIC8vIENTUzMgUHJvcGVydGllcworICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaGFkb3c6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveFNoYWRvdzogeworICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAg
ICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQorICAgICAgICAgICAgICAg
IHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCkt
PnRleHRTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHls
ZSgpLT50ZXh0U2hhZG93KCkpKSA6IG51bGxwdHIpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRl
LnN0eWxlKCktPnNldEJveFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSA/
IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3co
KSkpIDogbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5pdGlhbCB8fCBwcmlt
aXRpdmVWYWx1ZSkgLy8gaW5pdGlhbCB8IG5vbmUKKyAgICAgICAgICAgIHJldHVybiBpZCA9PSBD
U1NQcm9wZXJ0eVRleHRTaGFkb3cgPyBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KG51bGxw
dHIpIDogc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworCisgICAgICAgIGlm
ICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAg
Zm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAg
ICAgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0
PFNoYWRvd1ZhbHVlKj4oY3VyclZhbHVlKTsKKyAgICAgICAgICAgIGludCB4ID0gaXRlbS0+eC0+
Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBpbnQgeSA9IGl0ZW0tPnktPmNvbXB1dGVMZW5n
dGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpOworICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29t
cHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwg
em9vbUZhY3RvcikgOiAwOworICAgICAgICAgICAgaW50IHNwcmVhZCA9IGl0ZW0tPnNwcmVhZCA/
IGl0ZW0tPnNwcmVhZC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOworICAgICAgICAgICAgU2hhZG93U3R5
bGUgc2hhZG93U3R5bGUgPSBpdGVtLT5zdHlsZSAmJiBpdGVtLT5zdHlsZS0+Z2V0SWRlbnQoKSA9
PSBDU1NWYWx1ZUluc2V0ID8gSW5zZXQgOiBOb3JtYWw7CisgICAgICAgICAgICBDb2xvciBjb2xv
cjsKKyAgICAgICAgICAgIGlmIChpdGVtLT5jb2xvcikKKyAgICAgICAgICAgICAgICBjb2xvciA9
IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKKyAgICAgICAgICAg
IGVsc2UgaWYgKHN0YXRlLnN0eWxlKCkpCisgICAgICAgICAgICAgICAgY29sb3IgPSBzdGF0ZS5z
dHlsZSgpLT5jb2xvcigpOworCisgICAgICAgICAgICBPd25QdHI8U2hhZG93RGF0YT4gc2hhZG93
RGF0YSA9IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKEludFBvaW50KHgsIHkpLCBibHVyLCBzcHJl
YWQsIHNoYWRvd1N0eWxlLCBpZCA9PSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgY29sb3Iu
aXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQpKTsKKyAgICAgICAgICAgIGlm
IChpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0VGV4dFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8g
YWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQorICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzaGFk
b3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMg
aXMgbm90IHRoZSBmaXJzdCBlbnRyeQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6IHsKKyAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwoYm94UmVmbGVjdCwgQm94UmVmbGVjdCkKKyAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZs
ZWN0KFJlbmRlclN0eWxlOjppbml0aWFsQm94UmVmbGVjdCgpKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7CisgICAgICAgIFJlZlB0
cjxTdHlsZVJlZmxlY3Rpb24+IHJlZmxlY3Rpb24gPSBTdHlsZVJlZmxlY3Rpb246OmNyZWF0ZSgp
OworICAgICAgICByZWZsZWN0aW9uLT5zZXREaXJlY3Rpb24oKnJlZmxlY3RWYWx1ZS0+ZGlyZWN0
aW9uKCkpOworICAgICAgICBpZiAocmVmbGVjdFZhbHVlLT5vZmZzZXQoKSkKKyAgICAgICAgICAg
IHJlZmxlY3Rpb24tPnNldE9mZnNldChyZWZsZWN0VmFsdWUtPm9mZnNldCgpLT5jb252ZXJ0VG9M
ZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3Vs
YXRlZENvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwg
em9vbUZhY3RvcikpOworICAgICAgICBOaW5lUGllY2VJbWFnZSBtYXNrOworICAgICAgICBtYXNr
LnNldE1hc2tEZWZhdWx0cygpOworICAgICAgICBtX3N0eWxlTWFwLm1hcE5pbmVQaWVjZUltYWdl
KGlkLCByZWZsZWN0VmFsdWUtPm1hc2soKSwgbWFzayk7CisgICAgICAgIHJlZmxlY3Rpb24tPnNl
dE1hc2sobWFzayk7CisKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChyZWZs
ZWN0aW9uLnJlbGVhc2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVNyYzogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCisgICAgICAgIHJl
dHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZVJhbmdlOiAvLyBPbmx5IHVzZWQgaW4g
QGZvbnQtZmFjZSBydWxlcy4KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXJxdWVlUmVwZXRpdGlvbjogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTChtYXJxdWVlTG9vcENvdW50LCBNYXJxdWVlTG9vcENvdW50KQorICAgICAgICBpZiAoIXBy
aW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVJbmZpbml0ZSkKKyAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQoLTEpOyAvLyAtMSBtZWFucyByZXBlYXQgZm9y
ZXZlci4KKyAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpCisgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KHByaW1pdGl2ZVZhbHVl
LT5nZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFycXVlZVNwZWVkOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKG1hcnF1ZWVTcGVlZCwgTWFycXVlZVNwZWVkKQorICAgICAgICBpZiAoIXByaW1pdGl2
ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoaW50IGlkZW50ID0gcHJp
bWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaWRlbnQpIHsK
KyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTbG93OgorICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg1MDApOyAvLyA1MDAgbXNlYy4KKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb3JtYWw6CisgICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDg1KTsgLy8gODVtc2VjLiBUaGUgV2lu
SUUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NT
VmFsdWVGYXN0OgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVl
ZCgxMCk7IC8vIDEwbXNlYy4gU3VwZXIgZmFzdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNUaW1lKCkp
CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQocHJpbWl0aXZlVmFs
dWUtPmNvbXB1dGVUaW1lPGludCwgQ1NTUHJpbWl0aXZlVmFsdWU6Ok1pbGxpc2Vjb25kcz4oKSk7
CisgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSAvLyBGb3Igc2Ny
b2xsYW1vdW50IHN1cHBvcnQuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVl
U3BlZWQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlSW5jcmVtZW50OiB7CisgICAg
ICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVJbmNyZW1lbnQsIE1hcnF1ZWVJ
bmNyZW1lbnQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAg
ICAgc3dpdGNoIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVNtYWxsOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1
ZWVJbmNyZW1lbnQoTGVuZ3RoKDEsIEZpeGVkKSk7IC8vIDFweC4KKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb3JtYWw6CisgICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoNiwgRml4ZWQpKTsgLy8g
NnB4LiBUaGUgV2luSUUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGNhc2UgQ1NTVmFsdWVMYXJnZToKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCgzNiwgRml4ZWQpKTsgLy8gMzZweC4KKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIExlbmd0aCBtYXJxdWVlTGVuZ3RoID0gY29udmVydFRvSW50TGVuZ3RoKHByaW1pdGl2ZVZh
bHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOworICAgICAgICAg
ICAgaWYgKCFtYXJxdWVlTGVuZ3RoLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChtYXJxdWVlTGVuZ3RoKTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2Nh
bGU6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobG9jYWxlLCBMb2NhbGUp
OworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TG9jYWxlKG51bGxBdG9tKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TG9jYWxlKHByaW1pdGl2ZVZhbHVlLT5n
ZXRTdHJpbmdWYWx1ZSgpKTsKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlv
biA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24oc3RhdGUu
c3R5bGUoKS0+bG9jYWxlKCkpKTsKKyAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNj
cmlwdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgRU5BQkxFKERBU0hCT0FSRF9T
VVBQT1JUKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXREYXNoYm9hcmRSZWdpb246CisgICAg
eworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChkYXNoYm9hcmRSZWdpb25zLCBE
YXNoYm9hcmRSZWdpb25zKQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJl
Z2lvbnMoUmVuZGVyU3R5bGU6Om5vbmVEYXNoYm9hcmRSZWdpb25zKCkpOworICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiByZWdpb24gPSBw
cmltaXRpdmVWYWx1ZS0+Z2V0RGFzaGJvYXJkUmVnaW9uVmFsdWUoKTsKKyAgICAgICAgaWYgKCFy
ZWdpb24pCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiBm
aXJzdCA9IHJlZ2lvbjsKKyAgICAgICAgd2hpbGUgKHJlZ2lvbikgeworICAgICAgICAgICAgTGVu
Z3RoIHRvcCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnRvcCgpLCBzdGF0ZS5zdHlsZSgp
LCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOworICAgICAgICAgICAgTGVuZ3RoIHJpZ2h0ID0g
Y29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+cmlnaHQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCBib3R0b20gPSBjb252ZXJ0
VG9JbnRMZW5ndGgocmVnaW9uLT5ib3R0b20oKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVs
ZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCBsZWZ0ID0gY29udmVydFRvSW50TGVu
Z3RoKHJlZ2lvbi0+bGVmdCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxl
KCkpOworCisgICAgICAgICAgICBpZiAodG9wLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAg
ICAgdG9wID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAocmlnaHQuaXNVbmRlZmluZWQoKSkK
KyAgICAgICAgICAgICAgICByaWdodCA9IExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGJvdHRv
bS5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIGJvdHRvbSA9IExlbmd0aCgpOworICAg
ICAgICAgICAgaWYgKGxlZnQuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBsZWZ0ID0g
TGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGlmIChyZWdpb24tPm1faXNDaXJjbGUpCisgICAgICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJk
UmVnaW9uOjpDaXJjbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0
LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOworICAgICAgICAgICAgZWxzZSBpZiAo
cmVnaW9uLT5tX2lzUmVjdGFuZ2xlKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6UmVjdGFuZ2xlLCByZWdpb24t
Pm1fbGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFs
c2UgOiB0cnVlKTsKKyAgICAgICAgICAgIHJlZ2lvbiA9IHJlZ2lvbi0+bV9uZXh0LmdldCgpOwor
ICAgICAgICB9CisKKyAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVn
aW9ucyh0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisjaWYgRU5BQkxF
KERSQUdHQUJMRV9SRUdJT04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFwcFJlZ2lvbjog
eworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RHJh
Z2dhYmxlUmVnaW9uTW9kZShwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURy
YWcgPyBEcmFnZ2FibGVSZWdpb25EcmFnIDogRHJhZ2dhYmxlUmVnaW9uTm9EcmFnKTsKKyAgICAg
ICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVnaW9ucyh0cnVlKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
U3Ryb2tlV2lkdGg6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFN0
cm9rZVdpZHRoLCBUZXh0U3Ryb2tlV2lkdGgpCisgICAgICAgIGZsb2F0IHdpZHRoID0gMDsKKyAg
ICAgICAgc3dpdGNoIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICBjYXNl
IENTU1ZhbHVlVGhpbjoKKyAgICAgICAgY2FzZSBDU1NWYWx1ZU1lZGl1bToKKyAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVRoaWNrOiB7CisgICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gMS4wIC8gNDg7
CisgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVN
ZWRpdW0pCisgICAgICAgICAgICAgICAgcmVzdWx0ICo9IDM7CisgICAgICAgICAgICBlbHNlIGlm
IChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVRoaWNrKQorICAgICAgICAg
ICAgICAgIHJlc3VsdCAqPSA1OworICAgICAgICAgICAgd2lkdGggPSBDU1NQcmltaXRpdmVWYWx1
ZTo6Y3JlYXRlKHJlc3VsdCwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19FTVMpLT5jb21wdXRlTGVu
Z3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21G
YWN0b3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIHdpZHRoID0gcHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRU
ZXh0U3Ryb2tlV2lkdGgod2lkdGgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm06IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5E
X0lOSVRJQUwodHJhbnNmb3JtLCBUcmFuc2Zvcm0pOworICAgICAgICBUcmFuc2Zvcm1PcGVyYXRp
b25zIG9wZXJhdGlvbnM7CisgICAgICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFsdWUs
IHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucyk7Cisg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRyYW5zZm9ybShvcGVyYXRpb25zKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmU6IHsK
KyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocGVyc3BlY3RpdmUsIFBlcnNwZWN0
aXZlKQorCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9u
ZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUoMCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBwZXJzcGVjdGl2ZVZh
bHVlOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgICAg
ICBwZXJzcGVjdGl2ZVZhbHVlID0gcHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Cisg
ICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7CisgICAgICAgICAg
ICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdHJlYXQgdmFsdWVsZXNzIG51bWJlcnMg
YXMgcHguCisgICAgICAgICAgICBwZXJzcGVjdGl2ZVZhbHVlID0gQ1NTUHJpbWl0aXZlVmFsdWU6
OmNyZWF0ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSwgQ1NTUHJpbWl0aXZlVmFs
dWU6OkNTU19QWCktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIGlmIChwZXJzcGVjdGl2ZVZhbHVlID49IDAuMGYpCisgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZVZhbHVlKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogeworICAgICAgICBIQU5ETEVf
SU5IRVJJVF9BTkRfSU5JVElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0Q29sb3Ip
OworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgYnJlYWs7CisKKyAg
ICAgICAgQ29sb3IgY29sID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZlVmFsdWUp
OworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wpOworICAg
ICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisjaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJG
TE9XX1NDUk9MTElORykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dTY3JvbGxp
bmc6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hPdmVyZmxv
d1Njcm9sbGluZywgVXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7CisgICAgICAgIGlmICghcHJp
bWl0aXZlVmFsdWUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0VXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9
PSBDU1NWYWx1ZVRvdWNoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNh
c2UgQ1NTUHJvcGVydHlJbnZhbGlkOgorICAgICAgICByZXR1cm47CisgICAgLy8gRGlyZWN0aW9u
YWwgcHJvcGVydGllcyBhcmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVy
dHkoKSBiZWZvcmUgdGhlIHN3aXRjaC4KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
RW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVyU3RhcnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRXaWR0
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlQ29sb3I6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJCZWZvcmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVyQWZ0ZXJDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHls
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFyZ2luRW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXJnaW5TdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFyZ2luQmVmb3JlQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
cmdpblRvcENvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlckNv
bGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Cb3R0b21Db2xsYXBzZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0VuZDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UGFkZGluZ1N0YXJ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5n
QmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nQWZ0ZXI6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TG9naWNhbEhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsSGVpZ2h0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1heExvZ2ljYWxIZWlnaHQ6CisgICAgeworICAgICAgICBDU1NQcm9wZXJ0eUlEIG5l
d0lkID0gQ1NTUHJvcGVydHk6OnJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KGlkLCBzdGF0
ZS5zdHlsZSgpLT5kaXJlY3Rpb24oKSwgc3RhdGUuc3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Cisg
ICAgICAgIEFTU0VSVChuZXdJZCAhPSBpZCk7CisgICAgICAgIHJldHVybiBhcHBseVByb3BlcnR5
KG5ld0lkLCB2YWx1ZSk7CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3RyZXRjaDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVU
aHJvdWdoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hDb2xvcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dExpbmVUaHJvdWdoU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3Vn
aFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRPdmVybGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3Zlcmxp
bmVNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVTdHlsZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRV
bmRlcmxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVDb2xvcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZU1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHRVbmRlcmxpbmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZVdpZHRo
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250U2l6ZURlbHRhOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdDoKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gQ1NTIFRleHQgTGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0aW5n
IHN1cHBvcnQKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKKyAgICAg
ICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2RlKTsK
KyAgICAgICAgCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHNldFdy
aXRpbmdNb2RlKCpwcmltaXRpdmVWYWx1ZSk7CisKKyAgICAgICAgLy8gRklYTUU6IEl0IGlzIG5v
dCBvayB0byBtb2RpZnkgZG9jdW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCisgICAg
ICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3Vt
ZW50KCktPmRvY3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+
c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCh0cnVlKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246IHsK
KyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBUZXh0
T3JpZW50YXRpb24pOworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAg
IHNldFRleHRPcmllbnRhdGlvbigqcHJpbWl0aXZlVmFsdWUpOworCisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsKKyAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVCb3hD
b250YWluKQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRMaW5lQm94Q29udGFpbihMaW5lQm94Q29udGFpbk5vbmUpOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFpblZh
bHVlKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ1NTTGluZUJveENvbnRhaW5W
YWx1ZSogbGluZUJveENvbnRhaW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250YWlu
VmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250YWlu
KGxpbmVCb3hDb250YWluVmFsdWUtPnZhbHVlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgLy8gQ1NTIEZvbnRzIE1vZHVsZSBMZXZlbCAzCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEZvbnRGZWF0dXJlU2V0dGluZ3M6IHsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYm
IHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7CisgICAgICAg
ICAgICBzZXRGb250RGVzY3JpcHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCku
bWFrZU5vcm1hbEZlYXR1cmVTZXR0aW5ncygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRl
LnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3Qg
PSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7CisgICAgICAgIFJlZlB0cjxGb250
RmVhdHVyZVNldHRpbmdzPiBzZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0ZSgp
OworICAgICAgICBpbnQgbGVuID0gbGlzdC0+bGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlzdC0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAgICAgICAgICAgIGlmICghaXRlbS0+aXNGb250
RmVhdHVyZVZhbHVlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBG
b250RmVhdHVyZVZhbHVlKiBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1ZSo+
KGl0ZW0pOworICAgICAgICAgICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0dXJl
LT50YWcoKSwgZmVhdHVyZS0+dmFsdWUoKSkpOworICAgICAgICB9CisgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRGZWF0dXJlU2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKKyAgICAgICAg
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEZpbHRlcjogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIsIEZp
bHRlcik7CisgICAgICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICAgICAgaWYg
KGNyZWF0ZUZpbHRlck9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucykpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRGaWx0ZXIob3BlcmF0aW9ucyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbnM6IHsKKyAgICAgICAgVmVjdG9yPEdy
aWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7CisgICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlz
dCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKKyAgICAg
ICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7CisgICAgICAgIGlmICghY3JlYXRl
R3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkU3Rh
cnQ6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIHN0YXJ0UG9zaXRpb247CisgICAgICAgIGlmICgh
Y3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBzdGFydFBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1TdGFydChzdGFydFBvc2l0
aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
R3JpZEVuZDogeworICAgICAgICBHcmlkUG9zaXRpb24gZW5kUG9zaXRpb247CisgICAgICAgIGlm
ICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBlbmRQb3NpdGlvbikpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtRW5kKGVuZFBvc2l0aW9u
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRH
cmlkQmVmb3JlOiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBiZWZvcmVQb3NpdGlvbjsKKyAgICAg
ICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGJlZm9yZVBvc2l0aW9uKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1CZWZvcmUo
YmVmb3JlUG9zaXRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRHcmlkQWZ0ZXI6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIGFmdGVyUG9zaXRp
b247CisgICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBhZnRlclBvc2l0aW9u
KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0
ZW1BZnRlcihhZnRlclBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8v
IFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsaWFzZWQgYW5kIFN0eWxlQnVpbGRlciBhbHJlYWR5IGFw
cGxpZWQgdGhlIHByb3BlcnR5IG9uIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLgorICAgIGNhc2UgQ1NT
UHJvcGVydHlUcmFuc2l0aW9uRGVsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25E
dXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblByb3BlcnR5OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uVGltaW5nRnVuY3Rpb246CisgICAgICAgIHJldHVybjsK
KyAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgU3R5bGVCdWls
ZGVyIGxvb2t1cCB0YWJsZS4KKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1l
bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFn
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZFBvc2l0aW9uWToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUxlZnRSYWRpdXM6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJCb3R0b21TdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tV2lkdGg6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJJbWFnZU91dHNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VSZXBlYXQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU2xpY2U6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckltYWdlU291cmNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlckxlZnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJSaWdodFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdo
dFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyVG9wTGVmdFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
VG9wUmlnaHRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm90
dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaXppbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUNhcHRpb25TaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDbGVhcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5Q2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUNvdW50ZXJJbmNyZW1lbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvdW50ZXJSZXNldDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5Q3Vyc29yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlEaXJlY3Rp
b246CisgICAgY2FzZSBDU1NQcm9wZXJ0eURpc3BsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUVt
cHR5Q2VsbHM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZsb2F0OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlGb250U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlGb250VmFyaWFudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5SGVpZ2h0OgorI2lmIEVOQUJMRShDU1NfSU1BR0VfT1JJRU5UQVRJ
T04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlT3JpZW50YXRpb246CisjZW5kaWYKKyAgICBj
YXNlIENTU1Byb3BlcnR5SW1hZ2VSZW5kZXJpbmc6CisjaWYgRU5BQkxFKENTU19JTUFHRV9SRVNP
TFVUSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZVJlc29sdXRpb246CisjZW5kaWYKKyAg
ICBjYXNlIENTU1Byb3BlcnR5TGVmdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGV0dGVyU3BhY2lu
ZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGluZUhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
TGlzdFN0eWxlSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVBvc2l0aW9uOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlN
YXJnaW5Cb3R0b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkxlZnQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eU1hcmdpblJpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5Ub3A6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eU1heEhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWF4V2lk
dGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1pbkhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
TWluV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eU9ycGhhbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5T3V0bGluZU9mZnNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0
eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eU92ZXJmbG93V3JhcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dYOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlPdmVyZmxvd1k6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0
b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlQYWRkaW5nUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdUb3A6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJl
YWtCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0luc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5UG9pbnRlckV2ZW50czoKKyAgICBjYXNlIENTU1Byb3BlcnR5UG9zaXRpb246
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5UmlnaHQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVNwZWFrOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJsZUxh
eW91dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0RGVjb3JhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEluZGVudDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5VGV4dE92ZXJmbG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0UmVu
ZGVyaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNmb3JtOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlUb3A6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpOgorI2lmIEVOQUJM
RShDU1NfVkFSSUFCTEVTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlWYXJpYWJsZToKKyNlbmRpZgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgorICAgIGNhc2UgQ1NTUHJvcGVydHlW
aXNpYmlsaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EZWxheToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0aW9uOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QW5pbWF0aW9uRmlsbE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlv
bkl0ZXJhdGlvbkNvdW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25OYW1l
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25QbGF5U3RhdGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBcHBlYXJhbmNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBc3Bl
Y3RSYXRpbzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3Vu
ZFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckZpdDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlckltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJW
ZXJ0aWNhbFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEFsaWduOgorI2lm
IEVOQUJMRShDU1NfQk9YX0RFQ09SQVRJT05fQlJFQUspCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJveERlY29yYXRpb25CcmVhazoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3hEaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEZsZXg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEZsZXhHcm91cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm94TGluZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yZGluYWxHcm91
cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JpZW50OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3hQYWNrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2xvckNvcnJl
Y3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkF4aXM6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtbkJyZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5C
cmVha0luc2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQ291bnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkdhcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uUHJvZ3Jlc3Npb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1
bGVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdENvbHVtblNwYW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbldp
ZHRoOgorI2lmIEVOQUJMRShDVVJTT1JfVklTSUJJTElUWSkKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Q3Vyc29yVmlzaWJpbGl0eToKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRBbGlnbkNvbnRlbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduSXRlbXM6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduU2VsZjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0RmxleEJhc2lzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4RGlyZWN0aW9u
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4R3JvdzoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0RmxleFNocmluazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFdyYXA6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3RpZnlDb250ZW50OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRPcmRlcjoKKyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93
SW50bzoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250S2VybmluZzoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNtb290aGluZzoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEhpZ2hsaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlQ2hhcmFjdGVy
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEFmdGVyOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEJlZm9yZToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5lczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0SHlwaGVuczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUFsaWduOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dExpbmVDbGFtcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUdyaWQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXJxdWVlRGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3R5bGU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQm94SW1hZ2VSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJ
bWFnZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVdpZHRoOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
a0NvbXBvc2l0ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0ltYWdlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrUG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb25Z
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFza1JlcGVhdFk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tT
aXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXROYnNwTW9kZToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFBlcnNwZWN0aXZlT3JpZ2luWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3Rp
dmVPcmlnaW5ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQcmludENvbG9yQWRqdXN0Ogor
I2lmIEVOQUJMRShDU1NfUkVHSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9u
QnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtCZWZvcmU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrSW5zaWRlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRSZWdpb25PdmVyZmxvdzoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRSdGxPcmRlcmluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UnVieVBv
c2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0Q29tYmluZToKKyNpZiBFTkFC
TEUoQ1NTM19URVhUKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbkxp
bmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uU3R5bGU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRBbGlnbkxhc3Q6CisjZW5kaWYgLy8gQ1NTM19URVhU
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dEVtcGhhc2lzU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRGaWxsQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTZWN1cml0eToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
cmFuc2Zvcm1PcmlnaW5ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1Pcmln
aW5aOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1TdHlsZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUcmFuc2l0aW9uRHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5z
aXRpb25Qcm9wZXJ0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvblRpbWlu
Z0Z1bmN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyRHJhZzoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VXNlck1vZGlmeToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VXNlclNlbGVjdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q2xpcFBhdGg6CisjaWYgRU5B
QkxFKENTU19FWENMVVNJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwRmxvdzoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVNYXJnaW46CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFNoYXBlUGFkZGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcFRo
cm91Z2g6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlSW5zaWRlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRTaGFwZU91dHNpZGU6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2hpdGVTcGFjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2lkb3dzOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V29yZEJyZWFrOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXb3JkU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V29yZFdyYXA6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVpJbmRleDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Wm9vbToKKyNp
ZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXha
b29tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5ab29tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
cmllbnRhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VXNlclpvb206CisjZW5kaWYKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0Ogor
I2lmIEVOQUJMRShTVkcpCisgICAgICAgIC8vIFRyeSB0aGUgU1ZHIHByb3BlcnRpZXMKKyAgICAg
ICAgYXBwbHlTVkdQcm9wZXJ0eShpZCwgdmFsdWUpOworI2VuZGlmCisgICAgICAgIHJldHVybjsK
KyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVJ
bWFnZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYg
KHZhbHVlLT5pc0ltYWdlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ0Zy
b21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisK
KyAgICBpZiAodmFsdWUtPmlzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7CisgICAgICAgIGlmICh2
YWx1ZS0+aXNHcmFkaWVudFZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQ
ZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4o
dmFsdWUpLT5ncmFkaWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSk7CisgICAgICAg
IHJldHVybiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0
PENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqPih2YWx1ZSkpOworICAgIH0KKworI2lmIEVOQUJMRShD
U1NfSU1BR0VfU0VUKQorICAgIGlmICh2YWx1ZS0+aXNJbWFnZVNldFZhbHVlKCkpCisgICAgICAg
IHJldHVybiBzZXRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0lt
YWdlU2V0VmFsdWUqPih2YWx1ZSkpOworI2VuZGlmCisKKyAgICBpZiAodmFsdWUtPmlzQ3Vyc29y
SW1hZ2VWYWx1ZSgpKQorICAgICAgICByZXR1cm4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKHBy
b3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NDdXJzb3JJbWFnZVZhbHVlKj4odmFsdWUpKTsKKworICAg
IHJldHVybiAwOworfQorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmNh
Y2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVZh
bHVlKiB2YWx1ZSkKK3sKKyAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2Fj
aGVkT3JQZW5kaW5nSW1hZ2UoKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0lt
YWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9w
ZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Z2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVl
KENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIHZhbHVlKQor
eworICAgIGlmICh2YWx1ZS0+aXNQZW5kaW5nKCkpIHsKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5n
SW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBT
dHlsZVBlbmRpbmdJbWFnZTo6Y3JlYXRlKHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIFN0eWxl
R2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdF
X1NFVCkKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6c2V0T3JQZW5kaW5n
RnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlU2V0VmFsdWUqIHZhbHVl
KQoreworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRp
bmdJbWFnZVNldChkb2N1bWVudCgpKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGlu
Z0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChw
cm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisjZW5kaWYK
KworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjdXJzb3JPclBlbmRpbmdG
cm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogdmFs
dWUpCit7CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVu
ZGluZ0ltYWdlKGRvY3VtZW50KCkpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5n
SW1hZ2UoKSkKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHBy
b3BlcnR5LCB2YWx1ZSk7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjpjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5k
ZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgaWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkg
PT0gcGFyZW50U3R5bGUtPmVmZmVjdGl2ZVpvb20oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9u
KCk7CisgICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOwor
ICAgIHNldEZvbnRTaXplKG5ld0ZvbnREZXNjcmlwdGlvbiwgY2hpbGRGb250LnNwZWNpZmllZFNp
emUoKSk7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24p
OworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShS
ZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsK
KworICAgIGlmIChjaGlsZEZvbnQuaXNBYnNvbHV0ZVNpemUoKSB8fCAhcGFyZW50U3R5bGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udCA9
IHBhcmVudFN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoY2hpbGRGb250LnVzZUZp
eGVkRGVmYXVsdFNpemUoKSA9PSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gRm9yIG5vdywgbHVtcCBhbGwgZmFtaWxpZXMgYnV0IG1v
bm9zcGFjZSB0b2dldGhlci4KKyAgICBpZiAoY2hpbGRGb250LmdlbmVyaWNGYW1pbHkoKSAhPSBG
b250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseQorICAgICAgICAmJiBwYXJlbnRGb250Lmdl
bmVyaWNGYW1pbHkoKSAhPSBGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gV2Uga25vdyB0aGUgcGFyZW50IGlzIG1vbm9zcGFjZSBvciB0
aGUgY2hpbGQgaXMgbW9ub3NwYWNlLCBhbmQgdGhhdCBmb250CisgICAgLy8gc2l6ZSB3YXMgdW5z
cGVjaWZpZWQuIFdlIHdhbnQgdG8gc2NhbGUgb3VyIGZvbnQgc2l6ZSBhcyBhcHByb3ByaWF0ZS4K
KyAgICAvLyBJZiB0aGUgZm9udCB1c2VzIGEga2V5d29yZCBzaXplLCB0aGVuIHdlIHJlZmV0Y2gg
ZnJvbSB0aGUgdGFibGUgcmF0aGVyIHRoYW4KKyAgICAvLyBtdWx0aXBseWluZyBieSBvdXIgc2Nh
bGUgZmFjdG9yLgorICAgIGZsb2F0IHNpemU7CisgICAgaWYgKGNoaWxkRm9udC5rZXl3b3JkU2l6
ZSgpKQorICAgICAgICBzaXplID0gZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1Zh
bHVlWHhTbWFsbCArIGNoaWxkRm9udC5rZXl3b3JkU2l6ZSgpIC0gMSwgY2hpbGRGb250LnVzZUZp
eGVkRGVmYXVsdFNpemUoKSk7CisgICAgZWxzZSB7CisgICAgICAgIFNldHRpbmdzKiBzZXR0aW5n
cyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgZmxvYXQgZml4ZWRTY2FsZUZhY3RvciA9
IChzZXR0aW5ncyAmJiBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSAmJiBzZXR0aW5n
cy0+ZGVmYXVsdEZvbnRTaXplKCkpCisgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGZsb2F0Pihz
ZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSkgLyBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRT
aXplKCkKKyAgICAgICAgICAgIDogMTsKKyAgICAgICAgc2l6ZSA9IHBhcmVudEZvbnQudXNlRml4
ZWREZWZhdWx0U2l6ZSgpID8KKyAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6
ZSgpIC8gZml4ZWRTY2FsZUZhY3RvciA6CisgICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNp
ZmllZFNpemUoKSAqIGZpeGVkU2NhbGVGYWN0b3I7CisgICAgfQorCisgICAgRm9udERlc2NyaXB0
aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOworICAgIHNldEZvbnRTaXplKG5ld0Zv
bnREZXNjcmlwdGlvbiwgc2l6ZSk7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdG
b250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRpYWxpemVGb250
U3R5bGUoU2V0dGluZ3MqIHNldHRpbmdzKQoreworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVz
Y3JpcHRpb247CisgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2Ny
aXB0aW9uOjpTdGFuZGFyZEZhbWlseSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmlu
Z01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOworICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+
c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBzdGFuZGFyZEZvbnRGYW1pbHkgPSBkb2N1bWVudFNldHRpbmdzKCktPnN0YW5kYXJkRm9udEZh
bWlseSgpOworICAgIGlmICghc3RhbmRhcmRGb250RmFtaWx5LmlzRW1wdHkoKSkgeworICAgICAg
ICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250RmFt
aWx5KTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5
KDApOworICAgIH0KKyAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVN
ZWRpdW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKKyAgICBzZXRGb250U2l6ZShmb250RGVzY3Jp
cHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZU1lZGl1bSwgZmFs
c2UpKTsKKyAgICBtX3N0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6Omlu
aXRpYWxMaW5lSGVpZ2h0KCkpOworICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwor
ICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OnNldEZvbnRTaXplKEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBm
bG9hdCBzaXplKQoreworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUp
OworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoZ2V0Q29tcHV0ZWRTaXplRnJv
bVNwZWNpZmllZFNpemUoZG9jdW1lbnQoKSwgbV9zdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRp
b24uaXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKK30KKworZmxv
YXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1l
bnQqIGRvY3VtZW50LCBSZW5kZXJTdHlsZSogc3R5bGUsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZs
b2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKQoreworICAgIGZsb2F0IHpv
b21GYWN0b3IgPSAxLjBmOworICAgIGlmICghdXNlU1ZHWm9vbVJ1bGVzKSB7CisgICAgICAgIHpv
b21GYWN0b3IgPSBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgICAgICBpZiAoRnJhbWUqIGZy
YW1lID0gZG9jdW1lbnQtPmZyYW1lKCkpCisgICAgICAgICAgICB6b29tRmFjdG9yICo9IGZyYW1l
LT50ZXh0Wm9vbUZhY3RvcigpOworICAgIH0KKworICAgIHJldHVybiBTdHlsZVJlc29sdmVyOjpn
ZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgem9vbUZhY3RvciwgaXNB
YnNvbHV0ZVNpemUsIHNwZWNpZmllZFNpemUpOworfQorCitmbG9hdCBTdHlsZVJlc29sdmVyOjpn
ZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIGZsb2F0
IHpvb21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVT
bWFydE1pbmltdW1Gb3JGb250U2l6ZSB1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSkKK3sKKyAg
ICAvLyBUZXh0IHdpdGggYSAwcHggZm9udCBzaXplIHNob3VsZCBub3QgYmUgdmlzaWJsZSBhbmQg
dGhlcmVmb3JlIG5lZWRzIHRvIGJlCisgICAgLy8gZXhlbXB0IGZyb20gbWluaW11bSBmb250IHNp
emUgcnVsZXMuIEFjaWQzIHJlbGllcyBvbiB0aGlzIGZvciBwaXhlbC1wZXJmZWN0CisgICAgLy8g
cmVuZGVyaW5nLiBUaGlzIGlzIGFsc28gY29tcGF0aWJsZSB3aXRoIG90aGVyIGJyb3dzZXJzIHRo
YXQgaGF2ZSBtaW5pbXVtCisgICAgLy8gZm9udCBzaXplIHNldHRpbmdzIChlLmcuIEZpcmVmb3gp
LgorICAgIGlmIChmYWJzZihzcGVjaWZpZWRTaXplKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8Zmxv
YXQ+OjplcHNpbG9uKCkpCisgICAgICAgIHJldHVybiAwLjBmOworCisgICAgLy8gV2Ugc3VwcG9y
dCB0d28gdHlwZXMgb2YgbWluaW11bSBmb250IHNpemUuIFRoZSBmaXJzdCBpcyBhIGhhcmQgb3Zl
cnJpZGUgdGhhdCBhcHBsaWVzIHRvCisgICAgLy8gYWxsIGZvbnRzLiBUaGlzIGlzICJtaW5TaXpl
LiIgVGhlIHNlY29uZCB0eXBlIG9mIG1pbmltdW0gZm9udCBzaXplIGlzIGEgInNtYXJ0IG1pbmlt
dW0iCisgICAgLy8gdGhhdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgV2ViIHBhZ2UgY2FuJ3Qg
a25vdyB3aGF0IHNpemUgaXQgcmVhbGx5IGFza2VkIGZvciwgZS5nLiwKKyAgICAvLyB3aGVuIGl0
IHVzZXMgbG9naWNhbCBzaXplcyBsaWtlICJzbWFsbCIgb3IgZXhwcmVzc2VzIHRoZSBmb250LXNp
emUgYXMgYSBwZXJjZW50YWdlIG9mCisgICAgLy8gdGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgc2V0
dGluZy4KKworICAgIC8vIFdpdGggdGhlIHNtYXJ0IG1pbmltdW0sIHdlIG5ldmVyIHdhbnQgdG8g
Z2V0IHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBmb250IHNpemUgdG8ga2VlcCBmb250cyByZWFk
YWJsZS4KKyAgICAvLyBIb3dldmVyIHdlIGFsd2F5cyBhbGxvdyB0aGUgcGFnZSB0byBzZXQgYW4g
ZXhwbGljaXQgcGl4ZWwgc2l6ZSB0aGF0IGlzIHNtYWxsZXIsCisgICAgLy8gc2luY2Ugc2l0ZXMg
d2lsbCBtaXMtcmVuZGVyIG90aGVyd2lzZSAoZS5nLiwgaHR0cDovL3d3dy5nYW1lc3BvdC5jb20g
d2l0aCBhIDlweCBtaW5pbXVtKS4KKworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50
LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgIHJldHVybiAxLjBmOwor
CisgICAgaW50IG1pblNpemUgPSBzZXR0aW5ncy0+bWluaW11bUZvbnRTaXplKCk7CisgICAgaW50
IG1pbkxvZ2ljYWxTaXplID0gc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKTsKKyAg
ICBmbG9hdCB6b29tZWRTaXplID0gc3BlY2lmaWVkU2l6ZSAqIHpvb21GYWN0b3I7CisKKyAgICAv
LyBBcHBseSB0aGUgaGFyZCBtaW5pbXVtIGZpcnN0LiBXZSBvbmx5IGFwcGx5IHRoZSBoYXJkIG1p
bmltdW0gaWYgYWZ0ZXIgem9vbWluZyB3ZSdyZSBzdGlsbCB0b28gc21hbGwuCisgICAgaWYgKHpv
b21lZFNpemUgPCBtaW5TaXplKQorICAgICAgICB6b29tZWRTaXplID0gbWluU2l6ZTsKKworICAg
IC8vIE5vdyBhcHBseSB0aGUgInNtYXJ0IG1pbmltdW0uIiBUaGlzIG1pbmltdW0gaXMgYWxzbyBv
bmx5IGFwcGxpZWQgaWYgd2UncmUgc3RpbGwgdG9vIHNtYWxsCisgICAgLy8gYWZ0ZXIgem9vbWlu
Zy4gVGhlIGZvbnQgc2l6ZSBtdXN0IGVpdGhlciBiZSByZWxhdGl2ZSB0byB0aGUgdXNlciBkZWZh
dWx0IG9yIHRoZSBvcmlnaW5hbCBzaXplCisgICAgLy8gbXVzdCBoYXZlIGJlZW4gYWNjZXB0YWJs
ZS4gSW4gb3RoZXIgd29yZHMsIHdlIG9ubHkgYXBwbHkgdGhlIHNtYXJ0IG1pbmltdW0gd2hlbmV2
ZXIgd2UncmUgcG9zaXRpdmUKKyAgICAvLyBkb2luZyBzbyB3b24ndCBkaXNydXB0IHRoZSBsYXlv
dXQuCisgICAgaWYgKHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplICYmIHpvb21lZFNpemUgPCBt
aW5Mb2dpY2FsU2l6ZSAmJiAoc3BlY2lmaWVkU2l6ZSA+PSBtaW5Mb2dpY2FsU2l6ZSB8fCAhaXNB
YnNvbHV0ZVNpemUpKQorICAgICAgICB6b29tZWRTaXplID0gbWluTG9naWNhbFNpemU7CisKKyAg
ICAvLyBBbHNvIGNsYW1wIHRvIGEgcmVhc29uYWJsZSBtYXhpbXVtIHRvIHByZXZlbnQgaW5zYW5l
IGZvbnQgc2l6ZXMgZnJvbSBjYXVzaW5nIGNyYXNoZXMgb24gdmFyaW91cworICAgIC8vIHBsYXRm
b3JtcyAoSSdtIGxvb2tpbmcgYXQgeW91LCBXaW5kb3dzLikKKyAgICByZXR1cm4gbWluKG1heGlt
dW1BbGxvd2VkRm9udFNpemUsIHpvb21lZFNpemUpOworfQorCitjb25zdCBpbnQgZm9udFNpemVU
YWJsZU1heCA9IDE2OworY29uc3QgaW50IGZvbnRTaXplVGFibGVNaW4gPSA5OworY29uc3QgaW50
IHRvdGFsS2V5d29yZHMgPSA4OworCisvLyBXaW5JRS9OYXY0IHRhYmxlIGZvciBmb250IHNpemVz
LiBEZXNpZ25lZCB0byBtYXRjaCB0aGUgbGVnYWN5IGZvbnQgbWFwcGluZyBzeXN0ZW0gb2YgSFRN
TC4KK3N0YXRpYyBjb25zdCBpbnQgcXVpcmtzRm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4
IC0gZm9udFNpemVUYWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KK3sKKyAgICAgIHsgOSwg
ICAgOSwgICAgIDksICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyOCB9LAorICAgICAg
eyA5LCAgICA5LCAgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMxIH0sCisg
ICAgICB7IDksICAgIDksICAgICA5LCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzQg
fSwKKyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAg
ICAzNyB9LAorICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTMsICAgIDE2LCAgICAyMCwgICAg
MjYsICAgIDQwIH0sIC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCisgICAgICB7IDksICAgIDks
ICAgIDExLCAgICAxNCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKKyAgICAgIHsgOSwg
ICAxMCwgICAgMTIsICAgIDE1LCAgICAxNywgICAgMjMsICAgIDMwLCAgICA0NSB9LAorICAgICAg
eyA5LCAgIDEwLCAgICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8g
cHJvcG9ydGlvbmFsIGZvbnQgZGVmYXVsdCAoMTYpCit9OworLy8gSFRNTCAgICAgICAxICAgICAg
MiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3CisvLyBDU1MgIHh4cyAgIHhzICAg
ICBzICAgICAgbSAgICAgIGwgICAgIHhsICAgICB4eGwKKy8vICAgICAgICAgICAgICAgICAgICAg
ICAgICB8CisvLyAgICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKKworLy8gU3RyaWN0IG1v
ZGUgdGFibGUgbWF0Y2hlcyBNYWNJRSBhbmQgTW96aWxsYSdzIHNldHRpbmdzIGV4YWN0bHkuCitz
dGF0aWMgY29uc3QgaW50IHN0cmljdEZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZv
bnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Cit7CisgICAgICB7IDksICAgIDks
ICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjcgfSwKKyAgICAgIHsgOSwg
ICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMCB9LAorICAgICAg
eyA5LCAgICA5LCAgICAxMCwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDMzIH0sCisg
ICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzYg
fSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAg
ICAzOSB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQorICAgICAgeyA5LCAgIDEwLCAgICAx
MiwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCisgICAgICB7IDksICAgMTAs
ICAgIDEzLCAgICAxNSwgICAgMTgsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKKyAgICAgIHsgOSwg
ICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3Bv
cnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQorfTsKKy8vIEhUTUwgICAgICAgMSAgICAgIDIgICAg
ICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNworLy8gQ1NTICB4eHMgICB4cyAgICAgcyAg
ICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAg
fAorLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCisKKy8vIEZvciB2YWx1ZXMgb3V0
c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLCB3ZSB1c2UgVG9kZCBGYWhybmVyJ3Mgc3VnZ2Vz
dGVkIHNjYWxlCisvLyBmYWN0b3JzIGZvciBlYWNoIGtleXdvcmQgdmFsdWUuCitzdGF0aWMgY29u
c3QgZmxvYXQgZm9udFNpemVGYWN0b3JzW3RvdGFsS2V5d29yZHNdID0geyAwLjYwZiwgMC43NWYs
IDAuODlmLCAxLjBmLCAxLjJmLCAxLjVmLCAyLjBmLCAzLjBmIH07CisKK2Zsb2F0IFN0eWxlUmVz
b2x2ZXI6OmZvbnRTaXplRm9yS2V5d29yZChEb2N1bWVudCogZG9jdW1lbnQsIGludCBrZXl3b3Jk
LCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpCit7CisgICAgU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAg
cmV0dXJuIDEuMGY7CisKKyAgICBib29sIHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5RdWlya3NN
b2RlKCk7CisgICAgaW50IG1lZGl1bVNpemUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplID8g
c2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRT
aXplKCk7CisgICAgaWYgKG1lZGl1bVNpemUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBtZWRpdW1T
aXplIDw9IGZvbnRTaXplVGFibGVNYXgpIHsKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgZW50cnkg
aW4gdGhlIHRhYmxlLgorICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6ZSAtIGZvbnRTaXplVGFi
bGVNaW47CisgICAgICAgIGludCBjb2wgPSAoa2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbCk7Cisg
ICAgICAgIHJldHVybiBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddW2NvbF0g
OiBzdHJpY3RGb250U2l6ZVRhYmxlW3Jvd11bY29sXTsKKyAgICB9CisKKyAgICAvLyBWYWx1ZSBp
cyBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgdGFibGUuIEFwcGx5IHRoZSBzY2FsZSBmYWN0b3Ig
aW5zdGVhZC4KKyAgICBmbG9hdCBtaW5Mb2dpY2FsU2l6ZSA9IG1heChzZXR0aW5ncy0+bWluaW11
bUxvZ2ljYWxGb250U2l6ZSgpLCAxKTsKKyAgICByZXR1cm4gbWF4KGZvbnRTaXplRmFjdG9yc1tr
ZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxsXSptZWRpdW1TaXplLCBtaW5Mb2dpY2FsU2l6ZSk7Cit9
CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW50IGZpbmROZWFyZXN0TGVnYWN5Rm9u
dFNpemUoaW50IHBpeGVsRm9udFNpemUsIGNvbnN0IFQqIHRhYmxlLCBpbnQgbXVsdGlwbGllcikK
K3sKKyAgICAvLyBJZ25vcmUgdGFibGVbMF0gYmVjYXVzZSB4eC1zbWFsbCBkb2VzIG5vdCBjb3Jy
ZXNwb25kIHRvIGFueSBsZWdhY3kgZm9udCBzaXplLgorICAgIGZvciAoaW50IGkgPSAxOyBpIDwg
dG90YWxLZXl3b3JkcyAtIDE7IGkrKykgeworICAgICAgICBpZiAocGl4ZWxGb250U2l6ZSAqIDIg
PCAodGFibGVbaV0gKyB0YWJsZVtpICsgMV0pICogbXVsdGlwbGllcikKKyAgICAgICAgICAgIHJl
dHVybiBpOworICAgIH0KKyAgICByZXR1cm4gdG90YWxLZXl3b3JkcyAtIDE7Cit9CisKK2ludCBT
dHlsZVJlc29sdmVyOjpsZWdhY3lGb250U2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIGludCBwaXhl
bEZvbnRTaXplLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpCit7CisgICAgU2V0dGlu
Z3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykK
KyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBib29sIHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5R
dWlya3NNb2RlKCk7CisgICAgaW50IG1lZGl1bVNpemUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRT
aXplID8gc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVs
dEZvbnRTaXplKCk7CisgICAgaWYgKG1lZGl1bVNpemUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBt
ZWRpdW1TaXplIDw9IGZvbnRTaXplVGFibGVNYXgpIHsKKyAgICAgICAgaW50IHJvdyA9IG1lZGl1
bVNpemUgLSBmb250U2l6ZVRhYmxlTWluOworICAgICAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdh
Y3lGb250U2l6ZTxpbnQ+KHBpeGVsRm9udFNpemUsIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6
ZVRhYmxlW3Jvd10gOiBzdHJpY3RGb250U2l6ZVRhYmxlW3Jvd10sIDEpOworICAgIH0KKworICAg
IHJldHVybiBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplPGZsb2F0PihwaXhlbEZvbnRTaXplLCBm
b250U2l6ZUZhY3RvcnMsIG1lZGl1bVNpemUpOworfQorCitzdGF0aWMgQ29sb3IgY29sb3JGb3JD
U1NWYWx1ZShpbnQgY3NzVmFsdWVJZCkKK3sKKyAgICBzdHJ1Y3QgQ29sb3JWYWx1ZSB7CisgICAg
ICAgIGludCBjc3NWYWx1ZUlkOworICAgICAgICBSR0JBMzIgY29sb3I7CisgICAgfTsKKworICAg
IHN0YXRpYyBjb25zdCBDb2xvclZhbHVlIGNvbG9yVmFsdWVzW10gPSB7CisgICAgICAgIHsgQ1NT
VmFsdWVBcXVhLCAweEZGMDBGRkZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVCbGFjaywgMHhGRjAw
MDAwMCB9LAorICAgICAgICB7IENTU1ZhbHVlQmx1ZSwgMHhGRjAwMDBGRiB9LAorICAgICAgICB7
IENTU1ZhbHVlRnVjaHNpYSwgMHhGRkZGMDBGRiB9LAorICAgICAgICB7IENTU1ZhbHVlR3JheSwg
MHhGRjgwODA4MCB9LAorICAgICAgICB7IENTU1ZhbHVlR3JlZW4sIDB4RkYwMDgwMDAgIH0sCisg
ICAgICAgIHsgQ1NTVmFsdWVHcmV5LCAweEZGODA4MDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVM
aW1lLCAweEZGMDBGRjAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVNYXJvb24sIDB4RkY4MDAwMDAg
fSwKKyAgICAgICAgeyBDU1NWYWx1ZU5hdnksIDB4RkYwMDAwODAgfSwKKyAgICAgICAgeyBDU1NW
YWx1ZU9saXZlLCAweEZGODA4MDAwICB9LAorICAgICAgICB7IENTU1ZhbHVlT3JhbmdlLCAweEZG
RkZBNTAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVQdXJwbGUsIDB4RkY4MDAwODAgfSwKKyAgICAg
ICAgeyBDU1NWYWx1ZVJlZCwgMHhGRkZGMDAwMCB9LAorICAgICAgICB7IENTU1ZhbHVlU2lsdmVy
LCAweEZGQzBDMEMwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVUZWFsLCAweEZGMDA4MDgwICB9LAor
ICAgICAgICB7IENTU1ZhbHVlVHJhbnNwYXJlbnQsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgeyBD
U1NWYWx1ZVdoaXRlLCAweEZGRkZGRkZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVZZWxsb3csIDB4
RkZGRkZGMDAgfSwKKyAgICAgICAgeyAwLCAwIH0KKyAgICB9OworCisgICAgZm9yIChjb25zdCBD
b2xvclZhbHVlKiBjb2wgPSBjb2xvclZhbHVlczsgY29sLT5jc3NWYWx1ZUlkOyArK2NvbCkgewor
ICAgICAgICBpZiAoY29sLT5jc3NWYWx1ZUlkID09IGNzc1ZhbHVlSWQpCisgICAgICAgICAgICBy
ZXR1cm4gY29sLT5jb2xvcjsKKyAgICB9CisgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpkZWZhdWx0
VGhlbWUoKS0+c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZl
cjo6Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRp
dmVWYWx1ZSogdmFsdWUpCit7CisgICAgaW50IGlkZW50ID0gdmFsdWUtPmdldElkZW50KCk7Cisg
ICAgc3dpdGNoIChpZGVudCkgeworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgorICAgIGNh
c2UgQ1NTVmFsdWVXZWJraXRMaW5rOgorICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRBY3RpdmVsaW5r
OgorICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK0NvbG9yIFN0
eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiB2
YWx1ZSwgYm9vbCBmb3JWaXNpdGVkTGluaykgY29uc3QKK3sKKyAgICBpZiAodmFsdWUtPmlzUkdC
Q29sb3IoKSkKKyAgICAgICAgcmV0dXJuIENvbG9yKHZhbHVlLT5nZXRSR0JBMzJWYWx1ZSgpKTsK
KworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaW50IGlkZW50ID0gdmFs
dWUtPmdldElkZW50KCk7CisgICAgc3dpdGNoIChpZGVudCkgeworICAgIGNhc2UgMDoKKyAgICAg
ICAgcmV0dXJuIENvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6CisgICAgICAg
IHJldHVybiBzdGF0ZS5kb2N1bWVudCgpLT50ZXh0Q29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVl
V2Via2l0TGluazoKKyAgICAgICAgcmV0dXJuIChzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpICYm
IGZvclZpc2l0ZWRMaW5rKSA/IHN0YXRlLmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rQ29sb3IoKSA6
IHN0YXRlLmRvY3VtZW50KCktPmxpbmtDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRB
Y3RpdmVsaW5rOgorICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+YWN0aXZlTGlua0Nv
bG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEZvY3VzUmluZ0NvbG9yOgorICAgICAgICBy
ZXR1cm4gUmVuZGVyVGhlbWU6OmZvY3VzUmluZ0NvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZUN1
cnJlbnRjb2xvcjoKKyAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPmNvbG9yKCk7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGNvbG9yRm9yQ1NTVmFsdWUoaWRlbnQpOworICAgIH0K
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlS
ZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCogZXhwciwgYm9vbCByZXN1bHQpCit7CisgICAgbV92
aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmFwcGVuZChhZG9wdFB0cihuZXcgTWVk
aWFRdWVyeVJlc3VsdCgqZXhwciwgcmVzdWx0KSkpOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6
OmFmZmVjdGVkQnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgcyA9IG1f
dmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5zaXplKCk7CisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHM7IGkrKykgeworICAgICAgICBpZiAobV9tZWRpdW0tPmV2YWwoJm1f
dmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9leHByZXNzaW9uKSAhPSBt
X3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fcmVzdWx0KQorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGlj
IFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBnZXRUcmFuc2Zvcm1PcGVyYXRpb25U
eXBlKFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2Zvcm1PcGVyYXRpb25UeXBlIHR5cGUp
Cit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlND
QUxFOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9w
ZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWDsKKyAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBU
cmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9u
OjpTQ0FMRV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFXzNEOworICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFOworICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBU
cmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlRSQU5TTEFURV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
OlRSQU5TTEFURV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xB
VEVfM0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlVHJhbnNmb3Jt
T3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEU7CisgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJu
IFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJh
dGlvbjo6Uk9UQVRFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRl
WlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1o7
CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlM0RUcmFuc2Zvcm1PcGVy
YXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV8zRDsKKyAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpTS0VXOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNrZXdYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VX
X1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVy
YXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWTsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246Ok1BVFJJWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6
TUFUUklYXzNEOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZl
VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpQRVJTUEVDVElW
RTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtub3duVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOworICAgIH0KKyAgICByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNy
ZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBz
dHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3Bl
cmF0aW9ucykKK3sKKyAgICBpZiAoIWluVmFsdWUgfHwgIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkp
IHsKKyAgICAgICAgb3V0T3BlcmF0aW9ucy5jbGVhcigpOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2
ZVpvb20oKSA6IDE7CisgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGZv
ciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgeworICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworCisgICAg
ICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSogdHJhbnNm
b3JtVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSo+KGkudmFsdWUo
KSk7CisgICAgICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KTsgKytqKSB7CisgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBoYXZl
Tm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCisg
ICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RW
YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOworCisgICAgICAgIHN3aXRjaCAodHJhbnNmb3JtVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSkgeworICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAg
ICAgIGRvdWJsZSBzeCA9IDEuMDsKKyAgICAgICAgICAgIGRvdWJsZSBzeSA9IDEuMDsKKyAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAg
c3kgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICAgICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAg
ICAgICAgICBzeSA9IHN4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJh
dGlvbjo6Y3JlYXRlKHN4LCBzeSwgMS4wLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5z
Zm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zv
cm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxl
M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBzeCA9IDEuMDsKKyAg
ICAgICAgICAgIGRvdWJsZSBzeSA9IDEuMDsKKyAgICAgICAgICAgIGRvdWJsZSBzeiA9IDEuMDsK
KyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAg
ICAgICAgc3ogPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxz
ZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHN5ID0g
Zmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikp
OworICAgICAgICAgICAgICAgICAgICAgICAgc3ogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFu
c2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAg
ICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGVyYXRpb25z
Lm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwg
c3ksIHN6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRp
b25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246Cisg
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1P
cGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0
ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgw
LCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOworICAg
ICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAg
ICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4
ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVy
YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNv
bmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdHkg
PSBjb252ZXJ0VG9GbG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5k
ZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9u
OjpjcmVhdGUodHgsIHR5LCBMZW5ndGgoMCwgRml4ZWQpLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25U
eXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVu
Z3RoIHR4ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0
aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHogPSBMZW5ndGgoMCwgRml4ZWQpOwor
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAg
ICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9v
dFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVl
LT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlU
cmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExl
bmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAg
ICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmly
c3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7
CisgICAgICAgICAgICAgICAgICAgICAgICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHRoaXJk
VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAx
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29u
dmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5l
ZCgpIHx8IHR6LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJh
bnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUodHgsIHR5LCB0eiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90
YXRlVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmaXJz
dFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKDAsIDAsIDEsIGFu
Z2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9u
OgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNmb3Jt
T3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgeCA9IDA7CisgICAgICAgICAgICBkb3Vi
bGUgeSA9IDA7CisgICAgICAgICAgICBkb3VibGUgeiA9IDA7CisgICAgICAgICAgICBkb3VibGUg
YW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworCisgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB4ID0gMTsKKyAg
ICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAg
ICAgICAgICAgeSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeiA9IDE7
CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNm
b3JtT3BlcmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlv
blR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPmxlbmd0aCgpIDwgNCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsK
KyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmb3VydGhWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMykpOworICAgICAgICAgICAgZG91YmxlIHggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgZG91YmxlIHkgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUo
KTsKKyAgICAgICAgICAgIGRvdWJsZSB6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZvdXJ0aFZhbHVlLT5jb21wdXRlRGVncmVlcygp
OworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5z
Zm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRp
b25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpT
a2V3VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJs
ZSBhbmdsZVggPSAwOworICAgICAgICAgICAgZG91YmxlIGFuZ2xlWSA9IDA7CisgICAgICAgICAg
ICBkb3VibGUgYW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIGFuZ2xl
WSA9IGFuZ2xlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYW5nbGVYID0g
YW5nbGU7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBl
KCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb24pIHsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGVZID0gc2Vj
b25kVmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJh
dGlvbnMoKS5hcHBlbmQoU2tld1RyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGFuZ2xlWCwgYW5n
bGVZLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCA2KQorICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgZG91YmxlIGEgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgZG91YmxlIGIgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91Ymxl
VmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBjID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSktPmdldERv
dWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZCA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpLT5n
ZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGUgPSB6b29tRmFjdG9yICogc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZiA9
IHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXhUcmFuc2Zvcm1PcGVy
YXRpb246OmNyZWF0ZShhLCBiLCBjLCBkLCBlLCBmKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXgzRFRy
YW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5n
dGgoKSA8IDE2KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggbWF0cml4KHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNm
b3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpLT5nZXREb3VibGVWYWx1ZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3Vi
bGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MikpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMykpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNikpLT5nZXRE
b3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soNykpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soOCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soOSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTApKS0+Z2V0RG91YmxlVmFs
dWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDExKSkt
PmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZh
Y3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMykpLT5nZXRE
b3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMTQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDE1KSktPmdldERvdWJsZVZhbHVlKCkpOworICAgICAgICAgICAgb3Bl
cmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOjpj
cmVhdGUobWF0cml4KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlv
bjogeworICAgICAgICAgICAgTGVuZ3RoIHAgPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAg
ICAgaWYgKGZpcnN0VmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgcCA9IGNvbnZl
cnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3Ip
OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHF1aXJr
IHRoYXQgc2hvdWxkIGdvIGF3YXkgd2hlbiAzZCB0cmFuc2Zvcm1zIGFyZSBmaW5hbGl6ZWQuCisg
ICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICAgICAgcCA9IHZhbCA+PSAwID8gTGVuZ3RoKGNsYW1wVG9Qb3NpdGl2ZUlu
dGVnZXIodmFsKSwgRml4ZWQpIDogTGVuZ3RoKFVuZGVmaW5lZCk7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmIChwLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUGVy
c3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShwKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtu
b3duVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dE9wZXJhdGlv
bnMgPSBvcGVyYXRpb25zOworICAgIHJldHVybiB0cnVlOworfQorCisjaWYgRU5BQkxFKENTU19G
SUxURVJTKQorc3RhdGljIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBmaWx0ZXJPcGVy
YXRpb25Gb3JUeXBlKFdlYktpdENTU0ZpbHRlclZhbHVlOjpGaWx0ZXJPcGVyYXRpb25UeXBlIHR5
cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpSRUZFUkVOQ0U7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6R3JheXNjYWxl
RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpHUkFZU0NB
TEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246
CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlNFUElBOworICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6OlNhdHVyYXRlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4g
RmlsdGVyT3BlcmF0aW9uOjpTQVRVUkFURTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVl
OjpIdWVSb3RhdGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRp
b246OkhVRV9ST1RBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0Rmls
dGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpJTlZFUlQ7Cisg
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6T3BhY2l0eUZpbHRlck9wZXJhdGlvbjoKKyAg
ICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6T1BBQ0lUWTsKKyAgICBjYXNlIFdlYktpdENT
U0ZpbHRlclZhbHVlOjpCcmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4g
RmlsdGVyT3BlcmF0aW9uOjpCUklHSFRORVNTOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFs
dWU6OkNvbnRyYXN0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpDT05UUkFTVDsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVy
T3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpCTFVSOworICAgIGNh
c2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246CisgICAg
ICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkRST1BfU0hBRE9XOworI2lmIEVOQUJMRShDU1Nf
U0hBREVSUykKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDdXN0b21GaWx0ZXJPcGVy
YXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTTsKKyNlbmRpZgor
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246Cisg
ICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok5PTkU7CisgICAgfQorICAgIHJldHVybiBG
aWx0ZXJPcGVyYXRpb246Ok5PTkU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVO
QUJMRShTVkcpCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCkK
K3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGlmICghc3RhdGUuc3R5bGUoKS0+
aGFzRmlsdGVyKCkgfHwgc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNl
TG9hZGVyID0gc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKyAgICBW
ZWN0b3I8UmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IHN0YXRl
LnN0eWxlKCktPm11dGFibGVGaWx0ZXIoKS5vcGVyYXRpb25zKCk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGZpbHRlck9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVm
UHRyPEZpbHRlck9wZXJhdGlvbj4gZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5h
dChpKTsKKyAgICAgICAgaWYgKGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09
IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VGaWx0
ZXJPcGVyYXRpb24qIHJlZmVyZW5jZUZpbHRlciA9IHN0YXRpY19jYXN0PFJlZmVyZW5jZUZpbHRl
ck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbi5nZXQoKSk7CisKKyAgICAgICAgICAgIFdlYktp
dENTU1NWR0RvY3VtZW50VmFsdWUqIHZhbHVlID0gc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygp
LmdldChyZWZlcmVuY2VGaWx0ZXIpLmdldCgpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENhY2hlZFNWR0RvY3VtZW50KiBj
YWNoZWREb2N1bWVudCA9IHZhbHVlLT5sb2FkKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICAg
ICAgICAgIGlmICghY2FjaGVkRG9jdW1lbnQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgICAgIC8vIFN0YXNoIHRoZSBDYWNoZWRTVkdEb2N1bWVudCBvbiB0aGUgcmVmZXJl
bmNlIGZpbHRlci4KKyAgICAgICAgICAgIHJlZmVyZW5jZUZpbHRlci0+c2V0Q2FjaGVkU1ZHRG9j
dW1lbnRSZWZlcmVuY2UoYWRvcHRQdHIobmV3IENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGNh
Y2hlZERvY3VtZW50KSkpOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRlLnBlbmRpbmdTVkdE
b2N1bWVudHMoKS5jbGVhcigpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
CitTdHlsZVNoYWRlciogU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFkZXIoQ1NTVmFsdWUqIHZhbHVl
KQoreworICAgIGlmICh2YWx1ZS0+aXNXZWJLaXRDU1NTaGFkZXJWYWx1ZSgpKQorICAgICAgICBy
ZXR1cm4gY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoc3RhdGljX2Nhc3Q8V2Vi
S2l0Q1NTU2hhZGVyVmFsdWUqPih2YWx1ZSkpOworICAgIHJldHVybiAwOworfQorCitTdHlsZVNo
YWRlciogU3R5bGVSZXNvbHZlcjo6Y2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUo
V2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHZhbHVlKQoreworICAgIFN0eWxlU2hhZGVyKiBzaGFkZXIg
PSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nU2hhZGVyKCk7CisgICAgaWYgKHNoYWRlciAmJiBzaGFk
ZXItPmlzUGVuZGluZ1NoYWRlcigpKQorICAgICAgICBtX3N0YXRlLnNldEhhc1BlbmRpbmdTaGFk
ZXJzKHRydWUpOworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
bG9hZFBlbmRpbmdTaGFkZXJzKCkKK3sKKyAgICBpZiAoIW1fc3RhdGUuc3R5bGUoKS0+aGFzRmls
dGVyKCkgfHwgIW1fc3RhdGUuaGFzUGVuZGluZ1NoYWRlcnMoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0gbV9zdGF0
ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworCisgICAgVmVjdG9yPFJlZlB0
cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBtX3N0YXRlLnN0eWxlKCkt
Pm11dGFibGVGaWx0ZXIoKS5vcGVyYXRpb25zKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGZpbHRlck9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVmUHRyPEZpbHRl
ck9wZXJhdGlvbj4gZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5hdChpKTsKKyAg
ICAgICAgaWYgKGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09IEZpbHRlck9w
ZXJhdGlvbjo6Q1VTVE9NKSB7CisgICAgICAgICAgICBDdXN0b21GaWx0ZXJPcGVyYXRpb24qIGN1
c3RvbUZpbHRlciA9IHN0YXRpY19jYXN0PEN1c3RvbUZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9w
ZXJhdGlvbi5nZXQoKSk7CisgICAgICAgICAgICBBU1NFUlQoY3VzdG9tRmlsdGVyLT5wcm9ncmFt
KCkpOworICAgICAgICAgICAgU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtKiBwcm9ncmFtID0gc3Rh
dGljX2Nhc3Q8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtKj4oY3VzdG9tRmlsdGVyLT5wcm9ncmFt
KCkpOworICAgICAgICAgICAgaWYgKHByb2dyYW0tPnZlcnRleFNoYWRlcigpICYmIHByb2dyYW0t
PnZlcnRleFNoYWRlcigpLT5pc1BlbmRpbmdTaGFkZXIoKSkgeworICAgICAgICAgICAgICAgIFdl
YktpdENTU1NoYWRlclZhbHVlKiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGlu
Z1NoYWRlcio+KHByb2dyYW0tPnZlcnRleFNoYWRlcigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKKyAg
ICAgICAgICAgICAgICBwcm9ncmFtLT5zZXRWZXJ0ZXhTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hl
ZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkgJiYgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFk
ZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFk
ZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihw
cm9ncmFtLT5mcmFnbWVudFNoYWRlcigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKKyAgICAgICAgICAg
ICAgICBwcm9ncmFtLT5zZXRGcmFnbWVudFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVy
KGNhY2hlZFJlc291cmNlTG9hZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyhmYWxzZSk7Cit9CisKK3N0YXRpYyBi
b29sIHNvcnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRvcihjb25zdCBSZWZQdHI8Q3VzdG9tRmls
dGVyUGFyYW1ldGVyPiYgYSwgY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGIp
Cit7CisgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmVMZXNzVGhhbihhLT5uYW1lKCksIGItPm5h
bWUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29s
dmVyOjpwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwg
Q1NTVmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRyPEN1c3RvbUZpbHRlckFycmF5UGFy
YW1ldGVyPiBhcnJheVBhcmFtZXRlciA9IEN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyOjpjcmVh
dGUobmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbGVuZ3RoID0gdmFsdWVzLT5sZW5n
dGgoKTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVl
cy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNQcmlt
aXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dmFsdWUpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBD
U1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICBhcnJheVBhcmFtZXRlci0+YWRkVmFsdWUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZh
bHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gYXJyYXlQYXJhbWV0ZXIucmVsZWFzZSgpOworfQor
CitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VD
dXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxp
c3QqIHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyPiBu
dW1iZXJQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI6OmNyZWF0ZShuYW1l
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFsdWVzLT5sZW5ndGgoKTsgKytpKSB7
CisgICAgICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
ayhpKTsKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05V
TUJFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBudW1iZXJQYXJhbWV0ZXItPmFk
ZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0
dXJuIG51bWJlclBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmls
dGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBh
cmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQoreworICAg
IFJlZlB0cjxDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI+IHRyYW5zZm9ybVBhcmFtZXRl
ciA9IEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOworICAgIFRy
YW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRp
b25zKHZhbHVlcywgbV9zdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwg
b3BlcmF0aW9ucyk7CisgICAgdHJhbnNmb3JtUGFyYW1ldGVyLT5zZXRPcGVyYXRpb25zKG9wZXJh
dGlvbnMpOworICAgIHJldHVybiB0cmFuc2Zvcm1QYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQ
YXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0
b21GaWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZSogcGFyYW1ldGVy
VmFsdWUpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBvdGhlciBwYXJhbWV0ZXJzIHR5cGVz
IHBhcnNpbmcuCisgICAgLy8gYm9vbGVhbnM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03NjQzOAorICAgIC8vIHRleHR1cmVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NDIKKyAgICAvLyBtYXQyLCBtYXQzLCBtYXQ0OiBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NDQKKyAgICAvLyBOdW1iZXIgcGFy
YW1ldGVycyBhcmUgd3JhcHBlZCBpbnNpZGUgYSBDU1NWYWx1ZUxpc3QgYW5kIGFsbAorICAgIC8v
IHRoZSBvdGhlciBmdW5jdGlvbnMgdmFsdWVzIGluaGVyaXQgZnJvbSBDU1NWYWx1ZUxpc3QuCisg
ICAgaWYgKCFwYXJhbWV0ZXJWYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBDU1NWYWx1ZUxpc3QqIHZhbHVlcyA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+
KHBhcmFtZXRlclZhbHVlKTsKKyAgICBpZiAoIXZhbHVlcy0+bGVuZ3RoKCkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgaWYgKHBhcmFtZXRlclZhbHVlLT5pc1dlYktpdENTU0FycmF5RnVuY3Rp
b25WYWx1ZSgpKQorICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
cihuYW1lLCB2YWx1ZXMpOworCisgICAgLy8gSWYgdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBsaXN0
IGlzIGEgdHJhbnNmb3JtIGZ1bmN0aW9uLAorICAgIC8vIHRoZW4gd2UgY291bGQgc2FmZWx5IGFz
c3VtZSB0aGF0IGFsbCB0aGUgcmVtYWluaW5nIGl0ZW1zCisgICAgLy8gYXJlIHRyYW5zZm9ybXMu
IHBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyIHdpbGwKKyAgICAvLyByZXR1cm4g
MCBpZiB0aGF0IGFzc3VtcHRpb24gaXMgaW5jb3JyZWN0LgorICAgIGlmICh2YWx1ZXMtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMCktPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAg
ICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKG5hbWUsIHZhbHVl
cyk7CisKKyAgICAvLyBXZSBjYW4gaGF2ZSBvbmx5IGFycmF5cyBvZiBib29sZWFucyBvciBudW1i
ZXJzLCBzbyB1c2UgdGhlIGZpcnN0IHZhbHVlIHRvIGNob29zZSBiZXR3ZWVuIHRob3NlIHR3by4K
KyAgICAvLyBXZSBuZWVkIHVwIHRvIDQgdmFsdWVzIChhbGwgYm9vbGVhbnMgb3IgYWxsIG51bWJl
cnMpLgorICAgIGlmICghdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1p
dGl2ZVZhbHVlKCkgfHwgdmFsdWVzLT5sZW5ndGgoKSA+IDQpCisgICAgICAgIHJldHVybiAwOwor
ICAgIAorICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFByaW1pdGl2ZVZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MCkpOworICAgIGlmIChmaXJzdFByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPT0gQ1NT
UHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOworCisgICAgLy8gRklYTUU6IEltcGxl
bWVudCB0aGUgYm9vbGVhbiBhcnJheSBwYXJhbWV0ZXIgaGVyZS4KKyAgICAvLyBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKKworICAgIHJldHVybiAwOworfQor
Citib29sIFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NW
YWx1ZSogcGFyYW1ldGVyc1ZhbHVlLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0JiBwYXJhbWV0
ZXJMaXN0KQoreworICAgIEhhc2hTZXQ8U3RyaW5nPiBrbm93blBhcmFtZXRlck5hbWVzOworICAg
IENTU1ZhbHVlTGlzdEl0ZXJhdG9yIHBhcmFtZXRlckl0ZXJhdG9yKHBhcmFtZXRlcnNWYWx1ZSk7
CisgICAgZm9yICg7IHBhcmFtZXRlckl0ZXJhdG9yLmhhc01vcmUoKTsgcGFyYW1ldGVySXRlcmF0
b3IuYWR2YW5jZSgpKSB7CisgICAgICAgIGlmICghcGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKS0+
aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IocGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKSk7CisgICAg
ICAgIGlmICghaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6
Q1NTX1NUUklORykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAg
IFN0cmluZyBuYW1lID0gcHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAg
IC8vIERvIG5vdCBhbGxvdyBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzLgorICAgICAgICBpZiAo
a25vd25QYXJhbWV0ZXJOYW1lcy5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAga25vd25QYXJhbWV0ZXJOYW1lcy5hZGQobmFtZSk7CisgICAgICAgIAor
ICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIWl0ZXJh
dG9yLmhhc01vcmUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAg
ICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcmFtZXRlciA9IHBhcnNlQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyKG5hbWUsIGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICBpZiAoIXBh
cmFtZXRlcikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcGFyYW1ldGVyTGlz
dC5hcHBlbmQocGFyYW1ldGVyLnJlbGVhc2UoKSk7CisgICAgfQorICAgIAorICAgIC8vIE1ha2Ug
c3VyZSB3ZSBzb3J0IHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBwYXNzaW5nIHRoZW0gZG93biB0byB0
aGUgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uLgorICAgIHN0ZDo6c29ydChwYXJhbWV0ZXJMaXN0LmJl
Z2luKCksIHBhcmFtZXRlckxpc3QuZW5kKCksIHNvcnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRv
cik7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVy
T3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRo
QXRSdWxlUmVmZXJlbmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkK
K3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHN0eWxlIHJlc29sdXRpb24gZm9yIHRoZSBjdXN0
b20gZmlsdGVyIGF0LXJ1bGUgcmVmZXJlbmNlIHN5bnRheC4KKyAgICBVTlVTRURfUEFSQU0oZmls
dGVyVmFsdWUpOworICAgIHJldHVybiAwOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9w
ZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aElu
bGluZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCit7CisgICAgQ1NT
VmFsdWUqIHNoYWRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDApOworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNoYWRlcnNWYWx1ZS0+
aXNWYWx1ZUxpc3QoKSk7CisgICAgQ1NTVmFsdWVMaXN0KiBzaGFkZXJzTGlzdCA9IHN0YXRpY19j
YXN0PENTU1ZhbHVlTGlzdCo+KHNoYWRlcnNWYWx1ZSk7CisKKyAgICB1bnNpZ25lZCBzaGFkZXJz
TGlzdExlbmd0aCA9IHNoYWRlcnNMaXN0LT5sZW5ndGgoKTsKKyAgICBBU1NFUlQoc2hhZGVyc0xp
c3RMZW5ndGgpOworCisgICAgUmVmUHRyPFN0eWxlU2hhZGVyPiB2ZXJ0ZXhTaGFkZXIgPSBzdHls
ZVNoYWRlcihzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7CisgICAgUmVm
UHRyPFN0eWxlU2hhZGVyPiBmcmFnbWVudFNoYWRlcjsKKyAgICBDdXN0b21GaWx0ZXJQcm9ncmFt
VHlwZSBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9CTEVORFNfRUxFTUVOVF9URVhUVVJFOwor
ICAgIEN1c3RvbUZpbHRlclByb2dyYW1NaXhTZXR0aW5ncyBtaXhTZXR0aW5nczsKKworICAgIGlm
IChzaGFkZXJzTGlzdExlbmd0aCA+IDEpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGZyYWdtZW50U2hh
ZGVyT3JNaXhGdW5jdGlvbiA9IHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEp
OworCisgICAgICAgIGlmIChmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24tPmlzV2ViS2l0Q1NT
TWl4RnVuY3Rpb25WYWx1ZSgpKSB7CisgICAgICAgICAgICBXZWJLaXRDU1NNaXhGdW5jdGlvblZh
bHVlKiBtaXhGdW5jdGlvbiA9IHN0YXRpY19jYXN0PFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUq
PihmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24pOworICAgICAgICAgICAgQ1NTVmFsdWVMaXN0
SXRlcmF0b3IgaXRlcmF0b3IobWl4RnVuY3Rpb24pOworCisgICAgICAgICAgICBBU1NFUlQobWl4
RnVuY3Rpb24tPmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVT
aGFkZXIoaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7
CisKKyAgICAgICAgICAgIEFTU0VSVChtaXhGdW5jdGlvbi0+bGVuZ3RoKCkgPD0gMyk7CisgICAg
ICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTW9yZSgpKSB7CisgICAgICAgICAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ1NTUGFyc2Vy
Ojppc0JsZW5kTW9kZShwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkpCisgICAgICAgICAgICAg
ICAgICAgIG1peFNldHRpbmdzLmJsZW5kTW9kZSA9ICpwcmltaXRpdmVWYWx1ZTsKKyAgICAgICAg
ICAgICAgICBlbHNlIGlmIChDU1NQYXJzZXI6OmlzQ29tcG9zaXRlT3BlcmF0b3IocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5jb21w
b3NpdGVPcGVyYXRvciA9ICpwcmltaXRpdmVWYWx1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAg
IGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIHByb2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX05PX0VMRU1FTlRfVEVYVFVSRTsK
KyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVTaGFkZXIoZnJhZ21lbnRTaGFkZXJP
ck1peEZ1bmN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBtZXNo
Um93cyA9IDE7CisgICAgdW5zaWduZWQgbWVzaENvbHVtbnMgPSAxOworICAgIEN1c3RvbUZpbHRl
ck1lc2hUeXBlIG1lc2hUeXBlID0gTWVzaFR5cGVBdHRhY2hlZDsKKyAgICAKKyAgICBDU1NWYWx1
ZSogcGFyYW1ldGVyc1ZhbHVlID0gMDsKKyAgICAKKyAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0
aCgpID4gMSkgeworICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihmaWx0ZXJW
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgIAorICAgICAgICAvLyBU
aGUgc2Vjb25kIHZhbHVlIG1pZ2h0IGJlIHRoZSBtZXNoIGJveCBvciB0aGUgbGlzdCBvZiBwYXJh
bWV0ZXJzOgorICAgICAgICAvLyBJZiBpdCBzdGFydHMgd2l0aCBhIG51bWJlciBvciBhbnkgb2Yg
dGhlIG1lc2gtYm94IGlkZW50aWZpZXJzIGl0IGlzIAorICAgICAgICAvLyB0aGUgbWVzaC1ib3gg
bGlzdCwgaWYgbm90IGl0IG1lYW5zIGl0IGlzIHRoZSBwYXJhbWV0ZXJzIGxpc3QuCisKKyAgICAg
ICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkp
IHsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAg
ICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJ
ZiBvbmx5IG9uZSBpbnRlZ2VyIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBzZXQgYm90aAor
ICAgICAgICAgICAgICAgIC8vIHRoZSByb3dzIGFuZCB0aGUgY29sdW1ucy4KKyAgICAgICAgICAg
ICAgICBtZXNoQ29sdW1ucyA9IG1lc2hSb3dzID0gcHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVl
KCk7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhbm90aGVyIG51bWJlciBmb3IgdGhl
IHJvd3MuCisgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRv
ci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihp
dGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNoUm93cyA9IHByaW1p
dGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0
b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaXRlcmF0b3Iu
aGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURldGFjaGVkKSB7CisgICAgICAgICAgICAgICAg
bWVzaFR5cGUgPSBNZXNoVHlwZURldGFjaGVkOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFk
dmFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYg
KCFpdGVyYXRvci5pbmRleCgpKSB7CisgICAgICAgICAgICAvLyBJZiBubyB2YWx1ZSB3YXMgY29u
c3VtZWQgZnJvbSB0aGUgbWVzaCB2YWx1ZSwgdGhlbiBpdCBpcyBqdXN0IGEgcGFyYW1ldGVyIGxp
c3QsIG1lYW5pbmcgdGhhdCB3ZSBlbmQgdXAKKyAgICAgICAgICAgIC8vIGhhdmluZyBqdXN0IHR3
byBDU1NMaXN0VmFsdWVzOiBsaXN0IG9mIHNoYWRlcnMgYW5kIGxpc3Qgb2YgcGFyYW1ldGVycy4K
KyAgICAgICAgICAgIEFTU0VSVChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMik7CisgICAgICAg
ICAgICBwYXJhbWV0ZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0
aCgpID4gMiAmJiAhcGFyYW1ldGVyc1ZhbHVlKQorICAgICAgICBwYXJhbWV0ZXJzVmFsdWUgPSBm
aWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKTsKKyAgICAKKyAgICBDdXN0b21G
aWx0ZXJQYXJhbWV0ZXJMaXN0IHBhcmFtZXRlckxpc3Q7CisgICAgaWYgKHBhcmFtZXRlcnNWYWx1
ZSAmJiAhcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KHBhcmFtZXRlcnNWYWx1ZSwgcGFy
YW1ldGVyTGlzdCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIFJlZlB0cjxTdHlsZUN1
c3RvbUZpbHRlclByb2dyYW0+IHByb2dyYW0gPSBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW06OmNy
ZWF0ZSh2ZXJ0ZXhTaGFkZXIucmVsZWFzZSgpLCBmcmFnbWVudFNoYWRlci5yZWxlYXNlKCksIHBy
b2dyYW1UeXBlLCBtaXhTZXR0aW5ncywgbWVzaFR5cGUpOworICAgIHJldHVybiBDdXN0b21GaWx0
ZXJPcGVyYXRpb246OmNyZWF0ZShwcm9ncmFtLnJlbGVhc2UoKSwgcGFyYW1ldGVyTGlzdCwgbWVz
aFJvd3MsIG1lc2hDb2x1bW5zLCBtZXNoVHlwZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmls
dGVyT3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24o
V2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQoreworICAgIEFTU0VSVChmaWx0ZXJW
YWx1ZS0+bGVuZ3RoKCkpOworICAgIGJvb2wgaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPSBmaWx0
ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpOwor
ICAgIHJldHVybiBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA/IGNyZWF0ZUN1c3RvbUZpbHRlck9w
ZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoZmlsdGVyVmFsdWUpIDogY3JlYXRlQ3Vz
dG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChmaWx0ZXJWYWx1ZSk7Cit9CisKKyNl
bmRpZgorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFs
dWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwg
RmlsdGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucykKK3sKKyAgICBBU1NFUlQob3V0T3BlcmF0
aW9ucy5pc0VtcHR5KCkpOworICAgIAorICAgIGlmICghaW5WYWx1ZSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIAorICAgIGlmIChpblZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPihpblZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgICAKKyAgICBpZiAoIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3Rp
dmVab29tKCkgOiAxOworICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICBmb3Ig
KENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNl
KCkpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAg
aWYgKCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTRmlsdGVyVmFsdWUoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSA9IHN0
YXRpY19jYXN0PFdlYktpdENTU0ZpbHRlclZhbHVlKj4oaS52YWx1ZSgpKTsKKyAgICAgICAgRmls
dGVyT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBmaWx0ZXJPcGVyYXRp
b25Gb3JUeXBlKGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkpOworCisjaWYgRU5BQkxFKENT
U19TSEFERVJTKQorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246
OlZBTElEQVRFRF9DVVNUT00pIHsKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlZEN1c3RvbUZpbHRl
ck9wZXJhdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gZW5kIHVwIGluIHRoZSBSZW5kZXJTdHlsZS4K
KyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9u
OjpDVVNUT00pIHsKKyAgICAgICAgICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IG9w
ZXJhdGlvbiA9IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihmaWx0ZXJWYWx1ZSk7CisgICAg
ICAgICAgICBpZiAoIW9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChv
cGVyYXRpb24pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZgorICAg
ICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewor
I2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9
IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDU1NWYWx1ZSogYXJn
dW1lbnQgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKKworICAgICAg
ICAgICAgaWYgKCFhcmd1bWVudC0+aXNXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKCkpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFdlYktpdENTU1NWR0RvY3VtZW50
VmFsdWUqIHN2Z0RvY3VtZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NTVkdEb2N1bWVu
dFZhbHVlKj4oYXJndW1lbnQpOworICAgICAgICAgICAgS1VSTCB1cmwgPSBtX3N0YXRlLmRvY3Vt
ZW50KCktPmNvbXBsZXRlVVJMKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpKTsKKworICAgICAgICAg
ICAgUmVmUHRyPFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0aW9uID0gUmVmZXJlbmNl
RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIHVybC5mcmFn
bWVudElkZW50aWZpZXIoKSwgb3BlcmF0aW9uVHlwZSk7CisgICAgICAgICAgICBpZiAoU1ZHVVJJ
UmVmZXJlbmNlOjppc0V4dGVybmFsVVJJUmVmZXJlbmNlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgp
LCBtX3N0YXRlLmRvY3VtZW50KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdmdEb2N1bWVu
dFZhbHVlLT5sb2FkUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUucGVu
ZGluZ1NWR0RvY3VtZW50cygpLnNldChvcGVyYXRpb24uZ2V0KCksIHN2Z0RvY3VtZW50VmFsdWUp
OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN2Z0RvY3VtZW50VmFsdWUtPmNhY2hlZFNWR0Rv
Y3VtZW50KCkpCisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi0+c2V0Q2FjaGVkU1ZHRG9j
dW1lbnRSZWZlcmVuY2UoYWRvcHRQdHIobmV3IENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKHN2
Z0RvY3VtZW50VmFsdWUtPmNhY2hlZFNWR0RvY3VtZW50KCkpKSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKKyNl
bmRpZgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVj
ayB0aGF0IGFsbCBwYXJhbWV0ZXJzIGFyZSBwcmltaXRpdmUgdmFsdWVzLCB3aXRoIHRoZQorICAg
ICAgICAvLyBleGNlcHRpb24gb2YgZHJvcCBzaGFkb3cgd2hpY2ggaGFzIGEgU2hhZG93VmFsdWUg
cGFyYW1ldGVyLgorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSAhPSBGaWx0ZXJPcGVyYXRpb246
OkRST1BfU0hBRE9XKSB7CisgICAgICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9
IGZhbHNlOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZpbHRlclZhbHVl
LT5sZW5ndGgoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmIChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RWYWx1ZSA9IGZpbHRl
clZhbHVlLT5sZW5ndGgoKSA/IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlsdGVy
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpIDogMDsKKyAgICAgICAgc3dpdGNoIChm
aWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSB7CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6OlNhdHVyYXRlRmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBk
b3VibGUgYW1vdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkg
PT0gMSkgeworICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZh
bHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQor
ICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZp
bHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSAw
OworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKQorICAgICAgICAg
ICAgICAgIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKworICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJP
cGVyYXRpb246OmNyZWF0ZShhbmdsZSwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0
RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmln
aHRuZXNzRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVl
OjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6T3BhY2l0eUZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFtb3Vu
dCA9IChmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU0ZpbHRlclZhbHVl
OjpCcmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uKSA/IDAgOiAxOworICAgICAgICAgICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYW1vdW50ID0gZmly
c3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1
ZS0+aXNQZXJjZW50YWdlKCkpCisgICAgICAgICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7Cisg
ICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVu
ZChCYXNpY0NvbXBvbmVudFRyYW5zZmVyRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW1vdW50LCBv
cGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAg
ICAgICBMZW5ndGggc3RkRGV2aWF0aW9uID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAg
IGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPj0gMSkKKyAgICAgICAgICAgICAgICBzdGREZXZp
YXRpb24gPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxl
LCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGlmIChzdGREZXZpYXRpb24uaXNVbmRlZmluZWQo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIG9wZXJhdGlv
bnMub3BlcmF0aW9ucygpLmFwcGVuZChCbHVyRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoc3RkRGV2
aWF0aW9uLCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0
aW9uOiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9IDEpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBDU1NWYWx1ZSogY3NzVmFs
dWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKKyAgICAgICAgICAg
IGlmICghY3NzVmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dW
YWx1ZSo+KGNzc1ZhbHVlKTsKKyAgICAgICAgICAgIEludFBvaW50IGxvY2F0aW9uKGl0ZW0tPngt
PmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50PihzdHls
ZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKSk7CisgICAgICAgICAgICBpbnQgYmx1ciA9IGl0ZW0t
PmJsdXIgPyBpdGVtLT5ibHVyLT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwg
em9vbUZhY3RvcikgOiAwOworICAgICAgICAgICAgQ29sb3IgY29sb3I7CisgICAgICAgICAgICBp
ZiAoaXRlbS0+Y29sb3IpCisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRp
dmVWYWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3Bl
cmF0aW9ucygpLmFwcGVuZChEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUobG9jYXRp
b24sIGJsdXIsIGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50LCBv
cGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgorICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dE9wZXJhdGlvbnMgPSBvcGVyYXRp
b25zOworICAgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKKworUGFzc1JlZlB0cjxTdHlsZUlt
YWdlPiBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKiBw
ZW5kaW5nSW1hZ2UpCit7CisgICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNl
TG9hZGVyID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworCisg
ICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpKSB7CisgICAgICAgIENTU0ltYWdl
VmFsdWUqIGltYWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKTsKKyAgICAg
ICAgcmV0dXJuIGltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsK
KyAgICB9CisKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCkp
IHsKKyAgICAgICAgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogaW1hZ2VHZW5lcmF0b3JWYWx1ZSA9
IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpOworICAgICAgICBpbWFnZUdl
bmVyYXRvclZhbHVlLT5sb2FkU3ViaW1hZ2VzKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICAg
ICAgcmV0dXJuIFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShpbWFnZUdlbmVyYXRvclZhbHVl
KTsKKyAgICB9CisKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NDdXJzb3JJbWFnZVZhbHVlKCkp
IHsKKyAgICAgICAgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogY3Vyc29ySW1hZ2VWYWx1ZSA9IHBlbmRp
bmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpOworICAgICAgICByZXR1cm4gY3Vyc29ySW1h
Z2VWYWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0KKworI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlU2V0
VmFsdWUoKSkgeworICAgICAgICBDU1NJbWFnZVNldFZhbHVlKiBpbWFnZVNldFZhbHVlID0gcGVu
ZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCk7CisgICAgICAgIHJldHVybiBpbWFnZVNldFZh
bHVlLT5jYWNoZWRJbWFnZVNldChjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgfQorI2VuZGlm
CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ0lt
YWdlcygpCit7CisgICAgaWYgKG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNv
bnN0X2l0ZXJhdG9yOjpLZXlzIGVuZCA9IG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygp
LmVuZCgpLmtleXMoKTsKKyAgICBmb3IgKFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9p
dGVyYXRvcjo6S2V5cyBpdCA9IG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmJlZ2lu
KCkua2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgQ1NTUHJvcGVydHlJRCBjdXJy
ZW50UHJvcGVydHkgPSAqaXQ7CisKKyAgICAgICAgc3dpdGNoIChjdXJyZW50UHJvcGVydHkpIHsK
KyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZTogeworICAgICAgICAgICAg
Zm9yIChGaWxsTGF5ZXIqIGJhY2tncm91bmRMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNz
QmFja2dyb3VuZExheWVycygpOyBiYWNrZ3JvdW5kTGF5ZXI7IGJhY2tncm91bmRMYXllciA9IGJh
Y2tncm91bmRMYXllci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRM
YXllci0+aW1hZ2UoKSAmJiBiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdl
KCkpCisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRMYXllci0+c2V0SW1hZ2UobG9hZFBl
bmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGJhY2tncm91bmRMYXll
ci0+aW1hZ2UoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlDb250ZW50OiB7CisgICAgICAgICAgICBmb3Ig
KENvbnRlbnREYXRhKiBjb250ZW50RGF0YSA9IGNvbnN0X2Nhc3Q8Q29udGVudERhdGEqPihtX3N0
YXRlLnN0eWxlKCktPmNvbnRlbnREYXRhKCkpOyBjb250ZW50RGF0YTsgY29udGVudERhdGEgPSBj
b250ZW50RGF0YS0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREYXRhLT5p
c0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3R5bGVJbWFnZSogaW1hZ2UgPSBzdGF0
aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5pbWFnZSgpOworICAgICAg
ICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJbWFnZSA9IGxvYWRQZW5kaW5n
SW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpOworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKGxvYWRlZEltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPnNldEltYWdl
KGxvYWRlZEltYWdlLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q3Vyc29yOiB7CisgICAgICAgICAgICBpZiAoQ3Vyc29y
TGlzdCogY3Vyc29yTGlzdCA9IG1fc3RhdGUuc3R5bGUoKS0+Y3Vyc29ycygpKSB7CisgICAgICAg
ICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjdXJzb3JMaXN0LT5zaXplKCk7ICsraSkg
eworICAgICAgICAgICAgICAgICAgICBDdXJzb3JEYXRhJiBjdXJyZW50Q3Vyc29yID0gY3Vyc29y
TGlzdC0+YXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHlsZUltYWdlKiBpbWFnZSA9
IGN1cnJlbnRDdXJzb3IuaW1hZ2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlt
YWdlLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJl
bnRDdXJzb3Iuc2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRp
bmdJbWFnZSo+KGltYWdlKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZUltYWdlOiB7CisgICAgICAgICAgICBpZiAobV9z
dGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0
eWxlSW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0
eWxlKCktPnNldExpc3RTdHlsZUltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5
bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCkpKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVySW1hZ2VTb3VyY2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPmJvcmRl
ckltYWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpLT5p
c1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0Qm9y
ZGVySW1hZ2VTb3VyY2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJ
bWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKSkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hS
ZWZsZWN0OiB7CisgICAgICAgICAgICBpZiAoU3R5bGVSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0g
bV9zdGF0ZS5zdHlsZSgpLT5ib3hSZWZsZWN0KCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBO
aW5lUGllY2VJbWFnZSYgbWFza0ltYWdlID0gcmVmbGVjdGlvbi0+bWFzaygpOworICAgICAgICAg
ICAgICAgIGlmIChtYXNrSW1hZ2UuaW1hZ2UoKSAmJiBtYXNrSW1hZ2UuaW1hZ2UoKS0+aXNQZW5k
aW5nSW1hZ2UoKSkgeworICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9h
ZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdl
Kj4obWFza0ltYWdlLmltYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+
c2V0TWFzayhOaW5lUGllY2VJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCksIG1hc2tJbWFnZS5p
bWFnZVNsaWNlcygpLCBtYXNrSW1hZ2UuZmlsbCgpLCBtYXNrSW1hZ2UuYm9yZGVyU2xpY2VzKCks
IG1hc2tJbWFnZS5vdXRzZXQoKSwgbWFza0ltYWdlLmhvcml6b250YWxSdWxlKCksIG1hc2tJbWFn
ZS52ZXJ0aWNhbFJ1bGUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQm94SW1hZ2VTb3VyY2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCkt
Pm1hc2tCb3hJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291
cmNlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgp
LT5zZXRNYXNrQm94SW1hZ2VTb3VyY2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHls
ZVBlbmRpbmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNlKCkpKSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFza0ltYWdlOiB7CisgICAgICAgICAgICBmb3IgKEZpbGxMYXllciogbWFza0xheWVy
ID0gbV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NNYXNrTGF5ZXJzKCk7IG1hc2tMYXllcjsgbWFza0xh
eWVyID0gbWFza0xheWVyLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFza0xheWVy
LT5pbWFnZSgpICYmIG1hc2tMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAg
ICAgICAgICAgICAgICAgbWFza0xheWVyLT5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRp
Y19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obWFza0xheWVyLT5pbWFnZSgpKSkpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisgICAgfQorCisg
ICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1Jlc291cmNlcygpCit7CisgICAgLy8gU3RhcnQgbG9h
ZGluZyBpbWFnZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nSW1h
Z2VzKCk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgLy8gU3RhcnQgbG9hZGluZyB0
aGUgc2hhZGVycyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdTaGFk
ZXJzKCk7CisjZW5kaWYKKyAgICAKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShT
VkcpCisgICAgLy8gU3RhcnQgbG9hZGluZyB0aGUgU1ZHIERvY3VtZW50cyByZWZlcmVuY2VkIGJ5
IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKKyNlbmRpZgorfQor
CitpbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6Ok1hdGNoZWRQcm9wZXJ0
aWVzKCkKKyAgICA6IHBvc3NpYmx5UGFkZGVkTWVtYmVyKDApCit7Cit9CisKK2lubGluZSBTdHls
ZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6fk1hdGNoZWRQcm9wZXJ0aWVzKCkKK3sKK30K
Kwordm9pZCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6cmVwb3J0TWVtb3J5VXNh
Z2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1v
cnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlw
ZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIocHJvcGVydGllcywgInByb3BlcnRpZXMiKTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbTo6cmVw
b3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QK
K3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJD
b3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIobWF0Y2hlZFByb3BlcnRp
ZXMsICJtYXRjaGVkUHJvcGVydGllcyIpOworICAgIGluZm8uYWRkTWVtYmVyKHJhbmdlcywgInJh
bmdlcyIpOworICAgIGluZm8uYWRkTWVtYmVyKHJlbmRlclN0eWxlLCAicmVuZGVyU3R5bGUiKTsK
KyAgICBpbmZvLmFkZE1lbWJlcihwYXJlbnRSZW5kZXJTdHlsZSwgInBhcmVudFJlbmRlclN0eWxl
Iik7Cit9CisKK3ZvaWQgTWVkaWFRdWVyeVJlc3VsdDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5
T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0lu
Zm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7
CisgICAgaW5mby5hZGRNZW1iZXIobV9leHByZXNzaW9uLCAiZXhwcmVzc2lvbiIpOworfQorCit2
b2lkIFN0eWxlUmVzb2x2ZXI6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1l
bW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5
T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRk
TWVtYmVyKG1fcnVsZVNldHMsICJydWxlU2V0cyIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fa2V5
ZnJhbWVzUnVsZU1hcCwgImtleWZyYW1lc1J1bGVNYXAiKTsKKyAgICBpbmZvLmFkZE1lbWJlciht
X21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlIik7CisgICAg
aW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciwgIm1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyIik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX21l
ZGl1bSwgIm1lZGl1bSIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fcm9vdERlZmF1bHRTdHlsZSwg
InJvb3REZWZhdWx0U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2RvY3VtZW50LCAiZG9j
dW1lbnQiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fZm9udFNlbGVjdG9yLCAiZm9udFNlbGVj
dG9yIik7CisgICAgaW5mby5hZGRNZW1iZXIobV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlS
ZXN1bHRzLCAidmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cyIpOworICAgIGluZm8u
aWdub3JlTWVtYmVyKG1fc3R5bGVCdWlsZGVyKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2luc3Bl
Y3RvckNTU09NV3JhcHBlcnMpOworICAgIGluZm8uYWRkTWVtYmVyKG1fc2NvcGVSZXNvbHZlciwg
InNjb3BlUmVzb2x2ZXIiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fc3RhdGUsICJzdGF0ZSIp
OworCisgICAgLy8gRklYTUU6IG1vdmUgdGhpcyB0byBhIHBsYWNlIHdoZXJlIGl0IHdvdWxkIGJl
IGNhbGxlZCBvbmx5IG9uY2U/CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjpkZWZhdWx0U3R5bGUsICJkZWZhdWx0U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihD
U1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSwgImRlZmF1bHRRdWlya3NT
dHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFByaW50U3R5bGUsImRlZmF1bHRQcmludFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIoQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0Vmlld1NvdXJjZVN0eWxlLCAiZGVmYXVsdFZpZXdT
b3VyY2VTdHlsZSIpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAJKHJldmlzaW9uIDE0NTE4MSkKKysrIFNv
dXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI3LDUxNjEgKzI3LDEwNCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJTdHlsZVJlc29sdmVyLmgiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xsZWN0b3IuaCIKIAotI2lu
Y2x1ZGUgIkF0dHJpYnV0ZS5oIgotI2luY2x1ZGUgIkNTU0JvcmRlckltYWdlLmgiCi0jaW5jbHVk
ZSAiQ1NTQ2FsY3VsYXRpb25WYWx1ZS5oIgotI2luY2x1ZGUgIkNTU0N1cnNvckltYWdlVmFsdWUu
aCIKICNpbmNsdWRlICJDU1NEZWZhdWx0U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJDU1NGb250
RmFjZVJ1bGUuaCIKLSNpbmNsdWRlICJDU1NGb250U2VsZWN0b3IuaCIKLSNpbmNsdWRlICJDU1NM
aW5lQm94Q29udGFpblZhbHVlLmgiCi0jaW5jbHVkZSAiQ1NTUGFnZVJ1bGUuaCIKLSNpbmNsdWRl
ICJDU1NQYXJzZXIuaCIKLSNpbmNsdWRlICJDU1NQcmltaXRpdmVWYWx1ZU1hcHBpbmdzLmgiCi0j
aW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgotI2luY2x1ZGUgIkNTU1JlZmxlY3RWYWx1ZS5o
IgotI2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTU2VsZWN0b3JMaXN0Lmgi
Ci0jaW5jbHVkZSAiQ1NTU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTU3VwcG9ydHNSdWxlLmgi
Ci0jaW5jbHVkZSAiQ1NTVGltaW5nRnVuY3Rpb25WYWx1ZS5oIgotI2luY2x1ZGUgIkNTU1ZhbHVl
TGlzdC5oIgotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotI2luY2x1ZGUgIkNTU1ZhcmlhYmxl
VmFsdWUuaCIKLSNlbmRpZgotI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCi0jaW5jbHVkZSAiQ2Fs
Y3VsYXRpb25WYWx1ZS5oIgotI2luY2x1ZGUgIkNvbnRlbnREYXRhLmgiCi0jaW5jbHVkZSAiQ29u
dGV4dEZlYXR1cmVzLmgiCi0jaW5jbHVkZSAiQ291bnRlci5oIgotI2luY2x1ZGUgIkNvdW50ZXJD
b250ZW50LmgiCi0jaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgotI2luY2x1ZGUgIkRvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb24uaCIKLSNpbmNsdWRlICJFbGVtZW50U2hhZG93LmgiCi0jaW5jbHVk
ZSAiRm9udEZlYXR1cmVWYWx1ZS5oIgotI2luY2x1ZGUgIkZvbnRWYWx1ZS5oIgotI2luY2x1ZGUg
IkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVTZWxlY3Rpb24uaCIKLSNpbmNsdWRlICJGcmFtZVZp
ZXcuaCIKLSNpbmNsdWRlICJIVE1MRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSUZyYW1lRWxl
bWVudC5oIgotI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFt
ZXMuaCIKLSNpbmNsdWRlICJIVE1MT3B0aW9uRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxQcm9n
cmVzc0VsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MU3R5bGVFbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTFRleHRBcmVhRWxlbWVudC5oIgotI2luY2x1ZGUgIkluc2VydGlvblBvaW50LmgiCi0jaW5j
bHVkZSAiSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVkZSAiS2V5ZnJhbWVMaXN0
LmgiCi0jaW5jbHVkZSAiTGlua0hhc2guaCIKLSNpbmNsdWRlICJMb2NhbGVUb1NjcmlwdE1hcHBp
bmcuaCIKLSNpbmNsdWRlICJNYXRoTUxOYW1lcy5oIgotI2luY2x1ZGUgIk1hdHJpeDNEVHJhbnNm
b3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0j
aW5jbHVkZSAiTWVkaWFMaXN0LmgiCi0jaW5jbHVkZSAiTWVkaWFRdWVyeUV2YWx1YXRvci5oIgot
I2luY2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgotI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250
ZXh0LmgiCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlBhaXIuaCIKLSNpbmNsdWRlICJQ
ZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlF1b3Rlc0RhdGEuaCIK
LSNpbmNsdWRlICJSZWN0LmgiCi0jaW5jbHVkZSAiUmVuZGVyUmVnaW9uLmgiCi0jaW5jbHVkZSAi
UmVuZGVyU2Nyb2xsYmFyLmgiCi0jaW5jbHVkZSAiUmVuZGVyU2Nyb2xsYmFyVGhlbWUuaCIKLSNp
bmNsdWRlICJSZW5kZXJTdHlsZUNvbnN0YW50cy5oIgotI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgi
Ci0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUgIlJvdGF0ZVRyYW5zZm9ybU9wZXJh
dGlvbi5oIgotI2luY2x1ZGUgIlJ1bGVTZXQuaCIKLSNpbmNsdWRlICJTVkdEb2N1bWVudEV4dGVu
c2lvbnMuaCIKLSNpbmNsdWRlICJTVkdGb250RmFjZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJTY2Fs
ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCi0jaW5j
bHVkZSAiU2VsZWN0b3JDaGVja2VyRmFzdFBhdGguaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgot
I2luY2x1ZGUgIlNoYWRvd0RhdGEuaCIKLSNpbmNsdWRlICJTaGFkb3dSb290LmgiCi0jaW5jbHVk
ZSAiU2hhZG93VmFsdWUuaCIKLSNpbmNsdWRlICJTaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ2llcy5o
IgotI2luY2x1ZGUgIlNrZXdUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJTdHlsZUJ1
aWxkZXIuaCIKLSNpbmNsdWRlICJTdHlsZUNhY2hlZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVH
ZW5lcmF0ZWRJbWFnZS5oIgotI2luY2x1ZGUgIlN0eWxlUGVuZGluZ0ltYWdlLmgiCiAjaW5jbHVk
ZSAiU3R5bGVQcm9wZXJ0eVNldC5oIgotI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTaG9ydGhhbmQu
aCIKICNpbmNsdWRlICJTdHlsZVJ1bGUuaCIKLSNpbmNsdWRlICJTdHlsZVJ1bGVJbXBvcnQuaCIK
LSNpbmNsdWRlICJTdHlsZVNoZWV0Q29udGVudHMuaCIKLSNpbmNsdWRlICJTdHlsZVNoZWV0TGlz
dC5oIgotI2luY2x1ZGUgIlRleHQuaCIKLSNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5o
IgotI2luY2x1ZGUgIlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlVz
ZXJBZ2VudFN0eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgi
Ci0jaW5jbHVkZSAiVmlzaXRlZExpbmtTdGF0ZS5oIgotI2luY2x1ZGUgIldlYkNvcmVNZW1vcnlJ
bnN0cnVtZW50YXRpb24uaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NLZXlmcmFtZVJ1bGUuaCIKLSNp
bmNsdWRlICJXZWJLaXRDU1NLZXlmcmFtZXNSdWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTUmVn
aW9uUnVsZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1RyYW5zZm9ybVZhbHVlLmgiCi0jaW5jbHVk
ZSAiV2ViS2l0Rm9udEZhbWlseU5hbWVzLmgiCi0jaW5jbHVkZSAiWE1MTmFtZXMuaCIKLSNpbmNs
dWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9N
ZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoU2V0Lmg+Ci0jaW5jbHVkZSA8d3RmL01lbW9yeUluc3Ry
dW1lbnRhdGlvblZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0jaW5jbHVkZSAi
RmlsdGVyT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTRmlsdGVyVmFsdWUuaCIKLSNl
bmRpZgotCi0jaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKQotI2luY2x1ZGUgIkRhc2hib2Fy
ZFJlZ2lvbi5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIkNhY2hlZFNW
R0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UuaCIKLSNp
bmNsdWRlICJTVkdEb2N1bWVudC5oIgotI2luY2x1ZGUgIlNWR0VsZW1lbnQuaCIKLSNpbmNsdWRl
ICJTVkdOYW1lcy5oIgotI2luY2x1ZGUgIlNWR1VSSVJlZmVyZW5jZS5oIgotI2luY2x1ZGUgIldl
YktpdENTU1NWR0RvY3VtZW50VmFsdWUuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19TSEFE
RVJTKQotI2luY2x1ZGUgIkN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyLmgiCi0jaW5jbHVkZSAi
Q3VzdG9tRmlsdGVyQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyTnVtYmVyUGFy
YW1ldGVyLmgiCi0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAi
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyLmgiCi0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyVHJhbnNmb3Jt
UGFyYW1ldGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVDYWNoZWRTaGFkZXIuaCIKLSNpbmNsdWRlICJT
dHlsZUN1c3RvbUZpbHRlclByb2dyYW0uaCIKLSNpbmNsdWRlICJTdHlsZVBlbmRpbmdTaGFkZXIu
aCIKLSNpbmNsdWRlICJTdHlsZVNoYWRlci5oIgotI2luY2x1ZGUgIldlYktpdENTU01peEZ1bmN0
aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NTaGFkZXJWYWx1ZS5oIgotI2VuZGlmCi0K
LSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSNpbmNsdWRlICJDU1NJbWFnZVNldFZhbHVlLmgi
Ci0jaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZVNldC5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUo
VklERU9fVFJBQ0spCi0jaW5jbHVkZSAiV2ViVlRURWxlbWVudC5oIgotI2VuZGlmCi0KLXVzaW5n
IG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBXVEYgewotCi10ZW1wbGF0ZTw+IHN0cnVjdCBT
ZXF1ZW5jZU1lbW9yeUluc3RydW1lbnRhdGlvblRyYWl0czxjb25zdCBXZWJDb3JlOjpSdWxlRGF0
YSo+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgST4gc3RhdGljIHZvaWQgcmVwb3J0TWVtb3J5
VXNhZ2UoSSwgSSwgTWVtb3J5Q2xhc3NJbmZvJikgeyB9Ci19OwotCi19CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKLQotI2RlZmluZSBIQU5ETEVf
SU5IRVJJVChwcm9wLCBQcm9wKSBcCi1pZiAoaXNJbmhlcml0KSB7IFwKLSAgICBtX3N0YXRlLnN0
eWxlKCktPnNldCMjUHJvcChtX3N0YXRlLnBhcmVudFN0eWxlKCktPnByb3AoKSk7IFwKLSAgICBy
ZXR1cm47IFwKLX0KLQotI2RlZmluZSBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChwcm9wLCBQ
cm9wKSBcCi1IQU5ETEVfSU5IRVJJVChwcm9wLCBQcm9wKSBcCi1pZiAoaXNJbml0aWFsKSB7IFwK
LSAgICBtX3N0YXRlLnN0eWxlKCktPnNldCMjUHJvcChSZW5kZXJTdHlsZTo6aW5pdGlhbCMjUHJv
cCgpKTsgXAotICAgIHJldHVybjsgXAotfQotCi1SZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6
c19zdHlsZU5vdFlldEF2YWlsYWJsZTsKLQotc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIGxlZnRU
b1JpZ2h0RGVjbGFyYXRpb24oKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0
eWxlUHJvcGVydHlTZXQ+LCBsZWZ0VG9SaWdodERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVh
dGUoKSkpOwotICAgIGlmIChsZWZ0VG9SaWdodERlY2wtPmlzRW1wdHkoKSkKLSAgICAgICAgbGVm
dFRvUmlnaHREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVM
dHIpOwotICAgIHJldHVybiBsZWZ0VG9SaWdodERlY2wuZ2V0KCk7Ci19Ci0KLXN0YXRpYyBTdHls
ZVByb3BlcnR5U2V0KiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgcmlnaHRUb0xlZnREZWNsLCAoU3R5
bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAocmlnaHRUb0xlZnREZWNsLT5pc0Vt
cHR5KCkpCi0gICAgICAgIHJpZ2h0VG9MZWZ0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlE
aXJlY3Rpb24sIENTU1ZhbHVlUnRsKTsKLSAgICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgp
OwotfQotCi0KLWlubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmVuc3VyZVJ1bGVMaXN0KCkKLXsKLSAgICBpZiAoIW1fcnVsZUxpc3QpCi0gICAgICAgIG1fcnVs
ZUxpc3QgPSBTdGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1fcnVsZUxp
c3QuZ2V0KCk7Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjYWNoZUJv
cmRlckFuZEJhY2tncm91bmQoKQotewotICAgIG1faGFzVUFBcHBlYXJhbmNlID0gbV9zdHlsZS0+
aGFzQXBwZWFyYW5jZSgpOwotICAgIGlmIChtX2hhc1VBQXBwZWFyYW5jZSkgewotICAgICAgICBt
X2JvcmRlckRhdGEgPSBtX3N0eWxlLT5ib3JkZXIoKTsKLSAgICAgICAgbV9iYWNrZ3JvdW5kRGF0
YSA9ICptX3N0eWxlLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgICAgIG1fYmFja2dyb3VuZENv
bG9yID0gbV9zdHlsZS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAgfQotfQotCi1pbmxpbmUgdm9p
ZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQotewotICAgIG1fZWxlbWVudCA9IDA7Ci0g
ICAgbV9zdHlsZWRFbGVtZW50ID0gMDsKLSAgICBtX3BhcmVudFN0eWxlID0gMDsKLSAgICBtX3Bh
cmVudE5vZGUgPSAwOwotICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9ydWxlTGlz
dCA9IDA7Ci0gICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKLSAgICBtX3BlbmRpbmdJbWFnZVBy
b3BlcnRpZXMuY2xlYXIoKTsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgbV9oYXNQZW5k
aW5nU2hhZGVycyA9IGZhbHNlOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQotICAgIG1fcGVuZGluZ1NWR0RvY3VtZW50cy5jbGVhcigpOwotI2VuZGlmCi19
Ci0KLVN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29s
IG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwKDApCi0gICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGVTd2VlcFRpbWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUpCi0gICAgLCBtX2RvY3VtZW50KGRvY3VtZW50KQotICAgICwgbV9tYXRjaEF1dGhvckFu
ZFVzZXJTdHlsZXMobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICwgbV9mb250U2VsZWN0
b3IoQ1NTRm9udFNlbGVjdG9yOjpjcmVhdGUoZG9jdW1lbnQpKQotI2lmIEVOQUJMRShDU1NfREVW
SUNFX0FEQVBUQVRJT04pCi0gICAgLCBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcihWaWV3cG9ydFN0
eWxlUmVzb2x2ZXI6OmNyZWF0ZShkb2N1bWVudCkpCi0jZW5kaWYKLSAgICAsIG1fc3R5bGVCdWls
ZGVyKFN0eWxlQnVpbGRlcjo6c2hhcmVkU3R5bGVCdWlsZGVyKCkpCi0gICAgLCBtX3N0eWxlTWFw
KHRoaXMpCi17Ci0gICAgRWxlbWVudCogcm9vdCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQo
KTsKLQotICAgIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6aW5pdERlZmF1bHRTdHlsZShyb290KTsK
LQotICAgIC8vIGNvbnN0cnVjdCBkb2N1bWVudCByb290IGVsZW1lbnQgZGVmYXVsdCBzdHlsZS4g
dGhpcyBpcyBuZWVkZWQKLSAgICAvLyB0byBldmFsdWF0ZSBtZWRpYSBxdWVyaWVzIHRoYXQgY29u
dGFpbiByZWxhdGl2ZSBjb25zdHJhaW50cywgbGlrZSAic2NyZWVuIGFuZCAobWF4LXdpZHRoOiAx
MGVtKSIKLSAgICAvLyBUaGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciwgYmVjYXVz
ZSB3aGVuIGNvbnN0cnVjdG9yIGlzIHJ1biwKLSAgICAvLyBkb2N1bWVudCBkb2Vzbid0IGhhdmUg
ZG9jdW1lbnRFbGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgZWxlbWVudCB0
aGF0IGdldHMgcGFzc2VkIHRvIHN0eWxlRm9yRWxlbWVudCAtY2FsbAotICAgIC8vIGlzIGFsd2F5
cyBmcm9tIHRoZSBkb2N1bWVudCB0aGF0IG93bnMgdGhlIHN0eWxlIHNlbGVjdG9yCi0gICAgRnJh
bWVWaWV3KiB2aWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsKLSAgICBpZiAodmlldykKLSAgICAgICAg
bV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5
cGUoKSkpOwotICAgIGVsc2UKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFR
dWVyeUV2YWx1YXRvcigiYWxsIikpOwotCi0gICAgaWYgKHJvb3QpCi0gICAgICAgIG1fcm9vdERl
ZmF1bHRTdHlsZSA9IHN0eWxlRm9yRWxlbWVudChyb290LCAwLCBEaXNhbGxvd1N0eWxlU2hhcmlu
ZywgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpOwotCi0gICAgaWYgKG1fcm9vdERlZmF1bHRTdHls
ZSAmJiB2aWV3KQotICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZh
bHVhdG9yKHZpZXctPm1lZGlhVHlwZSgpLCB2aWV3LT5mcmFtZSgpLCBtX3Jvb3REZWZhdWx0U3R5
bGUuZ2V0KCkpKTsKLQotICAgIG1fcnVsZVNldHMucmVzZXRBdXRob3JTdHlsZSgpOwotCi0gICAg
RG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1
bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKTsKLSAgICBtX3J1bGVTZXRzLmluaXRVc2VyU3R5
bGUoc3R5bGVTaGVldENvbGxlY3Rpb24sICptX21lZGl1bSwgKnRoaXMpOwotCi0jaWYgRU5BQkxF
KFNWR19GT05UUykKLSAgICBpZiAoZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKSkgewotICAgICAg
ICBjb25zdCBIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+JiBzdmdGb250RmFjZUVsZW1lbnRz
ID0gZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKS0+c3ZnRm9udEZhY2VFbGVtZW50cygpOwotICAg
ICAgICBIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBz
dmdGb250RmFjZUVsZW1lbnRzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8U1ZHRm9udEZh
Y2VFbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3ZnRm9udEZhY2VFbGVtZW50cy5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICBmb250U2VsZWN0b3IoKS0+YWRkRm9u
dEZhY2VSdWxlKCgqaXQpLT5mb250RmFjZVJ1bGUoKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBh
cHBlbmRBdXRob3JTdHlsZVNoZWV0cygwLCBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+YWN0aXZlQXV0
aG9yU3R5bGVTaGVldHMoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwZW5kQXV0aG9y
U3R5bGVTaGVldHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5
bGVTaGVldD4gPiYgc3R5bGVTaGVldHMpCi17Ci0gICAgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JT
dHlsZVNoZWV0cyhmaXJzdE5ldywgc3R5bGVTaGVldHMsIG1fbWVkaXVtLmdldCgpLCBtX2luc3Bl
Y3RvckNTU09NV3JhcHBlcnMsIGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCB0aGlzKTsKLSAg
ICBpZiAoZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSAmJiBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5z
dHlsZSgpKQotICAgICAgICBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5mb250KCku
dXBkYXRlKGZvbnRTZWxlY3RvcigpKTsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJ
T04pCi0gICAgdmlld3BvcnRTdHlsZVJlc29sdmVyKCktPnJlc29sdmUoKTsKLSNlbmRpZgotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkK
LXsKLSAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRzUGFyZW50ID0gcGFyZW50LT5wYXJl
bnRPclNoYWRvd0hvc3RFbGVtZW50KCk7Ci0KLSAgICAvLyBXZSBhcmUgbm90IGFsd2F5cyBpbnZv
a2VkIGNvbnNpc3RlbnRseS4gRm9yIGV4YW1wbGUsIHNjcmlwdCBleGVjdXRpb24gY2FuIGNhdXNl
IHVzIHRvIGVudGVyCi0gICAgLy8gc3R5bGUgcmVjYWxjIGluIHRoZSBtaWRkbGUgb2YgdHJlZSBi
dWlsZGluZy4gV2UgbWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHNvbWV3aGVyZSB3aXRoaW4gdGhl
IHRyZWUuCi0gICAgLy8gUmVzZXQgdGhlIHN0YWNrIGluIHRoaXMgY2FzZSwgb3IgaWYgd2Ugc2Vl
IGEgbmV3IHJvb3QgZWxlbWVudC4KLSAgICAvLyBPdGhlcndpc2UganVzdCBwdXNoIHRoZSBuZXcg
cGFyZW50LgotICAgIGlmICghcGFyZW50c1BhcmVudCB8fCBtX3NlbGVjdG9yRmlsdGVyLnBhcmVu
dFN0YWNrSXNFbXB0eSgpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnNldHVwUGFyZW50U3Rh
Y2socGFyZW50KTsKLSAgICBlbHNlCi0gICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucHVzaFBhcmVu
dChwYXJlbnQpOwotCi0gICAgLy8gTm90ZTogV2UgbXVzdG4ndCBza2lwIFNoYWRvd1Jvb3Qgbm9k
ZXMgZm9yIHRoZSBzY29wZSBzdGFjay4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAg
ICBtX3Njb3BlUmVzb2x2ZXItPnB1c2gocGFyZW50LCBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9z
dE5vZGUoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50RWxlbWVudChFbGVt
ZW50KiBwYXJlbnQpCi17Ci0gICAgLy8gTm90ZSB0aGF0IHdlIG1heSBnZXQgaW52b2tlZCBmb3Ig
c29tZSByYW5kb20gZWxlbWVudHMgaW4gc29tZSB3YWNreSBjYXNlcyBkdXJpbmcgc3R5bGUgcmVz
b2x2ZS4KLSAgICAvLyBQYXVzZSBtYWludGFpbmluZyB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLgot
ICAgIGlmIChtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHBhcmVudCkp
Ci0gICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucG9wUGFyZW50KCk7Ci0gICAgaWYgKG1fc2NvcGVS
ZXNvbHZlcikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3AocGFyZW50KTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBz
aGFkb3dSb290KQotewotICAgIEFTU0VSVChzaGFkb3dSb290LT5ob3N0KCkpOwotICAgIGlmICht
X3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cHVzaChzaGFkb3dSb290
LCBzaGFkb3dSb290LT5ob3N0KCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVu
dFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKLXsKLSAgICBBU1NFUlQo
c2hhZG93Um9vdC0+aG9zdCgpKTsKLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBt
X3Njb3BlUmVzb2x2ZXItPnBvcChzaGFkb3dSb290KTsKLX0KLQotLy8gVGhpcyBpcyBhIHNpbXBs
aWZpZWQgc3R5bGUgc2V0dGluZyBmdW5jdGlvbiBmb3Iga2V5ZnJhbWUgc3R5bGVzCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OmFkZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFt
ZXM+IHJ1bGUpCi17Ci0gICAgQXRvbWljU3RyaW5nIHMocnVsZS0+bmFtZSgpKTsKLSAgICBtX2tl
eWZyYW1lc1J1bGVNYXAuc2V0KHMuaW1wbCgpLCBydWxlKTsKLX0KLQotU3R5bGVSZXNvbHZlcjo6
flN0eWxlUmVzb2x2ZXIoKQotewotICAgIG1fZm9udFNlbGVjdG9yLT5jbGVhckRvY3VtZW50KCk7
Ci0KLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIG1fdmlld3BvcnRTdHls
ZVJlc29sdmVyLT5jbGVhckRvY3VtZW50KCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZlcj4qKQot
ewotICAgIC8vIExvb2sgZm9yIGNhY2hlIGVudHJpZXMgY29udGFpbmluZyBhIHN0eWxlIGRlY2xh
cmF0aW9uIHdpdGggYSBzaW5nbGUgcmVmIGFuZCByZW1vdmUgdGhlbS4KLSAgICAvLyBUaGlzIG1h
eSBoYXBwZW4gd2hlbiBhbiBlbGVtZW50IGF0dHJpYnV0ZSBtdXRhdGlvbiBjYXVzZXMgaXQgdG8g
Z2VuZXJhdGUgYSBuZXcgaW5saW5lU3R5bGUoKQotICAgIC8vIG9yIHByZXNlbnRhdGlvbkF0dHJp
YnV0ZVN0eWxlKCksIHBvdGVudGlhbGx5IGxlYXZpbmcgdGhpcyBjYWNoZSB3aXRoIHRoZSBsYXN0
IHJlZiBvbiB0aGUgb2xkIG9uZS4KLSAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiB0b1JlbW92ZTsK
LSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZS5iZWdpbigpOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9y
IGVuZCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5lbmQoKTsKLSAgICBmb3IgKDsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcz4mIG1hdGNoZWRQ
cm9wZXJ0aWVzID0gaXQtPnZhbHVlLm1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IG1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAg
ICAgICBpZiAobWF0Y2hlZFByb3BlcnRpZXNbaV0ucHJvcGVydGllcy0+aGFzT25lUmVmKCkpIHsK
LSAgICAgICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQoaXQtPmtleSk7Ci0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7ICsraSkKLSAgICAgICAgbV9tYXRjaGVkUHJv
cGVydGllc0NhY2hlLnJlbW92ZSh0b1JlbW92ZVtpXSk7Ci0KLSAgICBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCA9IDA7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6YWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1bGUsIHVuc2lnbmVk
IGxpbmtNYXRjaFR5cGUsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5
cGUpCi17Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgKyAxKTsKLSAgICBNYXRjaGVkUHJvcGVydGllcyYg
bmV3UHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKLSAg
ICBuZXdQcm9wZXJ0aWVzLnByb3BlcnRpZXMgPSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQq
Pihwcm9wZXJ0aWVzKTsKLSAgICBuZXdQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0
Y2hUeXBlOwotICAgIG5ld1Byb3BlcnRpZXMud2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVs
aXN0VHlwZTsKLSAgICBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotfQot
Ci1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjphZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1h
dGNoUmVzdWx0JiByZXN1bHQsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnR5U2V0LCBi
b29sIGlzQ2FjaGVhYmxlKQotewotICAgIGlmICghcHJvcGVydHlTZXQpCi0gICAgICAgIHJldHVy
bjsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKTsKLSAgICBpZiAocmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPT0g
LTEpCi0gICAgICAgIHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gcmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZTsKLSAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHByb3Bl
cnR5U2V0KTsKLSAgICBpZiAoIWlzQ2FjaGVhYmxlKQotICAgICAgICByZXN1bHQuaXNDYWNoZWFi
bGUgPSBmYWxzZTsKLX0KLQotY2xhc3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgewotcHVibGljOgot
ICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0gICAgfk1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7
Ci0KLSAgICBzdGF0aWMgYm9vbCBpc01hdGNoaW5nVUFSdWxlcygpOwotCi1wcml2YXRlOgotICAg
IHN0YXRpYyBib29sIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfTsKLQotTWF0Y2hpbmdVQVJ1bGVzU2Nv
cGU6Ok1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBBU1NFUlQoIW1fbWF0Y2hpbmdVQVJ1
bGVzKTsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9IHRydWU7Ci19Ci0KLU1hdGNoaW5nVUFSdWxl
c1Njb3BlOjp+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQotewotICAgIG1fbWF0Y2hpbmdVQVJ1bGVz
ID0gZmFsc2U7Ci19Ci0KLWlubGluZSBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNo
aW5nVUFSdWxlcygpCi17Ci0gICAgcmV0dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfQotCi1ib29s
IE1hdGNoaW5nVUFSdWxlc1Njb3BlOjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotCi12b2lk
IFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYg
bWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBBU1NFUlQobWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQpOwotICAgIEFTU0VSVChtX3N0YXRlLmVsZW1lbnQoKSk7Ci0KLSAgICBT
dGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0ZS5lbGVt
ZW50KCk7Ci0gICAgY29uc3QgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IHN0YXRlLnN0
eWxlZEVsZW1lbnQoKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHBzZXVkb0lkID0gZWxlbWVu
dC0+c2hhZG93UHNldWRvSWQoKTsKLSAgICBpZiAoIXBzZXVkb0lkLmlzRW1wdHkoKSkgewotICAg
ICAgICBBU1NFUlQoc3R5bGVkRWxlbWVudCk7Ci0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBz
ZXVkb0lkLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICB9Ci0KLSNpZiBF
TkFCTEUoVklERU9fVFJBQ0spCi0gICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQot
ICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQt
PmN1ZVBzZXVkb1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSNlbmRpZgotICAg
IC8vIENoZWNrIHdoZXRoZXIgb3RoZXIgdHlwZXMgb2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4g
dGhlIGN1cnJlbnQgdHJlZSBzY29wZS4gQ3JpdGVyaWEgZm9yIHRoaXM6Ci0gICAgLy8gYSkgaXQn
cyBhIFVBIHJ1bGUKLSAgICAvLyBiKSB0aGUgdHJlZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVz
Ci0gICAgLy8gYykgdGhlIHJ1bGVzIGNvbWVzIGZyb20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0
aGluIHRoZSBzYW1lIHRyZWUgc2NvcGUKLSAgICBUcmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1l
bnQtPnRyZWVTY29wZSgpOwotICAgIGlmICghTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hp
bmdVQVJ1bGVzKCkKLSAgICAgICAgJiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQot
ICAgICAgICAmJiAoIW1hdGNoUmVxdWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRy
ZWVTY29wZSgpICE9IHRyZWVTY29wZSkKLSAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9y
QXRCb3VuZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBp
ZCwgY2xhc3MsIHRhZywgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAotICAg
IC8vIHRoZW4gc29ydCB0aGUgYnVmZmVyLgotICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQotICAg
ICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmlk
UnVsZXMoZWxlbWVudC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7Ci0gICAgaWYgKHN0eWxlZEVsZW1lbnQgJiYgc3R5bGVkRWxlbWVudC0+
aGFzQ2xhc3MoKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlZEVsZW1l
bnQtPmNsYXNzTmFtZXMoKS5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGlu
Z1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVt
ZW50LT5jbGFzc05hbWVzKClbaV0uaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwot
ICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSkKLSAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6
bWF0Y2hlc0ZvY3VzUHNldWRvQ2xhc3MoZWxlbWVudCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGlu
Z1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+Zm9jdXNQc2V1ZG9DbGFzc1J1bGVz
KCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
ckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgp
LmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNo
UmVxdWVzdCwgcnVsZVJhbmdlKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0
Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVs
ZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgaWYgKCFtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmco
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdW5zaWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IENTU1NlbGVjdG9y
KiByZWdpb25TZWxlY3RvciA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxl
Y3RvcihyZWdpb25TZWxlY3Rvciwgc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG1fc3RhdGUucmVnaW9u
Rm9yU3R5bGluZygpLT5ub2RlKCkpKSkgewotICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVs
ZXMgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5h
dChpKS5ydWxlU2V0LmdldCgpOwotICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKLSAg
ICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywg
bWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxl
UmFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRB
bmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0KQotewotICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRj
aGVkUnVsZXMgPSBzdGF0ZS5tYXRjaGVkUnVsZXMoKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlz
RW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc29ydE1hdGNoZWRSdWxlcygpOwotCi0g
ICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykg
ewotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsg
KytpKQotICAgICAgICAgICAgc3RhdGUuZW5zdXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQo
bWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNyZWF0ZUNTU09NV3JhcHBlcigpKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vdyB0cmFuc2ZlciB0aGUgc2V0IG9mIG1hdGNoZWQg
cnVsZXMgb3ZlciB0byBvdXIgbGlzdCBvZiBkZWNsYXJhdGlvbnMuCi0gICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3Rh
dGUuc3R5bGUoKSAmJiBtYXRjaGVkUnVsZXNbaV0tPmNvbnRhaW5zVW5jb21tb25BdHRyaWJ1dGVT
ZWxlY3RvcigpKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7Ci0gICAg
ICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgbWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCkt
PnByb3BlcnRpZXMoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCksIG1hdGNoZWRSdWxlc1tpXS0+
bGlua01hdGNoVHlwZSgpLCBtYXRjaGVkUnVsZXNbaV0tPnByb3BlcnR5V2hpdGVsaXN0VHlwZSgp
KTsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hTY29wZWRBdXRob3JSdWxl
cyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVO
QUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQotICAgIGlmICghbV9zY29w
ZVJlc29sdmVyKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9y
IHJ1bGVzIGJ5IHRyYXZlcnNpbmcgdGhlIHNjb3BlZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0
IGlmIGl0IGdvdCBpbmNvbnNpc3RlbnQpLgotICAgIGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Nj
b3BlZFN0eWxlcygpICYmIG1fc2NvcGVSZXNvbHZlci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeSht
X3N0YXRlLmVsZW1lbnQoKSkpIHsKLSAgICAgICAgYm9vbCBhcHBseUF1dGhvclN0eWxlcyA9IG1f
c3RhdGUuZWxlbWVudCgpLT50cmVlU2NvcGUoKS0+YXBwbHlBdXRob3JTdHlsZXMoKTsKLSAgICAg
ICAgYm9vbCBkb2N1bWVudFNjb3BlID0gdHJ1ZTsKLSAgICAgICAgdW5zaWduZWQgc2NvcGVTaXpl
ID0gbV9zY29wZVJlc29sdmVyLT5zdGFja1NpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHNjb3BlU2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBtX3N0YXRlLm1hdGNoZWRS
dWxlcygpLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxl
ID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICAgICAgICAgIGNv
bnN0IFN0eWxlU2NvcGVSZXNvbHZlcjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Njb3BlUmVzb2x2
ZXItPnN0YWNrRnJhbWVBdChpKTsKLSAgICAgICAgICAgIGRvY3VtZW50U2NvcGUgPSBkb2N1bWVu
dFNjb3BlICYmICFmcmFtZS5tX3Njb3BlLT5pc0luU2hhZG93VHJlZSgpOwotICAgICAgICAgICAg
aWYgKGRvY3VtZW50U2NvcGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwcGx5QXV0aG9yU3R5
bGVzKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXItPm1hdGNoZXNTdHlsZUJvdW5k
cyhmcmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KGZyYW1lLm1fcnVsZVNldCwg
aW5jbHVkZUVtcHR5UnVsZXMsIGZyYW1lLm1fc2NvcGUpOwotICAgICAgICAgICAgUnVsZVJhbmdl
IHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7Ci0gICAgICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgICAg
ICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7Ci0gICAgICAgICAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIG1hdGNoSG9zdFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5
UnVsZXMpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0ocmVzdWx0KTsKLSAgICBVTlVTRURfUEFS
QU0oaW5jbHVkZUVtcHR5UnVsZXMpOwotI2VuZGlmCi19Ci0KLWlubGluZSBib29sIFN0eWxlUmVz
b2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKQorc3RhdGljIGlu
bGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0
IFN0eWxlUnVsZVBhZ2UqIHIyKQogewotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIHJldHVy
biBtX3Njb3BlUmVzb2x2ZXIgJiYgbV9zY29wZVJlc29sdmVyLT5zdHlsZVNoYXJpbmdDYW5kaWRh
dGVNYXRjaGVzSG9zdFJ1bGVzKG1fc3RhdGUuZWxlbWVudCgpKTsKLSNlbHNlCi0gICAgcmV0dXJu
IGZhbHNlOwotI2VuZGlmCisgICAgcmV0dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgp
IDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZl
cjo6bWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcykKK2Jvb2wgUGFnZVJ1bGVDb2xsZWN0b3I6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkg
Y29uc3QKIHsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBBU1NFUlQobV9zY29wZVJlc29s
dmVyKTsKLQotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQu
cmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAt
IDE7Ci0KLSAgICBWZWN0b3I8UnVsZVNldCo+IG1hdGNoZWRSdWxlczsKLSAgICBtX3Njb3BlUmVz
b2x2ZXItPm1hdGNoSG9zdFJ1bGVzKG1fc3RhdGUuZWxlbWVudCgpLCBtYXRjaGVkUnVsZXMpOwot
ICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47CisgICAgYm9v
bCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKKyAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRT
dHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIGlzRmlyc3RQYWdlTGVm
dCA9IHRydWU7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBp
ID4gMDsgLS1pKSB7Ci0gICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2Vz
LmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJl
cXVlc3QobWF0Y2hlZFJ1bGVzLmF0KGktMSksIGluY2x1ZGVFbXB0eVJ1bGVzLCBtX3N0YXRlLmVs
ZW1lbnQoKSksIHJ1bGVSYW5nZSk7Ci0gICAgfQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyhyZXN1bHQpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0ocmVzdWx0KTsKLSAgICBVTlVT
RURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOwotI2VuZGlmCisgICAgcmV0dXJuIChwYWdlSW5k
ZXggKyAoaXNGaXJzdFBhZ2VMZWZ0ID8gMSA6IDApKSAlIDI7CiB9CiAKLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKQorYm9vbCBQYWdlUnVsZUNvbGxlY3Rvcjo6aXNGaXJzdFBhZ2UoaW50IHBhZ2VJ
bmRleCkgY29uc3QKIHsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAg
cmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxOwotCi0gICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlcXVlc3Qg
bWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMp
OwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5n
ZSgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
LSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgVmVjdG9yPE1hdGNoUmVxdWVzdD4gbWF0
Y2hSZXF1ZXN0czsKLSAgICBtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5jb2xs
ZWN0TWF0Y2hSZXF1ZXN0cyhpbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7Ci0gICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQotICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOwotI2Vu
ZGlmCi0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLQotICAgIG1h
dGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgLy8g
RklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAx
IChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgorICAgIHJldHVybiAoIXBhZ2VJbmRleCk7
CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJl
c3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK1N0cmluZyBQYWdlUnVsZUNvbGxlY3Rvcjo6
cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKIHsKLSAgICBpZiAoIW1fcnVsZVNl
dHMudXNlclN0eWxlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmNsZWFyKCk7Ci0KLSAgICByZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotICAgIE1hdGNoUmVxdWVzdCBtYXRj
aFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKLSAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgLy8gRklYTUU6IElt
cGxlbWVudCBwYWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBwaW5nLgorICAgIHJldHVybiAiIjsK
IH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgUnVsZVNldCogcnVsZXMpCit2b2lkIFBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFsbFBhZ2VS
dWxlcyhpbnQgcGFnZUluZGV4KQogewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIo
KTsKKyAgICBjb25zdCBib29sIGlzTGVmdCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsKKyAgICBj
b25zdCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOworICAgIGNvbnN0IFN0
cmluZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsKICAgICAKLSAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RVQVJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBS
dWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7Ci0KLSAg
ICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyAgICBtYXRjaFBhZ2VSdWxl
cyhDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmly
c3QsIHBhZ2UpOworICAgIG1hdGNoUGFnZVJ1bGVzKG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlz
TGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFsIGF1
dGhvciBSdWxlU2V0IGZvciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgorICAg
IG1hdGNoUGFnZVJ1bGVzKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0
LCBwYWdlKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
ckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYg
bWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgUGFnZVJ1bGVDb2xsZWN0
b3I6Om1hdGNoUGFnZVJ1bGVzKFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wg
aXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCiB7CiAgICAgaWYgKCFydWxlcykK
ICAgICAgICAgcmV0dXJuOwogCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICAvLyBJ
biBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9tIGVs
ZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZlLgotICAgIC8v
IEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUgaW4gdGhhdCBj
YXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KLSAgICBib29sIGNhblVzZUZhc3RS
ZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBh
cmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OwotCi0gICAgdW5zaWduZWQgc2l6ZSA9IHJ1
bGVzLT5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewot
ICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7Ci0gICAgICAg
IGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNlbGVj
dG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5kYW50
U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOwotICAgICAgICBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
Ojp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOwotICAgICAgICBQc2V1ZG9J
ZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxl
RGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVo
YXZpb3JBdEJvdW5kYXJ5KSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHBy
b3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4K
LSAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5w
cm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMt
PmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgewotICAgICAg
ICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwg
ZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1
bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgotICAgICAg
ICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVsZURhdGEuaGFzRG9jdW1l
bnRTZWN1cml0eU9yaWdpbigpKSB7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBu
b3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKLSAgICAgICAgICAgIC8vIHdlIHJlYWxs
eSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KLSAgICAgICAgICAgIGlmIChkeW5hbWlj
UHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lk
ID09IE5PUFNFVURPKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBTZWxl
Y3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQpCi0gICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5bmFtaWNQc2V1
ZG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgb3Vy
IGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFycmF5LgotICAg
ICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7Ci0gICAgICAgICAgICAgICAg
aWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAg
cnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7Ci0KLSAg
ICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVs
ZXMuCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEpOwot
ICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNv
b2tpZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUo
Y29va2llLCBmYWxzZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVJ1
bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIyKQotewotICAgIHVuc2ln
bmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOwotICAgIHVuc2lnbmVkIHNwZWNp
ZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOwotICAgIHJldHVybiAoc3BlY2lmaWNpdHkxID09
IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigpIDogc3BlY2lm
aWNpdHkxIDwgc3BlY2lmaWNpdHkyOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRNYXRj
aGVkUnVsZXMoKQotewotICAgIHN0ZDo6c29ydChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmJlZ2lu
KCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVSdWxlcyk7Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29s
IGluY2x1ZGVTTUlMUHJvcGVydGllcykKLXsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0KTsKLQot
ICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgotICAgIGlmIChtX21hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMocmVzdWx0LCBmYWxzZSk7
Ci0KLSAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmlyc3Qgd2l0aCBw
cmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwuCi0gICAgaWYgKG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpKSB7Ci0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMo
cmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSk7Ci0KLSAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwgbWFwcGVkIGRlY2xh
cmF0aW9ucy4KLSAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBzaGFyZSBhbiBhZGRp
dGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gICAgICAgIC8vIGFmdGVy
IGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVwZW5kcyBvbiB0aGUg
dmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVBy
b3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25hbFByZXNl
bnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIGlmIChtX3N0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBib29sIGlzQXV0bzsKLSAg
ICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbiA9IHRvSFRNTEVsZW1lbnQobV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFzRGlyQXV0b0F0dHJpYnV0
ZShpc0F1dG8pOwotICAgICAgICAgICAgaWYgKGlzQXV0bykKLSAgICAgICAgICAgICAgICBhZGRN
YXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0gTFRSID8gbGVmdFRvUmln
aHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQot
ICAgIH0KLSAgICAKLSAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cyBuZXh0
LgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hBdXRo
b3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVjayBvdXIgaW5saW5lIHN0
eWxlIGF0dHJpYnV0ZS4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0
eWxlKCkpIHsKLSAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFz
IHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCi0gICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250
cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgotICAg
ICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5LgotICAgICAg
ICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOwotICAgIH0KLQotI2lm
IEVOQUJMRShTVkcpCi0gICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92ZXJyaWRlIHN0
eWxlLgotICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9tYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlzU1ZHRWxlbWVudCgpKQotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVz
KHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
KS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2FjaGVhYmxlICov
KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVydGllcyk7Ci0jZW5k
aWYKLX0KKyAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7CisgICAg
bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMo
KSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKKyAgICBpZiAobWF0Y2hlZFBh
Z2VSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKIAotYm9vbCBTdHlsZVJlc29sdmVy
OjpjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNz
TmFtZXMpIGNvbnN0Ci17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMu
c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2Vz
SW5SdWxlcy5jb250YWlucyhjbGFzc05hbWVzW2ldLmltcGwoKSkpCi0gICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQorICAgIHN0ZDo6c3RhYmxlX3Nv
cnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21w
YXJlUGFnZVJ1bGVzKTsKIAotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRF
bGVtZW50KEVsZW1lbnQqIGUpCi17Ci0gICAgbV9lbGVtZW50ID0gZTsKLSAgICBtX3N0eWxlZEVs
ZW1lbnQgPSBlICYmIGUtPmlzU3R5bGVkRWxlbWVudCgpID8gc3RhdGljX2Nhc3Q8U3R5bGVkRWxl
bWVudCo+KGUpIDogMDsKLSAgICBtX2VsZW1lbnRMaW5rU3RhdGUgPSBlID8gZS0+ZG9jdW1lbnQo
KS0+dmlzaXRlZExpbmtTdGF0ZSgpLT5kZXRlcm1pbmVMaW5rU3RhdGUoZSkgOiBOb3RJbnNpZGVM
aW5rOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUo
KTsgaSsrKQorICAgICAgICBtX3Jlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhtYXRjaGVkUGFn
ZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOwogfQogCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVy
Ojppbml0RWxlbWVudChFbGVtZW50KiBlKQorc3RhdGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0b3JD
b21wb25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdlLCBi
b29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQogewotICAgIGlmIChtX3N0
YXRlLmVsZW1lbnQoKSAhPSBlKSB7Ci0gICAgICAgIG1fc3RhdGUuaW5pdEVsZW1lbnQoZSk7Ci0g
ICAgICAgIGlmIChlICYmIGUgPT0gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpIHsK
LSAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNldERpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVt
ZW50KGZhbHNlKTsKLSAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNldFdyaXRpbmdNb2RlU2V0
T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIGNv
bXBvbmVudCA9IHNlbGVjdG9yOyBjb21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudC0+dGFn
SGlzdG9yeSgpKSB7CisgICAgICAgIGlmIChjb21wb25lbnQtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0
b3I6OlRhZykgeworICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUgPSBj
b21wb25lbnQtPnRhZ1FOYW1lKCkubG9jYWxOYW1lKCk7CisgICAgICAgICAgICBpZiAobG9jYWxO
YW1lICE9IHN0YXJBdG9tICYmIGxvY2FsTmFtZSAhPSBwYWdlTmFtZSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICB9Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxl
UmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwg
RWxlbWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5n
KQotewotICAgIG1fcHNldWRvU3R5bGVSZXF1ZXN0ID0gcHNldWRvU3R5bGVSZXF1ZXN0OwotICAg
IG1fcmVnaW9uRm9yU3R5bGluZyA9IHJlZ2lvbkZvclN0eWxpbmc7CiAKLSAgICBpZiAoZSkgewot
ICAgICAgICBOb2RlUmVuZGVyaW5nQ29udGV4dCBjb250ZXh0KGUpOwotICAgICAgICBtX3BhcmVu
dE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOwotICAgICAg
ICBtX3BhcmVudFN0eWxlID0gY29udGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSA/IDAgOgot
ICAgICAgICAgICAgcGFyZW50U3R5bGUgPyBwYXJlbnRTdHlsZSA6Ci0gICAgICAgICAgICBtX3Bh
cmVudE5vZGUgPyBtX3BhcmVudE5vZGUtPnJlbmRlclN0eWxlKCkgOiAwOwotICAgICAgICBtX2Rp
c3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCA9IGNvbnRleHQuaW5zZXJ0aW9uUG9pbnQoKTsKLSAg
ICB9IGVsc2UgewotICAgICAgICBtX3BhcmVudE5vZGUgPSAwOwotICAgICAgICBtX3BhcmVudFN0
eWxlID0gcGFyZW50U3R5bGU7Ci0gICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50
ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgTm9kZSogZG9jRWxlbWVudCA9IGUgPyBlLT5kb2N1bWVu
dCgpLT5kb2N1bWVudEVsZW1lbnQoKSA6IDA7Ci0gICAgUmVuZGVyU3R5bGUqIGRvY1N0eWxlID0g
ZG9jdW1lbnQtPnJlbmRlclN0eWxlKCk7Ci0gICAgbV9yb290RWxlbWVudFN0eWxlID0gZG9jRWxl
bWVudCAmJiBlICE9IGRvY0VsZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJTdHlsZSgpIDogZG9j
U3R5bGU7Ci0KLSAgICBtX3N0eWxlID0gMDsKLSAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMu
Y2xlYXIoKTsKLSAgICBtX3J1bGVMaXN0ID0gMDsKLSAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwot
fQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY1N0eWxlU2VhcmNoVGhyZXNob2xkID0gMTA7Ci1z
dGF0aWMgY29uc3QgdW5zaWduZWQgY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgPSAxMDsKLQot
c3RhdGljIGlubGluZSBib29sIHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoY29uc3QgRWxl
bWVudCogcGFyZW50RWxlbWVudCkKLXsKLSAgICBpZiAoIXBhcmVudEVsZW1lbnQpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gcGFyZW50RWxlbWVudC0+aGFzRmxhZ3NTZXREdXJp
bmdTdHlsaW5nT2ZDaGlsZHJlbigpOwotfQotCi1Ob2RlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVD
b3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNv
bnN0Ci17Ci0gICAgaWYgKHZpc2l0ZWROb2RlQ291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xk
ICogY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlm
ICghcGFyZW50IHx8ICFwYXJlbnQtPmlzU3R5bGVkRWxlbWVudCgpKQotICAgICAgICByZXR1cm4g
MDsKLSAgICBpZiAocGFyZW50LT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICBTdHlsZWRFbGVtZW50KiBwID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVu
dCo+KHBhcmVudCk7Ci0gICAgaWYgKHAtPmlubGluZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiAw
OwotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKHAtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19j
YXN0PFNWR0VsZW1lbnQqPihwKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCi0gICAg
ICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgaWYgKHAtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5m
ZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMocC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5p
bXBsKCkpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSA9IHAtPnJlbmRlclN0eWxlKCk7Ci0gICAgdW5zaWduZWQgc3ViY291bnQgPSAwOwotICAgIE5v
ZGUqIHRoaXNDb3VzaW4gPSBwOwotICAgIE5vZGUqIGN1cnJlbnROb2RlID0gcC0+cHJldmlvdXNT
aWJsaW5nKCk7Ci0KLSAgICAvLyBSZXNlcnZlIHRoZSB0cmllcyBmb3IgdGhpcyBsZXZlbC4gVGhp
cyBlZmZlY3RpdmVseSBtYWtlcyBzdXJlIHRoYXQgdGhlIGFsZ29yaXRobQotICAgIC8vIHdpbGwg
bmV2ZXIgZ28gZGVlcGVyIHRoYW4gY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgbGV2ZWxzIGlu
dG8gcmVjdXJzaW9uLgotICAgIHZpc2l0ZWROb2RlQ291bnQgKz0gY1N0eWxlU2VhcmNoVGhyZXNo
b2xkOwotICAgIHdoaWxlICh0aGlzQ291c2luKSB7Ci0gICAgICAgIHdoaWxlIChjdXJyZW50Tm9k
ZSkgewotICAgICAgICAgICAgKytzdWJjb3VudDsKLSAgICAgICAgICAgIGlmIChjdXJyZW50Tm9k
ZS0+cmVuZGVyU3R5bGUoKSA9PSBwYXJlbnRTdHlsZSAmJiBjdXJyZW50Tm9kZS0+bGFzdENoaWxk
KCkKLSAgICAgICAgICAgICAgICAmJiBjdXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmICFw
YXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHRvRWxlbWVudChjdXJyZW50Tm9kZSkpCi0jaWYg
RU5BQkxFKFNIQURPV19ET00pCi0gICAgICAgICAgICAgICAgJiYgIXRvRWxlbWVudChjdXJyZW50
Tm9kZSktPnNoYWRvdygpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAg
ICAgICAvLyBBZGp1c3QgZm9yIHVudXNlZCByZXNlcnZlZCB0cmllcy4KLSAgICAgICAgICAgICAg
ICB2aXNpdGVkTm9kZUNvdW50IC09IGNTdHlsZVNlYXJjaFRocmVzaG9sZCAtIHN1YmNvdW50Owot
ICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBpZiAoc3ViY291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xk
KQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgY3VycmVudE5vZGUgPSBj
dXJyZW50Tm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1
ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsKKyAgICAgICAgaWYg
KChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFn
ZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdo
dFBhZ2UgJiYgaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1Nl
bGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKKyAgICAgICAgeworICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnROb2RlID0g
bG9jYXRlQ291c2luTGlzdCh0aGlzQ291c2luLT5wYXJlbnRFbGVtZW50KCksIHZpc2l0ZWROb2Rl
Q291bnQpOwotICAgICAgICB0aGlzQ291c2luID0gY3VycmVudE5vZGU7CiAgICAgfQotCi0gICAg
cmV0dXJuIDA7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRl
TWF0Y2hlc1J1bGVTZXQoUnVsZVNldCogcnVsZVNldCkKLXsKLSAgICBpZiAoIXJ1bGVTZXQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
Ci0KLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMpOwot
ICAgIGludCBmaXJzdFJ1bGVJbmRleCA9IC0xLCBsYXN0UnVsZUluZGV4ID0gLTE7Ci0gICAgUnVs
ZVJhbmdlIHJ1bGVSYW5nZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOwotICAg
IG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLSAgICBp
ZiAobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CiAgICAgcmV0dXJuIHRydWU7
CiB9CiAKLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxl
ZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit2b2lkIFBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBh
Z2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25z
dCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlz
Rmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQogewotICAgIGNvbnN0IFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7Ci0gICAgSFRNTElucHV0RWxlbWVudCogdGhpc0lucHV0RWxlbWVudCA9
IGVsZW1lbnQtPnRvSW5wdXRFbGVtZW50KCk7Ci0gICAgSFRNTElucHV0RWxlbWVudCogb3RoZXJJ
bnB1dEVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCktPnRvSW5wdXRFbGVtZW50KCk7Ci0KLSAgICBp
ZiAoIXRoaXNJbnB1dEVsZW1lbnQgfHwgIW90aGVySW5wdXRFbGVtZW50KQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSAhPSBv
dGhlcklucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSkgewotICAgICAgICBpZiAodGhpc0lucHV0
RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZSh0eXBlQXR0cikgIT0gb3RoZXJJbnB1dEVsZW1lbnQt
PmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0
dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0cikp
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHRoaXNJbnB1dEVs
ZW1lbnQtPmlzQXV0b2ZpbGxlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5zaG91
bGRBcHBlYXJDaGVja2VkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNoZWNr
ZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5p
c0luZGV0ZXJtaW5hdGUoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNSZXF1
aXJlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpICE9IHN0
YXRlLmVsZW1lbnQoKS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKGVsZW1lbnQtPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKHN0YXRlLmRvY3VtZW50KCktPmNvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1
bGVzKCkpIHsKLSAgICAgICAgYm9vbCB3aWxsVmFsaWRhdGUgPSBlbGVtZW50LT53aWxsVmFsaWRh
dGUoKTsKLQotICAgICAgICBpZiAod2lsbFZhbGlkYXRlICE9IHN0YXRlLmVsZW1lbnQoKS0+d2ls
bFZhbGlkYXRlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0eWxlUnVsZVBhZ2Uq
IHJ1bGUgPSBydWxlc1tpXTsKIAotICAgICAgICBpZiAod2lsbFZhbGlkYXRlICYmIChlbGVtZW50
LT5pc1ZhbGlkRm9ybUNvbnRyb2xFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1ZhbGlk
Rm9ybUNvbnRyb2xFbGVtZW50KCkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xl
ZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CiAK
LSAgICAgICAgaWYgKGVsZW1lbnQtPmlzSW5SYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNJ
blJhbmdlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIElmIHRoZSBy
dWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4KKyAgICAgICAg
Y29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsK
KyAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChlbGVtZW50LT5pc091dE9mUmFuZ2UoKSAh
PSBzdGF0ZS5lbGVtZW50KCktPmlzT3V0T2ZSYW5nZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVs
ZXMuCisgICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7CiAgICAgfQotCi0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBlbGVtZW50SGFzRGlyZWN0aW9uQXV0
byhFbGVtZW50KiBlbGVtZW50KQotewotICAgIC8vIEZJWE1FOiBUaGlzIGxpbmUgaXMgc3VycHJp
c2luZ2x5IGhvdCwgd2UgbWF5IHdpc2ggdG8gaW5saW5lIGhhc0RpcmVjdGlvbkF1dG8gaW50byBT
dHlsZVJlc29sdmVyLgotICAgIHJldHVybiBlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgdG9I
VE1MRWxlbWVudChlbGVtZW50KS0+aGFzRGlyZWN0aW9uQXV0bygpOwotfQotCi1ib29sIFN0eWxl
UmVzb2x2ZXI6OnNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJp
YnV0ZXMoU3R5bGVkRWxlbWVudCogc2hhcmluZ0NhbmRpZGF0ZSkgY29uc3QKLXsKLSAgICBjb25z
dCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmVsZW1l
bnREYXRhKCkgPT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZWxlbWVudERhdGEoKSkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxO
YW1lczo6bGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUoWE1M
TmFtZXM6OmxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdGF0ZS5l
bGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUt
PmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBpZiAoIXN0YXRlLmVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygpKSB7Ci0gICAgICAgIGlm
IChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVs
ZXMoc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9IGVsc2UgaWYgKHNoYXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkpIHsKLSNp
ZiBFTkFCTEUoU1ZHKQotICAgICAgICAvLyBTVkcgZWxlbWVudHMgcmVxdWlyZSBhIChzbG93ISkg
Z2V0QXR0cmlidXRlIGNvbXBhcmlzaW9uIGJlY2F1c2UgImNsYXNzIiBpcyBhbiBhbmltYXRhYmxl
IGF0dHJpYnV0ZSBmb3IgU1ZHLgotICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5pc1NWR0Vs
ZW1lbnQoKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRl
KGNsYXNzQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotI2VuZGlm
Ci0gICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkgIT0gc2hhcmlu
Z0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0
aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5wcmVzZW50YXRpb25BdHRy
aWJ1dGVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBFTkFCTEUoUFJPR1JF
U1NfRUxFTUVOVCkKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5oYXNUYWdOYW1lKHByb2dyZXNz
VGFnKSkgewotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHN0
YXRlLmVsZW1lbnQoKSktPmlzRGV0ZXJtaW5hdGUoKSAhPSBzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jl
c3NFbGVtZW50Kj4oc2hhcmluZ0NhbmRpZGF0ZSktPmlzRGV0ZXJtaW5hdGUoKSkKLSAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiB0cnVlOwotfQot
Ci1ib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVt
ZW50KiBlbGVtZW50KSBjb25zdAotewotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IGVsZW1lbnQt
PnJlbmRlclN0eWxlKCk7Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAg
IGlmICghc3R5bGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPnVuaXF1
ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT5oYXNVbmlxdWVQc2V1
ZG9TdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPnRhZ1FO
YW1lKCkgIT0gc3RhdGUuZWxlbWVudCgpLT50YWdRTmFtZSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgaWYgKGVsZW1lbnQtPmlubGluZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBpZiAoZWxlbWVudC0+bmVlZHNTdHlsZVJlY2FsYygpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZWxlbWVudC0+aXNTVkdFbGVtZW50KCkg
JiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KGVsZW1lbnQpLT5hbmltYXRlZFNNSUxTdHlsZVBy
b3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgaWYgKGVsZW1l
bnQtPmlzTGluaygpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+aG92ZXJlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
aG92ZXJlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmFjdGl2
ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+YWN0aXZlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoZWxlbWVudC0+Zm9jdXNlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+Zm9jdXNlZCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lk
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5zaGFkb3dQc2V1ZG9JZCgpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXNoYXJpbmdDYW5kaWRhdGVIYXNJ
ZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoZWxlbWVudCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkgIT0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9u
QXR0cmlidXRlU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGVsZW1l
bnQtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMo
ZWxlbWVudC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgc2hhcmUgc3R5bGUg
Zm9yIG9wdGlvbiBhbmQgb3B0Z3JvdXAgd2hlbmV2ZXIgcG9zc2libGUuCi0gICAgLy8gQmVmb3Jl
IGRvaW5nIHNvLCB3ZSBuZWVkIHRvIHJlc29sdmUgaXNzdWVzIGluIEhUTUxTZWxlY3RFbGVtZW50
OjpyZWNhbGNMaXN0SXRlbXMKLSAgICAvLyBhbmQgUmVuZGVyTWVudUxpc3Q6OnNldFRleHQuIFNl
ZSBhbHNvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODQwNQotICAg
IGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFt
ZShvcHRncm91cFRhZykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgaXNDb250
cm9sID0gZWxlbWVudC0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKTsKLQotICAgIGlmIChpc0NvbnRy
b2wgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaXNDb250cm9sICYmICFjYW5TaGFyZVN0eWxlV2l0aENv
bnRyb2woZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdHlsZS0+
dHJhbnNpdGlvbnMoKSB8fCBzdHlsZS0+YW5pbWF0aW9ucygpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgLy8gVHVybiBvZmYg
c3R5bGUgc2hhcmluZyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2FpbiBsYXllcnMgZm9yIHJlYXNv
bnMgb3V0c2lkZSBvZiB0aGUgc3R5bGUgc3lzdGVtLgotICAgIC8vIFNlZSBjb21tZW50cyBpbiBS
ZW5kZXJPYmplY3Q6OnNldFN0eWxlKCkuCi0gICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaWZy
YW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGVtYmVkVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9iamVjdFRhZykgfHwgZWxl
bWVudC0+aGFzVGFnTmFtZShhcHBsZXRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoY2FudmFz
VGFnKQotI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlfRk9SX1ZJREVPKQotICAgICAgICAvLyBXaXRo
IHByb3h5aW5nLCB0aGUgbWVkaWEgZWxlbWVudHMgYXJlIGJhY2tlZCBieSBhIFJlbmRlckVtYmVk
ZGVkT2JqZWN0LgotICAgICAgICB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKHZpZGVvVGFnKSB8fCBl
bGVtZW50LT5oYXNUYWdOYW1lKGF1ZGlvVGFnKQotI2VuZGlmCi0gICAgICAgICkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8o
ZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0xp
bmsoKSAmJiBzdGF0ZS5lbGVtZW50TGlua1N0YXRlKCkgIT0gc3R5bGUtPmluc2lkZUxpbmsoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIC8v
IERlbnkgc2hhcmluZyBzdHlsZXMgYmV0d2VlbiBXZWJWVFQgYW5kIG5vbi1XZWJWVFQgbm9kZXMu
Ci0gICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
aXNXZWJWVFRFbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVt
ZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVu
dCgpICYmIHRvV2ViVlRURWxlbWVudChlbGVtZW50KS0+aXNQYXN0Tm9kZSgpICE9IHRvV2ViVlRU
RWxlbWVudChzdGF0ZS5lbGVtZW50KCkpLT5pc1Bhc3ROb2RlKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSNlbmRpZgotCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgIGlmIChlbGVt
ZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVu
dCgpIHx8IHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50
RnVsbFNjcmVlbkVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLWlubGluZSBTdHlsZWRFbGVtZW50KiBTdHlsZVJlc29sdmVyOjpm
aW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiBub2RlLCB1bnNpZ25lZCYgY291bnQpIGNv
bnN0Ci17Ci0gICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkg
ewotICAgICAgICBpZiAoIW5vZGUtPmlzU3R5bGVkRWxlbWVudCgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIGlmIChjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoc3RhdGljX2Nhc3Q8
U3R5bGVkRWxlbWVudCo+KG5vZGUpKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAo
Y291bnQrKyA9PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCi0gICAgICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKLX0K
LQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZVNoYXJlZFN0eWxlKCkKLXsKLSAg
ICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmICghc3RhdGUuc3R5bGVkRWxlbWVudCgp
IHx8ICFzdGF0ZS5wYXJlbnRTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIElm
IHRoZSBlbGVtZW50IGhhcyBpbmxpbmUgc3R5bGUgaXQgaXMgcHJvYmFibHkgdW5pcXVlLgotICAg
IGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpCi0gICAgICAgIHJldHVy
biAwOwotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNT
VkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHN0YXRlLnN0eWxlZEVsZW1l
bnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQotICAgICAgICByZXR1cm4gMDsK
LSNlbmRpZgotICAgIC8vIElkcyBzdG9wIHN0eWxlIHNoYXJpbmcgaWYgdGhleSBzaG93IHVwIGlu
IHRoZSBzdHlsZXNoZWV0cy4KLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNJRCgp
ICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHN0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50
KCktPnBhcmVudEVsZW1lbnQoKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChzdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+Y3NzVGFy
Z2V0KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0
byhzdGF0ZS5lbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIENhY2hlIHdo
ZXRoZXIgc3RhdGUuZWxlbWVudCBpcyBhZmZlY3RlZCBieSBhbnkga25vd24gY2xhc3Mgc2VsZWN0
b3JzLgotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBhIG1lbWJlciB2YXJpYWJsZS4g
VGhlIHN0eWxlIHNoYXJpbmcgY29kZSBjb3VsZCBiZSBmYWN0b3JlZCBvdXQgb2YgU3R5bGVSZXNv
bHZlci4KLSAgICBzdGF0ZS5zZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoc3RhdGUuZWxl
bWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0
ZWRCeVJ1bGVzKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygpKSk7Ci0KLSAgICAvLyBDaGVj
ayBwcmV2aW91cyBzaWJsaW5ncyBhbmQgdGhlaXIgY291c2lucy4KLSAgICB1bnNpZ25lZCBjb3Vu
dCA9IDA7Ci0gICAgdW5zaWduZWQgdmlzaXRlZE5vZGVDb3VudCA9IDA7Ci0gICAgU3R5bGVkRWxl
bWVudCogc2hhcmVFbGVtZW50ID0gMDsKLSAgICBOb2RlKiBjb3VzaW5MaXN0ID0gc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3aGlsZSAoY291c2luTGlzdCkg
ewotICAgICAgICBzaGFyZUVsZW1lbnQgPSBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhjb3Vz
aW5MaXN0LCBjb3VudCk7Ci0gICAgICAgIGlmIChzaGFyZUVsZW1lbnQpCi0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY291c2luTGlzdCA9IGxvY2F0ZUNvdXNpbkxpc3QoY291c2luTGlzdC0+
cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3
ZSBoYXZlIGV4aGF1c3RlZCBhbGwgb3VyIGJ1ZGdldCBvciBvdXIgY291c2lucy4KLSAgICBpZiAo
IXNoYXJlRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDYW4ndCBzaGFyZSBp
ZiBzaWJsaW5nIHJ1bGVzIGFwcGx5LiBUaGlzIGlzIGNoZWNrZWQgYXQgdGhlIGVuZCBhcyBpdCBz
aG91bGQgcmFyZWx5IGZhaWwuCi0gICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNS
dWxlU2V0KG1fcnVsZVNldHMuc2libGluZygpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8g
Q2FuJ3Qgc2hhcmUgaWYgYXR0cmlidXRlIHJ1bGVzIGFwcGx5LgotICAgIGlmIChzdHlsZVNoYXJp
bmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnVuY29tbW9uQXR0cmlidXRlKCkp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAvLyBDYW4ndCBzaGFyZSBpZiBAaG9zdCBALXJ1bGVz
IGFwcGx5LgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIC8vIFRyYWNraW5nIGNoaWxkIGluZGV4IHJlcXVpcmVz
IHVuaXF1ZSBzdHlsZSBmb3IgZWFjaCBub2RlLiBUaGlzIG1heSBnZXQgc2V0IGJ5IHRoZSBzaWJs
aW5nIHJ1bGUgbWF0Y2ggYWJvdmUuCi0gICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJp
bmcoc3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsK
LSAgICByZXR1cm4gc2hhcmVFbGVtZW50LT5yZW5kZXJTdHlsZSgpOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0KQotewotICAgIE1hdGNo
aW5nVUFSdWxlc1Njb3BlIHNjb3BlOwotCi0gICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJv
bSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpz
aW1wbGVEZWZhdWx0U3R5bGVTaGVldCkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFs
c2U7Ci0gICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5
cGVNYXRjaFNwZWNpZmljKCJwcmludCIpCi0gICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxl
OwotICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQpOwotCi0gICAg
Ly8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFn
ZW50IHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkKLSAgICAgICAg
bWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtz
U3R5bGUpOwotCi0gICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGlu
IHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBy
dWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQo
KS0+aXNWaWV3U291cmNlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRT
dHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBS
ZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRp
b246OlVucGFnaW5hdGVkKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIHN3aXRjaCAo
cGFnaW5hdGlvbk1vZGUpIHsKLSAgICBjYXNlIFBhZ2luYXRpb246OkxlZnRUb1JpZ2h0UGFnaW5h
dGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7
Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Np
b24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Np
b24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJv
Z3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgUGFnaW5hdGlvbjo6UmlnaHRUb0xlZnRQYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5z
ZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5p
c0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblBy
b2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1u
UHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxv
Y2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVt
blByb2dyZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpUb3BU
b0JvdHRvbVBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxD
b2x1bW5BeGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBw
ZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFs
Q29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0
Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1h
bENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpCb3R0b21Ub1RvcFBhZ2luYXRlZDoKLSAgICAg
ICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKLSAgICAgICAgaWYg
KHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNl
dENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8g
Tm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5v
cm1hbENvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAg
IGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRp
b24oY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBGb250T3JpZW50YXRpb24mIGZvbnRPcmllbnRh
dGlvbiwgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiYgZ2x5cGhPcmllbnRhdGlvbikKLXsKLSAgICBp
ZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpIHsKLSAgICAgICAgZm9udE9yaWVu
dGF0aW9uID0gSG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0ds
eXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgc3dpdGNoIChzdHlsZS0+dGV4dE9yaWVudGF0aW9uKCkpIHsKLSAgICBjYXNlIFRleHRPcmll
bnRhdGlvblZlcnRpY2FsUmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2Fs
OwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRp
Y2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblVwcmln
aHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOwotICAgICAgICBnbHlwaE9y
aWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblVwcmlnaHQ7Ci0gICAgICAgIHJldHVy
bjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzOgotICAgICAgICBpZiAoc3R5bGUt
PndyaXRpbmdNb2RlKCkgPT0gTGVmdFRvUmlnaHRXcml0aW5nTW9kZSkgewotICAgICAgICAgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIG1hcCB0byBzaWRld2F5cy1sZWZ0LCB3aGljaCBpcyBub3Qg
c3VwcG9ydGVkIHlldC4KLSAgICAgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOwot
ICAgICAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0
aWNhbFJpZ2h0OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvbnRP
cmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25D
SktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIGNh
c2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXNSaWdodDoKLSAgICAgICAgZm9udE9yaWVudGF0aW9u
ID0gSG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhv
cml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0
aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotUGFzc1JlZlB0
cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCog
ZG9jdW1lbnQsIENTU0ZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKQotewotICAgIEZyYW1lKiBm
cmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOwotCi0gICAgLy8gSFRNTDUgc3RhdGVzIHRoYXQgc2Vh
bWxlc3MgaWZyYW1lcyBzaG91bGQgcmVwbGFjZSBkZWZhdWx0IENTUyB2YWx1ZXMKLSAgICAvLyB3
aXRoIHZhbHVlcyBpbmhlcml0ZWQgZnJvbSB0aGUgY29udGFpbmluZyBpZnJhbWUgZWxlbWVudC4g
SG93ZXZlciwKLSAgICAvLyBzb21lIHZhbHVlcyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBkZXNpZ25N
b2RlID0gIm9uIikgc3RpbGwgbmVlZCB0bwotICAgIC8vIGJlIHNldCBieSB0aGlzICJkb2N1bWVu
dCBzdHlsZSIuCi0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gUmVuZGVy
U3R5bGU6OmNyZWF0ZSgpOwotICAgIGJvb2wgc2VhbWxlc3NXaXRoUGFyZW50ID0gZG9jdW1lbnQt
PnNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpOwotICAgIGlmIChzZWFtbGVzc1dp
dGhQYXJlbnQpIHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIGlmcmFtZVN0eWxlID0gZG9jdW1lbnQt
PnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPnJlbmRlclN0eWxlKCk7Ci0gICAgICAgIGlmIChpZnJh
bWVTdHlsZSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPmluaGVyaXRGcm9tKGlmcmFtZVN0
eWxlKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogSXQncyBub3QgY2xlYXIgd2hpY2ggdmFsdWVz
IGJlbG93IHdlIHdhbnQgdG8gb3ZlcnJpZGUgaW4gdGhlIHNlYW1sZXNzIGNhc2UhCi0gICAgZG9j
dW1lbnRTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgaWYgKCFzZWFtbGVzc1dpdGhQYXJl
bnQpIHsKLSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UlRMT3JkZXJpbmcoZG9jdW1lbnQtPnZp
c3VhbGx5T3JkZXJlZCgpID8gVmlzdWFsT3JkZXIgOiBMb2dpY2FsT3JkZXIpOwotICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRab29tKGZyYW1lICYmICFkb2N1bWVudC0+cHJpbnRpbmcoKSA/IGZy
YW1lLT5wYWdlWm9vbUZhY3RvcigpIDogMSk7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFBh
Z2VTY2FsZVRyYW5zZm9ybShmcmFtZSA/IGZyYW1lLT5mcmFtZVNjYWxlRmFjdG9yKCkgOiAxKTsK
LSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0TG9jYWxlKGRvY3VtZW50LT5jb250ZW50TGFuZ3Vh
Z2UoKSk7Ci0gICAgfQotICAgIC8vIFRoaXMgb3ZlcnJpZGVzIGFueSAtd2Via2l0LXVzZXItbW9k
aWZ5IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgaWZyYW1lLgotICAgIGRvY3VtZW50U3R5bGUt
PnNldFVzZXJNb2RpZnkoZG9jdW1lbnQtPmluRGVzaWduTW9kZSgpID8gUkVBRF9XUklURSA6IFJF
QURfT05MWSk7Ci0KLSAgICBFbGVtZW50KiBkb2NFbGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50
RWxlbWVudCgpOwotICAgIFJlbmRlck9iamVjdCogZG9jRWxlbWVudFJlbmRlcmVyID0gZG9jRWxl
bWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlcmVyKCkgOiAwOwotICAgIGlmIChkb2NFbGVtZW50UmVu
ZGVyZXIpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSBv
ZiB0aGUgYm9keSB0byBzZXQgdGhlCi0gICAgICAgIC8vIHZpZXdwb3J0J3MgZGlyZWN0aW9uIGFu
ZCB3cml0aW5nLW1vZGUgdW5sZXNzIHRoZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlIGRvY3VtZW50
IGVsZW1lbnQuCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJvZHksIHRoZW4gdXNlIHRoZSBk
b2N1bWVudCBlbGVtZW50LgotICAgICAgICBSZW5kZXJPYmplY3QqIGJvZHlSZW5kZXJlciA9IGRv
Y3VtZW50LT5ib2R5KCkgPyBkb2N1bWVudC0+Ym9keSgpLT5yZW5kZXJlcigpIDogMDsKLSAgICAg
ICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVu
dEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGJv
ZHlSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGRvY0VsZW1lbnRSZW5kZXJlci0+
c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRv
Y3VtZW50LT5kaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICAgICAgZG9j
dW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rp
b24oZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7Ci0gICAgfQotCi0g
ICAgaWYgKGZyYW1lKSB7Ci0gICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1l
LT52aWV3KCkpIHsKLSAgICAgICAgICAgIGNvbnN0IFBhZ2luYXRpb24mIHBhZ2luYXRpb24gPSBm
cmFtZVZpZXctPnBhZ2luYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uLm1vZGUg
IT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRTdHlsZXNG
b3JQYWdpbmF0aW9uTW9kZShwYWdpbmF0aW9uLm1vZGUsIGRvY3VtZW50U3R5bGUuZ2V0KCkpOwot
ICAgICAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldENvbHVtbkdhcChwYWdpbmF0aW9uLmdh
cCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSBkb2N1bWVudC0+cmVu
ZGVyVmlldygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LT5oYXNDb2x1bW5zKCkp
Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LT51cGRhdGVDb2x1bW5JbmZvRnJvbVN0eWxl
KGRvY3VtZW50U3R5bGUuZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgd2FudCB0byBpbmhl
cml0IHRoZWlyIGZvbnQgZnJvbSB0aGVpciBwYXJlbnQgaWZyYW1lLCBzbyBlYXJseSByZXR1cm4g
YmVmb3JlIHNldHRpbmcgdGhlIGZvbnQuCi0gICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkKLSAg
ICAgICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotCi0gICAgRm9udERlc2NyaXB0
aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2Fs
ZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24oZG9jdW1lbnRTdHlsZS0+bG9jYWxlKCkpKTsK
LSAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCkpIHsKLSAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGlu
ZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7Ci0gICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVy
aW5nTW9kZSgpKTsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBzdGFuZGFyZEZvbnQgPSBz
ZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KGZvbnREZXNjcmlwdGlvbi5zY3JpcHQoKSk7Ci0g
ICAgICAgIGlmICghc3RhbmRhcmRGb250LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWls
eSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHko
c3RhbmRhcmRGb250KTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgp
LmFwcGVuZEZhbWlseSgwKTsKLSAgICAgICAgfQotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRpdW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKLSAgICAg
ICAgaW50IHNpemUgPSBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQs
IENTU1ZhbHVlTWVkaXVtLCBmYWxzZSk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVj
aWZpZWRTaXplKHNpemUpOwotICAgICAgICBib29sIHVzZVNWR1pvb21SdWxlcyA9IGRvY3VtZW50
LT5pc1NWR0RvY3VtZW50KCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNp
emUoU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1l
bnQsIGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgp
LCBzaXplLCB1c2VTVkdab29tUnVsZXMpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpKTsKLQotICAgIEZv
bnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlv
biBnbHlwaE9yaWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGRvY3Vt
ZW50U3R5bGUuZ2V0KCksIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7Ci0gICAg
Zm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmllbnRhdGlvbik7Ci0gICAgZm9u
dERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7
Ci0KLSAgICBkb2N1bWVudFN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9u
KTsKLSAgICBkb2N1bWVudFN0eWxlLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3Rvcik7Ci0KLSAg
ICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc0F0U2hhZG93Qm91bmRhcnkoY29uc3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBpZiAo
IWVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBDb250YWluZXJOb2RlKiBwYXJl
bnROb2RlID0gZWxlbWVudC0+cGFyZW50Tm9kZSgpOwotICAgIHJldHVybiBwYXJlbnROb2RlICYm
IHBhcmVudE5vZGUtPmlzU2hhZG93Um9vdCgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVy
U3R5bGUqIGRlZmF1bHRQYXJlbnQsCi0gICAgU3R5bGVTaGFyaW5nQmVoYXZpb3Igc2hhcmluZ0Jl
aGF2aW9yLCBSdWxlTWF0Y2hpbmdCZWhhdmlvciBtYXRjaGluZ0JlaGF2aW9yLCBSZW5kZXJSZWdp
b24qIHJlZ2lvbkZvclN0eWxpbmcpCi17Ci0gICAgLy8gT25jZSBhbiBlbGVtZW50IGhhcyBhIHJl
bmRlcmVyLCB3ZSBkb24ndCB0cnkgdG8gZGVzdHJveSBpdCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBy
ZW5kZXJlcgotICAgIC8vIHdpbGwgdmFuaXNoIGlmIGEgc3R5bGUgcmVjYWxjIGhhcHBlbnMgZHVy
aW5nIGxvYWRpbmcuCi0gICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmlu
ZyAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgIWVs
ZW1lbnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgaWYgKCFzX3N0eWxlTm90WWV0QXZhaWxhYmxl
KSB7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlID0gUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpLmxlYWtSZWYoKTsKLSAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPnNl
dERpc3BsYXkoTk9ORSk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5mb250
KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50LT5k
b2N1bWVudCgpLT5zZXRIYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKCk7Ci0gICAgICAgIHJl
dHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOwotICAgIH0KLQotICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7Ci0gICAgaW5pdEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgc3RhdGUuaW5pdEZvclN0
eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywg
cmVnaW9uRm9yU3R5bGluZyk7Ci0gICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxl
U2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKLSAgICAg
ICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoKTsKLSAgICAg
ICAgaWYgKHNoYXJlZFN0eWxlKQotICAgICAgICAgICAgcmV0dXJuIHNoYXJlZFN0eWxlOwotICAg
IH0KLQotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gY2xvbmVGb3JQYXJlbnQ7Ci0KLSAgICBpZiAo
c3RhdGUucGFyZW50U3R5bGUoKSkgewotICAgICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHls
ZTo6Y3JlYXRlKCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShzdGF0ZS5w
YXJlbnRTdHlsZSgpLCBpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkgPyBSZW5kZXJTdHlsZTo6
QXRTaGFkb3dCb3VuZGFyeSA6IFJlbmRlclN0eWxlOjpOb3RBdFNoYWRvd0JvdW5kYXJ5KTsKLSAg
ICB9IGVsc2UgewotICAgICAgICBzdGF0ZS5zZXRTdHlsZShkZWZhdWx0U3R5bGVGb3JFbGVtZW50
KCkpOwotICAgICAgICBjbG9uZUZvclBhcmVudCA9IFJlbmRlclN0eWxlOjpjbG9uZShzdGF0ZS5z
dHlsZSgpKTsKLSAgICAgICAgc3RhdGUuc2V0UGFyZW50U3R5bGUoY2xvbmVGb3JQYXJlbnQuZ2V0
KCkpOwotICAgIH0KLSAgICAvLyBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlIChpbXBsZW1lbnRl
ZCBieSAtd2Via2l0LXVzZXItbW9kaWZ5KSBzaG91bGQKLSAgICAvLyBiZSBwcm9wYWdhdGVkIGZy
b20gc2hhZG93IGhvc3QgdG8gZGlzdHJpYnV0ZWQgbm9kZS4KLSAgICBpZiAoc3RhdGUuZGlzdHJp
YnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKLSAgICAgICAgaWYgKEVsZW1lbnQqIHBhcmVudCA9
IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQoKSkgewotICAgICAgICAgICAgaWYgKFJlbmRlclN0eWxl
KiBzdHlsZU9mU2hhZG93SG9zdCA9IHBhcmVudC0+cmVuZGVyU3R5bGUoKSkKLSAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VyTW9kaWZ5KHN0eWxlT2ZTaGFkb3dIb3N0LT51c2Vy
TW9kaWZ5KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnQtPmlzTGluaygp
KSB7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldElzTGluayh0cnVlKTsKLSAgICAgICAgRUlu
c2lkZUxpbmsgbGlua1N0YXRlID0gc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpOwotICAgICAgICBp
ZiAobGlua1N0YXRlICE9IE5vdEluc2lkZUxpbmspIHsKLSAgICAgICAgICAgIGJvb2wgZm9yY2VW
aXNpdGVkID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpmb3JjZVBzZXVkb1N0YXRlKGVsZW1l
bnQsIENTU1NlbGVjdG9yOjpQc2V1ZG9WaXNpdGVkKTsKLSAgICAgICAgICAgIGlmIChmb3JjZVZp
c2l0ZWQpCi0gICAgICAgICAgICAgICAgbGlua1N0YXRlID0gSW5zaWRlVmlzaXRlZExpbms7Ci0g
ICAgICAgIH0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdGUp
OwotICAgIH0KLQotICAgIGJvb2wgbmVlZHNDb2xsZWN0aW9uID0gZmFsc2U7Ci0gICAgQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjplbnN1cmVEZWZhdWx0U3R5bGVTaGVldHNGb3JFbGVtZW50KGVsZW1l
bnQsIG5lZWRzQ29sbGVjdGlvbik7Ci0gICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKLSAgICAgICAg
bV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1f
c2NvcGVSZXNvbHZlci5nZXQoKSk7Ci0KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAg
ICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9PSBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcykKLSAgICAg
ICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKLSAgICBlbHNlCi0gICAgICAgIG1hdGNoQWxs
UnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1
ZGluZ1NNSUwpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxl
bWVudCk7Ci0KLSAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQg
dGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJT
dHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBlbGVtZW50KTsKLQotICAg
IHN0YXRlLmNsZWFyKCk7IC8vIENsZWFyIG91dCBmb3IgdGhlIG5leHQgcmVzb2x2ZS4KLQotICAg
IGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1
cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JLZXlmcmFtZShjb25zdCBS
ZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSwg
S2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVWYWx1ZSkKLXsKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7
Ci0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAgICAgIGFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSk7Ci0KLSAgICBBU1NFUlQoIW1f
c3RhdGUuc3R5bGUoKSk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgLy8g
Q3JlYXRlIHRoZSBzdHlsZQotICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjbG9uZShl
bGVtZW50U3R5bGUpKTsKLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0KLSAgICAv
LyBXZSBkb24ndCBuZWVkIHRvIGJvdGhlciB3aXRoICFpbXBvcnRhbnQuIFNpbmNlIHRoZXJlIGlz
IG9ubHkgZXZlciBvbmUKLSAgICAvLyBkZWNsLCB0aGVyZSdzIG5vdGhpbmcgdG8gb3ZlcnJpZGUu
IFNvIGp1c3QgYWRkIHRoZSBmaXJzdCBwcm9wZXJ0aWVzLgotICAgIGJvb2wgaW5oZXJpdGVkT25s
eSA9IGZhbHNlOwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2Us
IDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsK
LQotICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0
IG5vdy4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hl
biB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUKLSAgICBpZiAoc3RhdGUu
bGluZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5l
SGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7Ci0KLSAgICAvLyBOb3cgZG8gcmVzdCBv
ZiB0aGUgcHJvcGVydGllcy4KLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAg
ICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwg
ZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRP
bmx5KTsKLQotICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkIGJ5IG9uZSBvZiB0aGUgbm9u
LWVzc2VudGlhbCBmb250IHByb3BzLAotICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgYSBz
ZWNvbmQgdGltZS4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJl
c291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJj
ZXMoKTsKLSAgICAKLSAgICAvLyBBZGQgYWxsIHRoZSBhbmltYXRpbmcgcHJvcGVydGllcyB0byB0
aGUga2V5ZnJhbWUuCi0gICAgaWYgKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHN0eWxlRGVjbGFy
YXRpb24gPSBrZXlmcmFtZS0+cHJvcGVydGllcygpKSB7Ci0gICAgICAgIHVuc2lnbmVkIHByb3Bl
cnR5Q291bnQgPSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUNvdW50KCk7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAgICAgICAgICAg
IENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUF0KGkp
LmlkKCk7Ci0gICAgICAgICAgICAvLyBUaW1pbmctZnVuY3Rpb24gd2l0aGluIGtleWZyYW1lcyBp
cyBzcGVjaWFsLCBiZWNhdXNlIGl0IGlzIG5vdCBhbmltYXRlZDsgaXQganVzdAotICAgICAgICAg
ICAgLy8gZGVzY3JpYmVzIHRoZSB0aW1pbmcgZnVuY3Rpb24gYmV0d2VlbiB0aGlzIGtleWZyYW1l
IGFuZCB0aGUgbmV4dC4KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uKQotICAgICAgICAgICAgICAgIGtleWZyYW1lVmFs
dWUuYWRkUHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZG9jdW1l
bnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOwotCi0gICAgcmV0dXJuIHN0YXRlLnRha2VT
dHlsZSgpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmtleWZyYW1lU3R5bGVzRm9yQW5pbWF0
aW9uKEVsZW1lbnQqIGUsIGNvbnN0IFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIEtleWZyYW1l
TGlzdCYgbGlzdCkKLXsKLSAgICBsaXN0LmNsZWFyKCk7Ci0KLSAgICAvLyBHZXQgdGhlIGtleWZy
YW1lc1J1bGUgZm9yIHRoaXMgbmFtZQotICAgIGlmICghZSB8fCBsaXN0LmFuaW1hdGlvbk5hbWUo
KS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5j
aGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICBLZXlmcmFtZXNSdWxlTWFwOjppdGVyYXRvciBpdCA9
IG1fa2V5ZnJhbWVzUnVsZU1hcC5maW5kKGxpc3QuYW5pbWF0aW9uTmFtZSgpLmltcGwoKSk7Ci0g
ICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVzUnVsZU1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgY29uc3QgU3R5bGVSdWxlS2V5ZnJhbWVzKiBrZXlmcmFtZXNSdWxlID0gaXQtPnZhbHVl
LmdldCgpOwotCi0gICAgLy8gQ29uc3RydWN0IGFuZCBwb3B1bGF0ZSB0aGUgc3R5bGUgZm9yIGVh
Y2gga2V5ZnJhbWUKLSAgICBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlS2V5ZnJhbWU+ID4mIGtl
eWZyYW1lcyA9IGtleWZyYW1lc1J1bGUtPmtleWZyYW1lcygpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBrZXlmcmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgLy8gQXBwbHkgdGhl
IGRlY2xhcmF0aW9uIHRvIHRoZSBzdHlsZS4gVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBv
ZiB0aGUgbG9naWMgaW4gc3R5bGVGb3JFbGVtZW50Ci0gICAgICAgIGluaXRFbGVtZW50KGUpOwot
ICAgICAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSk7Ci0KLSAg
ICAgICAgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUgPSBrZXlmcmFtZXNbaV0uZ2V0KCk7
Ci0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDAsIDApOwotICAgICAgICBr
ZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBrZXlm
cmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotCi0gICAgICAgIC8vIEFkZCB0aGlzIGtleWZyYW1lIHN0
eWxlIHRvIGFsbCB0aGUgaW5kaWNhdGVkIGtleSB0aW1lcwotICAgICAgICBWZWN0b3I8ZmxvYXQ+
IGtleXM7Ci0gICAgICAgIGtleWZyYW1lLT5nZXRLZXlzKGtleXMpOwotICAgICAgICBmb3IgKHNp
emVfdCBrZXlJbmRleCA9IDA7IGtleUluZGV4IDwga2V5cy5zaXplKCk7ICsra2V5SW5kZXgpIHsK
LSAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0S2V5KGtleXNba2V5SW5kZXhdKTsKLSAgICAg
ICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgLy8gSWYgdGhlIDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkg
aWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1lKQotICAgIGludCBpbml0aWFs
TGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiBs
aXN0WzBdLmtleSgpKSB7Ci0gICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiB6ZXJvUGVyY2Vu
dEtleWZyYW1lOwotICAgICAgICBpZiAoIXplcm9QZXJjZW50S2V5ZnJhbWUpIHsKLSAgICAgICAg
ICAgIHplcm9QZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVm
KCk7Ci0gICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIwJSIpOwot
ICAgICAgICB9Ci0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKLSAg
ICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHls
ZSwgemVyb1BlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotICAgICAgICBsaXN0Lmlu
c2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgMTAwJSBrZXlmcmFt
ZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9u
ZSBvdGhlciBrZXlmcmFtZSkKLSAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiAobGlzdFts
aXN0LnNpemUoKSAtIDFdLmtleSgpICE9IDEpKSB7Ci0gICAgICAgIHN0YXRpYyBTdHlsZUtleWZy
YW1lKiBodW5kcmVkUGVyY2VudEtleWZyYW1lOwotICAgICAgICBpZiAoIWh1bmRyZWRQZXJjZW50
S2V5ZnJhbWUpIHsKLSAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtl
eWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtl
eWZyYW1lLT5zZXRLZXlUZXh0KCIxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgICAgS2V5ZnJhbWVW
YWx1ZSBrZXlmcmFtZVZhbHVlKDEsIDApOwotICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxl
KHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBodW5kcmVkUGVyY2VudEtleWZyYW1lLCBr
ZXlmcmFtZVZhbHVlKSk7Ci0gICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOwotICAg
IH0KLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5
bGVGb3JFbGVtZW50KEVsZW1lbnQqIGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRv
U3R5bGVSZXF1ZXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgQVNTRVJUKHBh
cmVudFN0eWxlKTsKLSAgICBpZiAoIWUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgU3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIGluaXRFbGVtZW50KGUpOwotCi0gICAgc3RhdGUuaW5p
dEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVS
ZXF1ZXN0KTsKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwotICAg
IHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucGFyZW50U3R5bGUoKSk7Ci0KLSAg
ICAvLyBTaW5jZSB3ZSBkb24ndCB1c2UgcHNldWRvLWVsZW1lbnRzIGluIGFueSBvZiBvdXIgcXVp
cmsvcHJpbnQgdXNlciBhZ2VudCBydWxlcywgZG9uJ3Qgd2FzdGUgdGltZSB3YWxraW5nCi0gICAg
Ly8gdGhvc2UgcnVsZXMuCi0KLSAgICAvLyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVz
LgotICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OwotICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJl
c3VsdCk7Ci0KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKLSAgICAgICAg
bWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgbWF0Y2hBdXRob3JS
dWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChtYXRjaFJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgc3Rh
dGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCk7Ci0K
LSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlKTsKLQotICAgIC8vIENs
ZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChh
bW9uZyBvdGhlciBmaXh1cHMpLgotICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCks
IG1fc3RhdGUucGFyZW50U3R5bGUoKSwgMCk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291
cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMo
KTsKLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8v
IE5vdyByZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKLX0K
LQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKGlu
dCBwYWdlSW5kZXgpCi17Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50
KCksIGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKTsgLy8gbV9yb290RWxlbWVudFN0eWxl
IHdpbGwgYmUgc2V0IHRvIHRoZSBkb2N1bWVudCBzdHlsZS4KLQotICAgIG1fc3RhdGUuc2V0U3R5
bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICBtX3N0YXRlLnN0eWxlKCktPmluaGVyaXRG
cm9tKG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLQotICAgIGNvbnN0IGJvb2wgaXNMZWZ0
ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmly
c3RQYWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgU3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdl
SW5kZXgpOwotICAgIAotICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKLSAgICBtYXRjaFBhZ2VSdWxl
cyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVm
dCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIC8vIE9ubHkgY29uc2lk
ZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUg
SFRNTDUgc3BlYy4KLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9y
U3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICBtX3N0YXRlLnNldExpbmVIZWln
aHRWYWx1ZSgwKTsKLSAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSNpZiBFTkFCTEUo
Q1NTX1ZBUklBQkxFUykKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5p
dGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxLCBpbmhlcml0ZWRPbmx5KTsKLSNlbmRpZgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8
SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwotCi0gICAgLy8gSWYgb3VyIGZv
bnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgotICAgIHVwZGF0ZUZv
bnQoKTsKLQotICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRl
Y2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4KLSAgICBpZiAobV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUo
KSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIG1fc3RhdGUu
bGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlv
cml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVz
b3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ1Jlc291cmNl
cygpOwotCi0gICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOwotCi0gICAg
Ly8gTm93IHJldHVybiB0aGUgc3R5bGUuCi0gICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OmRlZmF1bHRTdHls
ZUZvckVsZW1lbnQoKQotewotICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0
ZSgpKTsKLSAgICAvLyBNYWtlIHN1cmUgb3VyIGZvbnRzIGFyZSBpbml0aWFsaXplZCBpZiB3ZSBk
b24ndCBpbmhlcml0IHRoZW0gZnJvbSBvdXIgcGFyZW50IHN0eWxlLgotICAgIGlmIChTZXR0aW5n
cyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCkpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUZv
bnRTdHlsZShzZXR0aW5ncyk7Ci0gICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0
ZShmb250U2VsZWN0b3IoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+
Zm9udCgpLnVwZGF0ZSgwKTsKLQotICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOwotfQot
Ci1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclRleHQoVGV4
dCogdGV4dE5vZGUpCi17Ci0gICAgQVNTRVJUKHRleHROb2RlKTsKLQotICAgIE5vZGVSZW5kZXJp
bmdDb250ZXh0IGNvbnRleHQodGV4dE5vZGUpOwotICAgIE5vZGUqIHBhcmVudE5vZGUgPSBjb250
ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOwotICAgIHJldHVybiBjb250ZXh0
LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpIHx8ICFwYXJlbnROb2RlID8KLSAgICAgICAgZGVmYXVs
dFN0eWxlRm9yRWxlbWVudCgpIDogcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKTsKLX0KLQotc3Rh
dGljIHZvaWQgYWRkSW50cmluc2ljTWFyZ2lucyhSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAg
Ly8gSW50cmluc2ljIG1hcmdpbiB2YWx1ZS4KLSAgICBjb25zdCBpbnQgaW50cmluc2ljTWFyZ2lu
ID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICAvLyBGSVhNRTogVXNpbmcgd2lk
dGgvaGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13
aWR0aCBpcyBmbGF3ZWQuCi0gICAgLy8gRklYTUU6IFVzaW5nICJxdWlyayIgdG8gZGVjaWRlIHRo
ZSBtYXJnaW4gd2Fzbid0IHNldCBpcyBraW5kIG9mIGxhbWUuCi0gICAgaWYgKHN0eWxlLT53aWR0
aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0
KCkucXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChpbnRy
aW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luUmlnaHQoKS5x
dWlyaygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChpbnRyaW5z
aWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1
dG8oKSkgewotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCi0gICAgICAg
ICAgICBzdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7
Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKLSAgICAgICAgICAg
IHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsK
LSAgICB9Ci19Ci0KLXN0YXRpYyBFRGlzcGxheSBlcXVpdmFsZW50QmxvY2tEaXNwbGF5KEVEaXNw
bGF5IGRpc3BsYXksIGJvb2wgaXNGbG9hdGluZywgYm9vbCBzdHJpY3RQYXJzaW5nKQotewotICAg
IHN3aXRjaCAoZGlzcGxheSkgewotICAgIGNhc2UgQkxPQ0s6Ci0gICAgY2FzZSBUQUJMRToKLSAg
ICBjYXNlIEJPWDoKLSAgICBjYXNlIEZMRVg6Ci0gICAgY2FzZSBHUklEOgotICAgICAgICByZXR1
cm4gZGlzcGxheTsKLQotICAgIGNhc2UgTElTVF9JVEVNOgotICAgICAgICAvLyBJdCBpcyBhIFdp
bklFIGJ1ZyB0aGF0IGZsb2F0ZWQgbGlzdCBpdGVtcyBsb3NlIHRoZWlyIGJ1bGxldHMsIHNvIHdl
J2xsIGVtdWxhdGUgdGhlIHF1aXJrLCBidXQgb25seSBpbiBxdWlya3MgbW9kZS4KLSAgICAgICAg
aWYgKCFzdHJpY3RQYXJzaW5nICYmIGlzRmxvYXRpbmcpCi0gICAgICAgICAgICByZXR1cm4gQkxP
Q0s7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgIGNhc2UgSU5MSU5FX1RBQkxFOgotICAg
ICAgICByZXR1cm4gVEFCTEU7Ci0gICAgY2FzZSBJTkxJTkVfQk9YOgotICAgICAgICByZXR1cm4g
Qk9YOwotICAgIGNhc2UgSU5MSU5FX0ZMRVg6Ci0gICAgICAgIHJldHVybiBGTEVYOwotICAgIGNh
c2UgSU5MSU5FX0dSSUQ6Ci0gICAgICAgIHJldHVybiBHUklEOwotCi0gICAgY2FzZSBJTkxJTkU6
Ci0gICAgY2FzZSBSVU5fSU46Ci0gICAgY2FzZSBDT01QQUNUOgotICAgIGNhc2UgSU5MSU5FX0JM
T0NLOgotICAgIGNhc2UgVEFCTEVfUk9XX0dST1VQOgotICAgIGNhc2UgVEFCTEVfSEVBREVSX0dS
T1VQOgotICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgotICAgIGNhc2UgVEFCTEVfUk9XOgot
ICAgIGNhc2UgVEFCTEVfQ09MVU1OX0dST1VQOgotICAgIGNhc2UgVEFCTEVfQ09MVU1OOgotICAg
IGNhc2UgVEFCTEVfQ0VMTDoKLSAgICBjYXNlIFRBQkxFX0NBUFRJT046Ci0gICAgICAgIHJldHVy
biBCTE9DSzsKLSAgICBjYXNlIE5PTkU6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgICAgICByZXR1cm4gTk9ORTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgcmV0dXJuIEJMT0NLOwotfQotCi0vLyBDU1MgcmVxdWlyZXMgdGV4dC1kZWNvcmF0aW9uIHRv
IGJlIHJlc2V0IGF0IGVhY2ggRE9NIGVsZW1lbnQgZm9yIHRhYmxlcywgCi0vLyBpbmxpbmUgYmxv
Y2tzLCBpbmxpbmUgdGFibGVzLCBydW4taW5zLCBzaGFkb3cgRE9NIGNyb3NzaW5ncywgZmxvYXRp
bmcgZWxlbWVudHMsCi0vLyBhbmQgYWJzb2x1dGUgb3IgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVs
ZW1lbnRzLgotc3RhdGljIGJvb2wgZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihSZW5kZXJT
dHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpCi17Ci0gICAgcmV0dXJuIHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBSVU5fSU4KLSAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVf
QkxPQ0sgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9YIHx8IGlzQXRTaGFkb3dCb3Vu
ZGFyeShlKQotICAgICAgICB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8IHN0eWxlLT5oYXNPdXRP
ZkZsb3dQb3NpdGlvbigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0Rpc3BsYXlGbGV4aWJsZUJveChF
RGlzcGxheSBkaXNwbGF5KQotewotICAgIHJldHVybiBkaXNwbGF5ID09IEZMRVggfHwgZGlzcGxh
eSA9PSBJTkxJTkVfRkxFWDsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGp1c3RSZW5kZXJT
dHlsZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVu
dCAqZSkKLXsKLSAgICBBU1NFUlQocGFyZW50U3R5bGUpOwotCi0gICAgLy8gQ2FjaGUgb3VyIG9y
aWdpbmFsIGRpc3BsYXkuCi0gICAgc3R5bGUtPnNldE9yaWdpbmFsRGlzcGxheShzdHlsZS0+ZGlz
cGxheSgpKTsKLQotICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpICE9IE5PTkUpIHsKLSAgICAgICAg
Ly8gSWYgd2UgaGF2ZSBhIDx0ZD4gdGhhdCBzcGVjaWZpZXMgYSBmbG9hdCBwcm9wZXJ0eSwgaW4g
cXVpcmtzIG1vZGUgd2UganVzdCBkcm9wIHRoZSBmbG9hdAotICAgICAgICAvLyBwcm9wZXJ0eS4K
LSAgICAgICAgLy8gU2l0ZXMgYWxzbyBjb21tb25seSB1c2UgZGlzcGxheTppbmxpbmUvYmxvY2sg
b24gPHRkPnMgYW5kIDx0YWJsZT5zLiBJbiBxdWlya3MgbW9kZSB3ZSBmb3JjZQotICAgICAgICAv
LyB0aGVzZSB0YWdzIHRvIHJldGFpbiB0aGVpciBkaXNwbGF5IHR5cGVzLgotICAgICAgICBpZiAo
ZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkgJiYgZSkgewotICAgICAgICAgICAgaWYgKGUtPmhh
c1RhZ05hbWUodGRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFC
TEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOwot
ICAgICAgICAgICAgfSBlbHNlIGlmIChlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKLSAgICAgICAg
ICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShzdHlsZS0+aXNEaXNwbGF5SW5saW5lVHlwZSgpID8g
SU5MSU5FX1RBQkxFIDogVEFCTEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGUgJiYgKGUt
Pmhhc1RhZ05hbWUodGRUYWcpIHx8IGUtPmhhc1RhZ05hbWUodGhUYWcpKSkgewotICAgICAgICAg
ICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gS0hUTUxfTk9XUkFQKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBhcmUgcmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYgd2Ug
c2hvdWxkIGp1c3QKLSAgICAgICAgICAgICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQuIElmIHRo
ZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBmaXhlZCwgdGhlbgotICAgICAgICAgICAgICAgIC8vIHdl
IGRvbid0IGFjdHVhbGx5IHVzZSBOT1dSQVAuCi0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLT53
aWR0aCgpLmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3Bh
Y2UoTk9STUFMKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0
eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JBUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQot
ICAgICAgICAvLyBUYWJsZXMgbmV2ZXIgc3VwcG9ydCB0aGUgLXdlYmtpdC0qIHZhbHVlcyBmb3Ig
dGV4dC1hbGlnbiBhbmQgd2lsbCByZXNldCBiYWNrIHRvIHRoZSBkZWZhdWx0LgotICAgICAgICBp
ZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSAmJiAoc3R5bGUtPnRleHRBbGlnbigpID09
IFdFQktJVF9MRUZUIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfQ0VOVEVSIHx8IHN0
eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKQotICAgICAgICAgICAgc3R5bGUtPnNl
dFRleHRBbGlnbihUQVNUQVJUKTsKLQotICAgICAgICAvLyBGcmFtZXMgYW5kIGZyYW1lc2V0cyBu
ZXZlciBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlvbjphYnNvbHV0ZS4gVGhpcyBp
cyBuZWNlc3NhcnkgdG8KLSAgICAgICAgLy8gZml4IGEgY3Jhc2ggd2hlcmUgYSBzaXRlIHRyaWVz
IHRvIHBvc2l0aW9uIHRoZXNlIG9iamVjdHMuIFRoZXkgYWxzbyBuZXZlciBob25vciBkaXNwbGF5
LgotICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZS0+aGFzVGFn
TmFtZShmcmFtZXNldFRhZykpKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3Rh
dGljUG9zaXRpb24pOwotICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAg
ICAgICB9Ci0KLSAgICAgICAgLy8gUnVieSB0ZXh0IGRvZXMgbm90IHN1cHBvcnQgZmxvYXQgb3Ig
cG9zaXRpb24uIFRoaXMgbWlnaHQgY2hhbmdlIHdpdGggZXZvbHV0aW9uIG9mIHRoZSBzcGVjaWZp
Y2F0aW9uLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHJ0VGFnKSkgewotICAgICAg
ICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0
eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZJWE1F
OiBXZSBzaG91bGRuJ3QgYmUgb3ZlcnJpZGluZyBzdGFydC8td2Via2l0LWF1dG8gbGlrZSB0aGlz
LiBEbyBpdCBpbiBodG1sLmNzcyBpbnN0ZWFkLgotICAgICAgICAvLyBUYWJsZSBoZWFkZXJzIHdp
dGggYSB0ZXh0LWFsaWduIG9mIC13ZWJraXQtYXV0byB3aWxsIGNoYW5nZSB0aGUgdGV4dC1hbGln
biB0byBjZW50ZXIuCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGhUYWcpICYmIHN0
eWxlLT50ZXh0QWxpZ24oKSA9PSBUQVNUQVJUKQotICAgICAgICAgICAgc3R5bGUtPnNldFRleHRB
bGlnbihDRU5URVIpOwotCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUobGVnZW5kVGFn
KSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgICAgICAvLyBB
YnNvbHV0ZS9maXhlZCBwb3NpdGlvbmVkIGVsZW1lbnRzLCBmbG9hdGluZyBlbGVtZW50cyBhbmQg
dGhlIGRvY3VtZW50IGVsZW1lbnQgbmVlZCBibG9jay1saWtlIG91dHNpZGUgZGlzcGxheS4KLSAg
ICAgICAgaWYgKHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpIHx8IHN0eWxlLT5pc0Zsb2F0
aW5nKCkgfHwgKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkpCi0g
ICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxl
LT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01v
ZGUoKSkpOwotCi0gICAgICAgIC8vIEZJWE1FOiBEb24ndCBzdXBwb3J0IHRoaXMgbXV0YXRpb24g
Zm9yIHBzZXVkbyBzdHlsZXMgbGlrZSBmaXJzdC1sZXR0ZXIgb3IgZmlyc3QtbGluZSwgc2luY2Ug
aXQncyBub3QgY29tcGxldGVseQotICAgICAgICAvLyBjbGVhciBob3cgdGhhdCBzaG91bGQgd29y
ay4KLSAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0eWxlLT5zdHls
ZVR5cGUoKSA9PSBOT1BTRVVETyAmJiBzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBwYXJlbnRTdHls
ZS0+d3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9C
TE9DSyk7Ci0KLSAgICAgICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyB0aGUgZGlzcGxheSBtdXRhdGlv
biwgY2hlY2sgdGFibGUgcm93cy4gV2UgZG8gbm90IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9y
IHBvc2l0aW9uOnN0aWNreSBvbgotICAgICAgICAvLyB0YWJsZSByb3dzIG9yIGNlbGxzLiBUaGlz
IGhhcyBiZWVuIGVzdGFibGlzaGVkIGZvciBwb3NpdGlvbjpyZWxhdGl2ZSBpbiBDU1MyLjEgKGFu
ZCBjYXVzZWQgYSBjcmFzaCBpbiBjb250YWluaW5nQmxvY2soKQotICAgICAgICAvLyBvbiBzb21l
IHNpdGVzKS4KLSAgICAgICAgaWYgKChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9H
Uk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAotICAgICAgICAgICAg
fHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9ST1cpCi0gICAgICAgICAgICAmJiBzdHlsZS0+aGFzSW5GbG93UG9zaXRp
b24oKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0K
LSAgICAgICAgLy8gd3JpdGluZy1tb2RlIGRvZXMgbm90IGFwcGx5IHRvIHRhYmxlIHJvdyBncm91
cHMsIHRhYmxlIGNvbHVtbiBncm91cHMsIHRhYmxlIHJvd3MsIGFuZCB0YWJsZSBjb2x1bW5zLgot
ICAgICAgICAvLyBGSVhNRTogVGFibGUgY2VsbHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgcGVy
cGVuZGljdWxhciBvciBmbGlwcGVkIHdpdGggcmVzcGVjdCB0byB0aGUgdGFibGUsIHRob3VnaC4K
LSAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OIHx8IHN0eWxlLT5k
aXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfRk9PVEVSX0dST1VQCi0gICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxF
X0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVyB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9DRUxMKQotICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKHBh
cmVudFN0eWxlLT53cml0aW5nTW9kZSgpKTsKLQotICAgICAgICAvLyBGSVhNRTogU2luY2Ugd2Ug
ZG9uJ3Qgc3VwcG9ydCBibG9jay1mbG93IG9uIGZsZXhpYmxlIGJveGVzIHlldCwgZGlzYWxsb3cg
c2V0dGluZwotICAgICAgICAvLyBvZiBibG9jay1mbG93IHRvIGFueXRoaW5nIG90aGVyIHRoYW4g
VG9wVG9Cb3R0b21Xcml0aW5nTW9kZS4KLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTQ2NDE4IC0gRmxleGlibGUgYm94IHN1cHBvcnQuCi0gICAgICAg
IGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlICYmIChz
dHlsZS0+ZGlzcGxheSgpID09IEJPWCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gp
KQotICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKFRvcFRvQm90dG9tV3JpdGluZ01v
ZGUpOwotCi0gICAgICAgIGlmIChpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlz
cGxheSgpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOwotICAg
ICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+
ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2Rl
KCkpKTsKLSAgICAgICAgfQotCi0jaWYgRU5BQkxFKERJQUxPR19FTEVNRU5UKQotICAgICAgICAv
LyBQZXIgdGhlIHNwZWMsIHBvc2l0aW9uICdzdGF0aWMnIGFuZCAncmVsYXRpdmUnIGluIHRoZSB0
b3AgbGF5ZXIgY29tcHV0ZSB0byAnYWJzb2x1dGUnLgotICAgICAgICBpZiAoZSAmJiBlLT5pc0lu
VG9wTGF5ZXIoKSAmJiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gfHwgc3R5
bGUtPnBvc2l0aW9uKCkgPT0gUmVsYXRpdmVQb3NpdGlvbikpIHsKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRQb3NpdGlvbihBYnNvbHV0ZVBvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRE
aXNwbGF5KEJMT0NLKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgLy8gTWFrZSBz
dXJlIG91ciB6LWluZGV4IHZhbHVlIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgb2JqZWN0IGlzIHBv
c2l0aW9uZWQuCi0gICAgaWYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uICYm
ICFpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkKLSAgICAgICAg
c3R5bGUtPnNldEhhc0F1dG9aSW5kZXgoKTsKLQotICAgIC8vIEF1dG8gei1pbmRleCBiZWNvbWVz
IDAgZm9yIHRoZSByb290IGVsZW1lbnQgYW5kIHRyYW5zcGFyZW50IG9iamVjdHMuIFRoaXMgcHJl
dmVudHMKLSAgICAvLyBjYXNlcyB3aGVyZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGJsZW5kZWQg
YXMgYSBzaW5nbGUgdW5pdCBlbmQgdXAgd2l0aCBhIG5vbi10cmFuc3BhcmVudAotICAgIC8vIG9i
amVjdCB3ZWRnZWQgaW4gYmV0d2VlbiB0aGVtLiBBdXRvIHotaW5kZXggYWxzbyBiZWNvbWVzIDAg
Zm9yIG9iamVjdHMgdGhhdCBzcGVjaWZ5IHRyYW5zZm9ybXMvbWFza3MvcmVmbGVjdGlvbnMuCi0g
ICAgaWYgKHN0eWxlLT5oYXNBdXRvWkluZGV4KCkgJiYgKChlICYmIGUtPmRvY3VtZW50KCktPmRv
Y3VtZW50RWxlbWVudCgpID09IGUpCi0gICAgICAgIHx8IHN0eWxlLT5vcGFjaXR5KCkgPCAxLjBm
Ci0gICAgICAgIHx8IHN0eWxlLT5oYXNUcmFuc2Zvcm1SZWxhdGVkUHJvcGVydHkoKQotICAgICAg
ICB8fCBzdHlsZS0+aGFzTWFzaygpCi0gICAgICAgIHx8IHN0eWxlLT5jbGlwUGF0aCgpCi0gICAg
ICAgIHx8IHN0eWxlLT5ib3hSZWZsZWN0KCkKLSAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigp
Ci0gICAgICAgIHx8IHN0eWxlLT5oYXNCbGVuZE1vZGUoKQotICAgICAgICB8fCBzdHlsZS0+cG9z
aXRpb24oKSA9PSBTdGlja3lQb3NpdGlvbgotICAgICAgICB8fCAoc3R5bGUtPnBvc2l0aW9uKCkg
PT0gRml4ZWRQb3NpdGlvbiAmJiBlICYmIGUtPmRvY3VtZW50KCktPnBhZ2UoKSAmJiBlLT5kb2N1
bWVudCgpLT5wYWdlKCktPnNldHRpbmdzKCktPmZpeGVkUG9zaXRpb25DcmVhdGVzU3RhY2tpbmdD
b250ZXh0KCkpCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykKLSAg
ICAgICAgLy8gVG91Y2ggb3ZlcmZsb3cgc2Nyb2xsaW5nIGNyZWF0ZXMgYSBzdGFja2luZyBjb250
ZXh0LgotICAgICAgICB8fCAoKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOIHx8IHN0eWxl
LT5vdmVyZmxvd1koKSAhPSBPSElEREVOKSAmJiBzdHlsZS0+dXNlVG91Y2hPdmVyZmxvd1Njcm9s
bGluZygpKQotI2VuZGlmCi0jaWYgRU5BQkxFKERJQUxPR19FTEVNRU5UKQotICAgICAgICB8fCAo
ZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSkKLSNlbmRpZgotICAgICAgICApKQotICAgICAgICBzdHls
ZS0+c2V0WkluZGV4KDApOwotCi0gICAgLy8gVGV4dGFyZWEgY29uc2lkZXJzIG92ZXJmbG93IHZp
c2libGUgYXMgYXV0by4KLSAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRleHRhcmVhVGFnKSkg
ewotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklT
SUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WCgpKTsKLSAgICAgICAgc3R5bGUtPnNldE92
ZXJmbG93WShzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5v
dmVyZmxvd1koKSk7Ci0gICAgfQotCi0gICAgaWYgKGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRp
b24oc3R5bGUsIGUpKQotICAgICAgICBzdHlsZS0+c2V0VGV4dERlY29yYXRpb25zSW5FZmZlY3Qo
c3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOwotICAgIGVsc2UKLSAgICAgICAgc3R5bGUtPmFkZFRv
VGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOwotCi0gICAg
Ly8gSWYgZWl0aGVyIG92ZXJmbG93IHZhbHVlIGlzIG5vdCB2aXNpYmxlLCBjaGFuZ2UgdG8gYXV0
by4KLSAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVy
Zmxvd1koKSAhPSBPTUFSUVVFRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPTUFSUVVF
RSk7Ci0gICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9NQVJRVUVFICYmIHN0eWxl
LT5vdmVyZmxvd1goKSAhPSBPTUFSUVVFRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChP
TUFSUVVFRSk7Ci0gICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFICYm
IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRSkgewotICAgICAgICAvLyBGSVhNRTogT25j
ZSB3ZSBpbXBsZW1lbnQgcGFnaW5hdGlvbiBjb250cm9scywgb3ZlcmZsb3cteCBzaG91bGQgZGVm
YXVsdCB0byBoaWRkZW4KLSAgICAgICAgLy8gaWYgb3ZlcmZsb3cteSBpcyBzZXQgdG8gLXdlYmtp
dC1wYWdlZC14IG9yIC13ZWJraXQtcGFnZS15LiBGb3Igbm93LCB3ZSdsbCBsZXQgaXQKLSAgICAg
ICAgLy8gZGVmYXVsdCB0byBhdXRvIHNvIHdlIGNhbiBhdCBsZWFzdCBzY3JvbGwgdGhyb3VnaCB0
aGUgcGFnZXMuCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT0FVVE8pOwotICAgIH0gZWxz
ZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1go
KSAhPSBPVklTSUJMRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPQVVUTyk7Ci0KLSAg
ICAvLyBDYWxsIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKCkgaWYgYSBwYWdpbmF0aW9uIG1v
ZGUgaXMgc2V0IGZvciBhbnkgbm9uLXJvb3QgZWxlbWVudHMuIElmIHRoZXNlCi0gICAgLy8gc3R5
bGVzIGFyZSBzcGVjaWZpZWQgb24gYSByb290IGVsZW1lbnQsIHRoZW4gdGhleSB3aWxsIGJlIGlu
Y29ycG9yYXRlZCBpbgotICAgIC8vIFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoKS4K
LSAgICBpZiAoKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURYIHx8IHN0eWxlLT5vdmVyZmxv
d1koKSA9PSBPUEFHRURZKSAmJiAhKGUgJiYgKGUtPmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgZS0+
aGFzVGFnTmFtZShib2R5VGFnKSkpKQotICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9k
ZShXZWJDb3JlOjpwYWdpbmF0aW9uTW9kZUZvclJlbmRlclN0eWxlKHN0eWxlKSwgc3R5bGUpOwot
Ci0gICAgLy8gVGFibGUgcm93cywgc2VjdGlvbnMgYW5kIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBz
dXBwb3J0IG92ZXJmbG93OmhpZGRlbiBhbmQgd2lsbCBpZ25vcmUgc2Nyb2xsL2F1dG8uCi0gICAg
Ly8gRklYTUU6IEV2ZW50dWFsbHkgdGFibGUgc2VjdGlvbnMgd2lsbCBzdXBwb3J0IGF1dG8gYW5k
IHNjcm9sbC4KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlz
cGxheSgpID09IElOTElORV9UQUJMRQotICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPV19HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVykgewotICAgICAg
ICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1go
KSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7
Ci0gICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92
ZXJmbG93WSgpICE9IE9ISURERU4pCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9W
SVNJQkxFKTsKLSAgICB9Ci0KLSAgICAvLyBNZW51bGlzdHMgc2hvdWxkIGhhdmUgdmlzaWJsZSBv
dmVyZmxvdwotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkgewot
ICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKLSAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WShPVklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8gQ3VsbCBvdXQgYW55IHVzZWxl
c3MgbGF5ZXJzIGFuZCBhbHNvIHJlcGVhdCBwYXR0ZXJucyBpbnRvIGFkZGl0aW9uYWwgbGF5ZXJz
LgotICAgIHN0eWxlLT5hZGp1c3RCYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgc3R5bGUtPmFkanVz
dE1hc2tMYXllcnMoKTsKLQotICAgIC8vIERvIHRoZSBzYW1lIGZvciBhbmltYXRpb25zIGFuZCB0
cmFuc2l0aW9ucy4KLSAgICBzdHlsZS0+YWRqdXN0QW5pbWF0aW9ucygpOwotICAgIHN0eWxlLT5h
ZGp1c3RUcmFuc2l0aW9ucygpOwotCi0gICAgLy8gSW1wb3J0YW50OiBJbnRyaW5zaWMgbWFyZ2lu
cyBnZXQgYWRkZWQgdG8gY29udHJvbHMgYmVmb3JlIHRoZSB0aGVtZSBoYXMgYWRqdXN0ZWQgdGhl
IHN0eWxlLCBzaW5jZSB0aGUgdGhlbWUgd2lsbAotICAgIC8vIGFsdGVyIGZvbnRzIGFuZCBoZWln
aHRzL3dpZHRocy4KLSAgICBpZiAoZSAmJiBlLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpICYmIHN0
eWxlLT5mb250U2l6ZSgpID49IDExKSB7Ci0gICAgICAgIC8vIERvbid0IGFwcGx5IGludHJpbnNp
YyBtYXJnaW5zIHRvIGltYWdlIGJ1dHRvbnMuIFRoZSBkZXNpZ25lciBrbm93cyBob3cgYmlnIHRo
ZSBpbWFnZXMgYXJlLAotICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHRyZWF0IGFsbCBpbWFnZSBi
dXR0b25zIGFzIHRob3VnaCB0aGV5IHdlcmUgZXhwbGljaXRseSBzaXplZC4KLSAgICAgICAgaWYg
KCFlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSB8fCAhc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVu
dCo+KGUpLT5pc0ltYWdlQnV0dG9uKCkpCi0gICAgICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5z
KHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvLyBMZXQgdGhlIHRoZW1lIGFsc28gaGF2ZSBhIGNyYWNr
IGF0IGFkanVzdGluZyB0aGUgc3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkp
Ci0gICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWRqdXN0U3R5bGUodGhpcywg
c3R5bGUsIGUsIG1fc3RhdGUuaGFzVUFBcHBlYXJhbmNlKCksIG1fc3RhdGUuYm9yZGVyRGF0YSgp
LCBtX3N0YXRlLmJhY2tncm91bmREYXRhKCksIG1fc3RhdGUuYmFja2dyb3VuZENvbG9yKCkpOwot
Ci0gICAgLy8gSWYgd2UgaGF2ZSBmaXJzdC1sZXR0ZXIgcHNldWRvIHN0eWxlLCBkbyBub3Qgc2hh
cmUgdGhpcyBzdHlsZS4KLSAgICBpZiAoc3R5bGUtPmhhc1BzZXVkb1N0eWxlKEZJUlNUX0xFVFRF
UikpCi0gICAgICAgIHN0eWxlLT5zZXRVbmlxdWUoKTsKLQotICAgIC8vIEZJWE1FOiB3aGVuIGRy
b3BwaW5nIHRoZSAtd2Via2l0IHByZWZpeCBvbiB0cmFuc2Zvcm0tc3R5bGUsIHdlIHNob3VsZCBh
bHNvIGhhdmUgb3BhY2l0eSA8IDEgY2F1c2UgZmxhdHRlbmluZy4KLSAgICBpZiAoc3R5bGUtPnBy
ZXNlcnZlczNEKCkgJiYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRQotICAgICAgICB8
fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUKLSAgICAgICAgfHwgc3R5bGUtPmhhc0Zp
bHRlcigpKSkKLSAgICAgICAgc3R5bGUtPnNldFRyYW5zZm9ybVN0eWxlM0QoVHJhbnNmb3JtU3R5
bGUzREZsYXQpOwotCi0gICAgLy8gU2VhbWxlc3MgaWZyYW1lcyBiZWhhdmUgbGlrZSBibG9ja3Mu
IE1hcCB0aGVpciBkaXNwbGF5IHRvIGlubGluZS1ibG9jayB3aGVuIG1hcmtlZCBpbmxpbmUuCi0g
ICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpICYmIHN0eWxlLT5kaXNwbGF5KCkg
PT0gSU5MSU5FICYmIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4oZSktPnNob3VsZERp
c3BsYXlTZWFtbGVzc2x5KCkpCi0gICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9D
Syk7Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChlICYmIGUtPmlzU1ZHRWxlbWVudCgpKSB7
Ci0gICAgICAgIC8vIFNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwj
T3ZlcmZsb3dQcm9wZXJ0eQotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9TQ1JP
TEwpCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9ISURERU4pOwotICAgICAgICBl
bHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT0FVVE8pCi0gICAgICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKLQotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgp
ID09IE9TQ1JPTEwpCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOwot
ICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT0FVVE8pCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKLQotICAgICAgICAvLyBPbmx5IHRoZSBy
b290IDxzdmc+IGVsZW1lbnQgaW4gYW4gU1ZHIGRvY3VtZW50IGZyYWdtZW50IHRyZWUgaG9ub3Jz
IGNzcyBwb3NpdGlvbgotICAgICAgICBpZiAoIShlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdU
YWcpICYmIGUtPnBhcmVudE5vZGUoKSAmJiAhZS0+cGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQo
KSkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oUmVuZGVyU3R5bGU6OmluaXRpYWxQ
b3NpdGlvbigpKTsKLQotICAgICAgICAvLyBSZW5kZXJTVkdSb290IGhhbmRsZXMgem9vbWluZyBm
b3IgdGhlIHdob2xlIFNWRyBzdWJ0cmVlLCBzbyBmb3JlaWduT2JqZWN0IGNvbnRlbnQgc2hvdWxk
Ci0gICAgICAgIC8vIG5vdCBiZSBzY2FsZWQgYWdhaW4uCi0gICAgICAgIGlmIChlLT5oYXNUYWdO
YW1lKFNWR05hbWVzOjpmb3JlaWduT2JqZWN0VGFnKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRF
ZmZlY3RpdmVab29tKFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgpKTsKLSAgICB9Ci0jZW5kaWYK
LX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lv
bkVsZW1lbnQpCi17Ci0gICAgLy8gRklYTUUgKEJVRyA3MjQ3Mik6IFdlIGRvbid0IGFkZCBALXdl
YmtpdC1yZWdpb24gcnVsZXMgb2Ygc2NvcGVkIHN0eWxlIHNoZWV0cyBmb3IgdGhlIG1vbWVudCwK
LSAgICAvLyBzbyBhbGwgcmVnaW9uIHJ1bGVzIGFyZSBnbG9iYWwgYnkgZGVmYXVsdC4gVmVyaWZ5
IHdoZXRoZXIgdGhhdCBjYW4gc3RhbmQgb3IgbmVlZHMgY2hhbmdpbmcuCi0KLSAgICB1bnNpZ25l
ZCBydWxlc1NpemUgPSBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1Np
emU7ICsraSkgewotICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3Jl
Z2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOwotICAgICAgICBp
ZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1fcnVsZVNldHMudXNlclN0
eWxlKCkpIHsKLSAgICAgICAgcnVsZXNTaXplID0gbV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgewotICAgICAgICAgICAgQVNTRVJUKG1fcnVsZVNl
dHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNl
dC5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9y
LCByZWdpb25FbGVtZW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tGb3JP
cmllbnRhdGlvbkNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgRm9udE9yaWVudGF0
aW9uIGZvbnRPcmllbnRhdGlvbjsKLSAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3Jp
ZW50YXRpb247Ci0gICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oc3R5bGUsIGZvbnRPcmll
bnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24m
IGZvbnREZXNjcmlwdGlvbiA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICBpZiAoZm9u
dERlc2NyaXB0aW9uLm9yaWVudGF0aW9uKCkgPT0gZm9udE9yaWVudGF0aW9uICYmIGZvbnREZXNj
cmlwdGlvbi5ub25DSktHbHlwaE9yaWVudGF0aW9uKCkgPT0gZ2x5cGhPcmllbnRhdGlvbikKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihm
b250RGVzY3JpcHRpb24pOwotICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9y
aWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOwotICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRP
cmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjp1cGRhdGVG
b250KCkKLXsKLSAgICBpZiAoIW1fc3RhdGUuZm9udERpcnR5KCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fc3RhdGUuc3R5bGUoKTsKLSAgICBjaGVja0Zv
ckdlbmVyaWNGYW1pbHlDaGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50U3R5bGUoKSk7Ci0gICAg
Y2hlY2tGb3Jab29tQ2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotICAgIGNo
ZWNrRm9yT3JpZW50YXRpb25DaGFuZ2Uoc3R5bGUpOwotICAgIHN0eWxlLT5mb250KCkudXBkYXRl
KG1fZm9udFNlbGVjdG9yKTsKLSAgICBtX3N0YXRlLnNldEZvbnREaXJ0eShmYWxzZSk7Ci19Ci0K
LVBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlUnVsZXNGb3JFbGVt
ZW50KEVsZW1lbnQqIGUsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlKQotewotICAgIHJldHVybiBw
c2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChlLCBOT1BTRVVETywgcnVsZXNUb0luY2x1ZGUpOwot
fQotCi1QYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZVJ1
bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCBQc2V1ZG9JZCBwc2V1ZG9JZCwgdW5zaWduZWQgcnVs
ZXNUb0luY2x1ZGUpCi17Ci0gICAgaWYgKCFlIHx8ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVz
aGVldHNMb2FkZWQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBtX3N0YXRlLnNldE1vZGUo
U2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOwotCi0gICAgaW5pdEVsZW1lbnQoZSk7
Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVk
b0lkKTsKLQotICAgIE1hdGNoUmVzdWx0IGR1bW15OwotICAgIGlmIChydWxlc1RvSW5jbHVkZSAm
IFVBQW5kVXNlckNTU1J1bGVzKSB7Ci0gICAgICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZy
b20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgICAgIG1hdGNoVUFSdWxlcyhkdW1teSk7Ci0K
LSAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1
bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwotICAgIH0KLQotICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNUb0luY2x1ZGUgJiBBdXRob3JDU1NS
dWxlcykpIHsKLSAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNs
dWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBydWxl
cyBpbiBhdXRob3Igc2hlZXRzLgotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxl
c1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgICAgIG1fc3RhdGUuc2V0U2FtZU9y
aWdpbk9ubHkoZmFsc2UpOwotICAgIH0KLQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNo
ZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLQotICAgIHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlz
dCgpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBS
dWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYg
ZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZp
b3JBdEJvdW5kYXJ5KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAo
cnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25v
dyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAg
ICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURP
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmlj
aWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNl
IHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KLSAgICAgICAgLy8gVGhpcyBpcyBsaW1p
dGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2Uu
Ci0gICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJh
c2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0g
ICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNlbGVjdG9yKCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bGVEYXRhLnNl
bGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2Vy
Ojp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5h
bWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tl
ckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0
YXRlLmVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0
Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsK
LSAgICB9Ci0KLSAgICAvLyBTbG93IHBhdGguCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9y
Q2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6
U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0
ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7Ci0gICAg
Y29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwotICAgIGNvbnRleHQuc2NvcGUg
PSBzY29wZTsKLSAgICBjb250ZXh0LnBzZXVkb0lkID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkucHNldWRvSWQ7Ci0gICAgY29udGV4dC5zY3JvbGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJl
cXVlc3QoKS5zY3JvbGxiYXI7Ci0gICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNl
dWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBjb250ZXh0LmJlaGF2aW9yQXRC
b3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNo
IG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERP
TVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKLSAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JD
aGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAo
c3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUu
cHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6
OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBF
bGVtZW50KiByZWdpb25FbGVtZW50KQotewotICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJl
Z2lvbkVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFNlbGVjdG9yQ2hlY2tl
ciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5tb2RlKCkpOwotICAgIGZvciAo
Y29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9y
TGlzdDo6bmV4dChzKSkgewotICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tp
bmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVj
dG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwotICAgICAgICBQc2V1ZG9JZCBpZ25v
cmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIu
bWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNp
YmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0
Y2hlcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhpcyBpcyBtb3N0
bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBhcHBseSBhIGNlcnRhaW4gcnVsZSB0byB0aGUgcmVu
ZGVyc3R5bGUuLi4KLQotTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0ludExlbmd0aChD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCi17Ci0gICAgcmV0dXJuIHBy
aW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVn
ZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8
IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0eWxl
LCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Ci19Ci0KLUxlbmd0
aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHls
ZSwgZG91YmxlIG11bHRpcGxpZXIpCi17Ci0gICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJp
bWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEZsb2F0Q29udmVyc2lvbiB8IFBlcmNl
bnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24g
fCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBs
aWVyKSA6IExlbmd0aChVbmRlZmluZWQpOwotfQotCi10ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6
U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9w
ZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVs
ZSwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlz
dFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQotewotICAgIEFTU0VSVCgocHJvcGVydHlXaGl0
ZWxpc3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uKSB8fCBtX3N0YXRlLnJlZ2lvbkZv
clN0eWxpbmcoKSk7Ci0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nlc3NSdWxlKGRvY3VtZW50KCksIHJ1
bGUsIHRoaXMpOwotCi0gICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHByb3BlcnRpZXMtPnBy
b3BlcnR5Q291bnQoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3Vu
dDsgKytpKSB7Ci0gICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIGN1
cnJlbnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUF0KGkpOwotICAgICAgICBpZiAoaXNJbXBvcnRh
bnQgIT0gY3VycmVudC5pc0ltcG9ydGFudCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIGlmIChpbmhlcml0ZWRPbmx5ICYmICFjdXJyZW50LmlzSW5oZXJpdGVkKCkpIHsKLSAgICAg
ICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBleHBsaWNpdGx5IGluaGVyaXRlZCwg
d2UgbmVlZCB0byBhcHBseSBmdXJ0aGVyIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcwotICAgICAg
ICAgICAgLy8gYXMgdGhleSBtaWdodCBvdmVycmlkZSB0aGUgdmFsdWUgaW5oZXJpdGVkIGhlcmUu
IEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBhbGxvdyBkZWNsYXJhdGlvbnMgd2l0aAotICAgICAg
ICAgICAgLy8gZXhwbGljaXRseSBpbmhlcml0ZWQgcHJvcGVydGllcyB0byBiZSBjYWNoZWQuCi0g
ICAgICAgICAgICBBU1NFUlQoIWN1cnJlbnQudmFsdWUoKS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENTU1Byb3BlcnR5SUQg
cHJvcGVydHkgPSBjdXJyZW50LmlkKCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5V2hpdGVsaXN0
VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbiAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxp
ZFJlZ2lvblN0eWxlUHJvcGVydHkocHJvcGVydHkpKQotICAgICAgICAgICAgY29udGludWU7Ci0j
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBl
ID09IFByb3BlcnR5V2hpdGVsaXN0Q3VlICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5
bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSNlbmRpZgotICAg
ICAgICBzd2l0Y2ggKHBhc3MpIHsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAgICAg
Y2FzZSBWYXJpYWJsZURlZmluaXRpb25zOgotICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NT
UHJvcGVydHlWYXJpYWJsZSA8IGZpcnN0Q1NTUHJvcGVydHksIENTU192YXJpYWJsZV9pc19iZWZv
cmVfZmlyc3RfcHJvcGVydHkpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IENTU1Byb3Bl
cnR5VmFyaWFibGUpCi0gICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCks
IGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBj
YXNlIEhpZ2hQcmlvcml0eVByb3BlcnRpZXM6Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChm
aXJzdENTU1Byb3BlcnR5ID09IENTU1Byb3BlcnR5Q29sb3IsIENTU19jb2xvcl9pc19maXJzdF9w
cm9wZXJ0eSk7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVpvb20gPT0g
Q1NTUHJvcGVydHlDb2xvciArIDE3LCBDU1Nfem9vbV9pc19lbmRfb2ZfZmlyc3RfcHJvcF9yYW5n
ZSk7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eUxpbmVIZWlnaHQgPT0g
Q1NTUHJvcGVydHlab29tICsgMSwgQ1NTX2xpbmVfaGVpZ2h0X2lzX2FmdGVyX3pvb20pOwotI2lm
IEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IENTU1By
b3BlcnR5VmFyaWFibGUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0jZW5kaWYKLSAgICAg
ICAgICAgIC8vIGdpdmUgc3BlY2lhbCBwcmlvcml0eSB0byBmb250LXh4eCwgY29sb3IgcHJvcGVy
dGllcywgZXRjCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgPCBDU1NQcm9wZXJ0eUxpbmVIZWln
aHQpCi0gICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQu
dmFsdWUoKSk7Ci0gICAgICAgICAgICAvLyB3ZSBhcHBseSBsaW5lLWhlaWdodCBsYXRlcgotICAg
ICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQotICAg
ICAgICAgICAgICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKGN1cnJlbnQudmFsdWUoKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMb3dQcmlvcml0eVByb3BlcnRpZXM6
Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgPiBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAg
ICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRQcm9j
ZXNzUnVsZShjb29raWUpOwotfQotCi10ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBs
aWNhdGlvblBhc3MgcGFzcz4KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVy
dGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGJvb2wgaXNJbXBvcnRhbnQsIGlu
dCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSkKLXsKLSAgICBp
ZiAoc3RhcnRJbmRleCA9PSAtMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuc3R5bGUoKS0+aW5zaWRlTGluaygpICE9IE5vdElu
c2lkZUxpbmspIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5k
ZXg7ICsraSkgewotICAgICAgICAgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQ
cm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gbWF0Y2hlZFByb3BlcnRpZXMubGlua01hdGNoVHlw
ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlciB0byBwYXNzIHRoZXNl
IGFzIGFyZ3VtZW50cyBidXQgdGhhdCByZXF1aXJlcyBjaGFuZ2VzIGluIG1hbnkgcGxhY2VzLgot
ICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGxpbmtNYXRj
aFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoTGluayk7Ci0gICAgICAgICAgICBzdGF0ZS5z
ZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3Rv
ckNoZWNrZXI6Ok1hdGNoVmlzaXRlZCk7Ci0KLSAgICAgICAgICAgIGFwcGx5UHJvcGVydGllczxw
YXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRj
aGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9w
ZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKLSAg
ICAgICAgfQotICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1
ZSk7Ci0gICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFs
c2UpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4
OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKLSAgICAgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMm
IG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07Ci0g
ICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVz
LmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0
ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0
aWVzLndoaXRlbGlzdFR5cGUpKTsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIFN0eWxlUmVzb2x2ZXI6
OmNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqIHBy
b3BlcnRpZXMsIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgCi0gICAgcmV0dXJuIFN0cmluZ0hhc2hl
cjo6aGFzaE1lbW9yeShwcm9wZXJ0aWVzLCBzaXplb2YoTWF0Y2hlZFByb3BlcnRpZXMpICogc2l6
ZSk7Ci19Ci0KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdl
cyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCi17Ci0gICAgcmV0dXJu
IGEuZmlyc3RVQVJ1bGUgPT0gYi5maXJzdFVBUnVsZQotICAgICAgICAmJiBhLmxhc3RVQVJ1bGUg
PT0gYi5sYXN0VUFSdWxlCi0gICAgICAgICYmIGEuZmlyc3RBdXRob3JSdWxlID09IGIuZmlyc3RB
dXRob3JSdWxlCi0gICAgICAgICYmIGEubGFzdEF1dGhvclJ1bGUgPT0gYi5sYXN0QXV0aG9yUnVs
ZQotICAgICAgICAmJiBhLmZpcnN0VXNlclJ1bGUgPT0gYi5maXJzdFVzZXJSdWxlCi0gICAgICAg
ICYmIGEubGFzdFVzZXJSdWxlID09IGIubGFzdFVzZXJSdWxlOwotfQotCi1ib29sIG9wZXJhdG9y
IT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoUmFuZ2VzJiBiKQotewotICAgIHJldHVybiAhKGEgPT0gYik7Ci19Ci0KLWJvb2wg
b3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29u
c3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGIpCi17Ci0gICAgcmV0dXJuIGEu
cHJvcGVydGllcyA9PSBiLnByb3BlcnRpZXMgJiYgYS5saW5rTWF0Y2hUeXBlID09IGIubGlua01h
dGNoVHlwZTsKLX0KLQotYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNo
ZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYg
YikKLXsKLSAgICByZXR1cm4gIShhID09IGIpOwotfQotCi1jb25zdCBTdHlsZVJlc29sdmVyOjpN
YXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogU3R5bGVSZXNvbHZlcjo6ZmluZEZyb21NYXRjaGVk
UHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJl
c3VsdCkKLXsKLSAgICBBU1NFUlQoaGFzaCk7Ci0KLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hl
OjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5maW5kKGhhc2gpOwotICAg
IGlmIChpdCA9PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtJiBjYWNoZUl0ZW0gPSBpdC0+dmFs
dWU7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKTsKLSAgICBpZiAoc2l6ZSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsr
aSkgewotICAgICAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV0gIT0gY2Fj
aGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzW2ldKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotICAgIGlmIChjYWNoZUl0ZW0ucmFuZ2VzICE9IG1hdGNoUmVzdWx0LnJhbmdlcykKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuICZjYWNoZUl0ZW07Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiBzdHls
ZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBN
YXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1h
dGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3ZWVwcyA9IDEwMDsKLSAgICBp
ZiAoKyttX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCA+PSBt
YXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5Td2VlcHMKLSAgICAgICAgJiYg
IW1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIuaXNBY3RpdmUoKSkgewotICAgICAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJ
blNlY29uZHMgPSA2MDsKLSAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ci5zdGFydE9uZVNob3QobWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMp
OwotICAgIH0KLQotICAgIEFTU0VSVChoYXNoKTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hl
SXRlbSBjYWNoZUl0ZW07Ci0gICAgY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzLmFwcGVuZCht
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcyk7Ci0gICAgY2FjaGVJdGVtLnJhbmdlcyA9IG1h
dGNoUmVzdWx0LnJhbmdlczsKLSAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FjaGUgdGhlIG9y
aWdpbmFsIFJlbmRlclN0eWxlIGluc3RhbmNlLiBJdCBtYXkgYmUgZnVydGhlciBtb2RpZmllZC4K
LSAgICAvLyBUaGUgUmVuZGVyU3R5bGUgaW4gdGhlIGNhY2hlIGlzIHJlYWxseSBqdXN0IGEgaG9s
ZGVyIGZvciB0aGUgc3Vic3RydWN0dXJlcyBhbmQgbmV2ZXIgdXNlZCBhcy1pcy4KLSAgICBjYWNo
ZUl0ZW0ucmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3R5bGUpOwotICAgIGNhY2hl
SXRlbS5wYXJlbnRSZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShwYXJlbnRTdHlsZSk7
Ci0gICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmFkZChoYXNoLCBjYWNoZUl0ZW0pOwotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OmludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCkK
LXsKLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuY2xlYXIoKTsKLX0KLQotc3RhdGljIGJv
b2wgaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgRWxlbWVudCogZWxl
bWVudCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUpCi17Ci0gICAgLy8gRklYTUU6IENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGUgbW9k
aWZpZXMgc3RhdGUgd2hlbiBhcHBseWluZyB0byBkb2N1bWVudCBlbGVtZW50LiBXZSBjYW4ndCBz
a2lwIHRoZSBhcHBseWluZyBieSBjYWNoaW5nLgotICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQt
PmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpICYmIGVsZW1lbnQtPmRvY3VtZW50KCktPndy
aXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChzdHlsZS0+dW5pcXVlKCkgfHwgKHN0eWxlLT5zdHlsZVR5cGUoKSAhPSBOT1BTRVVE
TyAmJiBwYXJlbnRTdHlsZS0+dW5pcXVlKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
ZiAoc3R5bGUtPnpvb20oKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBSZW5kZXJTdHls
ZTo6aW5pdGlhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyBU
aGUgY2FjaGUgYXNzdW1lcyBzdGF0aWMga25vd2xlZGdlIGFib3V0IHdoaWNoIHByb3BlcnRpZXMg
YXJlIGluaGVyaXRlZC4KLSAgICBpZiAocGFyZW50U3R5bGUtPmhhc0V4cGxpY2l0bHlJbmhlcml0
ZWRQcm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1h
dGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBB
U1NFUlQoZWxlbWVudCk7Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICB1bnNpZ25l
ZCBjYWNoZUhhc2ggPSBtYXRjaFJlc3VsdC5pc0NhY2hlYWJsZSA/IGNvbXB1dGVNYXRjaGVkUHJv
cGVydGllc0hhc2gobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuZGF0YSgpLCBtYXRjaFJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpIDogMDsKLSAgICBib29sIGFwcGx5SW5oZXJp
dGVkT25seSA9IGZhbHNlOwotICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBj
YWNoZUl0ZW0gPSAwOwotICAgIGlmIChjYWNoZUhhc2ggJiYgKGNhY2hlSXRlbSA9IGZpbmRGcm9t
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KSkpIHsKLSAgICAg
ICAgLy8gV2UgY2FuIGJ1aWxkIHVwIHRoZSBzdHlsZSBieSBjb3B5aW5nIG5vbi1pbmhlcml0ZWQg
cHJvcGVydGllcyBmcm9tIGFuIGVhcmxpZXIgc3R5bGUgb2JqZWN0IGJ1aWx0IHVzaW5nIHRoZSBz
YW1lIGV4YWN0Ci0gICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0aW9ucy4gV2UgdGhlbiBvbmx5IG5l
ZWQgdG8gYXBwbHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBpZiBhbnksIGFzIHRoZWlyIHZh
bHVlcyBjYW4gZGVwZW5kIG9uIHRoZSAKLSAgICAgICAgLy8gZWxlbWVudCBjb250ZXh0LiBUaGlz
IGlzIGZhc3QgYW5kIHNhdmVzIG1lbW9yeSBieSByZXVzaW5nIHRoZSBzdHlsZSBkYXRhIHN0cnVj
dHVyZXMuCi0gICAgICAgIHN0YXRlLnN0eWxlKCktPmNvcHlOb25Jbmhlcml0ZWRGcm9tKGNhY2hl
SXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOwotICAgICAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUo
KS0+aW5oZXJpdGVkRGF0YVNoYXJlZChjYWNoZUl0ZW0tPnBhcmVudFJlbmRlclN0eWxlLmdldCgp
KSAmJiAhaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBFSW5zaWRl
TGluayBsaW5rU3RhdHVzID0gc3RhdGUuc3R5bGUoKS0+aW5zaWRlTGluaygpOwotICAgICAgICAg
ICAgLy8gSWYgdGhlIGNhY2hlIGl0ZW0gcGFyZW50IHN0eWxlIGhhcyBpZGVudGljYWwgaW5oZXJp
dGVkIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgcGFyZW50IHN0eWxlIHRoZW4gdGhlCi0gICAg
ICAgICAgICAvLyByZXN1bHRpbmcgc3R5bGUgd2lsbCBiZSBpZGVudGljYWwgdG9vLiBXZSBjb3B5
IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcyBvdmVyIGZyb20gdGhlIGNhY2hlIGFuZCBhcmUgZG9u
ZS4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKGNhY2hlSXRlbS0+cmVu
ZGVyU3R5bGUuZ2V0KCkpOwotCi0gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBsaW5r
IHN0YXR1cyBpcyB0cmVhdGVkIGxpa2UgYW4gaW5oZXJpdGVkIHByb3BlcnR5LiBXZSBuZWVkIHRv
IGV4cGxpY2l0bHkgcmVzdG9yZSBpdC4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldElu
c2lkZUxpbmsobGlua1N0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAg
ICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gdHJ1ZTsgCi0gICAgfQotCi0jaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCi0gICAgLy8gRmlyc3QgYXBwbHkgYWxsIHZhcmlhYmxlIGRlZmluaXRpb25z
LCBhcyB0aGV5IG1heSBiZSB1c2VkIGR1cmluZyBhcHBsaWNhdGlvbiBvZiBsYXRlciBwcm9wZXJ0
aWVzLgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0
Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFy
aWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5m
aXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJ
bmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5p
dGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsK
LSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVz
dWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotI2VuZGlmCi0KLSAgICAvLyBO
b3cgd2UgaGF2ZSBhbGwgb2YgdGhlIG1hdGNoZWQgcnVsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIG9y
ZGVyLiBXYWxrIHRoZSBydWxlcyBhbmQgYXBwbHkKLSAgICAvLyBoaWdoLXByaW9yaXR5IHByb3Bl
cnRpZXMgZmlyc3QsIGkuZS4sIHRob3NlIHByb3BlcnRpZXMgdGhhdCBvdGhlciBwcm9wZXJ0aWVz
IGRlcGVuZCBvbi4KLSAgICAvLyBUaGUgb3JkZXIgaXMgKDEpIGhpZ2gtcHJpb3JpdHkgbm90IGlt
cG9ydGFudCwgKDIpIGhpZ2gtcHJpb3JpdHkgaW1wb3J0YW50LCAoMykgbm9ybWFsIG5vdCBpbXBv
cnRhbnQKLSAgICAvLyBhbmQgKDQpIG5vcm1hbCBpbXBvcnRhbnQuCi0gICAgc3RhdGUuc2V0TGlu
ZUhlaWdodFZhbHVlKDApOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5
UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlv
cml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmly
c3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9u
bHkpOwotCi0gICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5lZmZl
Y3RpdmVab29tKCkgIT0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKSB7Ci0gICAgICAg
IHN0YXRlLnNldEZvbnREaXJ0eSh0cnVlKTsKLSAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0g
ZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFk
IGFuZCB1cGRhdGUgaXQgbm93LgotICAgIHVwZGF0ZUZvbnQoKTsKLQotICAgIC8vIExpbmUtaGVp
Z2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4K
LSAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHko
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7Ci0KLSAgICAv
LyBNYW55IHByb3BlcnRpZXMgZGVwZW5kIG9uIHRoZSBmb250LiBJZiBpdCBjaGFuZ2VzIHdlIGp1
c3QgYXBwbHkgYWxsIHByb3BlcnRpZXMuCi0gICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0t
PnJlbmRlclN0eWxlLT5mb250RGVzY3JpcHRpb24oKSAhPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVz
Y3JpcHRpb24oKSkKLSAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0KLSAgICAv
LyBOb3cgZG8gdGhlIG5vcm1hbCBwcmlvcml0eSBVQSBwcm9wZXJ0aWVzLgotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2Us
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgCi0gICAgLy8gQ2FjaGUgb3VyIGJvcmRl
ciBhbmQgYmFja2dyb3VuZCBzbyB0aGF0IHdlIGNhbiBleGFtaW5lIHRoZW0gbGF0ZXIuCi0gICAg
c3RhdGUuY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Ci0gICAgCi0gICAgLy8gTm93IGRvIHRo
ZSBhdXRob3IgYW5kIHVzZXIgbm9ybWFsIHByaW9yaXR5IHByb3BlcnRpZXMgYW5kIGFsbCB0aGUg
IWltcG9ydGFudCBwcm9wZXJ0aWVzLgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJp
b3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5s
YXN0VUFSdWxlICsgMSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9y
aXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVy
dGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxl
LCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJl
c3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5y
YW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgIAotICAgIC8vIFN0YXJ0
IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVu
ZGluZ1Jlc291cmNlcygpOwotICAgIAotICAgIEFTU0VSVCghc3RhdGUuZm9udERpcnR5KCkpOwot
ICAgIAotICAgIGlmIChjYWNoZUl0ZW0gfHwgIWNhY2hlSGFzaCkKLSAgICAgICAgcmV0dXJuOwot
ICAgIGlmICghaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuZWxlbWVu
dCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpKSkKLSAgICAgICAgcmV0dXJu
OwotICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5w
YXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKLX0KLQotc3RhdGljIGlubGlu
ZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0
eWxlUnVsZVBhZ2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNp
dHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVz
LCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5h
bWUpCi17Ci0gICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPFN0
eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlz
dChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmly
c3RQYWdlLCBwYWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMu
YmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7Ci0KLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykK
LSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUGFnZVJ1bGVzW2ld
LT5wcm9wZXJ0aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBv
bmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wg
aXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yIChjb25zdCBD
U1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0g
Y29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRj
aCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcm
IGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5hbWUoKTsKLSAgICAgICAg
ICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENTU1Nl
bGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsK
LSAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAm
JiAhaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9y
OjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9U
eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKLSAg
ICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAg
IHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzRm9y
TGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJ1bGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVsZVBhZ2UqIHJ1bGUgPSBydWxl
c1tpXTsKLQotICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5z
ZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpKQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMg
dG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICBpZiAoIXByb3BlcnRp
ZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgotICAg
ICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0KLX0KLQotYm9vbCBTdHlsZVJl
c29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgYm9vbCBpc0Zp
cnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRy
dWU7Ci0KLSAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkp
ICUgMjsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4
KSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBh
Z2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KLSAgICBy
ZXR1cm4gKCFwYWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVSZXNvbHZlcjo6cGFnZU5hbWUo
aW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBh
Z2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0dXJuICIiOwotfQotCi12b2lk
IFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENT
U1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIGluaXRFbGVtZW50KDAp
OwotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCAwLCBzdHlsZSk7
Ci0gICAgbV9zdGF0ZS5zZXRTdHlsZShzdHlsZSk7Ci0gICAgYXBwbHlQcm9wZXJ0eVRvQ3VycmVu
dFN0eWxlKGlkLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0
eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAg
ICBpZiAodmFsdWUpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoaWQsIHZhbHVlKTsKLX0KLQotaW5s
aW5lIGJvb2wgaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKLXsK
LSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJSaWdodENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VGV4dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxs
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKLSNpZiBF
TkFCTEUoU1ZHKQotICAgIGNhc2UgQ1NTUHJvcGVydHlGaWxsOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlTdHJva2U6Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBodHRwOi8v
ZGV2LnczLm9yZy9jc3N3Zy9jc3MzLXJlZ2lvbnMvI3RoZS1hdC1yZWdpb24tc3R5bGUtcnVsZQot
Ly8gRklYTUU6IGFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBvdGhlciByZWdpb24gc3R5bGlu
ZyBwcm9wZXJ0aWVzLgotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0
eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKLXsKLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29s
b3I6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykK
LWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1By
b3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlv
blg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblk6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKLSAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFt
aWx5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250VmFyaWFudDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFdlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGluZUhlaWdodDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0
eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dERlY29yYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRTaGFkb3c6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZh
dWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlm
Ci0vLyBTVkcgaGFuZGxlcyB6b29taW5nIGluIGEgZGlmZmVyZW50IHdheSBjb21wYXJlZCB0byBD
U1MuIFRoZSB3aG9sZSBkb2N1bWVudCBpcyBzY2FsZWQgaW5zdGVhZAotLy8gb2YgZWFjaCBpbmRp
dmlkdWFsIGxlbmd0aCB2YWx1ZSBpbiB0aGUgcmVuZGVyIHN0eWxlIC8gdHJlZS4gQ1NTUHJpbWl0
aXZlVmFsdWU6OmNvbXB1dGVMZW5ndGgqKCkKLS8vIG11bHRpcGxpZXMgZWFjaCByZXNvbHZlZCBs
ZW5ndGggd2l0aCB0aGUgem9vbSBtdWx0aXBsaWVyIC0gc28gZm9yIFNWRyB3ZSBuZWVkIHRvIGRp
c2FibGUgdGhhdC4KLS8vIFRob3VnaCBhbGwgQ1NTIHZhbHVlcyB0aGF0IGNhbiBiZSBhcHBsaWVk
IHRvIG91dGVybW9zdCA8c3ZnPiBlbGVtZW50cyAod2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5n
Li4uKQotLy8gbmVlZCB0byByZXNwZWN0IHRoZSBzY2FsaW5nLiBSZW5kZXJCb3ggKHRoZSBwYXJl
bnQgY2xhc3Mgb2YgUmVuZGVyU1ZHUm9vdCkgZ3JhYnMgdmFsdWVzIGxpa2UKLS8vIHdpZHRoL2hl
aWdodC9ib3JkZXIvcGFkZGluZy8uLi4gZnJvbSB0aGUgUmVuZGVyU3R5bGUgLT4gZm9yIFNWRyB0
aGVzZSB2YWx1ZXMgd291bGQgbmV2ZXIgc2NhbGUsCi0vLyBpZiB3ZSdkIHBhc3MgYSAxLjAgem9v
bSBmYWN0b3IgZXZlcnlod2VyZS4gU28gd2Ugb25seSBwYXNzIGEgem9vbSBmYWN0b3Igb2YgMS4w
IGZvciBzcGVjaWZpYwotLy8gcHJvcGVydGllcyB0aGF0IGFyZSBOT1QgYWxsb3dlZCB0byBzY2Fs
ZSB3aXRoaW4gYSB6b29tZWQgU1ZHIGRvY3VtZW50IChsZXR0ZXIvd29yZC1zcGFjaW5nL2ZvbnQt
c2l6ZSkuCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnVzZVNWR1pvb21SdWxlcygpCi17Ci0gICAgcmV0
dXJuIG1fc3RhdGUuZWxlbWVudCgpICYmIG1fc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQo
KTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChDU1NQcmltaXRpdmVW
YWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwg
TGVuZ3RoJiB3b3JraW5nTGVuZ3RoKQotewotICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1pbkNvbnRlbnQpIHsKLSAgICAgICAgd29ya2luZ0xlbmd0
aCA9IExlbmd0aChNaW5Db250ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0g
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlV2Via2l0TWF4Q29u
dGVudCkgewotICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3RoKE1heENvbnRlbnQpOwotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB3b3JraW5nTGVuZ3RoID0gcHJpbWl0aXZl
VmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENv
bnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uIHwgQXV0b0NvbnZlcnNpb24+
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgc3RhdGUuc3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpKTsKLSAgICBpZiAod29ya2luZ0xlbmd0aC5pc1VuZGVmaW5lZCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3Ro
KCkpCi0gICAgICAgIHdvcmtpbmdMZW5ndGguc2V0UXVpcmsocHJpbWl0aXZlVmFsdWUtPmlzUXVp
cmtWYWx1ZSgpKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVH
cmlkVHJhY2tNaW5NYXgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBT
dHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIEdyaWRUcmFja1NpemUmIHRyYWNrU2l6ZSkKLXsK
LSAgICBQYWlyKiBtaW5NYXhUcmFja0JyZWFkdGggPSBwcmltaXRpdmVWYWx1ZS0+Z2V0UGFpclZh
bHVlKCk7Ci0gICAgaWYgKCFtaW5NYXhUcmFja0JyZWFkdGgpIHsKLSAgICAgICAgTGVuZ3RoIHdv
cmtpbmdMZW5ndGg7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChwcmltaXRp
dmVWYWx1ZSwgc3RhdGUsIHdvcmtpbmdMZW5ndGgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgICAgIHRyYWNrU2l6ZS5zZXRMZW5ndGgod29ya2luZ0xlbmd0aCk7Ci0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIExlbmd0aCBtaW5UcmFja0JyZWFkdGg7Ci0gICAg
TGVuZ3RoIG1heFRyYWNrQnJlYWR0aDsKLSAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgo
bWluTWF4VHJhY2tCcmVhZHRoLT5maXJzdCgpLCBzdGF0ZSwgbWluVHJhY2tCcmVhZHRoKSB8fCAh
Y3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFkdGgtPnNlY29uZCgpLCBzdGF0
ZSwgbWF4VHJhY2tCcmVhZHRoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdHJhY2tT
aXplLnNldE1pbk1heChtaW5UcmFja0JyZWFkdGgsIG1heFRyYWNrQnJlYWR0aCk7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0dyb3VwKENTU1ZhbHVl
KiB2YWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBWZWN0b3I8R3JpZFRy
YWNrU2l6ZT4mIHRyYWNrU2l6ZXMpCi17Ci0gICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBp
ID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICBDU1NWYWx1ZSog
Y3VyclZhbHVlID0gaS52YWx1ZSgpOwotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEdyaWRUcmFj
a1NpemUgdHJhY2tTaXplOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja01pbk1heChzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGN1cnJWYWx1ZSksIHN0YXRlLCB0cmFja1NpemUp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHRyYWNrU2l6ZXMuYXBwZW5k
KHRyYWNrU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBj
cmVhdGVHcmlkVHJhY2tMaXN0KENTU1ZhbHVlKiB2YWx1ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+
JiB0cmFja1NpemVzLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUpCi17Ci0gICAg
Ly8gSGFuZGxlICdub25lJy4KLSAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewot
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRl
R3JpZFRyYWNrR3JvdXAodmFsdWUsIHN0YXRlLCB0cmFja1NpemVzKTsKLX0KLQotCi1zdGF0aWMg
Ym9vbCBjcmVhdGVHcmlkUG9zaXRpb24oQ1NTVmFsdWUqIHZhbHVlLCBHcmlkUG9zaXRpb24mIHBv
c2l0aW9uKQotewotICAgIC8vIEZvciBub3csIHdlIG9ubHkgYWNjZXB0OiA8aW50ZWdlcj4gfCAn
YXV0bycKLSAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwotICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0g
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04ocHJpbWl0aXZlVmFsdWUtPmlzTnVt
YmVyKCkpOwotICAgIHBvc2l0aW9uLnNldEludGVnZXJQb3NpdGlvbihwcmltaXRpdmVWYWx1ZS0+
Z2V0SW50VmFsdWUoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKLXN0YXRpYyBib29sIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKENTU1ZhbHVlKiB2YWx1
ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5oYXNWYXJpYWJs
ZVJlZmVyZW5jZSgpOwotICAgIH0KLQotICAgIGlmICh2YWx1ZS0+aXNDYWxjdWxhdGlvblZhbHVl
KCkpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1NDYWxjVmFsdWUqPih2YWx1ZSktPmhh
c1ZhcmlhYmxlUmVmZXJlbmNlKCk7Ci0KLSAgICBpZiAodmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkp
IHsKLSAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBkaXJl
Y3Rpb24gPSByZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpOwotICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogb2Zmc2V0ID0gcmVmbGVjdFZhbHVlLT5vZmZzZXQoKTsKLSAgICAgICAgQ1NTVmFsdWUq
IG1hc2sgPSByZWZsZWN0VmFsdWUtPm1hc2soKTsKLSAgICAgICAgcmV0dXJuIChkaXJlY3Rpb24g
JiYgaGFzVmFyaWFibGVSZWZlcmVuY2UoZGlyZWN0aW9uKSkgfHwgKG9mZnNldCAmJiBoYXNWYXJp
YWJsZVJlZmVyZW5jZShvZmZzZXQpKSB8fCAobWFzayAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZSht
YXNrKSk7Ci0gICAgfQotCi0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICBpZiAoaGFzVmFyaWFibGVSZWZl
cmVuY2UoaS52YWx1ZSgpKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpyZXNvbHZlVmFyaWFibGVz
KENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQ
cm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpCi17Ci0gICAgc3RkOjpwYWly
PENTU1Byb3BlcnR5SUQsIFN0cmluZz4gZXhwcmVzc2lvbihpZCwgdmFsdWUtPnNlcmlhbGl6ZVJl
c29sdmluZ1ZhcmlhYmxlcygqbV9zdGF0ZS5zdHlsZSgpLT52YXJpYWJsZXMoKSkpOwotCi0gICAg
aWYgKGtub3duRXhwcmVzc2lvbnMuY29udGFpbnMoZXhwcmVzc2lvbikpCi0gICAgICAgIHJldHVy
bjsgLy8gY3ljbGUgZGV0ZWN0ZWQuCi0KLSAgICBrbm93bkV4cHJlc3Npb25zLmFwcGVuZChleHBy
ZXNzaW9uKTsKLQotICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBmYXN0ZXIgbm90IHRvIHJlLXBh
cnNlIGZyb20gc3RyaW5ncywgYnV0IGZvciBub3cgQ1NTIHByb3BlcnR5IHZhbGlkYXRpb24gbGl2
ZXMgaW5zaWRlIHRoZSBwYXJzZXIgc28gd2UgZG8gaXQgdGhlcmUuCi0gICAgUmVmUHRyPFN0eWxl
UHJvcGVydHlTZXQ+IHJlc3VsdFNldCA9IFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpOwotICAg
IGlmICghQ1NTUGFyc2VyOjpwYXJzZVZhbHVlKHJlc3VsdFNldC5nZXQoKSwgaWQsIGV4cHJlc3Np
b24uc2Vjb25kLCBmYWxzZSwgZG9jdW1lbnQoKSkpCi0gICAgICAgIHJldHVybjsgLy8gZXhwcmVz
c2lvbiBmYWlsZWQgdG8gcGFyc2UuCi0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVz
dWx0U2V0LT5wcm9wZXJ0eUNvdW50KCk7IGkrKykgewotICAgICAgICBTdHlsZVByb3BlcnR5U2V0
OjpQcm9wZXJ0eVJlZmVyZW5jZSBwcm9wZXJ0eSA9IHJlc3VsdFNldC0+cHJvcGVydHlBdChpKTsK
LSAgICAgICAgaWYgKHByb3BlcnR5LmlkKCkgIT0gQ1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNW
YXJpYWJsZVJlZmVyZW5jZShwcm9wZXJ0eS52YWx1ZSgpKSkKLSAgICAgICAgICAgIHJlc29sdmVW
YXJpYWJsZXMocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSwga25vd25FeHByZXNzaW9u
cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkocHJvcGVydHkuaWQo
KSwgcHJvcGVydHkudmFsdWUoKSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCi17
Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgaWYgKGlkICE9IENTU1Byb3BlcnR5VmFy
aWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UodmFsdWUpKSB7Ci0gICAgICAgIFZlY3Rvcjxz
dGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+IGtub3duRXhwcmVzc2lvbnM7Ci0gICAg
ICAgIHJlc29sdmVWYXJpYWJsZXMoaWQsIHZhbHVlLCBrbm93bkV4cHJlc3Npb25zKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gQ1NTIHZhcmlhYmxlcyBkb24ndCBy
ZXNvbHZlIHNob3J0aGFuZHMgYXQgcGFyc2luZyB0aW1lLCBzbyB0aGlzIHNob3VsZCBiZSAqYWZ0
ZXIqIGhhbmRsaW5nIHZhcmlhYmxlcy4KLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFpc0V4cGFu
ZGVkU2hvcnRoYW5kKGlkKSwgIlNob3J0aGFuZCBwcm9wZXJ0eSBpZCA9ICVkIHdhc24ndCBleHBh
bmRlZCBhdCBwYXJzaW5nIHRpbWUiLCBpZCk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIGJvb2wgaXNJbmhlcml0ID0gc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0lu
aGVyaXRlZFZhbHVlKCk7Ci0gICAgYm9vbCBpc0luaXRpYWwgPSB2YWx1ZS0+aXNJbml0aWFsVmFs
dWUoKSB8fCAoIXN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1ZS0+aXNJbmhlcml0ZWRWYWx1ZSgp
KTsKLQotICAgIEFTU0VSVCghaXNJbmhlcml0IHx8ICFpc0luaXRpYWwpOyAvLyBpc0luaGVyaXQg
LT4gIWlzSW5pdGlhbCAmJiBpc0luaXRpYWwgLT4gIWlzSW5oZXJpdAotICAgIEFTU0VSVCghaXNJ
bmhlcml0IHx8IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUucGFyZW50U3R5bGUoKSkpOyAv
LyBpc0luaGVyaXQgLT4gKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgp
KQotCi0gICAgaWYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSAmJiAoIXN0
YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSB8fCAhaXNWYWxpZFZpc2l0ZWRM
aW5rUHJvcGVydHkoaWQpKSkgewotICAgICAgICAvLyBMaW1pdCB0aGUgcHJvcGVydGllcyB0aGF0
IGNhbiBiZSBhcHBsaWVkIHRvIG9ubHkgdGhlIG9uZXMgaG9ub3JlZCBieSA6dmlzaXRlZC4KLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpc0luaGVyaXQgJiYgIXN0YXRlLnBhcmVu
dFN0eWxlKCktPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgJiYgIUNTU1Byb3Bl
cnR5Ojppc0luaGVyaXRlZFByb3BlcnR5KGlkKSkKLSAgICAgICAgc3RhdGUucGFyZW50U3R5bGUo
KS0+c2V0SGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKTsKLQotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKSB7Ci0gICAg
ICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHZhbHVlLT5pc1ZhcmlhYmxlVmFs
dWUoKSk7Ci0gICAgICAgIENTU1ZhcmlhYmxlVmFsdWUqIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8
Q1NTVmFyaWFibGVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+bmFt
ZSgpLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVCghdmFyaWFibGUtPnZhbHVlKCkuaXNFbXB0
eSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VmFyaWFibGUodmFyaWFibGUtPm5hbWUo
KSwgdmFyaWFibGUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0K
LSAgICAvLyBDaGVjayBsb29rdXAgdGFibGUgZm9yIGltcGxlbWVudGF0aW9ucyBhbmQgdXNlIHdo
ZW4gYXZhaWxhYmxlLgotICAgIGNvbnN0IFByb3BlcnR5SGFuZGxlciYgaGFuZGxlciA9IG1fc3R5
bGVCdWlsZGVyLnByb3BlcnR5SGFuZGxlcihpZCk7Ci0gICAgaWYgKGhhbmRsZXIuaXNWYWxpZCgp
KSB7Ci0gICAgICAgIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5o
ZXJpdFZhbHVlKGlkLCB0aGlzKTsKLSAgICAgICAgZWxzZSBpZiAoaXNJbml0aWFsKQotICAgICAg
ICAgICAgaGFuZGxlci5hcHBseUluaXRpYWxWYWx1ZShpZCwgdGhpcyk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlWYWx1ZShpZCwgdGhpcywgdmFsdWUpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVl
ID0gdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSA/IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odmFsdWUpIDogMDsKLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdGF0ZS5zdHlsZSgp
LT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICAvLyBXaGF0IGZvbGxvd3MgaXMgYSBsaXN0IHRoYXQg
bWFwcyB0aGUgQ1NTIHByb3BlcnRpZXMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGZyb250LWVu
ZAotICAgIC8vIFJlbmRlclN0eWxlIHZhbHVlcy4KLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgLy8g
bGlzdHMKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoKLSAgICAgICAgLy8gbGlzdCBvZiBz
dHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBG
SVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBpbmhlcml0IGNvbnRlbnQuIElu
IENTUzIgaXQgaXMgbm90LiBUaGlzCi0gICAgICAgICAgICAvLyBub3RlIGlzIGEgcmVtaW5kZXIg
dGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuCi0KLSAgICAg
ICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5j
bGVhckNvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuOwotCi0gICAgICAgICAgICBib29sIGRpZFNldCA9IGZhbHNlOwotICAgICAgICAgICAg
Zm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwotICAg
ICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAg
ICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZhbHVlKCkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6
OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4oaXRlbSktPmdyYWRpZW50V2l0
aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVu
dChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0
b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0g
dHJ1ZTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICAgICAgICAgICAgICB9IGVsc2Ug
aWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29u
dGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAg
ICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlVmFsdWUoKSkgewotICAgICAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNhY2hlZE9yUGVuZGluZ0Zy
b21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPihp
dGVtKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotCi0gICAgICAg
ICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkgewotICAgICAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFs
dWUoKS5pbXBsKCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUtPmlzQXR0cigpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBuYW1lc3BhY2UgYmUgc3BlY2lmaWVk
IGZvciBhbiBhdHRyKGZvbyk/Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgp
LT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAg
ICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51bGxBdG9tLCBjb250ZW50VmFsdWUt
PmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7Ci0gICAgICAgICAgICAgICAgICAg
IGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0
ZShhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudCh2
YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmltcGwoKSwgZGlkU2V0KTsKLSAgICAg
ICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVn
aXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGFmZmVjdHMgdGhlIHN0eWxl
Ci0gICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMu
YWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYg
KGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ291bnRl
ciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRDb3VudGVyVmFsdWUoKTsKLSAgICAg
ICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0eWxlVHlwZSA9IE5vbmVMaXN0U3R5
bGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5bGVJZGVudCA9IGNvdW50ZXJWYWx1
ZS0+bGlzdFN0eWxlSWRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RTdHlsZUlk
ZW50ICE9IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5
cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlzdFN0eWxlSWRlbnQgLSBDU1NWYWx1
ZURpc2MpOwotICAgICAgICAgICAgICAgICAgICBPd25QdHI8Q291bnRlckNvbnRlbnQ+IGNvdW50
ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291bnRlclZhbHVlLT5pZGVudGlmaWVy
KCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2VwYXJhdG9yKCkpKTsKLSAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb3VudGVyLnJlbGVhc2UoKSwg
ZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+
Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlT3BlblF1b3Rl
OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChPUEVO
X1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNl
IENTU1ZhbHVlQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5RdW90ZToKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fT1BFTl9RVU9URSwgZGlkU2V0
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vQ2xv
c2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRT
ZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgYW5kIG5v
bmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsgfQot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgaWYgKCFkaWRTZXQpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
Y2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICBjYXNl
IENTU1Byb3BlcnR5UXVvdGVzOgotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFyZW50U3R5bGUoKS0+cXVvdGVzKCkp
OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0luaXRpYWwp
IHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcygwKTsKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsK
LSAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlz
dCo+KHZhbHVlKTsKLSAgICAgICAgICAgIFJlZlB0cjxRdW90ZXNEYXRhPiBxdW90ZXMgPSBRdW90
ZXNEYXRhOjpjcmVhdGUoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlz
dC0+bGVuZ3RoKCk7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBmaXJzdCA9
IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgICAgICAgICAgLy8gaXRl
bSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNvIHRoaXMgaXMgc2FmZS4KLSAgICAg
ICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+aXRlbShpICsgMSk7Ci0gICAgICAg
ICAgICAgICAgaWYgKCFzZWNvbmQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGZpcnN0LT5pc1By
aW1pdGl2ZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBT
dHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlyc3Qp
LT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBlbmRRdW90ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0U3RyaW5nVmFsdWUoKTsK
LSAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3RkOjptYWtlX3BhaXIoc3RhcnRRdW90
ZSwgZW5kUXVvdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFF1b3RlcyhxdW90ZXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkpOwotICAgICAgICB9Ci0gICAgICAg
IHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseTogewotICAgICAgICAvLyBs
aXN0IG9mIHN0cmluZ3MgYW5kIGlkcwotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAg
ICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50
U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShwYXJlbnRGb250RGVzY3Jp
cHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRG
YW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChwYXJlbnRGb250RGVzY3JpcHRpb24u
aXNTcGVjaWZpZWRGb250KCkpOwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnRE
ZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gaW5pdGlhbERlc2Mg
PSBGb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVz
Y3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAg
IC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFjY291bnQgZm9yIHRoZSBnZW5lcmlj
IGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKLSAgICAgICAgICAgIC8vIHRvIG5vbi1tb25v
c3BhY2UuCi0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYg
Zm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKLSAgICAgICAgICAgICAgICBz
ZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgp
LCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsIGZh
bHNlKSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShpbml0
aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOwotICAgICAgICAgICAgaWYgKCFpbml0aWFsRGVzYy5m
aXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAg
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0g
c3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEZvbnRGYW1pbHkmIGZp
cnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCk7Ci0gICAgICAgIEZvbnRG
YW1pbHkqIGN1cnJGYW1pbHkgPSAwOwotCi0gICAgICAgIC8vIEJlZm9yZSBtYXBwaW5nIGluIGEg
bmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQgcmVzZXQgdGhlIGdlbmVyaWMgZmFt
aWx5LgotICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplID0gZm9udERl
c2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7Ci0KLSAgICAgICAg
Zm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBpLnZhbHVlKCk7Ci0gICAgICAg
ICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotICAgICAgICAgICAgQXRvbWljU3Ry
aW5nIGZhY2U7Ci0gICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRp
bmdzKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKQotICAgICAg
ICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAg
ICAgICBlbHNlIGlmIChzZXR0aW5ncykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29udGVu
dFZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dEJvZHk6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250
RmFtaWx5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNh
c2UgQ1NTVmFsdWVTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNlcmlmRmFtaWx5
OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShG
b250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNTZXJpZjoKLSAgICAgICAgICAgICAg
ICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1p
bHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlQ3Vyc2l2ZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGN1cnNpdmVGYW1pbHk7
Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50YXN5OgotICAgICAgICAgICAgICAg
ICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5KTsK
LSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZU1vbm9zcGFjZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG1vbm9zcGFjZUZhbWlseTsK
LSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0UGljdG9ncmFwaDoKLSAgICAg
ICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1pbHk7Ci0gICAgICAgICAgICAgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6UGlj
dG9ncmFwaEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmYWNlLmlzRW1wdHkoKSkg
ewotICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkgewotICAgICAgICAgICAgICAgICAg
ICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCi0gICAgICAgICAgICAgICAgICAgIGZp
cnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1p
bHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGluaGVyaXRlZCBmYW1pbHktZmFsbGJh
Y2sgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9ICZmaXJzdEZhbWlseTsK
LSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChm
b250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1p
bHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZlB0
cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFyZWRGb250RmFtaWx5OjpjcmVhdGUo
KTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5zZXRGYW1pbHkoZmFjZSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZhbWlseShuZXdGYW1pbHkpOwotICAg
ICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFtaWx5LmdldCgpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbid0
IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFsbCBuZXcgZm9udCBmYW1pbGllcyBo
YXZlIGJlZW4gYWRkZWQKLSAgICAgICAgLy8gSWYgY3VyckZhbWlseSBpcyBub24temVybyB0aGVu
IHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMgZGVzY3JpcHRpb24uCi0gICAgICAg
IGlmIChjdXJyRmFtaWx5KSB7Ci0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdv
cmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSAhPSBvbGRG
YW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShm
b250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4
U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsICFvbGRGYW1pbHlVc2Vk
Rml4ZWREZWZhdWx0U2l6ZSkpOwotCi0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9u
dERlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8v
IFNob3J0aGFuZCBwcm9wZXJ0aWVzLgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgotICAgICAg
ICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2Ny
aXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KHN0YXRlLnBhcmVudFN0eWxlKCktPnNw
ZWNpZmllZExpbmVIZWlnaHQoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFs
dWUoMCk7Ci0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsK
LSAgICAgICAgfSBlbHNlIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAgICAgIEFTU0VSVChzZXR0aW5n
cyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hv
dWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MKLSAgICAgICAg
ICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAg
aW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0
aXZlVmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVu
ZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOwotICAgICAgICAgICAgc3RhdGUuc2V0TGlu
ZUhlaWdodFZhbHVlKDApOwotCi0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2Ny
aXB0aW9uOwotICAgICAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1G
b250KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpLCBmb250RGVzY3JpcHRpb24pOwotCi0gICAg
ICAgICAgICAvLyBEb3VibGUtY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGhlbWUgZGlkIGFueXRoaW5n
LiBJZiBub3QsIGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgZm9udC4KLSAgICAgICAgICAgIGlm
IChmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSkgewotICAgICAgICAgICAgICAgIC8v
IE1ha2Ugc3VyZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHByaW50ZXIgZm9udCBzZXR0aW5ncyBh
cmUgdXBkYXRlZC4KLSAgICAgICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVu
dFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2Un
cmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJl
IGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgIGlmICgh
c2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01v
ZGUoKSk7Ci0gICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250
KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0
aW9uRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgem9vbSBmYWN0
b3IuCi0gICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRD
b21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBm
b250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgZm9udERlc2NyaXB0aW9uLnNwZWNpZmll
ZFNpemUoKSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKLSAgICAgICAgICAgICAgICBzZXRGb250RGVz
Y3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNl
IGlmICh2YWx1ZS0+aXNGb250VmFsdWUoKSkgewotICAgICAgICAgICAgRm9udFZhbHVlKiBmb250
ID0gc3RhdGljX2Nhc3Q8Rm9udFZhbHVlKj4odmFsdWUpOwotICAgICAgICAgICAgaWYgKCFmb250
LT5zdHlsZSB8fCAhZm9udC0+dmFyaWFudCB8fCAhZm9udC0+d2VpZ2h0Ci0gICAgICAgICAgICAg
ICAgfHwgIWZvbnQtPnNpemUgfHwgIWZvbnQtPmxpbmVIZWlnaHQgfHwgIWZvbnQtPmZhbWlseSkK
LSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1By
b3BlcnR5Rm9udFN0eWxlLCBmb250LT5zdHlsZS5nZXQoKSk7Ci0gICAgICAgICAgICBhcHBseVBy
b3BlcnR5KENTU1Byb3BlcnR5Rm9udFZhcmlhbnQsIGZvbnQtPnZhcmlhbnQuZ2V0KCkpOwotICAg
ICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRXZWlnaHQsIGZvbnQtPndlaWdo
dC5nZXQoKSk7Ci0gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgcHJvcGVydGllcyBjYW4gZGly
dHkgb3VyIGZvbnQgYnV0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJlYWQgdGhlIGZvbnQncwotICAgICAg
ICAgICAgLy8gcHJvcGVydGllcyBiYWNrLCB3aGljaCBpcyBzYWZlLiBIb3dldmVyIGlmIGZvbnQt
c2l6ZSBpcyB1c2luZyB0aGUgJ2V4JyB1bml0LCBpdCB3aWxsCi0gICAgICAgICAgICAvLyBuZWVk
IHF1ZXJ5IHRoZSBkaXJ0aWVkIGZvbnQncyB4LWhlaWdodCB0byBnZXQgdGhlIGNvbXB1dGVkIHNp
emUuIFRvIGJlIHNhZmUgaW4gdGhpcwotICAgICAgICAgICAgLy8gY2FzZSwgbGV0J3MganVzdCB1
cGRhdGUgdGhlIGZvbnQgbm93LgotICAgICAgICAgICAgdXBkYXRlRm9udCgpOwotICAgICAgICAg
ICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTaXplLCBmb250LT5zaXplLmdldCgpKTsK
LQotICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKGZvbnQtPmxpbmVIZWlnaHQu
Z2V0KCkpOwotCi0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udEZhbWls
eSwgZm9udC0+ZmFtaWx5LmdldCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dy
b3VuZFBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRv
bToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRk
aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRBbmltYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVy
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmU6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJvcmRlckVuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
U3RhcnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclJhZGl1czoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uUnVsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0RmxleEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1
bW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3c6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcmdpbkNvbGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJx
dWVlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBl
YXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpczoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJh
bnNpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luOgotI2lm
IEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcDoK
LSNlbmRpZgotICAgICAgICBBU1NFUlQoaXNFeHBhbmRlZFNob3J0aGFuZChpZCkpOwotICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAvLyBDU1MzIFBy
b3BlcnRpZXMKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNoYWRvdzoKLSAgICBjYXNlIENTU1By
b3BlcnR5Qm94U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3c6IHsK
LSAgICAgICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAgICAgICAgaWYgKGlkID09IENTU1Byb3Bl
cnR5VGV4dFNoYWRvdykKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0
VGV4dFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkgPyBhZG9wdFB0cihu
ZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4dFNoYWRvdygpKSkgOiBudWxs
cHRyKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc3Rh
dGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgq
c3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkpKSA6IG51bGxwdHIpOwotICAgICAgICB9
Ci0gICAgICAgIGlmIChpc0luaXRpYWwgfHwgcHJpbWl0aXZlVmFsdWUpIC8vIGluaXRpYWwgfCBu
b25lCi0gICAgICAgICAgICByZXR1cm4gaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93ID8gc3Rh
dGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhudWxscHRyKSA6IHN0YXRlLnN0eWxlKCktPnNldEJv
eFNoYWRvdyhudWxscHRyKTsKLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQot
ICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgICAgIENTU1Zh
bHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+
aXNTaGFkb3dWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
U2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dWYWx1ZSo+KGN1cnJWYWx1ZSk7
Ci0gICAgICAgICAgICBpbnQgeCA9IGl0ZW0tPngtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAg
ICAgaW50IHkgPSBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGludCBibHVy
ID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHls
ZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAg
ICAgIGludCBzcHJlYWQgPSBpdGVtLT5zcHJlYWQgPyBpdGVtLT5zcHJlYWQtPmNvbXB1dGVMZW5n
dGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpIDogMDsKLSAgICAgICAgICAgIFNoYWRvd1N0eWxlIHNoYWRvd1N0eWxlID0gaXRlbS0+c3R5
bGUgJiYgaXRlbS0+c3R5bGUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVJbnNldCA/IEluc2V0IDog
Tm9ybWFsOwotICAgICAgICAgICAgQ29sb3IgY29sb3I7Ci0gICAgICAgICAgICBpZiAoaXRlbS0+
Y29sb3IpCi0gICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShp
dGVtLT5jb2xvci5nZXQoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS5zdHlsZSgpKQot
ICAgICAgICAgICAgICAgIGNvbG9yID0gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKLQotICAgICAg
ICAgICAgT3duUHRyPFNoYWRvd0RhdGE+IHNoYWRvd0RhdGEgPSBhZG9wdFB0cihuZXcgU2hhZG93
RGF0YShJbnRQb2ludCh4LCB5KSwgYmx1ciwgc3ByZWFkLCBzaGFkb3dTdHlsZSwgaWQgPT0gQ1NT
UHJvcGVydHlXZWJraXRCb3hTaGFkb3csIGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6
OnRyYW5zcGFyZW50KSk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hh
ZG93KQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3coc2hhZG93
RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlz
IG5vdCB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgo
KSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKLSAg
ICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3hSZWZsZWN0OiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGJveFJl
ZmxlY3QsIEJveFJlZmxlY3QpCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChSZW5kZXJTdHlsZTo6aW5pdGlhbEJv
eFJlZmxlY3QoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoIXZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAg
ICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVj
dFZhbHVlKj4odmFsdWUpOwotICAgICAgICBSZWZQdHI8U3R5bGVSZWZsZWN0aW9uPiByZWZsZWN0
aW9uID0gU3R5bGVSZWZsZWN0aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgcmVmbGVjdGlvbi0+c2V0
RGlyZWN0aW9uKCpyZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpKTsKLSAgICAgICAgaWYgKHJlZmxl
Y3RWYWx1ZS0+b2Zmc2V0KCkpCi0gICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRPZmZzZXQocmVm
bGVjdFZhbHVlLT5vZmZzZXQoKS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNp
b24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uPihzdGF0ZS5zdHls
ZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpKTsKLSAgICAgICAgTmlu
ZVBpZWNlSW1hZ2UgbWFzazsKLSAgICAgICAgbWFzay5zZXRNYXNrRGVmYXVsdHMoKTsKLSAgICAg
ICAgbV9zdHlsZU1hcC5tYXBOaW5lUGllY2VJbWFnZShpZCwgcmVmbGVjdFZhbHVlLT5tYXNrKCks
IG1hc2spOwotICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNrKG1hc2spOwotCi0gICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QocmVmbGVjdGlvbi5yZWxlYXNlKCkpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlTcmM6IC8vIE9ubHkgdXNlZCBp
biBAZm9udC1mYWNlIHJ1bGVzLgotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVVuaWNvZGVSYW5nZTogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCi0gICAgICAg
IHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVJlcGV0aXRpb246IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUxvb3BDb3VudCwgTWFy
cXVlZUxvb3BDb3VudCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlSW5maW5pdGUpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENv
dW50KC0xKTsgLy8gLTEgbWVhbnMgcmVwZWF0IGZvcmV2ZXIuCi0gICAgICAgIGVsc2UgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
TWFycXVlZUxvb3BDb3VudChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTcGVlZDog
ewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlU3BlZWQsIE1hcnF1
ZWVTcGVlZCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgaWYgKGludCBpZGVudCA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7
Ci0gICAgICAgICAgICBzd2l0Y2ggKGlkZW50KSB7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVl
U2xvdzoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoNTAw
KTsgLy8gNTAwIG1zZWMuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNl
IENTU1ZhbHVlTm9ybWFsOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1
ZWVTcGVlZCg4NSk7IC8vIDg1bXNlYy4gVGhlIFdpbklFIGRlZmF1bHQuCi0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFzdDoKLSAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoMTApOyAvLyAxMG1zZWMuIFN1cGVyIGZh
c3QuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzVGltZSgpKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlVGltZTxpbnQsIENTU1By
aW1pdGl2ZVZhbHVlOjpNaWxsaXNlY29uZHM+KCkpOwotICAgICAgICBlbHNlIGlmIChwcmltaXRp
dmVWYWx1ZS0+aXNOdW1iZXIoKSkgLy8gRm9yIHNjcm9sbGFtb3VudCBzdXBwb3J0LgotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5nZXRJ
bnRWYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFycXVlZUluY3JlbWVudDogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTChtYXJxdWVlSW5jcmVtZW50LCBNYXJxdWVlSW5jcmVtZW50KQotICAgICAgICBpZiAoIXBy
aW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTbWFsbDoKLSAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCgxLCBGaXhl
ZCkpOyAvLyAxcHguCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENT
U1ZhbHVlTm9ybWFsOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJ
bmNyZW1lbnQoTGVuZ3RoKDYsIEZpeGVkKSk7IC8vIDZweC4gVGhlIFdpbklFIGRlZmF1bHQuCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlTGFyZ2U6Ci0g
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgo
MzYsIEZpeGVkKSk7IC8vIDM2cHguCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMZW5ndGggbWFycXVlZUxlbmd0aCA9
IGNvbnZlcnRUb0ludExlbmd0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cm9vdEVsZW1lbnRTdHlsZSgpKTsKLSAgICAgICAgICAgIGlmICghbWFycXVlZUxlbmd0aC5pc1Vu
ZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNy
ZW1lbnQobWFycXVlZUxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9jYWxlOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKGxvY2FsZSwgTG9jYWxlKTsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dExvY2FsZShudWxsQXRvbSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldExvY2FsZShwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVz
Y3JpcHRpb24oKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1Nj
cmlwdENvZGVGb3JGb250U2VsZWN0aW9uKHN0YXRlLnN0eWxlKCktPmxvY2FsZSgpKSk7Ci0gICAg
ICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0RGFzaGJvYXJkUmVnaW9uOgotICAgIHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwoZGFzaGJvYXJkUmVnaW9ucywgRGFzaGJvYXJkUmVnaW9ucykKLSAgICAgICAg
aWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb25zKFJlbmRlclN0eWxlOjpub25lRGFz
aGJvYXJkUmVnaW9ucygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAg
ICAgIERhc2hib2FyZFJlZ2lvbiogcmVnaW9uID0gcHJpbWl0aXZlVmFsdWUtPmdldERhc2hib2Fy
ZFJlZ2lvblZhbHVlKCk7Ci0gICAgICAgIGlmICghcmVnaW9uKQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIERhc2hib2FyZFJlZ2lvbiogZmlyc3QgPSByZWdpb247Ci0gICAgICAgIHdo
aWxlIChyZWdpb24pIHsKLSAgICAgICAgICAgIExlbmd0aCB0b3AgPSBjb252ZXJ0VG9JbnRMZW5n
dGgocmVnaW9uLT50b3AoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
KTsKLSAgICAgICAgICAgIExlbmd0aCByaWdodCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24t
PnJpZ2h0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAg
ICAgICAgICBMZW5ndGggYm90dG9tID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+Ym90dG9t
KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAg
ICBMZW5ndGggbGVmdCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPmxlZnQoKSwgc3RhdGUu
c3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLQotICAgICAgICAgICAgaWYgKHRv
cC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHRvcCA9IExlbmd0aCgpOwotICAgICAg
ICAgICAgaWYgKHJpZ2h0LmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmlnaHQgPSBM
ZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChib3R0b20uaXNVbmRlZmluZWQoKSkKLSAgICAgICAg
ICAgICAgICBib3R0b20gPSBMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZWZ0LmlzVW5kZWZp
bmVkKCkpCi0gICAgICAgICAgICAgICAgbGVmdCA9IExlbmd0aCgpOwotCi0gICAgICAgICAgICBp
ZiAocmVnaW9uLT5tX2lzQ2lyY2xlKQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6Q2lyY2xlLCByZWdpb24tPm1f
bGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2Ug
OiB0cnVlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lvbi0+bV9pc1JlY3RhbmdsZSkKLSAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNo
Ym9hcmRSZWdpb246OlJlY3RhbmdsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0
b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgICAgICAgICBy
ZWdpb24gPSByZWdpb24tPm1fbmV4dC5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRl
LmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7Ci0KLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSNlbmRpZgotI2lmIEVOQUJMRShEUkFHR0FCTEVfUkVHSU9OKQotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBcHBSZWdpb246IHsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSB8fCAhcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERyYWdnYWJsZVJlZ2lvbk1vZGUocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEcmFnID8gRHJhZ2dhYmxlUmVnaW9uRHJhZyA6
IERyYWdnYWJsZVJlZ2lvbk5vRHJhZyk7Ci0gICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhh
c0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZVdpZHRoOiB7Ci0gICAgICAgIEhB
TkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRTdHJva2VXaWR0aCwgVGV4dFN0cm9rZVdpZHRo
KQotICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVRoaW46Ci0gICAgICAgIGNh
c2UgQ1NTVmFsdWVNZWRpdW06Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGljazogewotICAgICAg
ICAgICAgZG91YmxlIHJlc3VsdCA9IDEuMCAvIDQ4OwotICAgICAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTWVkaXVtKQotICAgICAgICAgICAgICAgIHJl
c3VsdCAqPSAzOwotICAgICAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkgPT0gQ1NTVmFsdWVUaGljaykKLSAgICAgICAgICAgICAgICByZXN1bHQgKj0gNTsKLSAgICAg
ICAgICAgIHdpZHRoID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShyZXN1bHQsIENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfRU1TKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB3aWR0aCA9IHByaW1p
dGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFN0cm9rZVdpZHRoKHdpZHRoKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3Jt
OiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRyYW5zZm9ybSwgVHJhbnNm
b3JtKTsKLSAgICAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgICAgICBj
cmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRU
cmFuc2Zvcm0ob3BlcmF0aW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHBlcnNwZWN0aXZlLCBQZXJzcGVjdGl2ZSkKLQotICAgICAgICBpZiAoIXByaW1p
dGl2ZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldFBlcnNwZWN0aXZlKDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9
Ci0KLSAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVWYWx1ZTsKLSAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IHByaW1p
dGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVW
YWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGli
aWxpdHksIHRyZWF0IHZhbHVlbGVzcyBudW1iZXJzIGFzIHB4LgotICAgICAgICAgICAgcGVyc3Bl
Y3RpdmVWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocHJpbWl0aXZlVmFsdWUtPmdl
dERvdWJsZVZhbHVlKCksIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFgpLT5jb21wdXRlTGVuZ3Ro
PGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAo
cGVyc3BlY3RpdmVWYWx1ZSA+PSAwLjBmKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0j
aWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGFwSGln
aGxpZ2h0Q29sb3I6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGFwSGln
aGxpZ2h0Q29sb3IsIFRhcEhpZ2hsaWdodENvbG9yKTsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIENvbG9yIGNvbCA9IGNvbG9yRnJv
bVByaW1pdGl2ZVZhbHVlKHByaW1pdGl2ZVZhbHVlKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0VGFwSGlnaGxpZ2h0Q29sb3IoY29sKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRp
ZgotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKHVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcsIFVzZVRvdWNoT3ZlcmZs
b3dTY3JvbGxpbmcpOwotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxp
bmcocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUb3VjaCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5SW52YWxpZDoKLSAg
ICAgICAgcmV0dXJuOwotICAgIC8vIERpcmVjdGlvbmFsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVk
IGJ5IHJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KCkgYmVmb3JlIHRoZSBzd2l0Y2guCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJFbmRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVyRW5kV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0Q29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0U3R5bGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckJlZm9yZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJC
ZWZvcmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlV2lkdGg6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyQ29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckFmdGVyV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkVu
ZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luU3RhcnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFy
Z2luQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFBhZGRpbmdFbmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UGFkZGluZ0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2Fs
V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWluTG9naWNhbEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9n
aWNhbFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0Ogot
ICAgIHsKLSAgICAgICAgQ1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZl
RGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0
YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQp
OwotICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOwotICAgIH0KLSAg
ICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhy
b3VnaE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hXaWR0aDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dE92ZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dE92ZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdp
ZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxp
bmVNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Rm9udFNpemVEZWx0YToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRp
b25zSW5FZmZlY3Q6Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIENTUyBUZXh0IExheW91dCBN
b2R1bGUgTGV2ZWwgMzogVmVydGljYWwgd3JpdGluZyBzdXBwb3J0Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFdyaXRpbmdNb2RlOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklU
SUFMKHdyaXRpbmdNb2RlLCBXcml0aW5nTW9kZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBzZXRXcml0aW5nTW9kZSgqcHJpbWl0aXZlVmFsdWUp
OwotCi0gICAgICAgIC8vIEZJWE1FOiBJdCBpcyBub3Qgb2sgdG8gbW9kaWZ5IGRvY3VtZW50IHN0
YXRlIHdoaWxlIGFwcGx5aW5nIHN0eWxlLgotICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpICYm
IHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkK
LSAgICAgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVu
dEVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VGV4dE9yaWVudGF0aW9uOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHRleHRPcmllbnRhdGlvbiwgVGV4dE9yaWVudGF0aW9uKTsKLQotICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBzZXRUZXh0T3JpZW50YXRpb24oKnByaW1p
dGl2ZVZhbHVlKTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdExpbmVCb3hDb250YWluOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKGxpbmVCb3hDb250YWluLCBMaW5lQm94Q29udGFpbikKLSAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkg
ewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4oTGluZUJveENv
bnRhaW5Ob25lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlm
ICghdmFsdWUtPmlzQ1NTTGluZUJveENvbnRhaW5WYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJu
OwotCi0gICAgICAgIENTU0xpbmVCb3hDb250YWluVmFsdWUqIGxpbmVCb3hDb250YWluVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NMaW5lQm94Q29udGFpblZhbHVlKj4odmFsdWUpOwotICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFpbihsaW5lQm94Q29udGFpblZhbHVlLT52YWx1
ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIENTUyBGb250cyBNb2R1bGUg
TGV2ZWwgMwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250RmVhdHVyZVNldHRpbmdzOiB7
Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQo
KSA9PSBDU1NWYWx1ZU5vcm1hbCkgewotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKHN0
YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpLm1ha2VOb3JtYWxGZWF0dXJlU2V0dGluZ3Mo
KSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KTsKLSAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0
Kj4odmFsdWUpOwotICAgICAgICBSZWZQdHI8Rm9udEZlYXR1cmVTZXR0aW5ncz4gc2V0dGluZ3Mg
PSBGb250RmVhdHVyZVNldHRpbmdzOjpjcmVhdGUoKTsKLSAgICAgICAgaW50IGxlbiA9IGxpc3Qt
Pmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAg
ICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7
Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzRm9udEZlYXR1cmVWYWx1ZSgpKQotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgRm9udEZlYXR1cmVWYWx1ZSogZmVhdHVyZSA9
IHN0YXRpY19jYXN0PEZvbnRGZWF0dXJlVmFsdWUqPihpdGVtKTsKLSAgICAgICAgICAgIHNldHRp
bmdzLT5hcHBlbmQoRm9udEZlYXR1cmUoZmVhdHVyZS0+dGFnKCksIGZlYXR1cmUtPnZhbHVlKCkp
KTsKLSAgICAgICAgfQotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmVhdHVyZVNldHRpbmdz
KHNldHRpbmdzLnJlbGVhc2UoKSk7Ci0gICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgRU5BQkxFKENTU19GSUxU
RVJTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGaWx0ZXI6IHsKLSAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwoZmlsdGVyLCBGaWx0ZXIpOwotICAgICAgICBGaWx0ZXJPcGVy
YXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgICAgIGlmIChjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKHZh
bHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMp
KQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RmlsdGVyKG9wZXJhdGlvbnMpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdy
aWRDb2x1bW5zOiB7Ci0gICAgICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOwot
ICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRl
KSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZENv
bHVtbnModHJhY2tTaXplcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEdyaWRSb3dzOiB7Ci0gICAgICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0
cmFja1NpemVzOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNr
U2l6ZXMsIHN0YXRlKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0R3JpZFJvd3ModHJhY2tTaXplcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFN0YXJ0OiB7Ci0gICAgICAgIEdyaWRQb3NpdGlv
biBzdGFydFBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwg
c3RhcnRQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRJdGVtU3RhcnQoc3RhcnRQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRFbmQ6IHsKLSAgICAgICAgR3JpZFBv
c2l0aW9uIGVuZFBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1
ZSwgZW5kUG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRHcmlkSXRlbUVuZChlbmRQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEJlZm9yZTogewotICAgICAgICBHcmlk
UG9zaXRpb24gYmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9u
KHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9uKTsKLSAgICAgICAg
cmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7Ci0g
ICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdy
aWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlh
c2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUg
cHJlZml4ZWQgdmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRp
bWluZ0Z1bmN0aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gVGhlc2UgcHJvcGVydGllcyBh
cmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFibGUuCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UmVwZWF0WToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJC
b3R0b21MZWZ0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJh
ZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tU3R5bGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJD
b2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VPdXRzZXQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJJbWFnZVNsaWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNvdXJjZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyTGVmdENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0U3R5bGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyUmlnaHRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRTdHlsZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5Qm9yZGVyVG9wQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcExlZnRSYWRp
dXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFJpZ2h0UmFkaXVzOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJUb3BTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm94U2l6aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Q2xlYXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlE
aXNwbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlGbG9hdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoK
LSNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJvcGVydHlJ
bWFnZU9yaWVudGF0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVy
aW5nOgotI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVTT0xVVElPTikKLSAgICBjYXNlIENTU1Byb3Bl
cnR5SW1hZ2VSZXNvbHV0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxp
bmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZUltYWdlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGVQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0
eWxlVHlwZToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luQm90dG9tOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlNYXJnaW5MZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5SaWdodDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhIZWln
aHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1heFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlN
aW5IZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1pbldpZHRoOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlPcGFjaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcnBoYW5zOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlPdXRsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
T3V0bGluZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1dyYXA6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eU92ZXJmbG93WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dZOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nQm90dG9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQ
YWRkaW5nTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1JpZ2h0OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlQYWRkaW5nVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtBZnRl
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlQYWdlQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBvaW50ZXJFdmVudHM6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlSZXNp
emU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVJpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlTaXpl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlTcGVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGFiU2l6
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGFibGVMYXlvdXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRBbGlnbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRJbmRlbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVyZmxv
dzoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFJlbmRlcmluZzoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dFRyYW5zZm9ybToKLSAgICBjYXNlIENTU1Byb3BlcnR5VG9wOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlVbmljb2RlQmlkaToKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICBjYXNl
IENTU1Byb3BlcnR5VmFyaWFibGU6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5VmVydGlj
YWxBbGlnbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0eToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0QW5pbWF0aW9uRGVsYXk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFu
aW1hdGlvbkRpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRHVy
YXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkZpbGxNb2RlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25JdGVyYXRpb25Db3VudDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uTmFtZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QW5pbWF0aW9uUGxheVN0YXRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRp
b25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwZWFyYW5jZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXNwZWN0UmF0aW86Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QmFja2dyb3VuZENsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDb21w
b3NpdGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRPcmlnaW46Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJGaXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6
b250YWxTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJJbWFnZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVmVydGljYWxTcGFjaW5nOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hBbGlnbjoKLSNpZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9O
X0JSRUFLKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hEZWNvcmF0aW9uQnJlYWs6Ci0j
ZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGlyZWN0aW9uOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hGbGV4OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hG
bGV4R3JvdXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveExpbmVzOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hPcmRpbmFsR3JvdXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJveE9yaWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UGFjazoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Q29sb3JDb3JyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRDb2x1bW5BeGlzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVh
a0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0JlZm9yZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1
bW5HYXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblByb2dyZXNzaW9uOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdENvbHVtblJ1bGVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uUnVsZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5TcGFuOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aDoKLSNpZiBFTkFCTEUoQ1VSU09SX1ZJ
U0lCSUxJVFkpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEN1cnNvclZpc2liaWxpdHk6Ci0j
ZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25Db250ZW50OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRBbGlnbkl0ZW1zOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bGlnblNlbGY6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhCYXNpczoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0RmxleERpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0RmxleEdyb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhTaHJpbms6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRKdXN0aWZ5Q29udGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3JkZXI6Ci0jaWYg
RU5BQkxFKENTU19SRUdJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93RnJvbToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxvd0ludG86Ci0jZW5kaWYKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Rm9udEtlcm5pbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZv
bnRTbW9vdGhpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRWYXJpYW50TGlnYXR1
cmVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIaWdobGlnaHQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUNoYXJhY3RlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0SHlwaGVuYXRlTGltaXRBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVu
YXRlTGltaXRCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0
TGluZXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbnM6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdExpbmVBbGlnbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJy
ZWFrOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQ2xhbXA6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdExpbmVHcmlkOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lU25h
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZURpcmVjdGlvbjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQm94SW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZU91
dHNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlUmVwZWF0OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTbGljZToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQm94SW1hZ2VXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NsaXA6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tDb21wb3NpdGU6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza09y
aWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uWDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uWToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza1JlcGVhdFg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRZOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrU2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TmJzcE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3Jp
Z2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblg6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luWToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UHJpbnRDb2xvckFkanVzdDoKLSNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRSZWdpb25CcmVha0luc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uT3Zl
cmZsb3c6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UnRsT3JkZXJpbmc6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ1YnlQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dENvbWJpbmU6Ci0jaWYgRU5BQkxFKENTUzNfVEVYVCkKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25MaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RGVjb3JhdGlvblN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
QWxpZ25MYXN0OgotI2VuZGlmIC8vIENTUzNfVEVYVAotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRUZXh0RW1waGFzaXNDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhh
c2lzUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1N0eWxl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0U2VjdXJpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRTdHJva2VDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2lu
WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNmb3JtU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRp
b25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VXNlckRyYWc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2Rp
Znk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdENsaXBQYXRoOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFNoYXBlTWFyZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZVBhZGRpbmc6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBUaHJvdWdoOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRTaGFwZUluc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRz
aWRlOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdpZG93czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2lkdGg6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdvcmRCcmVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V29yZFNwYWNpbmc6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Ci0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRB
VElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4Wm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5
TWluWm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JpZW50YXRpb246Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVVzZXJab29tOgotI2VuZGlmCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAv
LyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCi0gICAgICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZh
bHVlKTsKLSNlbmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi1QYXNzUmVmUHRyPFN0
eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0
eSwgQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCi0g
ICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19j
YXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwotCi0gICAgaWYgKHZhbHVlLT5pc0ltYWdlR2Vu
ZXJhdG9yVmFsdWUoKSkgewotICAgICAgICBpZiAodmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQot
ICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwg
c3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVz
UmVzb2x2ZWQodGhpcykuZ2V0KCkpOwotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5n
RnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4o
dmFsdWUpKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAodmFs
dWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQotICAgICAgICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZh
bHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVlKj4odmFsdWUpKTsKLSNl
bmRpZgotCi0gICAgaWYgKHZhbHVlLT5pc0N1cnNvckltYWdlVmFsdWUoKSkKLSAgICAgICAgcmV0
dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vy
c29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0
cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VWYWx1ZSogdmFsdWUpCi17Ci0gICAgUmVmUHRy
PFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlKCk7Ci0gICAg
aWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBl
bmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4g
aW1hZ2UucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2
ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBD
U1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzUGVuZGlu
ZygpKSB7Ci0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9w
ZXJ0eSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gU3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2
YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFs
dWUpOwotfQotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi1QYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHBy
b3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJbWFn
ZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7Ci0g
ICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1
cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4g
U3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJv
cGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZhbHVlKQotewotICAgIFJlZlB0cjxTdHlsZUlt
YWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZShkb2N1bWVudCgpKTsKLSAg
ICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgIG1fc3RhdGUu
cGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgIHJldHVy
biBpbWFnZS5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29t
Q2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewot
ICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVa
b29tKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hp
bGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwotICAgIEZvbnREZXNjcmlwdGlvbiBu
ZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVz
Y3JpcHRpb24sIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkpOwotICAgIHN0eWxlLT5zZXRGb250
RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
OjpjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZv
bnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0KLSAgICBpZiAoY2hpbGRGb250LmlzQWJz
b2x1dGVTaXplKCkgfHwgIXBhcmVudFN0eWxlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0
aW9uKCk7Ci0gICAgaWYgKGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50
Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZv
ciBub3csIGx1bXAgYWxsIGZhbWlsaWVzIGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCi0gICAgaWYg
KGNoaWxkRm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VG
YW1pbHkKLSAgICAgICAgJiYgcGFyZW50Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2Ny
aXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIGtu
b3cgdGhlIHBhcmVudCBpcyBtb25vc3BhY2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5k
IHRoYXQgZm9udAotICAgIC8vIHNpemUgd2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxl
IG91ciBmb250IHNpemUgYXMgYXBwcm9wcmlhdGUuCi0gICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBh
IGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSByZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFu
Ci0gICAgLy8gbXVsdGlwbHlpbmcgYnkgb3VyIHNjYWxlIGZhY3Rvci4KLSAgICBmbG9hdCBzaXpl
OwotICAgIGlmIChjaGlsZEZvbnQua2V5d29yZFNpemUoKSkKLSAgICAgICAgc2l6ZSA9IGZvbnRT
aXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5
d29yZFNpemUoKSAtIDEsIGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpOwotICAgIGVs
c2UgewotICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0g
ICAgICAgIGZsb2F0IGZpeGVkU2NhbGVGYWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRl
ZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYgc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQotICAg
ICAgICAgICAgPyBzdGF0aWNfY2FzdDxmbG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRT
aXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpCi0gICAgICAgICAgICA6IDE7Ci0g
ICAgICAgIHNpemUgPSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/Ci0gICAgICAg
ICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgot
ICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFj
dG9yOwotICAgIH0KLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hp
bGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOwotICAg
IHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjppbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykK
LXsKLSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwot
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVy
aW5nTW9kZSgpKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1l
bnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFi
bGVkKCkpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9j
dW1lbnRTZXR0aW5ncygpLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKLSAgICBpZiAoIXN0YW5kYXJk
Rm9udEZhbWlseS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFt
aWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udEZhbWlseSk7Ci0gICAgICAgIGZvbnREZXNjcmlw
dGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKLSAgICB9Ci0gICAgZm9udERlc2Ny
aXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsg
MSk7Ci0gICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQo
ZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgp
LT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLSAgICBt
X3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBzZXRGb250RGVzY3JpcHRpb24oZm9u
dERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250
RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgZmxvYXQgc2l6ZSkKLXsKLSAgICBmb250RGVz
Y3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0
Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCks
IG1fc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUs
IHVzZVNWR1pvb21SdWxlcygpKSk7Ci19Ci0KLWZsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVz
ZVNWR1pvb21SdWxlcykKLXsKLSAgICBmbG9hdCB6b29tRmFjdG9yID0gMS4wZjsKLSAgICBpZiAo
IXVzZVNWR1pvb21SdWxlcykgewotICAgICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2
ZVpvb20oKTsKLSAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQot
ICAgICAgICAgICAgem9vbUZhY3RvciAqPSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmll
ZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXpl
KTsKLX0KLQotZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmll
ZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1
dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNl
U21hcnRNaW5pbXVtRm9yRm9udFNpemUpCi17Ci0gICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQg
c2l6ZSBzaG91bGQgbm90IGJlIHZpc2libGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQotICAg
IC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0gZm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24g
dGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAotICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNv
bXBhdGlibGUgd2l0aCBvdGhlciBicm93c2VycyB0aGF0IGhhdmUgbWluaW11bQotICAgIC8vIGZv
bnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBGaXJlZm94KS4KLSAgICBpZiAoZmFic2Yoc3BlY2lmaWVk
U2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQotICAgICAgICBy
ZXR1cm4gMC4wZjsKLQotICAgIC8vIFdlIHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9u
dCBzaXplLiBUaGUgZmlyc3QgaXMgYSBoYXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bwotICAg
IC8vIGFsbCBmb250cy4gVGhpcyBpcyAibWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5p
bXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFydCBtaW5pbXVtIgotICAgIC8vIHRoYXQgaXMgYXBwbGll
ZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdlIGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBh
c2tlZCBmb3IsIGUuZy4sCi0gICAgLy8gd2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAi
c21hbGwiIG9yIGV4cHJlc3NlcyB0aGUgZm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgotICAg
IC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBmb250IHNldHRpbmcuCi0KLSAgICAvLyBXaXRoIHRoZSBz
bWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmlt
dW0gZm9udCBzaXplIHRvIGtlZXAgZm9udHMgcmVhZGFibGUuCi0gICAgLy8gSG93ZXZlciB3ZSBh
bHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8gc2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBp
cyBzbWFsbGVyLAotICAgIC8vIHNpbmNlIHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2Ug
KGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNwb3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCi0KLSAg
ICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNl
dHRpbmdzKQotICAgICAgICByZXR1cm4gMS4wZjsKLQotICAgIGludCBtaW5TaXplID0gc2V0dGlu
Z3MtPm1pbmltdW1Gb250U2l6ZSgpOwotICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdz
LT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7Ci0gICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNp
ZmllZFNpemUgKiB6b29tRmFjdG9yOwotCi0gICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBm
aXJzdC4gV2Ugb25seSBhcHBseSB0aGUgaGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2Un
cmUgc3RpbGwgdG9vIHNtYWxsLgotICAgIGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKLSAgICAg
ICAgem9vbWVkU2l6ZSA9IG1pblNpemU7Ci0KLSAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBt
aW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlzIGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxs
IHRvbyBzbWFsbAotICAgIC8vIGFmdGVyIHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRo
ZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQot
ICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5
IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVtIHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCi0gICAgLy8g
ZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0aGUgbGF5b3V0LgotICAgIGlmICh1c2VTbWFydE1pbmlt
dW1Gb3JGb250U2l6ZSAmJiB6b29tZWRTaXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmll
ZFNpemUgPj0gbWluTG9naWNhbFNpemUgfHwgIWlzQWJzb2x1dGVTaXplKSkKLSAgICAgICAgem9v
bWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXplOwotCi0gICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNv
bmFibGUgbWF4aW11bSB0byBwcmV2ZW50IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBj
cmFzaGVzIG9uIHZhcmlvdXMKLSAgICAvLyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwg
V2luZG93cy4pCi0gICAgcmV0dXJuIG1pbihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRT
aXplKTsKLX0KLQotY29uc3QgaW50IGZvbnRTaXplVGFibGVNYXggPSAxNjsKLWNvbnN0IGludCBm
b250U2l6ZVRhYmxlTWluID0gOTsKLWNvbnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKLQotLy8g
V2luSUUvTmF2NCB0YWJsZSBmb3IgZm9udCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxl
Z2FjeSBmb250IG1hcHBpbmcgc3lzdGVtIG9mIEhUTUwuCi1zdGF0aWMgY29uc3QgaW50IHF1aXJr
c0ZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0
b3RhbEtleXdvcmRzXSA9Ci17Ci0gICAgICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEs
ICAgIDE0LCAgICAxOCwgICAgMjggfSwKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAg
ICAxMiwgICAgMTUsICAgIDIwLCAgICAzMSB9LAotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAg
MTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDM0IH0sCi0gICAgICB7IDksICAgIDksICAgIDEw
LCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzcgfSwKLSAgICAgIHsgOSwgICAgOSwg
ICAgMTAsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250
IGRlZmF1bHQgKDEzKQotICAgICAgeyA5LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAy
MSwgICAgMjgsICAgIDQyIH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcs
ICAgIDIzLCAgICAzMCwgICAgNDUgfSwKLSAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAg
ICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQg
KDE2KQotfTsKLS8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAg
ICA2ICAgICAgNwotLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAg
ICAgeHhsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgICAgICAgICAg
ICAgICAgdXNlciBwcmVmCi0KLS8vIFN0cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5k
IE1vemlsbGEncyBzZXR0aW5ncyBleGFjdGx5Lgotc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250
U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxL
ZXl3b3Jkc10gPQotewotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAx
NCwgICAgMTgsICAgIDI3IH0sCi0gICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIs
ICAgIDE1LCAgICAyMCwgICAgMzAgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAg
ICAxMywgICAgMTcsICAgIDIyLCAgICAzMyB9LAotICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAg
MTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM2IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEy
LCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZh
dWx0ICgxMykKLSAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAg
IDI4LCAgICA0MiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAy
MywgICAgMzAsICAgIDQ1IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgs
ICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikK
LX07Ci0vLyBIVE1MICAgICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAg
ICAgIDcKLS8vIENTUyAgeHhzICAgeHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4
bAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAg
IHVzZXIgcHJlZgotCi0vLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJs
ZSwgd2UgdXNlIFRvZGQgRmFocm5lcidzIHN1Z2dlc3RlZCBzY2FsZQotLy8gZmFjdG9ycyBmb3Ig
ZWFjaCBrZXl3b3JkIHZhbHVlLgotc3RhdGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0
b3RhbEtleXdvcmRzXSA9IHsgMC42MGYsIDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41Ziwg
Mi4wZiwgMy4wZiB9OwotCi1mbG9hdCBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQo
RG9jdW1lbnQqIGRvY3VtZW50LCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1
bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygp
OwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxLjBmOwotCi0gICAgYm9vbCBx
dWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXpl
ID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250
U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXpl
ID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7
Ci0gICAgICAgIC8vIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZS4KLSAgICAgICAgaW50
IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWluOwotICAgICAgICBpbnQgY29sID0g
KGtleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGwpOwotICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/
IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3dd
W2NvbF07Ci0gICAgfQotCi0gICAgLy8gVmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhl
IHRhYmxlLiBBcHBseSB0aGUgc2NhbGUgZmFjdG9yIGluc3RlYWQuCi0gICAgZmxvYXQgbWluTG9n
aWNhbFNpemUgPSBtYXgoc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7Ci0g
ICAgcmV0dXJuIG1heChmb250U2l6ZUZhY3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0q
bWVkaXVtU2l6ZSwgbWluTG9naWNhbFNpemUpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgot
c3RhdGljIGludCBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBj
b25zdCBUKiB0YWJsZSwgaW50IG11bHRpcGxpZXIpCi17Ci0gICAgLy8gSWdub3JlIHRhYmxlWzBd
IGJlY2F1c2UgeHgtc21hbGwgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQg
c2l6ZS4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsK
LSAgICAgICAgaWYgKHBpeGVsRm9udFNpemUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFd
KSAqIG11bHRpcGxpZXIpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJu
IHRvdGFsS2V5d29yZHMgLSAxOwotfQotCi1pbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNp
emUoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VG
aXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5z
ZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAg
Ym9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRp
dW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4
ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRp
dW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxl
TWF4KSB7Ci0gICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsK
LSAgICAgICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRT
aXplLCBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNp
emVUYWJsZVtyb3ddLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lG
b250U2l6ZTxmbG9hdD4ocGl4ZWxGb250U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXpl
KTsKLX0KLQotc3RhdGljIENvbG9yIGNvbG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCi17
Ci0gICAgc3RydWN0IENvbG9yVmFsdWUgewotICAgICAgICBpbnQgY3NzVmFsdWVJZDsKLSAgICAg
ICAgUkdCQTMyIGNvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBj
b2xvclZhbHVlc1tdID0gewotICAgICAgICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAot
ICAgICAgICB7IENTU1ZhbHVlQmxhY2ssIDB4RkYwMDAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1
ZUJsdWUsIDB4RkYwMDAwRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAw
RkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyYXksIDB4RkY4MDgwODAgfSwKLSAgICAgICAgeyBD
U1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAwICB9LAotICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhG
RjgwODA4MCB9LAotICAgICAgICB7IENTU1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAotICAgICAg
ICB7IENTU1ZhbHVlTWFyb29uLCAweEZGODAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVOYXZ5
LCAweEZGMDAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwK
LSAgICAgICAgeyBDU1NWYWx1ZU9yYW5nZSwgMHhGRkZGQTUwMCB9LAotICAgICAgICB7IENTU1Zh
bHVlUHVycGxlLCAweEZGODAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAw
MDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAotICAgICAgICB7
IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4MCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFy
ZW50LCAweDAwMDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9
LAotICAgICAgICB7IENTU1ZhbHVlWWVsbG93LCAweEZGRkZGRjAwIH0sCi0gICAgICAgIHsgMCwg
MCB9Ci0gICAgfTsKLQotICAgIGZvciAoY29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1
ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytjb2wpIHsKLSAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJ
ZCA9PSBjc3NWYWx1ZUlkKQotICAgICAgICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7Ci0gICAgfQot
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1Zh
bHVlSWQpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVl
SXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlKQotewotICAgIGlu
dCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBj
YXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKLSAg
ICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICBjYXNlIENTU1ZhbHVlQ3VycmVu
dGNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotfQotCi1Db2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21Qcmlt
aXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmsp
IGNvbnN0Ci17Ci0gICAgaWYgKHZhbHVlLT5pc1JHQkNvbG9yKCkpCi0gICAgICAgIHJldHVybiBD
b2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7Ci0KLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOwotICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRj
aCAoaWRlbnQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBDb2xvcigpOwotICAgIGNh
c2UgQ1NTVmFsdWVXZWJraXRUZXh0OgotICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+
dGV4dENvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6Ci0gICAgICAgIHJldHVy
biAoc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5k
b2N1bWVudCgpLT52aXNpdGVkTGlua0NvbG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29s
b3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICAgICAgcmV0dXJu
IHN0YXRlLmRvY3VtZW50KCktPmFjdGl2ZUxpbmtDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVX
ZWJraXRGb2N1c1JpbmdDb2xvcjoKLSAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1Jp
bmdDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6Ci0gICAgICAgIHJldHVy
biBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBj
b2xvckZvckNTU1ZhbHVlKGlkZW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
YWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAq
IGV4cHIsIGJvb2wgcmVzdWx0KQotewotICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5
UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3Vs
dCkpKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2Uo
KSBjb25zdAotewotICAgIHVuc2lnbmVkIHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsK
LSAgICAgICAgaWYgKG1fbWVkaXVtLT5ldmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lvbikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJh
dGlvblR5cGUgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewot
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRTsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlNDQUxFX1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2Nh
bGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9Z
OwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWjsKLSAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRp
b246OlRSQU5TTEFURTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xB
VEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKLSAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWjsKLSAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFXzNEOwotICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6Uk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFU
RV9YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9ZOwotICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9aOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpST1RBVEVfM0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tl
d1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKLSAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpTS0VXX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4
VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8zRDsKLSAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJu
IFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVSU1BFQ1RJVkU7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6Tk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9O
RTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENT
U1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgaWYgKCFpblZh
bHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7Ci0gICAgICAgIG91dE9wZXJhdGlvbnMu
Y2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZsb2F0IHpvb21G
YWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29tKCkgOiAxOwotICAgIFRyYW5zZm9y
bU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkg
PSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUq
IGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLQotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqIHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihpLnZhbHVlKCkpOwotICAgICAgICBpZiAoIXRyYW5zZm9y
bVZhbHVlLT5sZW5ndGgoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJvb2wg
aGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaiA9
IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgaWYg
KCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVW
YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAg
ICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsK
LQotICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRp
b246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9y
bU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZ
VHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAg
ICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUt
Pm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNm
b3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91Ymxl
VmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RW
YWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJh
bnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAg
ICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0g
ICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7
Ci0gICAgICAgICAgICBkb3VibGUgc3ogPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3Jt
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVa
VHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0
RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVy
YXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9w
ZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5v
cGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9y
bU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxl
bmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkg
ewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29u
ZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxl
VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0
aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0g
ICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVu
Z3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZ
VHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRM
ZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZp
cnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEp
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vj
b25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBp
ZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAs
IEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoK
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zv
cm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7
Ci0gICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAg
TGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxv
YXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAg
ICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAg
ICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAg
ICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUs
IHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3Jt
T3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVu
Z3RoKCkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
dGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAgICAgICAgICAgICAgICAgICAgICAg
dHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6
b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZh
bHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR4
LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4
LCB0eSwgdHosIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogewot
ICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsK
LSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90
YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAg
ZG91YmxlIHggPSAwOwotICAgICAgICAgICAgZG91YmxlIHkgPSAwOwotICAgICAgICAgICAgZG91
YmxlIHogPSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0
ZURlZ3JlZXMoKTsKLQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRp
b24pCi0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3Rh
dGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIHogPSAxOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHks
IHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVy
YXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjog
ewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCi0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0
aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKTsKLSAgICAgICAgICAgIGRvdWJs
ZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSB5
ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgeiA9
IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUg
PSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5
LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRp
b246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3Jt
T3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGVYID0gMDsKLSAgICAgICAgICAg
IGRvdWJsZSBhbmdsZVkgPSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1
ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9w
ZXJhdGlvbikKLSAgICAgICAgICAgICAgICBhbmdsZVkgPSBhbmdsZTsKLSAgICAgICAgICAgIGVs
c2UgewotICAgICAgICAgICAgICAgIGFuZ2xlWCA9IGFuZ2xlOwotICAgICAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGFuZ2xlWSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygp
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZShhbmdsZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0
cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUt
Pmxlbmd0aCgpIDwgNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRvdWJs
ZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBi
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3Vi
bGUgYyA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAg
ZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAg
ICAgIGRvdWJsZSBlID0gem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVW
YWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
ayg1KSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwg
ZSwgZikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCAxNikKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDApKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDYpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91
YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDEwKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSkt
PmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZh
Y3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXRE
b3VibGVWYWx1ZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVu
ZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1hdHJpeCkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCBw
ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0
aCgpKQotICAgICAgICAgICAgICAgIHAgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVl
LCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2UgewotICAg
ICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4g
M2QgdHJhbnNmb3JtcyBhcmUgZmluYWxpemVkLgotICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwg
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHAgPSB2YWwg
Pj0gMCA/IExlbmd0aChjbGFtcFRvUG9zaXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0
aChVbmRlZmluZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5pc1VuZGVm
aW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3Bl
cmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9u
OjpjcmVhdGUocCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKLSAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLXN0YXRpYyBGaWx0ZXJPcGVy
YXRpb246Ok9wZXJhdGlvblR5cGUgZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkg
ewotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlv
bjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFOwotICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3Bl
cmF0aW9uOjpTRVBJQTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZp
bHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7
Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpIVUVfUk9UQVRFOwotICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFs
dWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRp
b246Ok9QQUNJVFk7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0Zp
bHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVT
UzsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlv
bjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q09OVFJBU1Q7Ci0gICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJu
IEZpbHRlck9wZXJhdGlvbjo6QkxVUjsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpE
cm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9u
OjpEUk9QX1NIQURPVzsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgY2FzZSBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmls
dGVyT3BlcmF0aW9uOjpDVVNUT007Ci0jZW5kaWYKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpOT05FOwotICAgIH0KLSAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotfQot
Ci0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotdm9pZCBTdHlsZVJlc29s
dmVyOjpsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRp
bmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hl
ZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCkt
PmNhY2hlZFJlc291cmNlTG9hZGVyKCk7Ci0gICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRp
b24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCku
b3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRp
b25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRl
ck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJP
cGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5D
RSkgewotICAgICAgICAgICAgUmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0
ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRp
b24uZ2V0KCkpOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1
ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQo
KTsKLSAgICAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICBDYWNoZWRTVkdEb2N1bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9h
ZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBTdGFzaCB0aGUg
Q2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhlIHJlZmVyZW5jZSBmaWx0ZXIuCi0gICAgICAgICAgICBy
ZWZlcmVuY2VGaWx0ZXItPnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5l
dyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShjYWNoZWREb2N1bWVudCkpKTsKLSAgICAgICAg
fQotICAgIH0KLSAgICBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKLX0KLSNl
bmRpZgotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2
ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzV2Vi
S2l0Q1NTU2hhZGVyVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxl
U2hhZGVyRnJvbVZhbHVlKHN0YXRpY19jYXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUp
KTsKLSAgICByZXR1cm4gMDsKLX0KLQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hl
ZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1
ZSkKLXsKLSAgICBTdHlsZVNoYWRlciogc2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1No
YWRlcigpOwotICAgIGlmIChzaGFkZXIgJiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKLSAg
ICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyh0cnVlKTsKLSAgICByZXR1cm4gc2hh
ZGVyOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCi17Ci0g
ICAgaWYgKCFtX3N0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRp
bmdTaGFkZXJzKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVy
KiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3Vy
Y2VMb2FkZXIoKTsKLQotICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0
ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9u
cygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUo
KTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlv
biA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24t
PmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgewotICAgICAg
ICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxD
dXN0b21GaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotICAgICAgICAg
ICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIFN0eWxlQ3Vz
dG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3JhbSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVy
UHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIGlmIChwcm9n
cmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5n
U2hhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVy
VmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhT
aGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0
VmVydGV4U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2Fk
ZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNo
YWRlcigpICYmIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7
Ci0gICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3Rh
dGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSkt
PmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRT
aGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fc3RhdGUuc2V0SGFzUGVuZGlu
Z1NoYWRlcnMoZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNv
bXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJl
ZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBiKQotewotICAgIHJldHVybiBjb2RlUG9pbnRD
b21wYXJlTGVzc1RoYW4oYS0+bmFtZSgpLCBiLT5uYW1lKCkpOwotfQotCi1QYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJh
eVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQotewot
ICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBD
dXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlcy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgewot
ICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
aSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAg
IHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1C
RVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZh
bHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJu
IGFycmF5UGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVy
KGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCi17Ci0gICAgUmVmUHRy
PEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmls
dGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUg
PSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUt
PmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBl
KCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgbnVtYmVyUGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0
RG91YmxlVmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFz
ZSgpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZl
cjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1l
LCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKLXsKLSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNm
b3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1QYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1Q
YXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlv
bnM7Ci0gICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUo
KSwgbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwotICAgIHRyYW5zZm9y
bVBhcmFtZXRlci0+c2V0T3BlcmF0aW9ucyhvcGVyYXRpb25zKTsKLSAgICByZXR1cm4gdHJhbnNm
b3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0
cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBhcmFtZXRlclZhbHVlKQotewotICAgIC8vIEZJWE1FOiBJ
bXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVycyB0eXBlcyBwYXJzaW5nLgotICAgIC8vIGJvb2xlYW5z
OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKLSAgICAvLyB0
ZXh0dXJlczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCi0g
ICAgLy8gbWF0MiwgbWF0MywgbWF0NDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNDQ0Ci0gICAgLy8gTnVtYmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRl
IGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwKLSAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVl
cyBpbmhlcml0IGZyb20gQ1NTVmFsdWVMaXN0LgotICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlz
VmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgQ1NTVmFsdWVMaXN0KiB2YWx1
ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7Ci0gICAgaWYg
KCF2YWx1ZXMtPmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChwYXJhbWV0
ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJheUZ1bmN0aW9uVmFsdWUoKSkKLSAgICAgICAgcmV0dXJu
IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8v
IElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwK
LSAgICAvLyB0aGVuIHdlIGNvdWxkIHNhZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmlu
ZyBpdGVtcwotICAgIC8vIGFyZSB0cmFuc2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9y
bVBhcmFtZXRlciB3aWxsCi0gICAgLy8gcmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGlu
Y29ycmVjdC4KLSAgICBpZiAodmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dl
YktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRl
clRyYW5zZm9ybVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOwotCi0gICAgLy8gV2UgY2FuIGhhdmUg
b25seSBhcnJheXMgb2YgYm9vbGVhbnMgb3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1
ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9zZSB0d28uCi0gICAgLy8gV2UgbmVlZCB1cCB0byA0IHZh
bHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFsbCBudW1iZXJzKS4KLSAgICBpZiAoIXZhbHVlcy0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVu
Z3RoKCkgPiA0KQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBDU1NQcmltaXRpdmVWYWx1
ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLSAgICBpZiAoZmlyc3RQcmltaXRp
dmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVS
KQotICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwg
dmFsdWVzKTsKLQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFy
YW1ldGVyIGhlcmUuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTc2NDM4Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJz
ZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3Vz
dG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYgcGFyYW1ldGVyTGlzdCkKLXsKLSAgICBIYXNoU2V0PFN0
cmluZz4ga25vd25QYXJhbWV0ZXJOYW1lczsKLSAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJh
bWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJzVmFsdWUpOwotICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVy
YXRvci5oYXNNb3JlKCk7IHBhcmFtZXRlckl0ZXJhdG9yLmFkdmFuY2UoKSkgewotICAgICAgICBp
ZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCktPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBh
cmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0
aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
PihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRp
dmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZh
bHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRl
IHBhcmFtZXRlciBuYW1lcy4KLSAgICAgICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFp
bnMobmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGtub3duUGFyYW1l
dGVyTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgp
OwotICAgICAgICAKLSAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNNb3JlKCkpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFy
YW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVy
YXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXIpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIHBhcmFtZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNl
KCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVy
cyBiZWZvcmUgcGFzc2luZyB0aGVtIGRvd24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4K
LSAgICBzdGQ6OnNvcnQocGFyYW1ldGVyTGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgp
LCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IpOwotICAgIAotICAgIHJldHVybiB0cnVl
OwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6
Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVu
dCBzdHlsZSByZXNvbHV0aW9uIGZvciB0aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5j
ZSBzeW50YXguCi0gICAgVU5VU0VEX1BBUkFNKGZpbHRlclZhbHVlKTsKLSAgICByZXR1cm4gMDsK
LX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVy
VmFsdWUqIGZpbHRlclZhbHVlKQotewotICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0
ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKLSAgICBBU1NFUlRfV0lUSF9TRUNV
UklUWV9JTVBMSUNBVElPTihzaGFkZXJzVmFsdWUtPmlzVmFsdWVMaXN0KCkpOwotICAgIENTU1Zh
bHVlTGlzdCogc2hhZGVyc0xpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJz
VmFsdWUpOwotCi0gICAgdW5zaWduZWQgc2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+
bGVuZ3RoKCk7Ci0gICAgQVNTRVJUKHNoYWRlcnNMaXN0TGVuZ3RoKTsKLQotICAgIFJlZlB0cjxT
dHlsZVNoYWRlcj4gdmVydGV4U2hhZGVyID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMCkpOwotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRT
aGFkZXI7Ci0gICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFN
X1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVYVFVSRTsKLSAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4
U2V0dGluZ3MgbWl4U2V0dGluZ3M7Ci0KLSAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7
Ci0gICAgICAgIENTU1ZhbHVlKiBmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJz
TGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKLQotICAgICAgICBpZiAoZnJhZ21lbnRT
aGFkZXJPck1peEZ1bmN0aW9uLT5pc1dlYktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgewotICAg
ICAgICAgICAgV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNf
Y2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0
aW9uKTsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0
aW9uKTsKLQotICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7Ci0gICAg
ICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOwot
ICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotCi0gICAgICAgICAgICBBU1NFUlQobWl4
RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhh
c01vcmUoKSkgewotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVW
YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7
Ci0gICAgICAgICAgICAgICAgaWYgKENTU1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkpKQotICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1v
ZGUgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2Vy
Ojppc0NvbXBvc2l0ZU9wZXJhdG9yKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKLSAgICAg
ICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZl
VmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBS
T0dSQU1fVFlQRV9OT19FTEVNRU5UX1RFWFRVUkU7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRl
ciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgCi0gICAgdW5zaWduZWQgbWVzaFJvd3MgPSAxOwotICAgIHVuc2lnbmVkIG1l
c2hDb2x1bW5zID0gMTsKLSAgICBDdXN0b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hU
eXBlQXR0YWNoZWQ7Ci0gICAgCi0gICAgQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7Ci0g
ICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IoZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0
aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyczoKLSAgICAgICAgLy8gSWYgaXQg
c3RhcnRzIHdpdGggYSBudW1iZXIgb3IgYW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBp
dCBpcyAKLSAgICAgICAgLy8gdGhlIG1lc2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBp
cyB0aGUgcGFyYW1ldGVycyBsaXN0LgotCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkg
JiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051
bWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBp
cyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0IGJvdGgKLSAgICAgICAgICAgICAgICAvLyB0aGUgcm93
cyBhbmQgdGhlIGNvbHVtbnMuCi0gICAgICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93
cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGl0ZXJh
dG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBUcnkg
dG8gbWF0Y2ggYW5vdGhlciBudW1iZXIgZm9yIHRoZSByb3dzLgotICAgICAgICAgICAgICAgIGlm
IChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAg
ICAgICAgICAgICAgICAgbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICAKLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1By
aW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRp
dmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUo
KSk7Ci0gICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVEZXRhY2hlZCkgewotICAgICAgICAgICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hl
ZDsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgewotICAg
ICAgICAgICAgLy8gSWYgbm8gdmFsdWUgd2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUs
IHRoZW4gaXQgaXMganVzdCBhIHBhcmFtZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVw
Ci0gICAgICAgICAgICAvLyBoYXZpbmcganVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBz
aGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBBU1NFUlQoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpID09IDIpOwotICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmls
dGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1
ZSkKLSAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMik7Ci0gICAgCi0gICAgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0
ZXJMaXN0OwotICAgIGlmIChwYXJhbWV0ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFy
YW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFsdWUsIHBhcmFtZXRlckxpc3QpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICAKLSAgICBSZWZQdHI8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFt
ID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2Uo
KSwgZnJhZ21lbnRTaGFkZXIucmVsZWFzZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1l
c2hUeXBlKTsKLSAgICByZXR1cm4gQ3VzdG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3Jh
bS5yZWxlYXNlKCksIHBhcmFtZXRlckxpc3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5
cGUpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZl
cjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0
ZXJWYWx1ZSkKLXsKLSAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKLSAgICBib29s
IGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKTsKLSAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVu
Y2VTeW50YXggPyBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNl
U3ludGF4KGZpbHRlclZhbHVlKSA6IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxp
bmVTeW50YXgoZmlsdGVyVmFsdWUpOwotfQotCi0jZW5kaWYKLQotYm9vbCBTdHlsZVJlc29sdmVy
OjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSog
c3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJh
dGlvbnMpCi17Ci0gICAgQVNTRVJUKG91dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKLSAgICAKLSAg
ICBpZiAoIWluVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAoaW5W
YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7
Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpblZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBmbG9hdCB6b29t
RmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpIDogMTsKLSAgICBGaWx0ZXJP
cGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0g
aW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBj
dXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENT
U0ZpbHRlclZhbHVlKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJW
YWx1ZSo+KGkudmFsdWUoKSk7Ci0gICAgICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlw
ZSBvcGVyYXRpb25UeXBlID0gZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKTsKLQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgaWYgKG9w
ZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7Ci0gICAg
ICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2Vk
IHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVyU3R5bGUuCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChv
cGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NKSB7Ci0gICAgICAgICAgICBS
ZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0
ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUpOwotICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0g
RmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAg
ICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgQ1NTVmFsdWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0KLSAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2Vi
S2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0g
c3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKLSAgICAg
ICAgICAgIEtVUkwgdXJsID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1
bWVudFZhbHVlLT51cmwoKSk7Ci0KLSAgICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJP
cGVyYXRpb24+IG9wZXJhdGlvbiA9IFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2
Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlv
blR5cGUpOwotICAgICAgICAgICAgaWYgKFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJl
ZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgewot
ICAgICAgICAgICAgICAgIGlmICghc3ZnRG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQot
ICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3Bl
cmF0aW9uLmdldCgpLCBzdmdEb2N1bWVudFZhbHVlKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlm
IChzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKQotICAgICAgICAgICAgICAg
ICAgICBvcGVyYXRpb24tPnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5l
dyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdE
b2N1bWVudCgpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUg
cHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0aGUKLSAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Ag
c2hhZG93IHdoaWNoIGhhcyBhIFNoYWRvd1ZhbHVlIHBhcmFtZXRlci4KLSAgICAgICAgaWYgKG9w
ZXJhdGlvblR5cGUgIT0gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVykgewotICAgICAgICAg
ICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaiA9IDA7IGogPCBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAg
ICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlz
UHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZl
VmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVl
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDApKSA6IDA7Ci0gICAgICAgIHN3aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkgewotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJP
cGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVy
T3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZp
bHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IDE7Ci0gICAgICAg
ICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBh
bW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlm
IChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYW1vdW50
IC89IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91
bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjog
ewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gMDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJW
YWx1ZS0+bGVuZ3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUt
PmNvbXB1dGVEZWdyZWVzKCk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9w
ZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246
Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRp
b246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlv
bikgPyAwIDogMTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkg
ewotICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQotICAgICAg
ICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZp
bHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
Qmx1ckZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9
IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID49IDEpCi0gICAgICAgICAgICAgICAgc3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5n
dGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAg
ICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1
ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICAgICAgQ1NTVmFsdWUqIGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMCk7Ci0gICAgICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1Zh
bHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFNoYWRvd1Zh
bHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7Ci0gICAgICAg
ICAgICBJbnRQb2ludCBsb2NhdGlvbihpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUs
IHJvb3RTdHlsZSwgem9vbUZhY3RvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
dGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcikp
OwotICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAg
ICAgIENvbG9yIGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQotICAgICAgICAg
ICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkp
OwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRv
d0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkg
PyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBl
bmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSogcGVuZGluZ0ltYWdlKQotewotICAgIENhY2hl
ZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQo
KS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0lt
YWdlVmFsdWUoKSkgewotICAgICAgICBDU1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGlu
Z0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNo
ZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJ
bWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0ltYWdlR2VuZXJh
dG9yVmFsdWUqIGltYWdlR2VuZXJhdG9yVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2Vu
ZXJhdG9yVmFsdWUoKTsKLSAgICAgICAgaW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdl
cyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZElt
YWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0b3JWYWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRp
bmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0N1cnNvckltYWdl
VmFsdWUqIGN1cnNvckltYWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFs
dWUoKTsKLSAgICAgICAgcmV0dXJuIGN1cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hl
ZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAg
ICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCkpIHsKLSAgICAgICAgQ1NTSW1h
Z2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1
ZSgpOwotICAgICAgICByZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVk
UmVzb3VyY2VMb2FkZXIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZXMoKQotewotICAgIGlmIChtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBt
X3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5lbmQoKS5rZXlzKCk7Ci0gICAgZm9yIChQ
ZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0
KSB7Ci0gICAgICAgIENTU1Byb3BlcnR5SUQgY3VycmVudFByb3BlcnR5ID0gKml0OwotCi0gICAg
ICAgIHN3aXRjaCAoY3VycmVudFByb3BlcnR5KSB7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kSW1hZ2U6IHsKLSAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5k
TGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dy
b3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgewot
ICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3Vu
ZExheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBi
YWNrZ3JvdW5kTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5
bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkpKSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3Bl
cnR5Q29udGVudDogewotICAgICAgICAgICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEg
PSBjb25zdF9jYXN0PENvbnRlbnREYXRhKj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgp
KTsgY29udGVudERhdGE7IGNvbnRlbnREYXRhID0gY29udGVudERhdGEtPm5leHQoKSkgewotICAg
ICAgICAgICAgICAgIGlmIChjb250ZW50RGF0YS0+aXNJbWFnZSgpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIFN0eWxlSW1hZ2UqIGltYWdlID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+
KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5p
c1BlbmRpbmdJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJ
bWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVu
ZGluZ0ltYWdlKj4oaW1hZ2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJ
bWFnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRl
bnREYXRhKj4oY29udGVudERhdGEpLT5zZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1
cnNvcjogewotICAgICAgICAgICAgaWYgKEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRl
LnN0eWxlKCktPmN1cnNvcnMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgQ3Vy
c29yRGF0YSYgY3VycmVudEN1cnNvciA9IGN1cnNvckxpc3QtPmF0KGkpOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoU3R5bGVJbWFnZSogaW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5k
aW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKLSAgICAg
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5
bGVJbWFnZTogewotICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1h
Z2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdl
KCkpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShs
b2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5z
dHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOiB7Ci0gICAgICAg
ICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUu
c3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAg
ICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5n
SW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJv
cmRlckltYWdlU291cmNlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVjdDogewotICAgICAgICAgICAgaWYg
KFN0eWxlUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVj
dCgpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9
IHJlZmxlY3Rpb24tPm1hc2soKTsKLSAgICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdl
KCkgJiYgbWFza0ltYWdlLmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7Ci0g
ICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9h
ZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNrSW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZp
bGwoKSwgbWFza0ltYWdlLmJvcmRlclNsaWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJ
bWFnZS5ob3Jpem9udGFsUnVsZSgpLCBtYXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
fQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7Ci0g
ICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBt
X3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxv
YWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0
eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogewotICAgICAg
ICAgICAgZm9yIChGaWxsTGF5ZXIqIG1hc2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNz
TWFza0xheWVycygpOyBtYXNrTGF5ZXI7IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKG1hc2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmlt
YWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+
c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+
KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJv
cGVydGllcygpLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdS
ZXNvdXJjZXMoKQotewotICAgIC8vIFN0YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkg
dGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ0ltYWdlcygpOwotCi0jaWYgRU5BQkxFKENTU19T
SEFERVJTKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0
aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU2hhZGVycygpOwotI2VuZGlmCi0gICAgCi0jaWYg
RU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcg
dGhlIFNWRyBEb2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5k
aW5nU1ZHRG9jdW1lbnRzKCk7Ci0jZW5kaWYKLX0KLQotaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVkUHJvcGVydGllcygpCi0gICAgOiBwb3NzaWJseVBhZGRl
ZE1lbWJlcigwKQotewotfQotCi1pbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRp
ZXM6On5NYXRjaGVkUHJvcGVydGllcygpCi17Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9y
eU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2Jq
ZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVt
YmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0aWVzIik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGlu
Zm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAg
IGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQcm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsK
LSAgICBpbmZvLmFkZE1lbWJlcihyYW5nZXMsICJyYW5nZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihyZW5kZXJTdHlsZSwgInJlbmRlclN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIocGFyZW50
UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5kZXJTdHlsZSIpOwotfQotCi12b2lkIE1lZGlhUXVlcnlS
ZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdElu
Zm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywg
dGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZXhw
cmVzc2lvbiwgImV4cHJlc3Npb24iKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRN
ZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewot
ICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVN
ZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNl
dHMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNS
dWxlTWFwIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAi
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ciIpOwotCi0gICAgaW5mby5hZGRNZW1iZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKLSAgICBpbmZv
LmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7Ci0gICAg
aW5mby5hZGRNZW1iZXIobV9kb2N1bWVudCwgImRvY3VtZW50Iik7Ci0KLSAgICBpbmZvLmFkZE1l
bWJlcihtX2ZvbnRTZWxlY3RvciwgImZvbnRTZWxlY3RvciIpOwotICAgIGluZm8uYWRkTWVtYmVy
KG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50
TWVkaWFRdWVyeVJlc3VsdHMiKTsKLSAgICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRl
cik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKLSAgICBp
bmZvLmFkZE1lbWJlcihtX3Njb3BlUmVzb2x2ZXIsICJzY29wZVJlc29sdmVyIik7Ci0KLSAgICBp
bmZvLmFkZE1lbWJlcihtX3N0YXRlLCAic3RhdGUiKTsKLQotICAgIC8vIEZJWE1FOiBtb3ZlIHRo
aXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPwotICAgIGlu
Zm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVs
dFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZh
dWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0UXVpcmtzU3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRT
dHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1bHRWaWV3U291cmNlU3R5bGUiKTsKIH0KIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVj
dG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9y
LmgJKHJldmlzaW9uIDE0NTE4MSkJKGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2
ZXIuaDoxNDUxODEpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5
OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0
LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgU3R5bGVSZXNvbHZlcl9oCisjZGVmaW5lIFN0
eWxlUmVzb2x2ZXJfaAorCisjaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKKyNpbmNsdWRlICJDU1NU
b1N0eWxlTWFwLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1l
bnRSdWxlU2V0cy5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuaCIKKyNpbmNs
dWRlICJMaW5rSGFzaC5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKKyNpbmNsdWRlICJS
ZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmgiCisjaW5jbHVkZSAiUnVsZVNl
dC5oIgorI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTY3Jv
bGxUeXBlcy5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgorI2luY2x1ZGUgIlNlbGVj
dG9yRmlsdGVyLmgiCisjaW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCisjaW5jbHVkZSAi
U3R5bGVTY29wZVJlc29sdmVyLmgiCisjaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgi
CisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIldlYktp
dENTU1NWR0RvY3VtZW50VmFsdWUuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+
CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2gu
aD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworZW51bSBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgeyBEb05vdFVzZVNtYXJ0TWluaW11
bUZvckZvbnRTaXplLCBVc2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSB9OworCitjbGFzcyBDU1ND
dXJzb3JJbWFnZVZhbHVlOworY2xhc3MgQ1NTRm9udFNlbGVjdG9yOworY2xhc3MgQ1NTRm9udEZh
Y2U7CitjbGFzcyBDU1NGb250RmFjZVJ1bGU7CitjbGFzcyBDU1NJbWFnZUdlbmVyYXRvclZhbHVl
OworY2xhc3MgQ1NTSW1hZ2VTZXRWYWx1ZTsKK2NsYXNzIENTU0ltYWdlVmFsdWU7CitjbGFzcyBD
U1NQYWdlUnVsZTsKK2NsYXNzIENTU1ByaW1pdGl2ZVZhbHVlOworY2xhc3MgQ1NTUHJvcGVydHk7
CitjbGFzcyBDU1NSdWxlTGlzdDsKK2NsYXNzIENTU1NlbGVjdG9yOworY2xhc3MgQ1NTU3R5bGVT
aGVldDsKK2NsYXNzIENTU1ZhbHVlOworY2xhc3MgQ29udGFpbmVyTm9kZTsKK2NsYXNzIEN1c3Rv
bUZpbHRlck9wZXJhdGlvbjsKK2NsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlcjsKK2NsYXNzIEN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3Q7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIEVsZW1lbnQ7
CitjbGFzcyBGcmFtZTsKK2NsYXNzIEZyYW1lVmlldzsKK2NsYXNzIEtVUkw7CitjbGFzcyBLZXlm
cmFtZUxpc3Q7CitjbGFzcyBLZXlmcmFtZVZhbHVlOworY2xhc3MgTWVkaWFRdWVyeUV2YWx1YXRv
cjsKK2NsYXNzIE5vZGU7CitjbGFzcyBSZW5kZXJSZWdpb247CitjbGFzcyBSZW5kZXJTY3JvbGxi
YXI7CitjbGFzcyBSdWxlRGF0YTsKK2NsYXNzIFJ1bGVTZXQ7CitjbGFzcyBTZXR0aW5nczsKK2Ns
YXNzIFN0YXRpY0NTU1J1bGVMaXN0OworY2xhc3MgU3R5bGVCdWlsZGVyOworY2xhc3MgU3R5bGVT
Y29wZVJlc29sdmVyOworY2xhc3MgU3R5bGVJbWFnZTsKK2NsYXNzIFN0eWxlS2V5ZnJhbWU7Citj
bGFzcyBTdHlsZVBlbmRpbmdJbWFnZTsKK2NsYXNzIFN0eWxlUHJvcGVydHlTZXQ7CitjbGFzcyBT
dHlsZVJ1bGU7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCitjbGFzcyBTdHlsZVJ1bGVIb3N0Owor
I2VuZGlmCitjbGFzcyBTdHlsZVJ1bGVLZXlmcmFtZXM7CitjbGFzcyBTdHlsZVJ1bGVQYWdlOwor
Y2xhc3MgU3R5bGVSdWxlUmVnaW9uOworY2xhc3MgU3R5bGVTaGFkZXI7CitjbGFzcyBTdHlsZVNo
ZWV0OworY2xhc3MgU3R5bGVTaGVldExpc3Q7CitjbGFzcyBTdHlsZWRFbGVtZW50OworY2xhc3Mg
Vmlld3BvcnRTdHlsZVJlc29sdmVyOworY2xhc3MgV2ViS2l0Q1NTRmlsdGVyVmFsdWU7CitjbGFz
cyBXZWJLaXRDU1NTaGFkZXJWYWx1ZTsKK2NsYXNzIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU7
CisKK2NsYXNzIE1lZGlhUXVlcnlSZXN1bHQgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE1l
ZGlhUXVlcnlSZXN1bHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBN
ZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAmIGV4cHIsIGJvb2wgcmVzdWx0KQor
ICAgICAgICA6IG1fZXhwcmVzc2lvbihleHByKQorICAgICAgICAsIG1fcmVzdWx0KHJlc3VsdCkK
KyAgICB7CisgICAgfQorICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5m
byopIGNvbnN0OworCisgICAgTWVkaWFRdWVyeUV4cCBtX2V4cHJlc3Npb247CisgICAgYm9vbCBt
X3Jlc3VsdDsKK307CisKK2VudW0gU3R5bGVTaGFyaW5nQmVoYXZpb3IgeworICAgIEFsbG93U3R5
bGVTaGFyaW5nLAorICAgIERpc2FsbG93U3R5bGVTaGFyaW5nLAorfTsKKworLy8gTWF0Y2hPbmx5
VXNlckFnZW50UnVsZXMgaXMgdXNlZCBpbiBtZWRpYSBxdWVyaWVzLCB3aGVyZSByZWxhdGl2ZSB1
bml0cworLy8gYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQgcm9vdCBl
bGVtZW50IHN0eWxlLCBhbmQgc3R5bGVkIG9ubHkKKy8vIGZyb20gdGhlIFVzZXIgQWdlbnQgU3R5
bGVzaGVldCBydWxlcy4KKworZW51bSBSdWxlTWF0Y2hpbmdCZWhhdmlvciB7CisgICAgTWF0Y2hB
bGxSdWxlcywKKyAgICBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCwKKyAgICBNYXRjaE9ubHlV
c2VyQWdlbnRSdWxlcywKK307CisKK2NsYXNzIFBzZXVkb1N0eWxlUmVxdWVzdCB7CitwdWJsaWM6
CisgICAgUHNldWRvU3R5bGVSZXF1ZXN0KFBzZXVkb0lkIHBzZXVkb0lkLCBSZW5kZXJTY3JvbGxi
YXIqIHNjcm9sbGJhciA9IDAsIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydCA9IE5vUGFydCkK
KyAgICAgICAgOiBwc2V1ZG9JZChwc2V1ZG9JZCkKKyAgICAgICAgLCBzY3JvbGxiYXJQYXJ0KHNj
cm9sbGJhclBhcnQpCisgICAgICAgICwgc2Nyb2xsYmFyKHNjcm9sbGJhcikKKyAgICB7CisgICAg
fQorCisgICAgUHNldWRvSWQgcHNldWRvSWQ7CisgICAgU2Nyb2xsYmFyUGFydCBzY3JvbGxiYXJQ
YXJ0OworICAgIFJlbmRlclNjcm9sbGJhciogc2Nyb2xsYmFyOworfTsKKworY2xhc3MgTWF0Y2hS
ZXF1ZXN0IHsKK3B1YmxpYzoKKyAgICBNYXRjaFJlcXVlc3QoUnVsZVNldCogcnVsZVNldCwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcyA9IGZhbHNlLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSA9
IDAsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFy
eSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgICAgIDogcnVs
ZVNldChydWxlU2V0KQorICAgICAgICAsIGluY2x1ZGVFbXB0eVJ1bGVzKGluY2x1ZGVFbXB0eVJ1
bGVzKQorICAgICAgICAsIHNjb3BlKHNjb3BlKQorICAgICAgICAsIGJlaGF2aW9yQXRCb3VuZGFy
eShiZWhhdmlvckF0Qm91bmRhcnkpIHsgfQorICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVTZXQ7Cisg
ICAgY29uc3QgYm9vbCBpbmNsdWRlRW1wdHlSdWxlczsKKyAgICBjb25zdCBDb250YWluZXJOb2Rl
KiBzY29wZTsKKyAgICBjb25zdCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBi
ZWhhdmlvckF0Qm91bmRhcnk7Cit9OworCisvLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBSZW5kZXJT
dHlsZSBmb3IgYSBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBzdHlsZXNo
ZWV0cy4KK2NsYXNzIFN0eWxlUmVzb2x2ZXIgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0
eWxlUmVzb2x2ZXIpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBTdHls
ZVJlc29sdmVyKERvY3VtZW50KiwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpOworICAg
IH5TdHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBVc2luZyB0aGVzZSBkdXJpbmcgdHJlZSB3YWxr
IHdpbGwgYWxsb3cgc3R5bGUgc2VsZWN0b3IgdG8gb3B0aW1pemUgY2hpbGQgYW5kIGRlc2NlbmRh
bnQgc2VsZWN0b3IgbG9va3Vwcy4KKyAgICB2b2lkIHB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQq
KTsKKyAgICB2b2lkIHBvcFBhcmVudEVsZW1lbnQoRWxlbWVudCopOworICAgIHZvaWQgcHVzaFBh
cmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOworICAgIHZvaWQgcG9wUGFyZW50U2hh
ZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAg
dm9pZCBhZGRIb3N0UnVsZShTdHlsZVJ1bGVIb3N0KiBydWxlLCBib29sIGhhc0RvY3VtZW50U2Vj
dXJpdHlPcmlnaW4sIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlKSB7IGVuc3VyZVNjb3BlUmVz
b2x2ZXIoKS0+YWRkSG9zdFJ1bGUocnVsZSwgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgc2Nv
cGUpOyB9CisjZW5kaWYKKworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRWxl
bWVudChFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgU3R5bGVTaGFyaW5n
QmVoYXZpb3IgPSBBbGxvd1N0eWxlU2hhcmluZywKKyAgICAgICAgUnVsZU1hdGNoaW5nQmVoYXZp
b3IgPSBNYXRjaEFsbFJ1bGVzLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsK
KworICAgIHZvaWQga2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCosIGNvbnN0IFJl
bmRlclN0eWxlKiwgS2V5ZnJhbWVMaXN0Jik7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBwc2V1ZG9TdHlsZUZvckVsZW1lbnQoRWxlbWVudCosIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVz
dCYsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRleCk7CisgICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5
bGU+IHN0eWxlRm9yVGV4dChUZXh0Kik7CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gc3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCosIENTU0ZvbnRTZWxlY3RvciogPSAwKTsK
KworICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuc3R5bGUo
KTsgfQorICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3Rh
dGUucGFyZW50U3R5bGUoKTsgfQorICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkg
Y29uc3QgeyByZXR1cm4gbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCk7IH0KKyAgICBFbGVtZW50
KiBlbGVtZW50KCkgeyByZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCk7IH0KKyAgICBEb2N1bWVudCog
ZG9jdW1lbnQoKSB7IHJldHVybiBtX2RvY3VtZW50OyB9CisgICAgU3R5bGVTY29wZVJlc29sdmVy
KiBzY29wZVJlc29sdmVyKCkgY29uc3QgeyByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOyB9
CisgICAgYm9vbCBoYXNQYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnRO
b2RlKCk7IH0KKworICAgIC8vIEZJWE1FOiBJdCBjb3VsZCBiZSBiZXR0ZXIgdG8gY2FsbCBtX3J1
bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKCkgZGlyZWN0bHkgYWZ0ZXIgd2UgZmFjdG9y
IFN0eWxlUnNvbHZlciBmdXJ0aGVyLgorICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xMDg4OTAKKyAgICB2b2lkIGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVu
c2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mKTsK
KworICAgIERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsg
fQorICAgIGNvbnN0IERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4g
bV9ydWxlU2V0czsgfQorCisjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURP
V19ET00pCisgICAgU3R5bGVTY29wZVJlc29sdmVyKiBlbnN1cmVTY29wZVJlc29sdmVyKCkKKyAg
ICB7CisjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAg
ICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSB8
fCBSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVuYWJsZWQoKSk7CisjZWxzZQor
ICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVk
KCkpOworI2VuZGlmCisjZWxzZQorICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJl
czo6c2hhZG93RE9NRW5hYmxlZCgpKTsKKyNlbmRpZgorICAgICAgICBpZiAoIW1fc2NvcGVSZXNv
bHZlcikKKyAgICAgICAgICAgIG1fc2NvcGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVNj
b3BlUmVzb2x2ZXIoKSk7CisgICAgICAgIHJldHVybiBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCk7Cisg
ICAgfQorI2VuZGlmCisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7
CisgICAgUmVuZGVyU3R5bGUqIGxvY2F0ZVNoYXJlZFN0eWxlKCk7CisgICAgYm9vbCBzdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChSdWxlU2V0Kik7CisgICAgYm9vbCBzdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCk7CisgICAgTm9kZSogbG9jYXRlQ291c2lu
TGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdDsK
KyAgICBTdHlsZWRFbGVtZW50KiBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiwgdW5z
aWduZWQmIGNvdW50KSBjb25zdDsKKyAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChT
dHlsZWRFbGVtZW50KikgY29uc3Q7CisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHls
ZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgU3R5bGVLZXlmcmFtZSosIEtl
eWZyYW1lVmFsdWUmKTsKKworcHVibGljOgorICAgIC8vIFRoZXNlIG1ldGhvZHMgd2lsbCBnaXZl
IGJhY2sgdGhlIHNldCBvZiBydWxlcyB0aGF0IG1hdGNoZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudCAo
b3IgYSBwc2V1ZG8tZWxlbWVudCkuCisgICAgZW51bSBDU1NSdWxlRmlsdGVyIHsKKyAgICAgICAg
VUFBbmRVc2VyQ1NTUnVsZXMgICA9IDEgPDwgMSwKKyAgICAgICAgQXV0aG9yQ1NTUnVsZXMgICAg
ICA9IDEgPDwgMiwKKyAgICAgICAgRW1wdHlDU1NSdWxlcyAgICAgICA9IDEgPDwgMywKKyAgICAg
ICAgQ3Jvc3NPcmlnaW5DU1NSdWxlcyA9IDEgPDwgNCwKKyAgICAgICAgQWxsQnV0RW1wdHlDU1NS
dWxlcyA9IFVBQW5kVXNlckNTU1J1bGVzIHwgQXV0aG9yQ1NTUnVsZXMgfCBDcm9zc09yaWdpbkNT
U1J1bGVzLAorICAgICAgICBBbGxDU1NSdWxlcyAgICAgICAgID0gQWxsQnV0RW1wdHlDU1NSdWxl
cyB8IEVtcHR5Q1NTUnVsZXMsCisgICAgfTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBz
dHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBB
bGxCdXRFbXB0eUNTU1J1bGVzKTsKKyAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBwc2V1ZG9T
dHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiwgUHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9J
bmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7CisKKyAgICAvLyBHaXZlbiBhIENTUyBrZXl3
b3JkIGluIHRoZSByYW5nZSAoeHgtc21hbGwgdG8gLXdlYmtpdC14eHgtbGFyZ2UpLCB0aGlzIGZ1
bmN0aW9uIHdpbGwgcmV0dXJuCisgICAgLy8gdGhlIGNvcnJlY3QgZm9udCBzaXplIHNjYWxlZCBy
ZWxhdGl2ZSB0byB0aGUgdXNlcidzIGRlZmF1bHQgKG1lZGl1bSkuCisgICAgc3RhdGljIGZsb2F0
IGZvbnRTaXplRm9yS2V5d29yZChEb2N1bWVudCosIGludCBrZXl3b3JkLCBib29sIHNob3VsZFVz
ZUZpeGVkRGVmYXVsdFNpemUpOworCisgICAgLy8gR2l2ZW4gYSBmb250IHNpemUgaW4gcGl4ZWws
IHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gbGVnYWN5IGZvbnQgc2l6ZSBiZXR3ZWVuIDEgYW5k
IDcuCisgICAgc3RhdGljIGludCBsZWdhY3lGb250U2l6ZShEb2N1bWVudCosIGludCBwaXhlbEZv
bnRTaXplLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpOworCitwdWJsaWM6CisgICAg
dm9pZCBhcHBseVByb3BlcnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFJlbmRl
clN0eWxlKik7CisKKyAgICB2b2lkIGFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9w
ZXJ0eUlELCBDU1NWYWx1ZSopOworCisgICAgdm9pZCB1cGRhdGVGb250KCk7CisgICAgdm9pZCBp
bml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKik7CisKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29t
cHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBmbG9hdCB6b29tRmFjdG9yLCBi
b29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9y
Rm9udFNpemUgPSBVc2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSk7CisKKyAgICB2b2lkIHNldEZv
bnRTaXplKEZvbnREZXNjcmlwdGlvbiYsIGZsb2F0IHNpemUpOworCitwcml2YXRlOgorICAgIHN0
YXRpYyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIFJl
bmRlclN0eWxlKiwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9v
bCB1c2VTVkdab29tUnVsZXMpOworCitwdWJsaWM6CisgICAgYm9vbCB1c2VTVkdab29tUnVsZXMo
KTsKKworICAgIHN0YXRpYyBib29sIGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJv
bUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqKTsKKyAgICBDb2xvciBjb2xvckZyb21QcmltaXRp
dmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSosIGJvb2wgZm9yVmlzaXRlZExpbmsgPSBmYWxzZSkg
Y29uc3Q7CisKKyAgICBib29sIGhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJikg
Y29uc3Q7CisgICAgYm9vbCBoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYp
IGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3Ry
aW5nJikgY29uc3Q7CisKKyAgICBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0
IHsgcmV0dXJuIG1fZm9udFNlbGVjdG9yLmdldCgpOyB9CisjaWYgRU5BQkxFKENTU19ERVZJQ0Vf
QURBUFRBVElPTikKKyAgICBWaWV3cG9ydFN0eWxlUmVzb2x2ZXIqIHZpZXdwb3J0U3R5bGVSZXNv
bHZlcigpIHsgcmV0dXJuIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyLmdldCgpOyB9CisjZW5kaWYK
KworICAgIHZvaWQgYWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1l
ZGlhUXVlcnlFeHAqLCBib29sIHJlc3VsdCk7CisgICAgYm9vbCBoYXNWaWV3cG9ydERlcGVuZGVu
dE1lZGlhUXVlcmllcygpIGNvbnN0IHsgcmV0dXJuICFtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFR
dWVyeVJlc3VsdHMuaXNFbXB0eSgpOyB9CisgICAgYm9vbCBhZmZlY3RlZEJ5Vmlld3BvcnRDaGFu
Z2UoKSBjb25zdDsKKworICAgIHZvaWQgYWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxl
UnVsZUtleWZyYW1lcz4pOworCisgICAgYm9vbCBjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJl
Z2lvbkVsZW1lbnQpOworCisgICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1
cm4gIW1fcnVsZVNldHMuZmVhdHVyZXMoKS5zaWJsaW5nUnVsZXMuaXNFbXB0eSgpOyB9CisgICAg
Ym9vbCB1c2VzRmlyc3RMaW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1
cmVzKCkudXNlc0ZpcnN0TGluZVJ1bGVzOyB9CisgICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxl
cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS51c2VzQmVmb3JlQWZ0ZXJS
dWxlczsgfQorCisgICAgc3RhdGljIGJvb2wgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NW
YWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOworICAgIAorICAgIHZvaWQg
aW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKKworI2lmIEVOQUJMRShDU1NfRklM
VEVSUykKKyAgICBib29sIGNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUs
IFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJPcGVy
YXRpb25zJiBvdXRPcGVyYXRpb25zKTsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgU3R5
bGVTaGFkZXIqIHN0eWxlU2hhZGVyKENTU1ZhbHVlKik7CisgICAgU3R5bGVTaGFkZXIqIGNhY2hl
ZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKik7Cisg
ICAgYm9vbCBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqLCBDdXN0b21G
aWx0ZXJQYXJhbWV0ZXJMaXN0Jik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0
ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFs
dWUqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21G
aWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOwor
ICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlck51
bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBh
c3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9y
bVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOworICAgIFBhc3NS
ZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25X
aXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7CisgICAgUGFz
c1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlv
bldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRy
PEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktp
dENTU0ZpbHRlclZhbHVlKik7CisgICAgdm9pZCBsb2FkUGVuZGluZ1NoYWRlcnMoKTsKKyNlbmRp
ZgorI2lmIEVOQUJMRShTVkcpCisgICAgdm9pZCBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOwor
I2VuZGlmCisjZW5kaWYgLy8gRU5BQkxFKENTU19GSUxURVJTKQorCisgICAgdm9pZCBsb2FkUGVu
ZGluZ1Jlc291cmNlcygpOworCitwcml2YXRlOgorICAgIC8vIFRoaXMgZnVuY3Rpb24gZml4ZXMg
dXAgdGhlIGRlZmF1bHQgZm9udCBzaXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgY3VycmVudCBn
ZW5lcmljIGZvbnQgZmFtaWx5IGhhcyBjaGFuZ2VkLiAtZHdoCisgICAgdm9pZCBjaGVja0Zvckdl
bmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUp
OworICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlKTsKKworICAgIHZvaWQgYWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUq
IHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCopOworCisg
ICAgc3RydWN0IFJ1bGVSYW5nZSB7CisgICAgICAgIFJ1bGVSYW5nZShpbnQmIGZpcnN0UnVsZUlu
ZGV4LCBpbnQmIGxhc3RSdWxlSW5kZXgpOiBmaXJzdFJ1bGVJbmRleChmaXJzdFJ1bGVJbmRleCks
IGxhc3RSdWxlSW5kZXgobGFzdFJ1bGVJbmRleCkgeyB9CisgICAgICAgIGludCYgZmlyc3RSdWxl
SW5kZXg7CisgICAgICAgIGludCYgbGFzdFJ1bGVJbmRleDsKKyAgICB9OworCisgICAgc3RydWN0
IE1hdGNoUmFuZ2VzIHsKKyAgICAgICAgTWF0Y2hSYW5nZXMoKSA6IGZpcnN0VUFSdWxlKC0xKSwg
bGFzdFVBUnVsZSgtMSksIGZpcnN0QXV0aG9yUnVsZSgtMSksIGxhc3RBdXRob3JSdWxlKC0xKSwg
Zmlyc3RVc2VyUnVsZSgtMSksIGxhc3RVc2VyUnVsZSgtMSkgeyB9CisgICAgICAgIGludCBmaXJz
dFVBUnVsZTsKKyAgICAgICAgaW50IGxhc3RVQVJ1bGU7CisgICAgICAgIGludCBmaXJzdEF1dGhv
clJ1bGU7CisgICAgICAgIGludCBsYXN0QXV0aG9yUnVsZTsKKyAgICAgICAgaW50IGZpcnN0VXNl
clJ1bGU7CisgICAgICAgIGludCBsYXN0VXNlclJ1bGU7CisgICAgICAgIFJ1bGVSYW5nZSBVQVJ1
bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVBUnVsZSwgbGFzdFVBUnVsZSk7IH0K
KyAgICAgICAgUnVsZVJhbmdlIGF1dGhvclJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShm
aXJzdEF1dGhvclJ1bGUsIGxhc3RBdXRob3JSdWxlKTsgfQorICAgICAgICBSdWxlUmFuZ2UgdXNl
clJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVzZXJSdWxlLCBsYXN0VXNlclJ1
bGUpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGllcyB7CisgICAgICAg
IE1hdGNoZWRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH5NYXRjaGVkUHJvcGVydGllcygpOworICAg
ICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKyAg
ICAgICAgCisgICAgICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiBwcm9wZXJ0aWVzOworICAg
ICAgICB1bmlvbiB7CisgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHVuc2ln
bmVkIGxpbmtNYXRjaFR5cGUgOiAyOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHdoaXRlbGlz
dFR5cGUgOiAyOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vIFVzZWQgdG8gbWFrZSBz
dXJlIGFsbCBtZW1vcnkgaXMgemVyby1pbml0aWFsaXplZCBzaW5jZSB3ZSBjb21wdXRlIHRoZSBo
YXNoIG92ZXIgdGhlIGJ5dGVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAgICAgICAgdm9pZCogcG9z
c2libHlQYWRkZWRNZW1iZXI7CisgICAgICAgIH07CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRj
aFJlc3VsdCB7CisgICAgICAgIE1hdGNoUmVzdWx0KCkgOiBpc0NhY2hlYWJsZSh0cnVlKSB7IH0K
KyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzLCA2ND4gbWF0Y2hlZFByb3BlcnRpZXM7
CisgICAgICAgIFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0Y2hlZFJ1bGVzOworICAgICAgICBN
YXRjaFJhbmdlcyByYW5nZXM7CisgICAgICAgIGJvb2wgaXNDYWNoZWFibGU7CisgICAgfTsKKwor
ICAgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiA9IDAsIHVuc2lnbmVkIGxp
bmtNYXRjaFR5cGUgPSBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoQWxsLCBQcm9wZXJ0eVdoaXRlbGlz
dFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOworICAgIHZvaWQgYWRkRWxlbWVudFN0eWxl
UHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqLCBib29sIGlz
Q2FjaGVhYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lkIG1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQm
LCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0
Y2hSZXN1bHQmKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQq
KTsKKyAgICB2b2lkIG1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBp
bmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNo
UmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaEhvc3RSdWxl
cyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworCisgICAgdm9pZCBjb2xs
ZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2
b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1
bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZl
Y3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKKworICAg
IGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVEYXRhJikgY29uc3Q7CisgICAgdm9p
ZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisgICAgdm9pZCBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVs
ZXMoTWF0Y2hSZXN1bHQmKTsKKworICAgIGJvb2wgcnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEm
LCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmLCBTZWxlY3RvckNoZWNrZXI6
OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRh
cnkpOworICAgIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVn
aW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOworICAgIHZvaWQgYXBwbHlNYXRj
aGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGNvbnN0IEVsZW1lbnQqKTsKKyAgICBl
bnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAg
ICAgICAgVmFyaWFibGVEZWZpbml0aW9ucywKKyNlbmRpZgorICAgICAgICBIaWdoUHJpb3JpdHlQ
cm9wZXJ0aWVzLAorICAgICAgICBMb3dQcmlvcml0eVByb3BlcnRpZXMKKyAgICB9OworICAgIHRl
bXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgorICAgIHZvaWQgYXBwbHlNYXRjaGVk
UHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGJvb2wgaW1wb3J0YW50LCBpbnQgc3RhcnRJ
bmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9ubHkpOworICAgIHRlbXBsYXRlIDxT
dHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgorICAgIHZvaWQgYXBwbHlQcm9wZXJ0aWVzKGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSosIGJvb2wgaXNJbXBvcnRh
bnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlX
aGl0ZWxpc3ROb25lKTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICB2b2lkIHJlc29s
dmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBWZWN0b3I8c3RkOjpwYWlyPENT
U1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNzaW9ucyk7CisjZW5kaWYKKyAgICBz
dGF0aWMgYm9vbCBpc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEKTsKKyNp
ZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEN1ZVN0eWxlUHJv
cGVydHkoQ1NTUHJvcGVydHlJRCk7CisjZW5kaWYKKyAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzKE1h
dGNoUmVzdWx0JiwgUnVsZVNldCosIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwg
Y29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlc0Zvckxpc3Qo
VmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVS
dWxlUGFnZSo+JiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJp
bmcmIHBhZ2VOYW1lKTsKKyAgICBTZXR0aW5ncyogZG9jdW1lbnRTZXR0aW5ncygpIHsgcmV0dXJu
IG1fZG9jdW1lbnQtPnNldHRpbmdzKCk7IH0KKworICAgIGJvb2wgaXNMZWZ0UGFnZShpbnQgcGFn
ZUluZGV4KSBjb25zdDsKKyAgICBib29sIGlzUmlnaHRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0
IHsgcmV0dXJuICFpc0xlZnRQYWdlKHBhZ2VJbmRleCk7IH0KKyAgICBib29sIGlzRmlyc3RQYWdl
KGludCBwYWdlSW5kZXgpIGNvbnN0OworICAgIFN0cmluZyBwYWdlTmFtZShpbnQgcGFnZUluZGV4
KSBjb25zdDsKKworICAgIERvY3VtZW50UnVsZVNldHMgbV9ydWxlU2V0czsKKworICAgIHR5cGVk
ZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4g
PiBLZXlmcmFtZXNSdWxlTWFwOworICAgIEtleWZyYW1lc1J1bGVNYXAgbV9rZXlmcmFtZXNSdWxl
TWFwOworCitwdWJsaWM6CisgICAgdHlwZWRlZiBIYXNoTWFwPENTU1Byb3BlcnR5SUQsIFJlZlB0
cjxDU1NWYWx1ZT4gPiBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDsKKyNpZiBFTkFCTEUoQ1NTX0ZJ
TFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgdHlwZWRlZiBIYXNoTWFwPEZpbHRlck9wZXJhdGlv
biosIFJlZlB0cjxXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlPiA+IFBlbmRpbmdTVkdEb2N1bWVu
dE1hcDsKKyNlbmRpZgorCisgICAgY2xhc3MgU3RhdGUgeworICAgICAgICBXVEZfTUFLRV9OT05D
T1BZQUJMRShTdGF0ZSk7CisgICAgcHVibGljOgorICAgICAgICBTdGF0ZSgpCisgICAgICAgIDog
bV9lbGVtZW50KDApCisgICAgICAgICwgbV9zdHlsZWRFbGVtZW50KDApCisgICAgICAgICwgbV9w
YXJlbnROb2RlKDApCisgICAgICAgICwgbV9wYXJlbnRTdHlsZSgwKQorICAgICAgICAsIG1fcm9v
dEVsZW1lbnRTdHlsZSgwKQorICAgICAgICAsIG1fcmVnaW9uRm9yU3R5bGluZygwKQorICAgICAg
ICAsIG1fc2FtZU9yaWdpbk9ubHkoZmFsc2UpCisgICAgICAgICwgbV9wc2V1ZG9TdHlsZVJlcXVl
c3QoTk9QU0VVRE8pCisgICAgICAgICwgbV9lbGVtZW50TGlua1N0YXRlKE5vdEluc2lkZUxpbmsp
CisgICAgICAgICwgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoZmFsc2UpCisgICAgICAg
ICwgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoZmFsc2UpCisgICAgICAgICwgbV9tb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpCisgICAgICAgICwgbV9hcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSkKKyAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0
ZWRMaW5rU3R5bGUoZmFsc2UpCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICAsIG1f
aGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpCisjZW5kaWYKKyAgICAgICAgLCBtX2xpbmVIZWlnaHRW
YWx1ZSgwKQorICAgICAgICAsIG1fZm9udERpcnR5KGZhbHNlKQorICAgICAgICAsIG1faGFzVUFB
cHBlYXJhbmNlKGZhbHNlKQorICAgICAgICAsIG1fYmFja2dyb3VuZERhdGEoQmFja2dyb3VuZEZp
bGxMYXllcikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxl
bWVudCopOworICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVt
ZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgY29uc3QgUHNldWRvU3R5bGVSZXF1
ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyksIFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAgICAgRG9jdW1l
bnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50LT5kb2N1bWVudCgpOyB9Cisg
ICAgICAgIEVsZW1lbnQqIGVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQ7IH0KKyAg
ICAgICAgU3R5bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5
bGVkRWxlbWVudDsgfQorICAgICAgICB2b2lkIHNldFN0eWxlKFBhc3NSZWZQdHI8UmVuZGVyU3R5
bGU+IHN0eWxlKSB7IG1fc3R5bGUgPSBzdHlsZTsgfQorICAgICAgICBSZW5kZXJTdHlsZSogc3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9CisgICAgICAgIFBhc3NSZWZQdHI8
UmVuZGVyU3R5bGU+IHRha2VTdHlsZSgpIHsgcmV0dXJuIG1fc3R5bGUucmVsZWFzZSgpOyB9CisK
KyAgICAgICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0KCk7CisgICAgICAgIFBh
c3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHRha2VSdWxlTGlzdCgpIHsgcmV0dXJuIG1fcnVsZUxpc3Qu
cmVsZWFzZSgpOyB9CisKKyAgICAgICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSgp
IGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50Tm9kZTsgfQorICAgICAgICB2b2lkIHNldFBhcmVudFN0
eWxlKFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkgeyBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5
bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9wYXJlbnRTdHlsZTsgfQorICAgICAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgp
IGNvbnN0IHsgcmV0dXJuIG1fcm9vdEVsZW1lbnRTdHlsZTsgfQorCisgICAgICAgIGNvbnN0IFJl
bmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZygpIGNvbnN0IHsgcmV0dXJuIG1fcmVnaW9uRm9y
U3R5bGluZzsgfQorICAgICAgICB2b2lkIHNldFNhbWVPcmlnaW5Pbmx5KGJvb2wgaXNTYW1lT3Jp
Z2luT25seSkgeyBtX3NhbWVPcmlnaW5Pbmx5ID0gaXNTYW1lT3JpZ2luT25seTsgfQorICAgICAg
ICBib29sIGlzU2FtZU9yaWdpbk9ubHkoKSBjb25zdCB7IHJldHVybiBtX3NhbWVPcmlnaW5Pbmx5
OyB9CisgICAgICAgIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0
KCkgY29uc3QgeyByZXR1cm4gbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7IH0KKyAgICAgICAgRUluc2lk
ZUxpbmsgZWxlbWVudExpbmtTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudExpbmtTdGF0
ZTsgfQorICAgICAgICBib29sIGRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpIGNvbnN0IHsg
cmV0dXJuIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50OyB9CisgICAgICAgIHZvaWQgc2V0
RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGJvb2wgaXNBZmZlY3RlZCkgeyBtX2VsZW1lbnRB
ZmZlY3RlZEJ5Q2xhc3NSdWxlcyA9IGlzQWZmZWN0ZWQ7IH0KKyAgICAgICAgYm9vbCBlbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRBZmZlY3RlZEJ5
Q2xhc3NSdWxlczsgfQorICAgICAgICB2b2lkIHNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpNb2Rl
IG1vZGUpIHsgbV9tb2RlID0gbW9kZTsgfQorICAgICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUg
bW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fbW9kZTsgfQorICAgICAgICAKKyAgICAgICAgdm9pZCBz
ZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsgfQorICAgICAgICB2b2lkIHNldEFwcGx5UHJv
cGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9wZXJ0eVRv
VmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJT
dHlsZTsgfQorICAgICAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBj
b25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7IH0KKyAgICAg
ICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAmIHBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKSB7IHJl
dHVybiBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7IH0KKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMp
ICYmIEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCYgcGVuZGluZ1NW
R0RvY3VtZW50cygpIHsgcmV0dXJuIG1fcGVuZGluZ1NWR0RvY3VtZW50czsgfQorI2VuZGlmCisj
aWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICB2b2lkIHNldEhhc1BlbmRpbmdTaGFkZXJz
KGJvb2wgaGFzUGVuZGluZ1NoYWRlcnMpIHsgbV9oYXNQZW5kaW5nU2hhZGVycyA9IGhhc1BlbmRp
bmdTaGFkZXJzOyB9CisgICAgICAgIGJvb2wgaGFzUGVuZGluZ1NoYWRlcnMoKSBjb25zdCB7IHJl
dHVybiBtX2hhc1BlbmRpbmdTaGFkZXJzOyB9CisjZW5kaWYKKworICAgICAgICB2b2lkIHNldExp
bmVIZWlnaHRWYWx1ZShDU1NWYWx1ZSogdmFsdWUpIHsgbV9saW5lSGVpZ2h0VmFsdWUgPSB2YWx1
ZTsgfQorICAgICAgICBDU1NWYWx1ZSogbGluZUhlaWdodFZhbHVlKCkgeyByZXR1cm4gbV9saW5l
SGVpZ2h0VmFsdWU7IH0KKyAgICAgICAgdm9pZCBzZXRGb250RGlydHkoYm9vbCBpc0RpcnR5KSB7
IG1fZm9udERpcnR5ID0gaXNEaXJ0eTsgfQorICAgICAgICBib29sIGZvbnREaXJ0eSgpIGNvbnN0
IHsgcmV0dXJuIG1fZm9udERpcnR5OyB9CisKKyAgICAgICAgdm9pZCBjYWNoZUJvcmRlckFuZEJh
Y2tncm91bmQoKTsKKyAgICAgICAgYm9vbCBoYXNVQUFwcGVhcmFuY2UoKSBjb25zdCB7IHJldHVy
biBtX2hhc1VBQXBwZWFyYW5jZTsgfQorICAgICAgICBCb3JkZXJEYXRhIGJvcmRlckRhdGEoKSBj
b25zdCB7IHJldHVybiBtX2JvcmRlckRhdGE7IH0KKyAgICAgICAgRmlsbExheWVyIGJhY2tncm91
bmREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kRGF0YTsgfQorICAgICAgICBDb2xv
ciBiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmRDb2xvcjsgfQor
CisgICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKCkgeyByZXR1
cm4gbV9zdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAgICAgY29uc3QgRm9udERlc2Ny
aXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3BhcmVudFN0eWxlLT5m
b250RGVzY3JpcHRpb24oKTsgfQorICAgICAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0
eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQorICAgICAgICB2b2lk
IHNldFpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRab29tKGYpOyB9
CisgICAgICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9
IG1fc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oZik7IH0KKyAgICAgICAgdm9pZCBzZXRXcml0aW5n
TW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5z
ZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KKyAgICAgICAgdm9pZCBzZXRUZXh0T3JpZW50
YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX2ZvbnREaXJ0eSB8PSBt
X3N0eWxlLT5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQorCisgICAgICAg
IFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzKCkgeyByZXR1cm4gbV9t
YXRjaGVkUnVsZXM7IH0KKyAgICAgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25zdCBSdWxlRGF0
YSogcnVsZSkgeyBtX21hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7IH0KKyAgICAgICAgCisgICAg
cHJpdmF0ZToKKyAgICAgICAgLy8gRklYTUUoYnVnIDEwODU2Myk6IHRvIG1ha2UgaXQgZWFzaWVy
IHRvIHJldmlldywgdGhlc2UgbWVtYmVyCisgICAgICAgIC8vIHZhcmlhYmxlcyBhcmUgcHVibGlj
LiBIb3dldmVyIHdlIHNob3VsZCBhZGQgbWV0aG9kcyB0byBhY2Nlc3MKKyAgICAgICAgLy8gdGhl
c2UgdmFyaWFibGVzLgorICAgICAgICBFbGVtZW50KiBtX2VsZW1lbnQ7CisgICAgICAgIFJlZlB0
cjxSZW5kZXJTdHlsZT4gbV9zdHlsZTsKKyAgICAgICAgU3R5bGVkRWxlbWVudCogbV9zdHlsZWRF
bGVtZW50OworICAgICAgICBDb250YWluZXJOb2RlKiBtX3BhcmVudE5vZGU7CisgICAgICAgIFJl
bmRlclN0eWxlKiBtX3BhcmVudFN0eWxlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9yb290RWxl
bWVudFN0eWxlOworICAgICAgICAKKyAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0
eWxpbmc7CisgICAgICAgIGJvb2wgbV9zYW1lT3JpZ2luT25seTsKKyAgICAgICAgUHNldWRvU3R5
bGVSZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0OworCisgICAgICAgIEVJbnNpZGVMaW5rIG1f
ZWxlbWVudExpbmtTdGF0ZTsKKworICAgICAgICBib29sIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlv
blBvaW50OworCisgICAgICAgIGJvb2wgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7CisK
KyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKworICAgICAgICAvLyBBIGJ1
ZmZlciB1c2VkIHRvIGhvbGQgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIGZvciBhbiBlbGVtZW50
LAorICAgICAgICAvLyBhbmQgYSB0ZW1wb3JhcnkgYnVmZmVyIHVzZWQgZm9yIG1lcmdlIHNvcnRp
bmcuCisgICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiBtX21hdGNoZWRSdWxlczsK
KyAgICAgICAgUmVmUHRyPFN0YXRpY0NTU1J1bGVMaXN0PiBtX3J1bGVMaXN0OworCisgICAgICAg
IGJvb2wgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7CisgICAgICAgIGJvb2wgbV9hcHBs
eVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOworCisgICAgICAgIFBlbmRpbmdJbWFnZVByb3Bl
cnR5TWFwIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllczsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
CisgICAgICAgIGJvb2wgbV9oYXNQZW5kaW5nU2hhZGVyczsKKyNlbmRpZgorI2lmIEVOQUJMRShD
U1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFw
IG1fcGVuZGluZ1NWR0RvY3VtZW50czsKKyNlbmRpZgorICAgICAgICBDU1NWYWx1ZSogbV9saW5l
SGVpZ2h0VmFsdWU7CisgICAgICAgIGJvb2wgbV9mb250RGlydHk7CisKKyAgICAgICAgYm9vbCBt
X2hhc1VBQXBwZWFyYW5jZTsKKyAgICAgICAgQm9yZGVyRGF0YSBtX2JvcmRlckRhdGE7CisgICAg
ICAgIEZpbGxMYXllciBtX2JhY2tncm91bmREYXRhOworICAgICAgICBDb2xvciBtX2JhY2tncm91
bmRDb2xvcjsKKyAgICB9OworCisgICAgc3RhdGljIFJlbmRlclN0eWxlKiBzdHlsZU5vdFlldEF2
YWlsYWJsZSgpIHsgcmV0dXJuIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7IH0KKworICAgIFBhc3NS
ZWZQdHI8U3R5bGVJbWFnZT4gc3R5bGVJbWFnZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOwor
ICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1By
b3BlcnR5SUQsIENTU0ltYWdlVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGdl
bmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZUdlbmVyYXRv
clZhbHVlKik7CisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisgICAgUGFzc1JlZlB0cjxTdHls
ZUltYWdlPiBzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VTZXRW
YWx1ZSopOworI2VuZGlmCisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjdXJzb3JPclBlbmRp
bmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSopOworCisgICAg
Ym9vbCBhcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRl
LmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpOyB9CisgICAgYm9vbCBhcHBseVByb3BlcnR5
VG9WaXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5
VG9WaXNpdGVkTGlua1N0eWxlKCk7IH0KKworICAgIHN0YXRpYyBMZW5ndGggY29udmVydFRvSW50
TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9v
dFN0eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworICAgIHN0YXRpYyBMZW5ndGggY29udmVy
dFRvRmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0
eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7CisKKyAgICBDU1NUb1N0eWxl
TWFwKiBzdHlsZU1hcCgpIHsgcmV0dXJuICZtX3N0eWxlTWFwOyB9CisgICAgSW5zcGVjdG9yQ1NT
T01XcmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFwcGVycygpIHsgcmV0dXJuIG1faW5zcGVjdG9y
Q1NTT01XcmFwcGVyczsgfQorICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0
aW9uKCkgeyByZXR1cm4gbV9zdGF0ZS5mb250RGVzY3JpcHRpb24oKTsgfQorICAgIGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9zdGF0ZS5w
YXJlbnRGb250RGVzY3JpcHRpb24oKTsgfQorICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNv
bnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fc3RhdGUuc2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAgICB2b2lkIHNldFpvb20oZmxvYXQgZikg
eyBtX3N0YXRlLnNldFpvb20oZik7IH0KKyAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQg
ZikgeyBtX3N0YXRlLnNldEVmZmVjdGl2ZVpvb20oZik7IH0KKyAgICB2b2lkIHNldFdyaXRpbmdN
b2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2RlKSB7IG1fc3RhdGUuc2V0V3JpdGluZ01vZGUod3Jp
dGluZ01vZGUpOyB9CisgICAgdm9pZCBzZXRUZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9u
IHRleHRPcmllbnRhdGlvbikgeyBtX3N0YXRlLnNldFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50
YXRpb24pOyB9CisgICAgCisgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJ
bmZvKikgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc19z
dHlsZU5vdFlldEF2YWlsYWJsZTsKKworICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5k
KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVk
RWxlbWVudCopIGNvbnN0OworCisgICAgdm9pZCBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQs
IENTU1ZhbHVlKik7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZvaWQgYXBwbHlTVkdQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworI2VuZGlmCisKKyAgICBQYXNzUmVmUHRyPFN0
eWxlSW1hZ2U+IGxvYWRQZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqKTsKKyAgICB2b2lk
IGxvYWRQZW5kaW5nSW1hZ2VzKCk7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZU1hdGNo
ZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGllcyosIHVuc2lnbmVkIHNpemUp
OworICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSB7CisgICAgICAgIHZvaWQg
cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworICAgICAgICBWZWN0
b3I8TWF0Y2hlZFByb3BlcnRpZXM+IG1hdGNoZWRQcm9wZXJ0aWVzOworICAgICAgICBNYXRjaFJh
bmdlcyByYW5nZXM7CisgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcmVuZGVyU3R5bGU7Cisg
ICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcGFyZW50UmVuZGVyU3R5bGU7CisgICAgfTsKKyAg
ICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogZmluZEZyb21NYXRjaGVkUHJvcGVy
dGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7CisgICAgdm9pZCBh
ZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBSZW5k
ZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7
CisKKyAgICAvLyBFdmVyeSBOIGFkZGl0aW9ucyB0byB0aGUgbWF0Y2hlZCBkZWNsYXJhdGlvbiBj
YWNoZSB0cmlnZ2VyIGEgc3dlZXAgd2hlcmUgZW50cmllcyBob2xkaW5nCisgICAgLy8gdGhlIGxh
c3QgcmVmZXJlbmNlIHRvIGEgc3R5bGUgZGVjbGFyYXRpb24gYXJlIGdhcmJhZ2UgY29sbGVjdGVk
LgorICAgIHZvaWQgc3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2
ZXI+Kik7CisKKyAgICBib29sIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VT
cGxpdFN0cmluZyYpIGNvbnN0OworICAgIGJvb2wgc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNh
bFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KikgY29uc3Q7CisKKyAgICB1
bnNpZ25lZCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcDsK
KworICAgIHR5cGVkZWYgSGFzaE1hcDx1bnNpZ25lZCwgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0
ZW0+IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSBt
X21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU7CisKKyAgICBUaW1lcjxTdHlsZVJlc29sdmVyPiBtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyOworCisgICAgT3duUHRyPE1lZGlhUXVlcnlF
dmFsdWF0b3I+IG1fbWVkaXVtOworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbV9yb290RGVmYXVs
dFN0eWxlOworCisgICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7CisgICAgU2VsZWN0b3JGaWx0ZXIg
bV9zZWxlY3RvckZpbHRlcjsKKworICAgIGJvb2wgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXM7
CisKKyAgICBSZWZQdHI8Q1NTRm9udFNlbGVjdG9yPiBtX2ZvbnRTZWxlY3RvcjsKKyAgICBWZWN0
b3I8T3duUHRyPE1lZGlhUXVlcnlSZXN1bHQ+ID4gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cnlSZXN1bHRzOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBSZWZQ
dHI8Vmlld3BvcnRTdHlsZVJlc29sdmVyPiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKKyNlbmRp
ZgorCisgICAgY29uc3QgU3R5bGVCdWlsZGVyJiBtX3N0eWxlQnVpbGRlcjsKKworICAgIE93blB0
cjxTdHlsZVNjb3BlUmVzb2x2ZXI+IG1fc2NvcGVSZXNvbHZlcjsKKyAgICBDU1NUb1N0eWxlTWFw
IG1fc3R5bGVNYXA7CisgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBtX2luc3BlY3RvckNTU09N
V3JhcHBlcnM7CisKKyAgICBTdGF0ZSBtX3N0YXRlOworCisgICAgZnJpZW5kIGNsYXNzIFN0eWxl
QnVpbGRlcjsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoZWRQcm9wZXJ0
aWVzJiwgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmKTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiwgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmKTsK
KyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hdGNoUmFuZ2VzJiwgY29uc3QgTWF0
Y2hSYW5nZXMmKTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hdGNoUmFuZ2Vz
JiwgY29uc3QgTWF0Y2hSYW5nZXMmKTsKK307CisKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6
Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyAmYXR0cmlidXRlTmFt
ZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWF0dHJpYnV0ZU5hbWUuaXNFbXB0eSgpKTsKKyAgICBy
ZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxlcy5jb250YWlucyhhdHRyaWJ1
dGVOYW1lLmltcGwoKSk7Cit9CisKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVj
dG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5nJiBjbGFzc1ZhbHVlKSBjb25zdAoreworICAg
IEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkpOworICAgIHJldHVybiBtX3J1bGVTZXRzLmZl
YXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NWYWx1ZS5pbXBsKCkpOworfQor
CitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21p
Y1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWlkVmFsdWUuaXNFbXB0eSgp
KTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMo
aWRWYWx1ZS5pbXBsKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBTdHlsZVJlc29sdmVyX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxl
Y3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rv
ci5oCShyZXZpc2lvbiAxNDUxODEpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xs
ZWN0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMTksNjc5ICsxOSw0MiBAQAogICoKICAqLwogCi0j
aWZuZGVmIFN0eWxlUmVzb2x2ZXJfaAotI2RlZmluZSBTdHlsZVJlc29sdmVyX2gKKyNpZm5kZWYg
UGFnZVJ1bGVDb2xsZWN0b3JfaAorI2RlZmluZSBQYWdlUnVsZUNvbGxlY3Rvcl9oCiAKLSNpbmNs
dWRlICJDU1NSdWxlTGlzdC5oIgotI2luY2x1ZGUgIkNTU1RvU3R5bGVNYXAuaCIKLSNpbmNsdWRl
ICJDU1NWYWx1ZUxpc3QuaCIKICNpbmNsdWRlICJEb2N1bWVudFJ1bGVTZXRzLmgiCi0jaW5jbHVk
ZSAiSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5oIgotI2luY2x1ZGUgIkxpbmtIYXNoLmgiCi0jaW5j
bHVkZSAiTWVkaWFRdWVyeUV4cC5oIgotI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCi0jaW5jbHVk
ZSAiUnVsZUZlYXR1cmUuaCIKLSNpbmNsdWRlICJSdWxlU2V0LmgiCi0jaW5jbHVkZSAiUnVudGlt
ZUVuYWJsZWRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIlNjcm9sbFR5cGVzLmgiCi0jaW5jbHVkZSAi
U2VsZWN0b3JDaGVja2VyLmgiCi0jaW5jbHVkZSAiU2VsZWN0b3JGaWx0ZXIuaCIKLSNpbmNsdWRl
ICJTdHlsZUluaGVyaXRlZERhdGEuaCIKLSNpbmNsdWRlICJTdHlsZVNjb3BlUmVzb2x2ZXIuaCIK
LSNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKLSNpZiBFTkFCTEUoQ1NTX0ZJTFRF
UlMpICYmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5o
IgotI2VuZGlmCi0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNl
dC5oPgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmlu
Z0hhc2guaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotZW51bSBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgeyBEb05vdFVzZVNtYXJ0
TWluaW11bUZvckZvbnRTaXplLCBVc2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSB9OwotCi1jbGFz
cyBDU1NDdXJzb3JJbWFnZVZhbHVlOwotY2xhc3MgQ1NTRm9udFNlbGVjdG9yOwotY2xhc3MgQ1NT
Rm9udEZhY2U7Ci1jbGFzcyBDU1NGb250RmFjZVJ1bGU7Ci1jbGFzcyBDU1NJbWFnZUdlbmVyYXRv
clZhbHVlOwotY2xhc3MgQ1NTSW1hZ2VTZXRWYWx1ZTsKLWNsYXNzIENTU0ltYWdlVmFsdWU7Ci1j
bGFzcyBDU1NQYWdlUnVsZTsKLWNsYXNzIENTU1ByaW1pdGl2ZVZhbHVlOwotY2xhc3MgQ1NTUHJv
cGVydHk7Ci1jbGFzcyBDU1NSdWxlTGlzdDsKLWNsYXNzIENTU1NlbGVjdG9yOwotY2xhc3MgQ1NT
U3R5bGVTaGVldDsKLWNsYXNzIENTU1ZhbHVlOwotY2xhc3MgQ29udGFpbmVyTm9kZTsKLWNsYXNz
IEN1c3RvbUZpbHRlck9wZXJhdGlvbjsKLWNsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlcjsKLWNs
YXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3Q7Ci1jbGFzcyBEb2N1bWVudDsKLWNsYXNzIEVs
ZW1lbnQ7Ci1jbGFzcyBGcmFtZTsKLWNsYXNzIEZyYW1lVmlldzsKLWNsYXNzIEtVUkw7Ci1jbGFz
cyBLZXlmcmFtZUxpc3Q7Ci1jbGFzcyBLZXlmcmFtZVZhbHVlOwotY2xhc3MgTWVkaWFRdWVyeUV2
YWx1YXRvcjsKLWNsYXNzIE5vZGU7Ci1jbGFzcyBSZW5kZXJSZWdpb247Ci1jbGFzcyBSZW5kZXJT
Y3JvbGxiYXI7Ci1jbGFzcyBSdWxlRGF0YTsKLWNsYXNzIFJ1bGVTZXQ7Ci1jbGFzcyBTZXR0aW5n
czsKLWNsYXNzIFN0YXRpY0NTU1J1bGVMaXN0OwotY2xhc3MgU3R5bGVCdWlsZGVyOwotY2xhc3Mg
U3R5bGVTY29wZVJlc29sdmVyOwotY2xhc3MgU3R5bGVJbWFnZTsKLWNsYXNzIFN0eWxlS2V5ZnJh
bWU7Ci1jbGFzcyBTdHlsZVBlbmRpbmdJbWFnZTsKLWNsYXNzIFN0eWxlUHJvcGVydHlTZXQ7Ci1j
bGFzcyBTdHlsZVJ1bGU7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi1jbGFzcyBTdHlsZVJ1bGVI
b3N0OwotI2VuZGlmCi1jbGFzcyBTdHlsZVJ1bGVLZXlmcmFtZXM7CiBjbGFzcyBTdHlsZVJ1bGVQ
YWdlOwotY2xhc3MgU3R5bGVSdWxlUmVnaW9uOwotY2xhc3MgU3R5bGVTaGFkZXI7Ci1jbGFzcyBT
dHlsZVNoZWV0OwotY2xhc3MgU3R5bGVTaGVldExpc3Q7Ci1jbGFzcyBTdHlsZWRFbGVtZW50Owot
Y2xhc3MgVmlld3BvcnRTdHlsZVJlc29sdmVyOwotY2xhc3MgV2ViS2l0Q1NTRmlsdGVyVmFsdWU7
Ci1jbGFzcyBXZWJLaXRDU1NTaGFkZXJWYWx1ZTsKLWNsYXNzIFdlYktpdENTU1NWR0RvY3VtZW50
VmFsdWU7Ci0KLWNsYXNzIE1lZGlhUXVlcnlSZXN1bHQgewotICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKE1lZGlhUXVlcnlSZXN1bHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoK
LSAgICBNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAmIGV4cHIsIGJvb2wgcmVz
dWx0KQotICAgICAgICA6IG1fZXhwcmVzc2lvbihleHByKQotICAgICAgICAsIG1fcmVzdWx0KHJl
c3VsdCkKLSAgICB7Ci0gICAgfQotICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2Jq
ZWN0SW5mbyopIGNvbnN0OwotCi0gICAgTWVkaWFRdWVyeUV4cCBtX2V4cHJlc3Npb247Ci0gICAg
Ym9vbCBtX3Jlc3VsdDsKLX07Ci0KLWVudW0gU3R5bGVTaGFyaW5nQmVoYXZpb3IgewotICAgIEFs
bG93U3R5bGVTaGFyaW5nLAotICAgIERpc2FsbG93U3R5bGVTaGFyaW5nLAotfTsKLQotLy8gTWF0
Y2hPbmx5VXNlckFnZW50UnVsZXMgaXMgdXNlZCBpbiBtZWRpYSBxdWVyaWVzLCB3aGVyZSByZWxh
dGl2ZSB1bml0cwotLy8gYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQg
cm9vdCBlbGVtZW50IHN0eWxlLCBhbmQgc3R5bGVkIG9ubHkKLS8vIGZyb20gdGhlIFVzZXIgQWdl
bnQgU3R5bGVzaGVldCBydWxlcy4KLQotZW51bSBSdWxlTWF0Y2hpbmdCZWhhdmlvciB7Ci0gICAg
TWF0Y2hBbGxSdWxlcywKLSAgICBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCwKLSAgICBNYXRj
aE9ubHlVc2VyQWdlbnRSdWxlcywKLX07Ci0KLWNsYXNzIFBzZXVkb1N0eWxlUmVxdWVzdCB7Ci1w
dWJsaWM6Ci0gICAgUHNldWRvU3R5bGVSZXF1ZXN0KFBzZXVkb0lkIHBzZXVkb0lkLCBSZW5kZXJT
Y3JvbGxiYXIqIHNjcm9sbGJhciA9IDAsIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydCA9IE5v
UGFydCkKLSAgICAgICAgOiBwc2V1ZG9JZChwc2V1ZG9JZCkKLSAgICAgICAgLCBzY3JvbGxiYXJQ
YXJ0KHNjcm9sbGJhclBhcnQpCi0gICAgICAgICwgc2Nyb2xsYmFyKHNjcm9sbGJhcikKLSAgICB7
Ci0gICAgfQotCi0gICAgUHNldWRvSWQgcHNldWRvSWQ7Ci0gICAgU2Nyb2xsYmFyUGFydCBzY3Jv
bGxiYXJQYXJ0OwotICAgIFJlbmRlclNjcm9sbGJhciogc2Nyb2xsYmFyOwotfTsKLQotY2xhc3Mg
TWF0Y2hSZXF1ZXN0IHsKLXB1YmxpYzoKLSAgICBNYXRjaFJlcXVlc3QoUnVsZVNldCogcnVsZVNl
dCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyA9IGZhbHNlLCBjb25zdCBDb250YWluZXJOb2RlKiBz
Y29wZSA9IDAsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRC
b3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCi0gICAgICAg
IDogcnVsZVNldChydWxlU2V0KQotICAgICAgICAsIGluY2x1ZGVFbXB0eVJ1bGVzKGluY2x1ZGVF
bXB0eVJ1bGVzKQotICAgICAgICAsIHNjb3BlKHNjb3BlKQotICAgICAgICAsIGJlaGF2aW9yQXRC
b3VuZGFyeShiZWhhdmlvckF0Qm91bmRhcnkpIHsgfQotICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVT
ZXQ7Ci0gICAgY29uc3QgYm9vbCBpbmNsdWRlRW1wdHlSdWxlczsKLSAgICBjb25zdCBDb250YWlu
ZXJOb2RlKiBzY29wZTsKLSAgICBjb25zdCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3Vu
ZGFyeSBiZWhhdmlvckF0Qm91bmRhcnk7Ci19OwogCi0vLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBS
ZW5kZXJTdHlsZSBmb3IgYSBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBz
dHlsZXNoZWV0cy4KLWNsYXNzIFN0eWxlUmVzb2x2ZXIgewotICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKFN0eWxlUmVzb2x2ZXIpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK2NsYXNzIFBhZ2VS
dWxlQ29sbGVjdG9yIHsKIHB1YmxpYzoKLSAgICBTdHlsZVJlc29sdmVyKERvY3VtZW50KiwgYm9v
bCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpOwotICAgIH5TdHlsZVJlc29sdmVyKCk7CisgICAg
UGFnZVJ1bGVDb2xsZWN0b3IoU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBEb2N1bWVudFJ1
bGVTZXRzJiBydWxlU2V0cykKKyAgICAgICAgOiBtX3N0YXRlKHN0YXRlKQorICAgICAgICAsIG1f
cnVsZVNldHMocnVsZVNldHMpIHsgfQogCi0gICAgLy8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUg
d2FsayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9yIHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNj
ZW5kYW50IHNlbGVjdG9yIGxvb2t1cHMuCi0gICAgdm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVt
ZW50Kik7Ci0gICAgdm9pZCBwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICB2b2lkIHB1
c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSAgICB2b2lkIHBvcFBhcmVu
dFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQot
ICAgIHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxlSG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVu
dFNlY3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29w
ZVJlc29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUsIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4s
IHNjb3BlKTsgfQotI2VuZGlmCi0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZv
ckVsZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hh
cmluZ0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJpbmcsCi0gICAgICAgIFJ1bGVNYXRjaGluZ0Jl
aGF2aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0g
MCk7Ci0KLSAgICB2b2lkIGtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25z
dCBSZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYpOwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAgUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpOwotICAgIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKTsKLSAgICBQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOwotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0g
MCk7Ci0KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0
eWxlKCk7IH0KLSAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBt
X3N0YXRlLnBhcmVudFN0eWxlKCk7IH0KLSAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpOyB9Ci0gICAgRWxl
bWVudCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpOyB9Ci0gICAgRG9jdW1l
bnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1bWVudDsgfQotICAgIFN0eWxlU2NvcGVSZXNv
bHZlciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQo
KTsgfQotICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFy
ZW50Tm9kZSgpOyB9Ci0KLSAgICAvLyBGSVhNRTogSXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwg
bV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZh
Y3RvciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KLSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCi0gICAgdm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0
cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+
Jik7Ci0KLSAgICBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNl
dHM7IH0KLSAgICBjb25zdCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0
dXJuIG1fcnVsZVNldHM7IH0KLQotI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShT
SEFET1dfRE9NKQotICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigp
Ci0gICAgewotI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpCi0jaWYgRU5BQkxFKFNIQURPV19ET00p
Ci0gICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVk
KCkgfHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOwotI2Vs
c2UKLSAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5h
YmxlZCgpKTsKLSNlbmRpZgotI2Vsc2UKLSAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVh
dHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFtX3Njb3Bl
UmVzb2x2ZXIpCi0gICAgICAgICAgICBtX3Njb3BlUmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5
bGVTY29wZVJlc29sdmVyKCkpOwotICAgICAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgp
OwotICAgIH0KLSNlbmRpZgorICAgIHZvaWQgbWF0Y2hBbGxQYWdlUnVsZXMoaW50IHBhZ2VJbmRl
eCk7CisgICAgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQmIG1hdGNoZWRSZXN1bHQoKSB7IHJl
dHVybiBtX3Jlc3VsdDsgfQogCiBwcml2YXRlOgotICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVu
dCopOwotICAgIFJlbmRlclN0eWxlKiBsb2NhdGVTaGFyZWRTdHlsZSgpOwotICAgIGJvb2wgc3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCopOwotICAgIGJvb2wgc3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpOwotICAgIE5vZGUqIGxvY2F0ZUNv
dXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29u
c3Q7Ci0gICAgU3R5bGVkRWxlbWVudCogZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSos
IHVuc2lnbmVkJiBjb3VudCkgY29uc3Q7Ci0gICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1l
bnQoU3R5bGVkRWxlbWVudCopIGNvbnN0OwotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4g
c3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUq
LCBLZXlmcmFtZVZhbHVlJik7Ci0KLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwg
Z2l2ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhhdCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1l
bnQgKG9yIGEgcHNldWRvLWVsZW1lbnQpLgotICAgIGVudW0gQ1NTUnVsZUZpbHRlciB7Ci0gICAg
ICAgIFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8IDEsCi0gICAgICAgIEF1dGhvckNTU1J1bGVz
ICAgICAgPSAxIDw8IDIsCi0gICAgICAgIEVtcHR5Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCi0g
ICAgICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAxIDw8IDQsCi0gICAgICAgIEFsbEJ1dEVtcHR5
Q1NTUnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmln
aW5DU1NSdWxlcywKLSAgICAgICAgQWxsQ1NTUnVsZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NT
UnVsZXMgfCBFbXB0eUNTU1J1bGVzLAotICAgIH07Ci0gICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlz
dD4gc3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRl
ID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7Ci0gICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNl
dWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxl
c1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgLy8gR2l2ZW4gYSBDU1Mg
a2V5d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxsIHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhp
cyBmdW5jdGlvbiB3aWxsIHJldHVybgotICAgIC8vIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2Fs
ZWQgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZhdWx0IChtZWRpdW0pLgotICAgIHN0YXRpYyBm
bG9hdCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91
bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKLQotICAgIC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBp
eGVsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAx
IGFuZCA3LgotICAgIHN0YXRpYyBpbnQgbGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4
ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKLQotcHVibGljOgot
ICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBS
ZW5kZXJTdHlsZSopOwotCi0gICAgdm9pZCBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NT
UHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKLQotICAgIHZvaWQgdXBkYXRlRm9udCgpOwotICAgIHZv
aWQgaW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5ncyopOwotCi0gICAgc3RhdGljIGZsb2F0IGdl
dENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3Rv
ciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11
bUZvckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUpOwotCi0gICAgdm9pZCBz
ZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mLCBmbG9hdCBzaXplKTsKLQotcHJpdmF0ZToKLSAg
ICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQq
LCBSZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUs
IGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKTsKLQotcHVibGljOgotICAgIGJvb2wgdXNlU1ZHWm9vbVJ1
bGVzKCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBjb2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZl
ZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVlKik7Ci0gICAgQ29sb3IgY29sb3JGcm9tUHJp
bWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqLCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFs
c2UpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmlu
ZyYpIGNvbnN0OwotICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJp
bmcmKSBjb25zdDsKLSAgICBib29sIGhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21p
Y1N0cmluZyYpIGNvbnN0OwotCi0gICAgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBj
b25zdCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5nZXQoKTsgfQotI2lmIEVOQUJMRShDU1NfREVW
SUNFX0FEQVBUQVRJT04pCi0gICAgVmlld3BvcnRTdHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxl
UmVzb2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci5nZXQoKTsgfQotI2Vu
ZGlmCi0KLSAgICB2b2lkIGFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25z
dCBNZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQpOwotICAgIGJvb2wgaGFzVmlld3BvcnREZXBl
bmRlbnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJldHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1l
ZGlhUXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQotICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0
Q2hhbmdlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGFkZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxT
dHlsZVJ1bGVLZXlmcmFtZXM+KTsKLQotICAgIGJvb2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50
KiByZWdpb25FbGVtZW50KTsKLQotICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsg
cmV0dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCkuc2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQot
ICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5m
ZWF0dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsgfQotICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVy
UnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFm
dGVyUnVsZXM7IH0KLQotICAgIHN0YXRpYyBib29sIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMo
Q1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9v
dFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKLSAgICAKLSAgICB2
b2lkIGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCk7Ci0KLSNpZiBFTkFCTEUoQ1NT
X0ZJTFRFUlMpCi0gICAgYm9vbCBjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZh
bHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVy
T3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAg
IFN0eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NWYWx1ZSopOwotICAgIFN0eWxlU2hhZGVyKiBj
YWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSop
OwotICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3Vz
dG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYpOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFy
YW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENT
U1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3Vz
dG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3Qq
KTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0
ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAg
ICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFu
c2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKLSAgICBQ
YXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwotICAg
IFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVy
YXRpb25XaXRoSW5saW5lU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7Ci0gICAgUGFzc1Jl
ZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwotICAgIHZvaWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7Ci0j
ZW5kaWYKLSNpZiBFTkFCTEUoU1ZHKQotICAgIHZvaWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMo
KTsKLSNlbmRpZgotI2VuZGlmIC8vIEVOQUJMRShDU1NfRklMVEVSUykKLQotICAgIHZvaWQgbG9h
ZFBlbmRpbmdSZXNvdXJjZXMoKTsKLQotcHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZp
eGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJl
bnQgZ2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tG
b3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlKTsKLSAgICB2b2lkIGNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0
eWxlKiBwYXJlbnRTdHlsZSk7Ci0KLSAgICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0
eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsK
LQotICAgIHN0cnVjdCBSdWxlUmFuZ2UgewotICAgICAgICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1
bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5k
ZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQotICAgICAgICBpbnQmIGZpcnN0
UnVsZUluZGV4OwotICAgICAgICBpbnQmIGxhc3RSdWxlSW5kZXg7Ci0gICAgfTsKLQotICAgIHN0
cnVjdCBNYXRjaFJhbmdlcyB7Ci0gICAgICAgIE1hdGNoUmFuZ2VzKCkgOiBmaXJzdFVBUnVsZSgt
MSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUoLTEpLCBsYXN0QXV0aG9yUnVsZSgt
MSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUoLTEpIHsgfQotICAgICAgICBpbnQg
Zmlyc3RVQVJ1bGU7Ci0gICAgICAgIGludCBsYXN0VUFSdWxlOwotICAgICAgICBpbnQgZmlyc3RB
dXRob3JSdWxlOwotICAgICAgICBpbnQgbGFzdEF1dGhvclJ1bGU7Ci0gICAgICAgIGludCBmaXJz
dFVzZXJSdWxlOwotICAgICAgICBpbnQgbGFzdFVzZXJSdWxlOwotICAgICAgICBSdWxlUmFuZ2Ug
VUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVQVJ1bGUsIGxhc3RVQVJ1bGUp
OyB9Ci0gICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFu
Z2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7IH0KLSAgICAgICAgUnVsZVJhbmdl
IHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVc2VyUnVsZSwgbGFzdFVz
ZXJSdWxlKTsgfQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXMgewotICAg
ICAgICBNYXRjaGVkUHJvcGVydGllcygpOwotICAgICAgICB+TWF0Y2hlZFByb3BlcnRpZXMoKTsK
LSAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7
Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcHJvcGVydGllczsK
LSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICB1
bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aGl0
ZWxpc3RUeXBlIDogMjsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBVc2VkIHRvIG1h
a2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6ZWQgc2luY2Ugd2UgY29tcHV0ZSB0
aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgICAgIHZvaWQq
IHBvc3NpYmx5UGFkZGVkTWVtYmVyOwotICAgICAgICB9OwotICAgIH07Ci0KLSAgICBzdHJ1Y3Qg
TWF0Y2hSZXN1bHQgewotICAgICAgICBNYXRjaFJlc3VsdCgpIDogaXNDYWNoZWFibGUodHJ1ZSkg
eyB9Ci0gICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcywgNjQ+IG1hdGNoZWRQcm9wZXJ0
aWVzOwotICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1hdGNoZWRSdWxlczsKLSAgICAg
ICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOwotICAgICAgICBib29sIGlzQ2FjaGVhYmxlOwotICAgIH07
Ci0KLSAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNv
bnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25l
ZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0
ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKLSAgICB2b2lkIGFkZEVsZW1lbnRT
dHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiwgYm9v
bCBpc0NhY2hlYWJsZSA9IHRydWUpOwotCi0gICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVz
dWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVz
KE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxl
U2V0Kik7Ci0gICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNs
dWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhN
YXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hIb3N0
UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLQotICAgIHZvaWQg
Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0g
ICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3Qm
LCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25z
dCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0K
LSAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYpIGNvbnN0OwotICAg
IHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOwotICAgIHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hl
ZFJ1bGVzKE1hdGNoUmVzdWx0Jik7Ci0KLSAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVE
YXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVj
a2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0Jv
dW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3Iq
IHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KTsKLSAgICB2b2lkIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBjb25zdCBFbGVtZW50Kik7Ci0g
ICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMp
Ci0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCi0jZW5kaWYKLSAgICAgICAgSGlnaFByaW9y
aXR5UHJvcGVydGllcywKLSAgICAgICAgTG93UHJpb3JpdHlQcm9wZXJ0aWVzCi0gICAgfTsKLSAg
ICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLSAgICB2b2lkIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBib29sIGltcG9ydGFudCwgaW50IHN0
YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KTsKLSAgICB0ZW1wbGF0
ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLSAgICB2b2lkIGFwcGx5UHJvcGVydGllcyhj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqLCBib29sIGlzSW1w
b3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3Bl
cnR5V2hpdGVsaXN0Tm9uZSk7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgdm9pZCBy
ZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwgVmVjdG9yPHN0ZDo6cGFp
cjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpOwotI2VuZGlmCi0g
ICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7
Ci0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIHN0YXRpYyBib29sIGlzVmFsaWRDdWVTdHls
ZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOwotI2VuZGlmCi0gICAgdm9pZCBtYXRjaFBhZ2VSdWxl
cyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBh
Z2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwotICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JM
aXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0
eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3Qg
U3RyaW5nJiBwYWdlTmFtZSk7Ci0gICAgU2V0dGluZ3MqIGRvY3VtZW50U2V0dGluZ3MoKSB7IHJl
dHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9Ci0KICAgICBib29sIGlzTGVmdFBhZ2UoaW50
IHBhZ2VJbmRleCkgY29uc3Q7CiAgICAgYm9vbCBpc1JpZ2h0UGFnZShpbnQgcGFnZUluZGV4KSBj
b25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgpOyB9CiAgICAgYm9vbCBpc0ZpcnN0
UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKICAgICBTdHJpbmcgcGFnZU5hbWUoaW50IHBhZ2VJ
bmRleCkgY29uc3Q7CiAKLSAgICBEb2N1bWVudFJ1bGVTZXRzIG1fcnVsZVNldHM7Ci0KLSAgICB0
eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJlZlB0cjxTdHlsZVJ1bGVLZXlmcmFt
ZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKLSAgICBLZXlmcmFtZXNSdWxlTWFwIG1fa2V5ZnJhbWVz
UnVsZU1hcDsKLQotcHVibGljOgotICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBS
ZWZQdHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA7Ci0jaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIHR5cGVkZWYgSGFzaE1hcDxGaWx0ZXJPcGVy
YXRpb24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZT4gPiBQZW5kaW5nU1ZHRG9j
dW1lbnRNYXA7Ci0jZW5kaWYKLQotICAgIGNsYXNzIFN0YXRlIHsKLSAgICAgICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoU3RhdGUpOwotICAgIHB1YmxpYzoKLSAgICAgICAgU3RhdGUoKQotICAgICAg
ICA6IG1fZWxlbWVudCgwKQotICAgICAgICAsIG1fc3R5bGVkRWxlbWVudCgwKQotICAgICAgICAs
IG1fcGFyZW50Tm9kZSgwKQotICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKLSAgICAgICAgLCBt
X3Jvb3RFbGVtZW50U3R5bGUoMCkKLSAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKLSAg
ICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQotICAgICAgICAsIG1fcHNldWRvU3R5bGVS
ZXF1ZXN0KE5PUFNFVURPKQotICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShOb3RJbnNpZGVM
aW5rKQotICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZhbHNlKQotICAg
ICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQotICAgICAgICAsIG1f
bW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQotICAgICAgICAsIG1fYXBwbHlQ
cm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCi0gICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlKGZhbHNlKQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAg
LCBtX2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQotI2VuZGlmCi0gICAgICAgICwgbV9saW5lSGVp
Z2h0VmFsdWUoMCkKLSAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxzZSkKLSAgICAgICAgLCBtX2hh
c1VBQXBwZWFyYW5jZShmYWxzZSkKLSAgICAgICAgLCBtX2JhY2tncm91bmREYXRhKEJhY2tncm91
bmRGaWxsTGF5ZXIpIHsgfQotCi0gICAgcHVibGljOgotICAgICAgICB2b2lkIGluaXRFbGVtZW50
KEVsZW1lbnQqKTsKLSAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50Kiwg
RWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxl
UmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJl
Z2lvbkZvclN0eWxpbmcgPSAwKTsKLSAgICAgICAgdm9pZCBjbGVhcigpOwotCi0gICAgICAgIERv
Y3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC0+ZG9jdW1lbnQoKTsg
fQotICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9
Ci0gICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBt
X3N0eWxlZEVsZW1lbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRTdHlsZShQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KLSAgICAgICAgUmVuZGVyU3R5bGUq
IHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQotICAgICAgICBQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVhc2UoKTsg
fQotCi0gICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOwotICAgICAg
ICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBtX3J1bGVM
aXN0LnJlbGVhc2UoKTsgfQotCi0gICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudE5v
ZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KLSAgICAgICAgdm9pZCBzZXRQYXJl
bnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVu
dFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0
dXJuIG1fcGFyZW50U3R5bGU7IH0KLSAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KLQotICAgICAgICBjb25z
dCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBtX3JlZ2lv
bkZvclN0eWxpbmc7IH0KLSAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGlzU2Ft
ZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7IH0KLSAg
ICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1lT3JpZ2lu
T25seTsgfQotICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVx
dWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9Ci0gICAgICAgIEVJ
bnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5r
U3RhdGU7IH0KLSAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25z
dCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQotICAgICAgICB2b2lk
IHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVt
ZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9Ci0gICAgICAgIGJvb2wgZWxl
bWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0
ZWRCeUNsYXNzUnVsZXM7IH0KLSAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpN
b2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAgICAgICAgCi0gICAgICAgIHZv
aWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5
UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KLSAgICAgICAgdm9pZCBzZXRBcHBs
eVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVy
dHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1
bGFyU3R5bGU7IH0KLSAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxl
KCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOyB9Ci0g
ICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkg
eyByZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9Ci0jaWYgRU5BQkxFKENTU19GSUxU
RVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAmIHBlbmRp
bmdTVkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdEb2N1bWVudHM7IH0KLSNlbmRp
ZgotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgdm9pZCBzZXRIYXNQZW5kaW5nU2hh
ZGVycyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBoYXNQ
ZW5kaW5nU2hhZGVyczsgfQotICAgICAgICBib29sIGhhc1BlbmRpbmdTaGFkZXJzKCkgY29uc3Qg
eyByZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQotI2VuZGlmCi0KLSAgICAgICAgdm9pZCBz
ZXRMaW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1fbGluZUhlaWdodFZhbHVlID0g
dmFsdWU7IH0KLSAgICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRWYWx1ZSgpIHsgcmV0dXJuIG1f
bGluZUhlaWdodFZhbHVlOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERpcnR5KGJvb2wgaXNEaXJ0
eSkgeyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KLSAgICAgICAgYm9vbCBmb250RGlydHkoKSBj
b25zdCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQotCi0gICAgICAgIHZvaWQgY2FjaGVCb3JkZXJB
bmRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGJvb2wgaGFzVUFBcHBlYXJhbmNlKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KLSAgICAgICAgQm9yZGVyRGF0YSBib3JkZXJEYXRh
KCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9Ci0gICAgICAgIEZpbGxMYXllciBiYWNr
Z3JvdW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZERhdGE7IH0KLSAgICAgICAg
Q29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7
IH0KLQotICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsg
cmV0dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgICAgIGNvbnN0IEZvbnRE
ZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9wYXJlbnRTdHls
ZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICAgICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24o
Y29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KLSAgICAgICAg
dm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Wm9vbShm
KTsgfQotICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0
eSB8PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYpOyB9Ci0gICAgICAgIHZvaWQgc2V0V3Jp
dGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHls
ZS0+c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAgICAgIHZvaWQgc2V0VGV4dE9y
aWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkg
fD0gbV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KLQotICAg
ICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJu
IG1fbWF0Y2hlZFJ1bGVzOyB9Ci0gICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVs
ZURhdGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9Ci0gICAgICAgIAot
ICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVh
c2llciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgotICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1
YmxpYy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCi0gICAgICAgIC8v
IHRoZXNlIHZhcmlhYmxlcy4KLSAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OwotICAgICAgICBS
ZWZQdHI8UmVuZGVyU3R5bGU+IG1fc3R5bGU7Ci0gICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5
bGVkRWxlbWVudDsKLSAgICAgICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOwotICAgICAg
ICBSZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9v
dEVsZW1lbnRTdHlsZTsKLSAgICAgICAgCi0gICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25G
b3JTdHlsaW5nOwotICAgICAgICBib29sIG1fc2FtZU9yaWdpbk9ubHk7Ci0gICAgICAgIFBzZXVk
b1N0eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKLQotICAgICAgICBFSW5zaWRlTGlu
ayBtX2VsZW1lbnRMaW5rU3RhdGU7Ci0KLSAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludDsKLQotICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVz
OwotCi0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7Ci0KLSAgICAgICAgLy8g
QSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxl
bWVudCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBz
b3J0aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVs
ZXM7Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKLQotICAg
ICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOwotICAgICAgICBib29sIG1f
YXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsKLQotICAgICAgICBQZW5kaW5nSW1hZ2VQ
cm9wZXJ0eU1hcCBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7Ci0jaWYgRU5BQkxFKENTU19TSEFE
RVJTKQotICAgICAgICBib29sIG1faGFzUGVuZGluZ1NoYWRlcnM7Ci0jZW5kaWYKLSNpZiBFTkFC
TEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCi0gICAgICAgIFBlbmRpbmdTVkdEb2N1bWVu
dE1hcCBtX3BlbmRpbmdTVkdEb2N1bWVudHM7Ci0jZW5kaWYKLSAgICAgICAgQ1NTVmFsdWUqIG1f
bGluZUhlaWdodFZhbHVlOwotICAgICAgICBib29sIG1fZm9udERpcnR5OwotCi0gICAgICAgIGJv
b2wgbV9oYXNVQUFwcGVhcmFuY2U7Ci0gICAgICAgIEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOwot
ICAgICAgICBGaWxsTGF5ZXIgbV9iYWNrZ3JvdW5kRGF0YTsKLSAgICAgICAgQ29sb3IgbV9iYWNr
Z3JvdW5kQ29sb3I7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZ
ZXRBdmFpbGFibGUoKSB7IHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOyB9Ci0KLSAgICBQ
YXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUq
KTsKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUlELCBDU1NJbWFnZVZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdl
PiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5l
cmF0b3JWYWx1ZSopOwotI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQotICAgIFBhc3NSZWZQdHI8
U3R5bGVJbWFnZT4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdl
U2V0VmFsdWUqKTsKLSNlbmRpZgotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQ
ZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0N1cnNvckltYWdlVmFsdWUqKTsKLQot
ICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9z
dGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKTsgfQotICAgIGJvb2wgYXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRU
b0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUq
IHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsKLSAgICBzdGF0aWMgTGVuZ3RoIGNv
bnZlcnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5k
ZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOwotCi0gICAgQ1NTVG9T
dHlsZU1hcCogc3R5bGVNYXAoKSB7IHJldHVybiAmbV9zdHlsZU1hcDsgfQotICAgIEluc3BlY3Rv
ckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3Bl
Y3RvckNTU09NV3JhcHBlcnM7IH0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNj
cmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUuZm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3Rh
dGUucGFyZW50Rm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlv
bihjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZv
bnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgdm9pZCBzZXRab29tKGZsb2F0
IGYpIHsgbV9zdGF0ZS5zZXRab29tKGYpOyB9Ci0gICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZs
b2F0IGYpIHsgbV9zdGF0ZS5zZXRFZmZlY3RpdmVab29tKGYpOyB9Ci0gICAgdm9pZCBzZXRXcml0
aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX3N0YXRlLnNldFdyaXRpbmdNb2Rl
KHdyaXRpbmdNb2RlKTsgfQotICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRh
dGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9y
aWVudGF0aW9uKTsgfQotICAgIAotICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2Jq
ZWN0SW5mbyopIGNvbnN0OwotICAgIAotcHJpdmF0ZToKLSAgICBzdGF0aWMgUmVuZGVyU3R5bGUq
IHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KLSAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dy
b3VuZCgpOwotCi1wcml2YXRlOgotICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0
eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIHZvaWQgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0
eUlELCBDU1NWYWx1ZSopOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICB2b2lkIGFwcGx5U1ZHUHJv
cGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKLSNlbmRpZgotCi0gICAgUGFzc1JlZlB0
cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKik7Ci0gICAg
dm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXMoUnVsZVNl
dCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5n
JiBwYWdlTmFtZSk7CisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxl
UnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBy
dWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBh
Z2VOYW1lKTsKIAotICAgIHN0YXRpYyB1bnNpZ25lZCBjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNI
YXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzKiwgdW5zaWduZWQgc2l6ZSk7Ci0gICAgc3RydWN0
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIHsKLSAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlV
c2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Ci0gICAgICAgIFZlY3RvcjxNYXRjaGVkUHJv
cGVydGllcz4gbWF0Y2hlZFByb3BlcnRpZXM7Ci0gICAgICAgIE1hdGNoUmFuZ2VzIHJhbmdlczsK
LSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiByZW5kZXJTdHlsZTsKLSAgICAgICAgUmVmUHRy
PFJlbmRlclN0eWxlPiBwYXJlbnRSZW5kZXJTdHlsZTsKLSAgICB9OwotICAgIGNvbnN0IE1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUodW5z
aWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsKLSAgICB2b2lkIGFkZFRvTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJl
bnRTdHlsZSwgdW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmKTsKKyAgICBjb25zdCBT
dHlsZVJlc29sdmVyOjpTdGF0ZSYgbV9zdGF0ZTsKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBtX3J1
bGVTZXRzOwogCi0gICAgLy8gRXZlcnkgTiBhZGRpdGlvbnMgdG8gdGhlIG1hdGNoZWQgZGVjbGFy
YXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJlIGVudHJpZXMgaG9sZGluZwotICAgIC8v
IHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRlY2xhcmF0aW9uIGFyZSBnYXJiYWdlIGNv
bGxlY3RlZC4KLSAgICB2b2lkIHN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHls
ZVJlc29sdmVyPiopOwotCi0gICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0
IFNwYWNlU3BsaXRTdHJpbmcmKSBjb25zdDsKLSAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVIYXNJ
ZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0Owot
Ci0gICAgdW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0
U3dlZXA7Ci0KLSAgICB0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGVJdGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hlOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOwotCi0gICAgVGltZXI8U3R5bGVSZXNvbHZl
cj4gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcjsKLQotICAgIE93blB0cjxNZWRp
YVF1ZXJ5RXZhbHVhdG9yPiBtX21lZGl1bTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fcm9v
dERlZmF1bHRTdHlsZTsKLQotICAgIERvY3VtZW50KiBtX2RvY3VtZW50OwotICAgIFNlbGVjdG9y
RmlsdGVyIG1fc2VsZWN0b3JGaWx0ZXI7Ci0KLSAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzOwotCi0gICAgUmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7Ci0g
ICAgVmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRlbnRN
ZWRpYVF1ZXJ5UmVzdWx0czsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0g
ICAgUmVmUHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXI7
Ci0jZW5kaWYKLQotICAgIGNvbnN0IFN0eWxlQnVpbGRlciYgbV9zdHlsZUJ1aWxkZXI7Ci0KLSAg
ICBPd25QdHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7Ci0gICAgQ1NTVG9T
dHlsZU1hcCBtX3N0eWxlTWFwOwotICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMgbV9pbnNwZWN0
b3JDU1NPTVdyYXBwZXJzOwotCi0gICAgU3RhdGUgbV9zdGF0ZTsKLQotICAgIGZyaWVuZCBjbGFz
cyBTdHlsZUJ1aWxkZXI7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaGVk
UHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7Ci0gICAgZnJpZW5kIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0
aWVzJik7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaFJhbmdlcyYsIGNv
bnN0IE1hdGNoUmFuZ2VzJik7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRj
aFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7CisgICAgU3R5bGVSZXNvbHZlcjo6TWF0Y2hS
ZXN1bHQgbV9yZXN1bHQ7CiB9OwogCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxl
Y3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcgJmF0dHJpYnV0ZU5hbWUpIGNvbnN0
Ci17Ci0gICAgQVNTRVJUKCFhdHRyaWJ1dGVOYW1lLmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIG1f
cnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuY29udGFpbnMoYXR0cmlidXRlTmFtZS5p
bXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckNs
YXNzKGNvbnN0IEF0b21pY1N0cmluZyYgY2xhc3NWYWx1ZSkgY29uc3QKLXsKLSAgICBBU1NFUlQo
IWNsYXNzVmFsdWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygp
LmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzVmFsdWUuaW1wbCgpKTsKLX0KLQotaW5saW5l
IGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZChjb25zdCBBdG9taWNTdHJpbmcm
IGlkVmFsdWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFpZFZhbHVlLmlzRW1wdHkoKSk7Ci0gICAg
cmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGlkVmFsdWUu
aW1wbCgpKTsKLX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCi0jZW5kaWYgLy8gU3R5bGVS
ZXNvbHZlcl9oCisjZW5kaWYgLy8gUGFnZVJ1bGVDb2xsZWN0b3JfaApJbmRleDogU291cmNlL1dl
YkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2Nzcy9TdHlsZVJlc29sdmVyLmNwcAkocmV2aXNpb24gMTQ1MTkwKQorKysgU291cmNlL1dlYkNv
cmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OSw2ICs1OSw3IEBA
CiAjaW5jbHVkZSAiQ291bnRlckNvbnRlbnQuaCIKICNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCiAj
aW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkVsZW1l
bnRSdWxlQ29sbGVjdG9yLmgiCiAjaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5oIgogI2luY2x1ZGUg
IkZvbnRGZWF0dXJlVmFsdWUuaCIKICNpbmNsdWRlICJGb250VmFsdWUuaCIKQEAgLTg2LDYgKzg3
LDcgQEAKICNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKICNpbmNsdWRlICJOb2RlUmVuZGVy
aW5nQ29udGV4dC5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWdlUnVsZUNvbGxl
Y3Rvci5oIgogI2luY2x1ZGUgIlBhaXIuaCIKICNpbmNsdWRlICJQZXJzcGVjdGl2ZVRyYW5zZm9y
bU9wZXJhdGlvbi5oIgogI2luY2x1ZGUgIlF1b3Rlc0RhdGEuaCIKQEAgLTEwNyw3ICsxMDksNiBA
QAogI2luY2x1ZGUgIlNoYWRvd0RhdGEuaCIKICNpbmNsdWRlICJTaGFkb3dSb290LmgiCiAjaW5j
bHVkZSAiU2hhZG93VmFsdWUuaCIKLSNpbmNsdWRlICJTaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ2ll
cy5oIgogI2luY2x1ZGUgIlNrZXdUcmFuc2Zvcm1PcGVyYXRpb24uaCIKICNpbmNsdWRlICJTdHls
ZUJ1aWxkZXIuaCIKICNpbmNsdWRlICJTdHlsZUNhY2hlZEltYWdlLmgiCkBAIC0yMTAsMzAgKzIx
MSw2IEBAIGlmIChpc0luaXRpYWwpIHsgXAogCiBSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6
c19zdHlsZU5vdFlldEF2YWlsYWJsZTsKIAotc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIGxlZnRU
b1JpZ2h0RGVjbGFyYXRpb24oKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0
eWxlUHJvcGVydHlTZXQ+LCBsZWZ0VG9SaWdodERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVh
dGUoKSkpOwotICAgIGlmIChsZWZ0VG9SaWdodERlY2wtPmlzRW1wdHkoKSkKLSAgICAgICAgbGVm
dFRvUmlnaHREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVM
dHIpOwotICAgIHJldHVybiBsZWZ0VG9SaWdodERlY2wuZ2V0KCk7Ci19Ci0KLXN0YXRpYyBTdHls
ZVByb3BlcnR5U2V0KiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RB
VElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgcmlnaHRUb0xlZnREZWNsLCAoU3R5
bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAocmlnaHRUb0xlZnREZWNsLT5pc0Vt
cHR5KCkpCi0gICAgICAgIHJpZ2h0VG9MZWZ0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlE
aXJlY3Rpb24sIENTU1ZhbHVlUnRsKTsKLSAgICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgp
OwotfQotCi0KLWlubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmVuc3VyZVJ1bGVMaXN0KCkKLXsKLSAgICBpZiAoIW1fcnVsZUxpc3QpCi0gICAgICAgIG1fcnVs
ZUxpc3QgPSBTdGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1fcnVsZUxp
c3QuZ2V0KCk7Ci19Ci0KIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjYWNoZUJv
cmRlckFuZEJhY2tncm91bmQoKQogewogICAgIG1faGFzVUFBcHBlYXJhbmNlID0gbV9zdHlsZS0+
aGFzQXBwZWFyYW5jZSgpOwpAQCAtMjUxLDggKzIyOCw2IEBAIGlubGluZSB2b2lkIFN0eWxlUmVz
b2x2ZXI6OlN0YXRlOjpjbGVhcigKICAgICBtX3BhcmVudFN0eWxlID0gMDsKICAgICBtX3BhcmVu
dE5vZGUgPSAwOwogICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9ydWxlTGlzdCA9
IDA7Ci0gICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKICAgICBtX3BlbmRpbmdJbWFnZVByb3Bl
cnRpZXMuY2xlYXIoKTsKICNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCiAgICAgbV9oYXNQZW5kaW5n
U2hhZGVycyA9IGZhbHNlOwpAQCAtMjYyLDYgKzIzNywxNiBAQCBpbmxpbmUgdm9pZCBTdHlsZVJl
c29sdmVyOjpTdGF0ZTo6Y2xlYXIoCiAjZW5kaWYKIH0KIAordm9pZCBTdHlsZVJlc29sdmVyOjpN
YXRjaFJlc3VsdDo6YWRkTWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCog
cHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9w
ZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAgIG1hdGNoZWRQ
cm9wZXJ0aWVzLmdyb3cobWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7CisgICAgU3R5bGVS
ZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaGVkUHJvcGVy
dGllcy5sYXN0KCk7CisgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxT
dHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0
Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKKyAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUg
PSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7CisgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsK
K30KKwogU3R5bGVSZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZG9jdW1lbnQsIGJv
b2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQogICAgIDogbV9tYXRjaGVkUHJvcGVydGllc0Nh
Y2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAoMCkKICAgICAsIG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZVN3ZWVwVGltZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZSkKQEAgLTQwNSwxODIgKzM5MCw2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBN
YXRjaGVkUHJvcGVydGkKICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5j
ZUxhc3RTd2VlcCA9IDA7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkTWF0Y2hlZFByb3Bl
cnRpZXMoTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBw
cm9wZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1bGUsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUsIFByb3Bl
cnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCi17Ci0gICAgbWF0Y2hSZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuZ3JvdyhtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgKyAxKTsKLSAgICBNYXRjaGVkUHJvcGVydGllcyYgbmV3UHJvcGVydGllcyA9IG1hdGNo
UmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmxhc3QoKTsKLSAgICBuZXdQcm9wZXJ0aWVzLnByb3Bl
cnRpZXMgPSBjb25zdF9jYXN0PFN0eWxlUHJvcGVydHlTZXQqPihwcm9wZXJ0aWVzKTsKLSAgICBu
ZXdQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGUgPSBsaW5rTWF0Y2hUeXBlOwotICAgIG5ld1Byb3Bl
cnRpZXMud2hpdGVsaXN0VHlwZSA9IHByb3BlcnR5V2hpdGVsaXN0VHlwZTsKLSAgICBtYXRjaFJl
c3VsdC5tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJl
c29sdmVyOjphZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGNv
bnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnR5U2V0LCBib29sIGlzQ2FjaGVhYmxlKQotewot
ICAgIGlmICghcHJvcGVydHlTZXQpCi0gICAgICAgIHJldHVybjsKLSAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKLSAgICBp
ZiAocmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPT0gLTEpCi0gICAgICAgIHJlc3VsdC5y
YW5nZXMuZmlyc3RBdXRob3JSdWxlID0gcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZTsKLSAg
ICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHByb3BlcnR5U2V0KTsKLSAgICBpZiAoIWlz
Q2FjaGVhYmxlKQotICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLX0KLQotY2xh
c3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgewotcHVibGljOgotICAgIE1hdGNoaW5nVUFSdWxlc1Nj
b3BlKCk7Ci0gICAgfk1hdGNoaW5nVUFSdWxlc1Njb3BlKCk7Ci0KLSAgICBzdGF0aWMgYm9vbCBp
c01hdGNoaW5nVUFSdWxlcygpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBib29sIG1fbWF0Y2hp
bmdVQVJ1bGVzOwotfTsKLQotTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Ok1hdGNoaW5nVUFSdWxlc1Nj
b3BlKCkKLXsKLSAgICBBU1NFUlQoIW1fbWF0Y2hpbmdVQVJ1bGVzKTsKLSAgICBtX21hdGNoaW5n
VUFSdWxlcyA9IHRydWU7Ci19Ci0KLU1hdGNoaW5nVUFSdWxlc1Njb3BlOjp+TWF0Y2hpbmdVQVJ1
bGVzU2NvcGUoKQotewotICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7Ci19Ci0KLWlubGlu
ZSBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi17Ci0gICAg
cmV0dXJuIG1fbWF0Y2hpbmdVQVJ1bGVzOwotfQotCi1ib29sIE1hdGNoaW5nVUFSdWxlc1Njb3Bl
OjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxl
Y3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFu
Z2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOwotICAg
IEFTU0VSVChtX3N0YXRlLmVsZW1lbnQoKSk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCk7Ci0gICAgY29uc3QgU3R5
bGVkRWxlbWVudCogc3R5bGVkRWxlbWVudCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKTsKLSAgICBj
b25zdCBBdG9taWNTdHJpbmcmIHBzZXVkb0lkID0gZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKTsK
LSAgICBpZiAoIXBzZXVkb0lkLmlzRW1wdHkoKSkgewotICAgICAgICBBU1NFUlQoc3R5bGVkRWxl
bWVudCk7Ci0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3Qu
cnVsZVNldC0+c2hhZG93UHNldWRvRWxlbWVudFJ1bGVzKHBzZXVkb0lkLmltcGwoKSksIG1hdGNo
UmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0g
ICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpKQotICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmN1ZVBzZXVkb1J1bGVzKCksIG1h
dGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSNlbmRpZgotICAgIC8vIENoZWNrIHdoZXRoZXIgb3Ro
ZXIgdHlwZXMgb2YgcnVsZXMgYXJlIGFwcGxpY2FibGUgaW4gdGhlIGN1cnJlbnQgdHJlZSBzY29w
ZS4gQ3JpdGVyaWEgZm9yIHRoaXM6Ci0gICAgLy8gYSkgaXQncyBhIFVBIHJ1bGUKLSAgICAvLyBi
KSB0aGUgdHJlZSBzY29wZSBhbGxvd3MgYXV0aG9yIHJ1bGVzCi0gICAgLy8gYykgdGhlIHJ1bGVz
IGNvbWVzIGZyb20gYSBzY29wZWQgc3R5bGUgc2hlZXQgd2l0aGluIHRoZSBzYW1lIHRyZWUgc2Nv
cGUKLSAgICBUcmVlU2NvcGUqIHRyZWVTY29wZSA9IGVsZW1lbnQtPnRyZWVTY29wZSgpOwotICAg
IGlmICghTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKLSAgICAgICAg
JiYgIXRyZWVTY29wZS0+YXBwbHlBdXRob3JTdHlsZXMoKQotICAgICAgICAmJiAoIW1hdGNoUmVx
dWVzdC5zY29wZSB8fCBtYXRjaFJlcXVlc3Quc2NvcGUtPnRyZWVTY29wZSgpICE9IHRyZWVTY29w
ZSkKLSAgICAgICAgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAgICByZXR1cm47Ci0KLSAgICAv
LyBXZSBuZWVkIHRvIGNvbGxlY3QgdGhlIHJ1bGVzIGZvciBpZCwgY2xhc3MsIHRhZywgYW5kIGV2
ZXJ5dGhpbmcgZWxzZSBpbnRvIGEgYnVmZmVyIGFuZAotICAgIC8vIHRoZW4gc29ydCB0aGUgYnVm
ZmVyLgotICAgIGlmIChlbGVtZW50LT5oYXNJRCgpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmlkUnVsZXMoZWxlbWVudC0+aWRGb3JT
dHlsZVJlc29sdXRpb24oKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAg
aWYgKHN0eWxlZEVsZW1lbnQgJiYgc3R5bGVkRWxlbWVudC0+aGFzQ2xhc3MoKSkgewotICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMoKS5zaXpl
KCk7ICsraSkKLSAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+Y2xhc3NSdWxlcyhzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKClbaV0u
aW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIH0KLQotICAgIGlmIChlbGVt
ZW50LT5pc0xpbmsoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5saW5rUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7Ci0gICAgaWYgKFNlbGVjdG9yQ2hlY2tlcjo6bWF0Y2hlc0ZvY3VzUHNldWRvQ2xh
c3MoZWxlbWVudCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJl
cXVlc3QucnVsZVNldC0+Zm9jdXNQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1
bGVTZXQtPnRhZ1J1bGVzKGVsZW1lbnQtPmxvY2FsTmFtZSgpLmltcGwoKSksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1
ZXN0LnJ1bGVTZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihj
b25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17
Ci0gICAgaWYgKCFtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgdW5zaWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVj
dG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6
ZTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciA9IG1h
dGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNl
bGVjdG9yOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxlY3Rvciwg
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpLT5ub2RlKCkp
KSkgewotICAgICAgICAgICAgUnVsZVNldCogcmVnaW9uUnVsZXMgPSBtYXRjaFJlcXVlc3QucnVs
ZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpOwot
ICAgICAgICAgICAgQVNTRVJUKHJlZ2lvblJ1bGVzKTsKLSAgICAgICAgICAgIGNvbGxlY3RNYXRj
aGluZ1J1bGVzKE1hdGNoUmVxdWVzdChyZWdpb25SdWxlcywgbWF0Y2hSZXF1ZXN0LmluY2x1ZGVF
bXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3Quc2NvcGUpLCBydWxlUmFuZ2UpOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhNYXRjaFJlc3VsdCYgcmVzdWx0KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0g
ICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSBzdGF0ZS5tYXRj
aGVkUnVsZXMoKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgc29ydE1hdGNoZWRSdWxlcygpOwotCi0gICAgaWYgKHN0YXRlLm1vZGUoKSA9
PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewotICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgKytpKQotICAgICAgICAgICAgc3Rh
dGUuZW5zdXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxl
KCktPmNyZWF0ZUNTU09NV3JhcHBlcigpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IC8vIE5vdyB0cmFuc2ZlciB0aGUgc2V0IG9mIG1hdGNoZWQgcnVsZXMgb3ZlciB0byBvdXIgbGlz
dCBvZiBkZWNsYXJhdGlvbnMuCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRS
dWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoc3RhdGUuc3R5bGUoKSAmJiBtYXRjaGVk
UnVsZXNbaV0tPmNvbnRhaW5zVW5jb21tb25BdHRyaWJ1dGVTZWxlY3RvcigpKQotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7Ci0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0
aWVzKHJlc3VsdCwgbWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPnByb3BlcnRpZXMoKSwgbWF0Y2hl
ZFJ1bGVzW2ldLT5ydWxlKCksIG1hdGNoZWRSdWxlc1tpXS0+bGlua01hdGNoVHlwZSgpLCBtYXRj
aGVkUnVsZXNbaV0tPnByb3BlcnR5V2hpdGVsaXN0VHlwZSgpKTsKLSAgICB9Ci19Ci0KLXZvaWQg
U3R5bGVSZXNvbHZlcjo6bWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0
LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQotewotI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8
IEVOQUJMRShTSEFET1dfRE9NKQotICAgIGlmICghbV9zY29wZVJlc29sdmVyKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICAvLyBNYXRjaCBzY29wZWQgYXV0aG9yIHJ1bGVzIGJ5IHRyYXZlcnNpbmcg
dGhlIHNjb3BlZCBlbGVtZW50IHN0YWNrIChyZWJ1aWxkIGl0IGlmIGl0IGdvdCBpbmNvbnNpc3Rl
bnQpLgotICAgIGlmIChtX3Njb3BlUmVzb2x2ZXItPmhhc1Njb3BlZFN0eWxlcygpICYmIG1fc2Nv
cGVSZXNvbHZlci0+ZW5zdXJlU3RhY2tDb25zaXN0ZW5jeShtX3N0YXRlLmVsZW1lbnQoKSkpIHsK
LSAgICAgICAgYm9vbCBhcHBseUF1dGhvclN0eWxlcyA9IG1fc3RhdGUuZWxlbWVudCgpLT50cmVl
U2NvcGUoKS0+YXBwbHlBdXRob3JTdHlsZXMoKTsKLSAgICAgICAgYm9vbCBkb2N1bWVudFNjb3Bl
ID0gdHJ1ZTsKLSAgICAgICAgdW5zaWduZWQgc2NvcGVTaXplID0gbV9zY29wZVJlc29sdmVyLT5z
dGFja1NpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNjb3BlU2l6ZTsg
KytpKSB7Ci0gICAgICAgICAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAg
ICAgICAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICAgICAgICAgIGNvbnN0IFN0eWxlU2NvcGVSZXNvbHZl
cjo6U3RhY2tGcmFtZSYgZnJhbWUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrRnJhbWVBdChpKTsK
LSAgICAgICAgICAgIGRvY3VtZW50U2NvcGUgPSBkb2N1bWVudFNjb3BlICYmICFmcmFtZS5tX3Nj
b3BlLT5pc0luU2hhZG93VHJlZSgpOwotICAgICAgICAgICAgaWYgKGRvY3VtZW50U2NvcGUpIHsK
LSAgICAgICAgICAgICAgICBpZiAoIWFwcGx5QXV0aG9yU3R5bGVzKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYg
KCFtX3Njb3BlUmVzb2x2ZXItPm1hdGNoZXNTdHlsZUJvdW5kcyhmcmFtZSkpCi0gICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXRjaFJl
cXVlc3QgbWF0Y2hSZXF1ZXN0KGZyYW1lLm1fcnVsZVNldCwgaW5jbHVkZUVtcHR5UnVsZXMsIGZy
YW1lLm1fc2NvcGUpOwotICAgICAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5y
YW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
cyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgICAgICAgICBzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IG1hdGNoSG9zdFJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOwotI2Vsc2UKLSAgICBV
TlVTRURfUEFSQU0ocmVzdWx0KTsKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMp
OwotI2VuZGlmCi19Ci0KIGlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0Nh
bmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKQogewogI2lmIEVOQUJMRShTSEFET1dfRE9NKQpAQCAt
NTkwLDE5NyArMzk5LDYgQEAgaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5n
QwogI2VuZGlmCiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hIb3N0UnVsZXMoTWF0Y2hS
ZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSNpZiBFTkFCTEUoU0hB
RE9XX0RPTSkKLSAgICBBU1NFUlQobV9zY29wZVJlc29sdmVyKTsKLQotICAgIG1fc3RhdGUubWF0
Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0g
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICBWZWN0b3I8UnVsZVNl
dCo+IG1hdGNoZWRSdWxlczsKLSAgICBtX3Njb3BlUmVzb2x2ZXItPm1hdGNoSG9zdFJ1bGVzKG1f
c3RhdGUuZWxlbWVudCgpLCBtYXRjaGVkUnVsZXMpOwotICAgIGlmIChtYXRjaGVkUnVsZXMuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBtYXRjaGVk
UnVsZXMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2Ug
PSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhNYXRjaFJlcXVlc3QobWF0Y2hlZFJ1bGVzLmF0KGktMSksIGluY2x1ZGVFbXB0eVJ1
bGVzLCBtX3N0YXRlLmVsZW1lbnQoKSksIHJ1bGVSYW5nZSk7Ci0gICAgfQotICAgIHNvcnRBbmRU
cmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0ocmVz
dWx0KTsKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZUVtcHR5UnVsZXMpOwotI2VuZGlmCi19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0
LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQotewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCku
Y2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0KLSAgICBpZiAoIW1fc3RhdGUuZWxlbWVudCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBNYXRjaCBnbG9iYWwgYXV0aG9yIHJ1bGVzLgotICAg
IE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpbmNs
dWRlRW1wdHlSdWxlcyk7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMu
YXV0aG9yUnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBWZWN0b3I8TWF0
Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOwotICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0
ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJl
cXVlc3RzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgp
OyArK2kpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdHNbaV0sIHJ1
bGVSYW5nZSk7Ci0jZW5kaWYKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1
bHQpOwotCi0gICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1
bGVzKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3Vs
dCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQotewotICAgIGlmICghbV9ydWxlU2V0
cy51c2VyU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIG1fc3RhdGUubWF0Y2hl
ZFJ1bGVzKCkuY2xlYXIoKTsKLQotICAgIHJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlID0gcmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgTWF0Y2hSZXF1ZXN0IG1hdGNo
UmVxdWVzdChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAg
UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMudXNlclJ1bGVSYW5nZSgpOwotICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0KLSAg
ICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMp
Ci17Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIAotICAgIHJlc3Vs
dC5yYW5nZXMubGFzdFVBUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAx
OwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLlVBUnVsZVJhbmdlKCk7
Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJ1bGVzKSwgcnVsZVJhbmdl
KTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOwotfQotCi12b2lk
IFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8
UnVsZURhdGE+KiBydWxlcywgY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVS
YW5nZSYgcnVsZVJhbmdlKQotewotICAgIGlmICghcnVsZXMpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkg
ZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxl
IG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KLSAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVy
IGZpbHRlciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNl
IHRoZSBmYXN0IHBhdGguCi0gICAgYm9vbCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZp
bHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNo
UmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jv
c3NCb3VuZGFyeTsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOwotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgY29uc3QgUnVsZURh
dGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0KGkpOwotICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVj
dCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11
bUlkZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhh
c2hlcygpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIFN0eWxlUnVsZSogcnVs
ZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1
bWVudCgpLCBydWxlLCB0aGlzKTsKLSAgICAgICAgUHNldWRvSWQgZHluYW1pY1BzZXVkbyA9IE5P
UFNFVURPOwotICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVxdWVzdC5z
Y29wZSwgZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSkpIHsK
LSAgICAgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0
aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUuCi0gICAgICAgICAgICBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAg
ICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNo
UmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcykpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBv
c2luZyB0aGUgbm9uLXN0YW5kYXJkIGdldE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRo
ZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1Nh
bWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkg
ewotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBw
c2V1ZG8gYml0IGlmCi0gICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNl
dWRvLWVsZW1lbnQuCi0gICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAm
JiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCA9PSBOT1BTRVVETykgewotICAg
ICAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0
aW5nUnVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
OjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVk
byA8IEZJUlNUX0lOVEVSTkFMX1BTRVVET0lEKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRIYXNQc2V1ZG9TdHlsZShkeW5hbWljUHNldWRvKTsKLSAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIG91ciBmaXJzdC9sYXN0IHJ1bGUgaW5k
aWNlcyBpbiB0aGUgbWF0Y2hlZCBydWxlcyBhcnJheS4KLSAgICAgICAgICAgICAgICArK3J1bGVS
YW5nZS5sYXN0UnVsZUluZGV4OwotICAgICAgICAgICAgICAgIGlmIChydWxlUmFuZ2UuZmlyc3RS
dWxlSW5kZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHJ1bGVSYW5nZS5maXJzdFJ1bGVJ
bmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVsZUluZGV4OwotCi0gICAgICAgICAgICAgICAgLy8gQWRk
IHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICAgICAgICAg
IG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKLSAgICAgICAgICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIHRydWUpOwotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAg
IH0KLX0KLQotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdWxlRGF0YSog
cjEsIGNvbnN0IFJ1bGVEYXRhKiByMikKLXsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTEgPSBy
MS0+c3BlY2lmaWNpdHkoKTsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSByMi0+c3BlY2lm
aWNpdHkoKTsKLSAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEt
PnBvc2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5
MjsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKLXsKLSAgICBz
dGQ6OnNvcnQobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5iZWdpbigpLCBtX3N0YXRlLm1hdGNoZWRS
dWxlcygpLmVuZCgpLCBjb21wYXJlUnVsZXMpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRp
ZXMpCi17Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCk7Ci0KLSAgICAvLyBOb3cgd2UgY2hlY2sg
dXNlciBzaGVldCBydWxlcy4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0g
ICAgICAgIG1hdGNoVXNlclJ1bGVzKHJlc3VsdCwgZmFsc2UpOwotCi0gICAgLy8gTm93IGNoZWNr
IGF1dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGggcHJlc2VudGF0aW9uYWwgYXR0cmli
dXRlcyBtYXBwZWQgZnJvbSBIVE1MLgotICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkg
ewotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIC8v
IE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFsIG1hcHBlZCBkZWNsYXJhdGlvbnMuCi0gICAgICAgIC8v
IFRhYmxlcyBhbmQgdGFibGUgY2VsbHMgc2hhcmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0
aGF0IG11c3QgYmUgYXBwbGllZAotICAgICAgICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2lu
Y2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBh
dHRyaWJ1dGVzLgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9z
dGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHls
ZSgpKTsKLQotICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1l
bnQoKSkgewotICAgICAgICAgICAgYm9vbCBpc0F1dG87Ci0gICAgICAgICAgICBUZXh0RGlyZWN0
aW9uIHRleHREaXJlY3Rpb24gPSB0b0hUTUxFbGVtZW50KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
KS0+ZGlyZWN0aW9uYWxpdHlJZmhhc0RpckF1dG9BdHRyaWJ1dGUoaXNBdXRvKTsKLSAgICAgICAg
ICAgIGlmIChpc0F1dG8pCi0gICAgICAgICAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVz
dWx0LCB0ZXh0RGlyZWN0aW9uID09IExUUiA/IGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKSA6IHJp
Z2h0VG9MZWZ0RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8g
Q2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMgbmV4dC4KLSAgICBpZiAobV9tYXRjaEF1
dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMocmVzdWx0LCBmYWxz
ZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBzdHlsZSBhdHRyaWJ1dGUuCi0gICAg
aWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
ICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKSB7Ci0gICAgICAgIC8v
IElubGluZSBzdHlsZSBpcyBpbW11dGFibGUgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBDU1NPTSB3
cmFwcGVyLgotICAgICAgICAvLyBGSVhNRTogTWVkaWEgY29udHJvbCBzaGFkb3cgdHJlZXMgc2Vl
bSB0byBoYXZlIHByb2JsZW1zIHdpdGggY2FjaGluZy4KLSAgICAgICAgYm9vbCBpc0lubGluZVN0
eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5p
c011dGFibGUoKSAmJiAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7
Ci0gICAgICAgIC8vIEZJWE1FOiBDb25zdGlmeS4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJv
cGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBp
c0lubGluZVN0eWxlQ2FjaGVhYmxlKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIC8v
IE5vdyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHlsZS4KLSAgICBpZiAoaW5jbHVk
ZVNNSUxQcm9wZXJ0aWVzICYmIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUu
c3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQo
KSkKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRpY19jYXN0
PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxl
UHJvcGVydGllcygpLCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAqLyk7Ci0jZWxzZQotICAgIFVOVVNF
RF9QQVJBTShpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotI2VuZGlmCi19Ci0KIGJvb2wgU3R5bGVS
ZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0U3RyaW5n
JiBjbGFzc05hbWVzKSBjb25zdAogewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjbGFz
c05hbWVzLnNpemUoKTsgKytpKSB7CkBAIC04MDgsOSArNDI2LDggQEAgaW5saW5lIHZvaWQgU3R5
bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRQogICAgIH0KIH0KIAotaW5saW5lIHZvaWQgU3R5bGVS
ZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBF
bGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVx
dWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcp
CitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShE
b2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwg
UmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQogewotICAgIG1fcHNldWRvU3R5bGVSZXF1
ZXN0ID0gcHNldWRvU3R5bGVSZXF1ZXN0OwogICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IHJlZ2lv
bkZvclN0eWxpbmc7CiAKICAgICBpZiAoZSkgewpAQCAtODMyLDcgKzQ0OSw2IEBAIGlubGluZSB2
b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm8KIAogICAgIG1fc3R5bGUgPSAwOwogICAg
IG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOwotICAgIG1fcnVsZUxpc3QgPSAwOwog
ICAgIG1fZm9udERpcnR5ID0gZmFsc2U7CiB9CiAKQEAgLTkwMCwxNyArNTE2LDkgQEAgYm9vbCBT
dHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdAogewogICAgIGlmICghcnVsZVNldCkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIo
KTsKIAotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxlcyk7
Ci0gICAgaW50IGZpcnN0UnVsZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsKLSAgICBS
dWxlUmFuZ2UgcnVsZVJhbmdlKGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKLSAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7Ci0g
ICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwotICAg
IGlmIChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXR1cm4gdHJ1
ZTsKKyAgICBFbGVtZW50UnVsZUNvbGxlY3RvciBjb2xsZWN0b3IodGhpcywgbV9zdGF0ZSk7Cisg
ICAgcmV0dXJuIGNvbGxlY3Rvci5oYXNBbnlNYXRjaGluZ1J1bGVzKHJ1bGVTZXQpOwogfQogCiBi
b29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50
KiBlbGVtZW50KSBjb25zdApAQCAtMTE3OCwyNiArNzg2LDYgQEAgUmVuZGVyU3R5bGUqIFN0eWxl
UmVzb2x2ZXI6OmxvY2F0ZVNoYXJlZAogICAgIHJldHVybiBzaGFyZUVsZW1lbnQtPnJlbmRlclN0
eWxlKCk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0
JiByZXN1bHQpCi17Ci0gICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7Ci0KLSAgICAvLyBG
aXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgotICAgIGlmIChD
U1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQotICAgICAgICBy
ZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKLSAgICBSdWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNo
ZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3BlY2lmaWMoInByaW50IikKLSAgICAgICAg
PyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgdXNlckFn
ZW50U3R5bGVTaGVldCk7Ci0KLSAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMg
ZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50KCktPmlu
UXVpcmtzTW9kZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7Ci0KLSAgICAvLyBJZiBkb2N1bWVudCB1c2Vz
IHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBpbiB4bWwgdmlld2Vy
IG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291cmNlIHN0eWxlIHNo
ZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKLSAgICAgICAgbWF0Y2hV
QVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7
Ci19Ci0KIHN0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFBhZ2luYXRpb246
Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxlKiBzdHlsZSkKIHsKICAgICBpZiAocGFn
aW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpCkBAIC0xMzk1LDcgKzk4Myw3
IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnMKIAogICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CiAgICAgaW5pdEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgc3RhdGUu
aW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCBO
T1BTRVVETywgcmVnaW9uRm9yU3R5bGluZyk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2
ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCByZWdpb25Gb3JTdHlsaW5nKTsK
ICAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFzdGF0ZS5k
aXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgewogICAgICAgICBSZW5kZXJTdHlsZSogc2hh
cmVkU3R5bGUgPSBsb2NhdGVTaGFyZWRTdHlsZSgpOwogICAgICAgICBpZiAoc2hhcmVkU3R5bGUp
CkBAIC0xNDM3LDEzICsxMDI1LDE2IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnMKICAgICBpZiAobmVlZHNDb2xsZWN0aW9uKQogICAgICAgICBtX3J1bGVTZXRzLmNv
bGxlY3RGZWF0dXJlcyhkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29sdmVy
LmdldCgpKTsKIAotICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OworICAgIEVsZW1lbnRSdWxl
Q29sbGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBzdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldFJlZ2lv
bkZvclN0eWxpbmcocmVnaW9uRm9yU3R5bGluZyk7CisgICAgY29sbGVjdG9yLnNldE1lZGl1bSht
X21lZGl1bS5nZXQoKSk7CisKICAgICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9PSBNYXRjaE9ubHlV
c2VyQWdlbnRSdWxlcykKLSAgICAgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKyAgICAg
ICAgY29sbGVjdG9yLm1hdGNoVUFSdWxlcygpOwogICAgIGVsc2UKLSAgICAgICAgbWF0Y2hBbGxS
dWxlcyhtYXRjaFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVk
aW5nU01JTCk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaEFsbFJ1bGVzKG1fbWF0Y2hBdXRob3JB
bmRVc2VyU3R5bGVzLCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdT
TUlMKTsKIAotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGVsZW1lbnQp
OworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKSwg
ZWxlbWVudCk7CiAKICAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBh
bmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KICAgICBhZGp1c3RSZW5k
ZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBlbGVtZW50KTsKQEAg
LTE0NjAsNyArMTA1MSw3IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6
OnMKIHsKICAgICBNYXRjaFJlc3VsdCByZXN1bHQ7CiAgICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0
aWVzKCkpCi0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUtPnBy
b3BlcnRpZXMoKSk7CisgICAgICAgIHJlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhrZXlmcmFt
ZS0+cHJvcGVydGllcygpKTsKIAogICAgIEFTU0VSVCghbV9zdGF0ZS5zdHlsZSgpKTsKIApAQCAt
MTU4NCw3ICsxMTc1LDcgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6
cAogCiAgICAgaW5pdEVsZW1lbnQoZSk7CiAKLSAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlLCBwc2V1ZG9TdHlsZVJlcXVlc3QpOworICAgIHN0
YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUpOwogICAg
IHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CiAgICAgc3RhdGUuc3R5bGUo
KS0+aW5oZXJpdEZyb20obV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKIApAQCAtMTU5MiwyMCArMTE4
MywyMiBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpwCiAgICAgLy8g
dGhvc2UgcnVsZXMuCiAKICAgICAvLyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVzLgot
ICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OwotICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3Vs
dCk7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIHN0YXRlKTsKKyAg
ICBjb2xsZWN0b3Iuc2V0UHNldWRvU3R5bGVSZXF1ZXN0KHBzZXVkb1N0eWxlUmVxdWVzdCk7Cisg
ICAgY29sbGVjdG9yLnNldE1lZGl1bShtX21lZGl1bS5nZXQoKSk7CisgICAgY29sbGVjdG9yLm1h
dGNoVUFSdWxlcygpOwogCiAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSB7Ci0g
ICAgICAgIG1hdGNoVXNlclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgIG1hdGNo
QXV0aG9yUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgY29sbGVjdG9yLm1hdGNo
VXNlclJ1bGVzKGZhbHNlKTsKKyAgICAgICAgY29sbGVjdG9yLm1hdGNoQXV0aG9yUnVsZXMoZmFs
c2UpOwogICAgIH0KIAotICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5pc0Vt
cHR5KCkpCisgICAgaWYgKGNvbGxlY3Rvci5tYXRjaGVkUmVzdWx0KCkubWF0Y2hlZFByb3BlcnRp
ZXMuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIHN0YXRlLnN0eWxlKCktPnNl
dFN0eWxlVHlwZShwc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQpOwogCi0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
cyhjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpLCBlKTsKIAogICAgIC8vIENsZWFuIHVwIG91ciBz
dHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBm
aXh1cHMpLgogICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIG1fc3RhdGUucGFy
ZW50U3R5bGUoKSwgMCk7CkBAIC0xNjI2LDE3ICsxMjE5LDEyIEBAIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnMKICAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxl
OjpjcmVhdGUoKSk7CiAgICAgbV9zdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnJv
b3RFbGVtZW50U3R5bGUoKSk7CiAKLSAgICBjb25zdCBib29sIGlzTGVmdCA9IGlzTGVmdFBhZ2Uo
cGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5k
ZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsKLSAgICAK
LSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NE
ZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBh
Z2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwg
aXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwg
YXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCi0g
ICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVm
dCwgaXNGaXJzdCwgcGFnZSk7CisgICAgUGFnZVJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKG1fc3Rh
dGUsIG1fcnVsZVNldHMpOworICAgIGNvbGxlY3Rvci5tYXRjaEFsbFBhZ2VSdWxlcyhwYWdlSW5k
ZXgpOwogICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwogICAgIGJvb2wgaW5oZXJp
dGVkT25seSA9IGZhbHNlOworCisgICAgTWF0Y2hSZXN1bHQmIHJlc3VsdCA9IGNvbGxlY3Rvci5t
YXRjaGVkUmVzdWx0KCk7CiAjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCiAgICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CiAjZW5kaWYK
QEAgLTIwNjIsODkgKzE2NTAsMzEgQEAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNv
bHZlcjo6cAogICAgIGlmICghZSB8fCAhZS0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hlZXRzTG9h
ZGVkKCkpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9y
Q2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKLQogICAgIGluaXRFbGVtZW50KGUpOwotICAgIG1f
c3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCAwLCBwc2V1ZG9JZCk7Cisg
ICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDApOworCisgICAg
RWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIG1fc3RhdGUpOworICAgIGNvbGxl
Y3Rvci5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKKyAgICBjb2xs
ZWN0b3Iuc2V0UHNldWRvU3R5bGVSZXF1ZXN0KFBzZXVkb1N0eWxlUmVxdWVzdChwc2V1ZG9JZCkp
OworICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0obV9tZWRpdW0uZ2V0KCkpOwogCi0gICAgTWF0Y2hS
ZXN1bHQgZHVtbXk7CiAgICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMp
IHsKICAgICAgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBz
aGVldC4KLSAgICAgICAgbWF0Y2hVQVJ1bGVzKGR1bW15KTsKLQorICAgICAgICBjb2xsZWN0b3Iu
bWF0Y2hVQVJ1bGVzKCk7CisgICAgICAgIAogICAgICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBz
aGVldCBydWxlcy4KICAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAg
ICAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NS
dWxlcyk7CisgICAgICAgICAgICBjb2xsZWN0b3IubWF0Y2hVc2VyUnVsZXMocnVsZXNUb0luY2x1
ZGUgJiBFbXB0eUNTU1J1bGVzKTsKICAgICB9CiAKICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMgJiYgKHJ1bGVzVG9JbmNsdWRlICYgQXV0aG9yQ1NTUnVsZXMpKSB7Ci0gICAgICAg
IG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoIShydWxlc1RvSW5jbHVkZSAmIENyb3NzT3JpZ2lu
Q1NTUnVsZXMpKTsKKyAgICAgICAgY29sbGVjdG9yLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVsZXNU
b0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhl
IHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCi0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoZHVtbXks
IHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7Ci0KLSAgICAgICAgbV9zdGF0ZS5zZXRT
YW1lT3JpZ2luT25seShmYWxzZSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaEF1dGhvclJ1bGVz
KHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CiAgICAgfQogCi0gICAgbV9zdGF0ZS5z
ZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwotCi0gICAgcmV0dXJuIG1f
c3RhdGUudGFrZVJ1bGVMaXN0KCk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1
bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSog
c2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9y
QXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLQotICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgewot
ICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNl
dWRvIGVsZW1lbnRzLgotICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNl
dWRvSWQgIT0gTk9QU0VVRE8pCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8v
IFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNo
ZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgotICAgICAg
ICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hl
Y2sgdGhlIG5hbWVzcGFjZS4KLSAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVj
dG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hU
TUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2Vs
ZWN0b3IoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYm
ICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5z
ZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgocnVsZURh
dGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFzZWxlY3RvckNo
ZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVja2VyRmFz
dFBhdGgubWF0Y2hlcygpOwotICAgIH0KLQotICAgIC8vIFNsb3cgcGF0aC4KLSAgICBTZWxlY3Rv
ckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUoKSk7Ci0gICAg
U2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1bGVEYXRh
LnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0
Y2hFbmFibGVkKTsKLSAgICBjb250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxlKCk7Ci0g
ICAgY29udGV4dC5zY29wZSA9IHNjb3BlOwotICAgIGNvbnRleHQucHNldWRvSWQgPSBzdGF0ZS5w
c2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsKLSAgICBjb250ZXh0LnNjcm9sbGJhciA9IHN0
YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhcjsKLSAgICBjb250ZXh0LnNjcm9sbGJh
clBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0OwotICAgIGNv
bnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OwotICAgIFNlbGVj
dG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwg
ZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOwotICAgIGlmICht
YXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBO
T1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBkeW5hbWlj
UHNldWRvKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJv
b2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3Rvciog
cmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCi17Ci0gICAgaWYgKCFyZWdp
b25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX3N0YXRlLm1v
ZGUoKSk7Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBz
OyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKSB7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tl
cjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRleHQocywgcmVn
aW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxlZCk7Ci0gICAg
ICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYg
KHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwgaWdub3JlRHlu
YW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNlbGVjdG9yQ2hl
Y2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBjb2xsZWN0b3IubWF0Y2hlZFJ1bGVMaXN0
KCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI0MjMsODYgKzE5
NTMsNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFByb3BlcnRpCiAgICAgYWRk
VG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxl
KCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgY29t
cGFyZVBhZ2VSdWxlcyhjb25zdCBTdHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFn
ZSogcjIpCi17Ci0gICAgcmV0dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjIt
PnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0
Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNM
ZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAg
ICBpZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0b3I8U3R5bGVSdWxlUGFn
ZSo+IG1hdGNoZWRQYWdlUnVsZXM7Ci0gICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQ
YWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBh
Z2VOYW1lKTsKLSAgICBpZiAobWF0Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIHN0ZDo6c3RhYmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBt
YXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJlUGFnZVJ1bGVzKTsKLQotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICBh
ZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRp
ZXMoKSk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25z
dCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFn
ZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9y
KiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQt
PnRhZ0hpc3RvcnkoKSkgewotICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1Nl
bGVjdG9yOjpUYWcpIHsKLSAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1l
ID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKGxv
Y2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTU2VsZWN0b3I6OlBz
ZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVudC0+cHNldWRvVHlwZSgpOwotICAgICAgICBp
ZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQ
YWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1Jp
Z2h0UGFnZSAmJiBpc0xlZnRQYWdlKQotICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NT
U2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAhaXNGaXJzdFBhZ2UpKQotICAgICAgICB7Ci0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3Rv
cjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBh
Z2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3Ry
aW5nJiBwYWdlTmFtZSkKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOwotCi0g
ICAgICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCks
IGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSkpCi0gICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwg
dGhlbiBpZ25vcmUgaXQuCi0gICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRp
ZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9w
ZXJ0aWVzLT5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBB
ZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgIG1hdGNo
ZWRSdWxlcy5hcHBlbmQocnVsZSk7Ci0gICAgfQotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6Omlz
TGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKLXsKLSAgICBib29sIGlzRmlyc3RQYWdlTGVm
dCA9IGZhbHNlOwotICAgIGlmICghbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSkKLSAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKLQotICAg
IHJldHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwotfQot
Ci1ib29sIFN0eWxlUmVzb2x2ZXI6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17
Ci0gICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBh
dCBpbmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgotICAgIHJldHVybiAoIXBh
Z2VJbmRleCk7Ci19Ci0KLVN0cmluZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFn
ZUluZGV4ICovKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0
byBwYWdlIG5hbWUgbWFwcGluZy4KLSAgICByZXR1cm4gIiI7Ci19Ci0KIHZvaWQgU3R5bGVSZXNv
bHZlcjo6YXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZh
bHVlLCBSZW5kZXJTdHlsZSogc3R5bGUpCiB7CiAgICAgaW5pdEVsZW1lbnQoMCk7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgJKHJldmlzaW9uIDE0NTE5MCkKKysrIFNvdXJjZS9X
ZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcg
QEAKICNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgogI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5o
IgogI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCisjaW5jbHVkZSAiU2libGluZ1RyYXZlcnNh
bFN0cmF0ZWdpZXMuaCIKICNpbmNsdWRlICJTdHlsZUluaGVyaXRlZERhdGEuaCIKICNpbmNsdWRl
ICJTdHlsZVNjb3BlUmVzb2x2ZXIuaCIKICNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIu
aCIKQEAgLTE1MywxNSArMTU0LDEzIEBAIHB1YmxpYzoKIAogY2xhc3MgTWF0Y2hSZXF1ZXN0IHsK
IHB1YmxpYzoKLSAgICBNYXRjaFJlcXVlc3QoUnVsZVNldCogcnVsZVNldCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcyA9IGZhbHNlLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSA9IDAsIFNlbGVj
dG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVj
dG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgTWF0Y2hSZXF1ZXN0KFJ1bGVT
ZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFp
bmVyTm9kZSogc2NvcGUgPSAwKQogICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKICAgICAgICAg
LCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAgICAgLCBzY29wZShz
Y29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7
IH0KKyAgICAgICAgLCBzY29wZShzY29wZSkgeyB9CiAgICAgY29uc3QgUnVsZVNldCogcnVsZVNl
dDsKICAgICBjb25zdCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzOwogICAgIGNvbnN0IENvbnRhaW5l
ck5vZGUqIHNjb3BlOwotICAgIGNvbnN0IFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5k
YXJ5IGJlaGF2aW9yQXRCb3VuZGFyeTsKIH07CiAKIC8vIFRoaXMgY2xhc3Mgc2VsZWN0cyBhIFJl
bmRlclN0eWxlIGZvciBhIGdpdmVuIGVsZW1lbnQgYmFzZWQgb24gYSBjb2xsZWN0aW9uIG9mIHN0
eWxlc2hlZXRzLgpAQCAtMjA3LDYgKzIwNiw3IEBAIHB1YmxpYzoKIAogICAgIERvY3VtZW50UnVs
ZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQogICAgIGNvbnN0IERvY3Vt
ZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsgfQorICAg
IFNlbGVjdG9yRmlsdGVyJiBzZWxlY3RvckZpbHRlcigpIHsgcmV0dXJuIG1fc2VsZWN0b3JGaWx0
ZXI7IH0KIAogI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQog
ICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCkBAIC0zMjUsMTMg
KzMyNSw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKIAot
cHJpdmF0ZToKLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQg
c2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZhbWlseSBo
YXMgY2hhbmdlZC4gLWR3aAotICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJl
bmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLSAgICB2b2lkIGNoZWNrRm9y
Wm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0KLSAg
ICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5k
ZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKLQogICAgIHN0cnVjdCBSdWxlUmFuZ2Ug
ewogICAgICAgICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUlu
ZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RS
dWxlSW5kZXgpIHsgfQogICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OwpAQCAtMzczLDMwICsz
NjYsMjEgQEAgcHJpdmF0ZToKICAgICAgICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVk
UnVsZXM7CiAgICAgICAgIE1hdGNoUmFuZ2VzIHJhbmdlczsKICAgICAgICAgYm9vbCBpc0NhY2hl
YWJsZTsKKworICAgICAgICB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJv
cGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hU
eXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0g
UHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKICAgICB9OwogCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0
Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9y
Q2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVs
aXN0Tm9uZSk7Ci0gICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0
JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKK3By
aXZhdGU6CisgICAgLy8gVGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNp
emUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFz
IGNoYW5nZWQuIC1kd2gKKyAgICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5k
ZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7CisgICAgdm9pZCBjaGVja0Zvclpv
b21DaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwogCi0gICAg
dm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRp
ZXMpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBtYXRj
aFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7Ci0gICAgdm9pZCBtYXRjaEF1dGhvclJ1
bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRj
aFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZv
aWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1
ZGVFbXB0eVJ1bGVzKTsKLQotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0
Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
clJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0
Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShSZW5k
ZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50
Kik7CiAKICAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYpIGNvbnN0
OwotICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOwotICAgIHZvaWQgc29ydEFuZFRyYW5zZmVy
TWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CiAKLSAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0
IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0
b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RD
cm9zc0JvdW5kYXJ5KTsKLSAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2Vs
ZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KTsKICAgICB2b2lk
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBjb25zdCBFbGVtZW50
Kik7CisKICAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKICNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9ucywKQEAgLTQ0NSwxMiArNDI5LDkg
QEAgcHVibGljOgogICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3Jvb3RF
bGVtZW50U3R5bGUoMCkKICAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKLSAgICAgICAg
LCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQotICAgICAgICAsIG1fcHNldWRvU3R5bGVSZXF1ZXN0
KE5PUFNFVURPKQogICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShOb3RJbnNpZGVMaW5rKQog
ICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZhbHNlKQogICAgICAgICAs
IG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQotICAgICAgICAsIG1fbW9kZShT
ZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQogICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0
eVRvUmVndWxhclN0eWxlKHRydWUpCiAgICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVk
TGlua1N0eWxlKGZhbHNlKQogI2lmIEVOQUJMRShDU1NfU0hBREVSUykKQEAgLTQ2Myw3ICs0NDQs
NyBAQCBwdWJsaWM6CiAKICAgICBwdWJsaWM6CiAgICAgICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxl
bWVudCopOwotICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqLCBFbGVt
ZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgY29uc3QgUHNldWRvU3R5bGVSZXF1
ZXN0JiA9IFBzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETyksIFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZyA9IDApOworICAgICAgICB2b2lkIGluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1l
bnQqLCBFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgUmVuZGVyUmVnaW9u
KiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CiAgICAgICAgIHZvaWQgY2xlYXIoKTsKIAogICAgICAg
ICBEb2N1bWVudCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50
KCk7IH0KQEAgLTQ3MywyNSArNDU0LDE3IEBAIHB1YmxpYzoKICAgICAgICAgUmVuZGVyU3R5bGUq
IHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQogICAgICAgICBQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVhc2UoKTsg
fQogCi0gICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOwotICAgICAg
ICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBtX3J1bGVM
aXN0LnJlbGVhc2UoKTsgfQotCiAgICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudE5v
ZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KICAgICAgICAgdm9pZCBzZXRQYXJl
bnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVu
dFN0eWxlOyB9CiAgICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0
dXJuIG1fcGFyZW50U3R5bGU7IH0KICAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KIAogICAgICAgICBjb25z
dCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBtX3JlZ2lv
bkZvclN0eWxpbmc7IH0KLSAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGlzU2Ft
ZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7IH0KLSAg
ICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1lT3JpZ2lu
T25seTsgfQotICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVx
dWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9CiAgICAgICAgIEVJ
bnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5r
U3RhdGU7IH0KICAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25z
dCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQogICAgICAgICB2b2lk
IHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVt
ZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CiAgICAgICAgIGJvb2wgZWxl
bWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0
ZWRCeUNsYXNzUnVsZXM7IH0KLSAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpN
b2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAgICAgICAgCisKICAgICAgICAg
dm9pZCBzZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBw
bHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlID0gaXNBcHBseTsgfQogICAgICAgICB2b2lkIHNldEFw
cGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoYm9vbCBpc0FwcGx5KSB7IG1fYXBwbHlQcm9w
ZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSA9IGlzQXBwbHk7IH0KICAgICAgICAgYm9vbCBhcHBseVBy
b3BlcnR5VG9SZWd1bGFyU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2FwcGx5UHJvcGVydHlUb1Jl
Z3VsYXJTdHlsZTsgfQpAQCAtNTI0LDkgKzQ5Nyw4IEBAIHB1YmxpYzoKICAgICAgICAgdm9pZCBz
ZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX2ZvbnREaXJ0eSB8PSBt
X3N0eWxlLT5zZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KICAgICAgICAgdm9pZCBzZXRU
ZXh0T3JpZW50YXRpb24oVGV4dE9yaWVudGF0aW9uIHRleHRPcmllbnRhdGlvbikgeyBtX2ZvbnRE
aXJ0eSB8PSBtX3N0eWxlLT5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQog
Ci0gICAgICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzKCkgeyBy
ZXR1cm4gbV9tYXRjaGVkUnVsZXM7IH0KLSAgICAgICAgdm9pZCBhZGRNYXRjaGVkUnVsZShjb25z
dCBSdWxlRGF0YSogcnVsZSkgeyBtX21hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7IH0KLSAgICAg
ICAgCisgICAgICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVt
ZW50ICYmIG1fZWxlbWVudC0+aXNTVkdFbGVtZW50KCk7IH0KKwogICAgIHByaXZhdGU6CiAgICAg
ICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZpZXcsIHRo
ZXNlIG1lbWJlcgogICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZlciB3ZSBz
aG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCkBAIC01MzcsMjQgKzUwOSwxNiBAQCBwdWJsaWM6
CiAgICAgICAgIENvbnRhaW5lck5vZGUqIG1fcGFyZW50Tm9kZTsKICAgICAgICAgUmVuZGVyU3R5
bGUqIG1fcGFyZW50U3R5bGU7CiAgICAgICAgIFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5
bGU7Ci0gICAgICAgIAotICAgICAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsK
LSAgICAgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5OwotICAgICAgICBQc2V1ZG9TdHlsZVJlcXVl
c3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7CiAKKyAgICAgICAgLy8gUmVxdWlyZWQgdG8gQVNTRVJU
IGluIGFwcGx5UHJvcGVydGllcy4KKyAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0
eWxpbmc7CisgICAgICAgIAogICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3RhdGU7
CiAKICAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKIAogICAgICAg
ICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOwogCi0gICAgICAgIFNlbGVjdG9y
Q2hlY2tlcjo6TW9kZSBtX21vZGU7Ci0KLSAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBob2xk
IHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKLSAgICAgICAgLy8gYW5k
IGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgotICAgICAgICBWZWN0
b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7Ci0gICAgICAgIFJlZlB0cjxT
dGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKLQogICAgICAgICBib29sIG1fYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlOwogICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRl
ZExpbmtTdHlsZTsKIApAQCAtNjkyLDYgKzY1NiwyMSBAQCBpbmxpbmUgYm9vbCBTdHlsZVJlc29s
dmVyOjpoYXNTZWxlY3RvckZvCiAgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJ
blJ1bGVzLmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKIH0KIAoraW5saW5lIGJvb2wgY2hlY2tS
ZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQq
IHJlZ2lvbkVsZW1lbnQpCit7CisgICAgaWYgKCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxl
bWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU2VsZWN0b3JDaGVja2VyIHNlbGVj
dG9yQ2hlY2tlcihyZWdpb25FbGVtZW50LT5kb2N1bWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlF1
ZXJ5aW5nUnVsZXMpOworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxl
Y3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkgeworICAgICAgICBTZWxlY3Rv
ckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0
KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQp
OworICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAg
ICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGln
bm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxl
Y3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAog
I2VuZGlmIC8vIFN0eWxlUmVzb2x2ZXJfaApJbmRleDogU291cmNlL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3RvckNTU0FnZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9pbnNw
ZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwCShyZXZpc2lvbiAxNDUxOTApCisrKyBTb3VyY2Uv
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC05NTgsMTEgKzk1OCwxMSBAQCBQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNlbGVjdG9y
UHJvCiAgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7CiB9CiAKLXZvaWQgSW5zcGVjdG9yQ1NT
QWdlbnQ6OndpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHls
ZVJlc29sdmVyKQordm9pZCBJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZShTdHlsZVJ1
bGUqIHJ1bGUsIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMs
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewog
Ly8gICAgcHJpbnRmKCJJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSAlc1xuIiwgcnVs
ZS0+c2VsZWN0b3JMaXN0KCkuc2VsZWN0b3JzVGV4dCgpLnV0ZjgoKS5kYXRhKCkpOwogICAgIGlm
IChtX2N1cnJlbnRTZWxlY3RvclByb2ZpbGUpCi0gICAgICAgIG1fY3VycmVudFNlbGVjdG9yUHJv
ZmlsZS0+c3RhcnRTZWxlY3RvcihzdHlsZVJlc29sdmVyLT5pbnNwZWN0b3JDU1NPTVdyYXBwZXJz
KCkuZ2V0V3JhcHBlckZvclJ1bGVJblNoZWV0cyhydWxlLCBzdHlsZVJlc29sdmVyLT5kb2N1bWVu
dCgpLT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpKSk7CisgICAgICAgIG1fY3VycmVudFNlbGVjdG9y
UHJvZmlsZS0+c3RhcnRTZWxlY3RvcihpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmdldFdyYXBwZXJG
b3JSdWxlSW5TaGVldHMocnVsZSwgc3R5bGVTaGVldENvbGxlY3Rpb24pKTsKIH0KIAogdm9pZCBJ
bnNwZWN0b3JDU1NBZ2VudDo6ZGlkTWF0Y2hSdWxlKGJvb2wgbWF0Y2hlZCkKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5oCShyZXZpc2lvbiAxNDUx
OTApCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaAkod29y
a2luZyBjb3B5KQpAQCAtNDcsNyArNDcsOSBAQCBjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uOwog
Y2xhc3MgQ1NTU3R5bGVSdWxlOwogY2xhc3MgQ1NTU3R5bGVTaGVldDsKIGNsYXNzIERvY3VtZW50
OworY2xhc3MgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbjsKIGNsYXNzIEVsZW1lbnQ7Citj
bGFzcyBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwogY2xhc3MgSW5zcGVjdG9yRnJvbnRlbmQ7CiBj
bGFzcyBJbnN0cnVtZW50aW5nQWdlbnRzOwogY2xhc3MgTmFtZU5vZGVNYXA7CkBAIC0xMjUsNyAr
MTI3LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBzdG9wU2VsZWN0b3JQcm9maWxlcihF
cnJvclN0cmluZyosIFJlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclByb2ZpbGU+Jik7
CiAKICAgICBQYXNzUmVmUHRyPFR5cGVCdWlsZGVyOjpDU1M6OlNlbGVjdG9yUHJvZmlsZT4gc3Rv
cFNlbGVjdG9yUHJvZmlsZXJJbXBsKEVycm9yU3RyaW5nKiwgYm9vbCBuZWVkUHJvZmlsZSk7Ci0g
ICAgdm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKKyAgICB2
b2lkIHdpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiwgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyYsIERv
Y3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qKTsKICAgICB2b2lkIGRpZE1hdGNoUnVsZShib29s
KTsKICAgICB2b2lkIHdpbGxQcm9jZXNzUnVsZShTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7
CiAgICAgdm9pZCBkaWRQcm9jZXNzUnVsZSgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvaW5zcGVj
dG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5jcHAJKHJldmlzaW9uIDE0
NTE5MCkKKysrIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRp
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01OTAsMTEgKzU5MCwxMSBAQCB2b2lkIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbjo6ZGlkU2NoZWR1CiAgICAgICAgIHJlc291cmNlQWdlbnQtPmRpZFNj
aGVkdWxlU3R5bGVSZWNhbGN1bGF0aW9uKGRvY3VtZW50KTsKIH0KIAotSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZUlt
cGwoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cywgU3R5bGVSdWxlKiBy
dWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQorSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZUltcGwoSW5z
dHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0FnZW50cywgU3R5bGVSdWxlKiBydWxlLCBJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uKiBzaGVldENvbGxlY3Rpb24pCiB7CiAgICAgSW5zcGVjdG9yQ1NT
QWdlbnQqIGNzc0FnZW50ID0gaW5zdHJ1bWVudGluZ0FnZW50cy0+aW5zcGVjdG9yQ1NTQWdlbnQo
KTsKICAgICBpZiAoY3NzQWdlbnQpIHsKLSAgICAgICAgY3NzQWdlbnQtPndpbGxNYXRjaFJ1bGUo
cnVsZSwgc3R5bGVSZXNvbHZlcik7CisgICAgICAgIGNzc0FnZW50LT53aWxsTWF0Y2hSdWxlKHJ1
bGUsIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIHNoZWV0Q29sbGVjdGlvbik7CiAgICAgICAgIHJl
dHVybiBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUoaW5zdHJ1bWVudGluZ0FnZW50cywg
MSk7CiAgICAgfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCShyZXZpc2lvbiAxNDUxOTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmgJKHdvcmtpbmcgY29weSkK
QEAgLTYxLDEwICs2MSwxMiBAQCBjbGFzcyBEb2N1bWVudDsKIGNsYXNzIEVsZW1lbnQ7CiBjbGFz
cyBFdmVudENvbnRleHQ7CiBjbGFzcyBEb2N1bWVudExvYWRlcjsKK2NsYXNzIERvY3VtZW50U3R5
bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBEZXZpY2VPcmllbnRhdGlvbkRhdGE7CiBjbGFzcyBH
ZW9sb2NhdGlvblBvc2l0aW9uOwogY2xhc3MgR3JhcGhpY3NDb250ZXh0OwogY2xhc3MgSW5zcGVj
dG9yQ1NTQWdlbnQ7CitjbGFzcyBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwogY2xhc3MgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uOwogY2xhc3MgSW5zcGVjdG9yVGltZWxpbmVBZ2VudDsKIGNsYXNz
IEluc3RydW1lbnRpbmdBZ2VudHM7CkBAIC0xNzQsNyArMTc2LDcgQEAgcHVibGljOgogICAgIHN0
YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbFJlY2FsY3VsYXRlU3R5bGUo
RG9jdW1lbnQqKTsKICAgICBzdGF0aWMgdm9pZCBkaWRSZWNhbGN1bGF0ZVN0eWxlKGNvbnN0IElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwogICAgIHN0YXRpYyB2b2lkIGRpZFNjaGVk
dWxlU3R5bGVSZWNhbGN1bGF0aW9uKERvY3VtZW50Kik7Ci0gICAgc3RhdGljIEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsTWF0Y2hSdWxlKERvY3VtZW50KiwgU3R5bGVSdWxlKiwg
U3R5bGVSZXNvbHZlciopOworICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29r
aWUgd2lsbE1hdGNoUnVsZShEb2N1bWVudCosIFN0eWxlUnVsZSosIEluc3BlY3RvckNTU09NV3Jh
cHBlcnMmLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKik7CiAgICAgc3RhdGljIHZvaWQg
ZGlkTWF0Y2hSdWxlKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYsIGJvb2wg
bWF0Y2hlZCk7CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxs
UHJvY2Vzc1J1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CiAgICAg
c3RhdGljIHZvaWQgZGlkUHJvY2Vzc1J1bGUoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9u
Q29va2llJik7CkBAIC0zNzUsNyArMzc3LDcgQEAgcHJpdmF0ZToKICAgICBzdGF0aWMgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxSZWNhbGN1bGF0ZVN0eWxlSW1wbChJbnN0cnVt
ZW50aW5nQWdlbnRzKiwgRnJhbWUqKTsKICAgICBzdGF0aWMgdm9pZCBkaWRSZWNhbGN1bGF0ZVN0
eWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmKTsKICAgICBzdGF0
aWMgdm9pZCBkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbkltcGwoSW5zdHJ1bWVudGluZ0Fn
ZW50cyosIERvY3VtZW50Kik7Ci0gICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNv
b2tpZSB3aWxsTWF0Y2hSdWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiwgU3R5bGVSdWxlKiwg
U3R5bGVSZXNvbHZlciopOworICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29r
aWUgd2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIFN0eWxlUnVsZSosIElu
c3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKik7CiAg
ICAgc3RhdGljIHZvaWQgZGlkTWF0Y2hSdWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50
YXRpb25Db29raWUmLCBib29sIG1hdGNoZWQpOwogICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb25Db29raWUgd2lsbFByb2Nlc3NSdWxlSW1wbChJbnN0cnVtZW50aW5nQWdlbnRzKiwg
U3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAgIHN0YXRpYyB2b2lkIGRpZFByb2Nlc3NS
dWxlSW1wbChjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmKTsKQEAgLTExNzgs
MTYgKzExODAsMTcgQEAgaW5saW5lIHZvaWQgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaQog
I2VuZGlmCiB9CiAKLWlubGluZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKERvY3VtZW50KiBkb2N1bWVudCwgU3R5
bGVSdWxlKiBydWxlLCBTdHlsZVJlc29sdmVyKiBzdHlsZVJlc29sdmVyKQoraW5saW5lIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxN
YXRjaFJ1bGUoRG9jdW1lbnQqIGRvY3VtZW50LCBTdHlsZVJ1bGUqIHJ1bGUsIEluc3BlY3RvckNT
U09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIERvY3VtZW50U3R5bGVTaGVldENv
bGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uKQogewogI2lmIEVOQUJMRShJTlNQRUNUT1Ip
CiAgICAgRkFTVF9SRVRVUk5fSUZfTk9fRlJPTlRFTkRTKEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bkNvb2tpZSgpKTsKICAgICBpZiAoSW5zdHJ1bWVudGluZ0FnZW50cyogaW5zdHJ1bWVudGluZ0Fn
ZW50cyA9IGluc3RydW1lbnRpbmdBZ2VudHNGb3JEb2N1bWVudChkb2N1bWVudCkpCi0gICAgICAg
IHJldHVybiB3aWxsTWF0Y2hSdWxlSW1wbChpbnN0cnVtZW50aW5nQWdlbnRzLCBydWxlLCBzdHls
ZVJlc29sdmVyKTsKKyAgICAgICAgcmV0dXJuIHdpbGxNYXRjaFJ1bGVJbXBsKGluc3RydW1lbnRp
bmdBZ2VudHMsIHJ1bGUsIGluc3BlY3RvckNTU09NV3JhcHBlcnMsIHN0eWxlU2hlZXRDb2xsZWN0
aW9uKTsKICNlbHNlCiAgICAgVU5VU0VEX1BBUkFNKGRvY3VtZW50KTsKICAgICBVTlVTRURfUEFS
QU0ocnVsZSk7Ci0gICAgVU5VU0VEX1BBUkFNKHN0eWxlUmVzb2x2ZXIpOworICAgIFVOVVNFRF9Q
QVJBTShpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBVTlVTRURfUEFSQU0oc3R5bGVTaGVl
dENvbGxlY3Rpb24pOwogI2VuZGlmCiAgICAgcmV0dXJuIEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bkNvb2tpZSgpOwogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>192185</attachid>
            <date>2013-03-08 02:21:07 -0800</date>
            <delta_ts>2013-03-10 21:07:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130308191710.patch</filename>
            <type>text/plain</type>
            <size>1103223</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTIwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBAQAorMjAxMy0wMy0wNyAgVGFrYXNo
aSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5nXSBJ
bXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQW50dGkgS29pdmlz
dG8uCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1lbnQg
YW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4gY2xh
c3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAgYSBz
dHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3RvcmluZy4K
KworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3Qu
YW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAg
ICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNzcy9D
U1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFuZCBQ
YWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1
ZXN0cyk6CisgICAgICAgIFNpbmNlIGJlaGF2aW9yQXRCb3VuZGFyeSBpcyBhIHN0YXRlIG93bmVk
IGJ5IEVsZW1lbnRSdWxlQ29sbGVjdG9yLAorICAgICAgICByZW1vdmVkIGZyb20gaGVyZS4KKyAg
ICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5oOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93
RGlzdHJpYnV0ZWRSdWxlczo6aXNFbXB0eSk6CisgICAgICAgIEFkZGVkIHRvIHF1aWNrbHkgY2hl
Y2sgd2hldGhlciB0aGVyZSBleGlzdCBhbnkgU2hhZG93RGlzdHJpYnV0ZWRSdWxlcworICAgICAg
ICBvciBub3QuCisgICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDogQ29waWVk
IGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJl
c3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1
bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRj
aGVkUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJN
YXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmVu
c3VyZVJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxl
Q29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29w
ZWRBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
bWF0Y2hIb3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoU2hhZG93RGlzdHJpYnV0ZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxl
bWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6cnVsZU1hdGNoZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyk6CisgICAgICAg
IE1vdmVkIHRoZXNlIG1ldGhvZHMgZnJvbSBTdHlsZVJlc29sdmVyIHRvIHRoaXMgY2xhc3MuCisg
ICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxl
cyk6CisgICAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBn
aXZlbiBlbGVtZW50IGNhbiBzaGFyZQorICAgICAgICBhIGNhY2hlLgorICAgICAgICAqIGNzcy9F
bGVtZW50UnVsZUNvbGxlY3Rvci5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5
bGVSZXNvbHZlci5oLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBVc2Ugc3R5
bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFibGVzLCBp
LmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NTT01XcmFw
cGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChFbGVtZW50
UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNl
dWRvU3R5bGVSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpzZXRTYW1lT3JpZ2luT25seSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxl
Y3Rvcjo6c2V0UmVnaW9uRm9yU3R5bGluZyk6CisgICAgICAgIE1vZGUsIFNhbWVPcmlnaW5Pbmx5
LCBSZWdpb25Gb3JTdHlsaW5nIGFyZSBvbmx5IHVzZWQgd2hpbGUgY29sbGVjdGluZworICAgICAg
ICBtYXRjaGVkIHJ1bGVzLgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnNldE1lZGl1bSk6CisgICAgICAgIE5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0IHN0eWxlc2hl
ZXQgc2hvdWxkIGJlIGxvb2tlZCB1cC4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpkb2N1bWVudCk6CisgICAgICAgICogY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcDog
Q29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHls
ZVJlc29sdmVyLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VS
dWxlQ29sbGVjdG9yOjpQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChQYWdlUnVsZUNvbGxl
Y3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3Vs
dCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5
bGVSZXNvbHZlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmlu
Z0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2
ZXI6OnN0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpz
dHlsZUZvcktleWZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnBzZXVk
b1N0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpzdHls
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6YXBwbHlN
YXRjaGVkUHJvcGVydGllcyk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGNoUmVxdWVzdDo6TWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgUmVtb3Zl
ZCBiZWhhdmlvckF0Qm91bmRhcnkuIEluc3RlYWQsIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGhhdmUg
dGhlCisgICAgICAgIHN0YXRlLgorICAgICAgICAoTWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAgICAgICAgQWRkZWQgdG8g
b2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVjdG9yJ3MgY29uc3RydWN0
b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1hdGNoUmVzdWx0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIFRv
IHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcywgbmVlZCB0byBr
ZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAgKFN0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpyZWdpb25Gb3JTdHlsaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjp1c2VTVkdab29tUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZCk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgor
ICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSk6CisgICAgICAgIFJlbW92ZWQg
U3R5bGVSZXNvbHZlciBmcm9tIGl0cyBwYXJhbWV0ZXIgbGlzdC4gSW5zdGVhZCwgYWRkZWQKKyAg
ICAgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBhbmQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaDoKKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9yQ1NTQWdlbnQpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwOgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJ
bXBsKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmg6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEluc3BlY3Rvckluc3RydW1lbnRhdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUp
OgorCiAyMDEzLTAzLTA3ICBEZWFuIEphY2tzb24gIDxkaW5vQGFwcGxlLmNvbT4KIAogICAgICAg
ICBSZW1vdmUgZGVhZCBsYWJlbCBjb2RlIGluIHNuYXBzaG90dGVkIHBsdWdpbgpJbmRleDogU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Q01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDE0NTIwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NNYWtl
TGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xMDcwLDYgKzEwNzAsNyBAQCBzZXQoV2ViQ29y
ZV9TT1VSQ0VTCiAgICAgY3NzL0NTU1ZhbHVlUG9vbC5jcHAKICAgICBjc3MvRE9NV2luZG93Q1NT
LmNwcAogICAgIGNzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcAorICAgIGNzcy9FbGVtZW50UnVsZUNv
bGxlY3Rvci5jcHAKICAgICBjc3MvRm9udEZlYXR1cmVWYWx1ZS5jcHAKICAgICBjc3MvRm9udFZh
bHVlLmNwcAogICAgIGNzcy9JbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmNwcApAQCAtMTA4Miw2ICsx
MDgzLDcgQEAgc2V0KFdlYkNvcmVfU09VUkNFUwogICAgIGNzcy9NZWRpYVF1ZXJ5TGlzdC5jcHAK
ICAgICBjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5jcHAKICAgICBjc3MvTWVkaWFRdWVyeU1h
dGNoZXIuY3BwCisgICAgY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAogICAgIGNzcy9Qcm9wZXJ0
eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwCiAgICAgY3NzL1JHQkNvbG9yLmNwcAogICAgIGNz
cy9SdWxlRmVhdHVyZS5oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFt
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0JKHJldmlz
aW9uIDE0NTIwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0JKHdvcmtp
bmcgY29weSkKQEAgLTI2NjAsNiArMjY2MCw4IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291
cmNlL1dlYkNvcmUvY3NzL0Rhc2hib2FyZFJlZ2lvbi5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3Mv
RG9jdW1lbnRSdWxlU2V0cy5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Eb2N1bWVudFJ1bGVT
ZXRzLmggXAorCVNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgXAor
CVNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oIFwKIAlTb3VyY2UvV2Vi
Q29yZS9jc3MvRm9udEZlYXR1cmVWYWx1ZS5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Gb250
RmVhdHVyZVZhbHVlLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nzcy9Gb250VmFsdWUuY3BwIFwKQEAg
LTI2ODQsNiArMjY4Niw4IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUv
Y3NzL01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuaCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL01lZGlh
UXVlcnlNYXRjaGVyLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL01lZGlhUXVlcnlNYXRjaGVy
LmggXAorCVNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAgXAorCVNvdXJj
ZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3Mv
UGFpci5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvUHJvcGVydHlTZXRDU1NTdHlsZURlY2xhcmF0
aW9uLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJh
dGlvbi5oIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQkocmV2aXNpb24gMTQ1MjAwKQorKysgU291cmNlL1dl
YkNvcmUvVGFyZ2V0LnByaQkod29ya2luZyBjb3B5KQpAQCAtMzA1LDYgKzMwNSw3IEBAIFNPVVJD
RVMgKz0gXAogICAgIGNzcy9DU1NWYWx1ZVBvb2wuY3BwIFwKICAgICBjc3MvRE9NV2luZG93Q1NT
LmNwcCBcCiAgICAgY3NzL0RvY3VtZW50UnVsZVNldHMuY3BwIFwKKyAgICBjc3MvRWxlbWVudFJ1
bGVDb2xsZWN0b3IuY3BwIFwKICAgICBjc3MvRm9udEZlYXR1cmVWYWx1ZS5jcHAgXAogICAgIGNz
cy9Gb250VmFsdWUuY3BwIFwKICAgICBjc3MvSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAgXApA
QCAtMzE3LDYgKzMxOCw3IEBAIFNPVVJDRVMgKz0gXAogICAgIGNzcy9NZWRpYVF1ZXJ5TGlzdC5j
cHAgXAogICAgIGNzcy9NZWRpYVF1ZXJ5TGlzdExpc3RlbmVyLmNwcCBcCiAgICAgY3NzL01lZGlh
UXVlcnlNYXRjaGVyLmNwcCBcCisgICAgY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcCBcCiAgICAg
Y3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgXAogICAgIGNzcy9SR0JDb2xv
ci5jcHAgXAogICAgIGNzcy9SdWxlRmVhdHVyZS5jcHAgXApJbmRleDogU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQko
cmV2aXNpb24gMTQ1MjAwKQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5n
IGNvcHkpCkBAIC0xNjUxLDYgKzE2NTEsOCBAQAogICAgICAgICAgICAgJ2Nzcy9EYXNoYm9hcmRS
ZWdpb24uaCcsCiAgICAgICAgICAgICAnY3NzL0RvY3VtZW50UnVsZVNldHMuY3BwJywKICAgICAg
ICAgICAgICdjc3MvRG9jdW1lbnRSdWxlU2V0cy5oJywKKyAgICAgICAgICAgICdjc3MvRWxlbWVu
dFJ1bGVDb2xsZWN0b3IuY3BwJywKKyAgICAgICAgICAgICdjc3MvRWxlbWVudFJ1bGVDb2xsZWN0
b3IuaCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRGZWF0dXJlVmFsdWUuY3BwJywKICAgICAgICAg
ICAgICdjc3MvRm9udEZlYXR1cmVWYWx1ZS5oJywKICAgICAgICAgICAgICdjc3MvRm9udFZhbHVl
LmNwcCcsCkBAIC0xNjc0LDYgKzE2NzYsOCBAQAogICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5
TGlzdExpc3RlbmVyLmgnLAogICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5jcHAn
LAogICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hlci5oJywKKyAgICAgICAgICAgICdj
c3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwJywKKyAgICAgICAgICAgICdjc3MvUGFnZVJ1bGVDb2xs
ZWN0b3IuaCcsCiAgICAgICAgICAgICAnY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlv
bi5jcHAnLAogICAgICAgICAgICAgJ2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24u
aCcsCiAgICAgICAgICAgICAnY3NzL1JHQkNvbG9yLmNwcCcsCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxNDUy
MDApCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHdvcmtpbmcgY29weSkKQEAgLTY1NTAsNiArNjU1MCwxMCBAQAogCQlGQkQ2QUY4QjE1RUYyNUU1
MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODYxNUVGMjFENDAwOEI3MTEwIC8qIENTU0Jhc2lj
U2hhcGVzLmNwcCAqLzsgfTsKIAkJRkJENkFGOEMxNUVGMjYwNDAwOEI3MTEwIC8qIEJhc2ljU2hh
cGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkQ2
QUY4MzE1RUYyMUEzMDA4QjcxMTAgLyogQmFzaWNTaGFwZXMuaCAqLzsgc2V0dGluZ3MgPSB7QVRU
UklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlGQkQ2QUY4RDE1RUYyNjBBMDA4QjcxMTAg
LyogQmFzaWNTaGFwZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRkJENkFGODIxNUVGMjFBMzAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmNwcCAqLzsg
fTsKKwkJRkJEQjYxOUIxNkQ2MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29sbGVjdG9yLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MTlB
MTZENjAzMkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAgKi87IH07CisJCUZC
REI2MTlEMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNl
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkRCNjE5QzE2RDYwMzQ2MDBC
QjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICovOyB9OworCQlGQkRCNjE5RjE2RDYwMzY1
MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MTlFMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVt
ZW50UnVsZUNvbGxlY3Rvci5oICovOyB9OworCQlGQkRCNjFBMTE2RDYwMzdFMDBCQjMzOTQgLyog
UGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEZCREI2MUEwMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5o
ICovOyB9OwogCQlGQkY4OTA0NTE2OUU5RjFGMDA1MkQ4NkUgLyogQ1NTR3JvdXBpbmdSdWxlLmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCRjg5MDQ0
MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NHcm91cGluZ1J1bGUuY3BwICovOyB9OwogCQlGQzU0RDA1
NzE2QTc2NzMxMDA1NzVFNEQgLyogQ1NTU3VwcG9ydHNSdWxlLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQzYzQkRCMTE2N0FBQkFDMDBGOTM4MEYgLyog
Q1NTU3VwcG9ydHNSdWxlLmggKi87IH07CiAJCUZDNTREMDU4MTZBNzY3NkUwMDU3NUU0RCAvKiBK
U0NTU1N1cHBvcnRzUnVsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRkM4NDgwMkUxNjdBQjQ0NDAwOENEMTAwIC8qIEpTQ1NTU3VwcG9ydHNSdWxlLmgg
Ki87IH07CkBAIC0xNDMwMCw2ICsxNDMwNCwxMCBAQAogCQlGQkQ2QUY4NTE1RUYyMUQ0MDA4Qjcx
MTAgLyogQmFzaWNTaGFwZUZ1bmN0aW9ucy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBCYXNpY1NoYXBlRnVuY3Rpb25zLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUZCRDZBRjg2MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NCYXNpY1NoYXBlcy5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRDZBRjg3MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNp
Y1NoYXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NCYXNpY1NoYXBl
cy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQkRCNjE5QTE2RDYwMzJBMDBCQjMz
OTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQlGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3Iu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUGFnZVJ1bGVDb2xsZWN0
b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQkRCNjE5RTE2RDYwMzY1MDBC
QjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gRWxlbWVudFJ1bGVDb2xsZWN0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJRkJEQjYxQTAxNkQ2MDM3RTAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBhZ2VSdWxlQ29sbGVjdG9yLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRjg5MDQ0MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NH
cm91cGluZ1J1bGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NT
R3JvdXBpbmdSdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkM2M0JEQjAx
NjdBQUJBQzAwRjkzODBGIC8qIENTU1N1cHBvcnRzUnVsZS5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBDU1NTdXBwb3J0c1J1bGUuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlGQzYzQkRCMTE2N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxl
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENTU1N1cHBvcnRzUnVsZS5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjIxMjYsNiArMjIxMzQsOCBAQAogCQkJCUZD
OUEwRjcxMTY0MDk0Q0YwMDNENkI4RCAvKiBET01XaW5kb3dDU1MuY3BwICovLAogCQkJCUZDOUEw
RjcyMTY0MDk0Q0YwMDNENkI4RCAvKiBET01XaW5kb3dDU1MuaCAqLywKIAkJCQlGQzlBMEY3MzE2
NDA5NENGMDAzRDZCOEQgLyogRE9NV2luZG93Q1NTLmlkbCAqLywKKwkJCQlGQkRCNjE5RTE2RDYw
MzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCAqLywKKwkJCQlGQkRCNjE5QTE2
RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwICovLAogCQkJCTRBNkU5
RkMyMTNDMTdEMUQwMDQ2QTdGOCAvKiBGb250RmVhdHVyZVZhbHVlLmggKi8sCiAJCQkJQTgwRTZD
QzcwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1ZS5jcHAgKi8sCiAJCQkJQTgwRTZDQzMwQTE5
ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1ZS5oICovLApAQCAtMjIxNjEsNiArMjIxNzEsOCBAQAog
CQkJCUQzQTk0QTM1MTIyREFCQUMwMEEzN0JCQyAvKiBNZWRpYVF1ZXJ5TGlzdExpc3RlbmVyLmlk
bCAqLywKIAkJCQlEM0FBMTBGMTEyM0E5OEFBMDA5MjE1MkIgLyogTWVkaWFRdWVyeU1hdGNoZXIu
Y3BwICovLAogCQkJCUQzQUExMEYyMTIzQTk4QUEwMDkyMTUyQiAvKiBNZWRpYVF1ZXJ5TWF0Y2hl
ci5oICovLAorCQkJCUZCREI2MUEwMTZENjAzN0UwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rv
ci5oICovLAorCQkJCUZCREI2MTlDMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNvbGxlY3Rv
ci5jcHAgKi8sCiAJCQkJQTgwRTZDRDEwQTE5ODlDQTAwN0ZCOEM1IC8qIFBhaXIuaCAqLywKIAkJ
CQkzMTg5RTZEQjE2QjIxMDM1MDAzODZFQTMgLyogcGx1Z0lucy5jc3MgKi8sCiAJCQkJRTRCQkVE
MEMxNEY0MDI1RDAwM0YwQjk4IC8qIFByb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAg
Ki8sCkBAIC0yNjY5Miw2ICsyNjcwNCw4IEBACiAJCQkJN0U2NkUyMzQxNkQ2RUI2QzAwRjdFN0ZG
IC8qIFdlYkdMQ29tcHJlc3NlZFRleHR1cmVBVEMuaCBpbiBIZWFkZXJzICovLAogCQkJCTdFQTMw
RjZBMTZERkZFNzUwMDI1N0QwQiAvKiBKU1dlYkdMQ29tcHJlc3NlZFRleHR1cmVBVEMuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTJEODI4N0Y3MTZFNEEwMzgwMDg2QkQwMCAvKiBIaXRUZXN0TG9jYXRp
b24uaCBpbiBIZWFkZXJzICovLAorCQkJCUZCREI2MTlGMTZENjAzNjUwMEJCMzM5NCAvKiBFbGVt
ZW50UnVsZUNvbGxlY3Rvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRkJEQjYxQTExNkQ2MDM3RTAw
QkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQly
dW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTI5ODk1LDYg
KzI5OTA5LDggQEAKIAkJCQk3RTY2RTIzMzE2RDZFQjZDMDBGN0U3RkYgLyogV2ViR0xDb21wcmVz
c2VkVGV4dHVyZUFUQy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3RUEzMEY2OTE2REZGRTc1MDAy
NTdEMEIgLyogSlNXZWJHTENvbXByZXNzZWRUZXh0dXJlQVRDLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTJEODI4N0Y2MTZFNEEwMzgwMDg2QkQwMCAvKiBIaXRUZXN0TG9jYXRpb24uY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJRkJEQjYxOUIxNkQ2MDMyQTAwQkIzMzk0IC8qIEVsZW1lbnRSdWxlQ29s
bGVjdG9yLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAv
KiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5
Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2Nzcy9DU1NBbGxJbk9uZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3Nz
L0NTU0FsbEluT25lLmNwcAkocmV2aXNpb24gMTQ1MjAwKQorKysgU291cmNlL1dlYkNvcmUvY3Nz
L0NTU0FsbEluT25lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNzEsNyArNzEsOSBAQAogI2luY2x1
ZGUgIkNTU1ZhbHVlUG9vbC5jcHAiCiAjaW5jbHVkZSAiRE9NV2luZG93Q1NTLmNwcCIKICNpbmNs
dWRlICJEb2N1bWVudFJ1bGVTZXRzLmNwcCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rv
ci5jcHAiCiAjaW5jbHVkZSAiSW5zcGVjdG9yQ1NTT01XcmFwcGVycy5jcHAiCisjaW5jbHVkZSAi
UGFnZVJ1bGVDb2xsZWN0b3IuY3BwIgogI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmNwcCIKICNpbmNs
dWRlICJSdWxlU2V0LmNwcCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5jcHAi
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuY3BwCShyZXZpc2lvbiAx
NDUyMDApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUzLDcgKzUzLDcgQEAgdm9pZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjph
ZGRSdWxlKFN0eQogdm9pZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1
ZXN0cyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzLCBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiYgbWF0Y2hS
ZXF1ZXN0cykKIHsKICAgICBmb3IgKFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcDo6aXRlcmF0
b3IgaXQgPSBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5iZWdpbigpOyBpdCAhPSBtX3No
YWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5lbmQoKTsgKytpdCkKLSAgICAgICAgbWF0Y2hSZXF1
ZXN0cy5hcHBlbmQoTWF0Y2hSZXF1ZXN0KGl0LT52YWx1ZS5nZXQoKSwgaW5jbHVkZUVtcHR5UnVs
ZXMsIGl0LT5rZXksIFNlbGVjdG9yQ2hlY2tlcjo6Q3Jvc3Nlc0JvdW5kYXJ5KSk7CisgICAgICAg
IG1hdGNoUmVxdWVzdHMuYXBwZW5kKE1hdGNoUmVxdWVzdChpdC0+dmFsdWUuZ2V0KCksIGluY2x1
ZGVFbXB0eVJ1bGVzLCBpdC0+a2V5KSk7CiB9CiAjZW5kaWYKIApJbmRleDogU291cmNlL1dlYkNv
cmUvY3NzL0RvY3VtZW50UnVsZVNldHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9j
c3MvRG9jdW1lbnRSdWxlU2V0cy5oCShyZXZpc2lvbiAxNDUyMDApCisrKyBTb3VyY2UvV2ViQ29y
ZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBA
IHB1YmxpYzoKICAgICB2b2lkIGFkZFJ1bGUoU3R5bGVSdWxlKiwgc2l6ZV90IHNlbGVjdG9ySW5k
ZXgsIENvbnRhaW5lck5vZGUqIHNjb3BlLCBBZGRSdWxlRmxhZ3MpOwogICAgIHZvaWQgY29sbGVj
dE1hdGNoUmVxdWVzdHMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcywgVmVjdG9yPE1hdGNoUmVxdWVz
dD4mKTsKICAgICB2b2lkIGNsZWFyKCkgeyBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5j
bGVhcigpOyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9zaGFkb3dEaXN0
cmlidXRlZFJ1bGVTZXRNYXAuaXNFbXB0eSgpOyB9CiBwcml2YXRlOgogICAgIHR5cGVkZWYgSGFz
aE1hcDxjb25zdCBDb250YWluZXJOb2RlKiwgT3duUHRyPFJ1bGVTZXQ+ID4gU2hhZG93RGlzdHJp
YnV0ZWRSdWxlU2V0TWFwOwogICAgIFNoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcCBtX3NoYWRv
d0Rpc3RyaWJ1dGVkUnVsZVNldE1hcDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50
UnVsZUNvbGxlY3Rvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0VsZW1l
bnRSdWxlQ29sbGVjdG9yLmNwcAkocmV2aXNpb24gMTQ1MTgxKQkoZnJvbSBTb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5jcHA6MTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0Vs
ZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUxODcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAq
ICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFsbGFuIFNhbmRmZWxkIEplbnNlbiAoa2RlQGNhcmV3
b2xmLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBOaWNob2xhcyBTaGFua3MgKHdl
YmtpdEBuaWNrc2hhbmtzLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywg
MjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBA
d2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBFcmljIFNlaWRlbCA8ZXJp
Y0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisg
KiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdHlsZVJl
c29sdmVyLmgiCisKKyNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJDU1NCb3JkZXJJ
bWFnZS5oIgorI2luY2x1ZGUgIkNTU0NhbGN1bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1ND
dXJzb3JJbWFnZVZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCisj
aW5jbHVkZSAiQ1NTRm9udEZhY2VSdWxlLmgiCisjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgi
CisjaW5jbHVkZSAiQ1NTTGluZUJveENvbnRhaW5WYWx1ZS5oIgorI2luY2x1ZGUgIkNTU1BhZ2VS
dWxlLmgiCisjaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCisjaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFs
dWVNYXBwaW5ncy5oIgorI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKKyNpbmNsdWRlICJD
U1NSZWZsZWN0VmFsdWUuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNT
U1NlbGVjdG9yTGlzdC5oIgorI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkNT
U1N1cHBvcnRzUnVsZS5oIgorI2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKKyNp
bmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyNpbmNs
dWRlICJDU1NWYXJpYWJsZVZhbHVlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5o
IgorI2luY2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDb250ZW50RGF0YS5o
IgorI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNp
bmNsdWRlICJDb3VudGVyQ29udGVudC5oIgorI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKKyNpbmNs
dWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFNo
YWRvdy5oIgorI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKKyNpbmNsdWRlICJGb250VmFs
dWUuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCisj
aW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVk
ZSAiSFRNTElGcmFtZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKKyNp
bmNsdWRlICJIVE1MUHJvZ3Jlc3NFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJJbnNlcnRp
b25Qb2ludC5oIgorI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1
ZGUgIktleWZyYW1lTGlzdC5oIgorI2luY2x1ZGUgIkxpbmtIYXNoLmgiCisjaW5jbHVkZSAiTG9j
YWxlVG9TY3JpcHRNYXBwaW5nLmgiCisjaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKKyNpbmNsdWRl
ICJNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9y
bU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIk1lZGlhTGlzdC5oIgorI2luY2x1ZGUgIk1lZGlhUXVl
cnlFdmFsdWF0b3IuaCIKKyNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJO
b2RlUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWly
LmgiCisjaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRl
ICJRdW90ZXNEYXRhLmgiCisjaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclJlZ2lv
bi5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9s
bGJhclRoZW1lLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGVDb25zdGFudHMuaCIKKyNpbmNsdWRl
ICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJSb3Rh
dGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJSdWxlU2V0LmgiCisjaW5jbHVkZSAi
U1ZHRG9jdW1lbnRFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50Lmgi
CisjaW5jbHVkZSAiU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJTZWN1cml0
eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLmgiCisjaW5jbHVk
ZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCisjaW5jbHVkZSAiU2hhZG93
Um9vdC5oIgorI2luY2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCisjaW5jbHVkZSAiU2libGluZ1RyYXZl
cnNhbFN0cmF0ZWdpZXMuaCIKKyNpbmNsdWRlICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisj
aW5jbHVkZSAiU3R5bGVCdWlsZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgor
I2luY2x1ZGUgIlN0eWxlR2VuZXJhdGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZVBlbmRpbmdJ
bWFnZS5oIgorI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTZXQuaCIKKyNpbmNsdWRlICJTdHlsZVBy
b3BlcnR5U2hvcnRoYW5kLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU3R5
bGVSdWxlSW1wb3J0LmgiCisjaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCisjaW5jbHVk
ZSAiU3R5bGVTaGVldExpc3QuaCIKKyNpbmNsdWRlICJUZXh0LmgiCisjaW5jbHVkZSAiVHJhbnNm
b3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24u
aCIKKyNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIlZpZXdwb3J0
U3R5bGVSZXNvbHZlci5oIgorI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKKyNpbmNsdWRl
ICJXZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5
ZnJhbWVSdWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1
ZGUgIldlYktpdENTU1JlZ2lvblJ1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZS5oIgorI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgorI2luY2x1ZGUgIlhN
TE5hbWVzLmgiCisjaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4K
KyNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgorI2luY2x1ZGUg
PHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGli
RXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKENTU19GSUxU
RVJTKQorI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0Zp
bHRlclZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKKyNp
bmNsdWRlICJEYXNoYm9hcmRSZWdpb24uaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFNWRykKKyNp
bmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudC5oIgorI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50
UmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJTVkdFbGVt
ZW50LmgiCisjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKKyNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2Uu
aCIKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisjZW5kaWYKKworI2lm
IEVOQUJMRShDU1NfU0hBREVSUykKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
ci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgorI2luY2x1ZGUgIkN1c3Rv
bUZpbHRlck51bWJlclBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlv
bi5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3Rv
bUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlci5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVy
LmgiCisjaW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCisjaW5jbHVkZSAiU3R5
bGVQZW5kaW5nU2hhZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKKyNpbmNsdWRlICJX
ZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFs
dWUuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCisjaW5jbHVkZSAiQ1NT
SW1hZ2VTZXRWYWx1ZS5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKKyNlbmRp
ZgorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIK
KyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV1RGIHsKKwordGVt
cGxhdGU8PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3Qg
V2ViQ29yZTo6UnVsZURhdGEqPiB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2
b2lkIHJlcG9ydE1lbW9yeVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5mbyYpIHsgfQorfTsKKwor
fQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisK
KyNkZWZpbmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5oZXJpdCkgeyBc
CisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5w
cm9wKCkpOyBcCisgICAgcmV0dXJuOyBcCit9CisKKyNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5E
X0lOSVRJQUwocHJvcCwgUHJvcCkgXAorSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYg
KGlzSW5pdGlhbCkgeyBcCisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5
bGU6OmluaXRpYWwjI1Byb3AoKSk7IFwKKyAgICByZXR1cm47IFwKK30KKworUmVuZGVyU3R5bGUq
IFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKK3N0YXRpYyBTdHlsZVBy
b3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQ
cm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5
KCkpCisgICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJl
Y3Rpb24sIENTU1ZhbHVlTHRyKTsKKyAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwor
fQorCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCit7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0
VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7CisgICAgaWYgKHJpZ2h0
VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3Bl
cnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7CisgICAgcmV0dXJuIHJpZ2h0
VG9MZWZ0RGVjbC5nZXQoKTsKK30KKworCitpbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxl
UmVzb2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0
KQorICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAg
IHJldHVybiBtX3J1bGVMaXN0LmdldCgpOworfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVy
OjpTdGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKK3sKKyAgICBtX2hhc1VBQXBwZWFy
YW5jZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKKyAgICBpZiAobV9oYXNVQUFwcGVhcmFu
Y2UpIHsKKyAgICAgICAgbV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9yZGVyKCk7CisgICAgICAg
IG1fYmFja2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExheWVycygpOworICAgICAg
ICBtX2JhY2tncm91bmRDb2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOworICAgIH0K
K30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKK3sKKyAgICBt
X2VsZW1lbnQgPSAwOworICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7CisgICAgbV9wYXJlbnRTdHls
ZSA9IDA7CisgICAgbV9wYXJlbnROb2RlID0gMDsKKyAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAw
OworICAgIG1fcnVsZUxpc3QgPSAwOworICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7CisgICAg
bV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7CisjaWYgRU5BQkxFKENTU19TSEFERVJT
KQorICAgIG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKKyNlbmRpZgorI2lmIEVOQUJMRShD
U1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xl
YXIoKTsKKyNlbmRpZgorfQorCitTdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50
KiBkb2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgOiBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgwKQorICAgICwgbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBN
YXRjaGVkUHJvcGVydGllc0NhY2hlKQorICAgICwgbV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAs
IG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAg
ICAsIG1fZm9udFNlbGVjdG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNp
ZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgICwgbV92aWV3cG9ydFN0eWxlUmVz
b2x2ZXIoVmlld3BvcnRTdHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1lbnQpKQorI2VuZGlmCisg
ICAgLCBtX3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQor
ICAgICwgbV9zdHlsZU1hcCh0aGlzKQoreworICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+
ZG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZh
dWx0U3R5bGUocm9vdCk7CisKKyAgICAvLyBjb25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50
IGRlZmF1bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVkCisgICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEg
cXVlcmllcyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBh
bmQgKG1heC13aWR0aDogMTBlbSkiCisgICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29u
c3RydWN0b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4sCisgICAgLy8gZG9jdW1l
bnQgZG9lc24ndCBoYXZlIGRvY3VtZW50RWxlbWVudAorICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1l
cyB0aGF0IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwK
KyAgICAvLyBpcyBhbHdheXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBz
ZWxlY3RvcgorICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52aWV3KCk7CisgICAgaWYg
KHZpZXcpCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0
b3Iodmlldy0+bWVkaWFUeXBlKCkpKTsKKyAgICBlbHNlCisgICAgICAgIG1fbWVkaXVtID0gYWRv
cHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKKworICAgIGlmIChyb290KQor
ICAgICAgICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlz
YWxsb3dTdHlsZVNoYXJpbmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKTsKKworICAgIGlmICht
X3Jvb3REZWZhdWx0U3R5bGUgJiYgdmlldykKKyAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihu
ZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwg
bV9yb290RGVmYXVsdFN0eWxlLmdldCgpKSk7CisKKyAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9y
U3R5bGUoKTsKKworICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRD
b2xsZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCk7CisgICAgbV9ydWxl
U2V0cy5pbml0VXNlclN0eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlz
KTsKKworI2lmIEVOQUJMRShTVkdfRk9OVFMpCisgICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNp
b25zKCkpIHsKKyAgICAgICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3Zn
Rm9udEZhY2VFbGVtZW50cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNl
RWxlbWVudHMoKTsKKyAgICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsKKyAgICAgICAgZm9yIChI
YXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRG
YWNlRWxlbWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgZm9udFNl
bGVjdG9yKCktPmFkZEZvbnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VSdWxlKCkpOworICAgIH0K
KyNlbmRpZgorCisgICAgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxl
Y3Rpb24tPmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRzKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6OmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0
b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQoreworICAgIG1fcnVsZVNl
dHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1
bS5nZXQoKSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3Vy
Y2UoKSwgdGhpcyk7CisgICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQo
KS0+cmVuZGVyZXIoKS0+c3R5bGUoKSkKKyAgICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+
c3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7CisKKyNpZiBFTkFCTEUoQ1NT
X0RFVklDRV9BREFQVEFUSU9OKQorICAgIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZl
KCk7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChF
bGVtZW50KiBwYXJlbnQpCit7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVu
dCA9IHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOworCisgICAgLy8gV2UgYXJl
IG5vdCBhbHdheXMgaW52b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhl
Y3V0aW9uIGNhbiBjYXVzZSB1cyB0byBlbnRlcgorICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUg
bWlkZGxlIG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21l
d2hlcmUgd2l0aGluIHRoZSB0cmVlLgorICAgIC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNh
c2UsIG9yIGlmIHdlIHNlZSBhIG5ldyByb290IGVsZW1lbnQuCisgICAgLy8gT3RoZXJ3aXNlIGp1
c3QgcHVzaCB0aGUgbmV3IHBhcmVudC4KKyAgICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxl
Y3RvckZpbHRlci5wYXJlbnRTdGFja0lzRW1wdHkoKSkKKyAgICAgICAgbV9zZWxlY3RvckZpbHRl
ci5zZXR1cFBhcmVudFN0YWNrKHBhcmVudCk7CisgICAgZWxzZQorICAgICAgICBtX3NlbGVjdG9y
RmlsdGVyLnB1c2hQYXJlbnQocGFyZW50KTsKKworICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tp
cCBTaGFkb3dSb290IG5vZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCisgICAgaWYgKG1fc2NvcGVS
ZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5w
YXJlbnRPclNoYWRvd0hvc3ROb2RlKCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBh
cmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQoreworICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkg
Z2V0IGludm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMg
ZHVyaW5nIHN0eWxlIHJlc29sdmUuCisgICAgLy8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNr
IGluIHRoaXMgY2FzZS4KKyAgICBpZiAobV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29u
c2lzdGVudChwYXJlbnQpKQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOwor
ICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBh
cmVudCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29u
c3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKK3sKKyAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9z
dCgpKTsKKyAgICBpZiAobV9zY29wZVJlc29sdmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXIt
PnB1c2goc2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKK30KKwordm9pZCBTdHlsZVJl
c29sdmVyOjpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3Qp
Cit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNv
bHZlcikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7Cit9CisKKy8v
IFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1l
IHN0eWxlcwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8
U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQoreworICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5h
bWUoKSk7CisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7Cit9CisK
K1N0eWxlUmVzb2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKK3sKKyAgICBtX2ZvbnRTZWxlY3Rvci0+
Y2xlYXJEb2N1bWVudCgpOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAg
ICBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOworI2VuZGlmCit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0
eWxlUmVzb2x2ZXI+KikKK3sKKyAgICAvLyBMb29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5p
bmcgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0u
CisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRp
b24gY2F1c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxlKCkKKyAgICAvLyBvciBw
cmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2Fj
aGUgd2l0aCB0aGUgbGFzdCByZWYgb24gdGhlIG9sZCBvbmUuCisgICAgVmVjdG9yPHVuc2lnbmVk
LCAxNj4gdG9SZW1vdmU7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQg
PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKKyAgICBNYXRjaGVkUHJvcGVydGll
c0NhY2hlOjppdGVyYXRvciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7Cisg
ICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3Bl
cnRpZXM+JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsK
KyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7
ICsraSkgeworICAgICAgICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMt
Pmhhc09uZVJlZigpKSB7CisgICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkp
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCisgICAg
ICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1vdmVbaV0pOworCisgICAg
bV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOworfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBt
YXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxl
KiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJv
cGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
Lmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7CisgICAgTWF0
Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5sYXN0KCk7CisgICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxT
dHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0
Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKKyAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUg
PSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7CisgICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFw
cGVuZChydWxlKTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0
eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0
KQorICAgICAgICByZXR1cm47CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7CisgICAgaWYgKHJlc3VsdC5yYW5nZXMuZmly
c3RBdXRob3JSdWxlID09IC0xKQorICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVs
ZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7CisgICAgYWRkTWF0Y2hlZFByb3BlcnRp
ZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7CisgICAgaWYgKCFpc0NhY2hlYWJsZSkKKyAgICAgICAg
cmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Cit9CisKK2NsYXNzIE1hdGNoaW5nVUFSdWxlc1Nj
b3BlIHsKK3B1YmxpYzoKKyAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOworICAgIH5NYXRjaGlu
Z1VBUnVsZXNTY29wZSgpOworCisgICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsK
KworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKK307CisKK01h
dGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgQVNTRVJU
KCFtX21hdGNoaW5nVUFSdWxlcyk7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOworfQor
CitNYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKK3sKKyAgICBt
X21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVs
ZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQoreworICAgIHJldHVybiBtX21hdGNoaW5nVUFS
dWxlczsKK30KKworYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMg
PSBmYWxzZTsKKwordm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25z
dCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7Cisg
ICAgQVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKKyAgICBBU1NFUlQobV9zdGF0ZS5lbGVt
ZW50KCkpOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBFbGVtZW50KiBlbGVt
ZW50ID0gc3RhdGUuZWxlbWVudCgpOworICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVs
ZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBw
c2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7CisgICAgaWYgKCFwc2V1ZG9JZC5p
c0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOworICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVk
b0VsZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
CisgICAgfQorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIGlmIChlbGVtZW50LT5pc1dl
YlZUVEVsZW1lbnQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7CisjZW5kaWYKKyAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFy
ZSBhcHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlz
OgorICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCisgICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxs
b3dzIGF1dGhvciBydWxlcworICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVk
IHN0eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCisgICAgVHJlZVNjb3BlKiB0
cmVlU2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKKyAgICBpZiAoIU1hdGNoaW5nVUFSdWxl
c1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCisgICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5
QXV0aG9yU3R5bGVzKCkKKyAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hS
ZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCisgICAgICAgICYmIG1hdGNo
UmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jv
c3NCb3VuZGFyeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0
IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBh
IGJ1ZmZlciBhbmQKKyAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KKyAgICBpZiAoZWxlbWVu
dC0+aGFzSUQoKSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1w
bCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChzdHlsZWRFbGVtZW50ICYm
IHN0eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNz
UnVsZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCisgICAg
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlu
a1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChT
ZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQorICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3Vz
UHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVt
ZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJz
YWxSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBt
YXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmICghbV9zdGF0ZS5y
ZWdpb25Gb3JTdHlsaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIHNpemUg
PSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXpl
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBj
b25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+
bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKKyAgICAgICAgaWYg
KGNoZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQq
PihtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKKyAgICAgICAgICAgIFJ1
bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0
b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKKyAgICAgICAgICAgIEFTU0VSVChy
ZWdpb25SdWxlcyk7CisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVl
c3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1
ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIFZlY3Rvcjxjb25zdCBSdWxl
RGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7CisgICAgaWYg
KG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNvcnRNYXRj
aGVkUnVsZXMoKTsKKworICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpD
b2xsZWN0aW5nUnVsZXMpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNo
ZWRSdWxlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCkt
PnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBw
ZXIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhl
IHNldCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsK
KyAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1Vu
Y29tbW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dFVuaXF1ZSgpOworICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRS
dWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBt
YXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0
eVdoaXRlbGlzdFR5cGUoKSk7CisgICAgfQorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNo
U2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcykKK3sKKyNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkK
KyAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0
Y2ggc2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBz
dGFjayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KKyAgICBpZiAobV9zY29w
ZVJlc29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0
YWNrQ29uc2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7CisgICAgICAgIGJvb2wgYXBwbHlB
dXRob3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9y
U3R5bGVzKCk7CisgICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7CisgICAgICAgIHVu
c2lnbmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgeworICAgICAgICAgICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgICAgICAgICAgcmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwor
CisgICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1l
ID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7CisgICAgICAgICAgICBkb2N1bWVu
dFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUo
KTsKKyAgICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYg
KCFhcHBseUF1dGhvclN0eWxlcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5t
YXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChm
cmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAg
ICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5n
ZSgpOworICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxl
UmFuZ2UpOworICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXRjaEhvc3RSdWxlcyhyZXN1
bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7
CisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCitpbmxp
bmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1
bGVzKCkKK3sKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICByZXR1cm4gbV9zY29wZVJlc29s
dmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RS
dWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRp
ZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNIQURPV19ET00p
CisgICAgQVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7CisKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmNsZWFyKCk7CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRj
aGVkUnVsZXM7CisgICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVs
ZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKKyAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNp
emUoKTsgaSA+IDA7IC0taSkgeworICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0
LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMo
TWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9z
dGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOworICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJN
YXRjaGVkUnVsZXMocmVzdWx0KTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Cisg
ICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBp
bmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7
CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxOworCisgICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJl
cXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5
UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1
bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgVmVjdG9yPE1hdGNoUmVxdWVz
dD4gbWF0Y2hSZXF1ZXN0czsKKyAgICBtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMo
KS5jb2xsZWN0TWF0Y2hSZXF1ZXN0cyhpbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQor
ICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2Up
OworI2VuZGlmCisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKwor
ICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Cit9
CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0
eWxlKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygp
LmNsZWFyKCk7CisKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3Qo
bV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5n
ZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFu
ZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQoreworICAg
IG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICAKKyAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RVQVJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBS
dWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7CisKKyAg
ICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKK30KKwordm9pZCBTdHlsZVJl
c29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRh
PiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1
bGVSYW5nZSkKK3sKKyAgICBpZiAoIXJ1bGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBs
b29raW5nIHVwIHN0eWxlIGZvciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJl
Y3Vyc2l2ZSB0cmVlIHJlc29sdmUuCisgICAgLy8gQW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIg
d29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFz
dCBwYXRoLgorICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFy
ZW50U3RhY2tJc0NvbnNpc3RlbnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3Qu
YmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRh
cnk7CisKKyAgICB1bnNpZ25lZCBzaXplID0gcnVsZXMtPnNpemUoKTsKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxl
RGF0YSA9IHJ1bGVzLT5hdChpKTsKKyAgICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9z
ZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlm
aWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkp
CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBTdHlsZVJ1bGUqIHJ1bGUgPSBydWxl
RGF0YS5ydWxlKCk7CisgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29r
aWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoZG9jdW1lbnQoKSwg
cnVsZSwgdGhpcyk7CisgICAgICAgIFBzZXVkb0lkIGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsK
KyAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5
bmFtaWNQc2V1ZG8sIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkpKSB7CisgICAgICAg
ICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25v
cmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2RlLgorICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9w
ZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlm
ICghcHJvcGVydGllcyB8fCAocHJvcGVydGllcy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3Qu
aW5jbHVkZUVtcHR5UnVsZXMpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogRXhwb3NpbmcgdGhl
IG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMgQVBJIHRvIHdlYiBpcyB0aGUgb25seSBy
ZWFzb24gdGhpcyBpcyBuZWVkZWQuCisgICAgICAgICAgICBpZiAoc3RhdGUuaXNTYW1lT3JpZ2lu
T25seSgpICYmICFydWxlRGF0YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKKyAgICAg
ICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUs
IGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIC8vIElmIHdlJ3JlIG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJp
dCBpZgorICAgICAgICAgICAgLy8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVt
ZW50LgorICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUu
cHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKKyAgICAgICAgICAg
ICAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVz
KSB7CisgICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0
Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJT
VF9JTlRFUk5BTF9QU0VVRE9JRCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0SGFzUHNldWRvU3R5bGUoZHluYW1pY1BzZXVkbyk7CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4g
dGhlIG1hdGNoZWQgcnVsZXMgYXJyYXkuCisgICAgICAgICAgICAgICAgKytydWxlUmFuZ2UubGFz
dFJ1bGVJbmRleDsKKyAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4
ID09IC0xKQorICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBy
dWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1
bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KKyAgICAgICAgICAgICAgICBtX3N0YXRl
LmFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCB0cnVlKTsKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICB9Cit9CisK
K3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29uc3QgUnVsZURhdGEqIHIxLCBjb25z
dCBSdWxlRGF0YSogcjIpCit7CisgICAgdW5zaWduZWQgc3BlY2lmaWNpdHkxID0gcjEtPnNwZWNp
ZmljaXR5KCk7CisgICAgdW5zaWduZWQgc3BlY2lmaWNpdHkyID0gcjItPnNwZWNpZmljaXR5KCk7
CisgICAgcmV0dXJuIChzcGVjaWZpY2l0eTEgPT0gc3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlv
bigpIDwgcjItPnBvc2l0aW9uKCkgOiBzcGVjaWZpY2l0eTEgPCBzcGVjaWZpY2l0eTI7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydE1hdGNoZWRSdWxlcygpCit7CisgICAgc3RkOjpzb3J0
KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5l
bmQoKSwgY29tcGFyZVJ1bGVzKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1
bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQorewor
ICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQpOworCisgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hl
ZXQgcnVsZXMuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBt
YXRjaFVzZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBhdXRob3Ig
cnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMgbWFw
cGVkIGZyb20gSFRNTC4KKyAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKKyAgICAg
ICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKKworICAgICAgICAvLyBOb3cgd2Ug
Y2hlY2sgYWRkaXRpb25hbCBtYXBwZWQgZGVjbGFyYXRpb25zLgorICAgICAgICAvLyBUYWJsZXMg
YW5kIHRhYmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0
IGJlIGFwcGxpZWQKKyAgICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWly
IG1hcHBlZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRl
cy4KKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisK
KyAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsK
KyAgICAgICAgICAgIGJvb2wgaXNBdXRvOworICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0
RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVj
dGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlzQXV0byk7CisgICAgICAgICAgICBpZiAo
aXNBdXRvKQorICAgICAgICAgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4
dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVm
dERlY2xhcmF0aW9uKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIENoZWNrIHRo
ZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzIG5leHQuCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzKQorICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworCisg
ICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgorICAgIGlmIChtX21h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0
YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgeworICAgICAgICAvLyBJbmxpbmUg
c3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4K
KyAgICAgICAgLy8gRklYTUU6IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2
ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcuCisgICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hl
YWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxl
KCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgpOworICAgICAg
ICAvLyBGSVhNRTogQ29uc3RpZnkuCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMo
cmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVT
dHlsZUNhY2hlYWJsZSk7CisgICAgfQorCisjaWYgRU5BQkxFKFNWRykKKyAgICAvLyBOb3cgY2hl
Y2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5bGUuCisgICAgaWYgKGluY2x1ZGVTTUlMUHJv
cGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVs
ZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAg
ICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVt
ZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRp
ZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0o
aW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKKyNlbmRpZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6
OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NO
YW1lcykgY29uc3QKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5z
aXplKCk7ICsraSkgeworICAgICAgICBpZiAobV9ydWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJ
blJ1bGVzLmNvbnRhaW5zKGNsYXNzTmFtZXNbaV0uaW1wbCgpKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIFN0eWxl
UmVzb2x2ZXI6OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQoreworICAgIG1fZWxlbWVu
dCA9IGU7CisgICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/
IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7CisgICAgbV9lbGVtZW50TGlua1N0
YXRlID0gZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlu
a1N0YXRlKGUpIDogTm90SW5zaWRlTGluazsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZl
cjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKK3sKKyAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkg
IT0gZSkgeworICAgICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOworICAgICAgICBpZiAoZSAm
JiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBl
LT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7Cisg
ICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVt
ZW50KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNv
bHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVt
ZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVz
dCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7
CisgICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBwc2V1ZG9TdHlsZVJlcXVlc3Q7CisgICAgbV9y
ZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5bGluZzsKKworICAgIGlmIChlKSB7CisgICAg
ICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQoZSk7CisgICAgICAgIG1fcGFyZW50Tm9k
ZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CisgICAgICAgIG1f
cGFyZW50U3R5bGUgPSBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpID8gMCA6CisgICAg
ICAgICAgICBwYXJlbnRTdHlsZSA/IHBhcmVudFN0eWxlIDoKKyAgICAgICAgICAgIG1fcGFyZW50
Tm9kZSA/IG1fcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA6IDA7CisgICAgICAgIG1fZGlzdHJp
YnV0ZWRUb0luc2VydGlvblBvaW50ID0gY29udGV4dC5pbnNlcnRpb25Qb2ludCgpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IDA7CisgICAgICAgIG1fcGFyZW50U3R5bGUg
PSBwYXJlbnRTdHlsZTsKKyAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBm
YWxzZTsKKyAgICB9CisKKyAgICBOb2RlKiBkb2NFbGVtZW50ID0gZSA/IGUtPmRvY3VtZW50KCkt
PmRvY3VtZW50RWxlbWVudCgpIDogMDsKKyAgICBSZW5kZXJTdHlsZSogZG9jU3R5bGUgPSBkb2N1
bWVudC0+cmVuZGVyU3R5bGUoKTsKKyAgICBtX3Jvb3RFbGVtZW50U3R5bGUgPSBkb2NFbGVtZW50
ICYmIGUgIT0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlclN0eWxlKCkgOiBkb2NTdHls
ZTsKKworICAgIG1fc3R5bGUgPSAwOworICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVh
cigpOworICAgIG1fcnVsZUxpc3QgPSAwOworICAgIG1fZm9udERpcnR5ID0gZmFsc2U7Cit9CisK
K3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgPSAxMDsKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCA9IDEwOworCitzdGF0
aWMgaW5saW5lIGJvb2wgcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhjb25zdCBFbGVtZW50
KiBwYXJlbnRFbGVtZW50KQoreworICAgIGlmICghcGFyZW50RWxlbWVudCkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIHJldHVybiBwYXJlbnRFbGVtZW50LT5oYXNGbGFnc1NldER1cmluZ1N0
eWxpbmdPZkNoaWxkcmVuKCk7Cit9CisKK05vZGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZUNvdXNp
bkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3QK
K3sKKyAgICBpZiAodmlzaXRlZE5vZGVDb3VudCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgKiBj
U3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFw
YXJlbnQgfHwgIXBhcmVudC0+aXNTdHlsZWRFbGVtZW50KCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIGlmIChwYXJlbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVy
biAwOworICAgIFN0eWxlZEVsZW1lbnQqIHAgPSBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4o
cGFyZW50KTsKKyAgICBpZiAocC0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7Cisj
aWYgRU5BQkxFKFNWRykKKyAgICBpZiAocC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8
U1ZHRWxlbWVudCo+KHApLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisjZW5kaWYKKyAgICBpZiAocC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1
cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhwLT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwo
KSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0g
cC0+cmVuZGVyU3R5bGUoKTsKKyAgICB1bnNpZ25lZCBzdWJjb3VudCA9IDA7CisgICAgTm9kZSog
dGhpc0NvdXNpbiA9IHA7CisgICAgTm9kZSogY3VycmVudE5vZGUgPSBwLT5wcmV2aW91c1NpYmxp
bmcoKTsKKworICAgIC8vIFJlc2VydmUgdGhlIHRyaWVzIGZvciB0aGlzIGxldmVsLiBUaGlzIGVm
ZmVjdGl2ZWx5IG1ha2VzIHN1cmUgdGhhdCB0aGUgYWxnb3JpdGhtCisgICAgLy8gd2lsbCBuZXZl
ciBnbyBkZWVwZXIgdGhhbiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCBsZXZlbHMgaW50byBy
ZWN1cnNpb24uCisgICAgdmlzaXRlZE5vZGVDb3VudCArPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQ7
CisgICAgd2hpbGUgKHRoaXNDb3VzaW4pIHsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7
CisgICAgICAgICAgICArK3N1YmNvdW50OworICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLT5y
ZW5kZXJTdHlsZSgpID09IHBhcmVudFN0eWxlICYmIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKQor
ICAgICAgICAgICAgICAgICYmIGN1cnJlbnROb2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgIXBhcmVu
dEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcodG9FbGVtZW50KGN1cnJlbnROb2RlKSkKKyNpZiBFTkFC
TEUoU0hBRE9XX0RPTSkKKyAgICAgICAgICAgICAgICAmJiAhdG9FbGVtZW50KGN1cnJlbnROb2Rl
KS0+c2hhZG93KCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAg
IC8vIEFkanVzdCBmb3IgdW51c2VkIHJlc2VydmVkIHRyaWVzLgorICAgICAgICAgICAgICAgIHZp
c2l0ZWROb2RlQ291bnQgLT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkIC0gc3ViY291bnQ7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGlmIChzdWJjb3VudCA+PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJl
bnROb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50Tm9k
ZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVk
Tm9kZUNvdW50KTsKKyAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnROb2RlOworICAgIH0KKwor
ICAgIHJldHVybiAwOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRp
ZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCit7CisgICAgaWYgKCFydWxlU2V0
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVh
cigpOworCisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVz
KTsKKyAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOworICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOworICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsK
KyAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Cisg
ICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJldHVybiB0
cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChT
dHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7CisgICAgSFRNTElucHV0RWxlbWVudCogdGhpc0lucHV0RWxlbWVudCA9IGVsZW1l
bnQtPnRvSW5wdXRFbGVtZW50KCk7CisgICAgSFRNTElucHV0RWxlbWVudCogb3RoZXJJbnB1dEVs
ZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCktPnRvSW5wdXRFbGVtZW50KCk7CisKKyAgICBpZiAoIXRo
aXNJbnB1dEVsZW1lbnQgfHwgIW90aGVySW5wdXRFbGVtZW50KQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSAhPSBvdGhlcklu
cHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSkgeworICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVu
dC0+ZmFzdEdldEF0dHJpYnV0ZSh0eXBlQXR0cikgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmZhc3RH
ZXRBdHRyaWJ1dGUodHlwZUF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpICE9
IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHJlYWRvbmx5QXR0cikpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQt
PmlzQXV0b2ZpbGxlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5zaG91bGRBcHBl
YXJDaGVja2VkKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPnNob3VsZEFwcGVhckNoZWNrZWQoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0luZGV0
ZXJtaW5hdGUoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgp
ICE9IG90aGVySW5wdXRFbGVtZW50LT5pc1JlcXVpcmVkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChlbGVtZW50LT5pc0VuYWJsZWRGb3JtQ29udHJvbCgpICE9IHN0YXRlLmVs
ZW1lbnQoKS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKGVsZW1lbnQtPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSAhPSBzdGF0ZS5lbGVt
ZW50KCktPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKHN0YXRlLmRvY3VtZW50KCktPmNvbnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKCkp
IHsKKyAgICAgICAgYm9vbCB3aWxsVmFsaWRhdGUgPSBlbGVtZW50LT53aWxsVmFsaWRhdGUoKTsK
KworICAgICAgICBpZiAod2lsbFZhbGlkYXRlICE9IHN0YXRlLmVsZW1lbnQoKS0+d2lsbFZhbGlk
YXRlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKHdpbGxWYWxp
ZGF0ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVs
ZW1lbnQoKS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBpZiAoZWxlbWVudC0+aXNJblJhbmdlKCkgIT0gc3RhdGUuZWxl
bWVudCgpLT5pc0luUmFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAg
ICBpZiAoZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9m
UmFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKEVs
ZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8gRklYTUU6IFRoaXMgbGluZSBpcyBzdXJwcmlzaW5n
bHkgaG90LCB3ZSBtYXkgd2lzaCB0byBpbmxpbmUgaGFzRGlyZWN0aW9uQXV0byBpbnRvIFN0eWxl
UmVzb2x2ZXIuCisgICAgcmV0dXJuIGVsZW1lbnQtPmlzSFRNTEVsZW1lbnQoKSAmJiB0b0hUTUxF
bGVtZW50KGVsZW1lbnQpLT5oYXNEaXJlY3Rpb25BdXRvKCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNv
bHZlcjo6c2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRl
cyhTdHlsZWRFbGVtZW50KiBzaGFyaW5nQ2FuZGlkYXRlKSBjb25zdAoreworICAgIGNvbnN0IFN0
YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZWxlbWVudERh
dGEoKSA9PSBzaGFyaW5nQ2FuZGlkYXRlLT5lbGVtZW50RGF0YSgpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVz
OjpsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1l
czo6bGFuZ0F0dHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0YXRlLmVsZW1l
bnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFz
dEdldEF0dHJpYnV0ZShsYW5nQXR0cikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
ICghc3RhdGUuZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkpIHsKKyAgICAgICAgaWYgKHNo
YXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhz
aGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0gZWxzZSBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSkgeworI2lmIEVO
QUJMRShTVkcpCisgICAgICAgIC8vIFNWRyBlbGVtZW50cyByZXF1aXJlIGEgKHNsb3chKSBnZXRB
dHRyaWJ1dGUgY29tcGFyaXNpb24gYmVjYXVzZSAiY2xhc3MiIGlzIGFuIGFuaW1hdGFibGUgYXR0
cmlidXRlIGZvciBTVkcuCisgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVu
dCgpKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoY2xh
c3NBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAg
ICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSAhPSBzaGFyaW5nQ2Fu
ZGlkYXRlLT5jbGFzc05hbWVzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworI2lm
IEVOQUJMRShTVkcpCisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25B
dHRyaWJ1dGVTdHlsZSgpICE9IHNoYXJpbmdDYW5kaWRhdGUtPnByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIEVOQUJMRShQUk9HUkVTU19F
TEVNRU5UKQorICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmhhc1RhZ05hbWUocHJvZ3Jlc3NUYWcp
KSB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc3RhdGUu
ZWxlbWVudCgpKS0+aXNEZXRlcm1pbmF0ZSgpICE9IHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0Vs
ZW1lbnQqPihzaGFyaW5nQ2FuZGlkYXRlKS0+aXNEZXRlcm1pbmF0ZSgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQq
IGVsZW1lbnQpIGNvbnN0Cit7CisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gZWxlbWVudC0+cmVu
ZGVyU3R5bGUoKTsKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYg
KCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPmhhc1VuaXF1ZVBzZXVkb1N0
eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+dGFnUU5hbWUo
KSAhPSBzdGF0ZS5lbGVtZW50KCktPnRhZ1FOYW1lKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAoZWxlbWVudC0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChlbGVtZW50LT5uZWVkc1N0eWxlUmVjYWxjKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChlbGVtZW50LT5pc1NWR0VsZW1lbnQoKSAmJiBz
dGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oZWxlbWVudCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVy
dGllcygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICBpZiAoZWxlbWVudC0+
aXNMaW5rKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGlmIChlbGVtZW50LT5ob3ZlcmVkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5ob3Zl
cmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+YWN0aXZlKCkg
IT0gc3RhdGUuZWxlbWVudCgpLT5hY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IGlmIChlbGVtZW50LT5mb2N1c2VkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5mb2N1c2VkKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKSAh
PSBzdGF0ZS5lbGVtZW50KCktPnNoYWRvd1BzZXVkb0lkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50
aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGlmIChlbGVtZW50LT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSAhPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRy
aWJ1dGVTdHlsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+
aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhlbGVt
ZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoZWxlbWVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBzaGFyZSBzdHlsZSBmb3Ig
b3B0aW9uIGFuZCBvcHRncm91cCB3aGVuZXZlciBwb3NzaWJsZS4KKyAgICAvLyBCZWZvcmUgZG9p
bmcgc28sIHdlIG5lZWQgdG8gcmVzb2x2ZSBpc3N1ZXMgaW4gSFRNTFNlbGVjdEVsZW1lbnQ6OnJl
Y2FsY0xpc3RJdGVtcworICAgIC8vIGFuZCBSZW5kZXJNZW51TGlzdDo6c2V0VGV4dC4gU2VlIGFs
c28gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTg4NDA1CisgICAgaWYg
KGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0aW9uVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9w
dGdyb3VwVGFnKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBpc0NvbnRyb2wg
PSBlbGVtZW50LT5pc0Zvcm1Db250cm9sRWxlbWVudCgpOworCisgICAgaWYgKGlzQ29udHJvbCAh
PSBzdGF0ZS5lbGVtZW50KCktPmlzRm9ybUNvbnRyb2xFbGVtZW50KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChpc0NvbnRyb2wgJiYgIWNhblNoYXJlU3R5bGVXaXRoQ29udHJv
bChlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0eWxlLT50cmFu
c2l0aW9ucygpIHx8IHN0eWxlLT5hbmltYXRpb25zKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBUdXJuIG9mZiBzdHls
ZSBzaGFyaW5nIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnYWluIGxheWVycyBmb3IgcmVhc29ucyBv
dXRzaWRlIG9mIHRoZSBzdHlsZSBzeXN0ZW0uCisgICAgLy8gU2VlIGNvbW1lbnRzIGluIFJlbmRl
ck9iamVjdDo6c2V0U3R5bGUoKS4KKyAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVU
YWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05h
bWUoZW1iZWRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50
LT5oYXNUYWdOYW1lKGFwcGxldFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShjYW52YXNUYWcp
CisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9GT1JfVklERU8pCisgICAgICAgIC8vIFdpdGggcHJv
eHlpbmcsIHRoZSBtZWRpYSBlbGVtZW50cyBhcmUgYmFja2VkIGJ5IGEgUmVuZGVyRW1iZWRkZWRP
YmplY3QuCisgICAgICAgIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUodmlkZW9UYWcpIHx8IGVsZW1l
bnQtPmhhc1RhZ05hbWUoYXVkaW9UYWcpCisjZW5kaWYKKyAgICAgICAgKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisjZW5kaWYKKworICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhlbGVt
ZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygp
ICYmIHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUoKSAhPSBzdHlsZS0+aW5zaWRlTGluaygpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgLy8gRGVu
eSBzaGFyaW5nIHN0eWxlcyBiZXR3ZWVuIFdlYlZUVCBhbmQgbm9uLVdlYlZUVCBub2Rlcy4KKyAg
ICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1dl
YlZUVEVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQt
PmlzV2ViVlRURWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkg
JiYgdG9XZWJWVFRFbGVtZW50KGVsZW1lbnQpLT5pc1Bhc3ROb2RlKCkgIT0gdG9XZWJWVFRFbGVt
ZW50KHN0YXRlLmVsZW1lbnQoKSktPmlzUGFzdE5vZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworI2VuZGlmCisKKyNpZiBFTkFCTEUoRlVMTFNDUkVFTl9BUEkpCisgICAgaWYgKGVsZW1lbnQg
PT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkg
fHwgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxs
U2NyZWVuRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworaW5saW5lIFN0eWxlZEVsZW1lbnQqIFN0eWxlUmVzb2x2ZXI6OmZpbmRT
aWJsaW5nRm9yU3R5bGVTaGFyaW5nKE5vZGUqIG5vZGUsIHVuc2lnbmVkJiBjb3VudCkgY29uc3QK
K3sKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5vZGUtPnByZXZpb3VzU2libGluZygpKSB7Cisg
ICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRFbGVtZW50KCkpCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgaWYgKGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChzdGF0aWNfY2FzdDxTdHls
ZWRFbGVtZW50Kj4obm9kZSkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjb3Vu
dCsrID09IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
IH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpOworfQorCitS
ZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlU2hhcmVkU3R5bGUoKQoreworICAgIFN0
YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYgKCFzdGF0ZS5zdHlsZWRFbGVtZW50KCkgfHwg
IXN0YXRlLnBhcmVudFN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gSWYgdGhl
IGVsZW1lbnQgaGFzIGlubGluZSBzdHlsZSBpdCBpcyBwcm9iYWJseSB1bmlxdWUuCisgICAgaWYg
KHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0Vs
ZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oc3RhdGUuc3R5bGVkRWxlbWVudCgp
KS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2Vu
ZGlmCisgICAgLy8gSWRzIHN0b3Agc3R5bGUgc2hhcmluZyBpZiB0aGV5IHNob3cgdXAgaW4gdGhl
IHN0eWxlc2hlZXRzLgorICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc0lEKCkgJiYg
bV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiAw
OworICAgIGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+
cGFyZW50RWxlbWVudCgpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5jc3NUYXJnZXQo
KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKHN0
YXRlLmVsZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gQ2FjaGUgd2hldGhl
ciBzdGF0ZS5lbGVtZW50IGlzIGFmZmVjdGVkIGJ5IGFueSBrbm93biBjbGFzcyBzZWxlY3RvcnMu
CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkbid0IGJlIGEgbWVtYmVyIHZhcmlhYmxlLiBUaGUg
c3R5bGUgc2hhcmluZyBjb2RlIGNvdWxkIGJlIGZhY3RvcmVkIG91dCBvZiBTdHlsZVJlc29sdmVy
LgorICAgIHN0YXRlLnNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhzdGF0ZS5lbGVtZW50
KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5oYXNDbGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5
UnVsZXMoc3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkpKTsKKworICAgIC8vIENoZWNrIHBy
ZXZpb3VzIHNpYmxpbmdzIGFuZCB0aGVpciBjb3VzaW5zLgorICAgIHVuc2lnbmVkIGNvdW50ID0g
MDsKKyAgICB1bnNpZ25lZCB2aXNpdGVkTm9kZUNvdW50ID0gMDsKKyAgICBTdHlsZWRFbGVtZW50
KiBzaGFyZUVsZW1lbnQgPSAwOworICAgIE5vZGUqIGNvdXNpbkxpc3QgPSBzdGF0ZS5zdHlsZWRF
bGVtZW50KCktPnByZXZpb3VzU2libGluZygpOworICAgIHdoaWxlIChjb3VzaW5MaXN0KSB7Cisg
ICAgICAgIHNoYXJlRWxlbWVudCA9IGZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKGNvdXNpbkxp
c3QsIGNvdW50KTsKKyAgICAgICAgaWYgKHNoYXJlRWxlbWVudCkKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjb3VzaW5MaXN0ID0gbG9jYXRlQ291c2luTGlzdChjb3VzaW5MaXN0LT5wYXJl
bnRFbGVtZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOworICAgIH0KKworICAgIC8vIElmIHdlIGhh
dmUgZXhoYXVzdGVkIGFsbCBvdXIgYnVkZ2V0IG9yIG91ciBjb3VzaW5zLgorICAgIGlmICghc2hh
cmVFbGVtZW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIENhbid0IHNoYXJlIGlmIHNp
YmxpbmcgcnVsZXMgYXBwbHkuIFRoaXMgaXMgY2hlY2tlZCBhdCB0aGUgZW5kIGFzIGl0IHNob3Vs
ZCByYXJlbHkgZmFpbC4KKyAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVT
ZXQobV9ydWxlU2V0cy5zaWJsaW5nKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBDYW4n
dCBzaGFyZSBpZiBhdHRyaWJ1dGUgcnVsZXMgYXBwbHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0Nh
bmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMudW5jb21tb25BdHRyaWJ1dGUoKSkpCisg
ICAgICAgIHJldHVybiAwOworICAgIC8vIENhbid0IHNoYXJlIGlmIEBob3N0IEAtcnVsZXMgYXBw
bHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgLy8gVHJhY2tpbmcgY2hpbGQgaW5kZXggcmVxdWlyZXMgdW5p
cXVlIHN0eWxlIGZvciBlYWNoIG5vZGUuIFRoaXMgbWF5IGdldCBzZXQgYnkgdGhlIHNpYmxpbmcg
cnVsZSBtYXRjaCBhYm92ZS4KKyAgICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhz
dGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworICAg
IHJldHVybiBzaGFyZUVsZW1lbnQtPnJlbmRlclN0eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgTWF0Y2hpbmdV
QVJ1bGVzU2NvcGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRo
ZSB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBs
ZURlZmF1bHRTdHlsZVNoZWV0KQorICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsK
KyAgICBSdWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNoZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1h
dGNoU3BlY2lmaWMoInByaW50IikKKyAgICAgICAgPyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRl
ZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7Cisg
ICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgdXNlckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJ
biBxdWlya3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQg
c2hlZXQuCisgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRj
aFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHls
ZSk7CisKKyAgICAvLyBJZiBkb2N1bWVudCB1c2VzIHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmll
dyBzb3VyY2UgbW9kZSBvciBpbiB4bWwgdmlld2VyIG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVz
IGZyb20gdGhlIHZpZXcgc291cmNlIHN0eWxlIHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5p
c1ZpZXdTb3VyY2UoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFN0eWxl
c0ZvclBhZ2luYXRpb25Nb2RlKFBhZ2luYXRpb246Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRl
clN0eWxlKiBzdHlsZSkKK3sKKyAgICBpZiAocGFnaW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6
VW5wYWdpbmF0ZWQpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgc3dpdGNoIChwYWdp
bmF0aW9uTW9kZSkgeworICAgIGNhc2UgUGFnaW5hdGlvbjo6TGVmdFRvUmlnaHRQYWdpbmF0ZWQ6
CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKKyAg
ICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAg
c3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihz
dHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVz
c2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBQYWdpbmF0aW9uOjpSaWdodFRvTGVmdFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENv
bHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9y
aXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jl
c3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9n
cmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NX
cml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJv
Z3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlRvcFRvQm90
dG9tUGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVt
bkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJs
b2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1
bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1
bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29s
dW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFBhZ2luYXRpb246OkJvdHRvbVRvVG9wUGFnaW5hdGVkOgorICAgICAgICBz
dHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5
bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29s
dW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3Jt
YWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNM
ZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFs
Q29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246
OlVucGFnaW5hdGVkOgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihj
b25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIEZvbnRPcmllbnRhdGlvbiYgZm9udE9yaWVudGF0aW9u
LCBOb25DSktHbHlwaE9yaWVudGF0aW9uJiBnbHlwaE9yaWVudGF0aW9uKQoreworICAgIGlmIChz
dHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgeworICAgICAgICBmb250T3JpZW50YXRp
b24gPSBIb3Jpem9udGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhP
cmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBz
d2l0Y2ggKHN0eWxlLT50ZXh0T3JpZW50YXRpb24oKSkgeworICAgIGNhc2UgVGV4dE9yaWVudGF0
aW9uVmVydGljYWxSaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7Cisg
ICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxS
aWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVXByaWdodDoK
KyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgIGdseXBoT3JpZW50
YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVXByaWdodDsKKyAgICAgICAgcmV0dXJuOwor
ICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXM6CisgICAgICAgIGlmIChzdHlsZS0+d3Jp
dGluZ01vZGUoKSA9PSBMZWZ0VG9SaWdodFdyaXRpbmdNb2RlKSB7CisgICAgICAgICAgICAvLyBG
SVhNRTogVGhpcyBzaG91bGQgbWFwIHRvIHNpZGV3YXlzLWxlZnQsIHdoaWNoIGlzIG5vdCBzdXBw
b3J0ZWQgeWV0LgorICAgICAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAg
ICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2Fs
UmlnaHQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9udE9yaWVu
dGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0ds
eXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgY2FzZSBU
ZXh0T3JpZW50YXRpb25TaWRld2F5c1JpZ2h0OgorICAgICAgICBmb250T3JpZW50YXRpb24gPSBI
b3Jpem9udGFsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRh
dGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpv
bnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25W
ZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJl
bmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiBkb2N1
bWVudCwgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IpCit7CisgICAgRnJhbWUqIGZyYW1l
ID0gZG9jdW1lbnQtPmZyYW1lKCk7CisKKyAgICAvLyBIVE1MNSBzdGF0ZXMgdGhhdCBzZWFtbGVz
cyBpZnJhbWVzIHNob3VsZCByZXBsYWNlIGRlZmF1bHQgQ1NTIHZhbHVlcworICAgIC8vIHdpdGgg
dmFsdWVzIGluaGVyaXRlZCBmcm9tIHRoZSBjb250YWluaW5nIGlmcmFtZSBlbGVtZW50LiBIb3dl
dmVyLAorICAgIC8vIHNvbWUgdmFsdWVzIChzdWNoIGFzIHRoZSBjYXNlIG9mIGRlc2lnbk1vZGUg
PSAib24iKSBzdGlsbCBuZWVkIHRvCisgICAgLy8gYmUgc2V0IGJ5IHRoaXMgImRvY3VtZW50IHN0
eWxlIi4KKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGRvY3VtZW50U3R5bGUgPSBSZW5kZXJTdHls
ZTo6Y3JlYXRlKCk7CisgICAgYm9vbCBzZWFtbGVzc1dpdGhQYXJlbnQgPSBkb2N1bWVudC0+c2hv
dWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50KCk7CisgICAgaWYgKHNlYW1sZXNzV2l0aFBh
cmVudCkgeworICAgICAgICBSZW5kZXJTdHlsZSogaWZyYW1lU3R5bGUgPSBkb2N1bWVudC0+c2Vh
bWxlc3NQYXJlbnRJRnJhbWUoKS0+cmVuZGVyU3R5bGUoKTsKKyAgICAgICAgaWYgKGlmcmFtZVN0
eWxlKQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+aW5oZXJpdEZyb20oaWZyYW1lU3R5bGUp
OworICAgIH0KKworICAgIC8vIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB3aGljaCB2YWx1ZXMgYmVs
b3cgd2Ugd2FudCB0byBvdmVycmlkZSBpbiB0aGUgc2VhbWxlc3MgY2FzZSEKKyAgICBkb2N1bWVu
dFN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKKyAgICBpZiAoIXNlYW1sZXNzV2l0aFBhcmVudCkg
eworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRSVExPcmRlcmluZyhkb2N1bWVudC0+dmlzdWFs
bHlPcmRlcmVkKCkgPyBWaXN1YWxPcmRlciA6IExvZ2ljYWxPcmRlcik7CisgICAgICAgIGRvY3Vt
ZW50U3R5bGUtPnNldFpvb20oZnJhbWUgJiYgIWRvY3VtZW50LT5wcmludGluZygpID8gZnJhbWUt
PnBhZ2Vab29tRmFjdG9yKCkgOiAxKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UGFnZVNj
YWxlVHJhbnNmb3JtKGZyYW1lID8gZnJhbWUtPmZyYW1lU2NhbGVGYWN0b3IoKSA6IDEpOworICAg
ICAgICBkb2N1bWVudFN0eWxlLT5zZXRMb2NhbGUoZG9jdW1lbnQtPmNvbnRlbnRMYW5ndWFnZSgp
KTsKKyAgICB9CisgICAgLy8gVGhpcyBvdmVycmlkZXMgYW55IC13ZWJraXQtdXNlci1tb2RpZnkg
aW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBpZnJhbWUuCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0
VXNlck1vZGlmeShkb2N1bWVudC0+aW5EZXNpZ25Nb2RlKCkgPyBSRUFEX1dSSVRFIDogUkVBRF9P
TkxZKTsKKworICAgIEVsZW1lbnQqIGRvY0VsZW1lbnQgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVt
ZW50KCk7CisgICAgUmVuZGVyT2JqZWN0KiBkb2NFbGVtZW50UmVuZGVyZXIgPSBkb2NFbGVtZW50
ID8gZG9jRWxlbWVudC0+cmVuZGVyZXIoKSA6IDA7CisgICAgaWYgKGRvY0VsZW1lbnRSZW5kZXJl
cikgeworICAgICAgICAvLyBVc2UgdGhlIGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIG9mIHRo
ZSBib2R5IHRvIHNldCB0aGUKKyAgICAgICAgLy8gdmlld3BvcnQncyBkaXJlY3Rpb24gYW5kIHdy
aXRpbmctbW9kZSB1bmxlc3MgdGhlIHByb3BlcnR5IGlzIHNldCBvbiB0aGUgZG9jdW1lbnQgZWxl
bWVudC4KKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYm9keSwgdGhlbiB1c2UgdGhlIGRvY3Vt
ZW50IGVsZW1lbnQuCisgICAgICAgIFJlbmRlck9iamVjdCogYm9keVJlbmRlcmVyID0gZG9jdW1l
bnQtPmJvZHkoKSA/IGRvY3VtZW50LT5ib2R5KCktPnJlbmRlcmVyKCkgOiAwOworICAgICAgICBp
ZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxl
bWVudCgpKQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoYm9keVJl
bmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGluZ01vZGUoZG9jRWxlbWVudFJlbmRlcmVyLT5zdHls
ZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1l
bnQtPmRpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KCkpCisgICAgICAgICAgICBkb2N1bWVu
dFN0eWxlLT5zZXREaXJlY3Rpb24oYm9keVJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihk
b2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKKyAgICB9CisKKyAgICBp
ZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZp
ZXcoKSkgeworICAgICAgICAgICAgY29uc3QgUGFnaW5hdGlvbiYgcGFnaW5hdGlvbiA9IGZyYW1l
Vmlldy0+cGFnaW5hdGlvbigpOworICAgICAgICAgICAgaWYgKHBhZ2luYXRpb24ubW9kZSAhPSBQ
YWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkgeworICAgICAgICAgICAgICAgIHNldFN0eWxlc0ZvclBh
Z2luYXRpb25Nb2RlKHBhZ2luYXRpb24ubW9kZSwgZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAg
ICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Q29sdW1uR2FwKHBhZ2luYXRpb24uZ2FwKTsK
KyAgICAgICAgICAgICAgICBpZiAoUmVuZGVyVmlldyogdmlldyA9IGRvY3VtZW50LT5yZW5kZXJW
aWV3KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXctPmhhc0NvbHVtbnMoKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHZpZXctPnVwZGF0ZUNvbHVtbkluZm9Gcm9tU3R5bGUoZG9j
dW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgLy8gU2VhbWxlc3MgaWZyYW1lcyB3YW50IHRvIGluaGVyaXQg
dGhlaXIgZm9udCBmcm9tIHRoZWlyIHBhcmVudCBpZnJhbWUsIHNvIGVhcmx5IHJldHVybiBiZWZv
cmUgc2V0dGluZyB0aGUgZm9udC4KKyAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50KQorICAgICAg
ICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7CisKKyAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9T
Y3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihkb2N1bWVudFN0eWxlLT5sb2NhbGUoKSkpOworICAg
IGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKSkgeworICAgICAg
ICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkg
fHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdN
b2RlKCkpOworICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0YW5kYXJkRm9udCA9IHNldHRp
bmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoZm9udERlc2NyaXB0aW9uLnNjcmlwdCgpKTsKKyAgICAg
ICAgaWYgKCFzdGFuZGFyZEZvbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsK
KyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFu
ZGFyZEZvbnQpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBw
ZW5kRmFtaWx5KDApOworICAgICAgICB9CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3
b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAtIENTU1ZhbHVlWHhTbWFsbCArIDEpOworICAgICAgICBp
bnQgc2l6ZSA9IFN0eWxlUmVzb2x2ZXI6OmZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCwgQ1NT
VmFsdWVNZWRpdW0sIGZhbHNlKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmll
ZFNpemUoc2l6ZSk7CisgICAgICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzID0gZG9jdW1lbnQtPmlz
U1ZHRG9jdW1lbnQoKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShT
dHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwg
ZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNp
emUsIHVzZVNWR1pvb21SdWxlcykpOworICAgIH0gZWxzZQorICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkpOworCisgICAgRm9udE9y
aWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGds
eXBoT3JpZW50YXRpb247CisgICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oZG9jdW1lbnRT
dHlsZS5nZXQoKSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKKyAgICBmb250
RGVzY3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVz
Y3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKKwor
ICAgIGRvY3VtZW50U3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwor
ICAgIGRvY3VtZW50U3R5bGUtPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKTsKKworICAgIHJl
dHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlz
QXRTaGFkb3dCb3VuZGFyeShjb25zdCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIGlmICghZWxl
bWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIENvbnRhaW5lck5vZGUqIHBhcmVudE5v
ZGUgPSBlbGVtZW50LT5wYXJlbnROb2RlKCk7CisgICAgcmV0dXJuIHBhcmVudE5vZGUgJiYgcGFy
ZW50Tm9kZS0+aXNTaGFkb3dSb290KCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0
eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlbGVtZW50LCBSZW5kZXJTdHls
ZSogZGVmYXVsdFBhcmVudCwKKyAgICBTdHlsZVNoYXJpbmdCZWhhdmlvciBzaGFyaW5nQmVoYXZp
b3IsIFJ1bGVNYXRjaGluZ0JlaGF2aW9yIG1hdGNoaW5nQmVoYXZpb3IsIFJlbmRlclJlZ2lvbiog
cmVnaW9uRm9yU3R5bGluZykKK3sKKyAgICAvLyBPbmNlIGFuIGVsZW1lbnQgaGFzIGEgcmVuZGVy
ZXIsIHdlIGRvbid0IHRyeSB0byBkZXN0cm95IGl0LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlbmRl
cmVyCisgICAgLy8gd2lsbCB2YW5pc2ggaWYgYSBzdHlsZSByZWNhbGMgaGFwcGVucyBkdXJpbmcg
bG9hZGluZy4KKyAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYm
ICFlbGVtZW50LT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJiAhZWxlbWVu
dC0+cmVuZGVyZXIoKSkgeworICAgICAgICBpZiAoIXNfc3R5bGVOb3RZZXRBdmFpbGFibGUpIHsK
KyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRl
KCkubGVha1JlZigpOworICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+c2V0RGlz
cGxheShOT05FKTsKKyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPmZvbnQoKS51
cGRhdGUobV9mb250U2VsZWN0b3IpOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnQtPmRvY3Vt
ZW50KCktPnNldEhhc05vZGVzV2l0aFBsYWNlaG9sZGVyU3R5bGUoKTsKKyAgICAgICAgcmV0dXJu
IHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisgICAgfQorCisgICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKKyAgICBpbml0RWxlbWVudChlbGVtZW50KTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVS
ZXNvbHZlKGRvY3VtZW50KCksIGVsZW1lbnQsIGRlZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdp
b25Gb3JTdHlsaW5nKTsKKyAgICBpZiAoc2hhcmluZ0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFy
aW5nICYmICFzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBS
ZW5kZXJTdHlsZSogc2hhcmVkU3R5bGUgPSBsb2NhdGVTaGFyZWRTdHlsZSgpOworICAgICAgICBp
ZiAoc2hhcmVkU3R5bGUpCisgICAgICAgICAgICByZXR1cm4gc2hhcmVkU3R5bGU7CisgICAgfQor
CisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBjbG9uZUZvclBhcmVudDsKKworICAgIGlmIChzdGF0
ZS5wYXJlbnRTdHlsZSgpKSB7CisgICAgICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpj
cmVhdGUoKSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKHN0YXRlLnBhcmVu
dFN0eWxlKCksIGlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSA/IFJlbmRlclN0eWxlOjpBdFNo
YWRvd0JvdW5kYXJ5IDogUmVuZGVyU3R5bGU6Ok5vdEF0U2hhZG93Qm91bmRhcnkpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIHN0YXRlLnNldFN0eWxlKGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSk7
CisgICAgICAgIGNsb25lRm9yUGFyZW50ID0gUmVuZGVyU3R5bGU6OmNsb25lKHN0YXRlLnN0eWxl
KCkpOworICAgICAgICBzdGF0ZS5zZXRQYXJlbnRTdHlsZShjbG9uZUZvclBhcmVudC5nZXQoKSk7
CisgICAgfQorICAgIC8vIGNvbnRlbnRlZGl0YWJsZSBhdHRyaWJ1dGUgKGltcGxlbWVudGVkIGJ5
IC13ZWJraXQtdXNlci1tb2RpZnkpIHNob3VsZAorICAgIC8vIGJlIHByb3BhZ2F0ZWQgZnJvbSBz
aGFkb3cgaG9zdCB0byBkaXN0cmlidXRlZCBub2RlLgorICAgIGlmIChzdGF0ZS5kaXN0cmlidXRl
ZFRvSW5zZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBpZiAoRWxlbWVudCogcGFyZW50ID0gZWxl
bWVudC0+cGFyZW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoUmVuZGVyU3R5bGUqIHN0
eWxlT2ZTaGFkb3dIb3N0ID0gcGFyZW50LT5yZW5kZXJTdHlsZSgpKQorICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldFVzZXJNb2RpZnkoc3R5bGVPZlNoYWRvd0hvc3QtPnVzZXJNb2Rp
ZnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpIHsK
KyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SXNMaW5rKHRydWUpOworICAgICAgICBFSW5zaWRl
TGluayBsaW5rU3RhdGUgPSBzdGF0ZS5lbGVtZW50TGlua1N0YXRlKCk7CisgICAgICAgIGlmIChs
aW5rU3RhdGUgIT0gTm90SW5zaWRlTGluaykgeworICAgICAgICAgICAgYm9vbCBmb3JjZVZpc2l0
ZWQgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmZvcmNlUHNldWRvU3RhdGUoZWxlbWVudCwg
Q1NTU2VsZWN0b3I6OlBzZXVkb1Zpc2l0ZWQpOworICAgICAgICAgICAgaWYgKGZvcmNlVmlzaXRl
ZCkKKyAgICAgICAgICAgICAgICBsaW5rU3RhdGUgPSBJbnNpZGVWaXNpdGVkTGluazsKKyAgICAg
ICAgfQorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0ZSk7Cisg
ICAgfQorCisgICAgYm9vbCBuZWVkc0NvbGxlY3Rpb24gPSBmYWxzZTsKKyAgICBDU1NEZWZhdWx0
U3R5bGVTaGVldHM6OmVuc3VyZURlZmF1bHRTdHlsZVNoZWV0c0ZvckVsZW1lbnQoZWxlbWVudCwg
bmVlZHNDb2xsZWN0aW9uKTsKKyAgICBpZiAobmVlZHNDb2xsZWN0aW9uKQorICAgICAgICBtX3J1
bGVTZXRzLmNvbGxlY3RGZWF0dXJlcyhkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29w
ZVJlc29sdmVyLmdldCgpKTsKKworICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OworICAgIGlm
IChtYXRjaGluZ0JlaGF2aW9yID09IE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKQorICAgICAgICBt
YXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOworICAgIGVsc2UKKyAgICAgICAgbWF0Y2hBbGxSdWxl
cyhtYXRjaFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5n
U01JTCk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50
KTsKKworICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0
IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgorICAgIGFkanVzdFJlbmRlclN0eWxl
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGVsZW1lbnQpOworCisgICAgc3Rh
dGUuY2xlYXIoKTsgLy8gQ2xlYXIgb3V0IGZvciB0aGUgbmV4dCByZXNvbHZlLgorCisgICAgZG9j
dW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0
aGUgc3R5bGUuCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRl
clN0eWxlKiBlbGVtZW50U3R5bGUsIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lLCBLZXlm
cmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQoreworICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKKyAg
ICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRp
ZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVydGllcygpKTsKKworICAgIEFTU0VSVCghbV9zdGF0
ZS5zdHlsZSgpKTsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICAvLyBDcmVh
dGUgdGhlIHN0eWxlCisgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNsb25lKGVsZW1l
bnRTdHlsZSkpOworICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKworICAgIC8vIFdl
IGRvbid0IG5lZWQgdG8gYm90aGVyIHdpdGggIWltcG9ydGFudC4gU2luY2UgdGhlcmUgaXMgb25s
eSBldmVyIG9uZQorICAgIC8vIGRlY2wsIHRoZXJlJ3Mgbm90aGluZyB0byBvdmVycmlkZS4gU28g
anVzdCBhZGQgdGhlIGZpcnN0IHByb3BlcnRpZXMuCisgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0g
ZmFsc2U7CisgICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCisgICAgICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwg
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisg
ICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93
LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdl
IGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZQorICAgIGlmIChzdGF0ZS5saW5l
SGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWln
aHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKKworICAgIC8vIE5vdyBkbyByZXN0IG9mIHRo
ZSBwcm9wZXJ0aWVzLgorICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBh
cHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxz
ZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkp
OworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQgYnkgb25lIG9mIHRoZSBub24tZXNz
ZW50aWFsIGZvbnQgcHJvcHMsCisgICAgLy8gZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBhIHNlY29u
ZCB0aW1lLgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3Vy
Y2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygp
OworICAgIAorICAgIC8vIEFkZCBhbGwgdGhlIGFuaW1hdGluZyBwcm9wZXJ0aWVzIHRvIHRoZSBr
ZXlmcmFtZS4KKyAgICBpZiAoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogc3R5bGVEZWNsYXJhdGlv
biA9IGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgICAgdW5zaWduZWQgcHJvcGVydHlD
b3VudCA9IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5Q291bnQoKTsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHByb3BlcnR5Q291bnQ7ICsraSkgeworICAgICAgICAgICAgQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSA9IHN0eWxlRGVjbGFyYXRpb24tPnByb3BlcnR5QXQoaSkuaWQo
KTsKKyAgICAgICAgICAgIC8vIFRpbWluZy1mdW5jdGlvbiB3aXRoaW4ga2V5ZnJhbWVzIGlzIHNw
ZWNpYWwsIGJlY2F1c2UgaXQgaXMgbm90IGFuaW1hdGVkOyBpdCBqdXN0CisgICAgICAgICAgICAv
LyBkZXNjcmliZXMgdGhlIHRpbWluZyBmdW5jdGlvbiBiZXR3ZWVuIHRoaXMga2V5ZnJhbWUgYW5k
IHRoZSBuZXh0LgorICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IENTU1Byb3BlcnR5V2Via2l0
QW5pbWF0aW9uVGltaW5nRnVuY3Rpb24pCisgICAgICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5h
ZGRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkb2N1bWVudCgp
LT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxl
KCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6a2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24o
RWxlbWVudCogZSwgY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgS2V5ZnJhbWVMaXN0
JiBsaXN0KQoreworICAgIGxpc3QuY2xlYXIoKTsKKworICAgIC8vIEdldCB0aGUga2V5ZnJhbWVz
UnVsZSBmb3IgdGhpcyBuYW1lCisgICAgaWYgKCFlIHx8IGxpc3QuYW5pbWF0aW9uTmFtZSgpLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9rZXlmcmFtZXNSdWxlTWFwLmNoZWNr
Q29uc2lzdGVuY3koKTsKKworICAgIEtleWZyYW1lc1J1bGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9r
ZXlmcmFtZXNSdWxlTWFwLmZpbmQobGlzdC5hbmltYXRpb25OYW1lKCkuaW1wbCgpKTsKKyAgICBp
ZiAoaXQgPT0gbV9rZXlmcmFtZXNSdWxlTWFwLmVuZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBTdHlsZVJ1bGVLZXlmcmFtZXMqIGtleWZyYW1lc1J1bGUgPSBpdC0+dmFsdWUuZ2V0
KCk7CisKKyAgICAvLyBDb25zdHJ1Y3QgYW5kIHBvcHVsYXRlIHRoZSBzdHlsZSBmb3IgZWFjaCBr
ZXlmcmFtZQorICAgIGNvbnN0IFZlY3RvcjxSZWZQdHI8U3R5bGVLZXlmcmFtZT4gPiYga2V5ZnJh
bWVzID0ga2V5ZnJhbWVzUnVsZS0+a2V5ZnJhbWVzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGtleWZyYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBBcHBseSB0aGUgZGVj
bGFyYXRpb24gdG8gdGhlIHN0eWxlLiBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRo
ZSBsb2dpYyBpbiBzdHlsZUZvckVsZW1lbnQKKyAgICAgICAgaW5pdEVsZW1lbnQoZSk7CisgICAg
ICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlKTsKKworICAgICAg
ICBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSA9IGtleWZyYW1lc1tpXS5nZXQoKTsKKwor
ICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7CisgICAgICAgIGtleWZy
YW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIGtleWZyYW1l
LCBrZXlmcmFtZVZhbHVlKSk7CisKKyAgICAgICAgLy8gQWRkIHRoaXMga2V5ZnJhbWUgc3R5bGUg
dG8gYWxsIHRoZSBpbmRpY2F0ZWQga2V5IHRpbWVzCisgICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5
czsKKyAgICAgICAga2V5ZnJhbWUtPmdldEtleXMoa2V5cyk7CisgICAgICAgIGZvciAoc2l6ZV90
IGtleUluZGV4ID0gMDsga2V5SW5kZXggPCBrZXlzLnNpemUoKTsgKytrZXlJbmRleCkgeworICAg
ICAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRLZXkoa2V5c1trZXlJbmRleF0pOworICAgICAgICAg
ICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBJZiB0aGUgMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0
aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCisgICAgaW50IGluaXRpYWxMaXN0
U2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgIGlmIChpbml0aWFsTGlzdFNpemUgPiAwICYmIGxpc3Rb
MF0ua2V5KCkpIHsKKyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIHplcm9QZXJjZW50S2V5
ZnJhbWU7CisgICAgICAgIGlmICghemVyb1BlcmNlbnRLZXlmcmFtZSkgeworICAgICAgICAgICAg
emVyb1BlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsK
KyAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUtPnNldEtleVRleHQoIjAlIik7CisgICAg
ICAgIH0KKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAg
ICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCB6
ZXJvUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisgICAgICAgIGxpc3QuaW5zZXJ0
KGtleWZyYW1lVmFsdWUpOworICAgIH0KKworICAgIC8vIElmIHRoZSAxMDAlIGtleWZyYW1lIGlz
IG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90
aGVyIGtleWZyYW1lKQorICAgIGlmIChpbml0aWFsTGlzdFNpemUgPiAwICYmIChsaXN0W2xpc3Qu
c2l6ZSgpIC0gMV0ua2V5KCkgIT0gMSkpIHsKKyAgICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUq
IGh1bmRyZWRQZXJjZW50S2V5ZnJhbWU7CisgICAgICAgIGlmICghaHVuZHJlZFBlcmNlbnRLZXlm
cmFtZSkgeworICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJh
bWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJh
bWUtPnNldEtleVRleHQoIjEwMCUiKTsKKyAgICAgICAgfQorICAgICAgICBLZXlmcmFtZVZhbHVl
IGtleWZyYW1lVmFsdWUoMSwgMCk7CisgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5
bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUsIGtleWZy
YW1lVmFsdWUpKTsKKyAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgfQor
fQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZv
ckVsZW1lbnQoRWxlbWVudCogZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHls
ZVJlcXVlc3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICBBU1NFUlQocGFyZW50
U3R5bGUpOworICAgIGlmICghZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBTdGF0ZSYgc3Rh
dGUgPSBtX3N0YXRlOworCisgICAgaW5pdEVsZW1lbnQoZSk7CisKKyAgICBzdGF0ZS5pbml0Rm9y
U3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlLCBwc2V1ZG9TdHlsZVJlcXVl
c3QpOworICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgc3Rh
dGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKKworICAgIC8v
IFNpbmNlIHdlIGRvbid0IHVzZSBwc2V1ZG8tZWxlbWVudHMgaW4gYW55IG9mIG91ciBxdWlyay9w
cmludCB1c2VyIGFnZW50IHJ1bGVzLCBkb24ndCB3YXN0ZSB0aW1lIHdhbGtpbmcKKyAgICAvLyB0
aG9zZSBydWxlcy4KKworICAgIC8vIENoZWNrIFVBLCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCisg
ICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7CisgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0
KTsKKworICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykgeworICAgICAgICBtYXRj
aFVzZXJSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOworICAgICAgICBtYXRjaEF1dGhvclJ1bGVz
KG1hdGNoUmVzdWx0LCBmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNo
ZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRTdHlsZVR5cGUocHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkKTsKKworICAg
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGUpOworCisgICAgLy8gQ2xlYW4g
dXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25n
IG90aGVyIGZpeHVwcykuCisgICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9z
dGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2Vz
IHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOwor
CisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93
IHJldHVybiB0aGUgc3R5bGUuCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclBhZ2UoaW50IHBh
Z2VJbmRleCkKK3sKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwg
ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpOyAvLyBtX3Jvb3RFbGVtZW50U3R5bGUgd2ls
bCBiZSBzZXQgdG8gdGhlIGRvY3VtZW50IHN0eWxlLgorCisgICAgbV9zdGF0ZS5zZXRTdHlsZShS
ZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIG1fc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20o
bV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOworCisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBp
c0xlZnRQYWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBh
Z2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRl
eCk7CisgICAgCisgICAgTWF0Y2hSZXN1bHQgcmVzdWx0OworICAgIG1hdGNoUGFnZVJ1bGVzKHJl
c3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBp
c0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNl
clN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAgLy8gT25seSBjb25zaWRlciB0
aGUgZ2xvYmFsIGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1M
NSBzcGVjLgorICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHls
ZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKDApOworICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOworI2lmIEVOQUJMRShDU1Nf
VkFSSUFCTEVTKQorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9u
cz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEs
IGluaGVyaXRlZE9ubHkpOworI2VuZGlmCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdo
UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBn
b3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgp
OworCisgICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRl
ZCBvbiB0aGUgZm9udC1zaXplLgorICAgIGlmIChtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQor
ICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgbV9zdGF0ZS5saW5l
SGVpZ2h0VmFsdWUoKSk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5
UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJj
ZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7
CisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBO
b3cgcmV0dXJuIHRoZSBzdHlsZS4KKyAgICByZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKK30K
KworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6ZGVmYXVsdFN0eWxlRm9y
RWxlbWVudCgpCit7CisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkp
OworICAgIC8vIE1ha2Ugc3VyZSBvdXIgZm9udHMgYXJlIGluaXRpYWxpemVkIGlmIHdlIGRvbid0
IGluaGVyaXQgdGhlbSBmcm9tIG91ciBwYXJlbnQgc3R5bGUuCisgICAgaWYgKFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKSkgeworICAgICAgICBpbml0aWFsaXplRm9udFN0
eWxlKHNldHRpbmdzKTsKKyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZv
bnRTZWxlY3RvcigpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250
KCkudXBkYXRlKDApOworCisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bh
c3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yVGV4dChUZXh0KiB0
ZXh0Tm9kZSkKK3sKKyAgICBBU1NFUlQodGV4dE5vZGUpOworCisgICAgTm9kZVJlbmRlcmluZ0Nv
bnRleHQgY29udGV4dCh0ZXh0Tm9kZSk7CisgICAgTm9kZSogcGFyZW50Tm9kZSA9IGNvbnRleHQu
cGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CisgICAgcmV0dXJuIGNvbnRleHQucmVz
ZXRTdHlsZUluaGVyaXRhbmNlKCkgfHwgIXBhcmVudE5vZGUgPworICAgICAgICBkZWZhdWx0U3R5
bGVGb3JFbGVtZW50KCkgOiBwYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpOworfQorCitzdGF0aWMg
dm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICAvLyBJ
bnRyaW5zaWMgbWFyZ2luIHZhbHVlLgorICAgIGNvbnN0IGludCBpbnRyaW5zaWNNYXJnaW4gPSAy
ICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9o
ZWlnaHQgYWxvbmUgYW5kIG5vdCBhbHNvIGRlYWxpbmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRo
IGlzIGZsYXdlZC4KKyAgICAvLyBGSVhNRTogVXNpbmcgInF1aXJrIiB0byBkZWNpZGUgdGhlIG1h
cmdpbiB3YXNuJ3Qgc2V0IGlzIGtpbmQgb2YgbGFtZS4KKyAgICBpZiAoc3R5bGUtPndpZHRoKCku
aXNJbnRyaW5zaWNPckF1dG8oKSkgeworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkxlZnQoKS5x
dWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpbkxlZnQoTGVuZ3RoKGludHJpbnNp
Y01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJr
KCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luUmlnaHQoTGVuZ3RoKGludHJpbnNpY01h
cmdpbiwgRml4ZWQpKTsKKyAgICB9CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygp
KSB7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luVG9wKCkucXVpcmsoKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAg
ICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Cb3R0b20oKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5
bGUtPnNldE1hcmdpbkJvdHRvbShMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAg
IH0KK30KKworc3RhdGljIEVEaXNwbGF5IGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoRURpc3BsYXkg
ZGlzcGxheSwgYm9vbCBpc0Zsb2F0aW5nLCBib29sIHN0cmljdFBhcnNpbmcpCit7CisgICAgc3dp
dGNoIChkaXNwbGF5KSB7CisgICAgY2FzZSBCTE9DSzoKKyAgICBjYXNlIFRBQkxFOgorICAgIGNh
c2UgQk9YOgorICAgIGNhc2UgRkxFWDoKKyAgICBjYXNlIEdSSUQ6CisgICAgICAgIHJldHVybiBk
aXNwbGF5OworCisgICAgY2FzZSBMSVNUX0lURU06CisgICAgICAgIC8vIEl0IGlzIGEgV2luSUUg
YnVnIHRoYXQgZmxvYXRlZCBsaXN0IGl0ZW1zIGxvc2UgdGhlaXIgYnVsbGV0cywgc28gd2UnbGwg
ZW11bGF0ZSB0aGUgcXVpcmssIGJ1dCBvbmx5IGluIHF1aXJrcyBtb2RlLgorICAgICAgICBpZiAo
IXN0cmljdFBhcnNpbmcgJiYgaXNGbG9hdGluZykKKyAgICAgICAgICAgIHJldHVybiBCTE9DSzsK
KyAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAgY2FzZSBJTkxJTkVfVEFCTEU6CisgICAgICAg
IHJldHVybiBUQUJMRTsKKyAgICBjYXNlIElOTElORV9CT1g6CisgICAgICAgIHJldHVybiBCT1g7
CisgICAgY2FzZSBJTkxJTkVfRkxFWDoKKyAgICAgICAgcmV0dXJuIEZMRVg7CisgICAgY2FzZSBJ
TkxJTkVfR1JJRDoKKyAgICAgICAgcmV0dXJuIEdSSUQ7CisKKyAgICBjYXNlIElOTElORToKKyAg
ICBjYXNlIFJVTl9JTjoKKyAgICBjYXNlIENPTVBBQ1Q6CisgICAgY2FzZSBJTkxJTkVfQkxPQ0s6
CisgICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9IRUFERVJfR1JPVVA6
CisgICAgY2FzZSBUQUJMRV9GT09URVJfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9ST1c6CisgICAg
Y2FzZSBUQUJMRV9DT0xVTU5fR1JPVVA6CisgICAgY2FzZSBUQUJMRV9DT0xVTU46CisgICAgY2Fz
ZSBUQUJMRV9DRUxMOgorICAgIGNhc2UgVEFCTEVfQ0FQVElPTjoKKyAgICAgICAgcmV0dXJuIEJM
T0NLOworICAgIGNhc2UgTk9ORToKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgIHJldHVybiBOT05FOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICBy
ZXR1cm4gQkxPQ0s7Cit9CisKKy8vIENTUyByZXF1aXJlcyB0ZXh0LWRlY29yYXRpb24gdG8gYmUg
cmVzZXQgYXQgZWFjaCBET00gZWxlbWVudCBmb3IgdGFibGVzLCAKKy8vIGlubGluZSBibG9ja3Ms
IGlubGluZSB0YWJsZXMsIHJ1bi1pbnMsIHNoYWRvdyBET00gY3Jvc3NpbmdzLCBmbG9hdGluZyBl
bGVtZW50cywKKy8vIGFuZCBhYnNvbHV0ZSBvciByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVu
dHMuCitzdGF0aWMgYm9vbCBkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0aW9uKFJlbmRlclN0eWxl
KiBzdHlsZSwgRWxlbWVudCogZSkKK3sKKyAgICByZXR1cm4gc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRSB8fCBzdHlsZS0+ZGlzcGxh
eSgpID09IFJVTl9JTgorICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CTE9D
SyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1ggfHwgaXNBdFNoYWRvd0JvdW5kYXJ5
KGUpCisgICAgICAgIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgc3R5bGUtPmhhc091dE9mRmxv
d1Bvc2l0aW9uKCk7Cit9CisKK3N0YXRpYyBib29sIGlzRGlzcGxheUZsZXhpYmxlQm94KEVEaXNw
bGF5IGRpc3BsYXkpCit7CisgICAgcmV0dXJuIGRpc3BsYXkgPT0gRkxFWCB8fCBkaXNwbGF5ID09
IElOTElORV9GTEVYOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkanVzdFJlbmRlclN0eWxl
KFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50ICpl
KQoreworICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7CisKKyAgICAvLyBDYWNoZSBvdXIgb3JpZ2lu
YWwgZGlzcGxheS4KKyAgICBzdHlsZS0+c2V0T3JpZ2luYWxEaXNwbGF5KHN0eWxlLT5kaXNwbGF5
KCkpOworCisgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgIT0gTk9ORSkgeworICAgICAgICAvLyBJ
ZiB3ZSBoYXZlIGEgPHRkPiB0aGF0IHNwZWNpZmllcyBhIGZsb2F0IHByb3BlcnR5LCBpbiBxdWly
a3MgbW9kZSB3ZSBqdXN0IGRyb3AgdGhlIGZsb2F0CisgICAgICAgIC8vIHByb3BlcnR5LgorICAg
ICAgICAvLyBTaXRlcyBhbHNvIGNvbW1vbmx5IHVzZSBkaXNwbGF5OmlubGluZS9ibG9jayBvbiA8
dGQ+cyBhbmQgPHRhYmxlPnMuIEluIHF1aXJrcyBtb2RlIHdlIGZvcmNlCisgICAgICAgIC8vIHRo
ZXNlIHRhZ3MgdG8gcmV0YWluIHRoZWlyIGRpc3BsYXkgdHlwZXMuCisgICAgICAgIGlmIChkb2N1
bWVudCgpLT5pblF1aXJrc01vZGUoKSAmJiBlKSB7CisgICAgICAgICAgICBpZiAoZS0+aGFzVGFn
TmFtZSh0ZFRhZykpIHsKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShUQUJMRV9D
RUxMKTsKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAg
ICAgICAgICB9IGVsc2UgaWYgKGUtPmhhc1RhZ05hbWUodGFibGVUYWcpKQorICAgICAgICAgICAg
ICAgIHN0eWxlLT5zZXREaXNwbGF5KHN0eWxlLT5pc0Rpc3BsYXlJbmxpbmVUeXBlKCkgPyBJTkxJ
TkVfVEFCTEUgOiBUQUJMRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZSAmJiAoZS0+aGFz
VGFnTmFtZSh0ZFRhZykgfHwgZS0+aGFzVGFnTmFtZSh0aFRhZykpKSB7CisgICAgICAgICAgICBp
ZiAoc3R5bGUtPndoaXRlU3BhY2UoKSA9PSBLSFRNTF9OT1dSQVApIHsKKyAgICAgICAgICAgICAg
ICAvLyBGaWd1cmUgb3V0IGlmIHdlIGFyZSByZWFsbHkgbm93cmFwcGluZyBvciBpZiB3ZSBzaG91
bGQganVzdAorICAgICAgICAgICAgICAgIC8vIHVzZSBub3JtYWwgaW5zdGVhZC4gSWYgdGhlIHdp
ZHRoIG9mIHRoZSBjZWxsIGlzIGZpeGVkLCB0aGVuCisgICAgICAgICAgICAgICAgLy8gd2UgZG9u
J3QgYWN0dWFsbHkgdXNlIE5PV1JBUC4KKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUtPndpZHRo
KCkuaXNGaXhlZCgpKQorICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShO
T1JNQUwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUt
PnNldFdoaXRlU3BhY2UoTk9XUkFQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIC8vIFRhYmxlcyBuZXZlciBzdXBwb3J0IHRoZSAtd2Via2l0LSogdmFsdWVzIGZvciB0ZXh0
LWFsaWduIGFuZCB3aWxsIHJlc2V0IGJhY2sgdG8gdGhlIGRlZmF1bHQuCisgICAgICAgIGlmIChl
ICYmIGUtPmhhc1RhZ05hbWUodGFibGVUYWcpICYmIChzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VC
S0lUX0xFRlQgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9DRU5URVIgfHwgc3R5bGUt
PnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4
dEFsaWduKFRBU1RBUlQpOworCisgICAgICAgIC8vIEZyYW1lcyBhbmQgZnJhbWVzZXRzIG5ldmVy
IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOmFic29sdXRlLiBUaGlzIGlzIG5l
Y2Vzc2FyeSB0bworICAgICAgICAvLyBmaXggYSBjcmFzaCB3aGVyZSBhIHNpdGUgdHJpZXMgdG8g
cG9zaXRpb24gdGhlc2Ugb2JqZWN0cy4gVGhleSBhbHNvIG5ldmVyIGhvbm9yIGRpc3BsYXkuCisg
ICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8fCBlLT5oYXNUYWdOYW1l
KGZyYW1lc2V0VGFnKSkpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQ
b3NpdGlvbik7CisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CisgICAgICAg
IH0KKworICAgICAgICAvLyBSdWJ5IHRleHQgZG9lcyBub3Qgc3VwcG9ydCBmbG9hdCBvciBwb3Np
dGlvbi4gVGhpcyBtaWdodCBjaGFuZ2Ugd2l0aCBldm9sdXRpb24gb2YgdGhlIHNwZWNpZmljYXRp
b24uCisgICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUocnRUYWcpKSB7CisgICAgICAgICAg
ICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUt
PnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6IFdl
IHNob3VsZG4ndCBiZSBvdmVycmlkaW5nIHN0YXJ0Ly13ZWJraXQtYXV0byBsaWtlIHRoaXMuIERv
IGl0IGluIGh0bWwuY3NzIGluc3RlYWQuCisgICAgICAgIC8vIFRhYmxlIGhlYWRlcnMgd2l0aCBh
IHRleHQtYWxpZ24gb2YgLXdlYmtpdC1hdXRvIHdpbGwgY2hhbmdlIHRoZSB0ZXh0LWFsaWduIHRv
IGNlbnRlci4KKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0aFRhZykgJiYgc3R5bGUt
PnRleHRBbGlnbigpID09IFRBU1RBUlQpCisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWdu
KENFTlRFUik7CisKKyAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQor
ICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworCisgICAgICAgIC8vIEFic29s
dXRlL2ZpeGVkIHBvc2l0aW9uZWQgZWxlbWVudHMsIGZsb2F0aW5nIGVsZW1lbnRzIGFuZCB0aGUg
ZG9jdW1lbnQgZWxlbWVudCBuZWVkIGJsb2NrLWxpa2Ugb3V0c2lkZSBkaXNwbGF5LgorICAgICAg
ICBpZiAoc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCkgfHwgc3R5bGUtPmlzRmxvYXRpbmco
KSB8fCAoZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKSkKKyAgICAg
ICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRp
c3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgp
KSk7CisKKyAgICAgICAgLy8gRklYTUU6IERvbid0IHN1cHBvcnQgdGhpcyBtdXRhdGlvbiBmb3Ig
cHNldWRvIHN0eWxlcyBsaWtlIGZpcnN0LWxldHRlciBvciBmaXJzdC1saW5lLCBzaW5jZSBpdCdz
IG5vdCBjb21wbGV0ZWx5CisgICAgICAgIC8vIGNsZWFyIGhvdyB0aGF0IHNob3VsZCB3b3JrLgor
ICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgJiYgc3R5bGUtPnN0eWxlVHlw
ZSgpID09IE5PUFNFVURPICYmIHN0eWxlLT53cml0aW5nTW9kZSgpICE9IHBhcmVudFN0eWxlLT53
cml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NL
KTsKKworICAgICAgICAvLyBBZnRlciBwZXJmb3JtaW5nIHRoZSBkaXNwbGF5IG11dGF0aW9uLCBj
aGVjayB0YWJsZSByb3dzLiBXZSBkbyBub3QgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9z
aXRpb246c3RpY2t5IG9uCisgICAgICAgIC8vIHRhYmxlIHJvd3Mgb3IgY2VsbHMuIFRoaXMgaGFz
IGJlZW4gZXN0YWJsaXNoZWQgZm9yIHBvc2l0aW9uOnJlbGF0aXZlIGluIENTUzIuMSAoYW5kIGNh
dXNlZCBhIGNyYXNoIGluIGNvbnRhaW5pbmdCbG9jaygpCisgICAgICAgIC8vIG9uIHNvbWUgc2l0
ZXMpLgorICAgICAgICBpZiAoKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQ
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBz
dHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX1JPVykKKyAgICAgICAgICAgICYmIHN0eWxlLT5oYXNJbkZsb3dQb3NpdGlvbigp
KQorICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKworICAg
ICAgICAvLyB3cml0aW5nLW1vZGUgZG9lcyBub3QgYXBwbHkgdG8gdGFibGUgcm93IGdyb3Vwcywg
dGFibGUgY29sdW1uIGdyb3VwcywgdGFibGUgcm93cywgYW5kIHRhYmxlIGNvbHVtbnMuCisgICAg
ICAgIC8vIEZJWE1FOiBUYWJsZSBjZWxscyBzaG91bGQgYmUgYWxsb3dlZCB0byBiZSBwZXJwZW5k
aWN1bGFyIG9yIGZsaXBwZWQgd2l0aCByZXNwZWN0IHRvIHRoZSB0YWJsZSwgdGhvdWdoLgorICAg
ICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU4gfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9G
T09URVJfR1JPVVAKKyAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVB
REVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XIHx8IHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX0NFTEwpCisgICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUocGFyZW50
U3R5bGUtPndyaXRpbmdNb2RlKCkpOworCisgICAgICAgIC8vIEZJWE1FOiBTaW5jZSB3ZSBkb24n
dCBzdXBwb3J0IGJsb2NrLWZsb3cgb24gZmxleGlibGUgYm94ZXMgeWV0LCBkaXNhbGxvdyBzZXR0
aW5nCisgICAgICAgIC8vIG9mIGJsb2NrLWZsb3cgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBUb3BU
b0JvdHRvbVdyaXRpbmdNb2RlLgorICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NDY0MTggLSBGbGV4aWJsZSBib3ggc3VwcG9ydC4KKyAgICAgICAgaWYg
KHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFRvcFRvQm90dG9tV3JpdGluZ01vZGUgJiYgKHN0eWxl
LT5kaXNwbGF5KCkgPT0gQk9YIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCkpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGluZ01vZGUoVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSk7
CisKKyAgICAgICAgaWYgKGlzRGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5
KCkpKSB7CisgICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAg
ICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNw
bGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkp
OworICAgICAgICB9CisKKyNpZiBFTkFCTEUoRElBTE9HX0VMRU1FTlQpCisgICAgICAgIC8vIFBl
ciB0aGUgc3BlYywgcG9zaXRpb24gJ3N0YXRpYycgYW5kICdyZWxhdGl2ZScgaW4gdGhlIHRvcCBs
YXllciBjb21wdXRlIHRvICdhYnNvbHV0ZScuCisgICAgICAgIGlmIChlICYmIGUtPmlzSW5Ub3BM
YXllcigpICYmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiB8fCBzdHlsZS0+
cG9zaXRpb24oKSA9PSBSZWxhdGl2ZVBvc2l0aW9uKSkgeworICAgICAgICAgICAgc3R5bGUtPnNl
dFBvc2l0aW9uKEFic29sdXRlUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3Bs
YXkoQkxPQ0spOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUg
b3VyIHotaW5kZXggdmFsdWUgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBvYmplY3QgaXMgcG9zaXRp
b25lZC4KKyAgICBpZiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gJiYgIWlz
RGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKQorICAgICAgICBzdHls
ZS0+c2V0SGFzQXV0b1pJbmRleCgpOworCisgICAgLy8gQXV0byB6LWluZGV4IGJlY29tZXMgMCBm
b3IgdGhlIHJvb3QgZWxlbWVudCBhbmQgdHJhbnNwYXJlbnQgb2JqZWN0cy4gVGhpcyBwcmV2ZW50
cworICAgIC8vIGNhc2VzIHdoZXJlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgYmxlbmRlZCBhcyBh
IHNpbmdsZSB1bml0IGVuZCB1cCB3aXRoIGEgbm9uLXRyYW5zcGFyZW50CisgICAgLy8gb2JqZWN0
IHdlZGdlZCBpbiBiZXR3ZWVuIHRoZW0uIEF1dG8gei1pbmRleCBhbHNvIGJlY29tZXMgMCBmb3Ig
b2JqZWN0cyB0aGF0IHNwZWNpZnkgdHJhbnNmb3Jtcy9tYXNrcy9yZWZsZWN0aW9ucy4KKyAgICBp
ZiAoc3R5bGUtPmhhc0F1dG9aSW5kZXgoKSAmJiAoKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1l
bnRFbGVtZW50KCkgPT0gZSkKKyAgICAgICAgfHwgc3R5bGUtPm9wYWNpdHkoKSA8IDEuMGYKKyAg
ICAgICAgfHwgc3R5bGUtPmhhc1RyYW5zZm9ybVJlbGF0ZWRQcm9wZXJ0eSgpCisgICAgICAgIHx8
IHN0eWxlLT5oYXNNYXNrKCkKKyAgICAgICAgfHwgc3R5bGUtPmNsaXBQYXRoKCkKKyAgICAgICAg
fHwgc3R5bGUtPmJveFJlZmxlY3QoKQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkKKyAg
ICAgICAgfHwgc3R5bGUtPmhhc0JsZW5kTW9kZSgpCisgICAgICAgIHx8IHN0eWxlLT5wb3NpdGlv
bigpID09IFN0aWNreVBvc2l0aW9uCisgICAgICAgIHx8IChzdHlsZS0+cG9zaXRpb24oKSA9PSBG
aXhlZFBvc2l0aW9uICYmIGUgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpICYmIGUtPmRvY3VtZW50
KCktPnBhZ2UoKS0+c2V0dGluZ3MoKS0+Zml4ZWRQb3NpdGlvbkNyZWF0ZXNTdGFja2luZ0NvbnRl
eHQoKSkKKyNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1dfU0NST0xMSU5HKQorICAgICAg
ICAvLyBUb3VjaCBvdmVyZmxvdyBzY3JvbGxpbmcgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHQu
CisgICAgICAgIHx8ICgoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURERU4gfHwgc3R5bGUtPm92
ZXJmbG93WSgpICE9IE9ISURERU4pICYmIHN0eWxlLT51c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5n
KCkpCisjZW5kaWYKKyNpZiBFTkFCTEUoRElBTE9HX0VMRU1FTlQpCisgICAgICAgIHx8IChlICYm
IGUtPmlzSW5Ub3BMYXllcigpKQorI2VuZGlmCisgICAgICAgICkpCisgICAgICAgIHN0eWxlLT5z
ZXRaSW5kZXgoMCk7CisKKyAgICAvLyBUZXh0YXJlYSBjb25zaWRlcnMgb3ZlcmZsb3cgdmlzaWJs
ZSBhcyBhdXRvLgorICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGV4dGFyZWFUYWcpKSB7Cisg
ICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goc3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxF
ID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dYKCkpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZs
b3dZKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJm
bG93WSgpKTsKKyAgICB9CisKKyAgICBpZiAoZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihz
dHlsZSwgZSkpCisgICAgICAgIHN0eWxlLT5zZXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHls
ZS0+dGV4dERlY29yYXRpb24oKSk7CisgICAgZWxzZQorICAgICAgICBzdHlsZS0+YWRkVG9UZXh0
RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29yYXRpb24oKSk7CisKKyAgICAvLyBJ
ZiBlaXRoZXIgb3ZlcmZsb3cgdmFsdWUgaXMgbm90IHZpc2libGUsIGNoYW5nZSB0byBhdXRvLgor
ICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93
WSgpICE9IE9NQVJRVUVFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9NQVJRVUVFKTsK
KyAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92
ZXJmbG93WCgpICE9IE9NQVJRVUVFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9NQVJR
VUVFKTsKKyAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgJiYgc3R5
bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFKSB7CisgICAgICAgIC8vIEZJWE1FOiBPbmNlIHdl
IGltcGxlbWVudCBwYWdpbmF0aW9uIGNvbnRyb2xzLCBvdmVyZmxvdy14IHNob3VsZCBkZWZhdWx0
IHRvIGhpZGRlbgorICAgICAgICAvLyBpZiBvdmVyZmxvdy15IGlzIHNldCB0byAtd2Via2l0LXBh
Z2VkLXggb3IgLXdlYmtpdC1wYWdlLXkuIEZvciBub3csIHdlJ2xsIGxldCBpdAorICAgICAgICAv
LyBkZWZhdWx0IHRvIGF1dG8gc28gd2UgY2FuIGF0IGxlYXN0IHNjcm9sbCB0aHJvdWdoIHRoZSBw
YWdlcy4KKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPQVVUTyk7CisgICAgfSBlbHNlIGlm
IChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9
IE9WSVNJQkxFKQorICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9BVVRPKTsKKworICAgIC8v
IENhbGwgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoKSBpZiBhIHBhZ2luYXRpb24gbW9kZSBp
cyBzZXQgZm9yIGFueSBub24tcm9vdCBlbGVtZW50cy4gSWYgdGhlc2UKKyAgICAvLyBzdHlsZXMg
YXJlIHNwZWNpZmllZCBvbiBhIHJvb3QgZWxlbWVudCwgdGhlbiB0aGV5IHdpbGwgYmUgaW5jb3Jw
b3JhdGVkIGluCisgICAgLy8gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVudCgpLgorICAg
IGlmICgoc3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFggfHwgc3R5bGUtPm92ZXJmbG93WSgp
ID09IE9QQUdFRFkpICYmICEoZSAmJiAoZS0+aGFzVGFnTmFtZShodG1sVGFnKSB8fCBlLT5oYXNU
YWdOYW1lKGJvZHlUYWcpKSkpCisgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFdl
YkNvcmU6OnBhZ2luYXRpb25Nb2RlRm9yUmVuZGVyU3R5bGUoc3R5bGUpLCBzdHlsZSk7CisKKyAg
ICAvLyBUYWJsZSByb3dzLCBzZWN0aW9ucyBhbmQgdGhlIHRhYmxlIGl0c2VsZiB3aWxsIHN1cHBv
cnQgb3ZlcmZsb3c6aGlkZGVuIGFuZCB3aWxsIGlnbm9yZSBzY3JvbGwvYXV0by4KKyAgICAvLyBG
SVhNRTogRXZlbnR1YWxseSB0YWJsZSBzZWN0aW9ucyB3aWxsIHN1cHBvcnQgYXV0byBhbmQgc2Ny
b2xsLgorICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gSU5MSU5FX1RBQkxFCisgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVf
Uk9XX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKSB7CisgICAgICAgIGlm
IChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9
IE9ISURERU4pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKyAg
ICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZs
b3dZKCkgIT0gT0hJRERFTikKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lC
TEUpOworICAgIH0KKworICAgIC8vIE1lbnVsaXN0cyBzaG91bGQgaGF2ZSB2aXNpYmxlIG92ZXJm
bG93CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KSB7CisgICAg
ICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworICAgICAgICBzdHlsZS0+c2V0T3Zl
cmZsb3dZKE9WSVNJQkxFKTsKKyAgICB9CisKKyAgICAvLyBDdWxsIG91dCBhbnkgdXNlbGVzcyBs
YXllcnMgYW5kIGFsc28gcmVwZWF0IHBhdHRlcm5zIGludG8gYWRkaXRpb25hbCBsYXllcnMuCisg
ICAgc3R5bGUtPmFkanVzdEJhY2tncm91bmRMYXllcnMoKTsKKyAgICBzdHlsZS0+YWRqdXN0TWFz
a0xheWVycygpOworCisgICAgLy8gRG8gdGhlIHNhbWUgZm9yIGFuaW1hdGlvbnMgYW5kIHRyYW5z
aXRpb25zLgorICAgIHN0eWxlLT5hZGp1c3RBbmltYXRpb25zKCk7CisgICAgc3R5bGUtPmFkanVz
dFRyYW5zaXRpb25zKCk7CisKKyAgICAvLyBJbXBvcnRhbnQ6IEludHJpbnNpYyBtYXJnaW5zIGdl
dCBhZGRlZCB0byBjb250cm9scyBiZWZvcmUgdGhlIHRoZW1lIGhhcyBhZGp1c3RlZCB0aGUgc3R5
bGUsIHNpbmNlIHRoZSB0aGVtZSB3aWxsCisgICAgLy8gYWx0ZXIgZm9udHMgYW5kIGhlaWdodHMv
d2lkdGhzLgorICAgIGlmIChlICYmIGUtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCkgJiYgc3R5bGUt
PmZvbnRTaXplKCkgPj0gMTEpIHsKKyAgICAgICAgLy8gRG9uJ3QgYXBwbHkgaW50cmluc2ljIG1h
cmdpbnMgdG8gaW1hZ2UgYnV0dG9ucy4gVGhlIGRlc2lnbmVyIGtub3dzIGhvdyBiaWcgdGhlIGlt
YWdlcyBhcmUsCisgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gdHJlYXQgYWxsIGltYWdlIGJ1dHRv
bnMgYXMgdGhvdWdoIHRoZXkgd2VyZSBleHBsaWNpdGx5IHNpemVkLgorICAgICAgICBpZiAoIWUt
Pmhhc1RhZ05hbWUoaW5wdXRUYWcpIHx8ICFzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4o
ZSktPmlzSW1hZ2VCdXR0b24oKSkKKyAgICAgICAgICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5
bGUpOworICAgIH0KKworICAgIC8vIExldCB0aGUgdGhlbWUgYWxzbyBoYXZlIGEgY3JhY2sgYXQg
YWRqdXN0aW5nIHRoZSBzdHlsZS4KKyAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAg
ICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5hZGp1c3RTdHlsZSh0aGlzLCBzdHls
ZSwgZSwgbV9zdGF0ZS5oYXNVQUFwcGVhcmFuY2UoKSwgbV9zdGF0ZS5ib3JkZXJEYXRhKCksIG1f
c3RhdGUuYmFja2dyb3VuZERhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAg
ICAvLyBJZiB3ZSBoYXZlIGZpcnN0LWxldHRlciBwc2V1ZG8gc3R5bGUsIGRvIG5vdCBzaGFyZSB0
aGlzIHN0eWxlLgorICAgIGlmIChzdHlsZS0+aGFzUHNldWRvU3R5bGUoRklSU1RfTEVUVEVSKSkK
KyAgICAgICAgc3R5bGUtPnNldFVuaXF1ZSgpOworCisgICAgLy8gRklYTUU6IHdoZW4gZHJvcHBp
bmcgdGhlIC13ZWJraXQgcHJlZml4IG9uIHRyYW5zZm9ybS1zdHlsZSwgd2Ugc2hvdWxkIGFsc28g
aGF2ZSBvcGFjaXR5IDwgMSBjYXVzZSBmbGF0dGVuaW5nLgorICAgIGlmIChzdHlsZS0+cHJlc2Vy
dmVzM0QoKSAmJiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFCisgICAgICAgIHx8IHN0
eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRQorICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVy
KCkpKQorICAgICAgICBzdHlsZS0+c2V0VHJhbnNmb3JtU3R5bGUzRChUcmFuc2Zvcm1TdHlsZTNE
RmxhdCk7CisKKyAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIGJlaGF2ZSBsaWtlIGJsb2Nrcy4gTWFw
IHRoZWlyIGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrIHdoZW4gbWFya2VkIGlubGluZS4KKyAgICBp
ZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgJiYgc3R5bGUtPmRpc3BsYXkoKSA9PSBJ
TkxJTkUgJiYgc3RhdGljX2Nhc3Q8SFRNTElGcmFtZUVsZW1lbnQqPihlKS0+c2hvdWxkRGlzcGxh
eVNlYW1sZXNzbHkoKSkKKyAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsK
KworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKGUgJiYgZS0+aXNTVkdFbGVtZW50KCkpIHsKKyAg
ICAgICAgLy8gU3BlYzogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL21hc2tpbmcuaHRtbCNPdmVy
Zmxvd1Byb3BlcnR5CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1NDUk9MTCkK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0hJRERFTik7CisgICAgICAgIGVsc2Ug
aWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRP
dmVyZmxvd1koT1ZJU0lCTEUpOworCisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0g
T1NDUk9MTCkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT0hJRERFTik7CisgICAg
ICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0
eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHJvb3Qg
PHN2Zz4gZWxlbWVudCBpbiBhbiBTVkcgZG9jdW1lbnQgZnJhZ21lbnQgdHJlZSBob25vcnMgY3Nz
IHBvc2l0aW9uCisgICAgICAgIGlmICghKGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZykg
JiYgZS0+cGFyZW50Tm9kZSgpICYmICFlLT5wYXJlbnROb2RlKCktPmlzU1ZHRWxlbWVudCgpKSkK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihSZW5kZXJTdHlsZTo6aW5pdGlhbFBvc2l0
aW9uKCkpOworCisgICAgICAgIC8vIFJlbmRlclNWR1Jvb3QgaGFuZGxlcyB6b29taW5nIGZvciB0
aGUgd2hvbGUgU1ZHIHN1YnRyZWUsIHNvIGZvcmVpZ25PYmplY3QgY29udGVudCBzaG91bGQKKyAg
ICAgICAgLy8gbm90IGJlIHNjYWxlZCBhZ2Fpbi4KKyAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUo
U1ZHTmFtZXM6OmZvcmVpZ25PYmplY3RUYWcpKQorICAgICAgICAgICAgc3R5bGUtPnNldEVmZmVj
dGl2ZVpvb20oUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkpOworICAgIH0KKyNlbmRpZgorfQor
Citib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU3R5bGUoRWxlbWVudCogcmVnaW9uRWxl
bWVudCkKK3sKKyAgICAvLyBGSVhNRSAoQlVHIDcyNDcyKTogV2UgZG9uJ3QgYWRkIEAtd2Via2l0
LXJlZ2lvbiBydWxlcyBvZiBzY29wZWQgc3R5bGUgc2hlZXRzIGZvciB0aGUgbW9tZW50LAorICAg
IC8vIHNvIGFsbCByZWdpb24gcnVsZXMgYXJlIGdsb2JhbCBieSBkZWZhdWx0LiBWZXJpZnkgd2hl
dGhlciB0aGF0IGNhbiBzdGFuZCBvciBuZWVkcyBjaGFuZ2luZy4KKworICAgIHVuc2lnbmVkIHJ1
bGVzU2l6ZSA9IG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRS
dWxlU2V0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsg
KytpKSB7CisgICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7CisgICAgICAgIGlmIChj
aGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxl
Y3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9ydWxlU2V0cy51c2VyU3R5bGUo
KSkgeworICAgICAgICBydWxlc1NpemUgPSBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lv
blNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy51
c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0Lmdl
dCgpKTsKKyAgICAgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMudXNl
clN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJl
Z2lvbkVsZW1lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjaGVja0Zvck9yaWVu
dGF0aW9uQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBGb250T3JpZW50YXRpb24g
Zm9udE9yaWVudGF0aW9uOworICAgIE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRh
dGlvbjsKKyAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihzdHlsZSwgZm9udE9yaWVudGF0
aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKKworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIGlmIChmb250RGVz
Y3JpcHRpb24ub3JpZW50YXRpb24oKSA9PSBmb250T3JpZW50YXRpb24gJiYgZm9udERlc2NyaXB0
aW9uLm5vbkNKS0dseXBoT3JpZW50YXRpb24oKSA9PSBnbHlwaE9yaWVudGF0aW9uKQorICAgICAg
ICByZXR1cm47CisKKyAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGZvbnRE
ZXNjcmlwdGlvbik7CisgICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50
YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7CisgICAgbmV3Rm9udERlc2NyaXB0aW9uLnNldE9yaWVu
dGF0aW9uKGZvbnRPcmllbnRhdGlvbik7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihu
ZXdGb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnVwZGF0ZUZvbnQo
KQoreworICAgIGlmICghbV9zdGF0ZS5mb250RGlydHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0ZS5zdHlsZSgpOworICAgIGNoZWNrRm9yR2Vu
ZXJpY0ZhbWlseUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKKyAgICBjaGVj
a0Zvclpvb21DaGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50U3R5bGUoKSk7CisgICAgY2hlY2tG
b3JPcmllbnRhdGlvbkNoYW5nZShzdHlsZSk7CisgICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9m
b250U2VsZWN0b3IpOworICAgIG1fc3RhdGUuc2V0Rm9udERpcnR5KGZhbHNlKTsKK30KKworUGFz
c1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQo
RWxlbWVudCogZSwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCit7CisgICAgcmV0dXJuIHBzZXVk
b1N0eWxlUnVsZXNGb3JFbGVtZW50KGUsIE5PUFNFVURPLCBydWxlc1RvSW5jbHVkZSk7Cit9CisK
K1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNG
b3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzZXVkb0lkIHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1Rv
SW5jbHVkZSkKK3sKKyAgICBpZiAoIWUgfHwgIWUtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0
c0xvYWRlZCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1fc3RhdGUuc2V0TW9kZShTZWxl
Y3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7CisKKyAgICBpbml0RWxlbWVudChlKTsKKyAg
ICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQp
OworCisgICAgTWF0Y2hSZXN1bHQgZHVtbXk7CisgICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFB
bmRVc2VyQ1NTUnVsZXMpIHsKKyAgICAgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0
aGUgdXNlciBhZ2VudCBzaGVldC4KKyAgICAgICAgbWF0Y2hVQVJ1bGVzKGR1bW15KTsKKworICAg
ICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KKyAgICAgICAgaWYgKG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXks
IHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CisgICAgfQorCisgICAgaWYgKG1fbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVz
KSkgeworICAgICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUg
JiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGlu
IGF1dGhvciBzaGVldHMuCisgICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9J
bmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CisKKyAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2lu
T25seShmYWxzZSk7CisgICAgfQorCisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tl
cjo6UmVzb2x2aW5nU3R5bGUpOworCisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7
Cit9CisKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVE
YXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5h
bWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0
Qm91bmRhcnkpCit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGlmIChydWxl
RGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3IoKSkgeworICAgICAgICAvLyBXZSBrbm93IHRo
aXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBhbnkgcHNldWRvIGVsZW1lbnRzLgorICAgICAg
ICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50
bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9yIG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2Ug
Zm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgorICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQg
dG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KKyAg
ICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9zdFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRP
blJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAg
ICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlwYXJ0U2VsZWN0b3IoKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0
b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRh
Z01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxlRGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgp
KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFz
dFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUu
ZWxlbWVudCgpKTsKKyAgICAgICAgaWYgKCFzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVz
UmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlcygpOworICAg
IH0KKworICAgIC8vIFNsb3cgcGF0aC4KKyAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVj
a2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUoKSk7CisgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxl
Y3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVs
ZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hFbmFibGVkKTsKKyAgICBjb250
ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxlKCk7CisgICAgY29udGV4dC5zY29wZSA9IHNj
b3BlOworICAgIGNvbnRleHQucHNldWRvSWQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5w
c2V1ZG9JZDsKKyAgICBjb250ZXh0LnNjcm9sbGJhciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVz
dCgpLnNjcm9sbGJhcjsKKyAgICBjb250ZXh0LnNjcm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9T
dHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0OworICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5k
YXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OworICAgIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0
Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2li
bGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOworICAgIGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNr
ZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdGF0
ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1
ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBkeW5hbWljUHNldWRvKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2hl
Y2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1l
bnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgaWYgKCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9u
RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU2VsZWN0b3JDaGVja2VyIHNl
bGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX3N0YXRlLm1vZGUoKSk7CisgICAgZm9yIChjb25z
dCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVjdG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0
OjpuZXh0KHMpKSB7CisgICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0Nv
bnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRleHQocywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JD
aGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxlZCk7CisgICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5
bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAgICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRj
aChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwgaWdub3JlRHluYW1pY1BzZXVkbywgRE9NU2libGlu
Z1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVz
KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwor
fQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aGlzIGlzIG1vc3RseSBi
b3Jpbmcgc3R1ZmYgb24gaG93IHRvIGFwcGx5IGEgY2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJz
dHlsZS4uLgorCitMZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1By
aW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJT
dHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKK3sKKyAgICByZXR1cm4gcHJpbWl0
aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNv
bnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJh
Y3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJv
b3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKK30KKworTGVuZ3RoIFN0
eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmlt
aXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBk
b3VibGUgbXVsdGlwbGllcikKK3sKKyAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRp
dmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkRmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENv
bnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZp
ZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIp
IDogTGVuZ3RoKFVuZGVmaW5lZCk7Cit9CisKK3RlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHls
ZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRp
ZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBi
b29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlw
ZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCit7CisgICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlz
dFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5
bGluZygpKTsKKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUHJvY2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwg
dGhpcyk7CisKKyAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVy
dHlDb3VudCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyAr
K2kpIHsKKyAgICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVu
dCA9IHByb3BlcnRpZXMtPnByb3BlcnR5QXQoaSk7CisgICAgICAgIGlmIChpc0ltcG9ydGFudCAh
PSBjdXJyZW50LmlzSW1wb3J0YW50KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
aWYgKGluaGVyaXRlZE9ubHkgJiYgIWN1cnJlbnQuaXNJbmhlcml0ZWQoKSkgeworICAgICAgICAg
ICAgLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBu
ZWVkIHRvIGFwcGx5IGZ1cnRoZXIgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzCisgICAgICAgICAg
ICAvLyBhcyB0aGV5IG1pZ2h0IG92ZXJyaWRlIHRoZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9y
IHRoaXMgcmVhc29uIHdlIGRvbid0IGFsbG93IGRlY2xhcmF0aW9ucyB3aXRoCisgICAgICAgICAg
ICAvLyBleHBsaWNpdGx5IGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIGJlIGNhY2hlZC4KKyAgICAg
ICAgICAgIEFTU0VSVCghY3VycmVudC52YWx1ZSgpLT5pc0luaGVyaXRlZFZhbHVlKCkpOworICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9w
ZXJ0eSA9IGN1cnJlbnQuaWQoKTsKKworICAgICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBl
ID09IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVn
aW9uU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyNpZiBF
TkFCTEUoVklERU9fVFJBQ0spCisgICAgICAgIGlmIChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0g
UHJvcGVydHlXaGl0ZWxpc3RDdWUgJiYgIVN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVBy
b3BlcnR5KHByb3BlcnR5KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworI2VuZGlmCisgICAgICAg
IHN3aXRjaCAocGFzcykgeworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgICAgICBjYXNl
IFZhcmlhYmxlRGVmaW5pdGlvbnM6CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9w
ZXJ0eVZhcmlhYmxlIDwgZmlyc3RDU1NQcm9wZXJ0eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9m
aXJzdF9wcm9wZXJ0eSk7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlW
YXJpYWJsZSkKKyAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3Vy
cmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGNhc2Ug
SGlnaFByaW9yaXR5UHJvcGVydGllczoKKyAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0
Q1NTUHJvcGVydHkgPT0gQ1NTUHJvcGVydHlDb2xvciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3Bl
cnR5KTsKKyAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQ
cm9wZXJ0eUNvbG9yICsgMTcsIENTU196b29tX2lzX2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsK
KyAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQ
cm9wZXJ0eVpvb20gKyAxLCBDU1NfbGluZV9oZWlnaHRfaXNfYWZ0ZXJfem9vbSk7CisjaWYgRU5B
QkxFKENTU19WQVJJQUJMRVMpCisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVy
dHlWYXJpYWJsZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorICAgICAgICAg
ICAgLy8gZ2l2ZSBzcGVjaWFsIHByaW9yaXR5IHRvIGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVz
LCBldGMKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkK
KyAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1
ZSgpKTsKKyAgICAgICAgICAgIC8vIHdlIGFwcGx5IGxpbmUtaGVpZ2h0IGxhdGVyCisgICAgICAg
ICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAg
ICAgICAgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExvd1ByaW9yaXR5UHJvcGVydGllczoKKyAg
ICAgICAgICAgIGlmIChwcm9wZXJ0eSA+IENTU1Byb3BlcnR5TGluZUhlaWdodCkKKyAgICAgICAg
ICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NS
dWxlKGNvb2tpZSk7Cit9CisKK3RlbXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0
aW9uUGFzcyBwYXNzPgordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVz
KGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0
YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KQoreworICAgIGlmIChz
dGFydEluZGV4ID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOworICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRl
TGluaykgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsg
KytpKSB7CisgICAgICAgICAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3Bl
cnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXTsKKyAgICAgICAgICAgIHVu
c2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBtYXRjaGVkUHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOwor
ICAgICAgICAgICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMg
YXJndW1lbnRzIGJ1dCB0aGF0IHJlcXVpcmVzIGNoYW5nZXMgaW4gbWFueSBwbGFjZXMuCisgICAg
ICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlw
ZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hMaW5rKTsKKyAgICAgICAgICAgIHN0YXRlLnNldEFw
cGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hl
Y2tlcjo6TWF0Y2hWaXNpdGVkKTsKKworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+
KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRS
dWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5
V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOworICAgICAg
ICB9CisgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsK
KyAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkg
PD0gZW5kSW5kZXg7ICsraSkgeworICAgICAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0
Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXTsKKyAgICAg
ICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0
KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9u
bHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMu
d2hpdGVsaXN0VHlwZSkpOworICAgIH0KK30KKwordW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29t
cHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVy
dGllcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICAKKyAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpo
YXNoTWVtb3J5KHByb3BlcnRpZXMsIHNpemVvZihNYXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsK
K30KKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBh
LCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKK3sKKyAgICByZXR1cm4gYS5m
aXJzdFVBUnVsZSA9PSBiLmZpcnN0VUFSdWxlCisgICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBi
Lmxhc3RVQVJ1bGUKKyAgICAgICAgJiYgYS5maXJzdEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhv
clJ1bGUKKyAgICAgICAgJiYgYS5sYXN0QXV0aG9yUnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCisg
ICAgICAgICYmIGEuZmlyc3RVc2VyUnVsZSA9PSBiLmZpcnN0VXNlclJ1bGUKKyAgICAgICAgJiYg
YS5sYXN0VXNlclJ1bGUgPT0gYi5sYXN0VXNlclJ1bGU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShj
b25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6
TWF0Y2hSYW5nZXMmIGIpCit7CisgICAgcmV0dXJuICEoYSA9PSBiKTsKK30KKworYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBT
dHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYikKK3sKKyAgICByZXR1cm4gYS5wcm9w
ZXJ0aWVzID09IGIucHJvcGVydGllcyAmJiBhLmxpbmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hU
eXBlOworfQorCitib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFBy
b3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQor
eworICAgIHJldHVybiAhKGEgPT0gYik7Cit9CisKK2NvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBTdHlsZVJlc29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0
KQoreworICAgIEFTU0VSVChoYXNoKTsKKworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0
ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmZpbmQoaGFzaCk7CisgICAgaWYg
KGl0ID09IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5lbmQoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsK
KworICAgIHNpemVfdCBzaXplID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
OworICAgIGlmIChzaXplICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpCisg
ICAgICAgIHJldHVybiAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7
CisgICAgICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0
ZW0ubWF0Y2hlZFByb3BlcnRpZXNbaV0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cisg
ICAgaWYgKGNhY2hlSXRlbS5yYW5nZXMgIT0gbWF0Y2hSZXN1bHQucmFuZ2VzKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICByZXR1cm4gJmNhY2hlSXRlbTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
OjphZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBj
b25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNo
UmVzdWx0JiBtYXRjaFJlc3VsdCkKK3sKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hl
ZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dlZXBzID0gMTAwOworICAgIGlmICgr
K21fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNo
ZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3ZWVwcworICAgICAgICAmJiAhbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIHN0
YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vj
b25kcyA9IDYwOworICAgICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0
YXJ0T25lU2hvdChtYXRjaGVkRGVjbGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7Cisg
ICAgfQorCisgICAgQVNTRVJUKGhhc2gpOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVt
IGNhY2hlSXRlbTsKKyAgICBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNo
UmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzKTsKKyAgICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hS
ZXN1bHQucmFuZ2VzOworICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2lu
YWwgUmVuZGVyU3R5bGUgaW5zdGFuY2UuIEl0IG1heSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgorICAg
IC8vIFRoZSBSZW5kZXJTdHlsZSBpbiB0aGUgY2FjaGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIg
Zm9yIHRoZSBzdWJzdHJ1Y3R1cmVzIGFuZCBuZXZlciB1c2VkIGFzLWlzLgorICAgIGNhY2hlSXRl
bS5yZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShzdHlsZSk7CisgICAgY2FjaGVJdGVt
LnBhcmVudFJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKKyAg
ICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYWRkKGhhc2gsIGNhY2hlSXRlbSk7Cit9CisKK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6aW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQorewor
ICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5jbGVhcigpOworfQorCitzdGF0aWMgYm9vbCBp
c0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50
LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSkKK3sKKyAgICAvLyBGSVhNRTogQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmll
cyBzdGF0ZSB3aGVuIGFwcGx5aW5nIHRvIGRvY3VtZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAg
dGhlIGFwcGx5aW5nIGJ5IGNhY2hpbmcuCisgICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9j
dW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgJiYgZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGlu
Z01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKHN0eWxlLT51bmlxdWUoKSB8fCAoc3R5bGUtPnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYm
IHBhcmVudFN0eWxlLT51bmlxdWUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAo
c3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChz
dHlsZS0+em9vbSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjpp
bml0aWFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIFRoZSBj
YWNoZSBhc3N1bWVzIHN0YXRpYyBrbm93bGVkZ2UgYWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUg
aW5oZXJpdGVkLgorICAgIGlmIChwYXJlbnRTdHlsZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFBy
b3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hS
ZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBFbGVtZW50KiBlbGVtZW50KQoreworICAgIEFTU0VS
VChlbGVtZW50KTsKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIHVuc2lnbmVkIGNh
Y2hlSGFzaCA9IG1hdGNoUmVzdWx0LmlzQ2FjaGVhYmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0
aWVzSGFzaChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkgOiAwOworICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRP
bmx5ID0gZmFsc2U7CisgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hl
SXRlbSA9IDA7CisgICAgaWYgKGNhY2hlSGFzaCAmJiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRj
aGVkUHJvcGVydGllc0NhY2hlKGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpKSkgeworICAgICAgICAv
LyBXZSBjYW4gYnVpbGQgdXAgdGhlIHN0eWxlIGJ5IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9w
ZXJ0aWVzIGZyb20gYW4gZWFybGllciBzdHlsZSBvYmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUg
ZXhhY3QKKyAgICAgICAgLy8gc3R5bGUgZGVjbGFyYXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0
byBhcHBseSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVz
IGNhbiBkZXBlbmQgb24gdGhlIAorICAgICAgICAvLyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMg
ZmFzdCBhbmQgc2F2ZXMgbWVtb3J5IGJ5IHJldXNpbmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJl
cy4KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y29weU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVt
LT5yZW5kZXJTdHlsZS5nZXQoKSk7CisgICAgICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5p
bmhlcml0ZWREYXRhU2hhcmVkKGNhY2hlSXRlbS0+cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYm
ICFpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkpIHsKKyAgICAgICAgICAgIEVJbnNpZGVMaW5r
IGxpbmtTdGF0dXMgPSBzdGF0ZS5zdHlsZSgpLT5pbnNpZGVMaW5rKCk7CisgICAgICAgICAgICAv
LyBJZiB0aGUgY2FjaGUgaXRlbSBwYXJlbnQgc3R5bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQg
cHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwYXJlbnQgc3R5bGUgdGhlbiB0aGUKKyAgICAgICAg
ICAgIC8vIHJlc3VsdGluZyBzdHlsZSB3aWxsIGJlIGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhl
IGluaGVyaXRlZCBwcm9wZXJ0aWVzIG92ZXIgZnJvbSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgor
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJT
dHlsZS5nZXQoKSk7CisKKyAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3Rh
dHVzIGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmhlcml0ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhw
bGljaXRseSByZXN0b3JlIGl0LgorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRl
TGluayhsaW5rU3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAg
ICBhcHBseUluaGVyaXRlZE9ubHkgPSB0cnVlOyAKKyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKKyAgICAvLyBGaXJzdCBhcHBseSBhbGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFz
IHRoZXkgbWF5IGJlIHVzZWQgZHVyaW5nIGFwcGxpY2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMu
CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJl
c3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEs
IGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJs
ZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0
QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVy
aXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9u
cz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBt
YXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAg
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQs
IHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2Vz
Lmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisjZW5kaWYKKworICAgIC8vIE5vdyB3
ZSBoYXZlIGFsbCBvZiB0aGUgbWF0Y2hlZCBydWxlcyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIu
IFdhbGsgdGhlIHJ1bGVzIGFuZCBhcHBseQorICAgIC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGll
cyBmaXJzdCwgaS5lLiwgdGhvc2UgcHJvcGVydGllcyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVw
ZW5kIG9uLgorICAgIC8vIFRoZSBvcmRlciBpcyAoMSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0
YW50LCAoMikgaGlnaC1wcmlvcml0eSBpbXBvcnRhbnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFu
dAorICAgIC8vIGFuZCAoNCkgbm9ybWFsIGltcG9ydGFudC4KKyAgICBzdGF0ZS5zZXRMaW5lSGVp
Z2h0VmFsdWUoMCk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9w
ZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0
aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJv
cGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRo
b3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8
SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBs
eUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5
UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVB
UnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7
CisKKyAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2
ZVpvb20oKSAhPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpIHsKKyAgICAgICAgc3Rh
dGUuc2V0Rm9udERpcnR5KHRydWUpOworICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxz
ZTsKKyAgICB9CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5k
IHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgpOworCisgICAgLy8gTGluZS1oZWlnaHQg
aXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgorICAg
IGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKKworICAgIC8vIE1h
bnkgcHJvcGVydGllcyBkZXBlbmQgb24gdGhlIGZvbnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBh
cHBseSBhbGwgcHJvcGVydGllcy4KKyAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVu
ZGVyU3R5bGUtPmZvbnREZXNjcmlwdGlvbigpICE9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlw
dGlvbigpKQorICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKworICAgIC8vIE5v
dyBkbyB0aGUgbm9ybWFsIHByaW9yaXR5IFVBIHByb3BlcnRpZXMuCisgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0
Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVs
ZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICAKKyAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFu
ZCBiYWNrZ3JvdW5kIHNvIHRoYXQgd2UgY2FuIGV4YW1pbmUgdGhlbSBsYXRlci4KKyAgICBzdGF0
ZS5jYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKKyAgICAKKyAgICAvLyBOb3cgZG8gdGhlIGF1
dGhvciBhbmQgdXNlciBub3JtYWwgcHJpb3JpdHkgcHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1w
b3J0YW50IHByb3BlcnRpZXMuCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0
eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUgKyAxLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBs
eUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQ
cm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0
aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRl
ZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAg
YXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0
LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdl
cy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgCisgICAgLy8gU3RhcnQgbG9h
ZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5n
UmVzb3VyY2VzKCk7CisgICAgCisgICAgQVNTRVJUKCFzdGF0ZS5mb250RGlydHkoKSk7CisgICAg
CisgICAgaWYgKGNhY2hlSXRlbSB8fCAhY2FjaGVIYXNoKQorICAgICAgICByZXR1cm47CisgICAg
aWYgKCFpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCks
IHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCkpKQorICAgICAgICByZXR1cm47Cisg
ICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVu
dFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1bHQpOworfQorCitzdGF0aWMgaW5saW5lIGJv
b2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBTdHlsZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVS
dWxlUGFnZSogcjIpCit7CisgICAgcmV0dXJuIHIxLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgp
IDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJv
b2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkK
K3sKKyAgICBpZiAoIXJ1bGVzKQorICAgICAgICByZXR1cm47CisKKyAgICBWZWN0b3I8U3R5bGVS
dWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7CisgICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1h
dGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVsZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBh
Z2UsIHBhZ2VOYW1lKTsKKyAgICBpZiAobWF0Y2hlZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIHN0ZDo6c3RhYmxlX3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdp
bigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBjb21wYXJlUGFnZVJ1bGVzKTsKKworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUGFnZVJ1bGVzLnNpemUoKTsgaSsrKQorICAg
ICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnBy
b3BlcnRpZXMoKSk7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50
cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0Zp
cnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBmb3IgKGNvbnN0IENTU1Nl
bGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21w
b25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09
IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9j
YWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOworICAgICAgICAgICAg
aWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ1NTU2VsZWN0
b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNvbXBvbmVudC0+cHNldWRvVHlwZSgpOworICAg
ICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFp
c0xlZnRQYWdlKQorICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBz
ZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQorICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUg
PT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFnZSAmJiAhaXNGaXJzdFBhZ2UpKQorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0
KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxl
UnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29u
c3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVs
ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3R5bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ld
OworCisgICAgICAgIGlmICghY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVj
dG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSkpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBh
cHBseSwgdGhlbiBpZ25vcmUgaXQuCisgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHBy
b3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmICghcHJvcGVydGllcyB8
fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCisgICAgICAg
IG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7CisgICAgfQorfQorCitib29sIFN0eWxlUmVzb2x2
ZXI6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKK3sKKyAgICBib29sIGlzRmlyc3RQ
YWdlTGVmdCA9IGZhbHNlOworICAgIGlmICghbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlz
TGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAgICAgICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsK
KworICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAy
OworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNv
bnN0Cit7CisgICAgLy8gRklYTUU6IEluIGNhc2Ugb2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwg
cGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJlIHRoZSBmaXJzdCBwYWdlLgorICAgIHJldHVy
biAoIXBhZ2VJbmRleCk7Cit9CisKK1N0cmluZyBTdHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQg
LyogcGFnZUluZGV4ICovKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBp
bmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAgICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFs
dWUqIHZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgaW5pdEVsZW1lbnQoMCk7Cisg
ICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIDAsIHN0eWxlKTsKKyAg
ICBtX3N0YXRlLnNldFN0eWxlKHN0eWxlKTsKKyAgICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5
bGUoaWQsIHZhbHVlKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9D
dXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlm
ICh2YWx1ZSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShpZCwgdmFsdWUpOworfQorCitpbmxpbmUg
Ym9vbCBpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAg
IHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJv
cmRlclJpZ2h0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xv
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yOgorI2lmIEVOQUJM
RShTVkcpCisgICAgY2FzZSBDU1NQcm9wZXJ0eUZpbGw6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVN0
cm9rZToKKyNlbmRpZgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAg
ICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIGh0dHA6Ly9kZXYu
dzMub3JnL2Nzc3dnL2NzczMtcmVnaW9ucy8jdGhlLWF0LXJlZ2lvbi1zdHlsZS1ydWxlCisvLyBG
SVhNRTogYWRkIGluY3JlbWVudGFsIHN1cHBvcnQgZm9yIG90aGVyIHJlZ2lvbiBzdHlsaW5nIHBy
b3BlcnRpZXMuCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQ
cm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAg
fQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQoraW5s
aW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVy
dHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dy
b3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWToKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFJlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJl
cGVhdFg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRZOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250
U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRWYXJpYW50OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlGb250V2VpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaW5lSGVpZ2h0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlPcGFjaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxp
bmVPZmZzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5T3V0bGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
RGVjb3JhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNoYWRvdzoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyU3R5bGU6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6
CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKy8v
IFNWRyBoYW5kbGVzIHpvb21pbmcgaW4gYSBkaWZmZXJlbnQgd2F5IGNvbXBhcmVkIHRvIENTUy4g
VGhlIHdob2xlIGRvY3VtZW50IGlzIHNjYWxlZCBpbnN0ZWFkCisvLyBvZiBlYWNoIGluZGl2aWR1
YWwgbGVuZ3RoIHZhbHVlIGluIHRoZSByZW5kZXIgc3R5bGUgLyB0cmVlLiBDU1NQcmltaXRpdmVW
YWx1ZTo6Y29tcHV0ZUxlbmd0aCooKQorLy8gbXVsdGlwbGllcyBlYWNoIHJlc29sdmVkIGxlbmd0
aCB3aXRoIHRoZSB6b29tIG11bHRpcGxpZXIgLSBzbyBmb3IgU1ZHIHdlIG5lZWQgdG8gZGlzYWJs
ZSB0aGF0LgorLy8gVGhvdWdoIGFsbCBDU1MgdmFsdWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8g
b3V0ZXJtb3N0IDxzdmc+IGVsZW1lbnRzICh3aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcuLi4p
CisvLyBuZWVkIHRvIHJlc3BlY3QgdGhlIHNjYWxpbmcuIFJlbmRlckJveCAodGhlIHBhcmVudCBj
bGFzcyBvZiBSZW5kZXJTVkdSb290KSBncmFicyB2YWx1ZXMgbGlrZQorLy8gd2lkdGgvaGVpZ2h0
L2JvcmRlci9wYWRkaW5nLy4uLiBmcm9tIHRoZSBSZW5kZXJTdHlsZSAtPiBmb3IgU1ZHIHRoZXNl
IHZhbHVlcyB3b3VsZCBuZXZlciBzY2FsZSwKKy8vIGlmIHdlJ2QgcGFzcyBhIDEuMCB6b29tIGZh
Y3RvciBldmVyeWh3ZXJlLiBTbyB3ZSBvbmx5IHBhc3MgYSB6b29tIGZhY3RvciBvZiAxLjAgZm9y
IHNwZWNpZmljCisvLyBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5PVCBhbGxvd2VkIHRvIHNjYWxlIHdp
dGhpbiBhIHpvb21lZCBTVkcgZG9jdW1lbnQgKGxldHRlci93b3JkLXNwYWNpbmcvZm9udC1zaXpl
KS4KK2Jvb2wgU3R5bGVSZXNvbHZlcjo6dXNlU1ZHWm9vbVJ1bGVzKCkKK3sKKyAgICByZXR1cm4g
bV9zdGF0ZS5lbGVtZW50KCkgJiYgbV9zdGF0ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpOwor
fQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKENTU1ByaW1pdGl2ZVZhbHVl
KiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBMZW5n
dGgmIHdvcmtpbmdMZW5ndGgpCit7CisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
ID09IENTU1ZhbHVlV2Via2l0TWluQ29udGVudCkgeworICAgICAgICB3b3JraW5nTGVuZ3RoID0g
TGVuZ3RoKE1pbkNvbnRlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNYXhDb250ZW50
KSB7CisgICAgICAgIHdvcmtpbmdMZW5ndGggPSBMZW5ndGgoTWF4Q29udGVudCk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIHdvcmtpbmdMZW5ndGggPSBwcmltaXRpdmVWYWx1
ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVy
c2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24gfCBBdXRvQ29udmVyc2lvbj4oc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBzdGF0ZS5zdHlsZSgpLT5lZmZl
Y3RpdmVab29tKCkpOworICAgIGlmICh3b3JraW5nTGVuZ3RoLmlzVW5kZWZpbmVkKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkK
KyAgICAgICAgd29ya2luZ0xlbmd0aC5zZXRRdWlyayhwcmltaXRpdmVWYWx1ZS0+aXNRdWlya1Zh
bHVlKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRU
cmFja01pbk1heChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxl
UmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgR3JpZFRyYWNrU2l6ZSYgdHJhY2tTaXplKQoreworICAg
IFBhaXIqIG1pbk1heFRyYWNrQnJlYWR0aCA9IHByaW1pdGl2ZVZhbHVlLT5nZXRQYWlyVmFsdWUo
KTsKKyAgICBpZiAoIW1pbk1heFRyYWNrQnJlYWR0aCkgeworICAgICAgICBMZW5ndGggd29ya2lu
Z0xlbmd0aDsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKHByaW1pdGl2ZVZh
bHVlLCBzdGF0ZSwgd29ya2luZ0xlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgdHJhY2tTaXplLnNldExlbmd0aCh3b3JraW5nTGVuZ3RoKTsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgTGVuZ3RoIG1pblRyYWNrQnJlYWR0aDsKKyAgICBMZW5n
dGggbWF4VHJhY2tCcmVhZHRoOworICAgIGlmICghY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5N
YXhUcmFja0JyZWFkdGgtPmZpcnN0KCksIHN0YXRlLCBtaW5UcmFja0JyZWFkdGgpIHx8ICFjcmVh
dGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+c2Vjb25kKCksIHN0YXRlLCBt
YXhUcmFja0JyZWFkdGgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB0cmFja1NpemUu
c2V0TWluTWF4KG1pblRyYWNrQnJlYWR0aCwgbWF4VHJhY2tCcmVhZHRoKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrR3JvdXAoQ1NTVmFsdWUqIHZh
bHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIFZlY3RvcjxHcmlkVHJhY2tT
aXplPiYgdHJhY2tTaXplcykKK3sKKyAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2
YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJy
VmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1ByaW1pdGl2ZVZh
bHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgR3JpZFRyYWNrU2l6
ZSB0cmFja1NpemU7CisgICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTWluTWF4KHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oY3VyclZhbHVlKSwgc3RhdGUsIHRyYWNrU2l6ZSkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdHJhY2tTaXplcy5hcHBlbmQodHJh
Y2tTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0
ZUdyaWRUcmFja0xpc3QoQ1NTVmFsdWUqIHZhbHVlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRy
YWNrU2l6ZXMsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSkKK3sKKyAgICAvLyBI
YW5kbGUgJ25vbmUnLgorICAgIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVOb25lOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVHcmlk
VHJhY2tHcm91cCh2YWx1ZSwgc3RhdGUsIHRyYWNrU2l6ZXMpOworfQorCisKK3N0YXRpYyBib29s
IGNyZWF0ZUdyaWRQb3NpdGlvbihDU1NWYWx1ZSogdmFsdWUsIEdyaWRQb3NpdGlvbiYgcG9zaXRp
b24pCit7CisgICAgLy8gRm9yIG5vdywgd2Ugb25seSBhY2NlcHQ6IDxpbnRlZ2VyPiB8ICdhdXRv
JworICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7CisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBB
U1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIo
KSk7CisgICAgcG9zaXRpb24uc2V0SW50ZWdlclBvc2l0aW9uKHByaW1pdGl2ZVZhbHVlLT5nZXRJ
bnRWYWx1ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEVOQUJMRShDU1NfVkFSSUFC
TEVTKQorc3RhdGljIGJvb2wgaGFzVmFyaWFibGVSZWZlcmVuY2UoQ1NTVmFsdWUqIHZhbHVlKQor
eworICAgIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odmFsdWUpOworICAgICAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUtPmhhc1ZhcmlhYmxlUmVm
ZXJlbmNlKCk7CisgICAgfQorCisgICAgaWYgKHZhbHVlLT5pc0NhbGN1bGF0aW9uVmFsdWUoKSkK
KyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENTU0NhbGNWYWx1ZSo+KHZhbHVlKS0+aGFzVmFy
aWFibGVSZWZlcmVuY2UoKTsKKworICAgIGlmICh2YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkgewor
ICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxlY3RWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1Jl
ZmxlY3RWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGRpcmVjdGlv
biA9IHJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCk7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBvZmZzZXQgPSByZWZsZWN0VmFsdWUtPm9mZnNldCgpOworICAgICAgICBDU1NWYWx1ZSogbWFz
ayA9IHJlZmxlY3RWYWx1ZS0+bWFzaygpOworICAgICAgICByZXR1cm4gKGRpcmVjdGlvbiAmJiBo
YXNWYXJpYWJsZVJlZmVyZW5jZShkaXJlY3Rpb24pKSB8fCAob2Zmc2V0ICYmIGhhc1ZhcmlhYmxl
UmVmZXJlbmNlKG9mZnNldCkpIHx8IChtYXNrICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKG1hc2sp
KTsKKyAgICB9CisKKyAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5o
YXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgIGlmIChoYXNWYXJpYWJsZVJlZmVyZW5j
ZShpLnZhbHVlKCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0
dXJuIGZhbHNlOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnJlc29sdmVWYXJpYWJsZXMoQ1NT
UHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3Bl
cnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNzaW9ucykKK3sKKyAgICBzdGQ6OnBhaXI8Q1NT
UHJvcGVydHlJRCwgU3RyaW5nPiBleHByZXNzaW9uKGlkLCB2YWx1ZS0+c2VyaWFsaXplUmVzb2x2
aW5nVmFyaWFibGVzKCptX3N0YXRlLnN0eWxlKCktPnZhcmlhYmxlcygpKSk7CisKKyAgICBpZiAo
a25vd25FeHByZXNzaW9ucy5jb250YWlucyhleHByZXNzaW9uKSkKKyAgICAgICAgcmV0dXJuOyAv
LyBjeWNsZSBkZXRlY3RlZC4KKworICAgIGtub3duRXhwcmVzc2lvbnMuYXBwZW5kKGV4cHJlc3Np
b24pOworCisgICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIGZhc3RlciBub3QgdG8gcmUtcGFyc2Ug
ZnJvbSBzdHJpbmdzLCBidXQgZm9yIG5vdyBDU1MgcHJvcGVydHkgdmFsaWRhdGlvbiBsaXZlcyBp
bnNpZGUgdGhlIHBhcnNlciBzbyB3ZSBkbyBpdCB0aGVyZS4KKyAgICBSZWZQdHI8U3R5bGVQcm9w
ZXJ0eVNldD4gcmVzdWx0U2V0ID0gU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCk7CisgICAgaWYg
KCFDU1NQYXJzZXI6OnBhcnNlVmFsdWUocmVzdWx0U2V0LmdldCgpLCBpZCwgZXhwcmVzc2lvbi5z
ZWNvbmQsIGZhbHNlLCBkb2N1bWVudCgpKSkKKyAgICAgICAgcmV0dXJuOyAvLyBleHByZXNzaW9u
IGZhaWxlZCB0byBwYXJzZS4KKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZXN1bHRT
ZXQtPnByb3BlcnR5Q291bnQoKTsgaSsrKSB7CisgICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlBy
b3BlcnR5UmVmZXJlbmNlIHByb3BlcnR5ID0gcmVzdWx0U2V0LT5wcm9wZXJ0eUF0KGkpOworICAg
ICAgICBpZiAocHJvcGVydHkuaWQoKSAhPSBDU1NQcm9wZXJ0eVZhcmlhYmxlICYmIGhhc1Zhcmlh
YmxlUmVmZXJlbmNlKHByb3BlcnR5LnZhbHVlKCkpKQorICAgICAgICAgICAgcmVzb2x2ZVZhcmlh
Ymxlcyhwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0eS52YWx1ZSgpLCBrbm93bkV4cHJlc3Npb25zKTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShwcm9wZXJ0eS5pZCgpLCBw
cm9wZXJ0eS52YWx1ZSgpKTsKKyAgICB9Cit9CisjZW5kaWYKKwordm9pZCBTdHlsZVJlc29sdmVy
OjphcHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyNp
ZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBpZiAoaWQgIT0gQ1NTUHJvcGVydHlWYXJpYWJs
ZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZSh2YWx1ZSkpIHsKKyAgICAgICAgVmVjdG9yPHN0ZDo6
cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4ga25vd25FeHByZXNzaW9uczsKKyAgICAgICAg
cmVzb2x2ZVZhcmlhYmxlcyhpZCwgdmFsdWUsIGtub3duRXhwcmVzc2lvbnMpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBDU1MgdmFyaWFibGVzIGRvbid0IHJlc29s
dmUgc2hvcnRoYW5kcyBhdCBwYXJzaW5nIHRpbWUsIHNvIHRoaXMgc2hvdWxkIGJlICphZnRlciog
aGFuZGxpbmcgdmFyaWFibGVzLgorICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIWlzRXhwYW5kZWRT
aG9ydGhhbmQoaWQpLCAiU2hvcnRoYW5kIHByb3BlcnR5IGlkID0gJWQgd2Fzbid0IGV4cGFuZGVk
IGF0IHBhcnNpbmcgdGltZSIsIGlkKTsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Cisg
ICAgYm9vbCBpc0luaGVyaXQgPSBzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJp
dGVkVmFsdWUoKTsKKyAgICBib29sIGlzSW5pdGlhbCA9IHZhbHVlLT5pc0luaXRpYWxWYWx1ZSgp
IHx8ICghc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpOwor
CisgICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgIWlzSW5pdGlhbCk7IC8vIGlzSW5oZXJpdCAtPiAh
aXNJbml0aWFsICYmIGlzSW5pdGlhbCAtPiAhaXNJbmhlcml0CisgICAgQVNTRVJUKCFpc0luaGVy
aXQgfHwgKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKSk7IC8vIGlz
SW5oZXJpdCAtPiAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpCisK
KyAgICBpZiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpICYmICghc3RhdGUu
YXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIHx8ICFpc1ZhbGlkVmlzaXRlZExpbmtQ
cm9wZXJ0eShpZCkpKSB7CisgICAgICAgIC8vIExpbWl0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2Fu
IGJlIGFwcGxpZWQgdG8gb25seSB0aGUgb25lcyBob25vcmVkIGJ5IDp2aXNpdGVkLgorICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzSW5oZXJpdCAmJiAhc3RhdGUucGFyZW50U3R5
bGUoKS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSAmJiAhQ1NTUHJvcGVydHk6
OmlzSW5oZXJpdGVkUHJvcGVydHkoaWQpKQorICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5z
ZXRIYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpOworCisjaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCisgICAgaWYgKGlkID09IENTU1Byb3BlcnR5VmFyaWFibGUpIHsKKyAgICAgICAg
QVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04odmFsdWUtPmlzVmFyaWFibGVWYWx1ZSgp
KTsKKyAgICAgICAgQ1NTVmFyaWFibGVWYWx1ZSogdmFyaWFibGUgPSBzdGF0aWNfY2FzdDxDU1NW
YXJpYWJsZVZhbHVlKj4odmFsdWUpOworICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT5uYW1lKCku
aXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+dmFsdWUoKS5pc0VtcHR5KCkp
OworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRWYXJpYWJsZSh2YXJpYWJsZS0+bmFtZSgpLCB2
YXJpYWJsZS0+dmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAg
IC8vIENoZWNrIGxvb2t1cCB0YWJsZSBmb3IgaW1wbGVtZW50YXRpb25zIGFuZCB1c2Ugd2hlbiBh
dmFpbGFibGUuCisgICAgY29uc3QgUHJvcGVydHlIYW5kbGVyJiBoYW5kbGVyID0gbV9zdHlsZUJ1
aWxkZXIucHJvcGVydHlIYW5kbGVyKGlkKTsKKyAgICBpZiAoaGFuZGxlci5pc1ZhbGlkKCkpIHsK
KyAgICAgICAgaWYgKGlzSW5oZXJpdCkKKyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbmhlcml0
VmFsdWUoaWQsIHRoaXMpOworICAgICAgICBlbHNlIGlmIChpc0luaXRpYWwpCisgICAgICAgICAg
ICBoYW5kbGVyLmFwcGx5SW5pdGlhbFZhbHVlKGlkLCB0aGlzKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgaGFuZGxlci5hcHBseVZhbHVlKGlkLCB0aGlzLCB2YWx1ZSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSB2
YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih2YWx1ZSkgOiAwOworCisgICAgZmxvYXQgem9vbUZhY3RvciA9IHN0YXRlLnN0eWxlKCktPmVm
ZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIFdoYXQgZm9sbG93cyBpcyBhIGxpc3QgdGhhdCBtYXBz
IHRoZSBDU1MgcHJvcGVydGllcyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZnJvbnQtZW5kCisg
ICAgLy8gUmVuZGVyU3R5bGUgdmFsdWVzLgorICAgIHN3aXRjaCAoaWQpIHsKKyAgICAvLyBsaXN0
cworICAgIGNhc2UgQ1NTUHJvcGVydHlDb250ZW50OgorICAgICAgICAvLyBsaXN0IG9mIHN0cmlu
ZywgdXJpLCBjb3VudGVyLCBhdHRyLCBpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZJWE1F
OiBJbiBDU1MzLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGluaGVyaXQgY29udGVudC4gSW4gQ1NT
MiBpdCBpcyBub3QuIFRoaXMKKyAgICAgICAgICAgIC8vIG5vdGUgaXMgYSByZW1pbmRlciB0aGF0
IGV2ZW50dWFsbHkgImluaGVyaXQiIG5lZWRzIHRvIGJlIHN1cHBvcnRlZC4KKworICAgICAgICAg
ICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmNsZWFy
Q29udGVudCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgICAgIGJvb2wgZGlkU2V0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3Ig
KENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgp
KSB7CisgICAgICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBpLnZhbHVlKCk7CisgICAgICAg
ICAgICAgICAgaWYgKGl0ZW0tPmlzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmIChpdGVtLT5pc0dyYWRpZW50VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3Jl
YXRlKHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFsdWUqPihpdGVtKS0+Z3JhZGllbnRXaXRoU3R5
bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0
eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZh
bHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVl
OworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAo
aXRlbS0+aXNJbWFnZVNldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudChzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50
LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAg
ICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQor
CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzSW1hZ2VWYWx1ZSgpKSB7CisgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY2FjaGVkT3JQZW5kaW5nRnJvbVZh
bHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VWYWx1ZSo+KGl0ZW0p
KSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGNvbnRlbnRWYWx1
ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlbSk7CisKKyAgICAgICAgICAg
ICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKSB7CisgICAgICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgp
LmltcGwoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNBdHRyKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgLy8gRklYTUU6IENhbiBhIG5hbWVzcGFjZSBiZSBzcGVjaWZpZWQgZm9y
IGFuIGF0dHIoZm9vKT8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCktPnN0
eWxlVHlwZSgpID09IE5PUFNFVURPKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0VW5pcXVlKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnBhcmVudFN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICAg
ICAgICAgICAgICBRdWFsaWZpZWROYW1lIGF0dHIobnVsbEF0b20sIGNvbnRlbnRWYWx1ZS0+Z2V0
U3RyaW5nVmFsdWUoKS5pbXBsKCksIG51bGxBdG9tKTsKKyAgICAgICAgICAgICAgICAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGF0
dHIpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KHZhbHVl
LmlzTnVsbCgpID8gZW1wdHlBdG9tIDogdmFsdWUuaW1wbCgpLCBkaWRTZXQpOworICAgICAgICAg
ICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3Rl
ciB0aGUgZmFjdCB0aGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgYWZmZWN0cyB0aGUgc3R5bGUKKyAg
ICAgICAgICAgICAgICAgICAgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxlcy5hZGQo
YXR0ci5sb2NhbE5hbWUoKS5pbXBsKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29u
dGVudFZhbHVlLT5pc0NvdW50ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBDb3VudGVyKiBj
b3VudGVyVmFsdWUgPSBjb250ZW50VmFsdWUtPmdldENvdW50ZXJWYWx1ZSgpOworICAgICAgICAg
ICAgICAgICAgICBFTGlzdFN0eWxlVHlwZSBsaXN0U3R5bGVUeXBlID0gTm9uZUxpc3RTdHlsZTsK
KyAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RTdHlsZUlkZW50ID0gY291bnRlclZhbHVlLT5s
aXN0U3R5bGVJZGVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdFN0eWxlSWRlbnQg
IT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFN0eWxlVHlwZSA9
IHN0YXRpY19jYXN0PEVMaXN0U3R5bGVUeXBlPihsaXN0U3R5bGVJZGVudCAtIENTU1ZhbHVlRGlz
Yyk7CisgICAgICAgICAgICAgICAgICAgIE93blB0cjxDb3VudGVyQ29udGVudD4gY291bnRlciA9
IGFkb3B0UHRyKG5ldyBDb3VudGVyQ29udGVudChjb3VudGVyVmFsdWUtPmlkZW50aWZpZXIoKSwg
bGlzdFN0eWxlVHlwZSwgY291bnRlclZhbHVlLT5zZXBhcmF0b3IoKSkpOworICAgICAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvdW50ZXIucmVsZWFzZSgpLCBkaWRT
ZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJ
ZGVudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVPcGVuUXVvdGU6Cisg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KE9QRU5fUVVP
VEUsIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NT
VmFsdWVDbG9zZVF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0Q29udGVudChDTE9TRV9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vT3BlblF1b3RlOgorICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChOT19PUEVOX1FVT1RFLCBkaWRTZXQpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9DbG9zZVF1
b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChO
T19DTE9TRV9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbCBhbmQgbm9uZSBk
byBub3QgaGF2ZSBhbnkgZWZmZWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgeyB9CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoIWRpZFNldCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVh
ckNvbnRlbnQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIGNhc2UgQ1NT
UHJvcGVydHlRdW90ZXM6CisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldFF1b3RlcyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT5xdW90ZXMoKSk7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5pdGlhbCkgewor
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKDApOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeworICAg
ICAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4o
dmFsdWUpOworICAgICAgICAgICAgUmVmUHRyPFF1b3Rlc0RhdGE+IHF1b3RlcyA9IFF1b3Rlc0Rh
dGE6OmNyZWF0ZSgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LT5s
ZW5ndGgoKTsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgQ1NTVmFsdWUqIGZpcnN0ID0gbGlz
dC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAgICAgICAgICAgICAgICAvLyBpdGVtKCkg
cmV0dXJucyBudWxsIGlmIG91dCBvZiBib3VuZHMgc28gdGhpcyBpcyBzYWZlLgorICAgICAgICAg
ICAgICAgIENTU1ZhbHVlKiBzZWNvbmQgPSBsaXN0LT5pdGVtKGkgKyAxKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIXNlY29uZCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oZmlyc3QtPmlzUHJpbWl0
aXZlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElD
QVRJT04oc2Vjb25kLT5pc1ByaW1pdGl2ZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIFN0cmlu
ZyBzdGFydFF1b3RlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmaXJzdCktPmdl
dFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuZFF1b3RlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihzZWNvbmQpLT5nZXRTdHJpbmdWYWx1ZSgpOworICAg
ICAgICAgICAgICAgIHF1b3Rlcy0+YWRkUGFpcihzdGQ6Om1ha2VfcGFpcihzdGFydFF1b3RlLCBl
bmRRdW90ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
UXVvdGVzKHF1b3Rlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFF1b3RlcyhRdW90ZXNEYXRhOjpjcmVhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuOworICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFtaWx5OiB7CisgICAgICAgIC8vIGxpc3Qg
b2Ygc3RyaW5ncyBhbmQgaWRzCisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAg
IEZvbnREZXNjcmlwdGlvbiBwYXJlbnRGb250RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHls
ZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250
RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlv
bi5nZW5lcmljRmFtaWx5KCkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZhbWls
eShwYXJlbnRGb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKSk7CisgICAgICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0SXNTcGVjaWZpZWRGb250KHBhcmVudEZvbnREZXNjcmlwdGlvbi5pc1Nw
ZWNpZmllZEZvbnQoKSk7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2Ny
aXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChp
c0luaXRpYWwpIHsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBpbml0aWFsRGVzYyA9IEZv
bnREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlw
dGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgLy8g
V2UgbmVlZCB0byBhZGp1c3QgdGhlIHNpemUgdG8gYWNjb3VudCBmb3IgdGhlIGdlbmVyaWMgZmFt
aWx5IGNoYW5nZSBmcm9tIG1vbm9zcGFjZQorICAgICAgICAgICAgLy8gdG8gbm9uLW1vbm9zcGFj
ZS4KKyAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAmJiBmb250
RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgpKQorICAgICAgICAgICAgICAgIHNldEZv
bnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENT
U1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpIC0gMSwgZmFsc2Up
KTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KGluaXRpYWxE
ZXNjLmdlbmVyaWNGYW1pbHkoKSk7CisgICAgICAgICAgICBpZiAoIWluaXRpYWxEZXNjLmZpcnN0
RmFtaWx5KCkuZmFtaWx5SXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRGYW1pbHkoaW5pdGlhbERlc2MuZmlyc3RGYW1pbHkoKSk7CisgICAgICAgICAgICBzZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0
ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgRm9udEZhbWlseSYgZmlyc3RG
YW1pbHkgPSBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKTsKKyAgICAgICAgRm9udEZhbWls
eSogY3VyckZhbWlseSA9IDA7CisKKyAgICAgICAgLy8gQmVmb3JlIG1hcHBpbmcgaW4gYSBuZXcg
Zm9udC1mYW1pbHkgcHJvcGVydHksIHdlIHNob3VsZCByZXNldCB0aGUgZ2VuZXJpYyBmYW1pbHku
CisgICAgICAgIGJvb2wgb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUgPSBmb250RGVzY3Jp
cHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgpOworICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKworICAgICAgICBmb3Ig
KENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgp
KSB7CisgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGkudmFsdWUoKTsKKyAgICAgICAgICAg
IGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGNvbnRlbnRWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlbSk7CisgICAgICAgICAgICBBdG9taWNTdHJpbmcg
ZmFjZTsKKyAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3Mo
KTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWUtPmlzU3RyaW5nKCkpCisgICAgICAgICAg
ICAgICAgZmFjZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAg
IGVsc2UgaWYgKHNldHRpbmdzKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VmFs
dWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0Qm9k
eToKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1p
bHkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZVNlcmlmOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2VyaWZGYW1pbHk7Cisg
ICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnRE
ZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2Fuc1NlcmlmOgorICAgICAgICAgICAgICAgICAg
ICBmYWNlID0gc2Fuc1NlcmlmRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNhbnNTZXJpZkZhbWlseSk7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVDdXJzaXZlOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gY3Vyc2l2ZUZhbWlseTsKKyAg
ICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERl
c2NyaXB0aW9uOjpDdXJzaXZlRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhbnRhc3k6CisgICAgICAgICAgICAgICAgICAg
IGZhY2UgPSBmYW50YXN5RmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OkZhbnRhc3lGYW1pbHkpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTW9u
b3NwYWNlOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gbW9ub3NwYWNlRmFtaWx5OworICAg
ICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVz
Y3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRQaWN0b2dyYXBoOgorICAgICAgICAg
ICAgICAgICAgICBmYWNlID0gcGljdG9ncmFwaEZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpQaWN0b2dy
YXBoRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZhY2UuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKCFjdXJyRmFtaWx5KSB7CisgICAgICAgICAgICAgICAgICAgIC8v
IEZpbGxpbmcgaW4gdGhlIGZpcnN0IGZhbWlseS4KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RG
YW1pbHkuc2V0RmFtaWx5KGZhY2UpOworICAgICAgICAgICAgICAgICAgICBmaXJzdEZhbWlseS5h
cHBlbmRGYW1pbHkoMCk7IC8vIFJlbW92ZSBhbnkgaW5oZXJpdGVkIGZhbWlseS1mYWxsYmFjayBs
aXN0LgorICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gJmZpcnN0RmFtaWx5OworICAg
ICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0SXNTcGVjaWZpZWRGb250KGZvbnRE
ZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkgPT0gRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7
CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFNo
YXJlZEZvbnRGYW1pbHk+IG5ld0ZhbWlseSA9IFNoYXJlZEZvbnRGYW1pbHk6OmNyZWF0ZSgpOwor
ICAgICAgICAgICAgICAgICAgICBuZXdGYW1pbHktPnNldEZhbWlseShmYWNlKTsKKyAgICAgICAg
ICAgICAgICAgICAgY3VyckZhbWlseS0+YXBwZW5kRmFtaWx5KG5ld0ZhbWlseSk7CisgICAgICAg
ICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSBuZXdGYW1pbHkuZ2V0KCk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgY2FuJ3QgY2Fs
bCB1c2VGaXhlZERlZmF1bHRTaXplKCkgdW50aWwgYWxsIG5ldyBmb250IGZhbWlsaWVzIGhhdmUg
YmVlbiBhZGRlZAorICAgICAgICAvLyBJZiBjdXJyRmFtaWx5IGlzIG5vbi16ZXJvIHRoZW4gd2Ug
c2V0IGF0IGxlYXN0IG9uZSBmYW1pbHkgb24gdGhpcyBkZXNjcmlwdGlvbi4KKyAgICAgICAgaWYg
KGN1cnJGYW1pbHkpIHsKKyAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24ua2V5d29yZFNp
emUoKSAmJiBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgpICE9IG9sZEZhbWls
eVVzZWRGaXhlZERlZmF1bHRTaXplKQorICAgICAgICAgICAgICAgIHNldEZvbnRTaXplKGZvbnRE
ZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFs
bCArIGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpIC0gMSwgIW9sZEZhbWlseVVzZWRGaXhl
ZERlZmF1bHRTaXplKSk7CisKKyAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gU2hv
cnRoYW5kIHByb3BlcnRpZXMuCisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6CisgICAgICAgIGlm
IChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRp
b24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoc3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lm
aWVkTGluZUhlaWdodCgpKTsKKyAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgw
KTsKKyAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAg
ICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOworICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsg
Ly8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQg
YWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncworICAgICAgICAgICAg
aWYgKCFzZXR0aW5ncykKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpbml0
aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVW
YWx1ZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJT
dHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVp
Z2h0VmFsdWUoMCk7CisKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRp
b247CisgICAgICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCksIGZvbnREZXNjcmlwdGlvbik7CisKKyAgICAgICAg
ICAgIC8vIERvdWJsZS1jaGVjayBhbmQgc2VlIGlmIHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElm
IG5vdCwgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBmb250LgorICAgICAgICAgICAgaWYgKGZv
bnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gTWFr
ZSBzdXJlIHRoZSByZW5kZXJpbmcgbW9kZSBhbmQgcHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1
cGRhdGVkLgorICAgICAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0
dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBk
b2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4g
YSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCisgICAgICAgICAgICAgICAgaWYgKCFzZXR0
aW5ncykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgp
KTsKKyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9j
dW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25F
bmFibGVkKCkpOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4K
KyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnRE
ZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6
ZSgpLCB1c2VTVkdab29tUnVsZXMoKSkpOworICAgICAgICAgICAgICAgIHNldEZvbnREZXNjcmlw
dGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYg
KHZhbHVlLT5pc0ZvbnRWYWx1ZSgpKSB7CisgICAgICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBz
dGF0aWNfY2FzdDxGb250VmFsdWUqPih2YWx1ZSk7CisgICAgICAgICAgICBpZiAoIWZvbnQtPnN0
eWxlIHx8ICFmb250LT52YXJpYW50IHx8ICFmb250LT53ZWlnaHQKKyAgICAgICAgICAgICAgICB8
fCAhZm9udC0+c2l6ZSB8fCAhZm9udC0+bGluZUhlaWdodCB8fCAhZm9udC0+ZmFtaWx5KQorICAg
ICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVy
dHlGb250U3R5bGUsIGZvbnQtPnN0eWxlLmdldCgpKTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVy
dHkoQ1NTUHJvcGVydHlGb250VmFyaWFudCwgZm9udC0+dmFyaWFudC5nZXQoKSk7CisgICAgICAg
ICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0Lmdl
dCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBv
dXIgZm9udCBidXQgdGhleSBkb24ndCB0cnkgdG8gcmVhZCB0aGUgZm9udCdzCisgICAgICAgICAg
ICAvLyBwcm9wZXJ0aWVzIGJhY2ssIHdoaWNoIGlzIHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXpl
IGlzIHVzaW5nIHRoZSAnZXgnIHVuaXQsIGl0IHdpbGwKKyAgICAgICAgICAgIC8vIG5lZWQgcXVl
cnkgdGhlIGRpcnRpZWQgZm9udCdzIHgtaGVpZ2h0IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4g
VG8gYmUgc2FmZSBpbiB0aGlzCisgICAgICAgICAgICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0
ZSB0aGUgZm9udCBub3cuCisgICAgICAgICAgICB1cGRhdGVGb250KCk7CisgICAgICAgICAgICBh
cHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNpemUsIGZvbnQtPnNpemUuZ2V0KCkpOworCisg
ICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQo
KSk7CisKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBm
b250LT5mYW1pbHkuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKworICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVySW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJv
cmRlclN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3A6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlcldpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGU6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eU1hcmdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmc6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXI6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyRW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFy
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyUmFkaXVzOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5zOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5S
dWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRGbGV4RmxvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFyZ2luQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2s6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUZXh0U3Ryb2tlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW46CisjaWYgRU5B
QkxFKENTU19FWENMVVNJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwOgorI2Vu
ZGlmCisgICAgICAgIEFTU0VSVChpc0V4cGFuZGVkU2hvcnRoYW5kKGlkKSk7CisgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKworICAgIC8vIENTUzMgUHJvcGVy
dGllcworICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3hTaGFkb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdzogeworICAg
ICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlU
ZXh0U2hhZG93KQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0
U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBT
aGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkpKSA6IG51bGxwdHIp
OworICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzdGF0ZS5w
YXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0
ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSkpIDogbnVsbHB0cik7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKGlzSW5pdGlhbCB8fCBwcmltaXRpdmVWYWx1ZSkgLy8gaW5pdGlhbCB8IG5vbmUK
KyAgICAgICAgICAgIHJldHVybiBpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cgPyBzdGF0ZS5z
dHlsZSgpLT5zZXRUZXh0U2hhZG93KG51bGxwdHIpIDogc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hh
ZG93KG51bGxwdHIpOworCisgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0g
dmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWUq
IGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1No
YWRvd1ZhbHVlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTaGFk
b3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4oY3VyclZhbHVlKTsKKyAg
ICAgICAgICAgIGludCB4ID0gaXRlbS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxl
KCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBp
bnQgeSA9IGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICAgICAgaW50IGJsdXIgPSBp
dGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCks
IHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOworICAgICAgICAgICAg
aW50IHNwcmVhZCA9IGl0ZW0tPnNwcmVhZCA/IGl0ZW0tPnNwcmVhZC0+Y29tcHV0ZUxlbmd0aDxp
bnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcikg
OiAwOworICAgICAgICAgICAgU2hhZG93U3R5bGUgc2hhZG93U3R5bGUgPSBpdGVtLT5zdHlsZSAm
JiBpdGVtLT5zdHlsZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluc2V0ID8gSW5zZXQgOiBOb3Jt
YWw7CisgICAgICAgICAgICBDb2xvciBjb2xvcjsKKyAgICAgICAgICAgIGlmIChpdGVtLT5jb2xv
cikKKyAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKGl0ZW0t
PmNvbG9yLmdldCgpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLnN0eWxlKCkpCisgICAg
ICAgICAgICAgICAgY29sb3IgPSBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOworCisgICAgICAgICAg
ICBPd25QdHI8U2hhZG93RGF0YT4gc2hhZG93RGF0YSA9IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRh
KEludFBvaW50KHgsIHkpLCBibHVyLCBzcHJlYWQsIHNoYWRvd1N0eWxlLCBpZCA9PSBDU1NQcm9w
ZXJ0eVdlYmtpdEJveFNoYWRvdywgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJh
bnNwYXJlbnQpKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cp
CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzaGFkb3dEYXRh
LnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90
IHRoZSBmaXJzdCBlbnRyeQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldEJveFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsg
Ly8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQorICAgICAg
ICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eFJlZmxlY3Q6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoYm94UmVmbGVj
dCwgQm94UmVmbGVjdCkKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KFJlbmRlclN0eWxlOjppbml0aWFsQm94UmVm
bGVjdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgh
dmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAg
Q1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFs
dWUqPih2YWx1ZSk7CisgICAgICAgIFJlZlB0cjxTdHlsZVJlZmxlY3Rpb24+IHJlZmxlY3Rpb24g
PSBTdHlsZVJlZmxlY3Rpb246OmNyZWF0ZSgpOworICAgICAgICByZWZsZWN0aW9uLT5zZXREaXJl
Y3Rpb24oKnJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCkpOworICAgICAgICBpZiAocmVmbGVjdFZh
bHVlLT5vZmZzZXQoKSkKKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE9mZnNldChyZWZsZWN0
VmFsdWUtPm9mZnNldCgpLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8
IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCks
IHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikpOworICAgICAgICBOaW5lUGll
Y2VJbWFnZSBtYXNrOworICAgICAgICBtYXNrLnNldE1hc2tEZWZhdWx0cygpOworICAgICAgICBt
X3N0eWxlTWFwLm1hcE5pbmVQaWVjZUltYWdlKGlkLCByZWZsZWN0VmFsdWUtPm1hc2soKSwgbWFz
ayk7CisgICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2sobWFzayk7CisKKyAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0Qm94UmVmbGVjdChyZWZsZWN0aW9uLnJlbGVhc2UoKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVNyYzogLy8gT25seSB1c2VkIGluIEBm
b250LWZhY2UgcnVsZXMuCisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5VW5p
Y29kZVJhbmdlOiAvLyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KKyAgICAgICAgcmV0
dXJuOworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlUmVwZXRpdGlvbjogeworICAg
ICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlTG9vcENvdW50LCBNYXJxdWVl
TG9vcENvdW50KQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVJ
bmZpbml0ZSkKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQo
LTEpOyAvLyAtMSBtZWFucyByZXBlYXQgZm9yZXZlci4KKyAgICAgICAgZWxzZSBpZiAocHJpbWl0
aXZlVmFsdWUtPmlzTnVtYmVyKCkpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlTG9vcENvdW50KHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVNwZWVkOiB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVTcGVlZCwgTWFycXVlZVNw
ZWVkKQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBpZiAoaW50IGlkZW50ID0gcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAg
ICAgICAgICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTbG93
OgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg1MDApOyAv
LyA1MDAgbXNlYy4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NT
VmFsdWVOb3JtYWw6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNw
ZWVkKDg1KTsgLy8gODVtc2VjLiBUaGUgV2luSUUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYXN0OgorICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCgxMCk7IC8vIDEwbXNlYy4gU3VwZXIgZmFzdC4K
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlm
IChwcmltaXRpdmVWYWx1ZS0+aXNUaW1lKCkpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlU3BlZWQocHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVUaW1lPGludCwgQ1NTUHJpbWl0
aXZlVmFsdWU6Ok1pbGxpc2Vjb25kcz4oKSk7CisgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZh
bHVlLT5pc051bWJlcigpKSAvLyBGb3Igc2Nyb2xsYW1vdW50IHN1cHBvcnQuCisgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQocHJpbWl0aXZlVmFsdWUtPmdldEludFZh
bHVlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXJxdWVlSW5jcmVtZW50OiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KG1hcnF1ZWVJbmNyZW1lbnQsIE1hcnF1ZWVJbmNyZW1lbnQpCisgICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgc3dpdGNoIChwcmltaXRpdmVWYWx1ZS0+Z2V0
SWRlbnQoKSkgeworICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNtYWxsOgorICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDEsIEZpeGVkKSk7
IC8vIDFweC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVOb3JtYWw6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3Jl
bWVudChMZW5ndGgoNiwgRml4ZWQpKTsgLy8gNnB4LiBUaGUgV2luSUUgZGVmYXVsdC4KKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVMYXJnZToKKyAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCgzNiwg
Rml4ZWQpKTsgLy8gMzZweC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExlbmd0aCBtYXJxdWVlTGVuZ3RoID0gY29u
dmVydFRvSW50TGVuZ3RoKHByaW1pdGl2ZVZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCkpOworICAgICAgICAgICAgaWYgKCFtYXJxdWVlTGVuZ3RoLmlzVW5kZWZp
bmVkKCkpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVu
dChtYXJxdWVlTGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2NhbGU6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwobG9jYWxlLCBMb2NhbGUpOworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVl
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TG9j
YWxlKG51bGxBdG9tKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TG9jYWxlKHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpKTsKKyAgICAgICAgRm9u
dERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlw
dGlvbigpOworICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0
Q29kZUZvckZvbnRTZWxlY3Rpb24oc3RhdGUuc3R5bGUoKS0+bG9jYWxlKCkpKTsKKyAgICAgICAg
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQT1JUKQorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXREYXNoYm9hcmRSZWdpb246CisgICAgeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRf
SU5JVElBTChkYXNoYm9hcmRSZWdpb25zLCBEYXNoYm9hcmRSZWdpb25zKQorICAgICAgICBpZiAo
IXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbnMoUmVuZGVyU3R5bGU6Om5vbmVEYXNoYm9h
cmRSZWdpb25zKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAg
RGFzaGJvYXJkUmVnaW9uKiByZWdpb24gPSBwcmltaXRpdmVWYWx1ZS0+Z2V0RGFzaGJvYXJkUmVn
aW9uVmFsdWUoKTsKKyAgICAgICAgaWYgKCFyZWdpb24pCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiBmaXJzdCA9IHJlZ2lvbjsKKyAgICAgICAgd2hpbGUg
KHJlZ2lvbikgeworICAgICAgICAgICAgTGVuZ3RoIHRvcCA9IGNvbnZlcnRUb0ludExlbmd0aChy
ZWdpb24tPnRvcCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwor
ICAgICAgICAgICAgTGVuZ3RoIHJpZ2h0ID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+cmln
aHQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAg
ICAgIExlbmd0aCBib3R0b20gPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5ib3R0b20oKSwg
c3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExl
bmd0aCBsZWZ0ID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+bGVmdCgpLCBzdGF0ZS5zdHls
ZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOworCisgICAgICAgICAgICBpZiAodG9wLmlz
VW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgdG9wID0gTGVuZ3RoKCk7CisgICAgICAgICAg
ICBpZiAocmlnaHQuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByaWdodCA9IExlbmd0
aCgpOworICAgICAgICAgICAgaWYgKGJvdHRvbS5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAg
ICAgIGJvdHRvbSA9IExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlZnQuaXNVbmRlZmluZWQo
KSkKKyAgICAgICAgICAgICAgICBsZWZ0ID0gTGVuZ3RoKCk7CisKKyAgICAgICAgICAgIGlmIChy
ZWdpb24tPm1faXNDaXJjbGUpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFz
aGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpDaXJjbGUsIHJlZ2lvbi0+bV9sYWJl
bCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRy
dWUpOworICAgICAgICAgICAgZWxzZSBpZiAocmVnaW9uLT5tX2lzUmVjdGFuZ2xlKQorICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2Fy
ZFJlZ2lvbjo6UmVjdGFuZ2xlLCByZWdpb24tPm1fbGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwg
bGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2UgOiB0cnVlKTsKKyAgICAgICAgICAgIHJlZ2lv
biA9IHJlZ2lvbi0+bV9uZXh0LmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGUuZG9j
dW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVnaW9ucyh0cnVlKTsKKworICAgICAgICByZXR1cm47
CisgICAgfQorI2VuZGlmCisjaWYgRU5BQkxFKERSQUdHQUJMRV9SRUdJT04pCisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFwcFJlZ2lvbjogeworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVl
IHx8ICFwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RHJhZ2dhYmxlUmVnaW9uTW9kZShwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURyYWcgPyBEcmFnZ2FibGVSZWdpb25EcmFnIDogRHJh
Z2dhYmxlUmVnaW9uTm9EcmFnKTsKKyAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0SGFzQW5u
b3RhdGVkUmVnaW9ucyh0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlV2lkdGg6IHsKKyAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFN0cm9rZVdpZHRoLCBUZXh0U3Ryb2tlV2lkdGgpCisg
ICAgICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICAgICAgc3dpdGNoIChwcmltaXRpdmVWYWx1ZS0+
Z2V0SWRlbnQoKSkgeworICAgICAgICBjYXNlIENTU1ZhbHVlVGhpbjoKKyAgICAgICAgY2FzZSBD
U1NWYWx1ZU1lZGl1bToKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVRoaWNrOiB7CisgICAgICAgICAg
ICBkb3VibGUgcmVzdWx0ID0gMS4wIC8gNDg7CisgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVNZWRpdW0pCisgICAgICAgICAgICAgICAgcmVzdWx0
ICo9IDM7CisgICAgICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9
PSBDU1NWYWx1ZVRoaWNrKQorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSA1OworICAgICAgICAg
ICAgd2lkdGggPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHJlc3VsdCwgQ1NTUHJpbWl0aXZl
VmFsdWU6OkNTU19FTVMpLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0
ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHdpZHRoID0gcHJpbWl0aXZl
VmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U3Ryb2tlV2lkdGgod2lkdGgpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm06IHsK
KyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodHJhbnNmb3JtLCBUcmFuc2Zvcm0p
OworICAgICAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgICAgIGNyZWF0
ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSwgb3BlcmF0aW9ucyk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRyYW5z
Zm9ybShvcGVyYXRpb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UGVyc3BlY3RpdmU6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwocGVyc3BlY3RpdmUsIFBlcnNwZWN0aXZlKQorCisgICAgICAgIGlmICghcHJpbWl0aXZl
VmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0UGVyc3BlY3RpdmUoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwor
ICAgICAgICBmbG9hdCBwZXJzcGVjdGl2ZVZhbHVlOworICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUtPmlzTGVuZ3RoKCkpCisgICAgICAgICAgICBwZXJzcGVjdGl2ZVZhbHVlID0gcHJpbWl0aXZl
VmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVl
LT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0
eSwgdHJlYXQgdmFsdWVsZXNzIG51bWJlcnMgYXMgcHguCisgICAgICAgICAgICBwZXJzcGVjdGl2
ZVZhbHVlID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKSwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19QWCktPmNvbXB1dGVMZW5ndGg8Zmxv
YXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChwZXJz
cGVjdGl2ZVZhbHVlID49IDAuMGYpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJz
cGVjdGl2ZShwZXJzcGVjdGl2ZVZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBF
TkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUYXBIaWdobGln
aHRDb2xvcjogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0YXBIaWdobGln
aHRDb2xvciwgVGFwSGlnaGxpZ2h0Q29sb3IpOworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVl
KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ29sb3IgY29sID0gY29sb3JGcm9tUHJp
bWl0aXZlVmFsdWUocHJpbWl0aXZlVmFsdWUpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRU
YXBIaWdobGlnaHRDb2xvcihjb2wpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisj
aWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwodXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZywgVXNlVG91Y2hPdmVyZmxvd1Nj
cm9sbGluZyk7CisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyhw
cmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVRvdWNoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlJbnZhbGlkOgorICAgICAg
ICByZXR1cm47CisgICAgLy8gRGlyZWN0aW9uYWwgcHJvcGVydGllcyBhcmUgcmVzb2x2ZWQgYnkg
cmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoKSBiZWZvcmUgdGhlIHN3aXRjaC4KKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckVuZFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJF
bmRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRTdHlsZToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQmVmb3JlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9y
ZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVXaWR0aDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQWZ0ZXJXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luRW5kOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5TdGFydDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFyZ2luQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5B
ZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlQ29sbGFwc2U6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpblRvcENvbGxhcHNlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJnaW5BZnRlckNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRNYXJnaW5Cb3R0b21Db2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFk
ZGluZ0VuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ1N0YXJ0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRQYWRkaW5nQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxXaWR0
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9naWNhbEhlaWdodDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWluTG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNaW5Mb2dpY2FsSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2Fs
V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1heExvZ2ljYWxIZWlnaHQ6CisgICAg
eworICAgICAgICBDU1NQcm9wZXJ0eUlEIG5ld0lkID0gQ1NTUHJvcGVydHk6OnJlc29sdmVEaXJl
Y3Rpb25Bd2FyZVByb3BlcnR5KGlkLCBzdGF0ZS5zdHlsZSgpLT5kaXJlY3Rpb24oKSwgc3RhdGUu
c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7CisgICAgICAgIEFTU0VSVChuZXdJZCAhPSBpZCk7Cisg
ICAgICAgIHJldHVybiBhcHBseVByb3BlcnR5KG5ld0lkLCB2YWx1ZSk7CisgICAgfQorICAgIGNh
c2UgQ1NTUHJvcGVydHlGb250U3RyZXRjaDoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0TGluZVRocm91Z2hDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdo
TW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0T3ZlcmxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZUNvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0T3ZlcmxpbmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lV2lkdGg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRVbmRlcmxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZU1v
ZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dFVuZGVybGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRG
b250U2l6ZURlbHRhOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJ
bkVmZmVjdDoKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ1NTIFRleHQgTGF5b3V0IE1vZHVs
ZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0aW5nIHN1cHBvcnQKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0V3JpdGluZ01vZGU6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwo
d3JpdGluZ01vZGUsIFdyaXRpbmdNb2RlKTsKKyAgICAgICAgCisgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZSkKKyAgICAgICAgICAgIHNldFdyaXRpbmdNb2RlKCpwcmltaXRpdmVWYWx1ZSk7CisK
KyAgICAgICAgLy8gRklYTUU6IEl0IGlzIG5vdCBvayB0byBtb2RpZnkgZG9jdW1lbnQgc3RhdGUg
d2hpbGUgYXBwbHlpbmcgc3R5bGUuCisgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgJiYgc3Rh
dGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKQorICAg
ICAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxl
bWVudCh0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUZXh0T3JpZW50YXRpb246IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwodGV4dE9yaWVudGF0aW9uLCBUZXh0T3JpZW50YXRpb24pOworCisgICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHNldFRleHRPcmllbnRhdGlvbigqcHJpbWl0aXZl
VmFsdWUpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZUJveENvbnRhaW46IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJ
QUwobGluZUJveENvbnRhaW4sIExpbmVCb3hDb250YWluKQorICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Cisg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFpbihMaW5lQm94Q29udGFp
bk5vbmUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2
YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFpblZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgQ1NTTGluZUJveENvbnRhaW5WYWx1ZSogbGluZUJveENvbnRhaW5WYWx1ZSA9IHN0
YXRpY19jYXN0PENTU0xpbmVCb3hDb250YWluVmFsdWUqPih2YWx1ZSk7CisgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldExpbmVCb3hDb250YWluKGxpbmVCb3hDb250YWluVmFsdWUtPnZhbHVlKCkp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ1NTIEZvbnRzIE1vZHVsZSBMZXZl
bCAzCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRGZWF0dXJlU2V0dGluZ3M6IHsKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09
IENTU1ZhbHVlTm9ybWFsKSB7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oc3RhdGUu
c3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkubWFrZU5vcm1hbEZlYXR1cmVTZXR0aW5ncygpKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlz
VmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRm9udERlc2NyaXB0
aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwor
ICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2
YWx1ZSk7CisgICAgICAgIFJlZlB0cjxGb250RmVhdHVyZVNldHRpbmdzPiBzZXR0aW5ncyA9IEZv
bnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0ZSgpOworICAgICAgICBpbnQgbGVuID0gbGlzdC0+bGVu
Z3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAg
ICAgIENTU1ZhbHVlKiBpdGVtID0gbGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAg
ICAgICAgICAgIGlmICghaXRlbS0+aXNGb250RmVhdHVyZVZhbHVlKCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICBGb250RmVhdHVyZVZhbHVlKiBmZWF0dXJlID0gc3Rh
dGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1ZSo+KGl0ZW0pOworICAgICAgICAgICAgc2V0dGluZ3Mt
PmFwcGVuZChGb250RmVhdHVyZShmZWF0dXJlLT50YWcoKSwgZmVhdHVyZS0+dmFsdWUoKSkpOwor
ICAgICAgICB9CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGZWF0dXJlU2V0dGluZ3Moc2V0
dGluZ3MucmVsZWFzZSgpKTsKKyAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMp
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZpbHRlcjogeworICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTChmaWx0ZXIsIEZpbHRlcik7CisgICAgICAgIEZpbHRlck9wZXJhdGlv
bnMgb3BlcmF0aW9uczsKKyAgICAgICAgaWYgKGNyZWF0ZUZpbHRlck9wZXJhdGlvbnModmFsdWUs
IHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucykpCisg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRGaWx0ZXIob3BlcmF0aW9ucyk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENv
bHVtbnM6IHsKKyAgICAgICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7CisgICAg
ICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkQ29sdW1u
cyh0cmFja1NpemVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0R3JpZFJvd3M6IHsKKyAgICAgICAgVmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNr
U2l6ZXM7CisgICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXpl
cywgc3RhdGUpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRHcmlkUm93cyh0cmFja1NpemVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkU3RhcnQ6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIHN0
YXJ0UG9zaXRpb247CisgICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBzdGFy
dFBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0R3JpZEl0ZW1TdGFydChzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEVuZDogeworICAgICAgICBHcmlkUG9zaXRp
b24gZW5kUG9zaXRpb247CisgICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBl
bmRQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldEdyaWRJdGVtRW5kKGVuZFBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQmVmb3JlOiB7CisgICAgICAgIEdyaWRQb3Np
dGlvbiBiZWZvcmVQb3NpdGlvbjsKKyAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFs
dWUsIGJlZm9yZVBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0R3JpZEl0ZW1CZWZvcmUoYmVmb3JlUG9zaXRpb24pOworICAgICAgICByZXR1
cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQWZ0ZXI6IHsKKyAgICAg
ICAgR3JpZFBvc2l0aW9uIGFmdGVyUG9zaXRpb247CisgICAgICAgIGlmICghY3JlYXRlR3JpZFBv
c2l0aW9uKHZhbHVlLCBhZnRlclBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1BZnRlcihhZnRlclBvc2l0aW9uKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsaWFzZWQg
YW5kIFN0eWxlQnVpbGRlciBhbHJlYWR5IGFwcGxpZWQgdGhlIHByb3BlcnR5IG9uIHRoZSBwcmVm
aXhlZCB2ZXJzaW9uLgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uRGVsYXk6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25EdXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
VHJhbnNpdGlvblByb3BlcnR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uVGltaW5n
RnVuY3Rpb246CisgICAgICAgIHJldHVybjsKKyAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBp
bXBsZW1lbnRlZCBpbiB0aGUgU3R5bGVCdWlsZGVyIGxvb2t1cCB0YWJsZS4KKyAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dy
b3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFJlcGVhdFg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBl
YXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRv
bUxlZnRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVJpZ2h0UmFkaXVz
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21TdHlsZToKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyQm90dG9tV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbGxh
cHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZU91dHNldDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlU2xpY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJMZWZ0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRTdHlsZToKKyAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJSaWdodENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJUb3BDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wTGVmdFJhZGl1czoK
KyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wUmlnaHRSYWRpdXM6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclRvcFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BXaWR0
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hT
aXppbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNhcHRpb25TaWRlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlDbGVhcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2xpcDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvdW50ZXJJbmNyZW1lbnQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUNvdW50ZXJSZXNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q3Vyc29yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlEaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eURpc3Bs
YXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUVtcHR5Q2VsbHM6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUZsb2F0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250VmFyaWFudDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5Rm9udFdlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5SGVpZ2h0OgorI2lm
IEVOQUJMRShDU1NfSU1BR0VfT1JJRU5UQVRJT04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdl
T3JpZW50YXRpb246CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZW5kZXJpbmc6
CisjaWYgRU5BQkxFKENTU19JTUFHRV9SRVNPTFVUSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJ
bWFnZVJlc29sdXRpb246CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5TGVmdDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5TGV0dGVyU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGluZUhl
aWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUxpc3RTdHlsZVBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVU
eXBlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5Cb3R0b206CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eU1hcmdpbkxlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblJpZ2h0OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlNYXJnaW5Ub3A6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heEhlaWdodDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5TWF4V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1pbkhl
aWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWluV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU9wYWNpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9ycGhhbnM6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eU91dGxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZU9mZnNldDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93V3JhcDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5T3ZlcmZsb3dYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1k6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRp
bmdMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nUmlnaHQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVBhZGRpbmdUb3A6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVBhZ2VCcmVha0luc2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5UG9pbnRlckV2ZW50czoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5UG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5UmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVNwZWFrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJsZUxheW91dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4
dEFsaWduOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dEluZGVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJmbG93Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0UmVuZGVyaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0VHJhbnNmb3JtOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUb3A6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVVuaWNvZGVCaWRpOgorI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGNhc2UgQ1NT
UHJvcGVydHlWYXJpYWJsZToKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFs
aWduOgorICAgIGNhc2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRBbmltYXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0
aW9uRGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRmlsbE1vZGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBbmltYXRpb25OYW1lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bmltYXRpb25QbGF5U3RhdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRp
bWluZ0Z1bmN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBlYXJhbmNlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBc3BlY3RSYXRpbzoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNr
Z3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckZpdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRh
bFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckltYWdlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJWZXJ0aWNhbFNwYWNpbmc6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveEFsaWduOgorI2lmIEVOQUJMRShDU1NfQk9YX0RFQ09SQVRJT05fQlJF
QUspCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERlY29yYXRpb25CcmVhazoKKyNlbmRp
ZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hEaXJlY3Rpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveEZsZXg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEZsZXhH
cm91cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94TGluZXM6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJveE9yZGluYWxHcm91cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm94T3JpZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hQYWNrOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2xvckNvcnJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtbkF4aXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrQWZ0
ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrQmVmb3JlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0luc2lkZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uQ291bnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkdh
cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUHJvZ3Jlc3Npb246CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Q29sdW1uUnVsZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5S
dWxlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblNwYW46CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbldpZHRoOgorI2lmIEVOQUJMRShDVVJTT1JfVklTSUJJ
TElUWSkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q3Vyc29yVmlzaWJpbGl0eToKKyNlbmRp
ZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnbkNvbnRlbnQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEFsaWduSXRlbXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWdu
U2VsZjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEJhc2lzOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRGbGV4RGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRG
bGV4R3JvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFNocmluazoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0RmxleFdyYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1
c3RpZnlDb250ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPcmRlcjoKKyNpZiBFTkFC
TEUoQ1NTX1JFR0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93SW50bzoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRGb250S2VybmluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNt
b290aGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEhpZ2hsaWdodDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0SHlwaGVuYXRlQ2hhcmFjdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRI
eXBoZW5hdGVMaW1pdEFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVM
aW1pdEJlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5l
czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuczoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TGluZUFsaWduOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVDbGFtcDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TGluZUdyaWQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlRGlyZWN0aW9uOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJxdWVlU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tCb3hJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VSZXBlYXQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tCb3hJbWFnZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NvbXBvc2l0ZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza0ltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2lu
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb25YOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb25ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdFk6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXROYnNwTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW46
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luWDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW5ZOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRQcmludENvbG9yQWRqdXN0OgorI2lmIEVOQUJMRShDU1NfUkVHSU9OUykKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UmVnaW9uQnJlYWtCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJl
Z2lvbkJyZWFrSW5zaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25PdmVyZmxv
dzoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdGxPcmRlcmluZzoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0UnVieVBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0Q29tYmluZToKKyNpZiBFTkFCTEUoQ1NTM19URVhUKQorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbkxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRleHREZWNvcmF0aW9uU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRBbGln
bkxhc3Q6CisjZW5kaWYgLy8gQ1NTM19URVhUCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRFbXBoYXNpc0NvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNQ
b3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzU3R5bGU6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRTZWN1cml0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0
cm9rZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5YOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5ZOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5aOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRUcmFuc2Zvcm1TdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkRl
bGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uRHVyYXRpb246CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25Qcm9wZXJ0eToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRVc2VyRHJhZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlck1vZGlmeToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlclNlbGVjdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q2xpcFBhdGg6CisjaWYgRU5BQkxFKENTU19FWENMVVNJT05TKQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRXcmFwRmxvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hh
cGVNYXJnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlUGFkZGluZzoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcFRocm91Z2g6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFNoYXBlSW5zaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZU91dHNpZGU6
CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2lkb3dzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaWR0aDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V29yZEJyZWFrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkU3BhY2luZzoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V29yZFdyYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVpJbmRleDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Wm9vbToKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9O
KQorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhab29tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5a
b29tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcmllbnRhdGlvbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VXNlclpvb206CisjZW5kaWYKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorI2lmIEVOQUJMRShTVkcpCisgICAgICAgIC8vIFRy
eSB0aGUgU1ZHIHByb3BlcnRpZXMKKyAgICAgICAgYXBwbHlTVkdQcm9wZXJ0eShpZCwgdmFsdWUp
OworI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8U3R5bGVJ
bWFnZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVJbWFnZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBD
U1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHZhbHVlLT5pc0ltYWdlVmFsdWUoKSkKKyAgICAg
ICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8
Q1NTSW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisKKyAgICBpZiAodmFsdWUtPmlzSW1hZ2VHZW5lcmF0
b3JWYWx1ZSgpKSB7CisgICAgICAgIGlmICh2YWx1ZS0+aXNHcmFkaWVudFZhbHVlKCkpCisgICAg
ICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0
aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4odmFsdWUpLT5ncmFkaWVudFdpdGhTdHlsZXNSZXNv
bHZlZCh0aGlzKS5nZXQoKSk7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9t
VmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqPih2YWx1
ZSkpOworICAgIH0KKworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIGlmICh2YWx1ZS0+
aXNJbWFnZVNldFZhbHVlKCkpCisgICAgICAgIHJldHVybiBzZXRPclBlbmRpbmdGcm9tVmFsdWUo
cHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlU2V0VmFsdWUqPih2YWx1ZSkpOworI2VuZGlm
CisKKyAgICBpZiAodmFsdWUtPmlzQ3Vyc29ySW1hZ2VWYWx1ZSgpKQorICAgICAgICByZXR1cm4g
Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NDdXJzb3JJ
bWFnZVZhbHVlKj4odmFsdWUpKTsKKworICAgIHJldHVybiAwOworfQorCitQYXNzUmVmUHRyPFN0
eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9w
ZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVZhbHVlKiB2YWx1ZSkKK3sKKyAgICBSZWZQdHI8U3R5
bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2UoKTsKKyAgICBpZiAo
aW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGlu
Z0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFn
ZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6
Z2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0lt
YWdlR2VuZXJhdG9yVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZS0+aXNQZW5kaW5nKCkp
IHsKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5
LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBTdHlsZVBlbmRpbmdJbWFnZTo6Y3JlYXRlKHZhbHVl
KTsKKyAgICB9CisgICAgcmV0dXJuIFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7
Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4g
U3R5bGVSZXNvbHZlcjo6c2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVy
dHksIENTU0ltYWdlU2V0VmFsdWUqIHZhbHVlKQoreworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBp
bWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZVNldChkb2N1bWVudCgpKTsKKyAgICBp
ZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVu
ZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBp
bWFnZS5yZWxlYXNlKCk7Cit9CisjZW5kaWYKKworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHls
ZVJlc29sdmVyOjpjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0
eSwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogdmFsdWUpCit7CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+
IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlKGRvY3VtZW50KCkpOworICAgIGlm
IChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgbV9zdGF0ZS5wZW5k
aW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7CisgICAgcmV0dXJuIGlt
YWdlLnJlbGVhc2UoKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0Zvclpvb21DaGFu
Z2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAg
aWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgPT0gcGFyZW50U3R5bGUtPmVmZmVjdGl2ZVpvb20o
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZv
bnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgRm9udERlc2NyaXB0aW9uIG5ld0Zv
bnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOworICAgIHNldEZvbnRTaXplKG5ld0ZvbnREZXNjcmlw
dGlvbiwgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSk7CisgICAgc3R5bGUtPnNldEZvbnREZXNj
cmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNo
ZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSkKK3sKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9
IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKworICAgIGlmIChjaGlsZEZvbnQuaXNBYnNvbHV0
ZVNpemUoKSB8fCAhcGFyZW50U3R5bGUpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udCA9IHBhcmVudFN0eWxlLT5mb250RGVzY3JpcHRpb24o
KTsKKyAgICBpZiAoY2hpbGRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA9PSBwYXJlbnRGb250
LnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRm9yIG5v
dywgbHVtcCBhbGwgZmFtaWxpZXMgYnV0IG1vbm9zcGFjZSB0b2dldGhlci4KKyAgICBpZiAoY2hp
bGRGb250LmdlbmVyaWNGYW1pbHkoKSAhPSBGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWls
eQorICAgICAgICAmJiBwYXJlbnRGb250LmdlbmVyaWNGYW1pbHkoKSAhPSBGb250RGVzY3JpcHRp
b246Ok1vbm9zcGFjZUZhbWlseSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2Uga25vdyB0
aGUgcGFyZW50IGlzIG1vbm9zcGFjZSBvciB0aGUgY2hpbGQgaXMgbW9ub3NwYWNlLCBhbmQgdGhh
dCBmb250CisgICAgLy8gc2l6ZSB3YXMgdW5zcGVjaWZpZWQuIFdlIHdhbnQgdG8gc2NhbGUgb3Vy
IGZvbnQgc2l6ZSBhcyBhcHByb3ByaWF0ZS4KKyAgICAvLyBJZiB0aGUgZm9udCB1c2VzIGEga2V5
d29yZCBzaXplLCB0aGVuIHdlIHJlZmV0Y2ggZnJvbSB0aGUgdGFibGUgcmF0aGVyIHRoYW4KKyAg
ICAvLyBtdWx0aXBseWluZyBieSBvdXIgc2NhbGUgZmFjdG9yLgorICAgIGZsb2F0IHNpemU7Cisg
ICAgaWYgKGNoaWxkRm9udC5rZXl3b3JkU2l6ZSgpKQorICAgICAgICBzaXplID0gZm9udFNpemVG
b3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGNoaWxkRm9udC5rZXl3b3Jk
U2l6ZSgpIC0gMSwgY2hpbGRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSk7CisgICAgZWxzZSB7
CisgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAg
ICAgZmxvYXQgZml4ZWRTY2FsZUZhY3RvciA9IChzZXR0aW5ncyAmJiBzZXR0aW5ncy0+ZGVmYXVs
dEZpeGVkRm9udFNpemUoKSAmJiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCkpCisgICAgICAg
ICAgICA/IHN0YXRpY19jYXN0PGZsb2F0PihzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUo
KSkgLyBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCkKKyAgICAgICAgICAgIDogMTsKKyAgICAg
ICAgc2l6ZSA9IHBhcmVudEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpID8KKyAgICAgICAgICAg
ICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgpIC8gZml4ZWRTY2FsZUZhY3RvciA6CisgICAg
ICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAqIGZpeGVkU2NhbGVGYWN0b3I7
CisgICAgfQorCisgICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihjaGlsZEZv
bnQpOworICAgIHNldEZvbnRTaXplKG5ld0ZvbnREZXNjcmlwdGlvbiwgc2l6ZSk7CisgICAgc3R5
bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0
eWxlUmVzb2x2ZXI6OmluaXRpYWxpemVGb250U3R5bGUoU2V0dGluZ3MqIHNldHRpbmdzKQorewor
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWlseSk7CisgICAg
Zm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdN
b2RlKCkpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudCgp
LT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQo
KSk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBzdGFuZGFyZEZvbnRGYW1pbHkgPSBkb2N1bWVu
dFNldHRpbmdzKCktPnN0YW5kYXJkRm9udEZhbWlseSgpOworICAgIGlmICghc3RhbmRhcmRGb250
RmFtaWx5LmlzRW1wdHkoKSkgeworICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHko
KS5zZXRGYW1pbHkoc3RhbmRhcmRGb250RmFtaWx5KTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9u
LmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5KDApOworICAgIH0KKyAgICBmb250RGVzY3JpcHRp
b24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRpdW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsK
KyAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1
bWVudCgpLCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpKTsKKyAgICBtX3N0YXRlLnN0eWxlKCktPnNl
dExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworICAgIG1fc3Rh
dGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnNldEZvbnRTaXplKEZvbnREZXNj
cmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9hdCBzaXplKQoreworICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21w
dXRlZFNpemUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQoKSwgbV9z
dGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNl
U1ZHWm9vbVJ1bGVzKCkpKTsKK30KKworZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRT
aXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBSZW5kZXJTdHlsZSogc3R5
bGUsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZH
Wm9vbVJ1bGVzKQoreworICAgIGZsb2F0IHpvb21GYWN0b3IgPSAxLjBmOworICAgIGlmICghdXNl
U1ZHWm9vbVJ1bGVzKSB7CisgICAgICAgIHpvb21GYWN0b3IgPSBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpOworICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCkpCisgICAg
ICAgICAgICB6b29tRmFjdG9yICo9IGZyYW1lLT50ZXh0Wm9vbUZhY3RvcigpOworICAgIH0KKwor
ICAgIHJldHVybiBTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6
ZShkb2N1bWVudCwgem9vbUZhY3RvciwgaXNBYnNvbHV0ZVNpemUsIHNwZWNpZmllZFNpemUpOwor
fQorCitmbG9hdCBTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6
ZShEb2N1bWVudCogZG9jdW1lbnQsIGZsb2F0IHpvb21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNp
emUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVTbWFydE1pbmltdW1Gb3JGb250U2l6ZSB1c2VTbWFy
dE1pbmltdW1Gb3JGb250U2l6ZSkKK3sKKyAgICAvLyBUZXh0IHdpdGggYSAwcHggZm9udCBzaXpl
IHNob3VsZCBub3QgYmUgdmlzaWJsZSBhbmQgdGhlcmVmb3JlIG5lZWRzIHRvIGJlCisgICAgLy8g
ZXhlbXB0IGZyb20gbWluaW11bSBmb250IHNpemUgcnVsZXMuIEFjaWQzIHJlbGllcyBvbiB0aGlz
IGZvciBwaXhlbC1wZXJmZWN0CisgICAgLy8gcmVuZGVyaW5nLiBUaGlzIGlzIGFsc28gY29tcGF0
aWJsZSB3aXRoIG90aGVyIGJyb3dzZXJzIHRoYXQgaGF2ZSBtaW5pbXVtCisgICAgLy8gZm9udCBz
aXplIHNldHRpbmdzIChlLmcuIEZpcmVmb3gpLgorICAgIGlmIChmYWJzZihzcGVjaWZpZWRTaXpl
KSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkpCisgICAgICAgIHJldHVy
biAwLjBmOworCisgICAgLy8gV2Ugc3VwcG9ydCB0d28gdHlwZXMgb2YgbWluaW11bSBmb250IHNp
emUuIFRoZSBmaXJzdCBpcyBhIGhhcmQgb3ZlcnJpZGUgdGhhdCBhcHBsaWVzIHRvCisgICAgLy8g
YWxsIGZvbnRzLiBUaGlzIGlzICJtaW5TaXplLiIgVGhlIHNlY29uZCB0eXBlIG9mIG1pbmltdW0g
Zm9udCBzaXplIGlzIGEgInNtYXJ0IG1pbmltdW0iCisgICAgLy8gdGhhdCBpcyBhcHBsaWVkIG9u
bHkgd2hlbiB0aGUgV2ViIHBhZ2UgY2FuJ3Qga25vdyB3aGF0IHNpemUgaXQgcmVhbGx5IGFza2Vk
IGZvciwgZS5nLiwKKyAgICAvLyB3aGVuIGl0IHVzZXMgbG9naWNhbCBzaXplcyBsaWtlICJzbWFs
bCIgb3IgZXhwcmVzc2VzIHRoZSBmb250LXNpemUgYXMgYSBwZXJjZW50YWdlIG9mCisgICAgLy8g
dGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgc2V0dGluZy4KKworICAgIC8vIFdpdGggdGhlIHNtYXJ0
IG1pbmltdW0sIHdlIG5ldmVyIHdhbnQgdG8gZ2V0IHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBm
b250IHNpemUgdG8ga2VlcCBmb250cyByZWFkYWJsZS4KKyAgICAvLyBIb3dldmVyIHdlIGFsd2F5
cyBhbGxvdyB0aGUgcGFnZSB0byBzZXQgYW4gZXhwbGljaXQgcGl4ZWwgc2l6ZSB0aGF0IGlzIHNt
YWxsZXIsCisgICAgLy8gc2luY2Ugc2l0ZXMgd2lsbCBtaXMtcmVuZGVyIG90aGVyd2lzZSAoZS5n
LiwgaHR0cDovL3d3dy5nYW1lc3BvdC5jb20gd2l0aCBhIDlweCBtaW5pbXVtKS4KKworICAgIFNl
dHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0dGlu
Z3MpCisgICAgICAgIHJldHVybiAxLjBmOworCisgICAgaW50IG1pblNpemUgPSBzZXR0aW5ncy0+
bWluaW11bUZvbnRTaXplKCk7CisgICAgaW50IG1pbkxvZ2ljYWxTaXplID0gc2V0dGluZ3MtPm1p
bmltdW1Mb2dpY2FsRm9udFNpemUoKTsKKyAgICBmbG9hdCB6b29tZWRTaXplID0gc3BlY2lmaWVk
U2l6ZSAqIHpvb21GYWN0b3I7CisKKyAgICAvLyBBcHBseSB0aGUgaGFyZCBtaW5pbXVtIGZpcnN0
LiBXZSBvbmx5IGFwcGx5IHRoZSBoYXJkIG1pbmltdW0gaWYgYWZ0ZXIgem9vbWluZyB3ZSdyZSBz
dGlsbCB0b28gc21hbGwuCisgICAgaWYgKHpvb21lZFNpemUgPCBtaW5TaXplKQorICAgICAgICB6
b29tZWRTaXplID0gbWluU2l6ZTsKKworICAgIC8vIE5vdyBhcHBseSB0aGUgInNtYXJ0IG1pbmlt
dW0uIiBUaGlzIG1pbmltdW0gaXMgYWxzbyBvbmx5IGFwcGxpZWQgaWYgd2UncmUgc3RpbGwgdG9v
IHNtYWxsCisgICAgLy8gYWZ0ZXIgem9vbWluZy4gVGhlIGZvbnQgc2l6ZSBtdXN0IGVpdGhlciBi
ZSByZWxhdGl2ZSB0byB0aGUgdXNlciBkZWZhdWx0IG9yIHRoZSBvcmlnaW5hbCBzaXplCisgICAg
Ly8gbXVzdCBoYXZlIGJlZW4gYWNjZXB0YWJsZS4gSW4gb3RoZXIgd29yZHMsIHdlIG9ubHkgYXBw
bHkgdGhlIHNtYXJ0IG1pbmltdW0gd2hlbmV2ZXIgd2UncmUgcG9zaXRpdmUKKyAgICAvLyBkb2lu
ZyBzbyB3b24ndCBkaXNydXB0IHRoZSBsYXlvdXQuCisgICAgaWYgKHVzZVNtYXJ0TWluaW11bUZv
ckZvbnRTaXplICYmIHpvb21lZFNpemUgPCBtaW5Mb2dpY2FsU2l6ZSAmJiAoc3BlY2lmaWVkU2l6
ZSA+PSBtaW5Mb2dpY2FsU2l6ZSB8fCAhaXNBYnNvbHV0ZVNpemUpKQorICAgICAgICB6b29tZWRT
aXplID0gbWluTG9naWNhbFNpemU7CisKKyAgICAvLyBBbHNvIGNsYW1wIHRvIGEgcmVhc29uYWJs
ZSBtYXhpbXVtIHRvIHByZXZlbnQgaW5zYW5lIGZvbnQgc2l6ZXMgZnJvbSBjYXVzaW5nIGNyYXNo
ZXMgb24gdmFyaW91cworICAgIC8vIHBsYXRmb3JtcyAoSSdtIGxvb2tpbmcgYXQgeW91LCBXaW5k
b3dzLikKKyAgICByZXR1cm4gbWluKG1heGltdW1BbGxvd2VkRm9udFNpemUsIHpvb21lZFNpemUp
OworfQorCitjb25zdCBpbnQgZm9udFNpemVUYWJsZU1heCA9IDE2OworY29uc3QgaW50IGZvbnRT
aXplVGFibGVNaW4gPSA5OworY29uc3QgaW50IHRvdGFsS2V5d29yZHMgPSA4OworCisvLyBXaW5J
RS9OYXY0IHRhYmxlIGZvciBmb250IHNpemVzLiBEZXNpZ25lZCB0byBtYXRjaCB0aGUgbGVnYWN5
IGZvbnQgbWFwcGluZyBzeXN0ZW0gb2YgSFRNTC4KK3N0YXRpYyBjb25zdCBpbnQgcXVpcmtzRm9u
dFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0gZm9udFNpemVUYWJsZU1pbiArIDFdW3RvdGFs
S2V5d29yZHNdID0KK3sKKyAgICAgIHsgOSwgICAgOSwgICAgIDksICAgICA5LCAgICAxMSwgICAg
MTQsICAgIDE4LCAgICAyOCB9LAorICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTAsICAgIDEy
LCAgICAxNSwgICAgMjAsICAgIDMxIH0sCisgICAgICB7IDksICAgIDksICAgICA5LCAgICAxMSwg
ICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzQgfSwKKyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAg
IDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAzNyB9LAorICAgICAgeyA5LCAgICA5LCAgICAx
MCwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYsICAgIDQwIH0sIC8vIGZpeGVkIGZvbnQgZGVm
YXVsdCAoMTMpCisgICAgICB7IDksICAgIDksICAgIDExLCAgICAxNCwgICAgMTcsICAgIDIxLCAg
ICAyOCwgICAgNDIgfSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDE1LCAgICAxNywgICAg
MjMsICAgIDMwLCAgICA0NSB9LAorICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTYsICAgIDE4
LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJvcG9ydGlvbmFsIGZvbnQgZGVmYXVsdCAoMTYp
Cit9OworLy8gSFRNTCAgICAgICAxICAgICAgMiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYg
ICAgICA3CisvLyBDU1MgIHh4cyAgIHhzICAgICBzICAgICAgbSAgICAgIGwgICAgIHhsICAgICB4
eGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyAgICAgICAgICAgICAgICAgICAg
ICB1c2VyIHByZWYKKworLy8gU3RyaWN0IG1vZGUgdGFibGUgbWF0Y2hlcyBNYWNJRSBhbmQgTW96
aWxsYSdzIHNldHRpbmdzIGV4YWN0bHkuCitzdGF0aWMgY29uc3QgaW50IHN0cmljdEZvbnRTaXpl
VGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdv
cmRzXSA9Cit7CisgICAgICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAg
ICAxOCwgICAgMjcgfSwKKyAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAg
MTUsICAgIDIwLCAgICAzMCB9LAorICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTEsICAgIDEz
LCAgICAxNywgICAgMjIsICAgIDMzIH0sCisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwg
ICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzYgfSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTIsICAg
IDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICAzOSB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQg
KDEzKQorICAgICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgs
ICAgIDQyIH0sCisgICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNSwgICAgMTgsICAgIDIzLCAg
ICAzMCwgICAgNDUgfSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAg
MjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQorfTsK
Ky8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAg
NworLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCisv
LyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgdXNl
ciBwcmVmCisKKy8vIEZvciB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLCB3
ZSB1c2UgVG9kZCBGYWhybmVyJ3Mgc3VnZ2VzdGVkIHNjYWxlCisvLyBmYWN0b3JzIGZvciBlYWNo
IGtleXdvcmQgdmFsdWUuCitzdGF0aWMgY29uc3QgZmxvYXQgZm9udFNpemVGYWN0b3JzW3RvdGFs
S2V5d29yZHNdID0geyAwLjYwZiwgMC43NWYsIDAuODlmLCAxLjBmLCAxLjJmLCAxLjVmLCAyLjBm
LCAzLjBmIH07CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmZvbnRTaXplRm9yS2V5d29yZChEb2N1
bWVudCogZG9jdW1lbnQsIGludCBrZXl3b3JkLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNp
emUpCit7CisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7Cisg
ICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0dXJuIDEuMGY7CisKKyAgICBib29sIHF1aXJr
c01vZGUgPSBkb2N1bWVudC0+aW5RdWlya3NNb2RlKCk7CisgICAgaW50IG1lZGl1bVNpemUgPSBz
aG91bGRVc2VGaXhlZERlZmF1bHRTaXplID8gc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXpl
KCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCk7CisgICAgaWYgKG1lZGl1bVNpemUgPj0g
Zm9udFNpemVUYWJsZU1pbiAmJiBtZWRpdW1TaXplIDw9IGZvbnRTaXplVGFibGVNYXgpIHsKKyAg
ICAgICAgLy8gTG9vayB1cCB0aGUgZW50cnkgaW4gdGhlIHRhYmxlLgorICAgICAgICBpbnQgcm93
ID0gbWVkaXVtU2l6ZSAtIGZvbnRTaXplVGFibGVNaW47CisgICAgICAgIGludCBjb2wgPSAoa2V5
d29yZCAtIENTU1ZhbHVlWHhTbWFsbCk7CisgICAgICAgIHJldHVybiBxdWlya3NNb2RlID8gcXVp
cmtzRm9udFNpemVUYWJsZVtyb3ddW2NvbF0gOiBzdHJpY3RGb250U2l6ZVRhYmxlW3Jvd11bY29s
XTsKKyAgICB9CisKKyAgICAvLyBWYWx1ZSBpcyBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgdGFi
bGUuIEFwcGx5IHRoZSBzY2FsZSBmYWN0b3IgaW5zdGVhZC4KKyAgICBmbG9hdCBtaW5Mb2dpY2Fs
U2l6ZSA9IG1heChzZXR0aW5ncy0+bWluaW11bUxvZ2ljYWxGb250U2l6ZSgpLCAxKTsKKyAgICBy
ZXR1cm4gbWF4KGZvbnRTaXplRmFjdG9yc1trZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxsXSptZWRp
dW1TaXplLCBtaW5Mb2dpY2FsU2l6ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0
aWMgaW50IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemUoaW50IHBpeGVsRm9udFNpemUsIGNvbnN0
IFQqIHRhYmxlLCBpbnQgbXVsdGlwbGllcikKK3sKKyAgICAvLyBJZ25vcmUgdGFibGVbMF0gYmVj
YXVzZSB4eC1zbWFsbCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBsZWdhY3kgZm9udCBzaXpl
LgorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdG90YWxLZXl3b3JkcyAtIDE7IGkrKykgeworICAg
ICAgICBpZiAocGl4ZWxGb250U2l6ZSAqIDIgPCAodGFibGVbaV0gKyB0YWJsZVtpICsgMV0pICog
bXVsdGlwbGllcikKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gdG90
YWxLZXl3b3JkcyAtIDE7Cit9CisKK2ludCBTdHlsZVJlc29sdmVyOjpsZWdhY3lGb250U2l6ZShE
b2N1bWVudCogZG9jdW1lbnQsIGludCBwaXhlbEZvbnRTaXplLCBib29sIHNob3VsZFVzZUZpeGVk
RGVmYXVsdFNpemUpCit7CisgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRp
bmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBib29s
IHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5RdWlya3NNb2RlKCk7CisgICAgaW50IG1lZGl1bVNp
emUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplID8gc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZv
bnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCk7CisgICAgaWYgKG1lZGl1bVNp
emUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBtZWRpdW1TaXplIDw9IGZvbnRTaXplVGFibGVNYXgp
IHsKKyAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWluOworICAg
ICAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxpbnQ+KHBpeGVsRm9udFNpemUs
IHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRhYmxlW3Jvd10gOiBzdHJpY3RGb250U2l6ZVRh
YmxlW3Jvd10sIDEpOworICAgIH0KKworICAgIHJldHVybiBmaW5kTmVhcmVzdExlZ2FjeUZvbnRT
aXplPGZsb2F0PihwaXhlbEZvbnRTaXplLCBmb250U2l6ZUZhY3RvcnMsIG1lZGl1bVNpemUpOwor
fQorCitzdGF0aWMgQ29sb3IgY29sb3JGb3JDU1NWYWx1ZShpbnQgY3NzVmFsdWVJZCkKK3sKKyAg
ICBzdHJ1Y3QgQ29sb3JWYWx1ZSB7CisgICAgICAgIGludCBjc3NWYWx1ZUlkOworICAgICAgICBS
R0JBMzIgY29sb3I7CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBDb2xvclZhbHVlIGNvbG9y
VmFsdWVzW10gPSB7CisgICAgICAgIHsgQ1NTVmFsdWVBcXVhLCAweEZGMDBGRkZGIH0sCisgICAg
ICAgIHsgQ1NTVmFsdWVCbGFjaywgMHhGRjAwMDAwMCB9LAorICAgICAgICB7IENTU1ZhbHVlQmx1
ZSwgMHhGRjAwMDBGRiB9LAorICAgICAgICB7IENTU1ZhbHVlRnVjaHNpYSwgMHhGRkZGMDBGRiB9
LAorICAgICAgICB7IENTU1ZhbHVlR3JheSwgMHhGRjgwODA4MCB9LAorICAgICAgICB7IENTU1Zh
bHVlR3JlZW4sIDB4RkYwMDgwMDAgIH0sCisgICAgICAgIHsgQ1NTVmFsdWVHcmV5LCAweEZGODA4
MDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVMaW1lLCAweEZGMDBGRjAwIH0sCisgICAgICAgIHsg
Q1NTVmFsdWVNYXJvb24sIDB4RkY4MDAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU5hdnksIDB4
RkYwMDAwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU9saXZlLCAweEZGODA4MDAwICB9LAorICAg
ICAgICB7IENTU1ZhbHVlT3JhbmdlLCAweEZGRkZBNTAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVQ
dXJwbGUsIDB4RkY4MDAwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVJlZCwgMHhGRkZGMDAwMCB9
LAorICAgICAgICB7IENTU1ZhbHVlU2lsdmVyLCAweEZGQzBDMEMwIH0sCisgICAgICAgIHsgQ1NT
VmFsdWVUZWFsLCAweEZGMDA4MDgwICB9LAorICAgICAgICB7IENTU1ZhbHVlVHJhbnNwYXJlbnQs
IDB4MDAwMDAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVdoaXRlLCAweEZGRkZGRkZGIH0sCisg
ICAgICAgIHsgQ1NTVmFsdWVZZWxsb3csIDB4RkZGRkZGMDAgfSwKKyAgICAgICAgeyAwLCAwIH0K
KyAgICB9OworCisgICAgZm9yIChjb25zdCBDb2xvclZhbHVlKiBjb2wgPSBjb2xvclZhbHVlczsg
Y29sLT5jc3NWYWx1ZUlkOyArK2NvbCkgeworICAgICAgICBpZiAoY29sLT5jc3NWYWx1ZUlkID09
IGNzc1ZhbHVlSWQpCisgICAgICAgICAgICByZXR1cm4gY29sLT5jb2xvcjsKKyAgICB9CisgICAg
cmV0dXJuIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+c3lzdGVtQ29sb3IoY3NzVmFsdWVJ
ZCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWVJc0Rl
cml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUpCit7CisgICAgaW50IGlk
ZW50ID0gdmFsdWUtPmdldElkZW50KCk7CisgICAgc3dpdGNoIChpZGVudCkgeworICAgIGNhc2Ug
Q1NTVmFsdWVXZWJraXRUZXh0OgorICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRMaW5rOgorICAgIGNh
c2UgQ1NTVmFsdWVXZWJraXRBY3RpdmVsaW5rOgorICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29s
b3I6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9Cit9CisKK0NvbG9yIFN0eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2
ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiB2YWx1ZSwgYm9vbCBmb3JWaXNpdGVkTGluaykgY29u
c3QKK3sKKyAgICBpZiAodmFsdWUtPmlzUkdCQ29sb3IoKSkKKyAgICAgICAgcmV0dXJuIENvbG9y
KHZhbHVlLT5nZXRSR0JBMzJWYWx1ZSgpKTsKKworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7CisgICAgaW50IGlkZW50ID0gdmFsdWUtPmdldElkZW50KCk7CisgICAgc3dpdGNoIChp
ZGVudCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIENvbG9yKCk7CisgICAgY2FzZSBD
U1NWYWx1ZVdlYmtpdFRleHQ6CisgICAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudCgpLT50ZXh0
Q29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKKyAgICAgICAgcmV0dXJuIChz
dGF0ZS5lbGVtZW50KCktPmlzTGluaygpICYmIGZvclZpc2l0ZWRMaW5rKSA/IHN0YXRlLmRvY3Vt
ZW50KCktPnZpc2l0ZWRMaW5rQ29sb3IoKSA6IHN0YXRlLmRvY3VtZW50KCktPmxpbmtDb2xvcigp
OworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRBY3RpdmVsaW5rOgorICAgICAgICByZXR1cm4gc3Rh
dGUuZG9jdW1lbnQoKS0+YWN0aXZlTGlua0NvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dEZvY3VzUmluZ0NvbG9yOgorICAgICAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmZvY3VzUmluZ0Nv
bG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZUN1cnJlbnRjb2xvcjoKKyAgICAgICAgcmV0dXJuIHN0
YXRlLnN0eWxlKCktPmNvbG9yKCk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGNvbG9y
Rm9yQ1NTVmFsdWUoaWRlbnQpOworICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRW
aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCogZXhw
ciwgYm9vbCByZXN1bHQpCit7CisgICAgbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1
bHRzLmFwcGVuZChhZG9wdFB0cihuZXcgTWVkaWFRdWVyeVJlc3VsdCgqZXhwciwgcmVzdWx0KSkp
OworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmFmZmVjdGVkQnlWaWV3cG9ydENoYW5nZSgpIGNv
bnN0Cit7CisgICAgdW5zaWduZWQgcyA9IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVz
dWx0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHM7IGkrKykgeworICAg
ICAgICBpZiAobV9tZWRpdW0tPmV2YWwoJm1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVz
dWx0c1tpXS0+bV9leHByZXNzaW9uKSAhPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJl
c3VsdHNbaV0tPm1fcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIFRyYW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9u
VHlwZSBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2Zvcm1PcGVyYXRpb25UeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246IHJl
dHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJh
dGlvbjo6U0NBTEVfWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1k7Cisg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9aOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlNDQUxFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6
VFJBTlNMQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhU
cmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9Y
OworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9ZOworICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9aOworICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4g
VHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfM0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpST1RBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRl
WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1g7
CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1k7CisgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1o7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6Um90YXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRp
b246OlJPVEFURV8zRDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJh
bnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXOworICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRp
b246OlNLRVdfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXhUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWDsKKyAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYXzNEOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpQRVJTUEVDVElWRTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpVbmtub3duVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpOT05FOworICAgIH0KKyAgICByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOwor
fQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFs
dWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwg
VHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucykKK3sKKyAgICBpZiAoIWluVmFsdWUg
fHwgIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsKKyAgICAgICAgb3V0T3BlcmF0aW9ucy5jbGVh
cigpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmxvYXQgem9vbUZhY3Rv
ciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA6IDE7CisgICAgVHJhbnNmb3JtT3Bl
cmF0aW9ucyBvcGVyYXRpb25zOworICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IGlu
VmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICBDU1NWYWx1ZSogY3Vy
clZhbHVlID0gaS52YWx1ZSgpOworCisgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENT
U1RyYW5zZm9ybVZhbHVlKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZSogdHJhbnNmb3JtVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZSo+KGkudmFsdWUoKSk7CisgICAgICAgIGlmICghdHJhbnNmb3JtVmFs
dWUtPmxlbmd0aCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYm9vbCBoYXZl
Tm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsg
aiA8IHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKTsgKytqKSB7CisgICAgICAgICAgICBpZiAoIXRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVl
KCkpIHsKKyAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlm
IChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOworCisg
ICAgICAgIHN3aXRjaCAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgeworICAgICAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjoK
KyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3Bl
cmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFu
c2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBzeCA9IDEuMDsKKyAgICAgICAg
ICAgIGRvdWJsZSBzeSA9IDEuMDsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1P
cGVyYXRpb24pCisgICAgICAgICAgICAgICAgc3kgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3ggPSBmaXJzdFZhbHVl
LT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zv
cm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5s
ZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3Jt
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAg
ICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHN4OworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHN4LCBzeSwgMS4wLCBnZXRU
cmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAg
ICAgICAgIGRvdWJsZSBzeCA9IDEuMDsKKyAgICAgICAgICAgIGRvdWJsZSBzeSA9IDEuMDsKKyAg
ICAgICAgICAgIGRvdWJsZSBzeiA9IDEuMDsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFu
c2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgc3ogPSBmaXJzdFZhbHVlLT5nZXREb3Vi
bGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0
aW9uKQorICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0
RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3Bl
cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3Ro
KCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhp
cmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOworICAgICAgICAgICAgICAgICAgICAgICAgc3og
PSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFs
dWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFu
c2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIHN6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25U
eXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAg
ICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGgg
dHkgPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5v
cGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFu
c2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0
aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgICAgIHR4ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChzZWNvbmRW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0
eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQo
VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUodHgsIHR5LCBMZW5ndGgoMCwgRml4
ZWQpLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOgorICAg
ICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9w
ZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3RoIHR4ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAg
ICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBMZW5n
dGggdHogPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVl
LT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpU
cmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExl
bmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAg
ICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAg
ICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4
ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVy
YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGly
ZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eiA9
IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHRoaXJkVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21G
YWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUs
IHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHguaXNV
bmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpIHx8IHR6LmlzVW5kZWZpbmVkKCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJh
dGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUodHgsIHR5
LCB0eiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAg
ICAgICAgICBkb3VibGUgYW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAg
ICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKDAsIDAsIDEsIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVY
VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3Vi
bGUgeCA9IDA7CisgICAgICAgICAgICBkb3VibGUgeSA9IDA7CisgICAgICAgICAgICBkb3VibGUg
eiA9IDA7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVn
cmVlcygpOworCisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbikK
KyAgICAgICAgICAgICAgICB4ID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZh
bHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlU
cmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeSA9IDE7CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgeiA9IDE7CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJh
dGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwg
YW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNCkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJk
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiBmb3VydGhWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3Jt
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpOworICAgICAgICAgICAgZG91YmxlIHgg
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIHkgPSBz
ZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSB6ID0gdGhp
cmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZv
dXJ0aFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHos
IGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRp
b25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjoK
KyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVy
YXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZVggPSAwOworICAgICAgICAgICAgZG91
YmxlIGFuZ2xlWSA9IDA7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmaXJzdFZhbHVlLT5j
b21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRp
b25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0
aW9uKQorICAgICAgICAgICAgICAgIGFuZ2xlWSA9IGFuZ2xlOworICAgICAgICAgICAgZWxzZSB7
CisgICAgICAgICAgICAgICAgYW5nbGVYID0gYW5nbGU7CisgICAgICAgICAgICAgICAgaWYgKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5z
Zm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAg
ICAgICAgICAgICAgICAgYW5nbGVZID0gc2Vjb25kVmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2tld1RyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKGFuZ2xlWCwgYW5nbGVZLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXhU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVu
Z3RoKCkgPCA2KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZG91YmxlIGEg
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGIgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBj
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygyKSktPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3Vi
bGUgZCA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAg
ZG91YmxlIGUgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVl
KCk7CisgICAgICAgICAgICBkb3VibGUgZiA9IHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUp
KS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhLCBiLCBjLCBkLCBlLCBm
KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDE2KQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbWF0cml4KHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpLT5nZXREb3VibGVWYWx1
ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5n
ZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soNikpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3Jt
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNykpLT5nZXREb3VibGVWYWx1ZSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soOCkpLT5nZXREb3VibGVW
YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soOSkp
LT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMTApKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDExKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTIpKS0+Z2V0
RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9y
ICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxMykpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3Jt
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE1KSktPmdldERvdWJs
ZVZhbHVlKCkpOworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1h
dHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUobWF0cml4KSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQ
ZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3RoIHAgPSBM
ZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzTGVuZ3RoKCkp
CisgICAgICAgICAgICAgICAgcCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0
eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICAgICAgLy8gVGhpcyBpcyBhIHF1aXJrIHRoYXQgc2hvdWxkIGdvIGF3YXkgd2hlbiAzZCB0
cmFuc2Zvcm1zIGFyZSBmaW5hbGl6ZWQuCisgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IGZp
cnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgcCA9IHZhbCA+PSAw
ID8gTGVuZ3RoKGNsYW1wVG9Qb3NpdGl2ZUludGVnZXIodmFsKSwgRml4ZWQpIDogTGVuZ3RoKFVu
ZGVmaW5lZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwLmlzVW5kZWZpbmVk
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBvcGVyYXRp
b25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZShwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtub3duVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIH0KKworICAgIG91dE9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOworICAgIHJldHVybiB0
cnVlOworfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQorc3RhdGljIEZpbHRlck9wZXJhdGlv
bjo6T3BlcmF0aW9uVHlwZSBmaWx0ZXJPcGVyYXRpb25Gb3JUeXBlKFdlYktpdENTU0ZpbHRlclZh
bHVlOjpGaWx0ZXJPcGVyYXRpb25UeXBlIHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uOgor
ICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0U7CisgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6R3JheXNjYWxlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1
cm4gRmlsdGVyT3BlcmF0aW9uOjpHUkFZU0NBTEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRp
b246OlNFUElBOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNhdHVyYXRlRmlsdGVy
T3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTQVRVUkFURTsKKyAg
ICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpIdWVSb3RhdGVGaWx0ZXJPcGVyYXRpb246Cisg
ICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkhVRV9ST1RBVEU7CisgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4g
RmlsdGVyT3BlcmF0aW9uOjpJTlZFUlQ7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
T3BhY2l0eUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6
T1BBQ0lUWTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmlnaHRuZXNzRmlsdGVy
T3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpCUklHSFRORVNTOwor
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkNvbnRyYXN0RmlsdGVyT3BlcmF0aW9uOgor
ICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDT05UUkFTVDsKKyAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmls
dGVyT3BlcmF0aW9uOjpCTFVSOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BT
aGFkb3dGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkRS
T1BfU0hBRE9XOworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpDdXN0b21GaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OkNVU1RPTTsKKyNlbmRpZgorICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OlVua25vd25GaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246
Ok5PTkU7CisgICAgfQorICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok5PTkU7Cit9CisKKyNp
ZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OmxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIGlmICghc3RhdGUuc3R5bGUoKS0+aGFzRmlsdGVyKCkgfHwgc3RhdGUucGVuZGluZ1NW
R0RvY3VtZW50cygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ2FjaGVkUmVz
b3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0gc3RhdGUuZG9jdW1lbnQoKS0+Y2Fj
aGVkUmVzb3VyY2VMb2FkZXIoKTsKKyAgICBWZWN0b3I8UmVmUHRyPEZpbHRlck9wZXJhdGlvbj4g
PiYgZmlsdGVyT3BlcmF0aW9ucyA9IHN0YXRlLnN0eWxlKCktPm11dGFibGVGaWx0ZXIoKS5vcGVy
YXRpb25zKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpbHRlck9wZXJhdGlvbnMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gZmlsdGVyT3Bl
cmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5hdChpKTsKKyAgICAgICAgaWYgKGZpbHRlck9wZXJh
dGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7
CisgICAgICAgICAgICBSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24qIHJlZmVyZW5jZUZpbHRlciA9
IHN0YXRpY19jYXN0PFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbi5n
ZXQoKSk7CisKKyAgICAgICAgICAgIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWUqIHZhbHVlID0g
c3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmdldChyZWZlcmVuY2VGaWx0ZXIpLmdldCgpOwor
ICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIENhY2hlZFNWR0RvY3VtZW50KiBjYWNoZWREb2N1bWVudCA9IHZhbHVlLT5sb2FkKGNh
Y2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICAgICAgICAgIGlmICghY2FjaGVkRG9jdW1lbnQpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIFN0YXNoIHRoZSBDYWNo
ZWRTVkdEb2N1bWVudCBvbiB0aGUgcmVmZXJlbmNlIGZpbHRlci4KKyAgICAgICAgICAgIHJlZmVy
ZW5jZUZpbHRlci0+c2V0Q2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UoYWRvcHRQdHIobmV3IENh
Y2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGNhY2hlZERvY3VtZW50KSkpOworICAgICAgICB9Cisg
ICAgfQorICAgIHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5jbGVhcigpOworfQorI2VuZGlm
CisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCitTdHlsZVNoYWRlciogU3R5bGVSZXNvbHZlcjo6
c3R5bGVTaGFkZXIoQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZS0+aXNXZWJLaXRD
U1NTaGFkZXJWYWx1ZSgpKQorICAgICAgICByZXR1cm4gY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFk
ZXJGcm9tVmFsdWUoc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU2hhZGVyVmFsdWUqPih2YWx1ZSkpOwor
ICAgIHJldHVybiAwOworfQorCitTdHlsZVNoYWRlciogU3R5bGVSZXNvbHZlcjo6Y2FjaGVkT3JQ
ZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHZhbHVlKQor
eworICAgIFN0eWxlU2hhZGVyKiBzaGFkZXIgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nU2hhZGVy
KCk7CisgICAgaWYgKHNoYWRlciAmJiBzaGFkZXItPmlzUGVuZGluZ1NoYWRlcigpKQorICAgICAg
ICBtX3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJzKHRydWUpOworICAgIHJldHVybiBzaGFkZXI7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdTaGFkZXJzKCkKK3sKKyAgICBp
ZiAoIW1fc3RhdGUuc3R5bGUoKS0+aGFzRmlsdGVyKCkgfHwgIW1fc3RhdGUuaGFzUGVuZGluZ1No
YWRlcnMoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNh
Y2hlZFJlc291cmNlTG9hZGVyID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxv
YWRlcigpOworCisgICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9w
ZXJhdGlvbnMgPSBtX3N0YXRlLnN0eWxlKCktPm11dGFibGVGaWx0ZXIoKS5vcGVyYXRpb25zKCk7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpbHRlck9wZXJhdGlvbnMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgUmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gZmlsdGVyT3BlcmF0aW9uID0g
ZmlsdGVyT3BlcmF0aW9ucy5hdChpKTsKKyAgICAgICAgaWYgKGZpbHRlck9wZXJhdGlvbi0+Z2V0
T3BlcmF0aW9uVHlwZSgpID09IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NKSB7CisgICAgICAgICAg
ICBDdXN0b21GaWx0ZXJPcGVyYXRpb24qIGN1c3RvbUZpbHRlciA9IHN0YXRpY19jYXN0PEN1c3Rv
bUZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbi5nZXQoKSk7CisgICAgICAgICAgICBB
U1NFUlQoY3VzdG9tRmlsdGVyLT5wcm9ncmFtKCkpOworICAgICAgICAgICAgU3R5bGVDdXN0b21G
aWx0ZXJQcm9ncmFtKiBwcm9ncmFtID0gc3RhdGljX2Nhc3Q8U3R5bGVDdXN0b21GaWx0ZXJQcm9n
cmFtKj4oY3VzdG9tRmlsdGVyLT5wcm9ncmFtKCkpOworICAgICAgICAgICAgaWYgKHByb2dyYW0t
PnZlcnRleFNoYWRlcigpICYmIHByb2dyYW0tPnZlcnRleFNoYWRlcigpLT5pc1BlbmRpbmdTaGFk
ZXIoKSkgeworICAgICAgICAgICAgICAgIFdlYktpdENTU1NoYWRlclZhbHVlKiBzaGFkZXJWYWx1
ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRlcio+KHByb2dyYW0tPnZlcnRleFNoYWRl
cigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBwcm9ncmFtLT5zZXRWZXJ0
ZXhTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb2dyYW0tPmZyYWdtZW50U2hhZGVy
KCkgJiYgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKKyAg
ICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNf
Y2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpKS0+Y3Nz
U2hhZGVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBwcm9ncmFtLT5zZXRGcmFnbWVudFNoYWRl
cihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVyKGNhY2hlZFJlc291cmNlTG9hZGVyKSk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hh
ZGVycyhmYWxzZSk7Cit9CisKK3N0YXRpYyBib29sIHNvcnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFy
YXRvcihjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiYgYSwgY29uc3QgUmVmUHRy
PEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGIpCit7CisgICAgcmV0dXJuIGNvZGVQb2ludENvbXBh
cmVMZXNzVGhhbihhLT5uYW1lKCksIGItPm5hbWUoKSk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9t
RmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFy
YW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAg
UmVmUHRyPEN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyPiBhcnJheVBhcmFtZXRlciA9IEN1c3Rv
bUZpbHRlckFycmF5UGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMCwgbGVuZ3RoID0gdmFsdWVzLT5sZW5ndGgoKTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAg
ICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsK
KyAgICAgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhcnJheVBhcmFtZXRlci0+YWRkVmFsdWUo
cHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gYXJy
YXlQYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29u
c3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3Vz
dG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyPiBudW1iZXJQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJO
dW1iZXJQYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgdmFsdWVzLT5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZh
bHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNQ
cmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odmFsdWUpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAh
PSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICBudW1iZXJQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3Vi
bGVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bWJlclBhcmFtZXRlci5yZWxlYXNlKCk7
Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpw
YXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENT
U1ZhbHVlTGlzdCogdmFsdWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJUcmFuc2Zvcm1Q
YXJhbWV0ZXI+IHRyYW5zZm9ybVBhcmFtZXRlciA9IEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFt
ZXRlcjo6Y3JlYXRlKG5hbWUpOworICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsK
KyAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVlcywgbV9zdGF0ZS5zdHlsZSgpLCBt
X3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucyk7CisgICAgdHJhbnNmb3JtUGFy
YW1ldGVyLT5zZXRPcGVyYXRpb25zKG9wZXJhdGlvbnMpOworICAgIHJldHVybiB0cmFuc2Zvcm1Q
YXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRl
cj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBDU1NWYWx1ZSogcGFyYW1ldGVyVmFsdWUpCit7CisgICAgLy8gRklYTUU6IEltcGxl
bWVudCBvdGhlciBwYXJhbWV0ZXJzIHR5cGVzIHBhcnNpbmcuCisgICAgLy8gYm9vbGVhbnM6IGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQzOAorICAgIC8vIHRleHR1
cmVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NDIKKyAgICAv
LyBtYXQyLCBtYXQzLCBtYXQ0OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NzE0NDQKKyAgICAvLyBOdW1iZXIgcGFyYW1ldGVycyBhcmUgd3JhcHBlZCBpbnNpZGUgYSBD
U1NWYWx1ZUxpc3QgYW5kIGFsbAorICAgIC8vIHRoZSBvdGhlciBmdW5jdGlvbnMgdmFsdWVzIGlu
aGVyaXQgZnJvbSBDU1NWYWx1ZUxpc3QuCisgICAgaWYgKCFwYXJhbWV0ZXJWYWx1ZS0+aXNWYWx1
ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBDU1NWYWx1ZUxpc3QqIHZhbHVlcyA9
IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHBhcmFtZXRlclZhbHVlKTsKKyAgICBpZiAoIXZh
bHVlcy0+bGVuZ3RoKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHBhcmFtZXRlclZh
bHVlLT5pc1dlYktpdENTU0FycmF5RnVuY3Rpb25WYWx1ZSgpKQorICAgICAgICByZXR1cm4gcGFy
c2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOworCisgICAgLy8gSWYg
dGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBsaXN0IGlzIGEgdHJhbnNmb3JtIGZ1bmN0aW9uLAorICAg
IC8vIHRoZW4gd2UgY291bGQgc2FmZWx5IGFzc3VtZSB0aGF0IGFsbCB0aGUgcmVtYWluaW5nIGl0
ZW1zCisgICAgLy8gYXJlIHRyYW5zZm9ybXMuIHBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFy
YW1ldGVyIHdpbGwKKyAgICAvLyByZXR1cm4gMCBpZiB0aGF0IGFzc3VtcHRpb24gaXMgaW5jb3Jy
ZWN0LgorICAgIGlmICh2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyVHJh
bnNmb3JtUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7CisKKyAgICAvLyBXZSBjYW4gaGF2ZSBvbmx5
IGFycmF5cyBvZiBib29sZWFucyBvciBudW1iZXJzLCBzbyB1c2UgdGhlIGZpcnN0IHZhbHVlIHRv
IGNob29zZSBiZXR3ZWVuIHRob3NlIHR3by4KKyAgICAvLyBXZSBuZWVkIHVwIHRvIDQgdmFsdWVz
IChhbGwgYm9vbGVhbnMgb3IgYWxsIG51bWJlcnMpLgorICAgIGlmICghdmFsdWVzLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVlKCkgfHwgdmFsdWVzLT5sZW5ndGgo
KSA+IDQpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBm
aXJzdFByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1
ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOworICAgIGlmIChmaXJzdFByaW1pdGl2ZVZh
bHVlLT5wcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisg
ICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcihuYW1lLCB2YWx1
ZXMpOworCisgICAgLy8gRklYTUU6IEltcGxlbWVudCB0aGUgYm9vbGVhbiBhcnJheSBwYXJhbWV0
ZXIgaGVyZS4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
NzY0MzgKKworICAgIHJldHVybiAwOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3Vz
dG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NWYWx1ZSogcGFyYW1ldGVyc1ZhbHVlLCBDdXN0b21G
aWx0ZXJQYXJhbWV0ZXJMaXN0JiBwYXJhbWV0ZXJMaXN0KQoreworICAgIEhhc2hTZXQ8U3RyaW5n
PiBrbm93blBhcmFtZXRlck5hbWVzOworICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIHBhcmFtZXRl
ckl0ZXJhdG9yKHBhcmFtZXRlcnNWYWx1ZSk7CisgICAgZm9yICg7IHBhcmFtZXRlckl0ZXJhdG9y
Lmhhc01vcmUoKTsgcGFyYW1ldGVySXRlcmF0b3IuYWR2YW5jZSgpKSB7CisgICAgICAgIGlmICgh
cGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IocGFyYW1l
dGVySXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgIGlmICghaXRlcmF0b3IuaXNQcmltaXRpdmVW
YWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0
ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5
cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1NUUklORykKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBuYW1lID0gcHJpbWl0aXZlVmFsdWUt
PmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgIC8vIERvIG5vdCBhbGxvdyBkdXBsaWNhdGUgcGFy
YW1ldGVyIG5hbWVzLgorICAgICAgICBpZiAoa25vd25QYXJhbWV0ZXJOYW1lcy5jb250YWlucyhu
YW1lKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAga25vd25QYXJhbWV0ZXJO
YW1lcy5hZGQobmFtZSk7CisgICAgICAgIAorICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Cisg
ICAgICAgIAorICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc01vcmUoKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0
ZXI+IHBhcmFtZXRlciA9IHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKG5hbWUsIGl0ZXJhdG9y
LnZhbHVlKCkpOworICAgICAgICBpZiAoIXBhcmFtZXRlcikKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgcGFyYW1ldGVyTGlzdC5hcHBlbmQocGFyYW1ldGVyLnJlbGVhc2UoKSk7
CisgICAgfQorICAgIAorICAgIC8vIE1ha2Ugc3VyZSB3ZSBzb3J0IHRoZSBwYXJhbWV0ZXJzIGJl
Zm9yZSBwYXNzaW5nIHRoZW0gZG93biB0byB0aGUgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uLgorICAg
IHN0ZDo6c29ydChwYXJhbWV0ZXJMaXN0LmJlZ2luKCksIHBhcmFtZXRlckxpc3QuZW5kKCksIHNv
cnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRvcik7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVh
dGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KFdlYktpdENT
U0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHN0
eWxlIHJlc29sdXRpb24gZm9yIHRoZSBjdXN0b20gZmlsdGVyIGF0LXJ1bGUgcmVmZXJlbmNlIHN5
bnRheC4KKyAgICBVTlVTRURfUEFSQU0oZmlsdGVyVmFsdWUpOworICAgIHJldHVybiAwOworfQor
CitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRl
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1
ZSogZmlsdGVyVmFsdWUpCit7CisgICAgQ1NTVmFsdWUqIHNoYWRlcnNWYWx1ZSA9IGZpbHRlclZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZ
X0lNUExJQ0FUSU9OKHNoYWRlcnNWYWx1ZS0+aXNWYWx1ZUxpc3QoKSk7CisgICAgQ1NTVmFsdWVM
aXN0KiBzaGFkZXJzTGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHNoYWRlcnNWYWx1
ZSk7CisKKyAgICB1bnNpZ25lZCBzaGFkZXJzTGlzdExlbmd0aCA9IHNoYWRlcnNMaXN0LT5sZW5n
dGgoKTsKKyAgICBBU1NFUlQoc2hhZGVyc0xpc3RMZW5ndGgpOworCisgICAgUmVmUHRyPFN0eWxl
U2hhZGVyPiB2ZXJ0ZXhTaGFkZXIgPSBzdHlsZVNoYWRlcihzaGFkZXJzTGlzdC0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygwKSk7CisgICAgUmVmUHRyPFN0eWxlU2hhZGVyPiBmcmFnbWVudFNoYWRl
cjsKKyAgICBDdXN0b21GaWx0ZXJQcm9ncmFtVHlwZSBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQ
RV9CTEVORFNfRUxFTUVOVF9URVhUVVJFOworICAgIEN1c3RvbUZpbHRlclByb2dyYW1NaXhTZXR0
aW5ncyBtaXhTZXR0aW5nczsKKworICAgIGlmIChzaGFkZXJzTGlzdExlbmd0aCA+IDEpIHsKKyAg
ICAgICAgQ1NTVmFsdWUqIGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbiA9IHNoYWRlcnNMaXN0
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpOworCisgICAgICAgIGlmIChmcmFnbWVudFNoYWRl
ck9yTWl4RnVuY3Rpb24tPmlzV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSgpKSB7CisgICAgICAg
ICAgICBXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKiBtaXhGdW5jdGlvbiA9IHN0YXRpY19jYXN0
PFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUqPihmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24p
OworICAgICAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IobWl4RnVuY3Rpb24p
OworCisgICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpKTsKKyAgICAgICAg
ICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVTaGFkZXIoaXRlcmF0b3IudmFsdWUoKSk7CisgICAg
ICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisKKyAgICAgICAgICAgIEFTU0VSVChtaXhGdW5j
dGlvbi0+bGVuZ3RoKCkgPD0gMyk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTW9y
ZSgpKSB7CisgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAg
ICAgICAgICAgICAgICBpZiAoQ1NTUGFyc2VyOjppc0JsZW5kTW9kZShwcmltaXRpdmVWYWx1ZS0+
Z2V0SWRlbnQoKSkpCisgICAgICAgICAgICAgICAgICAgIG1peFNldHRpbmdzLmJsZW5kTW9kZSA9
ICpwcmltaXRpdmVWYWx1ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDU1NQYXJzZXI6Omlz
Q29tcG9zaXRlT3BlcmF0b3IocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQorICAgICAgICAg
ICAgICAgICAgICBtaXhTZXR0aW5ncy5jb21wb3NpdGVPcGVyYXRvciA9ICpwcmltaXRpdmVWYWx1
ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2dyYW1UeXBlID0gUFJPR1JB
TV9UWVBFX05PX0VMRU1FTlRfVEVYVFVSRTsKKyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0g
c3R5bGVTaGFkZXIoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKKyAgICAgICAgfQorICAg
IH0KKyAgICAKKyAgICB1bnNpZ25lZCBtZXNoUm93cyA9IDE7CisgICAgdW5zaWduZWQgbWVzaENv
bHVtbnMgPSAxOworICAgIEN1c3RvbUZpbHRlck1lc2hUeXBlIG1lc2hUeXBlID0gTWVzaFR5cGVB
dHRhY2hlZDsKKyAgICAKKyAgICBDU1NWYWx1ZSogcGFyYW1ldGVyc1ZhbHVlID0gMDsKKyAgICAK
KyAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICBDU1NWYWx1ZUxp
c3RJdGVyYXRvciBpdGVyYXRvcihmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygx
KSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgc2Vjb25kIHZhbHVlIG1pZ2h0IGJlIHRoZSBt
ZXNoIGJveCBvciB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzOgorICAgICAgICAvLyBJZiBpdCBzdGFy
dHMgd2l0aCBhIG51bWJlciBvciBhbnkgb2YgdGhlIG1lc2gtYm94IGlkZW50aWZpZXJzIGl0IGlz
IAorICAgICAgICAvLyB0aGUgbWVzaC1ib3ggbGlzdCwgaWYgbm90IGl0IG1lYW5zIGl0IGlzIHRo
ZSBwYXJhbWV0ZXJzIGxpc3QuCisKKyAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBp
dGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZh
bHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRl
cmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVy
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBvbmx5IG9uZSBpbnRlZ2VyIHZhbHVlIGlzIHNw
ZWNpZmllZCwgaXQgd2lsbCBzZXQgYm90aAorICAgICAgICAgICAgICAgIC8vIHRoZSByb3dzIGFu
ZCB0aGUgY29sdW1ucy4KKyAgICAgICAgICAgICAgICBtZXNoQ29sdW1ucyA9IG1lc2hSb3dzID0g
cHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaXRlcmF0b3Iu
YWR2YW5jZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBt
YXRjaCBhbm90aGVyIG51bWJlciBmb3IgdGhlIHJvd3MuCisgICAgICAgICAgICAgICAgaWYgKGl0
ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAg
ICAgICAgICAgICBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOworICAg
ICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0
aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsK
KyAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURl
dGFjaGVkKSB7CisgICAgICAgICAgICAgICAgbWVzaFR5cGUgPSBNZXNoVHlwZURldGFjaGVkOwor
ICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFpdGVyYXRvci5pbmRleCgpKSB7CisgICAgICAg
ICAgICAvLyBJZiBubyB2YWx1ZSB3YXMgY29uc3VtZWQgZnJvbSB0aGUgbWVzaCB2YWx1ZSwgdGhl
biBpdCBpcyBqdXN0IGEgcGFyYW1ldGVyIGxpc3QsIG1lYW5pbmcgdGhhdCB3ZSBlbmQgdXAKKyAg
ICAgICAgICAgIC8vIGhhdmluZyBqdXN0IHR3byBDU1NMaXN0VmFsdWVzOiBsaXN0IG9mIHNoYWRl
cnMgYW5kIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAgICAgICAgICAgIEFTU0VSVChmaWx0ZXJWYWx1
ZS0+bGVuZ3RoKCkgPT0gMik7CisgICAgICAgICAgICBwYXJhbWV0ZXJzVmFsdWUgPSBmaWx0ZXJW
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID4gMiAmJiAhcGFyYW1ldGVyc1ZhbHVlKQor
ICAgICAgICBwYXJhbWV0ZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygyKTsKKyAgICAKKyAgICBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0IHBhcmFtZXRlckxp
c3Q7CisgICAgaWYgKHBhcmFtZXRlcnNWYWx1ZSAmJiAhcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0
ZXJMaXN0KHBhcmFtZXRlcnNWYWx1ZSwgcGFyYW1ldGVyTGlzdCkpCisgICAgICAgIHJldHVybiAw
OworICAgIAorICAgIFJlZlB0cjxTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0+IHByb2dyYW0gPSBT
dHlsZUN1c3RvbUZpbHRlclByb2dyYW06OmNyZWF0ZSh2ZXJ0ZXhTaGFkZXIucmVsZWFzZSgpLCBm
cmFnbWVudFNoYWRlci5yZWxlYXNlKCksIHByb2dyYW1UeXBlLCBtaXhTZXR0aW5ncywgbWVzaFR5
cGUpOworICAgIHJldHVybiBDdXN0b21GaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShwcm9ncmFtLnJl
bGVhc2UoKSwgcGFyYW1ldGVyTGlzdCwgbWVzaFJvd3MsIG1lc2hDb2x1bW5zLCBtZXNoVHlwZSk7
Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpj
cmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZh
bHVlKQoreworICAgIEFTU0VSVChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkpOworICAgIGJvb2wgaXNB
dFJ1bGVSZWZlcmVuY2VTeW50YXggPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpOworICAgIHJldHVybiBpc0F0UnVsZVJlZmVyZW5jZVN5
bnRheCA/IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50
YXgoZmlsdGVyVmFsdWUpIDogY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5
bnRheChmaWx0ZXJWYWx1ZSk7Cit9CisKKyNlbmRpZgorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNy
ZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBzdHls
ZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9u
cykKK3sKKyAgICBBU1NFUlQob3V0T3BlcmF0aW9ucy5pc0VtcHR5KCkpOworICAgIAorICAgIGlm
ICghaW5WYWx1ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGlmIChpblZhbHVl
LT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1p
dGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpblZhbHVlKTsKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBpZiAoIWluVmFsdWUtPmlz
VmFsdWVMaXN0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZsb2F0IHpvb21GYWN0
b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29tKCkgOiAxOworICAgIEZpbHRlck9wZXJh
dGlvbnMgb3BlcmF0aW9uczsKKyAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZh
bHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJW
YWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTRmls
dGVyVmFsdWUoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIFdlYktpdENTU0Zp
bHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU0ZpbHRlclZhbHVl
Kj4oaS52YWx1ZSgpKTsKKyAgICAgICAgRmlsdGVyT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIG9w
ZXJhdGlvblR5cGUgPSBmaWx0ZXJPcGVyYXRpb25Gb3JUeXBlKGZpbHRlclZhbHVlLT5vcGVyYXRp
b25UeXBlKCkpOworCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICBpZiAob3BlcmF0
aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OlZBTElEQVRFRF9DVVNUT00pIHsKKyAgICAgICAg
ICAgIC8vIFZhbGlkYXRlZEN1c3RvbUZpbHRlck9wZXJhdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8g
ZW5kIHVwIGluIHRoZSBSZW5kZXJTdHlsZS4KKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wZXJh
dGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT00pIHsKKyAgICAgICAgICAgIFJlZlB0
cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IGNyZWF0ZUN1c3RvbUZpbHRlck9w
ZXJhdGlvbihmaWx0ZXJWYWx1ZSk7CisgICAgICAgICAgICBpZiAoIW9wZXJhdGlvbikKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9wZXJh
dGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24pOworICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0
ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgeworI2lmIEVOQUJMRShTVkcpCisgICAgICAgICAgICBp
ZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9IDEpCisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICBDU1NWYWx1ZSogYXJndW1lbnQgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygwKTsKKworICAgICAgICAgICAgaWYgKCFhcmd1bWVudC0+aXNXZWJLaXRD
U1NTVkdEb2N1bWVudFZhbHVlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgICAgIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWUqIHN2Z0RvY3VtZW50VmFsdWUgPSBzdGF0
aWNfY2FzdDxXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKj4oYXJndW1lbnQpOworICAgICAgICAg
ICAgS1VSTCB1cmwgPSBtX3N0YXRlLmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHN2Z0RvY3VtZW50
VmFsdWUtPnVybCgpKTsKKworICAgICAgICAgICAgUmVmUHRyPFJlZmVyZW5jZUZpbHRlck9wZXJh
dGlvbj4gb3BlcmF0aW9uID0gUmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoc3ZnRG9j
dW1lbnRWYWx1ZS0+dXJsKCksIHVybC5mcmFnbWVudElkZW50aWZpZXIoKSwgb3BlcmF0aW9uVHlw
ZSk7CisgICAgICAgICAgICBpZiAoU1ZHVVJJUmVmZXJlbmNlOjppc0V4dGVybmFsVVJJUmVmZXJl
bmNlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCBtX3N0YXRlLmRvY3VtZW50KCkpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFzdmdEb2N1bWVudFZhbHVlLT5sb2FkUmVxdWVzdGVkKCkpCisgICAg
ICAgICAgICAgICAgICAgIG1fc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLnNldChvcGVyYXRp
b24uZ2V0KCksIHN2Z0RvY3VtZW50VmFsdWUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN2
Z0RvY3VtZW50VmFsdWUtPmNhY2hlZFNWR0RvY3VtZW50KCkpCisgICAgICAgICAgICAgICAgICAg
IG9wZXJhdGlvbi0+c2V0Q2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UoYWRvcHRQdHIobmV3IENh
Y2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKHN2Z0RvY3VtZW50VmFsdWUtPmNhY2hlZFNWR0RvY3Vt
ZW50KCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGF0IGFsbCBwYXJhbWV0ZXJzIGFyZSBwcmlt
aXRpdmUgdmFsdWVzLCB3aXRoIHRoZQorICAgICAgICAvLyBleGNlcHRpb24gb2YgZHJvcCBzaGFk
b3cgd2hpY2ggaGFzIGEgU2hhZG93VmFsdWUgcGFyYW1ldGVyLgorICAgICAgICBpZiAob3BlcmF0
aW9uVHlwZSAhPSBGaWx0ZXJPcGVyYXRpb246OkRST1BfU0hBRE9XKSB7CisgICAgICAgICAgICBi
b29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yICh1bnNp
Z25lZCBqID0gMDsgaiA8IGZpbHRlclZhbHVlLT5sZW5ndGgoKTsgKytqKSB7CisgICAgICAgICAg
ICAgICAgaWYgKCFmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmlt
aXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhdmVOb25QcmltaXRpdmVWYWx1
ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogZmlyc3RWYWx1ZSA9IGZpbHRlclZhbHVlLT5sZW5ndGgoKSA/IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MCkpIDogMDsKKyAgICAgICAgc3dpdGNoIChmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSB7
CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJh
dGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2VwaWFGaWx0ZXJPcGVy
YXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNhdHVyYXRlRmlsdGVy
T3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW1vdW50ID0gMTsKKyAgICAgICAgICAg
IGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFtb3Vu
dCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZp
cnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQorICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0g
MTAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMo
KS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwg
b3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBkb3VibGUgYW5nbGUgPSAwOworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSA9PSAxKQorICAgICAgICAgICAgICAgIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29t
cHV0ZURlZ3JlZXMoKTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbmdsZSwgb3BlcmF0
aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uOgorICAgICAg
ICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6T3BhY2l0eUZpbHRlck9wZXJhdGlvbjog
eworICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IChmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpID09IFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uKSA/
IDAgOiAxOworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKSB7Cisg
ICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAg
ICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNQZXJjZW50YWdlKCkpCisgICAgICAgICAg
ICAgICAgICAgIGFtb3VudCAvPSAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbXBvbmVudFRyYW5zZmVyRmlsdGVy
T3BlcmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCbHVy
RmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGggc3RkRGV2aWF0aW9uID0gTGVu
Z3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPj0g
MSkKKyAgICAgICAgICAgICAgICBzdGREZXZpYXRpb24gPSBjb252ZXJ0VG9GbG9hdExlbmd0aChm
aXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGlm
IChzdGREZXZpYXRpb24uaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCbHVyRmls
dGVyT3BlcmF0aW9uOjpjcmVhdGUoc3RkRGV2aWF0aW9uLCBvcGVyYXRpb25UeXBlKSk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgICAgICBDU1NWYWx1ZSogY3NzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygwKTsKKyAgICAgICAgICAgIGlmICghY3NzVmFsdWUtPmlzU2hhZG93VmFsdWUo
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgU2hhZG93VmFsdWUq
IGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dWYWx1ZSo+KGNzc1ZhbHVlKTsKKyAgICAgICAgICAg
IEludFBvaW50IGxvY2F0aW9uKGl0ZW0tPngtPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9v
dFN0eWxlLCB6b29tRmFjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0t
PnktPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKSk7Cisg
ICAgICAgICAgICBpbnQgYmx1ciA9IGl0ZW0tPmJsdXIgPyBpdGVtLT5ibHVyLT5jb21wdXRlTGVu
Z3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikgOiAwOworICAgICAgICAgICAg
Q29sb3IgY29sb3I7CisgICAgICAgICAgICBpZiAoaXRlbS0+Y29sb3IpCisgICAgICAgICAgICAg
ICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7CisK
KyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChEcm9wU2hhZG93Rmls
dGVyT3BlcmF0aW9uOjpjcmVhdGUobG9jYXRpb24sIGJsdXIsIGNvbG9yLmlzVmFsaWQoKSA/IGNv
bG9yIDogQ29sb3I6OnRyYW5zcGFyZW50LCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtu
b3duRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIG91dE9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOworICAgIHJldHVybiB0cnVlOworfQorCisj
ZW5kaWYKKworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGlu
Z0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKiBwZW5kaW5nSW1hZ2UpCit7CisgICAgQ2FjaGVkUmVz
b3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5j
YWNoZWRSZXNvdXJjZUxvYWRlcigpOworCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VW
YWx1ZSgpKSB7CisgICAgICAgIENTU0ltYWdlVmFsdWUqIGltYWdlVmFsdWUgPSBwZW5kaW5nSW1h
Z2UtPmNzc0ltYWdlVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGltYWdlVmFsdWUtPmNhY2hlZElt
YWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9CisKKyAgICBpZiAocGVuZGluZ0ltYWdl
LT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VHZW5lcmF0b3JW
YWx1ZSogaW1hZ2VHZW5lcmF0b3JWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0
b3JWYWx1ZSgpOworICAgICAgICBpbWFnZUdlbmVyYXRvclZhbHVlLT5sb2FkU3ViaW1hZ2VzKGNh
Y2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICAgICAgcmV0dXJuIFN0eWxlR2VuZXJhdGVkSW1hZ2U6
OmNyZWF0ZShpbWFnZUdlbmVyYXRvclZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAocGVuZGluZ0lt
YWdlLT5jc3NDdXJzb3JJbWFnZVZhbHVlKCkpIHsKKyAgICAgICAgQ1NTQ3Vyc29ySW1hZ2VWYWx1
ZSogY3Vyc29ySW1hZ2VWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgp
OworICAgICAgICByZXR1cm4gY3Vyc29ySW1hZ2VWYWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVz
b3VyY2VMb2FkZXIpOworICAgIH0KKworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIGlm
IChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlU2V0VmFsdWUoKSkgeworICAgICAgICBDU1NJbWFnZVNl
dFZhbHVlKiBpbWFnZVNldFZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCk7
CisgICAgICAgIHJldHVybiBpbWFnZVNldFZhbHVlLT5jYWNoZWRJbWFnZVNldChjYWNoZWRSZXNv
dXJjZUxvYWRlcik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ0ltYWdlcygpCit7CisgICAgaWYgKG1fc3RhdGUucGVu
ZGluZ0ltYWdlUHJvcGVydGllcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
UGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0X2l0ZXJhdG9yOjpLZXlzIGVuZCA9IG1fc3Rh
dGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmVuZCgpLmtleXMoKTsKKyAgICBmb3IgKFBlbmRp
bmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBpdCA9IG1fc3RhdGUucGVu
ZGluZ0ltYWdlUHJvcGVydGllcygpLmJlZ2luKCkua2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
KyAgICAgICAgQ1NTUHJvcGVydHlJRCBjdXJyZW50UHJvcGVydHkgPSAqaXQ7CisKKyAgICAgICAg
c3dpdGNoIChjdXJyZW50UHJvcGVydHkpIHsKKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRJbWFnZTogeworICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIGJhY2tncm91bmRMYXll
ciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzQmFja2dyb3VuZExheWVycygpOyBiYWNrZ3JvdW5k
TGF5ZXI7IGJhY2tncm91bmRMYXllciA9IGJhY2tncm91bmRMYXllci0+bmV4dCgpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKGJhY2tncm91bmRMYXllci0+aW1hZ2UoKSAmJiBiYWNrZ3JvdW5kTGF5
ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgICAgIGJhY2tn
cm91bmRMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBl
bmRpbmdJbWFnZSo+KGJhY2tncm91bmRMYXllci0+aW1hZ2UoKSkpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlD
b250ZW50OiB7CisgICAgICAgICAgICBmb3IgKENvbnRlbnREYXRhKiBjb250ZW50RGF0YSA9IGNv
bnN0X2Nhc3Q8Q29udGVudERhdGEqPihtX3N0YXRlLnN0eWxlKCktPmNvbnRlbnREYXRhKCkpOyBj
b250ZW50RGF0YTsgY29udGVudERhdGEgPSBjb250ZW50RGF0YS0+bmV4dCgpKSB7CisgICAgICAg
ICAgICAgICAgaWYgKGNvbnRlbnREYXRhLT5pc0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgU3R5bGVJbWFnZSogaW1hZ2UgPSBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29u
dGVudERhdGEpLT5pbWFnZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmlzUGVu
ZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdl
PiBsb2FkZWRJbWFnZSA9IGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5n
SW1hZ2UqPihpbWFnZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZEltYWdl
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEltYWdlQ29udGVudERh
dGEqPihjb250ZW50RGF0YSktPnNldEltYWdlKGxvYWRlZEltYWdlLnJlbGVhc2UoKSk7CisgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q3Vyc29y
OiB7CisgICAgICAgICAgICBpZiAoQ3Vyc29yTGlzdCogY3Vyc29yTGlzdCA9IG1fc3RhdGUuc3R5
bGUoKS0+Y3Vyc29ycygpKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBjdXJzb3JMaXN0LT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBDdXJzb3JE
YXRhJiBjdXJyZW50Q3Vyc29yID0gY3Vyc29yTGlzdC0+YXQoaSk7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChTdHlsZUltYWdlKiBpbWFnZSA9IGN1cnJlbnRDdXJzb3IuaW1hZ2UoKSkgeworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDdXJzb3Iuc2V0SW1hZ2UobG9hZFBlbmRpbmdJ
bWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGltYWdlKSkpOworICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZUlt
YWdlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgp
ICYmIG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkK
KyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldExpc3RTdHlsZUltYWdlKGxvYWRQ
ZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxl
KCktPmxpc3RTdHlsZUltYWdlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VTb3VyY2U6IHsKKyAgICAgICAgICAg
IGlmIChtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHls
ZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAg
ICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0Qm9yZGVySW1hZ2VTb3VyY2UobG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVy
SW1hZ2VTb3VyY2UoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZsZWN0OiB7CisgICAgICAgICAgICBpZiAoU3R5
bGVSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbV9zdGF0ZS5zdHlsZSgpLT5ib3hSZWZsZWN0KCkp
IHsKKyAgICAgICAgICAgICAgICBjb25zdCBOaW5lUGllY2VJbWFnZSYgbWFza0ltYWdlID0gcmVm
bGVjdGlvbi0+bWFzaygpOworICAgICAgICAgICAgICAgIGlmIChtYXNrSW1hZ2UuaW1hZ2UoKSAm
JiBtYXNrSW1hZ2UuaW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkgeworICAgICAgICAgICAgICAg
ICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0
YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obWFza0ltYWdlLmltYWdlKCkpKTsKKyAgICAg
ICAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+c2V0TWFzayhOaW5lUGllY2VJbWFnZShsb2FkZWRJ
bWFnZS5yZWxlYXNlKCksIG1hc2tJbWFnZS5pbWFnZVNsaWNlcygpLCBtYXNrSW1hZ2UuZmlsbCgp
LCBtYXNrSW1hZ2UuYm9yZGVyU2xpY2VzKCksIG1hc2tJbWFnZS5vdXRzZXQoKSwgbWFza0ltYWdl
Lmhvcml6b250YWxSdWxlKCksIG1hc2tJbWFnZS52ZXJ0aWNhbFJ1bGUoKSkpOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6IHsKKyAgICAg
ICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpICYmIG1fc3Rh
dGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAg
ICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRNYXNrQm94SW1hZ2VTb3VyY2UobG9hZFBl
bmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUo
KS0+bWFza0JveEltYWdlU291cmNlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0ltYWdlOiB7CisgICAgICAgICAg
ICBmb3IgKEZpbGxMYXllciogbWFza0xheWVyID0gbV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NNYXNr
TGF5ZXJzKCk7IG1hc2tMYXllcjsgbWFza0xheWVyID0gbWFza0xheWVyLT5uZXh0KCkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAobWFza0xheWVyLT5pbWFnZSgpICYmIG1hc2tMYXllci0+aW1hZ2Uo
KS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgbWFza0xheWVyLT5zZXRJ
bWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obWFz
a0xheWVyLT5pbWFnZSgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzKCkuY2xlYXIoKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1Jlc291
cmNlcygpCit7CisgICAgLy8gU3RhcnQgbG9hZGluZyBpbWFnZXMgcmVmZXJlbmNlZCBieSB0aGlz
IHN0eWxlLgorICAgIGxvYWRQZW5kaW5nSW1hZ2VzKCk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQURF
UlMpCisgICAgLy8gU3RhcnQgbG9hZGluZyB0aGUgc2hhZGVycyByZWZlcmVuY2VkIGJ5IHRoaXMg
c3R5bGUuCisgICAgbG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5kaWYKKyAgICAKKyNpZiBFTkFC
TEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgLy8gU3RhcnQgbG9hZGluZyB0aGUg
U1ZHIERvY3VtZW50cyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdT
VkdEb2N1bWVudHMoKTsKKyNlbmRpZgorfQorCitpbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hl
ZFByb3BlcnRpZXM6Ok1hdGNoZWRQcm9wZXJ0aWVzKCkKKyAgICA6IHBvc3NpYmx5UGFkZGVkTWVt
YmVyKDApCit7Cit9CisKK2lubGluZSBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6
fk1hdGNoZWRQcm9wZXJ0aWVzKCkKK3sKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpNYXRjaGVk
UHJvcGVydGllczo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2Jq
ZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJ
bmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIo
cHJvcGVydGllcywgInByb3BlcnRpZXMiKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpNYXRj
aGVkUHJvcGVydGllc0NhY2hlSXRlbTo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5m
byogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyht
ZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5m
by5hZGRNZW1iZXIobWF0Y2hlZFByb3BlcnRpZXMsICJtYXRjaGVkUHJvcGVydGllcyIpOworICAg
IGluZm8uYWRkTWVtYmVyKHJhbmdlcywgInJhbmdlcyIpOworICAgIGluZm8uYWRkTWVtYmVyKHJl
bmRlclN0eWxlLCAicmVuZGVyU3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihwYXJlbnRSZW5k
ZXJTdHlsZSwgInBhcmVudFJlbmRlclN0eWxlIik7Cit9CisKK3ZvaWQgTWVkaWFRdWVyeVJlc3Vs
dDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykg
Y29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlz
LCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIobV9leHByZXNz
aW9uLCAiZXhwcmVzc2lvbiIpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnJlcG9ydE1lbW9y
eVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAg
TWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9y
eVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1fcnVsZVNldHMsICJydWxlU2V0cyIp
OworICAgIGluZm8uYWRkTWVtYmVyKG1fa2V5ZnJhbWVzUnVsZU1hcCwgImtleWZyYW1lc1J1bGVN
YXAiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUsICJtYXRj
aGVkUHJvcGVydGllc0NhY2hlIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVy
dGllc0NhY2hlU3dlZXBUaW1lciwgIm1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyIik7
CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX21lZGl1bSwgIm1lZGl1bSIpOworICAgIGluZm8uYWRk
TWVtYmVyKG1fcm9vdERlZmF1bHRTdHlsZSwgInJvb3REZWZhdWx0U3R5bGUiKTsKKyAgICBpbmZv
LmFkZE1lbWJlcihtX2RvY3VtZW50LCAiZG9jdW1lbnQiKTsKKworICAgIGluZm8uYWRkTWVtYmVy
KG1fZm9udFNlbGVjdG9yLCAiZm9udFNlbGVjdG9yIik7CisgICAgaW5mby5hZGRNZW1iZXIobV92
aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLCAidmlld3BvcnREZXBlbmRlbnRNZWRp
YVF1ZXJ5UmVzdWx0cyIpOworICAgIGluZm8uaWdub3JlTWVtYmVyKG1fc3R5bGVCdWlsZGVyKTsK
KyAgICBpbmZvLmFkZE1lbWJlcihtX2luc3BlY3RvckNTU09NV3JhcHBlcnMpOworICAgIGluZm8u
YWRkTWVtYmVyKG1fc2NvcGVSZXNvbHZlciwgInNjb3BlUmVzb2x2ZXIiKTsKKworICAgIGluZm8u
YWRkTWVtYmVyKG1fc3RhdGUsICJzdGF0ZSIpOworCisgICAgLy8gRklYTUU6IG1vdmUgdGhpcyB0
byBhIHBsYWNlIHdoZXJlIGl0IHdvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2U/CisgICAgaW5mby5h
ZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGUsICJkZWZhdWx0U3R5
bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRR
dWlya3NTdHlsZSwgImRlZmF1bHRRdWlya3NTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsImRlZmF1bHRQcmludFN0eWxl
Iik7CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0Vmll
d1NvdXJjZVN0eWxlLCAiZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSIpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0
b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxl
Y3Rvci5jcHAJKHJldmlzaW9uIDE0NTE4MSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50
UnVsZUNvbGxlY3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDE4OSArMjcsMjYgQEAKICAq
LwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorI2lu
Y2x1ZGUgIkVsZW1lbnRSdWxlQ29sbGVjdG9yLmgiCiAKLSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIK
LSNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5oIgotI2luY2x1ZGUgIkNTU0NhbGN1bGF0aW9uVmFs
dWUuaCIKLSNpbmNsdWRlICJDU1NDdXJzb3JJbWFnZVZhbHVlLmgiCiAjaW5jbHVkZSAiQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAiQ1NTRm9udEZhY2VSdWxlLmgiCi0jaW5jbHVk
ZSAiQ1NTRm9udFNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTTGluZUJveENvbnRhaW5WYWx1ZS5o
IgotI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCi0jaW5j
bHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBwaW5ncy5oIgotI2luY2x1ZGUgIkNTU1Byb3BlcnR5
TmFtZXMuaCIKLSNpbmNsdWRlICJDU1NSZWZsZWN0VmFsdWUuaCIKKyNpbmNsdWRlICJDU1NSdWxl
LmgiCisjaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKICNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgog
I2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgotI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgot
I2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgotI2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9u
VmFsdWUuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKLSNpZiBFTkFCTEUoQ1NTX1ZBUklB
QkxFUykKLSNpbmNsdWRlICJDU1NWYXJpYWJsZVZhbHVlLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJD
YWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJD
b250ZW50RGF0YS5oIgotI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIkNv
dW50ZXIuaCIKLSNpbmNsdWRlICJDb3VudGVyQ29udGVudC5oIgotI2luY2x1ZGUgIkN1cnNvckxp
c3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCi0jaW5jbHVk
ZSAiRWxlbWVudFNoYWRvdy5oIgotI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKLSNpbmNs
dWRlICJGb250VmFsdWUuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lU2Vs
ZWN0aW9uLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50
LmgiCi0jaW5jbHVkZSAiSFRNTElGcmFtZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSW5wdXRF
bGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlvbkVs
ZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MUHJvZ3Jlc3NFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRN
TFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNs
dWRlICJJbnNlcnRpb25Qb2ludC5oIgotI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlv
bi5oIgotI2luY2x1ZGUgIktleWZyYW1lTGlzdC5oIgotI2luY2x1ZGUgIkxpbmtIYXNoLmgiCi0j
aW5jbHVkZSAiTG9jYWxlVG9TY3JpcHRNYXBwaW5nLmgiCi0jaW5jbHVkZSAiTWF0aE1MTmFtZXMu
aCIKLSNpbmNsdWRlICJNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIk1h
dHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIk1lZGlhTGlzdC5oIgotI2luY2x1
ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIKLSNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIK
LSNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNp
bmNsdWRlICJQYWlyLmgiCi0jaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24u
aCIKLSNpbmNsdWRlICJRdW90ZXNEYXRhLmgiCi0jaW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUg
IkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJIVE1MRWxlbWVudC5oIgogI2luY2x1ZGUg
IlJlbmRlclJlZ2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhci5oIgotI2luY2x1ZGUg
IlJlbmRlclNjcm9sbGJhclRoZW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGVDb25zdGFudHMu
aCIKLSNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNp
bmNsdWRlICJSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJSdWxlU2V0Lmgi
Ci0jaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiU1ZHRm9udEZh
Y2VFbGVtZW50LmgiCi0jaW5jbHVkZSAiU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNs
dWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNWR0VsZW1lbnQuaCIKICNpbmNsdWRl
ICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5j
bHVkZSAiU2hhZG93RGF0YS5oIgotI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKLSNpbmNsdWRlICJT
aGFkb3dWYWx1ZS5oIgogI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCi0j
aW5jbHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIlN0eWxlQnVpbGRl
ci5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJTdHlsZUdlbmVy
YXRlZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVQZW5kaW5nSW1hZ2UuaCIKICNpbmNsdWRlICJT
dHlsZVByb3BlcnR5U2V0LmgiCi0jaW5jbHVkZSAiU3R5bGVQcm9wZXJ0eVNob3J0aGFuZC5oIgot
I2luY2x1ZGUgIlN0eWxlUnVsZS5oIgotI2luY2x1ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgotI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgotI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0Lmgi
Ci0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCi0j
aW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiVXNlckFn
ZW50U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKLSNp
bmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCi0jaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3Ry
dW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lUnVsZS5oIgotI2luY2x1
ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25S
dWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuaCIKLSNpbmNsdWRlICJX
ZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKLSNpbmNsdWRlICJYTUxOYW1lcy5oIgotI2luY2x1ZGUg
PHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL01lbW9y
eUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KLSNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVu
dGF0aW9uVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLSNpbmNsdWRlICJGaWx0
ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NGaWx0ZXJWYWx1ZS5oIgotI2VuZGlm
Ci0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0jaW5jbHVkZSAiRGFzaGJvYXJkUmVn
aW9uLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiQ2FjaGVkU1ZHRG9j
dW1lbnQuaCIKLSNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgotI2luY2x1
ZGUgIlNWR0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgotI2luY2x1ZGUgIlNW
R05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCi0jaW5jbHVkZSAiV2ViS2l0
Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
Ci0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0
b21GaWx0ZXJDb25zdGFudHMuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJDdXN0
b21GaWx0ZXJQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJh
bWV0ZXIuaCIKLSNpbmNsdWRlICJTdHlsZUNhY2hlZFNoYWRlci5oIgotI2luY2x1ZGUgIlN0eWxl
Q3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgotI2luY2x1ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgot
I2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1NoYWRlclZhbHVlLmgiCi0jZW5kaWYKLQotI2lm
IEVOQUJMRShDU1NfSU1BR0VfU0VUKQotI2luY2x1ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKLSNp
bmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShWSURF
T19UUkFDSykKLSNpbmNsdWRlICJXZWJWVFRFbGVtZW50LmgiCi0jZW5kaWYKKyNpbmNsdWRlICJT
dHlsZWRFbGVtZW50LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBXVEYg
ewotCi10ZW1wbGF0ZTw+IHN0cnVjdCBTZXF1ZW5jZU1lbW9yeUluc3RydW1lbnRhdGlvblRyYWl0
czxjb25zdCBXZWJDb3JlOjpSdWxlRGF0YSo+IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgST4g
c3RhdGljIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoSSwgSSwgTWVtb3J5Q2xhc3NJbmZvJikgeyB9
Ci19OwotCi19CisjaW5jbHVkZSA8d3RmL1RlbXBvcmFyeUNoYW5nZS5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLSNkZWZpbmUgSEFORExF
X0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5oZXJpdCkgeyBcCi0gICAgbV9zdGF0ZS5z
dHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCi0gICAg
cmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwg
UHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5pdGlhbCkgeyBc
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1By
b3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6
OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KIHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0
VG9SaWdodERlY2xhcmF0aW9uKCkKIHsKICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3Jl
YXRlKCkpKTsKQEAgLTIyNiwyMDUgKzYzLDQ5IEBAIHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBy
aWdodFRvTGVmdERlY2wKICAgICByZXR1cm4gcmlnaHRUb0xlZnREZWNsLmdldCgpOwogfQogCi0K
LWlubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmVuc3VyZVJ1
bGVMaXN0KCkKLXsKLSAgICBpZiAoIW1fcnVsZUxpc3QpCi0gICAgICAgIG1fcnVsZUxpc3QgPSBT
dGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7Ci0gICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7
Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjYWNoZUJvcmRlckFuZEJh
Y2tncm91bmQoKQotewotICAgIG1faGFzVUFBcHBlYXJhbmNlID0gbV9zdHlsZS0+aGFzQXBwZWFy
YW5jZSgpOwotICAgIGlmIChtX2hhc1VBQXBwZWFyYW5jZSkgewotICAgICAgICBtX2JvcmRlckRh
dGEgPSBtX3N0eWxlLT5ib3JkZXIoKTsKLSAgICAgICAgbV9iYWNrZ3JvdW5kRGF0YSA9ICptX3N0
eWxlLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgICAgIG1fYmFja2dyb3VuZENvbG9yID0gbV9z
dHlsZS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJl
c29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQotewotICAgIG1fZWxlbWVudCA9IDA7Ci0gICAgbV9zdHls
ZWRFbGVtZW50ID0gMDsKLSAgICBtX3BhcmVudFN0eWxlID0gMDsKLSAgICBtX3BhcmVudE5vZGUg
PSAwOwotICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IDA7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0g
ICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKLSAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMu
Y2xlYXIoKTsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgbV9oYXNQZW5kaW5nU2hhZGVy
cyA9IGZhbHNlOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZH
KQotICAgIG1fcGVuZGluZ1NWR0RvY3VtZW50cy5jbGVhcigpOwotI2VuZGlmCi19Ci0KLVN0eWxl
UmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcykKLSAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9u
c1NpbmNlTGFzdFN3ZWVwKDApCi0gICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRp
bWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCi0g
ICAgLCBtX2RvY3VtZW50KGRvY3VtZW50KQotICAgICwgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICwgbV9mb250U2VsZWN0b3IoQ1NTRm9u
dFNlbGVjdG9yOjpjcmVhdGUoZG9jdW1lbnQpKQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBU
QVRJT04pCi0gICAgLCBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcihWaWV3cG9ydFN0eWxlUmVzb2x2
ZXI6OmNyZWF0ZShkb2N1bWVudCkpCi0jZW5kaWYKLSAgICAsIG1fc3R5bGVCdWlsZGVyKFN0eWxl
QnVpbGRlcjo6c2hhcmVkU3R5bGVCdWlsZGVyKCkpCi0gICAgLCBtX3N0eWxlTWFwKHRoaXMpCi17
Ci0gICAgRWxlbWVudCogcm9vdCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKLQotICAg
IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6aW5pdERlZmF1bHRTdHlsZShyb290KTsKLQotICAgIC8v
IGNvbnN0cnVjdCBkb2N1bWVudCByb290IGVsZW1lbnQgZGVmYXVsdCBzdHlsZS4gdGhpcyBpcyBu
ZWVkZWQKLSAgICAvLyB0byBldmFsdWF0ZSBtZWRpYSBxdWVyaWVzIHRoYXQgY29udGFpbiByZWxh
dGl2ZSBjb25zdHJhaW50cywgbGlrZSAic2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMGVtKSIKLSAg
ICAvLyBUaGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBjb25zdHJ1Y3RvciwgYmVjYXVzZSB3aGVuIGNv
bnN0cnVjdG9yIGlzIHJ1biwKLSAgICAvLyBkb2N1bWVudCBkb2Vzbid0IGhhdmUgZG9jdW1lbnRF
bGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgZWxlbWVudCB0aGF0IGdldHMg
cGFzc2VkIHRvIHN0eWxlRm9yRWxlbWVudCAtY2FsbAotICAgIC8vIGlzIGFsd2F5cyBmcm9tIHRo
ZSBkb2N1bWVudCB0aGF0IG93bnMgdGhlIHN0eWxlIHNlbGVjdG9yCi0gICAgRnJhbWVWaWV3KiB2
aWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsKLSAgICBpZiAodmlldykKLSAgICAgICAgbV9tZWRpdW0g
PSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSkpOwot
ICAgIGVsc2UKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1
YXRvcigiYWxsIikpOwotCi0gICAgaWYgKHJvb3QpCi0gICAgICAgIG1fcm9vdERlZmF1bHRTdHls
ZSA9IHN0eWxlRm9yRWxlbWVudChyb290LCAwLCBEaXNhbGxvd1N0eWxlU2hhcmluZywgTWF0Y2hP
bmx5VXNlckFnZW50UnVsZXMpOwotCi0gICAgaWYgKG1fcm9vdERlZmF1bHRTdHlsZSAmJiB2aWV3
KQotICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZp
ZXctPm1lZGlhVHlwZSgpLCB2aWV3LT5mcmFtZSgpLCBtX3Jvb3REZWZhdWx0U3R5bGUuZ2V0KCkp
KTsKLQotICAgIG1fcnVsZVNldHMucmVzZXRBdXRob3JTdHlsZSgpOwotCi0gICAgRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVldENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5
bGVTaGVldENvbGxlY3Rpb24oKTsKLSAgICBtX3J1bGVTZXRzLmluaXRVc2VyU3R5bGUoc3R5bGVT
aGVldENvbGxlY3Rpb24sICptX21lZGl1bSwgKnRoaXMpOwotCi0jaWYgRU5BQkxFKFNWR19GT05U
UykKLSAgICBpZiAoZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKSkgewotICAgICAgICBjb25zdCBI
YXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+JiBzdmdGb250RmFjZUVsZW1lbnRzID0gZG9jdW1l
bnQtPnN2Z0V4dGVuc2lvbnMoKS0+c3ZnRm9udEZhY2VFbGVtZW50cygpOwotICAgICAgICBIYXNo
U2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBzdmdGb250RmFj
ZUVsZW1lbnRzLmVuZCgpOwotICAgICAgICBmb3IgKEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3ZnRm9udEZhY2VFbGVtZW50cy5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpCi0gICAgICAgICAgICBmb250U2VsZWN0b3IoKS0+YWRkRm9udEZhY2VSdWxl
KCgqaXQpLT5mb250RmFjZVJ1bGUoKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcHBlbmRBdXRo
b3JTdHlsZVNoZWV0cygwLCBzdHlsZVNoZWV0Q29sbGVjdGlvbi0+YWN0aXZlQXV0aG9yU3R5bGVT
aGVldHMoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwZW5kQXV0aG9yU3R5bGVTaGVl
dHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
PiYgc3R5bGVTaGVldHMpCi17Ci0gICAgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0
cyhmaXJzdE5ldywgc3R5bGVTaGVldHMsIG1fbWVkaXVtLmdldCgpLCBtX2luc3BlY3RvckNTU09N
V3JhcHBlcnMsIGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCB0aGlzKTsKLSAgICBpZiAoZG9j
dW1lbnQoKS0+cmVuZGVyZXIoKSAmJiBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpKQot
ICAgICAgICBkb2N1bWVudCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZv
bnRTZWxlY3RvcigpKTsKLQotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAg
dmlld3BvcnRTdHlsZVJlc29sdmVyKCktPnJlc29sdmUoKTsKLSNlbmRpZgotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkKLXsKLSAgICBj
b25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRzUGFyZW50ID0gcGFyZW50LT5wYXJlbnRPclNoYWRv
d0hvc3RFbGVtZW50KCk7Ci0KLSAgICAvLyBXZSBhcmUgbm90IGFsd2F5cyBpbnZva2VkIGNvbnNp
c3RlbnRseS4gRm9yIGV4YW1wbGUsIHNjcmlwdCBleGVjdXRpb24gY2FuIGNhdXNlIHVzIHRvIGVu
dGVyCi0gICAgLy8gc3R5bGUgcmVjYWxjIGluIHRoZSBtaWRkbGUgb2YgdHJlZSBidWlsZGluZy4g
V2UgbWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHNvbWV3aGVyZSB3aXRoaW4gdGhlIHRyZWUuCi0g
ICAgLy8gUmVzZXQgdGhlIHN0YWNrIGluIHRoaXMgY2FzZSwgb3IgaWYgd2Ugc2VlIGEgbmV3IHJv
b3QgZWxlbWVudC4KLSAgICAvLyBPdGhlcndpc2UganVzdCBwdXNoIHRoZSBuZXcgcGFyZW50Lgot
ICAgIGlmICghcGFyZW50c1BhcmVudCB8fCBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNF
bXB0eSgpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnNldHVwUGFyZW50U3RhY2socGFyZW50
KTsKLSAgICBlbHNlCi0gICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucHVzaFBhcmVudChwYXJlbnQp
OwotCi0gICAgLy8gTm90ZTogV2UgbXVzdG4ndCBza2lwIFNoYWRvd1Jvb3Qgbm9kZXMgZm9yIHRo
ZSBzY29wZSBzdGFjay4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3Bl
UmVzb2x2ZXItPnB1c2gocGFyZW50LCBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9zdE5vZGUoKSk7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJl
bnQpCi17Ci0gICAgLy8gTm90ZSB0aGF0IHdlIG1heSBnZXQgaW52b2tlZCBmb3Igc29tZSByYW5k
b20gZWxlbWVudHMgaW4gc29tZSB3YWNreSBjYXNlcyBkdXJpbmcgc3R5bGUgcmVzb2x2ZS4KLSAg
ICAvLyBQYXVzZSBtYWludGFpbmluZyB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLgotICAgIGlmICht
X3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHBhcmVudCkpCi0gICAgICAg
IG1fc2VsZWN0b3JGaWx0ZXIucG9wUGFyZW50KCk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikK
LSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3AocGFyZW50KTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjpwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290
KQorU3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQmIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRj
aGVkUmVzdWx0KCkKIHsKLSAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsKLSAgICBpZiAo
bV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2goc2hhZG93Um9v
dCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hl
Y2tlcjo6UmVzb2x2aW5nU3R5bGUpOworICAgIHJldHVybiBtX3Jlc3VsdDsKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRv
d1Jvb3QpCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0
Y2hlZFJ1bGVMaXN0KCkKIHsKLSAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsKLSAgICBp
ZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnBvcChzaGFkb3dS
b290KTsKKyAgICBBU1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1
bGVzKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7CiB9CiAKLS8vIFRoaXMgaXMg
YSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0eWxlcwot
dm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxl
S2V5ZnJhbWVzPiBydWxlKQoraW5saW5lIHZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFkZE1h
dGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKQogewotICAgIEF0b21pY1N0cmluZyBzKHJ1
bGUtPm5hbWUoKSk7Ci0gICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7
CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAgICAgICAgbV9tYXRjaGVkUnVsZXMgPSBhZG9w
dFB0cihuZXcgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+KTsKKyAgICBtX21hdGNoZWRSdWxl
cy0+YXBwZW5kKHJ1bGUpOwogfQogCi1TdHlsZVJlc29sdmVyOjp+U3R5bGVSZXNvbHZlcigpCitp
bmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJNYXRjaGVkUnVsZXMoKQogewot
ICAgIG1fZm9udFNlbGVjdG9yLT5jbGVhckRvY3VtZW50KCk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RF
VklDRV9BREFQVEFUSU9OKQotICAgIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyLT5jbGVhckRvY3Vt
ZW50KCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZlcj4qKQotewotICAgIC8vIExvb2sgZm9yIGNh
Y2hlIGVudHJpZXMgY29udGFpbmluZyBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggYSBzaW5nbGUg
cmVmIGFuZCByZW1vdmUgdGhlbS4KLSAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBhbiBlbGVt
ZW50IGF0dHJpYnV0ZSBtdXRhdGlvbiBjYXVzZXMgaXQgdG8gZ2VuZXJhdGUgYSBuZXcgaW5saW5l
U3R5bGUoKQotICAgIC8vIG9yIHByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCksIHBvdGVudGlh
bGx5IGxlYXZpbmcgdGhpcyBjYWNoZSB3aXRoIHRoZSBsYXN0IHJlZiBvbiB0aGUgb2xkIG9uZS4K
LSAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiB0b1JlbW92ZTsKLSAgICBNYXRjaGVkUHJvcGVydGll
c0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5iZWdpbigpOwot
ICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGVuZCA9IG1fbWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZS5lbmQoKTsKLSAgICBmb3IgKDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcz4mIG1hdGNoZWRQcm9wZXJ0aWVzID0gaXQtPnZhbHVl
Lm1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobWF0Y2hlZFByb3Bl
cnRpZXNbaV0ucHJvcGVydGllcy0+aGFzT25lUmVmKCkpIHsKLSAgICAgICAgICAgICAgICB0b1Jl
bW92ZS5hcHBlbmQoaXQtPmtleSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b1JlbW92
ZS5zaXplKCk7ICsraSkKLSAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLnJlbW92ZSh0
b1JlbW92ZVtpXSk7Ci0KLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5j
ZUxhc3RTd2VlcCA9IDA7CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAgICAgICAgcmV0dXJu
OworICAgIG1fbWF0Y2hlZFJ1bGVzLT5jbGVhcigpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5
bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5r
TWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQor
aW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6ZW5zdXJlUnVs
ZUxpc3QoKQogewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRp
ZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7
Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5
U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlu
a01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdo
aXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsK
KyAgICBpZiAoIW1fcnVsZUxpc3QpCisgICAgICAgIG1fcnVsZUxpc3QgPSBTdGF0aWNDU1NSdWxl
TGlzdDo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7CiB9CiAKLWlubGlu
ZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXND
YWNoZWFibGUpCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6YWRkRWxlbWVudFN0
eWxlUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBp
c0NhY2hlYWJsZSkKIHsKICAgICBpZiAoIXByb3BlcnR5U2V0KQogICAgICAgICByZXR1cm47Ci0g
ICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQot
ICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNl
dCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JS
dWxlID09IC0xKQorICAgICAgICBtX3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID0gbV9y
ZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOworICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKHByb3BlcnR5U2V0KTsKICAgICBpZiAoIWlzQ2FjaGVhYmxlKQotICAgICAgICByZXN1
bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICAgICAgbV9yZXN1bHQuaXNDYWNoZWFibGUgPSBm
YWxzZTsKIH0KIAogY2xhc3MgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgewpAQCAtNDU2LDEyICsxMzcs
MTIgQEAgaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0YwogCiBib29sIE1h
dGNoaW5nVUFSdWxlc1Njb3BlOjptX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwogCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0
Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0
b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0
LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsKICAgICBBU1NFUlQobWF0
Y2hSZXF1ZXN0LnJ1bGVTZXQpOwogICAgIEFTU0VSVChtX3N0YXRlLmVsZW1lbnQoKSk7CiAKLSAg
ICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7CiAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQo
KTsKICAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVk
RWxlbWVudCgpOwogICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5z
aGFkb3dQc2V1ZG9JZCgpOwpAQCAtNDgyLDcgKzE2Myw3IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6
Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01h
dGNoaW5nVUFSdWxlcygpCiAgICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVz
KCkKICAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3Bl
LT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhh
dmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkK
KyAgICAgICAgJiYgbV9iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2Vz
Tm90Q3Jvc3NCb3VuZGFyeSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLy8gV2UgbmVlZCB0byBj
b2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2Ug
aW50byBhIGJ1ZmZlciBhbmQKQEAgLTUwMiwxNSArMTgzLDE1IEBAIHZvaWQgU3R5bGVSZXNvbHZl
cjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qo
bWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnVuaXZlcnNhbFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
clJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxl
UmFuZ2UpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
clJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgU3R5bGVSZXNvbHZlcjo6
UnVsZVJhbmdlJiBydWxlUmFuZ2UpCiB7Ci0gICAgaWYgKCFtX3N0YXRlLnJlZ2lvbkZvclN0eWxp
bmcoKSkKKyAgICBpZiAoIW1fcmVnaW9uRm9yU3R5bGluZykKICAgICAgICAgcmV0dXJuOwogCiAg
ICAgdW5zaWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLnNpemUoKTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsg
KytpKSB7CiAgICAgICAgIGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciA9IG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVj
dG9yOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxlY3Rvciwgc3Rh
dGljX2Nhc3Q8RWxlbWVudCo+KG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpLT5ub2RlKCkpKSkg
eworICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihyZWdpb25TZWxlY3Rvciwgc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG1fcmVnaW9uRm9yU3R5bGluZy0+bm9kZSgpKSkpIHsKICAgICAgICAg
ICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKICAgICAgICAgICAgIEFT
U0VSVChyZWdpb25SdWxlcyk7CiAgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRj
aFJlcXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0
Y2hSZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKQEAgLTUxOCwxOCArMTk5LDE5IEBAIHZvaWQg
U3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICB9CiB9CiAKLXZvaWQgU3R5
bGVSZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1
bHQpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVs
ZXMoKQogewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgVmVjdG9yPGNvbnN0IFJ1
bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSBzdGF0ZS5tYXRjaGVkUnVsZXMoKTsKLSAgICBp
ZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKCFtX21hdGNoZWRSdWxlcyB8fCBtX21hdGNo
ZWRSdWxlcy0+aXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICBzb3J0TWF0Y2hlZFJ1
bGVzKCk7CiAKLSAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVj
dGluZ1J1bGVzKSB7CisgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVs
ZXMgPSAqbV9tYXRjaGVkUnVsZXM7CisgICAgaWYgKG1fbW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6
OkNvbGxlY3RpbmdSdWxlcykgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0
Y2hlZFJ1bGVzLnNpemUoKTsgKytpKQotICAgICAgICAgICAgc3RhdGUuZW5zdXJlUnVsZUxpc3Qo
KS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVzW2ldLT5ydWxlKCktPmNyZWF0ZUNTU09NV3Jh
cHBlcigpKTsKKyAgICAgICAgICAgIGVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1h
dGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAKQEAgLTUzNywxMSArMjE5LDExIEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6
c29ydEFuZFRyYW5zZmVyTWF0Y2gKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hl
ZFJ1bGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpICYmIG1hdGNo
ZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0dHJpYnV0ZVNlbGVjdG9yKCkpCiAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAgICAgYWRkTWF0Y2hlZFByb3Bl
cnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRj
aGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1h
dGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOworICAgICAgICBtX3Jlc3Vs
dC5hZGRNYXRjaGVkUHJvcGVydGllcyhtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGll
cygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hU
eXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOwogICAgIH0K
IH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29s
bGVjdG9yOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCiB7
CiAjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCiAgICAgaWYg
KCFtX3Njb3BlUmVzb2x2ZXIpCkBAIC01NTMsOCArMjM1LDggQEAgdm9pZCBTdHlsZVJlc29sdmVy
OjptYXRjaFNjb3BlZEF1dGhvclJ1bAogICAgICAgICBib29sIGRvY3VtZW50U2NvcGUgPSB0cnVl
OwogICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6
ZSgpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2NvcGVTaXplOyArK2kpIHsK
LSAgICAgICAgICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgICAg
IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMTsKKyAgICAgICAgICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CisgICAgICAgICAg
ICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxOwogCiAgICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6
OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7CiAg
ICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29w
ZS0+aXNJblNoYWRvd1RyZWUoKTsKQEAgLTU2NywzNiArMjQ5LDI2IEBAIHZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hTY29wZWRBdXRob3JSdWwKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1
bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBy
ZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgICAgICAgICAgU3R5bGVSZXNvbHZl
cjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2Uo
KTsKICAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKICAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKLSAgICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxl
cyhyZXN1bHQpOworICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CiAg
ICAgICAgIH0KICAgICB9CiAKLSAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKKyAgICBtYXRjaEhvc3RSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcyk7CiAjZWxzZQot
ICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwogICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlS
dWxlcyk7CiAjZW5kaWYKIH0KIAotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFy
aW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpCi17Ci0jaWYgRU5BQkxFKFNIQURPV19ET00p
Ci0gICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlciAmJiBtX3Njb3BlUmVzb2x2ZXItPnN0eWxlU2hh
cmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCkpOwotI2Vsc2UK
LSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRj
aEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQor
dm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hIb3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcykKIHsKICNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKICAgICBBU1NFUlQobV9zY29wZVJl
c29sdmVyKTsKIAotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1
bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDE7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwogCiAg
ICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7CiAgICAgbV9zY29wZVJlc29sdmVyLT5t
YXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKQEAgLTYwNCw4
OCArMjc2LDE1NiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoCiAg
ICAgICAgIHJldHVybjsKIAogICAgIGZvciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXpl
KCk7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5y
YW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5n
ZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CiAgICAgICAg
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChtYXRjaGVkUnVsZXMuYXQoaS0xKSwg
aW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgpKSwgcnVsZVJhbmdlKTsKICAgICB9
Ci0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgc29ydEFuZFRy
YW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CiAjZWxzZQotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwog
ICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7CiAjZW5kaWYKIH0KIAotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wg
aW5jbHVkZUVtcHR5UnVsZXMpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCitpbmxpbmUgdm9pZCBF
bGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTaGFkb3dEaXN0cmlidXRlZFJ1bGVzKGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYgcnVsZVJhbmdlKQorewor
ICAgIGlmIChtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIFRlbXBvcmFyeUNoYW5nZTxib29sPiBjYW5Vc2VGYXN0UmVq
ZWN0KG1fY2FuVXNlRmFzdFJlamVjdCwgZmFsc2UpOworICAgIFRlbXBvcmFyeUNoYW5nZTxTZWxl
Y3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeT4gYmVoYXZpb3JBdEJvdW5kYXJ5KG1fYmVo
YXZpb3JBdEJvdW5kYXJ5LCBTZWxlY3RvckNoZWNrZXI6OkNyb3NzZXNCb3VuZGFyeSk7CisKKyAg
ICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOworICAgIG1fcnVsZVNldHMuc2hh
ZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1
bGVzLCBtYXRjaFJlcXVlc3RzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVx
dWVzdHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVx
dWVzdHNbaV0sIHJ1bGVSYW5nZSk7Cit9CisjZW5kaWYKKwordm9pZCBFbGVtZW50UnVsZUNvbGxl
Y3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQogewotICAgIG1f
c3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRo
b3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgY2xlYXJN
YXRjaGVkUnVsZXMoKTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwogCiAgICAgaWYgKCFtX3N0YXRlLmVs
ZW1lbnQoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBy
dWxlcy4KICAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5
bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1
bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5n
ZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CiAgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKICNpZiBFTkFC
TEUoU0hBRE9XX0RPTSkKLSAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOwot
ICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVl
c3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIGNvbGxlY3RNYXRj
aGluZ1J1bGVzKG1hdGNoUmVxdWVzdHNbaV0sIHJ1bGVSYW5nZSk7CisgICAgbWF0Y2hTaGFkb3dE
aXN0cmlidXRlZFJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzLCBydWxlUmFuZ2UpOwogI2VuZGlmCisg
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CiAKLSAgICBzb3J0QW5kVHJhbnNmZXJN
YXRjaGVkUnVsZXMocmVzdWx0KTsKLQotICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0
LCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhpbmNsdWRl
RW1wdHlSdWxlcyk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0
Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3ZvaWQgRWxlbWVudFJ1
bGVDb2xsZWN0b3I6Om1hdGNoVXNlclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCiB7CiAg
ICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQogICAgICAgICByZXR1cm47CiAgICAgCi0g
ICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIGNsZWFyTWF0Y2hlZFJ1bGVz
KCk7CiAKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOworICAgIG1fcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSBt
X3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwogICAgIE1hdGNoUmVxdWVzdCBt
YXRjaFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwot
ICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsK
KyAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlID0gbV9yZXN1bHQucmFuZ2Vz
LnVzZXJSdWxlUmFuZ2UoKTsKICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3Qs
IHJ1bGVSYW5nZSk7CiAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwogCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3Vs
dCk7CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7Cit9CisKK3ZvaWQgRWxlbWVu
dFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcygpCit7CisgICAgTWF0Y2hpbmdVQVJ1bGVzU2Nv
cGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFn
ZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRT
dHlsZVNoZWV0KQorICAgICAgICBtX3Jlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOworICAgIFJ1
bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX2lzUHJpbnRTdHlsZQorICAgICAgICA/IENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OmRlZmF1bHRTdHlsZTsKKyAgICBtYXRjaFVBUnVsZXModXNlckFnZW50U3R5bGVTaGVl
dCk7CisKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVp
cmtzIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgp
KQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVp
cmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMg
KGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRj
aCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVldC4KKyAgICBpZiAoZG9jdW1l
bnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAgICAgIG1hdGNoVUFSdWxlcyhDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpt
YXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgUnVsZVNldCogcnVsZXMpCit2b2lkIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFVBUnVsZXMoUnVsZVNldCogcnVsZXMpCiB7Ci0gICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7
CiAgICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5n
ZXMuVUFSdWxlUmFuZ2UoKTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSA9IG1fcmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVs
ZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOwogICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7CiAKLSAg
ICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNm
ZXJNYXRjaGVkUnVsZXMoKTsKK30KKworaW5saW5lIGJvb2wgRWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVyTm9k
ZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvKQoreworICAgIGNvbnN0IFN0eWxlUmVz
b2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAocnVsZURhdGEuaGFzRmFz
dENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKKyAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9y
IGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KKyAgICAgICAgaWYgKG1fcHNl
dWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkICE9IE5PUFNFVURPKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUg
cGFydCBzZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhl
IHJ1bGUgaGFzaC4KKyAgICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3
ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2UuCisgICAgICAgIGlmIChydWxlRGF0
YS5oYXNSaWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0
YXRlLmVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoIXJ1bGVE
YXRhLmhhc011bHRpcGFydFNlbGVjdG9yKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0g
Q1NTU2VsZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVs
ZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hl
Y2tlckZhc3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAg
ICAgIGlmICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0
ZVNlbGVjdG9yKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJu
IHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsKKyAgICB9CisKKyAgICAvLyBTbG93
IHBhdGguCisgICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBt
X21vZGUpOworICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29u
dGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tl
cjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7CisgICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0
ZS5zdHlsZSgpOworICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVk
b0lkID0gbV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQ7CisgICAgY29udGV4dC5zY3JvbGxi
YXIgPSBtX3BzZXVkb1N0eWxlUmVxdWVzdC5zY3JvbGxiYXI7CisgICAgY29udGV4dC5zY3JvbGxi
YXJQYXJ0ID0gbV9wc2V1ZG9TdHlsZVJlcXVlc3Quc2Nyb2xsYmFyUGFydDsKKyAgICBjb250ZXh0
LmJlaGF2aW9yQXRCb3VuZGFyeSA9IG1fYmVoYXZpb3JBdEJvdW5kYXJ5OworICAgIFNlbGVjdG9y
Q2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29udGV4dCwgZHlu
YW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOworICAgIGlmIChtYXRj
aCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIGlmIChtX3BzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCAhPSBOT1BTRVVETyAm
JiBtX3BzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCAhPSBkeW5hbWljUHNldWRvKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1
bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFu
Z2UpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxp
c3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0
Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKIHsKICAgICBp
ZiAoIXJ1bGVzKQogICAgICAgICByZXR1cm47CiAKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZv
ciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29s
dmUuCi0gICAgLy8gQW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0
ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRoLgotICAgIGJvb2wg
Y2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3Rl
bnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5
ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnk7CisgICAgY29uc3QgU3R5
bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKIAogICAgIHVuc2lnbmVkIHNpemUg
PSBydWxlcy0+c2l6ZSgpOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kp
IHsKICAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0KGkpOwotICAg
ICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RT
ZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2Vu
ZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKKyAgICAgICAgaWYgKG1fY2FuVXNlRmFz
dFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6
bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRp
Zmllckhhc2hlcygpKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIFN0eWxlUnVs
ZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVs
ZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVs
ZShkb2N1bWVudCgpLCBydWxlLCBtX2luc3BlY3RvckNTU09NV3JhcHBlcnMsIGRvY3VtZW50KCkt
PnN0eWxlU2hlZXRDb2xsZWN0aW9uKCkpOwogICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRv
ID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1
ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5
KSkgeworICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVxdWVzdC5zY29w
ZSwgZHluYW1pY1BzZXVkbykpIHsKICAgICAgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBw
cm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUu
CiAgICAgICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+
cHJvcGVydGllcygpOwogICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVz
LT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcykpIHsKQEAgLTY5
MywxNCArNDMzLDE0IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMK
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8v
IEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5kYXJkIGdldE1hdGNoZWRDU1NSdWxlcyBBUEkg
dG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5lZWRlZC4KLSAgICAgICAgICAgIGlm
IChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJp
dHlPcmlnaW4oKSkgeworICAgICAgICAgICAgaWYgKG1fc2FtZU9yaWdpbk9ubHkgJiYgIXJ1bGVE
YXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgewogICAgICAgICAgICAgICAgIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwogICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWYgd2Un
cmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCiAgICAgICAgICAg
ICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCi0gICAgICAgICAg
ICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVl
c3QoKS5wc2V1ZG9JZCA9PSBOT1BTRVVETykgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5t
b2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICAgICAgICAg
IGlmIChkeW5hbWljUHNldWRvICE9IE5PUFNFVURPICYmIG1fcHNldWRvU3R5bGVSZXF1ZXN0LnBz
ZXVkb0lkID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fbW9kZSA9PSBTZWxl
Y3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewogICAgICAgICAgICAgICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKICAgICAg
ICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzEzLDcgKzQ1
Myw3IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICAgICAg
ICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxl
SW5kZXg7CiAKICAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9m
IG1hdGNoZWQgcnVsZXMuCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVsZSgm
cnVsZURhdGEpOworICAgICAgICAgICAgICAgIGFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7CiAg
ICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29v
a2llLCB0cnVlKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAg
LTcyOSw0NDU5ICs0NjksNjkgQEAgc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxlcyhjb25z
dCBSdQogICAgIHJldHVybiAoc3BlY2lmaWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9z
aXRpb24oKSA8IHIyLT5wb3NpdGlvbigpIDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOwog
fQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRNYXRjaGVkUnVsZXMoKQordm9pZCBFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcygpCiB7Ci0gICAgc3RkOjpzb3J0KG1fc3Rh
dGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwg
Y29tcGFyZVJ1bGVzKTsKKyAgICBBU1NFUlQobV9tYXRjaGVkUnVsZXMpOworICAgIHN0ZDo6c29y
dChtX21hdGNoZWRSdWxlcy0+YmVnaW4oKSwgbV9tYXRjaGVkUnVsZXMtPmVuZCgpLCBjb21wYXJl
UnVsZXMpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCit2b2lkIEVsZW1lbnRSdWxl
Q29sbGVjdG9yOjptYXRjaEFsbFJ1bGVzKGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzLCBi
b29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKIHsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0KTsK
KyAgICBtYXRjaFVBUnVsZXMoKTsKIAogICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1
bGVzLgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hV
c2VyUnVsZXMocmVzdWx0LCBmYWxzZSk7CisgICAgaWYgKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxl
cykKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZmFsc2UpOwogCiAgICAgLy8gTm93IGNoZWNrIGF1
dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGggcHJlc2VudGF0aW9uYWwgYXR0cmlidXRl
cyBtYXBwZWQgZnJvbSBIVE1MLgogICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkgewot
ICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRF
bGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworICAgICAgICBhZGRFbGVt
ZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25B
dHRyaWJ1dGVTdHlsZSgpKTsKIAogICAgICAgICAvLyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBt
YXBwZWQgZGVjbGFyYXRpb25zLgogICAgICAgICAvLyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNo
YXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFwcGxpZWQKICAgICAg
ICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBl
bmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KLSAgICAgICAgYWRkRWxl
bWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRp
dGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisgICAgICAgIGFkZEVsZW1lbnRT
dHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50
YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKIAogICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewogICAgICAgICAgICAgYm9vbCBpc0F1dG87CiAgICAg
ICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0b0hUTUxFbGVtZW50KG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9uYWxpdHlJZmhhc0RpckF1dG9BdHRyaWJ1dGUo
aXNBdXRvKTsKICAgICAgICAgICAgIGlmIChpc0F1dG8pCi0gICAgICAgICAgICAgICAgYWRkTWF0
Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0ZXh0RGlyZWN0aW9uID09IExUUiA/IGxlZnRUb1JpZ2h0
RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKSk7CisgICAgICAgICAgICAg
ICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXModGV4dERpcmVjdGlvbiA9PSBMVFIgPyBs
ZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOwogICAg
ICAgICB9CiAgICAgfQogICAgIAogICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hl
ZXRzIG5leHQuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBt
YXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2UpOworICAgIGlmIChtYXRjaEF1dGhvckFuZFVz
ZXJTdHlsZXMpCisgICAgICAgIG1hdGNoQXV0aG9yUnVsZXMoZmFsc2UpOwogCiAgICAgLy8gTm93
IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgotICAgIGlmIChtX21hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgeworICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJT
dHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlubGluZVN0eWxlKCkpIHsKICAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJs
ZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCiAgICAgICAgIC8vIEZJWE1F
OiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBj
YWNoaW5nLgogICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKICAgICAgICAgLy8gRklYTUU6IENvbnN0
aWZ5LgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOwor
ICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsKICAgICB9CiAKICNpZiBF
TkFCTEUoU1ZHKQogICAgIC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHls
ZS4KLSAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1fbWF0Y2hBdXRob3JBbmRVc2Vy
U3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhy
ZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkt
PmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAqLyk7
CisgICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtYXRjaEF1dGhvckFuZFVzZXJTdHls
ZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmlzU1ZHRWxlbWVudCgpKQorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHN0YXRp
Y19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01J
TFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAqLyk7CiAjZWxzZQogICAg
IFVOVVNFRF9QQVJBTShpbmNsdWRlU01JTFByb3BlcnRpZXMpOwogI2VuZGlmCiB9CiAKLWJvb2wg
U3R5bGVSZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0
U3RyaW5nJiBjbGFzc05hbWVzKSBjb25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBjbGFzc05hbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX3J1bGVTZXRzLmZlYXR1
cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NOYW1lc1tpXS5pbXBsKCkpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW5s
aW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRFbGVtZW50KEVsZW1lbnQqIGUpCi17
Ci0gICAgbV9lbGVtZW50ID0gZTsKLSAgICBtX3N0eWxlZEVsZW1lbnQgPSBlICYmIGUtPmlzU3R5
bGVkRWxlbWVudCgpID8gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KGUpIDogMDsKLSAgICBt
X2VsZW1lbnRMaW5rU3RhdGUgPSBlID8gZS0+ZG9jdW1lbnQoKS0+dmlzaXRlZExpbmtTdGF0ZSgp
LT5kZXRlcm1pbmVMaW5rU3RhdGUoZSkgOiBOb3RJbnNpZGVMaW5rOwotfQotCi1pbmxpbmUgdm9p
ZCBTdHlsZVJlc29sdmVyOjppbml0RWxlbWVudChFbGVtZW50KiBlKQotewotICAgIGlmIChtX3N0
YXRlLmVsZW1lbnQoKSAhPSBlKSB7Ci0gICAgICAgIG1fc3RhdGUuaW5pdEVsZW1lbnQoZSk7Ci0g
ICAgICAgIGlmIChlICYmIGUgPT0gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpIHsK
LSAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNldERpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVt
ZW50KGZhbHNlKTsKLSAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNldFdyaXRpbmdNb2RlU2V0
T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxpbmUg
dm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCog
ZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgY29uc3QgUHNl
dWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclJlZ2lvbiogcmVnaW9u
Rm9yU3R5bGluZykKLXsKLSAgICBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHBzZXVkb1N0eWxlUmVx
dWVzdDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOwotCi0gICAg
aWYgKGUpIHsKLSAgICAgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dChlKTsKLSAgICAg
ICAgbV9wYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUo
KTsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRhbmNl
KCkgPyAwIDoKLSAgICAgICAgICAgIHBhcmVudFN0eWxlID8gcGFyZW50U3R5bGUgOgotICAgICAg
ICAgICAgbV9wYXJlbnROb2RlID8gbV9wYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpIDogMDsKLSAg
ICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBjb250ZXh0Lmluc2VydGlvblBv
aW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICAgICAg
bV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOwotICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludCA9IGZhbHNlOwotICAgIH0KLQotICAgIE5vZGUqIGRvY0VsZW1lbnQgPSBlID8g
ZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgOiAwOwotICAgIFJlbmRlclN0eWxlKiBk
b2NTdHlsZSA9IGRvY3VtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIG1fcm9vdEVsZW1lbnRTdHls
ZSA9IGRvY0VsZW1lbnQgJiYgZSAhPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVyU3R5
bGUoKSA6IGRvY1N0eWxlOwotCi0gICAgbV9zdHlsZSA9IDA7Ci0gICAgbV9wZW5kaW5nSW1hZ2VQ
cm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0gICAgbV9mb250RGlydHkg
PSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaFRocmVzaG9s
ZCA9IDEwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xk
ID0gMTA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5n
KGNvbnN0IEVsZW1lbnQqIHBhcmVudEVsZW1lbnQpCi17Ci0gICAgaWYgKCFwYXJlbnRFbGVtZW50
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHBhcmVudEVsZW1lbnQtPmhhc0Zs
YWdzU2V0RHVyaW5nU3R5bGluZ09mQ2hpbGRyZW4oKTsKLX0KLQotTm9kZSogU3R5bGVSZXNvbHZl
cjo6bG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9k
ZUNvdW50KSBjb25zdAotewotICAgIGlmICh2aXNpdGVkTm9kZUNvdW50ID49IGNTdHlsZVNlYXJj
aFRocmVzaG9sZCAqIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkKQotICAgICAgICByZXR1cm4g
MDsKLSAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3R5bGVkRWxlbWVudCogcCA9IHN0YXRpY19jYXN0PFN0
eWxlZEVsZW1lbnQqPihwYXJlbnQpOwotICAgIGlmIChwLT5pbmxpbmVTdHlsZSgpKQotICAgICAg
ICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChwLT5pc1NWR0VsZW1lbnQoKSAm
JiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4ocCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGll
cygpKQotICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIGlmIChwLT5oYXNJRCgpICYmIG1f
cnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHAtPmlkRm9yU3R5bGVSZXNv
bHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSZW5kZXJTdHlsZSog
cGFyZW50U3R5bGUgPSBwLT5yZW5kZXJTdHlsZSgpOwotICAgIHVuc2lnbmVkIHN1YmNvdW50ID0g
MDsKLSAgICBOb2RlKiB0aGlzQ291c2luID0gcDsKLSAgICBOb2RlKiBjdXJyZW50Tm9kZSA9IHAt
PnByZXZpb3VzU2libGluZygpOwotCi0gICAgLy8gUmVzZXJ2ZSB0aGUgdHJpZXMgZm9yIHRoaXMg
bGV2ZWwuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMgc3VyZSB0aGF0IHRoZSBhbGdvcml0aG0KLSAg
ICAvLyB3aWxsIG5ldmVyIGdvIGRlZXBlciB0aGFuIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xk
IGxldmVscyBpbnRvIHJlY3Vyc2lvbi4KLSAgICB2aXNpdGVkTm9kZUNvdW50ICs9IGNTdHlsZVNl
YXJjaFRocmVzaG9sZDsKLSAgICB3aGlsZSAodGhpc0NvdXNpbikgewotICAgICAgICB3aGlsZSAo
Y3VycmVudE5vZGUpIHsKLSAgICAgICAgICAgICsrc3ViY291bnQ7Ci0gICAgICAgICAgICBpZiAo
Y3VycmVudE5vZGUtPnJlbmRlclN0eWxlKCkgPT0gcGFyZW50U3R5bGUgJiYgY3VycmVudE5vZGUt
Pmxhc3RDaGlsZCgpCi0gICAgICAgICAgICAgICAgJiYgY3VycmVudE5vZGUtPmlzRWxlbWVudE5v
ZGUoKSAmJiAhcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyh0b0VsZW1lbnQoY3VycmVudE5v
ZGUpKQotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgICAgICAgICAgICAgICYmICF0b0VsZW1l
bnQoY3VycmVudE5vZGUpLT5zaGFkb3coKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB1bnVzZWQgcmVzZXJ2ZWQgdHJpZXMuCi0gICAg
ICAgICAgICAgICAgdmlzaXRlZE5vZGVDb3VudCAtPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgLSBz
dWJjb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGUtPmxhc3RDaGlsZCgp
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1YmNvdW50ID49IGNTdHlsZVNlYXJj
aFRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGN1cnJl
bnROb2RlID0gY3VycmVudE5vZGUtPnByZXZpb3VzU2libGluZygpOwotICAgICAgICB9Ci0gICAg
ICAgIGN1cnJlbnROb2RlID0gbG9jYXRlQ291c2luTGlzdCh0aGlzQ291c2luLT5wYXJlbnRFbGVt
ZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOwotICAgICAgICB0aGlzQ291c2luID0gY3VycmVudE5v
ZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCogcnVsZVNldCkKK2Jvb2wg
RWxlbWVudFJ1bGVDb2xsZWN0b3I6Omhhc0FueU1hdGNoaW5nUnVsZXMoUnVsZVNldCogcnVsZVNl
dCkKIHsKLSAgICBpZiAoIXJ1bGVTZXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtX3N0
YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKIAot
ICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxlcyk7CisgICAg
bV9tb2RlID0gU2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXM7CiAgICAgaW50IGZpcnN0UnVs
ZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
KGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxl
UmFuZ2UgcnVsZVJhbmdlKGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7Ci0gICAg
bV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOwotICAgIGlm
IChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVk
RWxlbWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0
YXRlOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50
b0lucHV0RWxlbWVudCgpOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIG90aGVySW5wdXRFbGVtZW50
ID0gc3RhdGUuZWxlbWVudCgpLT50b0lucHV0RWxlbWVudCgpOwotCi0gICAgaWYgKCF0aGlzSW5w
dXRFbGVtZW50IHx8ICFvdGhlcklucHV0RWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0gb3RoZXJJbnB1dEVs
ZW1lbnQtPmVsZW1lbnREYXRhKCkpIHsKLSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZh
c3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0
cmlidXRlKHR5cGVBdHRyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYg
KHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhl
cklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpKQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1
dG9maWxsZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hl
Y2tlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNJbmRldGVybWlu
YXRlKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBv
dGhlcklucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoZWxlbWVudC0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50
KCktPmlzRW5hYmxlZEZvcm1Db250cm9sKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChlbGVtZW50LT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3RhdGUuZWxlbWVudCgp
LT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChzdGF0ZS5kb2N1bWVudCgpLT5jb250YWluc1ZhbGlkaXR5U3R5bGVSdWxlcygpKSB7Ci0g
ICAgICAgIGJvb2wgd2lsbFZhbGlkYXRlID0gZWxlbWVudC0+d2lsbFZhbGlkYXRlKCk7Ci0KLSAg
ICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndpbGxWYWxpZGF0ZSgp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICh3aWxsVmFsaWRhdGUg
JiYgKGVsZW1lbnQtPmlzVmFsaWRGb3JtQ29udHJvbEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50
KCktPmlzVmFsaWRGb3JtQ29udHJvbEVsZW1lbnQoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQtPmlzSW5SYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNJblJhbmdlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYg
KGVsZW1lbnQtPmlzT3V0T2ZSYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNPdXRPZlJhbmdl
KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhFbGVtZW50
KiBlbGVtZW50KQotewotICAgIC8vIEZJWE1FOiBUaGlzIGxpbmUgaXMgc3VycHJpc2luZ2x5IGhv
dCwgd2UgbWF5IHdpc2ggdG8gaW5saW5lIGhhc0RpcmVjdGlvbkF1dG8gaW50byBTdHlsZVJlc29s
dmVyLgotICAgIHJldHVybiBlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgdG9IVE1MRWxlbWVu
dChlbGVtZW50KS0+aGFzRGlyZWN0aW9uQXV0bygpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6
OnNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5
bGVkRWxlbWVudCogc2hhcmluZ0NhbmRpZGF0ZSkgY29uc3QKLXsKLSAgICBjb25zdCBTdGF0ZSYg
c3RhdGUgPSBtX3N0YXRlOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmVsZW1lbnREYXRhKCkg
PT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZWxlbWVudERhdGEoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFu
Z0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6Omxh
bmdBdHRyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCkt
PmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRB
dHRyaWJ1dGUobGFuZ0F0dHIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIXN0
YXRlLmVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygpKSB7Ci0gICAgICAgIGlmIChzaGFyaW5n
Q2FuZGlkYXRlLT5oYXNDbGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc2hhcmlu
Z0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICB9IGVsc2UgaWYgKHNoYXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkpIHsKLSNpZiBFTkFCTEUo
U1ZHKQotICAgICAgICAvLyBTVkcgZWxlbWVudHMgcmVxdWlyZSBhIChzbG93ISkgZ2V0QXR0cmli
dXRlIGNvbXBhcmlzaW9uIGJlY2F1c2UgImNsYXNzIiBpcyBhbiBhbmltYXRhYmxlIGF0dHJpYnV0
ZSBmb3IgU1ZHLgotICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkg
ewotICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0
cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotI2VuZGlmCi0gICAgICAg
ICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkgIT0gc2hhcmluZ0NhbmRpZGF0
ZS0+Y2xhc3NOYW1lcygpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSNpZiBFTkFC
TEUoU1ZHKQotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmli
dXRlU3R5bGUoKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHls
ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVO
VCkKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5oYXNUYWdOYW1lKHByb2dyZXNzVGFnKSkgewot
ICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHN0YXRlLmVsZW1l
bnQoKSktPmlzRGV0ZXJtaW5hdGUoKSAhPSBzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50
Kj4oc2hhcmluZ0NhbmRpZGF0ZSktPmlzRGV0ZXJtaW5hdGUoKSkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiB0cnVlOwotfQogCi1ib29sIFN0
eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50KiBlbGVt
ZW50KSBjb25zdAotewotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IGVsZW1lbnQtPnJlbmRlclN0
eWxlKCk7Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIGlmICghc3R5
bGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT5oYXNVbmlxdWVQc2V1ZG9TdHlsZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPnRhZ1FOYW1lKCkgIT0g
c3RhdGUuZWxlbWVudCgpLT50YWdRTmFtZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKGVsZW1lbnQtPmlubGluZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
ZiAoZWxlbWVudC0+bmVlZHNTdHlsZVJlY2FsYygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0j
aWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZWxlbWVudC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGlj
X2Nhc3Q8U1ZHRWxlbWVudCo+KGVsZW1lbnQpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgaWYgKGVsZW1lbnQtPmlzTGlu
aygpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoZWxlbWVudC0+aG92ZXJlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aG92ZXJlZCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmFjdGl2ZSgpICE9IHN0
YXRlLmVsZW1lbnQoKS0+YWN0aXZlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAo
ZWxlbWVudC0+Zm9jdXNlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+Zm9jdXNlZCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCkgIT0gc3Rh
dGUuZWxlbWVudCgpLT5zaGFkb3dQc2V1ZG9JZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxT
dHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoZWxlbWVudC0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkg
IT0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRl
U3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGVsZW1lbnQtPmhhc0lE
KCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoZWxlbWVudC0+
aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgaWYgKGVsZW1lbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgc2hhcmUgc3R5bGUgZm9yIG9wdGlv
biBhbmQgb3B0Z3JvdXAgd2hlbmV2ZXIgcG9zc2libGUuCi0gICAgLy8gQmVmb3JlIGRvaW5nIHNv
LCB3ZSBuZWVkIHRvIHJlc29sdmUgaXNzdWVzIGluIEhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNM
aXN0SXRlbXMKLSAgICAvLyBhbmQgUmVuZGVyTWVudUxpc3Q6OnNldFRleHQuIFNlZSBhbHNvIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODQwNQotICAgIGlmIChlbGVt
ZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvcHRncm91
cFRhZykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgaXNDb250cm9sID0gZWxl
bWVudC0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKTsKLQotICAgIGlmIChpc0NvbnRyb2wgIT0gc3Rh
dGUuZWxlbWVudCgpLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAoaXNDb250cm9sICYmICFjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woZWxl
bWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdHlsZS0+dHJhbnNpdGlv
bnMoKSB8fCBzdHlsZS0+YW5pbWF0aW9ucygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgLy8gVHVybiBvZmYgc3R5bGUgc2hh
cmluZyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2FpbiBsYXllcnMgZm9yIHJlYXNvbnMgb3V0c2lk
ZSBvZiB0aGUgc3R5bGUgc3lzdGVtLgotICAgIC8vIFNlZSBjb21tZW50cyBpbiBSZW5kZXJPYmpl
Y3Q6OnNldFN0eWxlKCkuCi0gICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSB8
fCBlbGVtZW50LT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGVt
YmVkVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9iamVjdFRhZykgfHwgZWxlbWVudC0+aGFz
VGFnTmFtZShhcHBsZXRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoY2FudmFzVGFnKQotI2lm
IEVOQUJMRShQTFVHSU5fUFJPWFlfRk9SX1ZJREVPKQotICAgICAgICAvLyBXaXRoIHByb3h5aW5n
LCB0aGUgbWVkaWEgZWxlbWVudHMgYXJlIGJhY2tlZCBieSBhIFJlbmRlckVtYmVkZGVkT2JqZWN0
LgotICAgICAgICB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKHZpZGVvVGFnKSB8fCBlbGVtZW50LT5o
YXNUYWdOYW1lKGF1ZGlvVGFnKQotI2VuZGlmCi0gICAgICAgICkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotI2VuZGlmCi0KLSAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oZWxlbWVudCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAmJiBz
dGF0ZS5lbGVtZW50TGlua1N0YXRlKCkgIT0gc3R5bGUtPmluc2lkZUxpbmsoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIC8vIERlbnkgc2hh
cmluZyBzdHlsZXMgYmV0d2VlbiBXZWJWVFQgYW5kIG5vbi1XZWJWVFQgbm9kZXMuCi0gICAgaWYg
KGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRF
bGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc1dl
YlZUVEVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpICYmIHRv
V2ViVlRURWxlbWVudChlbGVtZW50KS0+aXNQYXN0Tm9kZSgpICE9IHRvV2ViVlRURWxlbWVudChz
dGF0ZS5lbGVtZW50KCkpLT5pc1Bhc3ROb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNl
bmRpZgotCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQotICAgIGlmIChlbGVtZW50ID09IGVs
ZW1lbnQtPmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpIHx8IHN0
YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVl
bkVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgcmV0dXJuIHRy
dWU7Ci19Ci0KLWlubGluZSBTdHlsZWRFbGVtZW50KiBTdHlsZVJlc29sdmVyOjpmaW5kU2libGlu
Z0ZvclN0eWxlU2hhcmluZyhOb2RlKiBub2RlLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0Ci17Ci0g
ICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkgewotICAgICAg
ICBpZiAoIW5vZGUtPmlzU3R5bGVkRWxlbWVudCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgIGlmIChjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoc3RhdGljX2Nhc3Q8U3R5bGVkRWxl
bWVudCo+KG5vZGUpKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoY291bnQrKyA9
PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0g
ICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKLX0KLQotUmVuZGVy
U3R5bGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZVNoYXJlZFN0eWxlKCkKLXsKLSAgICBTdGF0ZSYg
c3RhdGUgPSBtX3N0YXRlOwotICAgIGlmICghc3RhdGUuc3R5bGVkRWxlbWVudCgpIHx8ICFzdGF0
ZS5wYXJlbnRTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIElmIHRoZSBlbGVt
ZW50IGhhcyBpbmxpbmUgc3R5bGUgaXQgaXMgcHJvYmFibHkgdW5pcXVlLgotICAgIGlmIChzdGF0
ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiAwOwotI2lm
IEVOQUJMRShTVkcpCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50
KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHN0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFu
aW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQotICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgot
ICAgIC8vIElkcyBzdG9wIHN0eWxlIHNoYXJpbmcgaWYgdGhleSBzaG93IHVwIGluIHRoZSBzdHls
ZXNoZWV0cy4KLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNJRCgpICYmIG1fcnVs
ZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHN0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVu
dEVsZW1lbnQoKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCi0gICAgICAgIHJldHVybiAwOwotICAg
IGlmIChzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhzdGF0ZS5l
bGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8vIENhY2hlIHdoZXRoZXIgc3Rh
dGUuZWxlbWVudCBpcyBhZmZlY3RlZCBieSBhbnkga25vd24gY2xhc3Mgc2VsZWN0b3JzLgotICAg
IC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBhIG1lbWJlciB2YXJpYWJsZS4gVGhlIHN0eWxl
IHNoYXJpbmcgY29kZSBjb3VsZCBiZSBmYWN0b3JlZCBvdXQgb2YgU3R5bGVSZXNvbHZlci4KLSAg
ICBzdGF0ZS5zZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoc3RhdGUuZWxlbWVudCgpICYm
IHN0YXRlLmVsZW1lbnQoKS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVz
KHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygpKSk7Ci0KLSAgICAvLyBDaGVjayBwcmV2aW91
cyBzaWJsaW5ncyBhbmQgdGhlaXIgY291c2lucy4KLSAgICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0g
ICAgdW5zaWduZWQgdmlzaXRlZE5vZGVDb3VudCA9IDA7Ci0gICAgU3R5bGVkRWxlbWVudCogc2hh
cmVFbGVtZW50ID0gMDsKLSAgICBOb2RlKiBjb3VzaW5MaXN0ID0gc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3aGlsZSAoY291c2luTGlzdCkgewotICAgICAg
ICBzaGFyZUVsZW1lbnQgPSBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhjb3VzaW5MaXN0LCBj
b3VudCk7Ci0gICAgICAgIGlmIChzaGFyZUVsZW1lbnQpCi0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY291c2luTGlzdCA9IGxvY2F0ZUNvdXNpbkxpc3QoY291c2luTGlzdC0+cGFyZW50RWxl
bWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGV4
aGF1c3RlZCBhbGwgb3VyIGJ1ZGdldCBvciBvdXIgY291c2lucy4KLSAgICBpZiAoIXNoYXJlRWxl
bWVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDYW4ndCBzaGFyZSBpZiBzaWJsaW5n
IHJ1bGVzIGFwcGx5LiBUaGlzIGlzIGNoZWNrZWQgYXQgdGhlIGVuZCBhcyBpdCBzaG91bGQgcmFy
ZWx5IGZhaWwuCi0gICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1f
cnVsZVNldHMuc2libGluZygpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hh
cmUgaWYgYXR0cmlidXRlIHJ1bGVzIGFwcGx5LgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRh
dGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnVuY29tbW9uQXR0cmlidXRlKCkpKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAvLyBDYW4ndCBzaGFyZSBpZiBAaG9zdCBALXJ1bGVzIGFwcGx5Lgot
ICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIC8vIFRyYWNraW5nIGNoaWxkIGluZGV4IHJlcXVpcmVzIHVuaXF1ZSBz
dHlsZSBmb3IgZWFjaCBub2RlLiBUaGlzIG1heSBnZXQgc2V0IGJ5IHRoZSBzaWJsaW5nIHJ1bGUg
bWF0Y2ggYWJvdmUuCi0gICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUu
ZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1
cm4gc2hhcmVFbGVtZW50LT5yZW5kZXJTdHlsZSgpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0KQotewotICAgIE1hdGNoaW5nVUFSdWxl
c1Njb3BlIHNjb3BlOwotCi0gICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNl
ciBhZ2VudCBzaGVldC4KLSAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZh
dWx0U3R5bGVTaGVldCkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci0gICAg
UnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNw
ZWNpZmljKCJwcmludCIpCi0gICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0
UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOwotICAgIG1h
dGNoVUFSdWxlcyhyZXN1bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQpOwotCi0gICAgLy8gSW4gcXVp
cmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0
LgotICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkKLSAgICAgICAgbWF0Y2hVQVJ1
bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOwot
Ci0gICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291
cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9t
IHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3
U291cmNlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNo
ZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQ
YWdpbmF0aW9uTW9kZShQYWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHls
ZSogc3R5bGUpCi17Ci0gICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246OlVucGFn
aW5hdGVkKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIHN3aXRjaCAocGFnaW5hdGlv
bk1vZGUpIHsKLSAgICBjYXNlIFBhZ2luYXRpb246OkxlZnRUb1JpZ2h0UGFnaW5hdGVkOgotICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAg
IGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8g
Tm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24g
OiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFn
aW5hdGlvbjo6UmlnaHRUb0xlZnRQYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5B
eGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250
YWxXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9u
KHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Np
b24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAg
IHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGlu
Z01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNz
aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpUb3BUb0JvdHRvbVBh
Z2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlz
KTsKLSAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAgICAg
ICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NX
cml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJv
Z3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblBy
b2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBQYWdpbmF0aW9uOjpCb3R0b21Ub1RvcFBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUt
PnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5p
c0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblBy
b2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29s
dW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRv
UmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVt
blByb2dyZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpVbnBh
Z2luYXRlZDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oY29uc3Qg
UmVuZGVyU3R5bGUqIHN0eWxlLCBGb250T3JpZW50YXRpb24mIGZvbnRPcmllbnRhdGlvbiwgTm9u
Q0pLR2x5cGhPcmllbnRhdGlvbiYgZ2x5cGhPcmllbnRhdGlvbikKLXsKLSAgICBpZiAoc3R5bGUt
PmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpIHsKLSAgICAgICAgZm9udE9yaWVudGF0aW9uID0g
SG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50
YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNo
IChzdHlsZS0+dGV4dE9yaWVudGF0aW9uKCkpIHsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblZl
cnRpY2FsUmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOwotICAgICAg
ICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7
Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblVwcmlnaHQ6Ci0gICAg
ICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9u
ID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblVwcmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBj
YXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzOgotICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdN
b2RlKCkgPT0gTGVmdFRvUmlnaHRXcml0aW5nTW9kZSkgewotICAgICAgICAgICAgLy8gRklYTUU6
IFRoaXMgc2hvdWxkIG1hcCB0byBzaWRld2F5cy1sZWZ0LCB3aGljaCBpcyBub3Qgc3VwcG9ydGVk
IHlldC4KLSAgICAgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOwotICAgICAgICAg
ICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0
OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvbnRPcmllbnRhdGlv
biA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9y
aWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgVGV4dE9y
aWVudGF0aW9uU2lkZXdheXNSaWdodDoKLSAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpv
bnRhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25W
ZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7
Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGlj
YWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQs
IENTU0ZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKQotewotICAgIEZyYW1lKiBmcmFtZSA9IGRv
Y3VtZW50LT5mcmFtZSgpOwotCi0gICAgLy8gSFRNTDUgc3RhdGVzIHRoYXQgc2VhbWxlc3MgaWZy
YW1lcyBzaG91bGQgcmVwbGFjZSBkZWZhdWx0IENTUyB2YWx1ZXMKLSAgICAvLyB3aXRoIHZhbHVl
cyBpbmhlcml0ZWQgZnJvbSB0aGUgY29udGFpbmluZyBpZnJhbWUgZWxlbWVudC4gSG93ZXZlciwK
LSAgICAvLyBzb21lIHZhbHVlcyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBkZXNpZ25Nb2RlID0gIm9u
Iikgc3RpbGwgbmVlZCB0bwotICAgIC8vIGJlIHNldCBieSB0aGlzICJkb2N1bWVudCBzdHlsZSIu
Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpOwotICAgIGJvb2wgc2VhbWxlc3NXaXRoUGFyZW50ID0gZG9jdW1lbnQtPnNob3VsZERp
c3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpOwotICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQp
IHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIGlmcmFtZVN0eWxlID0gZG9jdW1lbnQtPnNlYW1sZXNz
UGFyZW50SUZyYW1lKCktPnJlbmRlclN0eWxlKCk7Ci0gICAgICAgIGlmIChpZnJhbWVTdHlsZSkK
LSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPmluaGVyaXRGcm9tKGlmcmFtZVN0eWxlKTsKLSAg
ICB9Ci0KLSAgICAvLyBGSVhNRTogSXQncyBub3QgY2xlYXIgd2hpY2ggdmFsdWVzIGJlbG93IHdl
IHdhbnQgdG8gb3ZlcnJpZGUgaW4gdGhlIHNlYW1sZXNzIGNhc2UhCi0gICAgZG9jdW1lbnRTdHls
ZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgaWYgKCFzZWFtbGVzc1dpdGhQYXJlbnQpIHsKLSAg
ICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UlRMT3JkZXJpbmcoZG9jdW1lbnQtPnZpc3VhbGx5T3Jk
ZXJlZCgpID8gVmlzdWFsT3JkZXIgOiBMb2dpY2FsT3JkZXIpOwotICAgICAgICBkb2N1bWVudFN0
eWxlLT5zZXRab29tKGZyYW1lICYmICFkb2N1bWVudC0+cHJpbnRpbmcoKSA/IGZyYW1lLT5wYWdl
Wm9vbUZhY3RvcigpIDogMSk7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFBhZ2VTY2FsZVRy
YW5zZm9ybShmcmFtZSA/IGZyYW1lLT5mcmFtZVNjYWxlRmFjdG9yKCkgOiAxKTsKLSAgICAgICAg
ZG9jdW1lbnRTdHlsZS0+c2V0TG9jYWxlKGRvY3VtZW50LT5jb250ZW50TGFuZ3VhZ2UoKSk7Ci0g
ICAgfQotICAgIC8vIFRoaXMgb3ZlcnJpZGVzIGFueSAtd2Via2l0LXVzZXItbW9kaWZ5IGluaGVy
aXRlZCBmcm9tIHRoZSBwYXJlbnQgaWZyYW1lLgotICAgIGRvY3VtZW50U3R5bGUtPnNldFVzZXJN
b2RpZnkoZG9jdW1lbnQtPmluRGVzaWduTW9kZSgpID8gUkVBRF9XUklURSA6IFJFQURfT05MWSk7
Ci0KLSAgICBFbGVtZW50KiBkb2NFbGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgp
OwotICAgIFJlbmRlck9iamVjdCogZG9jRWxlbWVudFJlbmRlcmVyID0gZG9jRWxlbWVudCA/IGRv
Y0VsZW1lbnQtPnJlbmRlcmVyKCkgOiAwOwotICAgIGlmIChkb2NFbGVtZW50UmVuZGVyZXIpIHsK
LSAgICAgICAgLy8gVXNlIHRoZSBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSBvZiB0aGUgYm9k
eSB0byBzZXQgdGhlCi0gICAgICAgIC8vIHZpZXdwb3J0J3MgZGlyZWN0aW9uIGFuZCB3cml0aW5n
LW1vZGUgdW5sZXNzIHRoZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQu
Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJvZHksIHRoZW4gdXNlIHRoZSBkb2N1bWVudCBl
bGVtZW50LgotICAgICAgICBSZW5kZXJPYmplY3QqIGJvZHlSZW5kZXJlciA9IGRvY3VtZW50LT5i
b2R5KCkgPyBkb2N1bWVudC0+Ym9keSgpLT5yZW5kZXJlcigpIDogMDsKLSAgICAgICAgaWYgKGJv
ZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQo
KSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGJvZHlSZW5kZXJl
ci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRv
Y3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+
d3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT5k
aXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudCgpKQotICAgICAgICAgICAgZG9jdW1lbnRTdHls
ZS0+c2V0RGlyZWN0aW9uKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oZG9jRWxl
bWVudFJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgaWYgKGZy
YW1lKSB7Ci0gICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCkp
IHsKLSAgICAgICAgICAgIGNvbnN0IFBhZ2luYXRpb24mIHBhZ2luYXRpb24gPSBmcmFtZVZpZXct
PnBhZ2luYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uLm1vZGUgIT0gUGFnaW5h
dGlvbjo6VW5wYWdpbmF0ZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0
aW9uTW9kZShwYWdpbmF0aW9uLm1vZGUsIGRvY3VtZW50U3R5bGUuZ2V0KCkpOwotICAgICAgICAg
ICAgICAgIGRvY3VtZW50U3R5bGUtPnNldENvbHVtbkdhcChwYWdpbmF0aW9uLmdhcCk7Ci0gICAg
ICAgICAgICAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSBkb2N1bWVudC0+cmVuZGVyVmlldygp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LT5oYXNDb2x1bW5zKCkpCi0gICAgICAg
ICAgICAgICAgICAgICAgICB2aWV3LT51cGRhdGVDb2x1bW5JbmZvRnJvbVN0eWxlKGRvY3VtZW50
U3R5bGUuZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgd2FudCB0byBpbmhlcml0IHRoZWly
IGZvbnQgZnJvbSB0aGVpciBwYXJlbnQgaWZyYW1lLCBzbyBlYXJseSByZXR1cm4gYmVmb3JlIHNl
dHRpbmcgdGhlIGZvbnQuCi0gICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkKLSAgICAgICAgcmV0
dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotCi0gICAgRm9udERlc2NyaXB0aW9uIGZvbnRE
ZXNjcmlwdGlvbjsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0
Q29kZUZvckZvbnRTZWxlY3Rpb24oZG9jdW1lbnRTdHlsZS0+bG9jYWxlKCkpKTsKLSAgICBpZiAo
U2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCkpIHsKLSAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpIHx8ICFz
ZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7Ci0gICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgp
KTsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBzdGFuZGFyZEZvbnQgPSBzZXR0aW5ncy0+
c3RhbmRhcmRGb250RmFtaWx5KGZvbnREZXNjcmlwdGlvbi5zY3JpcHQoKSk7Ci0gICAgICAgIGlm
ICghc3RhbmRhcmRGb250LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWlseSk7Ci0gICAg
ICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRG
b250KTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZh
bWlseSgwKTsKLSAgICAgICAgfQotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNp
emUoQ1NTVmFsdWVNZWRpdW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKLSAgICAgICAgaW50IHNp
emUgPSBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQsIENTU1ZhbHVl
TWVkaXVtLCBmYWxzZSk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXpl
KHNpemUpOwotICAgICAgICBib29sIHVzZVNWR1pvb21SdWxlcyA9IGRvY3VtZW50LT5pc1NWR0Rv
Y3VtZW50KCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoU3R5bGVS
ZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIGRvY3Vt
ZW50U3R5bGUuZ2V0KCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1
c2VTVkdab29tUnVsZXMpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpKTsKLQotICAgIEZvbnRPcmllbnRh
dGlvbiBmb250T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9y
aWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGRvY3VtZW50U3R5bGUu
Z2V0KCksIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7Ci0gICAgZm9udERlc2Ny
aXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmllbnRhdGlvbik7Ci0gICAgZm9udERlc2NyaXB0
aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7Ci0KLSAgICBk
b2N1bWVudFN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICBk
b2N1bWVudFN0eWxlLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3Rvcik7Ci0KLSAgICByZXR1cm4g
ZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U2hh
ZG93Qm91bmRhcnkoY29uc3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBpZiAoIWVsZW1lbnQp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlID0g
ZWxlbWVudC0+cGFyZW50Tm9kZSgpOwotICAgIHJldHVybiBwYXJlbnROb2RlICYmIHBhcmVudE5v
ZGUtPmlzU2hhZG93Um9vdCgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJl
c29sdmVyOjpzdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVyU3R5bGUqIGRl
ZmF1bHRQYXJlbnQsCi0gICAgU3R5bGVTaGFyaW5nQmVoYXZpb3Igc2hhcmluZ0JlaGF2aW9yLCBS
dWxlTWF0Y2hpbmdCZWhhdmlvciBtYXRjaGluZ0JlaGF2aW9yLCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcpCi17Ci0gICAgLy8gT25jZSBhbiBlbGVtZW50IGhhcyBhIHJlbmRlcmVyLCB3
ZSBkb24ndCB0cnkgdG8gZGVzdHJveSBpdCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSByZW5kZXJlcgot
ICAgIC8vIHdpbGwgdmFuaXNoIGlmIGEgc3R5bGUgcmVjYWxjIGhhcHBlbnMgZHVyaW5nIGxvYWRp
bmcuCi0gICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhZWxl
bWVudC0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgIWVsZW1lbnQtPnJl
bmRlcmVyKCkpIHsKLSAgICAgICAgaWYgKCFzX3N0eWxlTm90WWV0QXZhaWxhYmxlKSB7Ci0gICAg
ICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpLmxl
YWtSZWYoKTsKLSAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPnNldERpc3BsYXko
Tk9ORSk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5mb250KCkudXBkYXRl
KG1fZm9udFNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50LT5kb2N1bWVudCgp
LT5zZXRIYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKCk7Ci0gICAgICAgIHJldHVybiBzX3N0
eWxlTm90WWV0QXZhaWxhYmxlOwotICAgIH0KLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7
Ci0gICAgaW5pdEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2
ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywgcmVnaW9uRm9y
U3R5bGluZyk7Ci0gICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAm
JiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKLSAgICAgICAgUmVuZGVy
U3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoKTsKLSAgICAgICAgaWYgKHNo
YXJlZFN0eWxlKQotICAgICAgICAgICAgcmV0dXJuIHNoYXJlZFN0eWxlOwotICAgIH0KLQotICAg
IFJlZlB0cjxSZW5kZXJTdHlsZT4gY2xvbmVGb3JQYXJlbnQ7Ci0KLSAgICBpZiAoc3RhdGUucGFy
ZW50U3R5bGUoKSkgewotICAgICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRl
KCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShzdGF0ZS5wYXJlbnRTdHls
ZSgpLCBpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkgPyBSZW5kZXJTdHlsZTo6QXRTaGFkb3dC
b3VuZGFyeSA6IFJlbmRlclN0eWxlOjpOb3RBdFNoYWRvd0JvdW5kYXJ5KTsKLSAgICB9IGVsc2Ug
ewotICAgICAgICBzdGF0ZS5zZXRTdHlsZShkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkpOwotICAg
ICAgICBjbG9uZUZvclBhcmVudCA9IFJlbmRlclN0eWxlOjpjbG9uZShzdGF0ZS5zdHlsZSgpKTsK
LSAgICAgICAgc3RhdGUuc2V0UGFyZW50U3R5bGUoY2xvbmVGb3JQYXJlbnQuZ2V0KCkpOwotICAg
IH0KLSAgICAvLyBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlIChpbXBsZW1lbnRlZCBieSAtd2Vi
a2l0LXVzZXItbW9kaWZ5KSBzaG91bGQKLSAgICAvLyBiZSBwcm9wYWdhdGVkIGZyb20gc2hhZG93
IGhvc3QgdG8gZGlzdHJpYnV0ZWQgbm9kZS4KLSAgICBpZiAoc3RhdGUuZGlzdHJpYnV0ZWRUb0lu
c2VydGlvblBvaW50KCkpIHsKLSAgICAgICAgaWYgKEVsZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQt
PnBhcmVudEVsZW1lbnQoKSkgewotICAgICAgICAgICAgaWYgKFJlbmRlclN0eWxlKiBzdHlsZU9m
U2hhZG93SG9zdCA9IHBhcmVudC0+cmVuZGVyU3R5bGUoKSkKLSAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRVc2VyTW9kaWZ5KHN0eWxlT2ZTaGFkb3dIb3N0LT51c2VyTW9kaWZ5KCkp
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKSB7Ci0gICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldElzTGluayh0cnVlKTsKLSAgICAgICAgRUluc2lkZUxpbmsg
bGlua1N0YXRlID0gc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpOwotICAgICAgICBpZiAobGlua1N0
YXRlICE9IE5vdEluc2lkZUxpbmspIHsKLSAgICAgICAgICAgIGJvb2wgZm9yY2VWaXNpdGVkID0g
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpmb3JjZVBzZXVkb1N0YXRlKGVsZW1lbnQsIENTU1Nl
bGVjdG9yOjpQc2V1ZG9WaXNpdGVkKTsKLSAgICAgICAgICAgIGlmIChmb3JjZVZpc2l0ZWQpCi0g
ICAgICAgICAgICAgICAgbGlua1N0YXRlID0gSW5zaWRlVmlzaXRlZExpbms7Ci0gICAgICAgIH0K
LSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdGUpOwotICAgIH0K
LQotICAgIGJvb2wgbmVlZHNDb2xsZWN0aW9uID0gZmFsc2U7Ci0gICAgQ1NTRGVmYXVsdFN0eWxl
U2hlZXRzOjplbnN1cmVEZWZhdWx0U3R5bGVTaGVldHNGb3JFbGVtZW50KGVsZW1lbnQsIG5lZWRz
Q29sbGVjdGlvbik7Ci0gICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKLSAgICAgICAgbV9ydWxlU2V0
cy5jb2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNv
bHZlci5nZXQoKSk7Ci0KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBpZiAobWF0
Y2hpbmdCZWhhdmlvciA9PSBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcykKLSAgICAgICAgbWF0Y2hV
QVJ1bGVzKG1hdGNoUmVzdWx0KTsKLSAgICBlbHNlCi0gICAgICAgIG1hdGNoQWxsUnVsZXMobWF0
Y2hSZXN1bHQsIG1hdGNoaW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwp
OwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7Ci0K
LSAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNv
cmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0
ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBlbGVtZW50KTsKLQotICAgIHN0YXRlLmNs
ZWFyKCk7IC8vIENsZWFyIG91dCBmb3IgdGhlIG5leHQgcmVzb2x2ZS4KLQotICAgIGRvY3VtZW50
KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0
eWxlLgotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHls
ZSogZWxlbWVudFN0eWxlLCBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSwgS2V5ZnJhbWVW
YWx1ZSYga2V5ZnJhbWVWYWx1ZSkKLXsKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAgaWYg
KGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJl
c3VsdCwga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSk7Ci0KLSAgICBBU1NFUlQoIW1fc3RhdGUuc3R5
bGUoKSk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgLy8gQ3JlYXRlIHRo
ZSBzdHlsZQotICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjbG9uZShlbGVtZW50U3R5
bGUpKTsKLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0KLSAgICAvLyBXZSBkb24n
dCBuZWVkIHRvIGJvdGhlciB3aXRoICFpbXBvcnRhbnQuIFNpbmNlIHRoZXJlIGlzIG9ubHkgZXZl
ciBvbmUKLSAgICAvLyBkZWNsLCB0aGVyZSdzIG5vdGhpbmcgdG8gb3ZlcnJpZGUuIFNvIGp1c3Qg
YWRkIHRoZSBmaXJzdCBwcm9wZXJ0aWVzLgotICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNl
OwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8v
IElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAg
ICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUg
c3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUKLSAgICBpZiAoc3RhdGUubGluZUhlaWdo
dFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBz
dGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7Ci0KLSAgICAvLyBOb3cgZG8gcmVzdCBvZiB0aGUgcHJv
cGVydGllcy4KLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAs
IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQot
ICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkIGJ5IG9uZSBvZiB0aGUgbm9uLWVzc2VudGlh
bCBmb250IHByb3BzLAotICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgYSBzZWNvbmQgdGlt
ZS4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyBy
ZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLSAg
ICAKLSAgICAvLyBBZGQgYWxsIHRoZSBhbmltYXRpbmcgcHJvcGVydGllcyB0byB0aGUga2V5ZnJh
bWUuCi0gICAgaWYgKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHN0eWxlRGVjbGFyYXRpb24gPSBr
ZXlmcmFtZS0+cHJvcGVydGllcygpKSB7Ci0gICAgICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQg
PSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUNvdW50KCk7Ci0gICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIENTU1Byb3Bl
cnR5SUQgcHJvcGVydHkgPSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUF0KGkpLmlkKCk7Ci0g
ICAgICAgICAgICAvLyBUaW1pbmctZnVuY3Rpb24gd2l0aGluIGtleWZyYW1lcyBpcyBzcGVjaWFs
LCBiZWNhdXNlIGl0IGlzIG5vdCBhbmltYXRlZDsgaXQganVzdAotICAgICAgICAgICAgLy8gZGVz
Y3JpYmVzIHRoZSB0aW1pbmcgZnVuY3Rpb24gYmV0d2VlbiB0aGlzIGtleWZyYW1lIGFuZCB0aGUg
bmV4dC4KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1h
dGlvblRpbWluZ0Z1bmN0aW9uKQotICAgICAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuYWRkUHJv
cGVydHkocHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZG9jdW1lbnQoKS0+ZGlk
QWNjZXNzU3R5bGVSZXNvbHZlcigpOwotCi0gICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOwot
fQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1l
bnQqIGUsIGNvbnN0IFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIEtleWZyYW1lTGlzdCYgbGlz
dCkKLXsKLSAgICBsaXN0LmNsZWFyKCk7Ci0KLSAgICAvLyBHZXQgdGhlIGtleWZyYW1lc1J1bGUg
Zm9yIHRoaXMgbmFtZQotICAgIGlmICghZSB8fCBsaXN0LmFuaW1hdGlvbk5hbWUoKS5pc0VtcHR5
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5jaGVja0NvbnNp
c3RlbmN5KCk7Ci0KLSAgICBLZXlmcmFtZXNSdWxlTWFwOjppdGVyYXRvciBpdCA9IG1fa2V5ZnJh
bWVzUnVsZU1hcC5maW5kKGxpc3QuYW5pbWF0aW9uTmFtZSgpLmltcGwoKSk7Ci0gICAgaWYgKGl0
ID09IG1fa2V5ZnJhbWVzUnVsZU1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29u
c3QgU3R5bGVSdWxlS2V5ZnJhbWVzKiBrZXlmcmFtZXNSdWxlID0gaXQtPnZhbHVlLmdldCgpOwot
Ci0gICAgLy8gQ29uc3RydWN0IGFuZCBwb3B1bGF0ZSB0aGUgc3R5bGUgZm9yIGVhY2gga2V5ZnJh
bWUKLSAgICBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlS2V5ZnJhbWU+ID4mIGtleWZyYW1lcyA9
IGtleWZyYW1lc1J1bGUtPmtleWZyYW1lcygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBrZXlmcmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgLy8gQXBwbHkgdGhlIGRlY2xhcmF0
aW9uIHRvIHRoZSBzdHlsZS4gVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgbG9n
aWMgaW4gc3R5bGVGb3JFbGVtZW50Ci0gICAgICAgIGluaXRFbGVtZW50KGUpOwotICAgICAgICBt
X3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSk7Ci0KLSAgICAgICAgY29u
c3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUgPSBrZXlmcmFtZXNbaV0uZ2V0KCk7Ci0KLSAgICAg
ICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDAsIDApOwotICAgICAgICBrZXlmcmFtZVZh
bHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBrZXlmcmFtZSwga2V5
ZnJhbWVWYWx1ZSkpOwotCi0gICAgICAgIC8vIEFkZCB0aGlzIGtleWZyYW1lIHN0eWxlIHRvIGFs
bCB0aGUgaW5kaWNhdGVkIGtleSB0aW1lcwotICAgICAgICBWZWN0b3I8ZmxvYXQ+IGtleXM7Ci0g
ICAgICAgIGtleWZyYW1lLT5nZXRLZXlzKGtleXMpOwotICAgICAgICBmb3IgKHNpemVfdCBrZXlJ
bmRleCA9IDA7IGtleUluZGV4IDwga2V5cy5zaXplKCk7ICsra2V5SW5kZXgpIHsKLSAgICAgICAg
ICAgIGtleWZyYW1lVmFsdWUuc2V0S2V5KGtleXNba2V5SW5kZXhdKTsKLSAgICAgICAgICAgIGxp
c3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYg
dGhlIDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUg
aXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1lKQotICAgIGludCBpbml0aWFsTGlzdFNpemUg
PSBsaXN0LnNpemUoKTsKLSAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiBsaXN0WzBdLmtl
eSgpKSB7Ci0gICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiB6ZXJvUGVyY2VudEtleWZyYW1l
OwotICAgICAgICBpZiAoIXplcm9QZXJjZW50S2V5ZnJhbWUpIHsKLSAgICAgICAgICAgIHplcm9Q
ZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAg
ICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIwJSIpOwotICAgICAgICB9
Ci0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKLSAgICAgICAga2V5
ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgemVyb1Bl
cmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotICAgICAgICBsaXN0Lmluc2VydChrZXlm
cmFtZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgMTAwJSBrZXlmcmFtZSBpcyBtaXNz
aW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBr
ZXlmcmFtZSkKLSAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiAobGlzdFtsaXN0LnNpemUo
KSAtIDFdLmtleSgpICE9IDEpKSB7Ci0gICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiBodW5k
cmVkUGVyY2VudEtleWZyYW1lOwotICAgICAgICBpZiAoIWh1bmRyZWRQZXJjZW50S2V5ZnJhbWUp
IHsKLSAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpj
cmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lLT5z
ZXRLZXlUZXh0KCIxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlm
cmFtZVZhbHVlKDEsIDApOwotICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9y
S2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBodW5kcmVkUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZh
bHVlKSk7Ci0gICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOwotICAgIH0KLX0KLQot
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVGb3JFbGVt
ZW50KEVsZW1lbnQqIGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1
ZXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxl
KTsKLSAgICBpZiAoIWUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKLQotICAgIGluaXRFbGVtZW50KGUpOwotCi0gICAgc3RhdGUuaW5pdEZvclN0eWxl
UmVzb2x2ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsK
LSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwotICAgIHN0YXRlLnN0
eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucGFyZW50U3R5bGUoKSk7Ci0KLSAgICAvLyBTaW5j
ZSB3ZSBkb24ndCB1c2UgcHNldWRvLWVsZW1lbnRzIGluIGFueSBvZiBvdXIgcXVpcmsvcHJpbnQg
dXNlciBhZ2VudCBydWxlcywgZG9uJ3Qgd2FzdGUgdGltZSB3YWxraW5nCi0gICAgLy8gdGhvc2Ug
cnVsZXMuCi0KLSAgICAvLyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVzLgotICAgIE1h
dGNoUmVzdWx0IG1hdGNoUmVzdWx0OwotICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0K
LSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKLSAgICAgICAgbWF0Y2hVc2Vy
UnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRj
aFJlc3VsdCwgZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgc3RhdGUuc3R5bGUo
KS0+c2V0U3R5bGVUeXBlKHBzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCk7Ci0KLSAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlKTsKLQotICAgIC8vIENsZWFuIHVwIG91
ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhl
ciBmaXh1cHMpLgotICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIG1fc3RhdGUu
cGFyZW50U3R5bGUoKSwgMCk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZl
cmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLQotICAg
IGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1
cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKGludCBwYWdlSW5k
ZXgpCi17Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGRvY3Vt
ZW50KCktPmRvY3VtZW50RWxlbWVudCgpKTsgLy8gbV9yb290RWxlbWVudFN0eWxlIHdpbGwgYmUg
c2V0IHRvIHRoZSBkb2N1bWVudCBzdHlsZS4KLQotICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVy
U3R5bGU6OmNyZWF0ZSgpKTsKLSAgICBtX3N0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLQotICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0
UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBh
Z2VJbmRleCk7Ci0gICAgY29uc3QgU3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOwot
ICAgIAotICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQs
IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJz
dCwgcGFnZSk7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHls
ZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGds
b2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3Bl
Yy4KLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwg
aXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgw
KTsKLSAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklB
QkxFUykKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KHJl
c3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhl
cml0ZWRPbmx5KTsKLSNlbmRpZgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9y
aXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
LnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwotCi0gICAgLy8gSWYgb3VyIGZvbnQgZ290IGRp
cnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgotICAgIHVwZGF0ZUZvbnQoKTsKLQot
ICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24g
dGhlIGZvbnQtc2l6ZS4KLSAgICBpZiAobV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKLSAgICAg
ICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIG1fc3RhdGUubGluZUhlaWdo
dFZhbHVlKCkpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3Bl
cnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJl
ZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOwotCi0g
ICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOwotCi0gICAgLy8gTm93IHJl
dHVybiB0aGUgc3R5bGUuCi0gICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBh
c3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OmRlZmF1bHRTdHlsZUZvckVsZW1l
bnQoKQotewotICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAg
ICAvLyBNYWtlIHN1cmUgb3VyIGZvbnRzIGFyZSBpbml0aWFsaXplZCBpZiB3ZSBkb24ndCBpbmhl
cml0IHRoZW0gZnJvbSBvdXIgcGFyZW50IHN0eWxlLgotICAgIGlmIChTZXR0aW5ncyogc2V0dGlu
Z3MgPSBkb2N1bWVudFNldHRpbmdzKCkpIHsKLSAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShz
ZXR0aW5ncyk7Ci0gICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2Vs
ZWN0b3IoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVw
ZGF0ZSgwKTsKLQotICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOwotfQotCi1QYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclRleHQoVGV4dCogdGV4dE5v
ZGUpCi17Ci0gICAgQVNTRVJUKHRleHROb2RlKTsKLQotICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0
IGNvbnRleHQodGV4dE5vZGUpOwotICAgIE5vZGUqIHBhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVu
dE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOwotICAgIHJldHVybiBjb250ZXh0LnJlc2V0U3R5
bGVJbmhlcml0YW5jZSgpIHx8ICFwYXJlbnROb2RlID8KLSAgICAgICAgZGVmYXVsdFN0eWxlRm9y
RWxlbWVudCgpIDogcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKTsKLX0KLQotc3RhdGljIHZvaWQg
YWRkSW50cmluc2ljTWFyZ2lucyhSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgLy8gSW50cmlu
c2ljIG1hcmdpbiB2YWx1ZS4KLSAgICBjb25zdCBpbnQgaW50cmluc2ljTWFyZ2luID0gMiAqIHN0
eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICAvLyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0
IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13aWR0aCBpcyBm
bGF3ZWQuCi0gICAgLy8gRklYTUU6IFVzaW5nICJxdWlyayIgdG8gZGVjaWRlIHRoZSBtYXJnaW4g
d2Fzbid0IHNldCBpcyBraW5kIG9mIGxhbWUuCi0gICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50
cmluc2ljT3JBdXRvKCkpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmso
KSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChpbnRyaW5zaWNNYXJn
aW4sIEZpeGVkKSk7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luUmlnaHQoKS5xdWlyaygpKQot
ICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4s
IEZpeGVkKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgewot
ICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHls
ZS0+c2V0TWFyZ2luVG9wKExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgICAg
IGlmIChzdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5z
ZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKLSAgICB9Ci19
Ci0KLXN0YXRpYyBFRGlzcGxheSBlcXVpdmFsZW50QmxvY2tEaXNwbGF5KEVEaXNwbGF5IGRpc3Bs
YXksIGJvb2wgaXNGbG9hdGluZywgYm9vbCBzdHJpY3RQYXJzaW5nKQotewotICAgIHN3aXRjaCAo
ZGlzcGxheSkgewotICAgIGNhc2UgQkxPQ0s6Ci0gICAgY2FzZSBUQUJMRToKLSAgICBjYXNlIEJP
WDoKLSAgICBjYXNlIEZMRVg6Ci0gICAgY2FzZSBHUklEOgotICAgICAgICByZXR1cm4gZGlzcGxh
eTsKLQotICAgIGNhc2UgTElTVF9JVEVNOgotICAgICAgICAvLyBJdCBpcyBhIFdpbklFIGJ1ZyB0
aGF0IGZsb2F0ZWQgbGlzdCBpdGVtcyBsb3NlIHRoZWlyIGJ1bGxldHMsIHNvIHdlJ2xsIGVtdWxh
dGUgdGhlIHF1aXJrLCBidXQgb25seSBpbiBxdWlya3MgbW9kZS4KLSAgICAgICAgaWYgKCFzdHJp
Y3RQYXJzaW5nICYmIGlzRmxvYXRpbmcpCi0gICAgICAgICAgICByZXR1cm4gQkxPQ0s7Ci0gICAg
ICAgIHJldHVybiBkaXNwbGF5OwotICAgIGNhc2UgSU5MSU5FX1RBQkxFOgotICAgICAgICByZXR1
cm4gVEFCTEU7Ci0gICAgY2FzZSBJTkxJTkVfQk9YOgotICAgICAgICByZXR1cm4gQk9YOwotICAg
IGNhc2UgSU5MSU5FX0ZMRVg6Ci0gICAgICAgIHJldHVybiBGTEVYOwotICAgIGNhc2UgSU5MSU5F
X0dSSUQ6Ci0gICAgICAgIHJldHVybiBHUklEOwotCi0gICAgY2FzZSBJTkxJTkU6Ci0gICAgY2Fz
ZSBSVU5fSU46Ci0gICAgY2FzZSBDT01QQUNUOgotICAgIGNhc2UgSU5MSU5FX0JMT0NLOgotICAg
IGNhc2UgVEFCTEVfUk9XX0dST1VQOgotICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOgotICAg
IGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgotICAgIGNhc2UgVEFCTEVfUk9XOgotICAgIGNhc2Ug
VEFCTEVfQ09MVU1OX0dST1VQOgotICAgIGNhc2UgVEFCTEVfQ09MVU1OOgotICAgIGNhc2UgVEFC
TEVfQ0VMTDoKLSAgICBjYXNlIFRBQkxFX0NBUFRJT046Ci0gICAgICAgIHJldHVybiBCTE9DSzsK
LSAgICBjYXNlIE5PTkU6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBy
ZXR1cm4gTk9ORTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJu
IEJMT0NLOwotfQotCi0vLyBDU1MgcmVxdWlyZXMgdGV4dC1kZWNvcmF0aW9uIHRvIGJlIHJlc2V0
IGF0IGVhY2ggRE9NIGVsZW1lbnQgZm9yIHRhYmxlcywgCi0vLyBpbmxpbmUgYmxvY2tzLCBpbmxp
bmUgdGFibGVzLCBydW4taW5zLCBzaGFkb3cgRE9NIGNyb3NzaW5ncywgZmxvYXRpbmcgZWxlbWVu
dHMsCi0vLyBhbmQgYWJzb2x1dGUgb3IgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLgot
c3RhdGljIGJvb2wgZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqIGUpCi17Ci0gICAgcmV0dXJuIHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUg
fHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBSVU5fSU4KLSAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9YIHx8IGlzQXRTaGFkb3dCb3VuZGFyeShlKQot
ICAgICAgICB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8IHN0eWxlLT5oYXNPdXRPZkZsb3dQb3Np
dGlvbigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0Rpc3BsYXlGbGV4aWJsZUJveChFRGlzcGxheSBk
aXNwbGF5KQotewotICAgIHJldHVybiBkaXNwbGF5ID09IEZMRVggfHwgZGlzcGxheSA9PSBJTkxJ
TkVfRkxFWDsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphZGp1c3RSZW5kZXJTdHlsZShSZW5k
ZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCAqZSkKLXsK
LSAgICBBU1NFUlQocGFyZW50U3R5bGUpOwotCi0gICAgLy8gQ2FjaGUgb3VyIG9yaWdpbmFsIGRp
c3BsYXkuCi0gICAgc3R5bGUtPnNldE9yaWdpbmFsRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpKTsK
LQotICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpICE9IE5PTkUpIHsKLSAgICAgICAgLy8gSWYgd2Ug
aGF2ZSBhIDx0ZD4gdGhhdCBzcGVjaWZpZXMgYSBmbG9hdCBwcm9wZXJ0eSwgaW4gcXVpcmtzIG1v
ZGUgd2UganVzdCBkcm9wIHRoZSBmbG9hdAotICAgICAgICAvLyBwcm9wZXJ0eS4KLSAgICAgICAg
Ly8gU2l0ZXMgYWxzbyBjb21tb25seSB1c2UgZGlzcGxheTppbmxpbmUvYmxvY2sgb24gPHRkPnMg
YW5kIDx0YWJsZT5zLiBJbiBxdWlya3MgbW9kZSB3ZSBmb3JjZQotICAgICAgICAvLyB0aGVzZSB0
YWdzIHRvIHJldGFpbiB0aGVpciBkaXNwbGF5IHR5cGVzLgotICAgICAgICBpZiAoZG9jdW1lbnQo
KS0+aW5RdWlya3NNb2RlKCkgJiYgZSkgewotICAgICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUo
dGRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVfQ0VMTCk7
Ci0gICAgICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOwotICAgICAgICAg
ICAgfSBlbHNlIGlmIChlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKLSAgICAgICAgICAgICAgICBz
dHlsZS0+c2V0RGlzcGxheShzdHlsZS0+aXNEaXNwbGF5SW5saW5lVHlwZSgpID8gSU5MSU5FX1RB
QkxFIDogVEFCTEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05h
bWUodGRUYWcpIHx8IGUtPmhhc1RhZ05hbWUodGhUYWcpKSkgewotICAgICAgICAgICAgaWYgKHN0
eWxlLT53aGl0ZVNwYWNlKCkgPT0gS0hUTUxfTk9XUkFQKSB7Ci0gICAgICAgICAgICAgICAgLy8g
RmlndXJlIG91dCBpZiB3ZSBhcmUgcmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYgd2Ugc2hvdWxkIGp1
c3QKLSAgICAgICAgICAgICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQuIElmIHRoZSB3aWR0aCBv
ZiB0aGUgY2VsbCBpcyBmaXhlZCwgdGhlbgotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGFj
dHVhbGx5IHVzZSBOT1dSQVAuCi0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlz
Rml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9STUFM
KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRX
aGl0ZVNwYWNlKE5PV1JBUCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBUYWJsZXMgbmV2ZXIgc3VwcG9ydCB0aGUgLXdlYmtpdC0qIHZhbHVlcyBmb3IgdGV4dC1hbGln
biBhbmQgd2lsbCByZXNldCBiYWNrIHRvIHRoZSBkZWZhdWx0LgotICAgICAgICBpZiAoZSAmJiBl
LT5oYXNUYWdOYW1lKHRhYmxlVGFnKSAmJiAoc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9M
RUZUIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfQ0VOVEVSIHx8IHN0eWxlLT50ZXh0
QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKQotICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGln
bihUQVNUQVJUKTsKLQotICAgICAgICAvLyBGcmFtZXMgYW5kIGZyYW1lc2V0cyBuZXZlciBob25v
ciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlvbjphYnNvbHV0ZS4gVGhpcyBpcyBuZWNlc3Nh
cnkgdG8KLSAgICAgICAgLy8gZml4IGEgY3Jhc2ggd2hlcmUgYSBzaXRlIHRyaWVzIHRvIHBvc2l0
aW9uIHRoZXNlIG9iamVjdHMuIFRoZXkgYWxzbyBuZXZlciBob25vciBkaXNwbGF5LgotICAgICAg
ICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZS0+aGFzVGFnTmFtZShmcmFt
ZXNldFRhZykpKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRp
b24pOwotICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gUnVieSB0ZXh0IGRvZXMgbm90IHN1cHBvcnQgZmxvYXQgb3IgcG9zaXRpb24u
IFRoaXMgbWlnaHQgY2hhbmdlIHdpdGggZXZvbHV0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgot
ICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHJ0VGFnKSkgewotICAgICAgICAgICAgc3R5
bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRG
bG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZJWE1FOiBXZSBzaG91
bGRuJ3QgYmUgb3ZlcnJpZGluZyBzdGFydC8td2Via2l0LWF1dG8gbGlrZSB0aGlzLiBEbyBpdCBp
biBodG1sLmNzcyBpbnN0ZWFkLgotICAgICAgICAvLyBUYWJsZSBoZWFkZXJzIHdpdGggYSB0ZXh0
LWFsaWduIG9mIC13ZWJraXQtYXV0byB3aWxsIGNoYW5nZSB0aGUgdGV4dC1hbGlnbiB0byBjZW50
ZXIuCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGhUYWcpICYmIHN0eWxlLT50ZXh0
QWxpZ24oKSA9PSBUQVNUQVJUKQotICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihDRU5U
RVIpOwotCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgICAgICAvLyBBYnNvbHV0ZS9m
aXhlZCBwb3NpdGlvbmVkIGVsZW1lbnRzLCBmbG9hdGluZyBlbGVtZW50cyBhbmQgdGhlIGRvY3Vt
ZW50IGVsZW1lbnQgbmVlZCBibG9jay1saWtlIG91dHNpZGUgZGlzcGxheS4KLSAgICAgICAgaWYg
KHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwg
KGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkpCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5
KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOwot
Ci0gICAgICAgIC8vIEZJWE1FOiBEb24ndCBzdXBwb3J0IHRoaXMgbXV0YXRpb24gZm9yIHBzZXVk
byBzdHlsZXMgbGlrZSBmaXJzdC1sZXR0ZXIgb3IgZmlyc3QtbGluZSwgc2luY2UgaXQncyBub3Qg
Y29tcGxldGVseQotICAgICAgICAvLyBjbGVhciBob3cgdGhhdCBzaG91bGQgd29yay4KLSAgICAg
ICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0eWxlLT5zdHlsZVR5cGUoKSA9
PSBOT1BTRVVETyAmJiBzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBwYXJlbnRTdHlsZS0+d3JpdGlu
Z01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7Ci0K
LSAgICAgICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyB0aGUgZGlzcGxheSBtdXRhdGlvbiwgY2hlY2sg
dGFibGUgcm93cy4gV2UgZG8gbm90IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9u
OnN0aWNreSBvbgotICAgICAgICAvLyB0YWJsZSByb3dzIG9yIGNlbGxzLiBUaGlzIGhhcyBiZWVu
IGVzdGFibGlzaGVkIGZvciBwb3NpdGlvbjpyZWxhdGl2ZSBpbiBDU1MyLjEgKGFuZCBjYXVzZWQg
YSBjcmFzaCBpbiBjb250YWluaW5nQmxvY2soKQotICAgICAgICAvLyBvbiBzb21lIHNpdGVzKS4K
LSAgICAgICAgaWYgKChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBz
dHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUt
PmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9ST1cpCi0gICAgICAgICAgICAmJiBzdHlsZS0+aGFzSW5GbG93UG9zaXRpb24oKSkKLSAg
ICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0KLSAgICAgICAg
Ly8gd3JpdGluZy1tb2RlIGRvZXMgbm90IGFwcGx5IHRvIHRhYmxlIHJvdyBncm91cHMsIHRhYmxl
IGNvbHVtbiBncm91cHMsIHRhYmxlIHJvd3MsIGFuZCB0YWJsZSBjb2x1bW5zLgotICAgICAgICAv
LyBGSVhNRTogVGFibGUgY2VsbHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgcGVycGVuZGljdWxh
ciBvciBmbGlwcGVkIHdpdGggcmVzcGVjdCB0byB0aGUgdGFibGUsIHRob3VnaC4KLSAgICAgICAg
aWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfQ09MVU1OX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVS
X0dST1VQCi0gICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9H
Uk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVyB8fCBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX1JPV19HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9DRUxMKQotICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKHBhcmVudFN0eWxl
LT53cml0aW5nTW9kZSgpKTsKLQotICAgICAgICAvLyBGSVhNRTogU2luY2Ugd2UgZG9uJ3Qgc3Vw
cG9ydCBibG9jay1mbG93IG9uIGZsZXhpYmxlIGJveGVzIHlldCwgZGlzYWxsb3cgc2V0dGluZwot
ICAgICAgICAvLyBvZiBibG9jay1mbG93IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gVG9wVG9Cb3R0
b21Xcml0aW5nTW9kZS4KLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTQ2NDE4IC0gRmxleGlibGUgYm94IHN1cHBvcnQuCi0gICAgICAgIGlmIChzdHls
ZS0+d3JpdGluZ01vZGUoKSAhPSBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlICYmIChzdHlsZS0+ZGlz
cGxheSgpID09IEJPWCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gpKQotICAgICAg
ICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKFRvcFRvQm90dG9tV3JpdGluZ01vZGUpOwotCi0g
ICAgICAgIGlmIChpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkg
ewotICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOwotICAgICAgICAgICAg
c3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgp
LCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKLSAg
ICAgICAgfQotCi0jaWYgRU5BQkxFKERJQUxPR19FTEVNRU5UKQotICAgICAgICAvLyBQZXIgdGhl
IHNwZWMsIHBvc2l0aW9uICdzdGF0aWMnIGFuZCAncmVsYXRpdmUnIGluIHRoZSB0b3AgbGF5ZXIg
Y29tcHV0ZSB0byAnYWJzb2x1dGUnLgotICAgICAgICBpZiAoZSAmJiBlLT5pc0luVG9wTGF5ZXIo
KSAmJiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gfHwgc3R5bGUtPnBvc2l0
aW9uKCkgPT0gUmVsYXRpdmVQb3NpdGlvbikpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3Np
dGlvbihBYnNvbHV0ZVBvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJM
T0NLKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIG91ciB6
LWluZGV4IHZhbHVlIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgb2JqZWN0IGlzIHBvc2l0aW9uZWQu
Ci0gICAgaWYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uICYmICFpc0Rpc3Bs
YXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkKLSAgICAgICAgc3R5bGUtPnNl
dEhhc0F1dG9aSW5kZXgoKTsKLQotICAgIC8vIEF1dG8gei1pbmRleCBiZWNvbWVzIDAgZm9yIHRo
ZSByb290IGVsZW1lbnQgYW5kIHRyYW5zcGFyZW50IG9iamVjdHMuIFRoaXMgcHJldmVudHMKLSAg
ICAvLyBjYXNlcyB3aGVyZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGJsZW5kZWQgYXMgYSBzaW5n
bGUgdW5pdCBlbmQgdXAgd2l0aCBhIG5vbi10cmFuc3BhcmVudAotICAgIC8vIG9iamVjdCB3ZWRn
ZWQgaW4gYmV0d2VlbiB0aGVtLiBBdXRvIHotaW5kZXggYWxzbyBiZWNvbWVzIDAgZm9yIG9iamVj
dHMgdGhhdCBzcGVjaWZ5IHRyYW5zZm9ybXMvbWFza3MvcmVmbGVjdGlvbnMuCi0gICAgaWYgKHN0
eWxlLT5oYXNBdXRvWkluZGV4KCkgJiYgKChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxl
bWVudCgpID09IGUpCi0gICAgICAgIHx8IHN0eWxlLT5vcGFjaXR5KCkgPCAxLjBmCi0gICAgICAg
IHx8IHN0eWxlLT5oYXNUcmFuc2Zvcm1SZWxhdGVkUHJvcGVydHkoKQotICAgICAgICB8fCBzdHls
ZS0+aGFzTWFzaygpCi0gICAgICAgIHx8IHN0eWxlLT5jbGlwUGF0aCgpCi0gICAgICAgIHx8IHN0
eWxlLT5ib3hSZWZsZWN0KCkKLSAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpCi0gICAgICAg
IHx8IHN0eWxlLT5oYXNCbGVuZE1vZGUoKQotICAgICAgICB8fCBzdHlsZS0+cG9zaXRpb24oKSA9
PSBTdGlja3lQb3NpdGlvbgotICAgICAgICB8fCAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gRml4ZWRQ
b3NpdGlvbiAmJiBlICYmIGUtPmRvY3VtZW50KCktPnBhZ2UoKSAmJiBlLT5kb2N1bWVudCgpLT5w
YWdlKCktPnNldHRpbmdzKCktPmZpeGVkUG9zaXRpb25DcmVhdGVzU3RhY2tpbmdDb250ZXh0KCkp
Ci0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykKLSAgICAgICAgLy8g
VG91Y2ggb3ZlcmZsb3cgc2Nyb2xsaW5nIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0LgotICAg
ICAgICB8fCAoKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOIHx8IHN0eWxlLT5vdmVyZmxv
d1koKSAhPSBPSElEREVOKSAmJiBzdHlsZS0+dXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZygpKQot
I2VuZGlmCi0jaWYgRU5BQkxFKERJQUxPR19FTEVNRU5UKQotICAgICAgICB8fCAoZSAmJiBlLT5p
c0luVG9wTGF5ZXIoKSkKLSNlbmRpZgotICAgICAgICApKQotICAgICAgICBzdHlsZS0+c2V0Wklu
ZGV4KDApOwotCi0gICAgLy8gVGV4dGFyZWEgY29uc2lkZXJzIG92ZXJmbG93IHZpc2libGUgYXMg
YXV0by4KLSAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRleHRhcmVhVGFnKSkgewotICAgICAg
ICBzdHlsZS0+c2V0T3ZlcmZsb3dYKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSA/IE9B
VVRPIDogc3R5bGUtPm92ZXJmbG93WCgpKTsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShz
dHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1ko
KSk7Ci0gICAgfQotCi0gICAgaWYgKGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oc3R5bGUs
IGUpKQotICAgICAgICBzdHlsZS0+c2V0VGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRl
eHREZWNvcmF0aW9uKCkpOwotICAgIGVsc2UKLSAgICAgICAgc3R5bGUtPmFkZFRvVGV4dERlY29y
YXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOwotCi0gICAgLy8gSWYgZWl0
aGVyIG92ZXJmbG93IHZhbHVlIGlzIG5vdCB2aXNpYmxlLCBjaGFuZ2UgdG8gYXV0by4KLSAgICBp
ZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAh
PSBPTUFSUVVFRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPTUFSUVVFRSk7Ci0gICAg
ZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxv
d1goKSAhPSBPTUFSUVVFRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPTUFSUVVFRSk7
Ci0gICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5v
dmVyZmxvd1koKSAhPSBPVklTSUJMRSkgewotICAgICAgICAvLyBGSVhNRTogT25jZSB3ZSBpbXBs
ZW1lbnQgcGFnaW5hdGlvbiBjb250cm9scywgb3ZlcmZsb3cteCBzaG91bGQgZGVmYXVsdCB0byBo
aWRkZW4KLSAgICAgICAgLy8gaWYgb3ZlcmZsb3cteSBpcyBzZXQgdG8gLXdlYmtpdC1wYWdlZC14
IG9yIC13ZWJraXQtcGFnZS15LiBGb3Igbm93LCB3ZSdsbCBsZXQgaXQKLSAgICAgICAgLy8gZGVm
YXVsdCB0byBhdXRvIHNvIHdlIGNhbiBhdCBsZWFzdCBzY3JvbGwgdGhyb3VnaCB0aGUgcGFnZXMu
Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT0FVVE8pOwotICAgIH0gZWxzZSBpZiAoc3R5
bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklT
SUJMRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPQVVUTyk7Ci0KLSAgICAvLyBDYWxs
IHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKCkgaWYgYSBwYWdpbmF0aW9uIG1vZGUgaXMgc2V0
IGZvciBhbnkgbm9uLXJvb3QgZWxlbWVudHMuIElmIHRoZXNlCi0gICAgLy8gc3R5bGVzIGFyZSBz
cGVjaWZpZWQgb24gYSByb290IGVsZW1lbnQsIHRoZW4gdGhleSB3aWxsIGJlIGluY29ycG9yYXRl
ZCBpbgotICAgIC8vIFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoKS4KLSAgICBpZiAo
KHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURYIHx8IHN0eWxlLT5vdmVyZmxvd1koKSA9PSBP
UEFHRURZKSAmJiAhKGUgJiYgKGUtPmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgZS0+aGFzVGFnTmFt
ZShib2R5VGFnKSkpKQotICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShXZWJDb3Jl
OjpwYWdpbmF0aW9uTW9kZUZvclJlbmRlclN0eWxlKHN0eWxlKSwgc3R5bGUpOwotCi0gICAgLy8g
VGFibGUgcm93cywgc2VjdGlvbnMgYW5kIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBzdXBwb3J0IG92
ZXJmbG93OmhpZGRlbiBhbmQgd2lsbCBpZ25vcmUgc2Nyb2xsL2F1dG8uCi0gICAgLy8gRklYTUU6
IEV2ZW50dWFsbHkgdGFibGUgc2VjdGlvbnMgd2lsbCBzdXBwb3J0IGF1dG8gYW5kIHNjcm9sbC4K
LSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09
IElOTElORV9UQUJMRQotICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19H
Uk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVykgewotICAgICAgICBpZiAoc3R5
bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElE
REVOKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0gICAgICAg
IGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgp
ICE9IE9ISURERU4pCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsK
LSAgICB9Ci0KLSAgICAvLyBNZW51bGlzdHMgc2hvdWxkIGhhdmUgdmlzaWJsZSBvdmVyZmxvdwot
ICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkgewotICAgICAgICBz
dHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93
WShPVklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8gQ3VsbCBvdXQgYW55IHVzZWxlc3MgbGF5ZXJz
IGFuZCBhbHNvIHJlcGVhdCBwYXR0ZXJucyBpbnRvIGFkZGl0aW9uYWwgbGF5ZXJzLgotICAgIHN0
eWxlLT5hZGp1c3RCYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAgc3R5bGUtPmFkanVzdE1hc2tMYXll
cnMoKTsKLQotICAgIC8vIERvIHRoZSBzYW1lIGZvciBhbmltYXRpb25zIGFuZCB0cmFuc2l0aW9u
cy4KLSAgICBzdHlsZS0+YWRqdXN0QW5pbWF0aW9ucygpOwotICAgIHN0eWxlLT5hZGp1c3RUcmFu
c2l0aW9ucygpOwotCi0gICAgLy8gSW1wb3J0YW50OiBJbnRyaW5zaWMgbWFyZ2lucyBnZXQgYWRk
ZWQgdG8gY29udHJvbHMgYmVmb3JlIHRoZSB0aGVtZSBoYXMgYWRqdXN0ZWQgdGhlIHN0eWxlLCBz
aW5jZSB0aGUgdGhlbWUgd2lsbAotICAgIC8vIGFsdGVyIGZvbnRzIGFuZCBoZWlnaHRzL3dpZHRo
cy4KLSAgICBpZiAoZSAmJiBlLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpICYmIHN0eWxlLT5mb250
U2l6ZSgpID49IDExKSB7Ci0gICAgICAgIC8vIERvbid0IGFwcGx5IGludHJpbnNpYyBtYXJnaW5z
IHRvIGltYWdlIGJ1dHRvbnMuIFRoZSBkZXNpZ25lciBrbm93cyBob3cgYmlnIHRoZSBpbWFnZXMg
YXJlLAotICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHRyZWF0IGFsbCBpbWFnZSBidXR0b25zIGFz
IHRob3VnaCB0aGV5IHdlcmUgZXhwbGljaXRseSBzaXplZC4KLSAgICAgICAgaWYgKCFlLT5oYXNU
YWdOYW1lKGlucHV0VGFnKSB8fCAhc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGUpLT5p
c0ltYWdlQnV0dG9uKCkpCi0gICAgICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsK
LSAgICB9Ci0KLSAgICAvLyBMZXQgdGhlIHRoZW1lIGFsc28gaGF2ZSBhIGNyYWNrIGF0IGFkanVz
dGluZyB0aGUgc3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAg
IFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWRqdXN0U3R5bGUodGhpcywgc3R5bGUsIGUs
IG1fc3RhdGUuaGFzVUFBcHBlYXJhbmNlKCksIG1fc3RhdGUuYm9yZGVyRGF0YSgpLCBtX3N0YXRl
LmJhY2tncm91bmREYXRhKCksIG1fc3RhdGUuYmFja2dyb3VuZENvbG9yKCkpOwotCi0gICAgLy8g
SWYgd2UgaGF2ZSBmaXJzdC1sZXR0ZXIgcHNldWRvIHN0eWxlLCBkbyBub3Qgc2hhcmUgdGhpcyBz
dHlsZS4KLSAgICBpZiAoc3R5bGUtPmhhc1BzZXVkb1N0eWxlKEZJUlNUX0xFVFRFUikpCi0gICAg
ICAgIHN0eWxlLT5zZXRVbmlxdWUoKTsKLQotICAgIC8vIEZJWE1FOiB3aGVuIGRyb3BwaW5nIHRo
ZSAtd2Via2l0IHByZWZpeCBvbiB0cmFuc2Zvcm0tc3R5bGUsIHdlIHNob3VsZCBhbHNvIGhhdmUg
b3BhY2l0eSA8IDEgY2F1c2UgZmxhdHRlbmluZy4KLSAgICBpZiAoc3R5bGUtPnByZXNlcnZlczNE
KCkgJiYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRQotICAgICAgICB8fCBzdHlsZS0+
b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUKLSAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpKSkK
LSAgICAgICAgc3R5bGUtPnNldFRyYW5zZm9ybVN0eWxlM0QoVHJhbnNmb3JtU3R5bGUzREZsYXQp
OwotCi0gICAgLy8gU2VhbWxlc3MgaWZyYW1lcyBiZWhhdmUgbGlrZSBibG9ja3MuIE1hcCB0aGVp
ciBkaXNwbGF5IHRvIGlubGluZS1ibG9jayB3aGVuIG1hcmtlZCBpbmxpbmUuCi0gICAgaWYgKGUg
JiYgZS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpICYmIHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5F
ICYmIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4oZSktPnNob3VsZERpc3BsYXlTZWFt
bGVzc2x5KCkpCi0gICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7Ci0KLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIGlmIChlICYmIGUtPmlzU1ZHRWxlbWVudCgpKSB7Ci0gICAgICAg
IC8vIFNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwjT3ZlcmZsb3dQ
cm9wZXJ0eQotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9TQ1JPTEwpCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9ISURERU4pOwotICAgICAgICBlbHNlIGlmIChz
dHlsZS0+b3ZlcmZsb3dZKCkgPT0gT0FVVE8pCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZs
b3dZKE9WSVNJQkxFKTsKLQotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9TQ1JP
TEwpCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOwotICAgICAgICBl
bHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT0FVVE8pCi0gICAgICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKLQotICAgICAgICAvLyBPbmx5IHRoZSByb290IDxzdmc+
IGVsZW1lbnQgaW4gYW4gU1ZHIGRvY3VtZW50IGZyYWdtZW50IHRyZWUgaG9ub3JzIGNzcyBwb3Np
dGlvbgotICAgICAgICBpZiAoIShlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpICYmIGUt
PnBhcmVudE5vZGUoKSAmJiAhZS0+cGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQoKSkpCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oUmVuZGVyU3R5bGU6OmluaXRpYWxQb3NpdGlvbigp
KTsKLQotICAgICAgICAvLyBSZW5kZXJTVkdSb290IGhhbmRsZXMgem9vbWluZyBmb3IgdGhlIHdo
b2xlIFNWRyBzdWJ0cmVlLCBzbyBmb3JlaWduT2JqZWN0IGNvbnRlbnQgc2hvdWxkCi0gICAgICAg
IC8vIG5vdCBiZSBzY2FsZWQgYWdhaW4uCi0gICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKFNWR05h
bWVzOjpmb3JlaWduT2JqZWN0VGFnKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRFZmZlY3RpdmVa
b29tKFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgpKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotYm9v
bCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQp
Ci17Ci0gICAgLy8gRklYTUUgKEJVRyA3MjQ3Mik6IFdlIGRvbid0IGFkZCBALXdlYmtpdC1yZWdp
b24gcnVsZXMgb2Ygc2NvcGVkIHN0eWxlIHNoZWV0cyBmb3IgdGhlIG1vbWVudCwKLSAgICAvLyBz
byBhbGwgcmVnaW9uIHJ1bGVzIGFyZSBnbG9iYWwgYnkgZGVmYXVsdC4gVmVyaWZ5IHdoZXRoZXIg
dGhhdCBjYW4gc3RhbmQgb3IgbmVlZHMgY2hhbmdpbmcuCi0KLSAgICB1bnNpZ25lZCBydWxlc1Np
emUgPSBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNl
dHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkg
ewotICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVj
dG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOwotICAgICAgICBpZiAoY2hlY2tS
ZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQotICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1fcnVsZVNldHMudXNlclN0eWxlKCkpIHsK
LSAgICAgICAgcnVsZXNTaXplID0gbV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxl
Y3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBydWxlc1NpemU7ICsraSkgewotICAgICAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMudXNlclN0
eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7
Ci0gICAgICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLnVzZXJTdHls
ZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25F
bGVtZW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tGb3JPcmllbnRhdGlv
bkNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgRm9udE9yaWVudGF0aW9uIGZvbnRP
cmllbnRhdGlvbjsKLSAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247
Ci0gICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oc3R5bGUsIGZvbnRPcmllbnRhdGlvbiwg
Z2x5cGhPcmllbnRhdGlvbik7Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNj
cmlwdGlvbiA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICBpZiAoZm9udERlc2NyaXB0
aW9uLm9yaWVudGF0aW9uKCkgPT0gZm9udE9yaWVudGF0aW9uICYmIGZvbnREZXNjcmlwdGlvbi5u
b25DSktHbHlwaE9yaWVudGF0aW9uKCkgPT0gZ2x5cGhPcmllbnRhdGlvbikKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihmb250RGVzY3Jp
cHRpb24pOwotICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9u
KGdseXBoT3JpZW50YXRpb24pOwotICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlv
bihmb250T3JpZW50YXRpb24pOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9u
dERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjp1cGRhdGVGb250KCkKLXsK
LSAgICBpZiAoIW1fc3RhdGUuZm9udERpcnR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFJl
bmRlclN0eWxlKiBzdHlsZSA9IG1fc3RhdGUuc3R5bGUoKTsKLSAgICBjaGVja0ZvckdlbmVyaWNG
YW1pbHlDaGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3Ja
b29tQ2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotICAgIGNoZWNrRm9yT3Jp
ZW50YXRpb25DaGFuZ2Uoc3R5bGUpOwotICAgIHN0eWxlLT5mb250KCkudXBkYXRlKG1fZm9udFNl
bGVjdG9yKTsKLSAgICBtX3N0YXRlLnNldEZvbnREaXJ0eShmYWxzZSk7Ci19Ci0KLVBhc3NSZWZQ
dHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1l
bnQqIGUsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlKQotewotICAgIHJldHVybiBwc2V1ZG9TdHls
ZVJ1bGVzRm9yRWxlbWVudChlLCBOT1BTRVVETywgcnVsZXNUb0luY2x1ZGUpOwotfQotCi1QYXNz
UmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxl
bWVudChFbGVtZW50KiBlLCBQc2V1ZG9JZCBwc2V1ZG9JZCwgdW5zaWduZWQgcnVsZXNUb0luY2x1
ZGUpCi17Ci0gICAgaWYgKCFlIHx8ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2Fk
ZWQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JD
aGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOwotCi0gICAgaW5pdEVsZW1lbnQoZSk7Ci0gICAgbV9z
dGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKLQot
ICAgIE1hdGNoUmVzdWx0IGR1bW15OwotICAgIGlmIChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNl
ckNTU1J1bGVzKSB7Ci0gICAgICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVz
ZXIgYWdlbnQgc2hlZXQuCi0gICAgICAgIG1hdGNoVUFSdWxlcyhkdW1teSk7Ci0KLSAgICAgICAg
Ly8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgICAgIGlmIChtX21hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBydWxl
c1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwotICAgIH0KLQotICAgIGlmIChtX21hdGNoQXV0
aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNUb0luY2x1ZGUgJiBBdXRob3JDU1NSdWxlcykpIHsK
LSAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jv
c3NPcmlnaW5DU1NSdWxlcykpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRo
b3Igc2hlZXRzLgotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVk
ZSAmIEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHko
ZmFsc2UpOwotICAgIH0KLQotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJl
c29sdmluZ1N0eWxlKTsKLQotICAgIHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOwotfQot
Ci1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYg
cnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1Bz
ZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5k
YXJ5KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAocnVsZURhdGEu
aGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNl
bGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYg
KHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNp
bXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5k
IGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KLSAgICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhU
TUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2UuCi0gICAgICAg
IGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxl
SGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAg
ICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCkt
Pm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRj
aGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRo
IHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1l
bnQoKSk7Ci0gICAgICAgIGlmICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0
bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsKLSAgICB9Ci0K
LSAgICAvLyBTbG93IHBhdGguCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihk
b2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JD
aGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50
KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5l
bGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwotICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsK
LSAgICBjb250ZXh0LnBzZXVkb0lkID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRv
SWQ7Ci0gICAgY29udGV4dC5zY3JvbGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5z
Y3JvbGxiYXI7Ci0gICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVS
ZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9
IGJlaGF2aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0g
c2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdU
cmF2ZXJzYWxTdHJhdGVneSgpKTsKLSAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpT
ZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUucHNl
dWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5
bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVn
aW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiBy
ZWdpb25FbGVtZW50KQotewotICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1l
bnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3Rv
ckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5tb2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NT
U2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4
dChzKSkgewotICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0
IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tl
cjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwotICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWlj
UHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2Vs
ZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2
ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhpcyBpcyBtb3N0bHkgYm9yaW5n
IHN0dWZmIG9uIGhvdyB0byBhcHBseSBhIGNlcnRhaW4gcnVsZSB0byB0aGUgcmVuZGVyc3R5bGUu
Li4KLQotTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUq
IHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCi17Ci0gICAgcmV0dXJuIHByaW1pdGl2ZVZh
bHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJz
aW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9u
Q29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5
bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Ci19Ci0KLUxlbmd0aCBTdHlsZVJl
c29sdmVyOjpjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZl
VmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91Ymxl
IG11bHRpcGxpZXIpCi17Ci0gICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFs
dWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEZsb2F0Q29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJz
aW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9y
dFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExl
bmd0aChVbmRlZmluZWQpOwotfQotCi10ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBs
aWNhdGlvblBhc3MgcGFzcz4KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0aWVzKGNv
bnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgYm9vbCBp
c0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJv
cGVydHlXaGl0ZWxpc3RUeXBlKQotewotICAgIEFTU0VSVCgocHJvcGVydHlXaGl0ZWxpc3RUeXBl
ICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uKSB8fCBtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmco
KSk7Ci0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nlc3NSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMp
OwotCi0gICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5Q291
bnQoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7
Ci0gICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIGN1cnJlbnQgPSBw
cm9wZXJ0aWVzLT5wcm9wZXJ0eUF0KGkpOwotICAgICAgICBpZiAoaXNJbXBvcnRhbnQgIT0gY3Vy
cmVudC5pc0ltcG9ydGFudCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChp
bmhlcml0ZWRPbmx5ICYmICFjdXJyZW50LmlzSW5oZXJpdGVkKCkpIHsKLSAgICAgICAgICAgIC8v
IElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBleHBsaWNpdGx5IGluaGVyaXRlZCwgd2UgbmVlZCB0
byBhcHBseSBmdXJ0aGVyIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcwotICAgICAgICAgICAgLy8g
YXMgdGhleSBtaWdodCBvdmVycmlkZSB0aGUgdmFsdWUgaW5oZXJpdGVkIGhlcmUuIEZvciB0aGlz
IHJlYXNvbiB3ZSBkb24ndCBhbGxvdyBkZWNsYXJhdGlvbnMgd2l0aAotICAgICAgICAgICAgLy8g
ZXhwbGljaXRseSBpbmhlcml0ZWQgcHJvcGVydGllcyB0byBiZSBjYWNoZWQuCi0gICAgICAgICAg
ICBBU1NFUlQoIWN1cnJlbnQudmFsdWUoKS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkg
PSBjdXJyZW50LmlkKCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQ
cm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbiAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0
eWxlUHJvcGVydHkocHJvcGVydHkpKQotICAgICAgICAgICAgY29udGludWU7Ci0jaWYgRU5BQkxF
KFZJREVPX1RSQUNLKQotICAgICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3Bl
cnR5V2hpdGVsaXN0Q3VlICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0
eShwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSNlbmRpZgotICAgICAgICBzd2l0
Y2ggKHBhc3MpIHsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAgICAgY2FzZSBWYXJp
YWJsZURlZmluaXRpb25zOgotICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlW
YXJpYWJsZSA8IGZpcnN0Q1NTUHJvcGVydHksIENTU192YXJpYWJsZV9pc19iZWZvcmVfZmlyc3Rf
cHJvcGVydHkpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFi
bGUpCi0gICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQu
dmFsdWUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBjYXNlIEhpZ2hQ
cmlvcml0eVByb3BlcnRpZXM6Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChmaXJzdENTU1By
b3BlcnR5ID09IENTU1Byb3BlcnR5Q29sb3IsIENTU19jb2xvcl9pc19maXJzdF9wcm9wZXJ0eSk7
Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVpvb20gPT0gQ1NTUHJvcGVy
dHlDb2xvciArIDE3LCBDU1Nfem9vbV9pc19lbmRfb2ZfZmlyc3RfcHJvcF9yYW5nZSk7Ci0gICAg
ICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eUxpbmVIZWlnaHQgPT0gQ1NTUHJvcGVy
dHlab29tICsgMSwgQ1NTX2xpbmVfaGVpZ2h0X2lzX2FmdGVyX3pvb20pOwotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFy
aWFibGUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8v
IGdpdmUgc3BlY2lhbCBwcmlvcml0eSB0byBmb250LXh4eCwgY29sb3IgcHJvcGVydGllcywgZXRj
Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgPCBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAg
ICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7
Ci0gICAgICAgICAgICAvLyB3ZSBhcHBseSBsaW5lLWhlaWdodCBsYXRlcgotICAgICAgICAgICAg
ZWxzZSBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQotICAgICAgICAgICAg
ICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMb3dQcmlvcml0eVByb3BlcnRpZXM6Ci0gICAgICAg
ICAgICBpZiAocHJvcGVydHkgPiBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAg
ICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRQcm9jZXNzUnVsZShj
b29raWUpOwotfQotCi10ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBh
c3MgcGFzcz4KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25z
dCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGJvb2wgaXNJbXBvcnRhbnQsIGludCBzdGFydElu
ZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSkKLXsKLSAgICBpZiAoc3RhcnRJ
bmRleCA9PSAtMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLSAgICBpZiAoc3RhdGUuc3R5bGUoKS0+aW5zaWRlTGluaygpICE9IE5vdEluc2lkZUxpbmsp
IHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkg
ewotICAgICAgICAgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVz
ID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07Ci0gICAgICAgICAgICB1bnNpZ25l
ZCBsaW5rTWF0Y2hUeXBlID0gbWF0Y2hlZFByb3BlcnRpZXMubGlua01hdGNoVHlwZTsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlciB0byBwYXNzIHRoZXNlIGFzIGFyZ3Vt
ZW50cyBidXQgdGhhdCByZXF1aXJlcyBjaGFuZ2VzIGluIG1hbnkgcGxhY2VzLgotICAgICAgICAg
ICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGxpbmtNYXRjaFR5cGUgJiBT
ZWxlY3RvckNoZWNrZXI6Ok1hdGNoTGluayk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVBy
b3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6
Ok1hdGNoVmlzaXRlZCk7Ci0KLSAgICAgICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRj
aGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNb
aV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRl
bGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKLSAgICAgICAgfQot
ICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSk7Ci0gICAg
ICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVu
ZEluZGV4OyArK2kpIHsKLSAgICAgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQ
cm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07Ci0gICAgICAgIGFw
cGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBt
YXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBz
dGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRl
bGlzdFR5cGUpKTsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIFN0eWxlUmVzb2x2ZXI6OmNvbXB1dGVN
YXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqIHByb3BlcnRpZXMs
IHVuc2lnbmVkIHNpemUpCi17Ci0gICAgCi0gICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6aGFzaE1l
bW9yeShwcm9wZXJ0aWVzLCBzaXplb2YoTWF0Y2hlZFByb3BlcnRpZXMpICogc2l6ZSk7Ci19Ci0K
LWJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29u
c3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCi17Ci0gICAgcmV0dXJuIGEuZmlyc3RV
QVJ1bGUgPT0gYi5maXJzdFVBUnVsZQotICAgICAgICAmJiBhLmxhc3RVQVJ1bGUgPT0gYi5sYXN0
VUFSdWxlCi0gICAgICAgICYmIGEuZmlyc3RBdXRob3JSdWxlID09IGIuZmlyc3RBdXRob3JSdWxl
Ci0gICAgICAgICYmIGEubGFzdEF1dGhvclJ1bGUgPT0gYi5sYXN0QXV0aG9yUnVsZQotICAgICAg
ICAmJiBhLmZpcnN0VXNlclJ1bGUgPT0gYi5maXJzdFVzZXJSdWxlCi0gICAgICAgICYmIGEubGFz
dFVzZXJSdWxlID09IGIubGFzdFVzZXJSdWxlOwotfQotCi1ib29sIG9wZXJhdG9yIT0oY29uc3Qg
U3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNo
UmFuZ2VzJiBiKQotewotICAgIHJldHVybiAhKGEgPT0gYik7Ci19Ci0KLWJvb2wgb3BlcmF0b3I9
PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVS
ZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGIpCi17Ci0gICAgcmV0dXJuIGEucHJvcGVydGll
cyA9PSBiLnByb3BlcnRpZXMgJiYgYS5saW5rTWF0Y2hUeXBlID09IGIubGlua01hdGNoVHlwZTsK
LX0KLQotYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0
aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYikKLXsKLSAg
ICByZXR1cm4gIShhID09IGIpOwotfQotCi1jb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJv
cGVydGllc0NhY2hlSXRlbSogU3R5bGVSZXNvbHZlcjo6ZmluZEZyb21NYXRjaGVkUHJvcGVydGll
c0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKLXsK
LSAgICBBU1NFUlQoaGFzaCk7Ci0KLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRv
ciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5maW5kKGhhc2gpOwotICAgIGlmIChpdCA9
PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCkpCi0gICAgICAgIHJldHVybiAwOwotICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtJiBjYWNoZUl0ZW0gPSBpdC0+dmFsdWU7Ci0KLSAg
ICBzaXplX3Qgc2l6ZSA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKLSAg
ICBpZiAoc2l6ZSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAg
ICAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV0gIT0gY2FjaGVJdGVtLm1h
dGNoZWRQcm9wZXJ0aWVzW2ldKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlm
IChjYWNoZUl0ZW0ucmFuZ2VzICE9IG1hdGNoUmVzdWx0LnJhbmdlcykKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgcmV0dXJuICZjYWNoZUl0ZW07Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRk
VG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3Qg
UmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3Vs
dCYgbWF0Y2hSZXN1bHQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNs
YXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3ZWVwcyA9IDEwMDsKLSAgICBpZiAoKyttX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCA+PSBtYXRjaGVkRGVj
bGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5Td2VlcHMKLSAgICAgICAgJiYgIW1fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIuaXNBY3RpdmUoKSkgewotICAgICAgICBzdGF0aWMg
Y29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMg
PSA2MDsKLSAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lci5zdGFydE9u
ZVNob3QobWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMpOwotICAgIH0K
LQotICAgIEFTU0VSVChoYXNoKTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSBjYWNo
ZUl0ZW07Ci0gICAgY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzLmFwcGVuZChtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcyk7Ci0gICAgY2FjaGVJdGVtLnJhbmdlcyA9IG1hdGNoUmVzdWx0
LnJhbmdlczsKLSAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FjaGUgdGhlIG9yaWdpbmFsIFJl
bmRlclN0eWxlIGluc3RhbmNlLiBJdCBtYXkgYmUgZnVydGhlciBtb2RpZmllZC4KLSAgICAvLyBU
aGUgUmVuZGVyU3R5bGUgaW4gdGhlIGNhY2hlIGlzIHJlYWxseSBqdXN0IGEgaG9sZGVyIGZvciB0
aGUgc3Vic3RydWN0dXJlcyBhbmQgbmV2ZXIgdXNlZCBhcy1pcy4KLSAgICBjYWNoZUl0ZW0ucmVu
ZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3R5bGUpOwotICAgIGNhY2hlSXRlbS5wYXJl
bnRSZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShwYXJlbnRTdHlsZSk7Ci0gICAgbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlLmFkZChoYXNoLCBjYWNoZUl0ZW0pOwotfQotCi12b2lkIFN0
eWxlUmVzb2x2ZXI6OmludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCkKLXsKLSAgICBt
X21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuY2xlYXIoKTsKLX0KLQotc3RhdGljIGJvb2wgaXNDYWNo
ZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgRWxlbWVudCogZWxlbWVudCwgY29u
c3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17
Ci0gICAgLy8gRklYTUU6IENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGUgbW9kaWZpZXMgc3Rh
dGUgd2hlbiBhcHBseWluZyB0byBkb2N1bWVudCBlbGVtZW50LiBXZSBjYW4ndCBza2lwIHRoZSBh
cHBseWluZyBieSBjYWNoaW5nLgotICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50
KCktPmRvY3VtZW50RWxlbWVudCgpICYmIGVsZW1lbnQtPmRvY3VtZW50KCktPndyaXRpbmdNb2Rl
U2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChz
dHlsZS0+dW5pcXVlKCkgfHwgKHN0eWxlLT5zdHlsZVR5cGUoKSAhPSBOT1BTRVVETyAmJiBwYXJl
bnRTdHlsZS0+dW5pcXVlKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxl
LT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUt
Pnpvb20oKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlh
bFdyaXRpbmdNb2RlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyBUaGUgY2FjaGUg
YXNzdW1lcyBzdGF0aWMga25vd2xlZGdlIGFib3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaGVy
aXRlZC4KLSAgICBpZiAocGFyZW50U3R5bGUtPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0
aWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0
JiBtYXRjaFJlc3VsdCwgY29uc3QgRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBBU1NFUlQoZWxl
bWVudCk7Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICB1bnNpZ25lZCBjYWNoZUhh
c2ggPSBtYXRjaFJlc3VsdC5pc0NhY2hlYWJsZSA/IGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hh
c2gobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuZGF0YSgpLCBtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkpIDogMDsKLSAgICBib29sIGFwcGx5SW5oZXJpdGVkT25seSA9
IGZhbHNlOwotICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBjYWNoZUl0ZW0g
PSAwOwotICAgIGlmIChjYWNoZUhhc2ggJiYgKGNhY2hlSXRlbSA9IGZpbmRGcm9tTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KSkpIHsKLSAgICAgICAgLy8gV2Ug
Y2FuIGJ1aWxkIHVwIHRoZSBzdHlsZSBieSBjb3B5aW5nIG5vbi1pbmhlcml0ZWQgcHJvcGVydGll
cyBmcm9tIGFuIGVhcmxpZXIgc3R5bGUgb2JqZWN0IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGV4YWN0
Ci0gICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0aW9ucy4gV2UgdGhlbiBvbmx5IG5lZWQgdG8gYXBw
bHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBpZiBhbnksIGFzIHRoZWlyIHZhbHVlcyBjYW4g
ZGVwZW5kIG9uIHRoZSAKLSAgICAgICAgLy8gZWxlbWVudCBjb250ZXh0LiBUaGlzIGlzIGZhc3Qg
YW5kIHNhdmVzIG1lbW9yeSBieSByZXVzaW5nIHRoZSBzdHlsZSBkYXRhIHN0cnVjdHVyZXMuCi0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPmNvcHlOb25Jbmhlcml0ZWRGcm9tKGNhY2hlSXRlbS0+cmVu
ZGVyU3R5bGUuZ2V0KCkpOwotICAgICAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUoKS0+aW5oZXJp
dGVkRGF0YVNoYXJlZChjYWNoZUl0ZW0tPnBhcmVudFJlbmRlclN0eWxlLmdldCgpKSAmJiAhaXNB
dFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBFSW5zaWRlTGluayBsaW5r
U3RhdHVzID0gc3RhdGUuc3R5bGUoKS0+aW5zaWRlTGluaygpOwotICAgICAgICAgICAgLy8gSWYg
dGhlIGNhY2hlIGl0ZW0gcGFyZW50IHN0eWxlIGhhcyBpZGVudGljYWwgaW5oZXJpdGVkIHByb3Bl
cnRpZXMgdG8gdGhlIGN1cnJlbnQgcGFyZW50IHN0eWxlIHRoZW4gdGhlCi0gICAgICAgICAgICAv
LyByZXN1bHRpbmcgc3R5bGUgd2lsbCBiZSBpZGVudGljYWwgdG9vLiBXZSBjb3B5IHRoZSBpbmhl
cml0ZWQgcHJvcGVydGllcyBvdmVyIGZyb20gdGhlIGNhY2hlIGFuZCBhcmUgZG9uZS4KLSAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUu
Z2V0KCkpOwotCi0gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBsaW5rIHN0YXR1cyBp
cyB0cmVhdGVkIGxpa2UgYW4gaW5oZXJpdGVkIHByb3BlcnR5LiBXZSBuZWVkIHRvIGV4cGxpY2l0
bHkgcmVzdG9yZSBpdC4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmso
bGlua1N0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXBw
bHlJbmhlcml0ZWRPbmx5ID0gdHJ1ZTsgCi0gICAgfQotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJM
RVMpCi0gICAgLy8gRmlyc3QgYXBwbHkgYWxsIHZhcmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5
IG1heSBiZSB1c2VkIGR1cmluZyBhcHBsaWNhdGlvbiBvZiBsYXRlciBwcm9wZXJ0aWVzLgotICAg
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQs
IGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBs
eUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZp
bml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhv
clJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRP
bmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1h
dGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVl
LCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotI2VuZGlmCi0KLSAgICAvLyBOb3cgd2UgaGF2
ZSBhbGwgb2YgdGhlIG1hdGNoZWQgcnVsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyLiBXYWxr
IHRoZSBydWxlcyBhbmQgYXBwbHkKLSAgICAvLyBoaWdoLXByaW9yaXR5IHByb3BlcnRpZXMgZmly
c3QsIGkuZS4sIHRob3NlIHByb3BlcnRpZXMgdGhhdCBvdGhlciBwcm9wZXJ0aWVzIGRlcGVuZCBv
bi4KLSAgICAvLyBUaGUgb3JkZXIgaXMgKDEpIGhpZ2gtcHJpb3JpdHkgbm90IGltcG9ydGFudCwg
KDIpIGhpZ2gtcHJpb3JpdHkgaW1wb3J0YW50LCAoMykgbm9ybWFsIG5vdCBpbXBvcnRhbnQKLSAg
ICAvLyBhbmQgKDQpIG5vcm1hbCBpbXBvcnRhbnQuCi0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKDApOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGll
cz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRp
ZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0
LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVs
ZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQ
cmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMu
Zmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3Bl
cnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUs
IG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotCi0g
ICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5lZmZlY3RpdmVab29t
KCkgIT0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKSB7Ci0gICAgICAgIHN0YXRlLnNl
dEZvbnREaXJ0eSh0cnVlKTsKLSAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0g
ICAgfQotCi0gICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRh
dGUgaXQgbm93LgotICAgIHVwZGF0ZUZvbnQoKTsKLQotICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNl
dCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4KLSAgICBpZiAo
c3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVy
dHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7Ci0KLSAgICAvLyBNYW55IHBy
b3BlcnRpZXMgZGVwZW5kIG9uIHRoZSBmb250LiBJZiBpdCBjaGFuZ2VzIHdlIGp1c3QgYXBwbHkg
YWxsIHByb3BlcnRpZXMuCi0gICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0
eWxlLT5mb250RGVzY3JpcHRpb24oKSAhPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KSkKLSAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0KLSAgICAvLyBOb3cgZG8g
dGhlIG5vcm1hbCBwcmlvcml0eSBVQSBwcm9wZXJ0aWVzLgotICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVz
dWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFw
cGx5SW5oZXJpdGVkT25seSk7Ci0gICAgCi0gICAgLy8gQ2FjaGUgb3VyIGJvcmRlciBhbmQgYmFj
a2dyb3VuZCBzbyB0aGF0IHdlIGNhbiBleGFtaW5lIHRoZW0gbGF0ZXIuCi0gICAgc3RhdGUuY2Fj
aGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Ci0gICAgCi0gICAgLy8gTm93IGRvIHRoZSBhdXRob3Ig
YW5kIHVzZXIgbm9ybWFsIHByaW9yaXR5IHByb3BlcnRpZXMgYW5kIGFsbCB0aGUgIWltcG9ydGFu
dCBwcm9wZXJ0aWVzLgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9w
ZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxl
ICsgMSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVy
dGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1
bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5
KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0
Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJl
c3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFz
dFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgIAotICAgIC8vIFN0YXJ0IGxvYWRpbmcg
cmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ1Jlc291
cmNlcygpOwotICAgIAotICAgIEFTU0VSVCghc3RhdGUuZm9udERpcnR5KCkpOwotICAgIAotICAg
IGlmIChjYWNoZUl0ZW0gfHwgIWNhY2hlSGFzaCkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICgh
aXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuZWxlbWVudCgpLCBzdGF0
ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGFk
ZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHls
ZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGNv
bXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBh
Z2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIy
LT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlz
TGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0g
ICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPFN0eWxlUnVsZVBh
Z2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVk
UGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBw
YWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwg
bWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7Ci0KLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAg
YWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0
aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29u
c3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBh
Z2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3Rv
ciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50
LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NT
ZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFt
ZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChs
b2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENTU1NlbGVjdG9yOjpQ
c2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsKLSAgICAgICAg
aWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0
UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9S
aWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENT
U1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKLSAgICAgICAgewot
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0
b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQ
YWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0
cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNp
emUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVsZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKLQot
ICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3Rvcigp
LCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHks
IHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0
aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJv
cGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8g
QWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICBtYXRj
aGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0KLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpp
c0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxl
ZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7Ci0KLSAg
ICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAot
ewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2Ug
YXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KLSAgICByZXR1cm4gKCFw
YWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVSZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBh
Z2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXgg
dG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0dXJuICIiOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2
YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIGluaXRFbGVtZW50KDApOwotICAgIG1f
c3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCAwLCBzdHlsZSk7Ci0gICAgbV9z
dGF0ZS5zZXRTdHlsZShzdHlsZSk7Ci0gICAgYXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKGlk
LCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvQ3VycmVu
dFN0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFs
dWUpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoaWQsIHZhbHVlKTsKLX0KLQotaW5saW5lIGJvb2wg
aXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKLXsKLSAgICBzd2l0
Y2ggKGlkKSB7Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJS
aWdodENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVt
cGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKLSNpZiBFTkFCTEUoU1ZH
KQotICAgIGNhc2UgQ1NTUHJvcGVydHlGaWxsOgotICAgIGNhc2UgQ1NTUHJvcGVydHlTdHJva2U6
Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBodHRwOi8vZGV2LnczLm9y
Zy9jc3N3Zy9jc3MzLXJlZ2lvbnMvI3RoZS1hdC1yZWdpb24tc3R5bGUtcnVsZQotLy8gRklYTUU6
IGFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBvdGhlciByZWdpb24gc3R5bGluZyBwcm9wZXJ0
aWVzLgotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVy
dHkoQ1NTUHJvcGVydHlJRCBpZCkKLXsKLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLWlubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQg
aWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZENsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRY
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKLSAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlGb250OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFtaWx5OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250VmFyaWFudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udFdlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGluZUhlaWdodDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zm
c2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0eToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29y
YXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRTaGFkb3c6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlclN0eWxlOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAg
ICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0vLyBTVkcg
aGFuZGxlcyB6b29taW5nIGluIGEgZGlmZmVyZW50IHdheSBjb21wYXJlZCB0byBDU1MuIFRoZSB3
aG9sZSBkb2N1bWVudCBpcyBzY2FsZWQgaW5zdGVhZAotLy8gb2YgZWFjaCBpbmRpdmlkdWFsIGxl
bmd0aCB2YWx1ZSBpbiB0aGUgcmVuZGVyIHN0eWxlIC8gdHJlZS4gQ1NTUHJpbWl0aXZlVmFsdWU6
OmNvbXB1dGVMZW5ndGgqKCkKLS8vIG11bHRpcGxpZXMgZWFjaCByZXNvbHZlZCBsZW5ndGggd2l0
aCB0aGUgem9vbSBtdWx0aXBsaWVyIC0gc28gZm9yIFNWRyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhh
dC4KLS8vIFRob3VnaCBhbGwgQ1NTIHZhbHVlcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG91dGVy
bW9zdCA8c3ZnPiBlbGVtZW50cyAod2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5nLi4uKQotLy8g
bmVlZCB0byByZXNwZWN0IHRoZSBzY2FsaW5nLiBSZW5kZXJCb3ggKHRoZSBwYXJlbnQgY2xhc3Mg
b2YgUmVuZGVyU1ZHUm9vdCkgZ3JhYnMgdmFsdWVzIGxpa2UKLS8vIHdpZHRoL2hlaWdodC9ib3Jk
ZXIvcGFkZGluZy8uLi4gZnJvbSB0aGUgUmVuZGVyU3R5bGUgLT4gZm9yIFNWRyB0aGVzZSB2YWx1
ZXMgd291bGQgbmV2ZXIgc2NhbGUsCi0vLyBpZiB3ZSdkIHBhc3MgYSAxLjAgem9vbSBmYWN0b3Ig
ZXZlcnlod2VyZS4gU28gd2Ugb25seSBwYXNzIGEgem9vbSBmYWN0b3Igb2YgMS4wIGZvciBzcGVj
aWZpYwotLy8gcHJvcGVydGllcyB0aGF0IGFyZSBOT1QgYWxsb3dlZCB0byBzY2FsZSB3aXRoaW4g
YSB6b29tZWQgU1ZHIGRvY3VtZW50IChsZXR0ZXIvd29yZC1zcGFjaW5nL2ZvbnQtc2l6ZSkuCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OnVzZVNWR1pvb21SdWxlcygpCi17Ci0gICAgcmV0dXJuIG1fc3Rh
dGUuZWxlbWVudCgpICYmIG1fc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKTsKLX0KLQot
c3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJp
bWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgTGVuZ3RoJiB3
b3JraW5nTGVuZ3RoKQotewotICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZVdlYmtpdE1pbkNvbnRlbnQpIHsKLSAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0
aChNaW5Db250ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlV2Via2l0TWF4Q29udGVudCkgewot
ICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3RoKE1heENvbnRlbnQpOwotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB3b3JraW5nTGVuZ3RoID0gcHJpbWl0aXZlVmFsdWUtPmNv
bnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24g
fCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uIHwgQXV0b0NvbnZlcnNpb24+KHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZl
Wm9vbSgpKTsKLSAgICBpZiAod29ya2luZ0xlbmd0aC5pc1VuZGVmaW5lZCgpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCi0gICAg
ICAgIHdvcmtpbmdMZW5ndGguc2V0UXVpcmsocHJpbWl0aXZlVmFsdWUtPmlzUXVpcmtWYWx1ZSgp
KTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tN
aW5NYXgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29s
dmVyOjpTdGF0ZSYgc3RhdGUsIEdyaWRUcmFja1NpemUmIHRyYWNrU2l6ZSkKLXsKLSAgICBQYWly
KiBtaW5NYXhUcmFja0JyZWFkdGggPSBwcmltaXRpdmVWYWx1ZS0+Z2V0UGFpclZhbHVlKCk7Ci0g
ICAgaWYgKCFtaW5NYXhUcmFja0JyZWFkdGgpIHsKLSAgICAgICAgTGVuZ3RoIHdvcmtpbmdMZW5n
dGg7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChwcmltaXRpdmVWYWx1ZSwg
c3RhdGUsIHdvcmtpbmdMZW5ndGgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
ICAgIHRyYWNrU2l6ZS5zZXRMZW5ndGgod29ya2luZ0xlbmd0aCk7Ci0gICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLQotICAgIExlbmd0aCBtaW5UcmFja0JyZWFkdGg7Ci0gICAgTGVuZ3RoIG1h
eFRyYWNrQnJlYWR0aDsKLSAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJh
Y2tCcmVhZHRoLT5maXJzdCgpLCBzdGF0ZSwgbWluVHJhY2tCcmVhZHRoKSB8fCAhY3JlYXRlR3Jp
ZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFkdGgtPnNlY29uZCgpLCBzdGF0ZSwgbWF4VHJh
Y2tCcmVhZHRoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdHJhY2tTaXplLnNldE1p
bk1heChtaW5UcmFja0JyZWFkdGgsIG1heFRyYWNrQnJlYWR0aCk7Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0dyb3VwKENTU1ZhbHVlKiB2YWx1ZSwg
Y29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4m
IHRyYWNrU2l6ZXMpCi17Ci0gICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVl
ID0gaS52YWx1ZSgpOwotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEdyaWRUcmFja1NpemUgdHJh
Y2tTaXplOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja01pbk1heChzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KGN1cnJWYWx1ZSksIHN0YXRlLCB0cmFja1NpemUpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHRyYWNrU2l6ZXMuYXBwZW5kKHRyYWNrU2l6
ZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlk
VHJhY2tMaXN0KENTU1ZhbHVlKiB2YWx1ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1Np
emVzLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUpCi17Ci0gICAgLy8gSGFuZGxl
ICdub25lJy4KLSAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpID09IENTU1ZhbHVlTm9uZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3JlYXRlR3JpZFRyYWNr
R3JvdXAodmFsdWUsIHN0YXRlLCB0cmFja1NpemVzKTsKLX0KLQotCi1zdGF0aWMgYm9vbCBjcmVh
dGVHcmlkUG9zaXRpb24oQ1NTVmFsdWUqIHZhbHVlLCBHcmlkUG9zaXRpb24mIHBvc2l0aW9uKQot
ewotICAgIC8vIEZvciBub3csIHdlIG9ubHkgYWNjZXB0OiA8aW50ZWdlcj4gfCAnYXV0bycKLSAg
ICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwotICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZUF1dG8pCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgQVNTRVJU
X1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04ocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpOwot
ICAgIHBvc2l0aW9uLnNldEludGVnZXJQb3NpdGlvbihwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFs
dWUoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykK
LXN0YXRpYyBib29sIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAg
ICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZh
bHVlKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5oYXNWYXJpYWJsZVJlZmVyZW5j
ZSgpOwotICAgIH0KLQotICAgIGlmICh2YWx1ZS0+aXNDYWxjdWxhdGlvblZhbHVlKCkpCi0gICAg
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1NDYWxjVmFsdWUqPih2YWx1ZSktPmhhc1ZhcmlhYmxl
UmVmZXJlbmNlKCk7Ci0KLSAgICBpZiAodmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpIHsKLSAgICAg
ICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0
VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBkaXJlY3Rpb24gPSBy
ZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogb2Zm
c2V0ID0gcmVmbGVjdFZhbHVlLT5vZmZzZXQoKTsKLSAgICAgICAgQ1NTVmFsdWUqIG1hc2sgPSBy
ZWZsZWN0VmFsdWUtPm1hc2soKTsKLSAgICAgICAgcmV0dXJuIChkaXJlY3Rpb24gJiYgaGFzVmFy
aWFibGVSZWZlcmVuY2UoZGlyZWN0aW9uKSkgfHwgKG9mZnNldCAmJiBoYXNWYXJpYWJsZVJlZmVy
ZW5jZShvZmZzZXQpKSB8fCAobWFzayAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShtYXNrKSk7Ci0g
ICAgfQotCi0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9y
ZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICBpZiAoaGFzVmFyaWFibGVSZWZlcmVuY2UoaS52
YWx1ZSgpKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpyZXNvbHZlVmFyaWFibGVzKENTU1Byb3Bl
cnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlE
LCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpCi17Ci0gICAgc3RkOjpwYWlyPENTU1Byb3Bl
cnR5SUQsIFN0cmluZz4gZXhwcmVzc2lvbihpZCwgdmFsdWUtPnNlcmlhbGl6ZVJlc29sdmluZ1Zh
cmlhYmxlcygqbV9zdGF0ZS5zdHlsZSgpLT52YXJpYWJsZXMoKSkpOwotCi0gICAgaWYgKGtub3du
RXhwcmVzc2lvbnMuY29udGFpbnMoZXhwcmVzc2lvbikpCi0gICAgICAgIHJldHVybjsgLy8gY3lj
bGUgZGV0ZWN0ZWQuCi0KLSAgICBrbm93bkV4cHJlc3Npb25zLmFwcGVuZChleHByZXNzaW9uKTsK
LQotICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBmYXN0ZXIgbm90IHRvIHJlLXBhcnNlIGZyb20g
c3RyaW5ncywgYnV0IGZvciBub3cgQ1NTIHByb3BlcnR5IHZhbGlkYXRpb24gbGl2ZXMgaW5zaWRl
IHRoZSBwYXJzZXIgc28gd2UgZG8gaXQgdGhlcmUuCi0gICAgUmVmUHRyPFN0eWxlUHJvcGVydHlT
ZXQ+IHJlc3VsdFNldCA9IFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpOwotICAgIGlmICghQ1NT
UGFyc2VyOjpwYXJzZVZhbHVlKHJlc3VsdFNldC5nZXQoKSwgaWQsIGV4cHJlc3Npb24uc2Vjb25k
LCBmYWxzZSwgZG9jdW1lbnQoKSkpCi0gICAgICAgIHJldHVybjsgLy8gZXhwcmVzc2lvbiBmYWls
ZWQgdG8gcGFyc2UuCi0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVzdWx0U2V0LT5w
cm9wZXJ0eUNvdW50KCk7IGkrKykgewotICAgICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0
eVJlZmVyZW5jZSBwcm9wZXJ0eSA9IHJlc3VsdFNldC0+cHJvcGVydHlBdChpKTsKLSAgICAgICAg
aWYgKHByb3BlcnR5LmlkKCkgIT0gQ1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJl
ZmVyZW5jZShwcm9wZXJ0eS52YWx1ZSgpKSkKLSAgICAgICAgICAgIHJlc29sdmVWYXJpYWJsZXMo
cHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSwga25vd25FeHByZXNzaW9ucyk7Ci0gICAg
ICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkocHJvcGVydHkuaWQoKSwgcHJvcGVy
dHkudmFsdWUoKSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBw
bHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCi17Ci0jaWYgRU5B
QkxFKENTU19WQVJJQUJMRVMpCi0gICAgaWYgKGlkICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYg
aGFzVmFyaWFibGVSZWZlcmVuY2UodmFsdWUpKSB7Ci0gICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8
Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+IGtub3duRXhwcmVzc2lvbnM7Ci0gICAgICAgIHJlc29s
dmVWYXJpYWJsZXMoaWQsIHZhbHVlLCBrbm93bkV4cHJlc3Npb25zKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gQ1NTIHZhcmlhYmxlcyBkb24ndCByZXNvbHZlIHNo
b3J0aGFuZHMgYXQgcGFyc2luZyB0aW1lLCBzbyB0aGlzIHNob3VsZCBiZSAqYWZ0ZXIqIGhhbmRs
aW5nIHZhcmlhYmxlcy4KLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFpc0V4cGFuZGVkU2hvcnRo
YW5kKGlkKSwgIlNob3J0aGFuZCBwcm9wZXJ0eSBpZCA9ICVkIHdhc24ndCBleHBhbmRlZCBhdCBw
YXJzaW5nIHRpbWUiLCBpZCk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGJv
b2wgaXNJbmhlcml0ID0gc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZh
bHVlKCk7Ci0gICAgYm9vbCBpc0luaXRpYWwgPSB2YWx1ZS0+aXNJbml0aWFsVmFsdWUoKSB8fCAo
IXN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsKLQotICAg
IEFTU0VSVCghaXNJbmhlcml0IHx8ICFpc0luaXRpYWwpOyAvLyBpc0luaGVyaXQgLT4gIWlzSW5p
dGlhbCAmJiBpc0luaXRpYWwgLT4gIWlzSW5oZXJpdAotICAgIEFTU0VSVCghaXNJbmhlcml0IHx8
IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUucGFyZW50U3R5bGUoKSkpOyAvLyBpc0luaGVy
aXQgLT4gKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKQotCi0gICAg
aWYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSAmJiAoIXN0YXRlLmFwcGx5
UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSB8fCAhaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVy
dHkoaWQpKSkgewotICAgICAgICAvLyBMaW1pdCB0aGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBh
cHBsaWVkIHRvIG9ubHkgdGhlIG9uZXMgaG9ub3JlZCBieSA6dmlzaXRlZC4KLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGlmIChpc0luaGVyaXQgJiYgIXN0YXRlLnBhcmVudFN0eWxlKCkt
Pmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgJiYgIUNTU1Byb3BlcnR5Ojppc0lu
aGVyaXRlZFByb3BlcnR5KGlkKSkKLSAgICAgICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0SGFz
RXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKTsKLQotI2lmIEVOQUJMRShDU1NfVkFSSUFC
TEVTKQotICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKSB7Ci0gICAgICAgIEFTU0VS
VF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHZhbHVlLT5pc1ZhcmlhYmxlVmFsdWUoKSk7Ci0g
ICAgICAgIENTU1ZhcmlhYmxlVmFsdWUqIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8Q1NTVmFyaWFi
bGVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+bmFtZSgpLmlzRW1w
dHkoKSk7Ci0gICAgICAgIEFTU0VSVCghdmFyaWFibGUtPnZhbHVlKCkuaXNFbXB0eSgpKTsKLSAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VmFyaWFibGUodmFyaWFibGUtPm5hbWUoKSwgdmFyaWFi
bGUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBD
aGVjayBsb29rdXAgdGFibGUgZm9yIGltcGxlbWVudGF0aW9ucyBhbmQgdXNlIHdoZW4gYXZhaWxh
YmxlLgotICAgIGNvbnN0IFByb3BlcnR5SGFuZGxlciYgaGFuZGxlciA9IG1fc3R5bGVCdWlsZGVy
LnByb3BlcnR5SGFuZGxlcihpZCk7Ci0gICAgaWYgKGhhbmRsZXIuaXNWYWxpZCgpKSB7Ci0gICAg
ICAgIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5oZXJpdFZhbHVl
KGlkLCB0aGlzKTsKLSAgICAgICAgZWxzZSBpZiAoaXNJbml0aWFsKQotICAgICAgICAgICAgaGFu
ZGxlci5hcHBseUluaXRpYWxWYWx1ZShpZCwgdGhpcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIGhhbmRsZXIuYXBwbHlWYWx1ZShpZCwgdGhpcywgdmFsdWUpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gdmFsdWUt
PmlzUHJpbWl0aXZlVmFsdWUoKSA/IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFs
dWUpIDogMDsKLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3Rp
dmVab29tKCk7Ci0KLSAgICAvLyBXaGF0IGZvbGxvd3MgaXMgYSBsaXN0IHRoYXQgbWFwcyB0aGUg
Q1NTIHByb3BlcnRpZXMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGZyb250LWVuZAotICAgIC8v
IFJlbmRlclN0eWxlIHZhbHVlcy4KLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgLy8gbGlzdHMKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoKLSAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVy
aSwgY291bnRlciwgYXR0ciwgaQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogSW4g
Q1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBpbmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQg
aXMgbm90LiBUaGlzCi0gICAgICAgICAgICAvLyBub3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVu
dHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIGlm
IChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRl
bnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwot
Ci0gICAgICAgICAgICBib29sIGRpZFNldCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewot
ICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwotICAgICAgICAgICAg
ICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICAgICAgICAg
ICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShz
dGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4oaXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jl
c29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdl
bmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+
KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNp
ZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0t
PmlzSW1hZ2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3Rh
dGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAg
ICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlVmFsdWUoKSkgewotICAgICAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRp
ZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlm
ICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotCi0gICAgICAgICAgICAgICAg
aWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBs
KCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUtPmlzQXR0cigpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBuYW1lc3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBh
dHRyKGZvbyk/Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5
cGUoKSA9PSBOT1BTRVVETykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFVuaXF1ZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAgICAgICAgICAg
ICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51bGxBdG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmlu
Z1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0
b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsK
LSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051
bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmltcGwoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhl
IGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGFmZmVjdHMgdGhlIHN0eWxlCi0gICAgICAg
ICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIu
bG9jYWxOYW1lKCkuaW1wbCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRW
YWx1ZS0+aXNDb3VudGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ291bnRlciogY291bnRl
clZhbHVlID0gY29udGVudFZhbHVlLT5nZXRDb3VudGVyVmFsdWUoKTsKLSAgICAgICAgICAgICAg
ICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0eWxlVHlwZSA9IE5vbmVMaXN0U3R5bGU7Ci0gICAg
ICAgICAgICAgICAgICAgIGludCBsaXN0U3R5bGVJZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0
eWxlSWRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENT
U1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0
aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlzdFN0eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOwot
ICAgICAgICAgICAgICAgICAgICBPd25QdHI8Q291bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9w
dFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291bnRlclZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RT
dHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2VwYXJhdG9yKCkpKTsKLSAgICAgICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsK
LSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQo
KSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlT3BlblF1b3RlOgotICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBk
aWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVl
Q2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENv
bnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRT
ZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5RdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fT1BFTl9RVU9URSwgZGlkU2V0KTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xP
U0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVl
OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90
IGhhdmUgYW55IGVmZmVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsgfQotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKCFkaWRTZXQpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250
ZW50KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICBjYXNlIENTU1Byb3Bl
cnR5UXVvdGVzOgotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFyZW50U3R5bGUoKS0+cXVvdGVzKCkpOwotICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcygwKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsKLSAgICAgICAg
ICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVl
KTsKLSAgICAgICAgICAgIFJlZlB0cjxRdW90ZXNEYXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpj
cmVhdGUoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3Ro
KCk7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVy
bnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNvIHRoaXMgaXMgc2FmZS4KLSAgICAgICAgICAgICAg
ICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+aXRlbShpICsgMSk7Ci0gICAgICAgICAgICAgICAg
aWYgKCFzZWNvbmQpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
ICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZh
bHVlKCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9O
KHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3Rh
cnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJp
bmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAg
ICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3RkOjptYWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVv
dGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3Rl
cyhxdW90ZXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChw
cmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpID09IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRR
dW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsK
LSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseTogewotICAgICAgICAvLyBsaXN0IG9mIHN0
cmluZ3MgYW5kIGlkcwotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBGb250
RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2Ny
aXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2Vu
ZXJpY0ZhbWlseSgpKTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFy
ZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChwYXJlbnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZp
ZWRGb250KCkpOwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlv
bik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNJbml0
aWFsKSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVz
Y3JpcHRpb24oKTsKLSAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24g
PSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIC8vIFdlIG5l
ZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFjY291bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBj
aGFuZ2UgZnJvbSBtb25vc3BhY2UKLSAgICAgICAgICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCi0g
ICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2Ny
aXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6
ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1
ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7Ci0g
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5n
ZW5lcmljRmFtaWx5KCkpOwotICAgICAgICAgICAgaWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWls
eSgpLmZhbWlseUlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkpOwotICAgICAgICAgICAgc2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5
bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5
ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCk7Ci0gICAgICAgIEZvbnRGYW1pbHkqIGN1
cnJGYW1pbHkgPSAwOwotCi0gICAgICAgIC8vIEJlZm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQt
ZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQgcmVzZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgotICAg
ICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9u
LnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVy
aWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7Ci0KLSAgICAgICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewot
ICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBpLnZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAo
IWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotICAgICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7
Ci0gICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0g
ICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKQotICAgICAgICAgICAgICAg
IGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNl
IGlmIChzZXR0aW5ncykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5n
ZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6Ci0g
ICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNlcmlmRmFtaWx5OwotICAgICAg
ICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3Jp
cHRpb246OlNlcmlmRmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IHNhbnNTZXJpZkZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1pbHkpOwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vy
c2l2ZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGN1cnNpdmVGYW1pbHk7Ci0gICAgICAg
ICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlw
dGlvbjo6Q3Vyc2l2ZUZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50YXN5OgotICAgICAgICAgICAgICAgICAgICBmYWNl
ID0gZmFudGFzeUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5KTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFj
ZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG1vbm9zcGFjZUZhbWlseTsKLSAgICAgICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpNb25vc3BhY2VGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0UGljdG9ncmFwaDoKLSAgICAgICAgICAgICAg
ICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZh
bWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmYWNlLmlzRW1wdHkoKSkgewotICAgICAg
ICAgICAgICAgIGlmICghY3VyckZhbWlseSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGaWxs
aW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5
LnNldEZhbWlseShmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5k
RmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGluaGVyaXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4K
LSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9ICZmaXJzdEZhbWlseTsKLSAgICAgICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChmb250RGVzY3Jp
cHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOwotICAg
ICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRG
b250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFyZWRGb250RmFtaWx5OjpjcmVhdGUoKTsKLSAgICAg
ICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5zZXRGYW1pbHkoZmFjZSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZhbWlseShuZXdGYW1pbHkpOwotICAgICAgICAgICAg
ICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFtaWx5LmdldCgpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNl
Rml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFsbCBuZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4g
YWRkZWQKLSAgICAgICAgLy8gSWYgY3VyckZhbWlseSBpcyBub24temVybyB0aGVuIHdlIHNldCBh
dCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMgZGVzY3JpcHRpb24uCi0gICAgICAgIGlmIChjdXJy
RmFtaWx5KSB7Ci0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkg
JiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2Vk
Rml4ZWREZWZhdWx0U2l6ZSkKLSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3Jp
cHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBm
b250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZh
dWx0U2l6ZSkpOwotCi0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIFNob3J0aGFu
ZCBwcm9wZXJ0aWVzLgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgotICAgICAgICBpZiAoaXNJ
bmhlcml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0g
c3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KHN0YXRlLnBhcmVudFN0eWxlKCktPnNwZWNpZmllZExp
bmVIZWlnaHQoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0g
ICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAg
fSBlbHNlIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9
IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElm
IHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5
cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MKLSAgICAgICAgICAgIGlmICgh
c2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaW5pdGlhbGl6
ZUZvbnRTdHlsZShzZXR0aW5ncyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUp
IHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6
OmluaXRpYWxMaW5lSGVpZ2h0KCkpOwotICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKDApOwotCi0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwot
ICAgICAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1Gb250KHByaW1p
dGl2ZVZhbHVlLT5nZXRJZGVudCgpLCBmb250RGVzY3JpcHRpb24pOwotCi0gICAgICAgICAgICAv
LyBEb3VibGUtY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGhlbWUgZGlkIGFueXRoaW5nLiBJZiBub3Qs
IGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgZm9udC4KLSAgICAgICAgICAgIGlmIChmb250RGVz
Y3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSkgewotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3Vy
ZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHByaW50ZXIgZm9udCBzZXR0aW5ncyBhcmUgdXBkYXRl
ZC4KLSAgICAgICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdz
KCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcg
c3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJh
bWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3Mp
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7Ci0g
ICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50
KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxl
ZCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgem9vbSBmYWN0b3IuCi0gICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNp
emVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBmb250RGVzY3Jp
cHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgZm9udERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSwg
dXNlU1ZHWm9vbVJ1bGVzKCkpKTsKLSAgICAgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24o
Zm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh2YWx1
ZS0+aXNGb250VmFsdWUoKSkgewotICAgICAgICAgICAgRm9udFZhbHVlKiBmb250ID0gc3RhdGlj
X2Nhc3Q8Rm9udFZhbHVlKj4odmFsdWUpOwotICAgICAgICAgICAgaWYgKCFmb250LT5zdHlsZSB8
fCAhZm9udC0+dmFyaWFudCB8fCAhZm9udC0+d2VpZ2h0Ci0gICAgICAgICAgICAgICAgfHwgIWZv
bnQtPnNpemUgfHwgIWZvbnQtPmxpbmVIZWlnaHQgfHwgIWZvbnQtPmZhbWlseSkKLSAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9u
dFN0eWxlLCBmb250LT5zdHlsZS5nZXQoKSk7Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENT
U1Byb3BlcnR5Rm9udFZhcmlhbnQsIGZvbnQtPnZhcmlhbnQuZ2V0KCkpOwotICAgICAgICAgICAg
YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRXZWlnaHQsIGZvbnQtPndlaWdodC5nZXQoKSk7
Ci0gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgcHJvcGVydGllcyBjYW4gZGlydHkgb3VyIGZv
bnQgYnV0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJlYWQgdGhlIGZvbnQncwotICAgICAgICAgICAgLy8g
cHJvcGVydGllcyBiYWNrLCB3aGljaCBpcyBzYWZlLiBIb3dldmVyIGlmIGZvbnQtc2l6ZSBpcyB1
c2luZyB0aGUgJ2V4JyB1bml0LCBpdCB3aWxsCi0gICAgICAgICAgICAvLyBuZWVkIHF1ZXJ5IHRo
ZSBkaXJ0aWVkIGZvbnQncyB4LWhlaWdodCB0byBnZXQgdGhlIGNvbXB1dGVkIHNpemUuIFRvIGJl
IHNhZmUgaW4gdGhpcwotICAgICAgICAgICAgLy8gY2FzZSwgbGV0J3MganVzdCB1cGRhdGUgdGhl
IGZvbnQgbm93LgotICAgICAgICAgICAgdXBkYXRlRm9udCgpOwotICAgICAgICAgICAgYXBwbHlQ
cm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTaXplLCBmb250LT5zaXplLmdldCgpKTsKLQotICAgICAg
ICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKGZvbnQtPmxpbmVIZWlnaHQuZ2V0KCkpOwot
Ci0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udEZhbWlseSwgZm9udC0+
ZmFtaWx5LmdldCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0KLSAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0
aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbToKLSAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJT
dHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXJnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eU92ZXJmbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bmltYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckVuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclJhZGl1czoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0RmxleEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW46Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dE1hcmdpbkNvbGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpczoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VGV4dFN0cm9rZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luOgotI2lmIEVOQUJMRShD
U1NfRVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcDoKLSNlbmRpZgot
ICAgICAgICBBU1NFUlQoaXNFeHBhbmRlZFNob3J0aGFuZChpZCkpOwotICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAvLyBDU1MzIFByb3BlcnRpZXMK
LSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNoYWRvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm94
U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3c6IHsKLSAgICAgICAg
aWYgKGlzSW5oZXJpdCkgewotICAgICAgICAgICAgaWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNo
YWRvdykKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRv
dyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93
RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4dFNoYWRvdygpKSkgOiBudWxscHRyKTsKLSAg
ICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc3RhdGUucGFyZW50
U3R5bGUoKS0+Ym94U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFy
ZW50U3R5bGUoKS0+Ym94U2hhZG93KCkpKSA6IG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAg
IGlmIChpc0luaXRpYWwgfHwgcHJpbWl0aXZlVmFsdWUpIC8vIGluaXRpYWwgfCBub25lCi0gICAg
ICAgICAgICByZXR1cm4gaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93ID8gc3RhdGUuc3R5bGUo
KS0+c2V0VGV4dFNoYWRvdyhudWxscHRyKSA6IHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhu
dWxscHRyKTsKLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVl
OyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBjdXJy
VmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNTaGFkb3dW
YWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgU2hhZG93VmFs
dWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dWYWx1ZSo+KGN1cnJWYWx1ZSk7Ci0gICAgICAg
ICAgICBpbnQgeCA9IGl0ZW0tPngtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBz
dGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgaW50IHkg
PSBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVs
ZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+
Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0
ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAgICAgIGludCBz
cHJlYWQgPSBpdGVtLT5zcHJlYWQgPyBpdGVtLT5zcHJlYWQtPmNvbXB1dGVMZW5ndGg8aW50Pihz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsK
LSAgICAgICAgICAgIFNoYWRvd1N0eWxlIHNoYWRvd1N0eWxlID0gaXRlbS0+c3R5bGUgJiYgaXRl
bS0+c3R5bGUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVJbnNldCA/IEluc2V0IDogTm9ybWFsOwot
ICAgICAgICAgICAgQ29sb3IgY29sb3I7Ci0gICAgICAgICAgICBpZiAoaXRlbS0+Y29sb3IpCi0g
ICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShpdGVtLT5jb2xv
ci5nZXQoKSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS5zdHlsZSgpKQotICAgICAgICAg
ICAgICAgIGNvbG9yID0gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKLQotICAgICAgICAgICAgT3du
UHRyPFNoYWRvd0RhdGE+IHNoYWRvd0RhdGEgPSBhZG9wdFB0cihuZXcgU2hhZG93RGF0YShJbnRQ
b2ludCh4LCB5KSwgYmx1ciwgc3ByZWFkLCBzaGFkb3dTdHlsZSwgaWQgPT0gQ1NTUHJvcGVydHlX
ZWJraXRCb3hTaGFkb3csIGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFy
ZW50KSk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQotICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3coc2hhZG93RGF0YS5yZWxl
YXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUg
Zmlyc3QgZW50cnkKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRCb3hTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFk
ZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgfQot
ICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZs
ZWN0OiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGJveFJlZmxlY3QsIEJv
eFJlZmxlY3QpCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChSZW5kZXJTdHlsZTo6aW5pdGlhbEJveFJlZmxlY3Qo
KSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVl
LT5pc1JlZmxlY3RWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENTU1Jl
ZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4o
dmFsdWUpOwotICAgICAgICBSZWZQdHI8U3R5bGVSZWZsZWN0aW9uPiByZWZsZWN0aW9uID0gU3R5
bGVSZWZsZWN0aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgcmVmbGVjdGlvbi0+c2V0RGlyZWN0aW9u
KCpyZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpKTsKLSAgICAgICAgaWYgKHJlZmxlY3RWYWx1ZS0+
b2Zmc2V0KCkpCi0gICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRPZmZzZXQocmVmbGVjdFZhbHVl
LT5vZmZzZXQoKS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJj
ZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0
ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpKTsKLSAgICAgICAgTmluZVBpZWNlSW1h
Z2UgbWFzazsKLSAgICAgICAgbWFzay5zZXRNYXNrRGVmYXVsdHMoKTsKLSAgICAgICAgbV9zdHls
ZU1hcC5tYXBOaW5lUGllY2VJbWFnZShpZCwgcmVmbGVjdFZhbHVlLT5tYXNrKCksIG1hc2spOwot
ICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNrKG1hc2spOwotCi0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEJveFJlZmxlY3QocmVmbGVjdGlvbi5yZWxlYXNlKCkpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlTcmM6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1m
YWNlIHJ1bGVzLgotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVS
YW5nZTogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCi0gICAgICAgIHJldHVybjsK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVJlcGV0aXRpb246IHsKLSAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUxvb3BDb3VudCwgTWFycXVlZUxvb3BD
b3VudCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5maW5p
dGUpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KC0xKTsg
Ly8gLTEgbWVhbnMgcmVwZWF0IGZvcmV2ZXIuCi0gICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZh
bHVlLT5pc051bWJlcigpKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxv
b3BDb3VudChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTcGVlZDogewotICAgICAg
ICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlU3BlZWQsIE1hcnF1ZWVTcGVlZCkK
LSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgaWYgKGludCBpZGVudCA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAg
ICAgICBzd2l0Y2ggKGlkZW50KSB7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2xvdzoKLSAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoNTAwKTsgLy8gNTAw
IG1zZWMuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVl
Tm9ybWFsOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg4
NSk7IC8vIDg1bXNlYy4gVGhlIFdpbklFIGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFzdDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoMTApOyAvLyAxMG1zZWMuIFN1cGVyIGZhc3QuCi0gICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJp
bWl0aXZlVmFsdWUtPmlzVGltZSgpKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFy
cXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlVGltZTxpbnQsIENTU1ByaW1pdGl2ZVZh
bHVlOjpNaWxsaXNlY29uZHM+KCkpOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+
aXNOdW1iZXIoKSkgLy8gRm9yIHNjcm9sbGFtb3VudCBzdXBwb3J0LgotICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgp
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFy
cXVlZUluY3JlbWVudDogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJx
dWVlSW5jcmVtZW50LCBNYXJxdWVlSW5jcmVtZW50KQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZh
bHVlKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkpIHsKLSAgICAgICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTbWFsbDoKLSAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCgxLCBGaXhlZCkpOyAvLyAx
cHguCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9y
bWFsOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQo
TGVuZ3RoKDYsIEZpeGVkKSk7IC8vIDZweC4gVGhlIFdpbklFIGRlZmF1bHQuCi0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlTGFyZ2U6Ci0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMzYsIEZpeGVk
KSk7IC8vIDM2cHguCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMZW5ndGggbWFycXVlZUxlbmd0aCA9IGNvbnZlcnRU
b0ludExlbmd0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1l
bnRTdHlsZSgpKTsKLSAgICAgICAgICAgIGlmICghbWFycXVlZUxlbmd0aC5pc1VuZGVmaW5lZCgp
KQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQobWFy
cXVlZUxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TG9jYWxlOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKGxvY2FsZSwgTG9jYWxlKTsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
ID09IENTU1ZhbHVlQXV0bykKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShu
dWxsQXRvbSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExv
Y2FsZShwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKSk7Ci0gICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVG
b3JGb250U2VsZWN0aW9uKHN0YXRlLnN0eWxlKCktPmxvY2FsZSgpKSk7Ci0gICAgICAgIHNldEZv
bnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
I2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
RGFzaGJvYXJkUmVnaW9uOgotICAgIHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJ
QUwoZGFzaGJvYXJkUmVnaW9ucywgRGFzaGJvYXJkUmVnaW9ucykKLSAgICAgICAgaWYgKCFwcmlt
aXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb25zKFJlbmRlclN0eWxlOjpub25lRGFzaGJvYXJkUmVn
aW9ucygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERhc2hi
b2FyZFJlZ2lvbiogcmVnaW9uID0gcHJpbWl0aXZlVmFsdWUtPmdldERhc2hib2FyZFJlZ2lvblZh
bHVlKCk7Ci0gICAgICAgIGlmICghcmVnaW9uKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAg
ICAgIERhc2hib2FyZFJlZ2lvbiogZmlyc3QgPSByZWdpb247Ci0gICAgICAgIHdoaWxlIChyZWdp
b24pIHsKLSAgICAgICAgICAgIExlbmd0aCB0b3AgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9u
LT50b3AoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLSAgICAg
ICAgICAgIExlbmd0aCByaWdodCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnJpZ2h0KCks
IHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBM
ZW5ndGggYm90dG9tID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+Ym90dG9tKCksIHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBMZW5ndGgg
bGVmdCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPmxlZnQoKSwgc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLQotICAgICAgICAgICAgaWYgKHRvcC5pc1VuZGVm
aW5lZCgpKQotICAgICAgICAgICAgICAgIHRvcCA9IExlbmd0aCgpOwotICAgICAgICAgICAgaWYg
KHJpZ2h0LmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmlnaHQgPSBMZW5ndGgoKTsK
LSAgICAgICAgICAgIGlmIChib3R0b20uaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBi
b3R0b20gPSBMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZWZ0LmlzVW5kZWZpbmVkKCkpCi0g
ICAgICAgICAgICAgICAgbGVmdCA9IExlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAocmVnaW9u
LT5tX2lzQ2lyY2xlKQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2Fy
ZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6Q2lyY2xlLCByZWdpb24tPm1fbGFiZWwsIHRv
cCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2UgOiB0cnVlKTsK
LSAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lvbi0+bV9pc1JlY3RhbmdsZSkKLSAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdp
b246OlJlY3RhbmdsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQs
IHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgICAgICAgICByZWdpb24gPSBy
ZWdpb24tPm1fbmV4dC5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRlLmRvY3VtZW50
KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSNlbmRpZgotI2lmIEVOQUJMRShEUkFHR0FCTEVfUkVHSU9OKQotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBcHBSZWdpb246IHsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSB8fCAh
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldERyYWdnYWJsZVJlZ2lvbk1vZGUocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVEcmFnID8gRHJhZ2dhYmxlUmVnaW9uRHJhZyA6IERyYWdnYWJs
ZVJlZ2lvbk5vRHJhZyk7Ci0gICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRl
ZFJlZ2lvbnModHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZVdpZHRoOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKHRleHRTdHJva2VXaWR0aCwgVGV4dFN0cm9rZVdpZHRoKQotICAgICAg
ICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkpIHsKLSAgICAgICAgY2FzZSBDU1NWYWx1ZVRoaW46Ci0gICAgICAgIGNhc2UgQ1NTVmFs
dWVNZWRpdW06Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGljazogewotICAgICAgICAgICAgZG91
YmxlIHJlc3VsdCA9IDEuMCAvIDQ4OwotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTWVkaXVtKQotICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAz
OwotICAgICAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NT
VmFsdWVUaGljaykKLSAgICAgICAgICAgICAgICByZXN1bHQgKj0gNTsKLSAgICAgICAgICAgIHdp
ZHRoID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShyZXN1bHQsIENTU1ByaW1pdGl2ZVZhbHVl
OjpDU1NfRU1TKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB3aWR0aCA9IHByaW1pdGl2ZVZhbHVl
LT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFN0cm9rZVdpZHRoKHdpZHRoKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtOiB7Ci0gICAg
ICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRyYW5zZm9ybSwgVHJhbnNmb3JtKTsKLSAg
ICAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgICAgICBjcmVhdGVUcmFu
c2Zvcm1PcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIG9wZXJhdGlvbnMpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUcmFuc2Zvcm0o
b3BlcmF0aW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFBlcnNwZWN0aXZlOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KHBlcnNwZWN0aXZlLCBQZXJzcGVjdGl2ZSkKLQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVl
KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0
SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dFBlcnNwZWN0aXZlKDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAg
ICAgZmxvYXQgcGVyc3BlY3RpdmVWYWx1ZTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5p
c0xlbmd0aCgpKQotICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IHByaW1pdGl2ZVZhbHVl
LT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNO
dW1iZXIoKSkgewotICAgICAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRy
ZWF0IHZhbHVlbGVzcyBudW1iZXJzIGFzIHB4LgotICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1
ZSA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZh
bHVlKCksIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFgpLT5jb21wdXRlTGVuZ3RoPGZsb2F0Pihz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAg
ICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocGVyc3BlY3Rp
dmVWYWx1ZSA+PSAwLjBmKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3Rp
dmUocGVyc3BlY3RpdmVWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jaWYgRU5BQkxF
KFRPVUNIX0VWRU5UUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGFwSGlnaGxpZ2h0Q29s
b3I6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGFwSGlnaGxpZ2h0Q29s
b3IsIFRhcEhpZ2hsaWdodENvbG9yKTsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAg
ICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIENvbG9yIGNvbCA9IGNvbG9yRnJvbVByaW1pdGl2
ZVZhbHVlKHByaW1pdGl2ZVZhbHVlKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGFwSGln
aGxpZ2h0Q29sb3IoY29sKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotI2lmIEVO
QUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKHVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcsIFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxp
bmcpOwotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcocHJpbWl0
aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUb3VjaCk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5SW52YWxpZDoKLSAgICAgICAgcmV0
dXJuOwotICAgIC8vIERpcmVjdGlvbmFsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVkIGJ5IHJlc29s
dmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KCkgYmVmb3JlIHRoZSBzd2l0Y2guCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJFbmRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kV2lk
dGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0Q29sb3I6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlclN0YXJ0V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckJlZm9yZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVTdHls
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlV2lkdGg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckFmdGVyU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckFmdGVyV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkVuZDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luU3RhcnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hcmdpbkJlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXI6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFyZ2luQm90dG9tQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdF
bmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0UGFkZGluZ0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
UGFkZGluZ0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsV2lkdGg6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWlu
TG9naWNhbEhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRo
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0OgotICAgIHsKLSAg
ICAgICAgQ1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9u
QXdhcmVQcm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxl
KCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQpOwotICAgICAg
ICByZXR1cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOwotICAgIH0KLSAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExp
bmVUaHJvdWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlUZXh0TGluZVRocm91Z2hXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92
ZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92
ZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
VW5kZXJsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRVbmRlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNp
emVEZWx0YToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZl
Y3Q6Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIENTUyBUZXh0IExheW91dCBNb2R1bGUgTGV2
ZWwgMzogVmVydGljYWwgd3JpdGluZyBzdXBwb3J0Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFdyaXRpbmdNb2RlOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHdyaXRp
bmdNb2RlLCBXcml0aW5nTW9kZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUpCi0gICAgICAgICAgICBzZXRXcml0aW5nTW9kZSgqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAg
ICAgIC8vIEZJWE1FOiBJdCBpcyBub3Qgb2sgdG8gbW9kaWZ5IGRvY3VtZW50IHN0YXRlIHdoaWxl
IGFwcGx5aW5nIHN0eWxlLgotICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVs
ZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAg
ICAgIHN0YXRlLmRvY3VtZW50KCktPnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQo
dHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VGV4dE9yaWVudGF0aW9uOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KHRleHRPcmllbnRhdGlvbiwgVGV4dE9yaWVudGF0aW9uKTsKLQotICAgICAgICBpZiAocHJpbWl0
aXZlVmFsdWUpCi0gICAgICAgICAgICBzZXRUZXh0T3JpZW50YXRpb24oKnByaW1pdGl2ZVZhbHVl
KTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dExpbmVCb3hDb250YWluOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxp
bmVCb3hDb250YWluLCBMaW5lQm94Q29udGFpbikKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
ICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4oTGluZUJveENvbnRhaW5Ob25l
KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsdWUt
PmlzQ1NTTGluZUJveENvbnRhaW5WYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAg
ICAgIENTU0xpbmVCb3hDb250YWluVmFsdWUqIGxpbmVCb3hDb250YWluVmFsdWUgPSBzdGF0aWNf
Y2FzdDxDU1NMaW5lQm94Q29udGFpblZhbHVlKj4odmFsdWUpOwotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRMaW5lQm94Q29udGFpbihsaW5lQm94Q29udGFpblZhbHVlLT52YWx1ZSgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIENTUyBGb250cyBNb2R1bGUgTGV2ZWwgMwot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250RmVhdHVyZVNldHRpbmdzOiB7Ci0gICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZU5vcm1hbCkgewotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKHN0YXRlLnN0eWxl
KCktPmZvbnREZXNjcmlwdGlvbigpLm1ha2VOb3JtYWxGZWF0dXJlU2V0dGluZ3MoKSk7Ci0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVl
TGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBm
b250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAg
ICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUp
OwotICAgICAgICBSZWZQdHI8Rm9udEZlYXR1cmVTZXR0aW5ncz4gc2V0dGluZ3MgPSBGb250RmVh
dHVyZVNldHRpbmdzOjpjcmVhdGUoKTsKLSAgICAgICAgaW50IGxlbiA9IGxpc3QtPmxlbmd0aCgp
OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgICAgICBD
U1NWYWx1ZSogaXRlbSA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAg
ICAgICBpZiAoIWl0ZW0tPmlzRm9udEZlYXR1cmVWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgRm9udEZlYXR1cmVWYWx1ZSogZmVhdHVyZSA9IHN0YXRpY19j
YXN0PEZvbnRGZWF0dXJlVmFsdWUqPihpdGVtKTsKLSAgICAgICAgICAgIHNldHRpbmdzLT5hcHBl
bmQoRm9udEZlYXR1cmUoZmVhdHVyZS0+dGFnKCksIGZlYXR1cmUtPnZhbHVlKCkpKTsKLSAgICAg
ICAgfQotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmVhdHVyZVNldHRpbmdzKHNldHRpbmdz
LnJlbGVhc2UoKSk7Ci0gICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24p
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKQotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGaWx0ZXI6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwoZmlsdGVyLCBGaWx0ZXIpOwotICAgICAgICBGaWx0ZXJPcGVyYXRpb25zIG9w
ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKHZhbHVlLCBzdGF0
ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpKQotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RmlsdGVyKG9wZXJhdGlvbnMpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW5z
OiB7Ci0gICAgICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOwotICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZENvbHVtbnModHJh
Y2tTaXplcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEdyaWRSb3dzOiB7Ci0gICAgICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVz
OwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0
YXRlKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3Jp
ZFJvd3ModHJhY2tTaXplcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0R3JpZFN0YXJ0OiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBzdGFydFBv
c2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgc3RhcnRQb3Np
dGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdy
aWRJdGVtU3RhcnQoc3RhcnRQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRFbmQ6IHsKLSAgICAgICAgR3JpZFBvc2l0aW9uIGVu
ZFBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgZW5kUG9z
aXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRH
cmlkSXRlbUVuZChlbmRQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEJlZm9yZTogewotICAgICAgICBHcmlkUG9zaXRpb24g
YmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBi
ZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9uKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7Ci0gICAgICAgIEdy
aWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlv
bih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBT
dHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQg
dmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0
aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVt
ZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFibGUuCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRP
cmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToK
LSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckJvdHRvbUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0
UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckJvdHRvbVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VPdXRzZXQ6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckltYWdlUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNs
aWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNvdXJjZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVm
dENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0U3R5bGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckxlZnRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmln
aHRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRTdHlsZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
VG9wQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcExlZnRSYWRpdXM6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFJpZ2h0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJUb3BTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGg6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5n
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Q2xlYXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNv
bG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlDb3VudGVyUmVzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9h
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZv
bnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoKLSNpZiBFTkFC
TEUoQ1NTX0lNQUdFX09SSUVOVEFUSU9OKQotICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVu
dGF0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVyaW5nOgotI2lm
IEVOQUJMRShDU1NfSU1BR0VfUkVTT0xVVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VS
ZXNvbHV0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZUltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlMaXN0U3R5bGVQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlVHlwZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luQm90dG9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlN
YXJnaW5MZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5SaWdodDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5TWFyZ2luVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhIZWlnaHQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eU1heFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5IZWlnaHQ6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1pbldpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFj
aXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcnBoYW5zOgotICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdp
ZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1dyYXA6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU92ZXJmbG93WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dZOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlQYWRkaW5nQm90dG9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nTGVm
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1JpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlQYWRkaW5nVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtBZnRlcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdl
QnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBvaW50ZXJFdmVudHM6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlSZXNpemU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVJpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlTaXplOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlTcGVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGFiU2l6ZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5VGFibGVMYXlvdXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRBbGln
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRJbmRlbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVyZmxvdzoKLSAgICBj
YXNlIENTU1Byb3BlcnR5VGV4dFJlbmRlcmluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFRy
YW5zZm9ybToKLSAgICBjYXNlIENTU1Byb3BlcnR5VG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlV
bmljb2RlQmlkaToKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VmFyaWFibGU6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5VmVydGljYWxBbGlnbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QW5pbWF0aW9uRGVsYXk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRp
cmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRHVyYXRpb246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkZpbGxNb2RlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRBbmltYXRpb25JdGVyYXRpb25Db3VudDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QW5pbWF0aW9uTmFtZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0
aW9uUGxheVN0YXRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdG
dW5jdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwZWFyYW5jZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0QXNwZWN0UmF0aW86Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJhY2tmYWNlVmlzaWJpbGl0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3Vu
ZENsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDb21wb3NpdGU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRPcmlnaW46Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJhY2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJGaXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFj
aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJJbWFnZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyVmVydGljYWxTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hBbGlnbjoKLSNpZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9OX0JSRUFLKQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hEZWNvcmF0aW9uQnJlYWs6Ci0jZW5kaWYKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGlyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hGbGV4OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4R3JvdXA6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveExpbmVzOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hPcmRpbmFsR3JvdXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9y
aWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UGFjazoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Q29sb3JDb3JyZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRD
b2x1bW5BeGlzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0FmdGVyOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0JlZm9yZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtbkNvdW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5HYXA6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblByb2dyZXNzaW9uOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dENvbHVtblJ1bGVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdp
ZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5TcGFuOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aDoKLSNpZiBFTkFCTEUoQ1VSU09SX1ZJU0lCSUxJVFkp
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEN1cnNvclZpc2liaWxpdHk6Ci0jZW5kaWYKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25Db250ZW50OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRBbGlnbkl0ZW1zOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnblNlbGY6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhCYXNpczoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0RmxleERpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEdy
b3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhTaHJpbms6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEZsZXhXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRKdXN0aWZ5
Q29udGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3JkZXI6Ci0jaWYgRU5BQkxFKENT
U19SRUdJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93RnJvbToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Rmxvd0ludG86Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Rm9udEtlcm5pbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRTbW9vdGhp
bmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRWYXJpYW50TGlnYXR1cmVzOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIaWdobGlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEh5cGhlbmF0ZUNoYXJhY3RlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVu
YXRlTGltaXRBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRC
ZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0TGluZXM6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbnM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExpbmVBbGlnbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJyZWFrOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQ2xhbXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExpbmVHcmlkOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lU25hcDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZURpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFycXVlZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZU91dHNldDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlUmVwZWF0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTbGljZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlU291cmNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2VXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NsaXA6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tDb21wb3NpdGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza09yaWdpbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uWDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza1Bvc2l0aW9uWToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Jl
cGVhdFg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRZOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrU2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TmJz
cE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblg6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luWToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0UHJpbnRDb2xvckFkanVzdDoKLSNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFJlZ2lvbkJyZWFrQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25C
cmVha0luc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uT3ZlcmZsb3c6Ci0j
ZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UnRsT3JkZXJpbmc6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFJ1YnlQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dENvbWJpbmU6Ci0jaWYgRU5BQkxFKENTUzNfVEVYVCkKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VGV4dERlY29yYXRpb25MaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
RGVjb3JhdGlvblN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0QWxpZ25MYXN0
OgotI2VuZGlmIC8vIENTUzNfVEVYVAotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1w
aGFzaXNDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzUG9zaXRp
b246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1N0eWxlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0U2VjdXJpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VD
b2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJh
bnNmb3JtU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VXNlckRyYWc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2RpZnk6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENsaXBQYXRoOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0V3JhcEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFy
Z2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZVBhZGRpbmc6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFdyYXBUaHJvdWdoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRT
aGFwZUluc2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRzaWRlOgotI2Vu
ZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdpZG93czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdvcmRCcmVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V29yZFNwYWNpbmc6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdvcmRXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVpvb206Ci0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAg
ICBjYXNlIENTU1Byb3BlcnR5TWF4Wm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToK
LSAgICBjYXNlIENTU1Byb3BlcnR5T3JpZW50YXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVz
ZXJab29tOgotI2VuZGlmCi0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgZGVmYXVsdDoKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAvLyBUcnkgdGhl
IFNWRyBwcm9wZXJ0aWVzCi0gICAgICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKLSNl
bmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+
IFN0eWxlUmVzb2x2ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFs
dWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCi0gICAgICAgIHJl
dHVybiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0lt
YWdlVmFsdWUqPih2YWx1ZSkpOwotCi0gICAgaWYgKHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFs
dWUoKSkgewotICAgICAgICBpZiAodmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQotICAgICAgICAg
ICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nh
c3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQo
dGhpcykuZ2V0KCkpOwotICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVl
KHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsK
LSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAodmFsdWUtPmlzSW1h
Z2VTZXRWYWx1ZSgpKQotICAgICAgICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3Bl
cnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVlKj4odmFsdWUpKTsKLSNlbmRpZgotCi0g
ICAgaWYgKHZhbHVlLT5pc0N1cnNvckltYWdlVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGN1cnNv
ck9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VW
YWx1ZSo+KHZhbHVlKSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0cjxTdHlsZUlt
YWdlPiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJ
RCBwcm9wZXJ0eSwgQ1NTSW1hZ2VWYWx1ZSogdmFsdWUpCi17Ci0gICAgUmVmUHRyPFN0eWxlSW1h
Z2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdl
ICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFn
ZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVs
ZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVy
YXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdl
bmVyYXRvclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzUGVuZGluZygpKSB7Ci0g
ICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFs
dWUpOwotICAgICAgICByZXR1cm4gU3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci0g
ICAgfQotICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFsdWUpOwotfQot
Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxl
UmVzb2x2ZXI6OnNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBD
U1NJbWFnZVNldFZhbHVlKiB2YWx1ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2Ug
PSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGlt
YWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2Uu
cmVsZWFzZSgpOwotfQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNv
bHZlcjo6Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENT
U0N1cnNvckltYWdlVmFsdWUqIHZhbHVlKQotewotICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFn
ZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZShkb2N1bWVudCgpKTsKLSAgICBpZiAoaW1h
Z2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgIG1fc3RhdGUucGVuZGluZ0lt
YWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgIHJldHVybiBpbWFnZS5y
ZWxlYXNlKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJl
bmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIGlmIChz
dHlsZS0+ZWZmZWN0aXZlWm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0g
c3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVz
Y3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24s
IGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkpOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0Zv
ckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUpCi17Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHls
ZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0KLSAgICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXpl
KCkgfHwgIXBhcmVudFN0eWxlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVz
Y3JpcHRpb24mIHBhcmVudEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0g
ICAgaWYgKGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VG
aXhlZERlZmF1bHRTaXplKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZvciBub3csIGx1
bXAgYWxsIGZhbWlsaWVzIGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCi0gICAgaWYgKGNoaWxkRm9u
dC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKLSAg
ICAgICAgJiYgcGFyZW50Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpN
b25vc3BhY2VGYW1pbHkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdlIGtub3cgdGhlIHBh
cmVudCBpcyBtb25vc3BhY2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9u
dAotICAgIC8vIHNpemUgd2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250
IHNpemUgYXMgYXBwcm9wcmlhdGUuCi0gICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQg
c2l6ZSwgdGhlbiB3ZSByZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFuCi0gICAgLy8g
bXVsdGlwbHlpbmcgYnkgb3VyIHNjYWxlIGZhY3Rvci4KLSAgICBmbG9hdCBzaXplOwotICAgIGlm
IChjaGlsZEZvbnQua2V5d29yZFNpemUoKSkKLSAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5
d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUo
KSAtIDEsIGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpOwotICAgIGVsc2UgewotICAg
ICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgIGZs
b2F0IGZpeGVkU2NhbGVGYWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhl
ZEZvbnRTaXplKCkgJiYgc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQotICAgICAgICAgICAg
PyBzdGF0aWNfY2FzdDxmbG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8g
c2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpCi0gICAgICAgICAgICA6IDE7Ci0gICAgICAgIHNp
emUgPSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/Ci0gICAgICAgICAgICAgICAg
Y2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgotICAgICAgICAg
ICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOwotICAg
IH0KLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsK
LSAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOwotICAgIHN0eWxlLT5z
ZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjppbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykKLXsKLSAgICBG
b250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRH
ZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwotICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgp
KTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJp
bnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwot
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0
aW5ncygpLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKLSAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWls
eS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0
RmFtaWx5KHN0YW5kYXJkRm9udEZhbWlseSk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJz
dEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKLSAgICB9Ci0gICAgZm9udERlc2NyaXB0aW9uLnNl
dEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAg
c2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQo
KSwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5l
SGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLSAgICBtX3N0YXRlLnNl
dExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRp
b24mIGZvbnREZXNjcmlwdGlvbiwgZmxvYXQgc2l6ZSkKLXsKLSAgICBmb250RGVzY3JpcHRpb24u
c2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRT
aXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUu
c3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pv
b21SdWxlcygpKSk7Ci19Ci0KLWZsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZy
b21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBi
b29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21S
dWxlcykKLXsKLSAgICBmbG9hdCB6b29tRmFjdG9yID0gMS4wZjsKLSAgICBpZiAoIXVzZVNWR1pv
b21SdWxlcykgewotICAgICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsK
LSAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQotICAgICAgICAg
ICAgem9vbUZhY3RvciAqPSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9j
dW1lbnQsIHpvb21GYWN0b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKLX0KLQot
ZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9j
dW1lbnQqIGRvY3VtZW50LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBm
bG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5p
bXVtRm9yRm9udFNpemUpCi17Ci0gICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91
bGQgbm90IGJlIHZpc2libGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQotICAgIC8vIGV4ZW1w
dCBmcm9tIG1pbmltdW0gZm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3Ig
cGl4ZWwtcGVyZmVjdAotICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUg
d2l0aCBvdGhlciBicm93c2VycyB0aGF0IGhhdmUgbWluaW11bQotICAgIC8vIGZvbnQgc2l6ZSBz
ZXR0aW5ncyAoZS5nLiBGaXJlZm94KS4KLSAgICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBz
dGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQotICAgICAgICByZXR1cm4gMC4w
ZjsKLQotICAgIC8vIFdlIHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBU
aGUgZmlyc3QgaXMgYSBoYXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bwotICAgIC8vIGFsbCBm
b250cy4gVGhpcyBpcyAibWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQg
c2l6ZSBpcyBhICJzbWFydCBtaW5pbXVtIgotICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdo
ZW4gdGhlIFdlYiBwYWdlIGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3Is
IGUuZy4sCi0gICAgLy8gd2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9y
IGV4cHJlc3NlcyB0aGUgZm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgotICAgIC8vIHRoZSB1
c2VyJ3MgZGVmYXVsdCBmb250IHNldHRpbmcuCi0KLSAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5p
bXVtLCB3ZSBuZXZlciB3YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBz
aXplIHRvIGtlZXAgZm9udHMgcmVhZGFibGUuCi0gICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxs
b3cgdGhlIHBhZ2UgdG8gc2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVy
LAotICAgIC8vIHNpbmNlIHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0
dHA6Ly93d3cuZ2FtZXNwb3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCi0KLSAgICBTZXR0aW5n
cyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQot
ICAgICAgICByZXR1cm4gMS4wZjsKLQotICAgIGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmlt
dW1Gb250U2l6ZSgpOwotICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVt
TG9naWNhbEZvbnRTaXplKCk7Ci0gICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUg
KiB6b29tRmFjdG9yOwotCi0gICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ug
b25seSBhcHBseSB0aGUgaGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwg
dG9vIHNtYWxsLgotICAgIGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKLSAgICAgICAgem9vbWVk
U2l6ZSA9IG1pblNpemU7Ci0KLSAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIg
VGhpcyBtaW5pbXVtIGlzIGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFs
bAotICAgIC8vIGFmdGVyIHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVs
YXRpdmUgdG8gdGhlIHVzZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQotICAgIC8vIG11
c3QgaGF2ZSBiZWVuIGFjY2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRo
ZSBzbWFydCBtaW5pbXVtIHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCi0gICAgLy8gZG9pbmcgc28g
d29uJ3QgZGlzcnVwdCB0aGUgbGF5b3V0LgotICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250
U2l6ZSAmJiB6b29tZWRTaXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0g
bWluTG9naWNhbFNpemUgfHwgIWlzQWJzb2x1dGVTaXplKSkKLSAgICAgICAgem9vbWVkU2l6ZSA9
IG1pbkxvZ2ljYWxTaXplOwotCi0gICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4
aW11bSB0byBwcmV2ZW50IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9u
IHZhcmlvdXMKLSAgICAvLyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4p
Ci0gICAgcmV0dXJuIG1pbihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKLX0K
LQotY29uc3QgaW50IGZvbnRTaXplVGFibGVNYXggPSAxNjsKLWNvbnN0IGludCBmb250U2l6ZVRh
YmxlTWluID0gOTsKLWNvbnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKLQotLy8gV2luSUUvTmF2
NCB0YWJsZSBmb3IgZm9udCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250
IG1hcHBpbmcgc3lzdGVtIG9mIEhUTUwuCi1zdGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXpl
VGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdv
cmRzXSA9Ci17Ci0gICAgICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAg
ICAxOCwgICAgMjggfSwKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAg
MTUsICAgIDIwLCAgICAzMSB9LAotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEz
LCAgICAxNywgICAgMjIsICAgIDM0IH0sCi0gICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwg
ICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzcgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAg
IDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQg
KDEzKQotICAgICAgeyA5LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgs
ICAgIDQyIH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAg
ICAzMCwgICAgNDUgfSwKLSAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAg
MjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQotfTsK
LS8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAg
NwotLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCi0v
LyAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgICAgdXNl
ciBwcmVmCi0KLS8vIFN0cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEn
cyBzZXR0aW5ncyBleGFjdGx5Lgotc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxl
W2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10g
PQotewotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgs
ICAgIDI3IH0sCi0gICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAg
ICAyMCwgICAgMzAgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAg
MTcsICAgIDIyLCAgICAzMyB9LAotICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0
LCAgICAxOCwgICAgMjQsICAgIDM2IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywg
ICAgMTYsICAgIDIwLCAgICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykK
LSAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0
MiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAs
ICAgIDQ1IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAg
ICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBI
VE1MICAgICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8v
IENTUyAgeHhzICAgeHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAg
ICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJl
ZgotCi0vLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNl
IFRvZGQgRmFocm5lcidzIHN1Z2dlc3RlZCBzY2FsZQotLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3
b3JkIHZhbHVlLgotc3RhdGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdv
cmRzXSA9IHsgMC42MGYsIDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4w
ZiB9OwotCi1mbG9hdCBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQq
IGRvY3VtZW50LCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQot
ewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlm
ICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxLjBmOwotCi0gICAgYm9vbCBxdWlya3NNb2Rl
ID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxk
VXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDog
c2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRT
aXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAg
IC8vIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZS4KLSAgICAgICAgaW50IHJvdyA9IG1l
ZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWluOwotICAgICAgICBpbnQgY29sID0gKGtleXdvcmQg
LSBDU1NWYWx1ZVh4U21hbGwpOwotICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0Zv
bnRTaXplVGFibGVbcm93XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07Ci0g
ICAgfQotCi0gICAgLy8gVmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBB
cHBseSB0aGUgc2NhbGUgZmFjdG9yIGluc3RlYWQuCi0gICAgZmxvYXQgbWluTG9naWNhbFNpemUg
PSBtYXgoc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7Ci0gICAgcmV0dXJu
IG1heChmb250U2l6ZUZhY3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6
ZSwgbWluTG9naWNhbFNpemUpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGlu
dCBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0
YWJsZSwgaW50IG11bHRpcGxpZXIpCi17Ci0gICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2Ug
eHgtc21hbGwgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KLSAg
ICBmb3IgKGludCBpID0gMTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsKLSAgICAgICAg
aWYgKHBpeGVsRm9udFNpemUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRp
cGxpZXIpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIHRvdGFsS2V5
d29yZHMgLSAxOwotfQotCi1pbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1l
bnQqIGRvY3VtZW50LCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1
bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygp
OwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgYm9vbCBxdWly
a3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwotICAgIGludCBtZWRpdW1TaXplID0g
c2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6
ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49
IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0g
ICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAg
cmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWly
a3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVty
b3ddLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxm
bG9hdD4ocGl4ZWxGb250U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXplKTsKLX0KLQot
c3RhdGljIENvbG9yIGNvbG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCi17Ci0gICAgc3Ry
dWN0IENvbG9yVmFsdWUgewotICAgICAgICBpbnQgY3NzVmFsdWVJZDsKLSAgICAgICAgUkdCQTMy
IGNvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVl
c1tdID0gewotICAgICAgICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAotICAgICAgICB7
IENTU1ZhbHVlQmxhY2ssIDB4RkYwMDAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4
RkYwMDAwRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKLSAg
ICAgICAgeyBDU1NWYWx1ZUdyYXksIDB4RkY4MDgwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdy
ZWVuLCAweEZGMDA4MDAwICB9LAotICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9
LAotICAgICAgICB7IENTU1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAotICAgICAgICB7IENTU1Zh
bHVlTWFyb29uLCAweEZGODAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAw
MDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZU9yYW5nZSwgMHhGRkZGQTUwMCB9LAotICAgICAgICB7IENTU1ZhbHVlUHVycGxl
LCAweEZGODAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKLSAg
ICAgICAgeyBDU1NWYWx1ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAotICAgICAgICB7IENTU1ZhbHVl
VGVhbCwgMHhGRjAwODA4MCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAw
MDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAotICAgICAg
ICB7IENTU1ZhbHVlWWVsbG93LCAweEZGRkZGRjAwIH0sCi0gICAgICAgIHsgMCwgMCB9Ci0gICAg
fTsKLQotICAgIGZvciAoY29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+
Y3NzVmFsdWVJZDsgKytjb2wpIHsKLSAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NW
YWx1ZUlkKQotICAgICAgICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7Ci0gICAgfQotICAgIHJldHVy
biBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwot
fQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVk
RnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlKQotewotICAgIGludCBpZGVudCA9
IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIENTU1Zh
bHVlV2Via2l0VGV4dDoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKLSAgICBjYXNlIENT
U1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotfQotCi1Db2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1
ZShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Ci17
Ci0gICAgaWYgKHZhbHVlLT5pc1JHQkNvbG9yKCkpCi0gICAgICAgIHJldHVybiBDb2xvcih2YWx1
ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7Ci0KLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQp
IHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFs
dWVXZWJraXRUZXh0OgotICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9y
KCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6Ci0gICAgICAgIHJldHVybiAoc3RhdGUu
ZWxlbWVudCgpLT5pc0xpbmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgp
LT52aXNpdGVkTGlua0NvbG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKLSAg
ICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRv
Y3VtZW50KCktPmFjdGl2ZUxpbmtDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1
c1JpbmdDb2xvcjoKLSAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigp
OwotICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5z
dHlsZSgpLT5jb2xvcigpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBjb2xvckZvckNT
U1ZhbHVlKGlkZW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJv
b2wgcmVzdWx0KQotewotICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5h
cHBlbmQoYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAot
ewotICAgIHVuc2lnbmVkIHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMu
c2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsKLSAgICAgICAg
aWYgKG1fbWVkaXVtLT5ldmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNb
aV0tPm1fZXhwcmVzc2lvbikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRz
W2ldLT5tX3Jlc3VsdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNm
b3JtT3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4g
VHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
OlNDQUxFX1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOwotICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpTQ0FMRV8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFu
c2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5T
TEFURTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKLSAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKLSAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFXzNEOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6Uk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOwotICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlJPVEFURV9aOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpS
T1RBVEVfM0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKLSAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6U0tFV19YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpT
S0VXX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3Jt
T3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7Ci0gICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6UEVSU1BFQ1RJVkU7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6
Tk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLX0KLQot
Ym9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBp
blZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5z
Zm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgaWYgKCFpblZhbHVlIHx8ICFp
blZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7Ci0gICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBz
dHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29tKCkgOiAxOwotICAgIFRyYW5zZm9ybU9wZXJhdGlv
bnMgb3BlcmF0aW9uczsKLSAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVl
OyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1
ZSA9IGkudmFsdWUoKTsKLQotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWUqIHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWUqPihpLnZhbHVlKCkpOwotICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5s
ZW5ndGgoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJvb2wgaGF2ZU5vblBy
aW1pdGl2ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgaWYgKCF0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7
Ci0gICAgICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaGF2
ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLQotICAgICAg
ICBzd2l0Y2ggKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlv
bjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3Jt
T3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBk
b3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0
aW9uKQotICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0
RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3Bl
cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3Ro
KCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vj
b25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5
ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0g
ZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBl
bmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNm
b3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAg
ICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAg
ICAgICBkb3VibGUgc3ogPSAxLjA7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9w
ZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3Jt
T3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFs
dWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBl
KCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikK
LSAgICAgICAgICAgICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAg
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlv
bikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4g
MikgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhp
cmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5n
ZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3Jt
T3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRl
VHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAg
ICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0g
TGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3Jt
T3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmly
c3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUs
IHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUs
IHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHguaXNV
bmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5z
bGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRp
b246IHsKLSAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAg
ICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR6
ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNm
b3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgo
Zmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBl
bHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwg
em9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNv
bnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
ICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9u
KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAy
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1
ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252
ZXJ0VG9GbG9hdExlbmd0aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9y
KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNm
b3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHls
ZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZp
bmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHos
IGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAg
ICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b246OmNyZWF0ZSgwLCAwLCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5z
Zm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90
YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIHgg
PSAwOwotICAgICAgICAgICAgZG91YmxlIHkgPSAwOwotICAgICAgICAgICAgZG91YmxlIHogPSAw
OwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMo
KTsKLQotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0g
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAg
ICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNm
b3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIHogPSAxOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xl
LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBl
KCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCi0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91
cnRoVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKTsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gZmly
c3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25k
VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFs
dWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhW
YWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9u
cygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmds
ZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9u
OiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGVYID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBh
bmdsZVkgPSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0
ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikK
LSAgICAgICAgICAgICAgICBhbmdsZVkgPSBhbmdsZTsKLSAgICAgICAgICAgIGVsc2UgewotICAg
ICAgICAgICAgICAgIGFuZ2xlWCA9IGFuZ2xlOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3
VHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1W
YWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGFuZ2xlWSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRp
b246OmNyZWF0ZShhbmdsZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNm
b3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgp
IDwgNikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gZmly
c3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYyA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGQg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJs
ZSBlID0gem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNm
b3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOwot
ICAgICAgICAgICAgZG91YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdl
dERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBl
bmQoTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCAxNikKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDAp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91
YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDUpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDYpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0
RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEwKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJs
ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMTMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1
ZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgz
RFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1hdHJpeCkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3Bl
Y3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3Ro
KDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQotICAg
ICAgICAgICAgICAgIHAgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwg
cm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAg
ICAgIC8vIFRoaXMgaXMgYSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNm
b3JtcyBhcmUgZmluYWxpemVkLgotICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZh
bHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExl
bmd0aChjbGFtcFRvUG9zaXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmlu
ZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUo
cCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLXN0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9w
ZXJhdGlvblR5cGUgZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
RmlsdGVyT3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNh
c2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKLSAgICAg
ICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFOwotICAgIGNhc2UgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZp
bHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpT
RVBJQTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJh
dGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7Ci0gICAgY2Fz
ZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAg
ICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpIVUVfUk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRl
ck9wZXJhdGlvbjo6SU5WRVJUOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNp
dHlGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJ
VFk7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJh
dGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKLSAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKLSAgICAg
ICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q09OVFJBU1Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6QkxVUjsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93
RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NI
QURPVzsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6Q3VzdG9tRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpDVVNUT007Ci0jZW5kaWYKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtu
b3duRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05F
OwotICAgIH0KLSAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotfQotCi0jaWYgRU5B
QkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2Fk
UGVuZGluZ1NWR0RvY3VtZW50cygpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAg
ICBpZiAoIXN0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1
bWVudHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNl
TG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJl
c291cmNlTG9hZGVyKCk7Ci0gICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZp
bHRlck9wZXJhdGlvbnMgPSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9u
cygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUo
KTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlv
biA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24t
PmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgewotICAg
ICAgICAgICAgUmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0
aWNfY2FzdDxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkp
OwotCi0gICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRl
LnBlbmRpbmdTVkdEb2N1bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKLSAgICAg
ICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICBDYWNoZWRTVkdEb2N1bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRS
ZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50KQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZH
RG9jdW1lbnQgb24gdGhlIHJlZmVyZW5jZSBmaWx0ZXIuCi0gICAgICAgICAgICByZWZlcmVuY2VG
aWx0ZXItPnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRT
VkdEb2N1bWVudFJlZmVyZW5jZShjYWNoZWREb2N1bWVudCkpKTsKLSAgICAgICAgfQotICAgIH0K
LSAgICBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKLX0KLSNlbmRpZgotCi0j
aWYgRU5BQkxFKENTU19TSEFERVJTKQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxl
U2hhZGVyKENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hh
ZGVyVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJv
bVZhbHVlKHN0YXRpY19jYXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUpKTsKLSAgICBy
ZXR1cm4gMDsKLX0KLQotU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGlu
Z1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKLXsKLSAg
ICBTdHlsZVNoYWRlciogc2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOwot
ICAgIGlmIChzaGFkZXIgJiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKLSAgICAgICAgbV9z
dGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyh0cnVlKTsKLSAgICByZXR1cm4gc2hhZGVyOwotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCi17Ci0gICAgaWYgKCFt
X3N0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJz
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRS
ZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIo
KTsKLQotICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRp
b25zID0gbV9zdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7
Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRl
ck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJh
dGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgewotICAgICAgICAgICAgQ3Vz
dG9tRmlsdGVyT3BlcmF0aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0
ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotICAgICAgICAgICAgQVNTRVJU
KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVy
UHJvZ3JhbSogcHJvZ3JhbSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+
KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0
ZXhTaGFkZXIoKSAmJiBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkp
IHsKLSAgICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBz
dGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSkt
PmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hh
ZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYm
IHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAg
ICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8
U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRl
clZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hh
ZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMo
ZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3Io
Y29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI+JiBiKQotewotICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVz
c1RoYW4oYS0+bmFtZSgpLCBiLT5uYW1lKCkpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRl
clBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRl
cihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0
cjxDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0
ZXJBcnJheVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDAs
IGxlbmd0aCA9IHZhbHVlcy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBD
U1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAg
ICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1p
dGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5UGFy
YW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+
IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0
cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVy
UGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZh
bHVlcy0+bGVuZ3RoKCk7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0
aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZh
bHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NT
UHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAg
ICAgbnVtYmVyUGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFs
dWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQot
Ci1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1
ZUxpc3QqIHZhbHVlcykKLXsKLSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1l
dGVyPiB0cmFuc2Zvcm1QYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6
OmNyZWF0ZShuYW1lKTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAg
Y3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0
ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwotICAgIHRyYW5zZm9ybVBhcmFtZXRl
ci0+c2V0T3BlcmF0aW9ucyhvcGVyYXRpb25zKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1l
dGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0
eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFt
ZSwgQ1NTVmFsdWUqIHBhcmFtZXRlclZhbHVlKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQg
b3RoZXIgcGFyYW1ldGVycyB0eXBlcyBwYXJzaW5nLgotICAgIC8vIGJvb2xlYW5zOiBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKLSAgICAvLyB0ZXh0dXJlczog
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCi0gICAgLy8gbWF0
MiwgbWF0MywgbWF0NDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcx
NDQ0Ci0gICAgLy8gTnVtYmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFs
dWVMaXN0IGFuZCBhbGwKLSAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0
IGZyb20gQ1NTVmFsdWVMaXN0LgotICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0
KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0
aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7Ci0gICAgaWYgKCF2YWx1ZXMt
Pmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+
aXNXZWJLaXRDU1NBcnJheUZ1bmN0aW9uVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3Vz
dG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIElmIHRoZSBm
aXJzdCB2YWx1ZSBvZiB0aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwKLSAgICAvLyB0
aGVuIHdlIGNvdWxkIHNhZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcwot
ICAgIC8vIGFyZSB0cmFuc2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRl
ciB3aWxsCi0gICAgLy8gcmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4K
LSAgICBpZiAodmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1Ry
YW5zZm9ybVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9y
bVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOwotCi0gICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJh
eXMgb2YgYm9vbGVhbnMgb3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9v
c2UgYmV0d2VlbiB0aG9zZSB0d28uCi0gICAgLy8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxs
IGJvb2xlYW5zIG9yIGFsbCBudW1iZXJzKS4KLSAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQ
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLSAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+
cHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAg
ICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsK
LQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhl
cmUuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4
Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZp
bHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVy
UGFyYW1ldGVyTGlzdCYgcGFyYW1ldGVyTGlzdCkKLXsKLSAgICBIYXNoU2V0PFN0cmluZz4ga25v
d25QYXJhbWV0ZXJOYW1lczsKLSAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVy
YXRvcihwYXJhbWV0ZXJzVmFsdWUpOwotICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNN
b3JlKCk7IHBhcmFtZXRlckl0ZXJhdG9yLmFkdmFuY2UoKSkgewotICAgICAgICBpZiAoIXBhcmFt
ZXRlckl0ZXJhdG9yLnZhbHVlKCktPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0
ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUo
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRv
ci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkg
IT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRT
dHJpbmdWYWx1ZSgpOwotICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRl
ciBuYW1lcy4KLSAgICAgICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkp
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMu
YWRkKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAg
ICAKLSAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNNb3JlKCkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBw
YXJhbWV0ZXIgPSBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1
ZSgpKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIHBhcmFtZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOwotICAg
IH0KLSAgICAKLSAgICAvLyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUg
cGFzc2luZyB0aGVtIGRvd24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4KLSAgICBzdGQ6
OnNvcnQocGFyYW1ldGVyTGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFy
YW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IpOwotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotCi1Q
YXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3Vz
dG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0
ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSBy
ZXNvbHV0aW9uIGZvciB0aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXgu
Ci0gICAgVU5VU0VEX1BBUkFNKGZpbHRlclZhbHVlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUGFz
c1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3Rv
bUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZp
bHRlclZhbHVlKQotewotICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBM
SUNBVElPTihzaGFkZXJzVmFsdWUtPmlzVmFsdWVMaXN0KCkpOwotICAgIENTU1ZhbHVlTGlzdCog
c2hhZGVyc0xpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOwot
Ci0gICAgdW5zaWduZWQgc2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7
Ci0gICAgQVNTRVJUKHNoYWRlcnNMaXN0TGVuZ3RoKTsKLQotICAgIFJlZlB0cjxTdHlsZVNoYWRl
cj4gdmVydGV4U2hhZGVyID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMCkpOwotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7Ci0g
ICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxF
TkRTX0VMRU1FTlRfVEVYVFVSRTsKLSAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3Mg
bWl4U2V0dGluZ3M7Ci0KLSAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7Ci0gICAgICAg
IENTU1ZhbHVlKiBmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKLQotICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1p
eEZ1bmN0aW9uLT5pc1dlYktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgewotICAgICAgICAgICAg
V2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJL
aXRDU1NNaXhGdW5jdGlvblZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKLSAg
ICAgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKLQot
ICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBm
cmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAg
ICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotCi0gICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24t
Pmxlbmd0aCgpIDw9IDMpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkg
ewotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAg
ICAgICAgICAgaWYgKENTU1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkpKQotICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJp
bWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBv
c2l0ZU9wZXJhdG9yKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAg
ICAgICAgbWl4U2V0dGluZ3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7Ci0g
ICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQ
RV9OT19FTEVNRU5UX1RFWFRVUkU7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxl
U2hhZGVyKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgCi0gICAgdW5zaWduZWQgbWVzaFJvd3MgPSAxOwotICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5z
ID0gMTsKLSAgICBDdXN0b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNo
ZWQ7Ci0gICAgCi0gICAgQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7Ci0gICAgCi0gICAg
aWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRl
cmF0b3IgaXRlcmF0b3IoZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwot
ICAgICAgICAKLSAgICAgICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBi
b3ggb3IgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyczoKLSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdp
dGggYSBudW1iZXIgb3IgYW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKLSAg
ICAgICAgLy8gdGhlIG1lc2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFy
YW1ldGVycyBsaXN0LgotCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0
b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9y
LnZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7
Ci0gICAgICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZp
ZWQsIGl0IHdpbGwgc2V0IGJvdGgKLSAgICAgICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhl
IGNvbHVtbnMuCi0gICAgICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1p
dGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFu
Y2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2gg
YW5vdGhlciBudW1iZXIgZm9yIHRoZSByb3dzLgotICAgICAgICAgICAgICAgIGlmIChpdGVyYXRv
ci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZh
bHVlKCkpIHsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAg
ICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hl
ZCkgewotICAgICAgICAgICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKLSAgICAg
ICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgCi0gICAgICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgewotICAgICAgICAgICAg
Ly8gSWYgbm8gdmFsdWUgd2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQg
aXMganVzdCBhIHBhcmFtZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVwCi0gICAgICAg
ICAgICAvLyBoYXZpbmcganVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFu
ZCBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxl
bmd0aCgpID09IDIpOwotICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAg
aWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKLSAgICAg
ICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
Mik7Ci0gICAgCi0gICAgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0Owot
ICAgIGlmIChwYXJhbWV0ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlz
dChwYXJhbWV0ZXJzVmFsdWUsIHBhcmFtZXRlckxpc3QpKQotICAgICAgICByZXR1cm4gMDsKLSAg
ICAKLSAgICBSZWZQdHI8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVD
dXN0b21GaWx0ZXJQcm9ncmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21l
bnRTaGFkZXIucmVsZWFzZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsK
LSAgICByZXR1cm4gQ3VzdG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNl
KCksIHBhcmFtZXRlckxpc3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOwotfQot
Ci1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRl
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkK
LXsKLSAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKLSAgICBib29sIGlzQXRSdWxl
UmVmZXJlbmNlU3ludGF4ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkt
PmlzUHJpbWl0aXZlVmFsdWUoKTsKLSAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXgg
PyBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZp
bHRlclZhbHVlKSA6IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgo
ZmlsdGVyVmFsdWUpOwotfQotCi0jZW5kaWYKLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVG
aWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJl
bmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17
Ci0gICAgQVNTRVJUKG91dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKLSAgICAKLSAgICBpZiAoIWlu
VmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAoaW5WYWx1ZS0+aXNQ
cmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVW
YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7Ci0gICAgICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVl
TGlzdCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0g
c3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpIDogMTsKLSAgICBGaWx0ZXJPcGVyYXRpb25z
IG9wZXJhdGlvbnM7Ci0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsg
aS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUg
PSBpLnZhbHVlKCk7Ci0gICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZh
bHVlKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZSogZmlsdGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGku
dmFsdWUoKSk7Ci0gICAgICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRp
b25UeXBlID0gZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpKTsKLQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5
cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAv
LyBWYWxpZGF0ZWRDdXN0b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1
cCBpbiB0aGUgUmVuZGVyU3R5bGUuCi0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb25U
eXBlID09IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NKSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q3Vz
dG9tRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRp
b24oZmlsdGVyVmFsdWUpOwotICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcGVyYXRpb25z
Lm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3Bl
cmF0aW9uOjpSRUZFUkVOQ0UpIHsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAgICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgICAgQ1NTVmFsdWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMCk7Ci0KLSAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZH
RG9jdW1lbnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAg
ICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nh
c3Q8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKLSAgICAgICAgICAgIEtV
UkwgdXJsID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVl
LT51cmwoKSk7Ci0KLSAgICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+
IG9wZXJhdGlvbiA9IFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50
VmFsdWUtPnVybCgpLCB1cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOwot
ICAgICAgICAgICAgaWYgKFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShz
dmdEb2N1bWVudFZhbHVlLT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgewotICAgICAgICAg
ICAgICAgIGlmICghc3ZnRG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQotICAgICAgICAg
ICAgICAgICAgICBtX3N0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdl
dCgpLCBzdmdEb2N1bWVudFZhbHVlKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1
bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKQotICAgICAgICAgICAgICAgICAgICBvcGVy
YXRpb24tPnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRT
VkdEb2N1bWVudFJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgp
KSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCku
YXBwZW5kKG9wZXJhdGlvbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZl
IHZhbHVlcywgd2l0aCB0aGUKLSAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdo
aWNoIGhhcyBhIFNoYWRvd1ZhbHVlIHBhcmFtZXRlci4KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5
cGUgIT0gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVykgewotICAgICAgICAgICAgYm9vbCBo
YXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQg
aiA9IDA7IGogPCBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgewotICAgICAgICAgICAgICAg
IGlmICghZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZl
VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIGZpcnN0VmFsdWUgPSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6
IDA7Ci0gICAgICAgIHN3aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgewotICAg
ICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246
Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJh
dGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAo
ZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBhbW91bnQgPSBm
aXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZh
bHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJh
dGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAg
ICAgICAgZG91YmxlIGFuZ2xlID0gMDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVu
Z3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVE
ZWdyZWVzKCk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChC
YXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5
cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAg
IGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKLSAg
ICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9
PSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDog
MTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgewotICAgICAg
ICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAg
ICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQotICAgICAgICAgICAgICAg
ICAgICBhbW91bnQgLz0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcGVyYXRp
b25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJh
dGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRl
ck9wZXJhdGlvbjogewotICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgw
LCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCi0g
ICAgICAgICAgICAgICAgc3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBpZiAoc3Rk
RGV2aWF0aW9uLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9w
ZXJhdGlvbjo6Y3JlYXRlKHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVl
LT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICAgICAgQ1NTVmFsdWUqIGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMCk7Ci0gICAgICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0g
ICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVt
ID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7Ci0gICAgICAgICAgICBJbnRQ
b2ludCBsb2NhdGlvbihpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHls
ZSwgem9vbUZhY3RvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5j
b21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikpOwotICAgICAg
ICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxp
bnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAgICAgIENvbG9y
IGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQotICAgICAgICAgICAgICAgIGNv
bG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOwotCi0gICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9w
ZXJhdGlvbjo6Y3JlYXRlKGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6
IENvbG9yOjp0cmFuc3BhcmVudCwgb3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZp
bHRlck9wZXJhdGlvbjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBv
dXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlm
Ci0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFn
ZShTdHlsZVBlbmRpbmdJbWFnZSogcGVuZGluZ0ltYWdlKQotewotICAgIENhY2hlZFJlc291cmNl
TG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVk
UmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUo
KSkgewotICAgICAgICBDU1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5j
c3NJbWFnZVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShj
YWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3Nz
SW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUq
IGltYWdlR2VuZXJhdG9yVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFs
dWUoKTsKLSAgICAgICAgaW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRS
ZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVh
dGUoaW1hZ2VHZW5lcmF0b3JWYWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+
Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1
cnNvckltYWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKLSAg
ICAgICAgcmV0dXJuIGN1cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNl
TG9hZGVyKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBpZiAocGVu
ZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCkpIHsKLSAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1
ZSogaW1hZ2VTZXRWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOwotICAg
ICAgICByZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VM
b2FkZXIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZXMoKQotewotICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBlbmRp
bmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBl
bmRpbmdJbWFnZVByb3BlcnRpZXMoKS5lbmQoKS5rZXlzKCk7Ci0gICAgZm9yIChQZW5kaW5nSW1h
Z2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJ
bWFnZVByb3BlcnRpZXMoKS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAg
ICAgIENTU1Byb3BlcnR5SUQgY3VycmVudFByb3BlcnR5ID0gKml0OwotCi0gICAgICAgIHN3aXRj
aCAoY3VycmVudFByb3BlcnR5KSB7Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
SW1hZ2U6IHsKLSAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBt
X3N0YXRlLnN0eWxlKCktPmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVy
OyBiYWNrZ3JvdW5kTGF5ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgewotICAgICAgICAg
ICAgICAgIGlmIChiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5p
bWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5k
TGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5n
SW1hZ2UqPihiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVu
dDogewotICAgICAgICAgICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9j
YXN0PENvbnRlbnREYXRhKj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVu
dERhdGE7IGNvbnRlbnREYXRhID0gY29udGVudERhdGEtPm5leHQoKSkgewotICAgICAgICAgICAg
ICAgIGlmIChjb250ZW50RGF0YS0+aXNJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0
eWxlSW1hZ2UqIGltYWdlID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnRE
YXRhKS0+aW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJ
bWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9h
ZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdl
Kj4oaW1hZ2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4o
Y29udGVudERhdGEpLT5zZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOwotICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogewot
ICAgICAgICAgICAgaWYgKEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCkt
PmN1cnNvcnMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vy
c29yTGlzdC0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYg
Y3VycmVudEN1cnNvciA9IGN1cnNvckxpc3QtPmF0KGkpOwotICAgICAgICAgICAgICAgICAgICBp
ZiAoU3R5bGVJbWFnZSogaW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uo
c3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTog
ewotICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBt
X3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAg
ICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGlu
Z0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5s
aXN0U3R5bGVJbWFnZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAo
bV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+
Ym9yZGVySW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBt
X3N0YXRlLnN0eWxlKCktPnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3Rh
dGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdl
U291cmNlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVjdDogewotICAgICAgICAgICAgaWYgKFN0eWxlUmVm
bGVjdGlvbiogcmVmbGVjdGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7Ci0g
ICAgICAgICAgICAgICAgY29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rp
b24tPm1hc2soKTsKLSAgICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFz
a0ltYWdlLmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAg
UmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNf
Y2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7Ci0gICAgICAgICAg
ICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2Uu
cmVsZWFzZSgpLCBtYXNrSW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFz
a0ltYWdlLmJvcmRlclNsaWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jp
em9udGFsUnVsZSgpLCBtYXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7Ci0gICAgICAgICAg
ICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0
eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAg
ICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5n
SW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1h
c2tCb3hJbWFnZVNvdXJjZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogewotICAgICAgICAgICAgZm9y
IChGaWxsTGF5ZXIqIG1hc2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVy
cygpOyBtYXNrTGF5ZXI7IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKG1hc2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlz
UGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2Uo
bG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXll
ci0+aW1hZ2UoKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygp
LmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMo
KQotewotICAgIC8vIFN0YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHls
ZS4KLSAgICBsb2FkUGVuZGluZ0ltYWdlcygpOwotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQot
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxl
LgotICAgIGxvYWRQZW5kaW5nU2hhZGVycygpOwotI2VuZGlmCi0gICAgCi0jaWYgRU5BQkxFKENT
U19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBE
b2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU1ZHRG9j
dW1lbnRzKCk7Ci0jZW5kaWYKLX0KLQotaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9w
ZXJ0aWVzOjpNYXRjaGVkUHJvcGVydGllcygpCi0gICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigw
KQotewotfQotCi1pbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRj
aGVkUHJvcGVydGllcygpCi17Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3Bl
cnRpZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdElu
Zm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywg
dGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKHByb3Bl
cnRpZXMsICJwcm9wZXJ0aWVzIik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZUl0ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1l
bW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5
T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRk
TWVtYmVyKG1hdGNoZWRQcm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsKLSAgICBpbmZv
LmFkZE1lbWJlcihyYW5nZXMsICJyYW5nZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJT
dHlsZSwgInJlbmRlclN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5
bGUsICJwYXJlbnRSZW5kZXJTdHlsZSIpOwotfQotCi12b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJl
cG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0
Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2Vi
Q29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwg
ImV4cHJlc3Npb24iKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2Fn
ZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9y
eUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBl
czo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKLSAg
ICBpbmZvLmFkZE1lbWJlcihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7
Ci0gICAgaW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZVN3ZWVwVGltZXIsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciIpOwotCi0g
ICAgaW5mby5hZGRNZW1iZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX3Jvb3REZWZhdWx0U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRN
ZW1iZXIobV9kb2N1bWVudCwgImRvY3VtZW50Iik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX2Zv
bnRTZWxlY3RvciwgImZvbnRTZWxlY3RvciIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3Bv
cnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHMiKTsKLSAgICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7Ci0gICAg
aW5mby5hZGRNZW1iZXIobV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKLSAgICBpbmZvLmFkZE1l
bWJlcihtX3Njb3BlUmVzb2x2ZXIsICJzY29wZVJlc29sdmVyIik7Ci0KLSAgICBpbmZvLmFkZE1l
bWJlcihtX3N0YXRlLCAic3RhdGUiKTsKLQotICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBw
bGFjZSB3aGVyZSBpdCB3b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPwotICAgIGluZm8uYWRkTWVt
YmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7
Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtz
U3R5bGUsICJkZWZhdWx0UXVpcmtzU3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOwot
ICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3Vy
Y2VTdHlsZSwgImRlZmF1bHRWaWV3U291cmNlU3R5bGUiKTsKKyAgICByZXR1cm4gbV9tYXRjaGVk
UnVsZXMgJiYgIW1fbWF0Y2hlZFJ1bGVzLT5pc0VtcHR5KCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5o
CShyZXZpc2lvbiAxNDUxODEpCShmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVy
Lmg6MTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5
OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAw
NCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFN0eWxlUmVzb2x2ZXJfaAorI2RlZmluZSBT
dHlsZVJlc29sdmVyX2gKKworI2luY2x1ZGUgIkNTU1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NT
VG9TdHlsZU1hcC5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlTGlzdC5oIgorI2luY2x1ZGUgIkRvY3Vt
ZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmgiCisjaW5j
bHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXhwLmgiCisjaW5jbHVkZSAi
UmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJSdWxlRmVhdHVyZS5oIgorI2luY2x1ZGUgIlJ1bGVT
ZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2Ny
b2xsVHlwZXMuaCIKKyNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIKKyNpbmNsdWRlICJTZWxl
Y3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlN0eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUg
IlN0eWxlU2NvcGVSZXNvbHZlci5oIgorI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5o
IgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJXZWJL
aXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisjZW5kaWYKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5o
PgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNo
Lmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2VudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmlt
dW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUgfTsKKworY2xhc3MgQ1NT
Q3Vyc29ySW1hZ2VWYWx1ZTsKK2NsYXNzIENTU0ZvbnRTZWxlY3RvcjsKK2NsYXNzIENTU0ZvbnRG
YWNlOworY2xhc3MgQ1NTRm9udEZhY2VSdWxlOworY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1
ZTsKK2NsYXNzIENTU0ltYWdlU2V0VmFsdWU7CitjbGFzcyBDU1NJbWFnZVZhbHVlOworY2xhc3Mg
Q1NTUGFnZVJ1bGU7CitjbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKK2NsYXNzIENTU1Byb3BlcnR5
OworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFzcyBDU1NTZWxlY3RvcjsKK2NsYXNzIENTU1N0eWxl
U2hlZXQ7CitjbGFzcyBDU1NWYWx1ZTsKK2NsYXNzIENvbnRhaW5lck5vZGU7CitjbGFzcyBDdXN0
b21GaWx0ZXJPcGVyYXRpb247CitjbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXI7CitjbGFzcyBD
dXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OworY2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBFbGVtZW50
OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZVZpZXc7CitjbGFzcyBLVVJMOworY2xhc3MgS2V5
ZnJhbWVMaXN0OworY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKK2NsYXNzIE1lZGlhUXVlcnlFdmFsdWF0
b3I7CitjbGFzcyBOb2RlOworY2xhc3MgUmVuZGVyUmVnaW9uOworY2xhc3MgUmVuZGVyU2Nyb2xs
YmFyOworY2xhc3MgUnVsZURhdGE7CitjbGFzcyBSdWxlU2V0OworY2xhc3MgU2V0dGluZ3M7Citj
bGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKK2NsYXNzIFN0eWxlQnVpbGRlcjsKK2NsYXNzIFN0eWxl
U2NvcGVSZXNvbHZlcjsKK2NsYXNzIFN0eWxlSW1hZ2U7CitjbGFzcyBTdHlsZUtleWZyYW1lOwor
Y2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7CitjbGFzcyBTdHlsZVByb3BlcnR5U2V0OworY2xhc3Mg
U3R5bGVSdWxlOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorY2xhc3MgU3R5bGVSdWxlSG9zdDsK
KyNlbmRpZgorY2xhc3MgU3R5bGVSdWxlS2V5ZnJhbWVzOworY2xhc3MgU3R5bGVSdWxlUGFnZTsK
K2NsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKK2NsYXNzIFN0eWxlU2hhZGVyOworY2xhc3MgU3R5bGVT
aGVldDsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0OworY2xhc3MgU3R5bGVkRWxlbWVudDsKK2NsYXNz
IFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKK2NsYXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOworY2xh
c3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7CitjbGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVl
OworCitjbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShN
ZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAg
TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkK
KyAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhwcikKKyAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQp
CisgICAgeworICAgIH0KKyAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdElu
Zm8qKSBjb25zdDsKKworICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNzaW9uOworICAgIGJvb2wg
bV9yZXN1bHQ7Cit9OworCitlbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHsKKyAgICBBbGxvd1N0
eWxlU2hhcmluZywKKyAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKK307CisKKy8vIE1hdGNoT25s
eVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUg
dW5pdHMKKy8vIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3Qg
ZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBvbmx5CisvLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0
eWxlc2hlZXQgcnVsZXMuCisKK2VudW0gUnVsZU1hdGNoaW5nQmVoYXZpb3IgeworICAgIE1hdGNo
QWxsUnVsZXMsCisgICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwsCisgICAgTWF0Y2hPbmx5
VXNlckFnZW50UnVsZXMsCit9OworCitjbGFzcyBQc2V1ZG9TdHlsZVJlcXVlc3QgeworcHVibGlj
OgorICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xs
YmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQp
CisgICAgICAgIDogcHNldWRvSWQocHNldWRvSWQpCisgICAgICAgICwgc2Nyb2xsYmFyUGFydChz
Y3JvbGxiYXJQYXJ0KQorICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxiYXIpCisgICAgeworICAg
IH0KKworICAgIFBzZXVkb0lkIHBzZXVkb0lkOworICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFy
UGFydDsKKyAgICBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKK307CisKK2NsYXNzIE1hdGNo
UmVxdWVzdCB7CitwdWJsaWM6CisgICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUg
PSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRh
cnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICA6IHJ1
bGVTZXQocnVsZVNldCkKKyAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlS
dWxlcykKKyAgICAgICAgLCBzY29wZShzY29wZSkKKyAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRh
cnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0KKyAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0Owor
ICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXM7CisgICAgY29uc3QgQ29udGFpbmVyTm9k
ZSogc2NvcGU7CisgICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkg
YmVoYXZpb3JBdEJvdW5kYXJ5OworfTsKKworLy8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVy
U3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVz
aGVldHMuCitjbGFzcyBTdHlsZVJlc29sdmVyIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShT
dHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3R5
bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKKyAg
ICB+U3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2Fs
ayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9yIHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5k
YW50IHNlbGVjdG9yIGxvb2t1cHMuCisgICAgdm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50
Kik7CisgICAgdm9pZCBwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHB1c2hQ
YXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKKyAgICB2b2lkIHBvcFBhcmVudFNo
YWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAg
IHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxlSG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNl
Y3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJl
c29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUsIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNj
b3BlKTsgfQorI2VuZGlmCisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVs
ZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmlu
Z0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJpbmcsCisgICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2
aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7
CisKKyAgICB2b2lkIGtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBS
ZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVl
c3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKTsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7
CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxl
KCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0
YXRlLnBhcmVudFN0eWxlKCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpOyB9CisgICAgRWxlbWVu
dCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpOyB9CisgICAgRG9jdW1lbnQq
IGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1bWVudDsgfQorICAgIFN0eWxlU2NvcGVSZXNvbHZl
ciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsg
fQorICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50
Tm9kZSgpOyB9CisKKyAgICAvLyBGSVhNRTogSXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9y
dWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3Rv
ciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCisgICAgdm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1
bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7
CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7
IH0KKyAgICBjb25zdCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJu
IG1fcnVsZVNldHM7IH0KKworI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFE
T1dfRE9NKQorICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCisg
ICAgeworI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisg
ICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkg
fHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2Vsc2UK
KyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxl
ZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVy
ZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7CisjZW5kaWYKKyAgICAgICAgaWYgKCFtX3Njb3BlUmVz
b2x2ZXIpCisgICAgICAgICAgICBtX3Njb3BlUmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVT
Y29wZVJlc29sdmVyKCkpOworICAgICAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOwor
ICAgIH0KKyNlbmRpZgorCitwcml2YXRlOgorICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCop
OworICAgIFJlbmRlclN0eWxlKiBsb2NhdGVTaGFyZWRTdHlsZSgpOworICAgIGJvb2wgc3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCopOworICAgIGJvb2wgc3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpOworICAgIE5vZGUqIGxvY2F0ZUNvdXNp
bkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7
CisgICAgU3R5bGVkRWxlbWVudCogZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVu
c2lnbmVkJiBjb3VudCkgY29uc3Q7CisgICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQo
U3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5
bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBL
ZXlmcmFtZVZhbHVlJik7CisKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2
ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhhdCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQg
KG9yIGEgcHNldWRvLWVsZW1lbnQpLgorICAgIGVudW0gQ1NTUnVsZUZpbHRlciB7CisgICAgICAg
IFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8IDEsCisgICAgICAgIEF1dGhvckNTU1J1bGVzICAg
ICAgPSAxIDw8IDIsCisgICAgICAgIEVtcHR5Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCisgICAg
ICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAxIDw8IDQsCisgICAgICAgIEFsbEJ1dEVtcHR5Q1NT
UnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5D
U1NSdWxlcywKKyAgICAgICAgQWxsQ1NTUnVsZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVs
ZXMgfCBFbXB0eUNTU1J1bGVzLAorICAgIH07CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0g
QWxsQnV0RW1wdHlDU1NSdWxlcyk7CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRv
U3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1Rv
SW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOworCisgICAgLy8gR2l2ZW4gYSBDU1Mga2V5
d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxsIHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBm
dW5jdGlvbiB3aWxsIHJldHVybgorICAgIC8vIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQg
cmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZhdWx0IChtZWRpdW0pLgorICAgIHN0YXRpYyBmbG9h
dCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRV
c2VGaXhlZERlZmF1bHRTaXplKTsKKworICAgIC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVs
LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFu
ZCA3LgorICAgIHN0YXRpYyBpbnQgbGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxG
b250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKKworcHVibGljOgorICAg
IHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5k
ZXJTdHlsZSopOworCisgICAgdm9pZCBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJv
cGVydHlJRCwgQ1NTVmFsdWUqKTsKKworICAgIHZvaWQgdXBkYXRlRm9udCgpOworICAgIHZvaWQg
aW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5ncyopOworCisgICAgc3RhdGljIGZsb2F0IGdldENv
bXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3Rvciwg
Ym9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZv
ckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUpOworCisgICAgdm9pZCBzZXRG
b250U2l6ZShGb250RGVzY3JpcHRpb24mLCBmbG9hdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBz
dGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBS
ZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJv
b2wgdXNlU1ZHWm9vbVJ1bGVzKTsKKworcHVibGljOgorICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVz
KCk7CisKKyAgICBzdGF0aWMgYm9vbCBjb2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZy
b21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVlKik7CisgICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0
aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqLCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2Up
IGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYp
IGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcm
KSBjb25zdDsKKyAgICBib29sIGhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0
cmluZyYpIGNvbnN0OworCisgICAgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25z
dCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5nZXQoKTsgfQorI2lmIEVOQUJMRShDU1NfREVWSUNF
X0FEQVBUQVRJT04pCisgICAgVmlld3BvcnRTdHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVz
b2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci5nZXQoKTsgfQorI2VuZGlm
CisKKyAgICB2b2lkIGFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBN
ZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQpOworICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRl
bnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJldHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlh
UXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQorICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hh
bmdlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHls
ZVJ1bGVLZXlmcmFtZXM+KTsKKworICAgIGJvb2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiBy
ZWdpb25FbGVtZW50KTsKKworICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0
dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCkuc2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQorICAg
IGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0
dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsgfQorICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVs
ZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVy
UnVsZXM7IH0KKworICAgIHN0YXRpYyBib29sIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NT
VmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0
eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKKyAgICAKKyAgICB2b2lk
IGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCk7CisKKyNpZiBFTkFCTEUoQ1NTX0ZJ
TFRFUlMpCisgICAgYm9vbCBjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVl
LCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3Bl
cmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIFN0
eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NWYWx1ZSopOworICAgIFN0eWxlU2hhZGVyKiBjYWNo
ZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOwor
ICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyTGlzdCYpOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1l
dGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1Zh
bHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9t
RmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsK
KyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJO
dW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQ
YXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zv
cm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNz
UmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9u
V2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIFBh
c3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRp
b25XaXRoSW5saW5lU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0
cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIHZvaWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5k
aWYKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZvaWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsK
KyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShDU1NfRklMVEVSUykKKworICAgIHZvaWQgbG9hZFBl
bmRpbmdSZXNvdXJjZXMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVz
IHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQg
Z2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JH
ZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxl
KTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSk7CisKKyAgICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxl
KiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKKwor
ICAgIHN0cnVjdCBSdWxlUmFuZ2UgeworICAgICAgICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJ
bmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgp
LCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQorICAgICAgICBpbnQmIGZpcnN0UnVs
ZUluZGV4OworICAgICAgICBpbnQmIGxhc3RSdWxlSW5kZXg7CisgICAgfTsKKworICAgIHN0cnVj
dCBNYXRjaFJhbmdlcyB7CisgICAgICAgIE1hdGNoUmFuZ2VzKCkgOiBmaXJzdFVBUnVsZSgtMSks
IGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUoLTEpLCBsYXN0QXV0aG9yUnVsZSgtMSks
IGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUoLTEpIHsgfQorICAgICAgICBpbnQgZmly
c3RVQVJ1bGU7CisgICAgICAgIGludCBsYXN0VUFSdWxlOworICAgICAgICBpbnQgZmlyc3RBdXRo
b3JSdWxlOworICAgICAgICBpbnQgbGFzdEF1dGhvclJ1bGU7CisgICAgICAgIGludCBmaXJzdFVz
ZXJSdWxlOworICAgICAgICBpbnQgbGFzdFVzZXJSdWxlOworICAgICAgICBSdWxlUmFuZ2UgVUFS
dWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVQVJ1bGUsIGxhc3RVQVJ1bGUpOyB9
CisgICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2Uo
Zmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIHVz
ZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVc2VyUnVsZSwgbGFzdFVzZXJS
dWxlKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXMgeworICAgICAg
ICBNYXRjaGVkUHJvcGVydGllcygpOworICAgICAgICB+TWF0Y2hlZFByb3BlcnRpZXMoKTsKKyAg
ICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Cisg
ICAgICAgIAorICAgICAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcHJvcGVydGllczsKKyAg
ICAgICAgdW5pb24geworICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICB1bnNp
Z25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aGl0ZWxp
c3RUeXBlIDogMjsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBVc2VkIHRvIG1ha2Ug
c3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6ZWQgc2luY2Ugd2UgY29tcHV0ZSB0aGUg
aGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICAgIHZvaWQqIHBv
c3NpYmx5UGFkZGVkTWVtYmVyOworICAgICAgICB9OworICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0
Y2hSZXN1bHQgeworICAgICAgICBNYXRjaFJlc3VsdCgpIDogaXNDYWNoZWFibGUodHJ1ZSkgeyB9
CisgICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcywgNjQ+IG1hdGNoZWRQcm9wZXJ0aWVz
OworICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1hdGNoZWRSdWxlczsKKyAgICAgICAg
TWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBib29sIGlzQ2FjaGVhYmxlOworICAgIH07CisK
KyAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBs
aW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxp
c3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyAgICB2b2lkIGFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiwgYm9vbCBp
c0NhY2hlYWJsZSA9IHRydWUpOworCisgICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0
JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOworICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1h
dGNoUmVzdWx0Jik7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0
Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wg
aW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRj
aFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hIb3N0UnVs
ZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKworICAgIHZvaWQgY29s
bGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAg
dm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBS
dWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBW
ZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisKKyAg
ICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYpIGNvbnN0OworICAgIHZv
aWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKE1hdGNoUmVzdWx0Jik7CisKKyAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRh
JiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2Vy
OjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5k
YXJ5KTsKKyAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJl
Z2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKyAgICB2b2lkIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBjb25zdCBFbGVtZW50Kik7CisgICAg
ZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisg
ICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCisjZW5kaWYKKyAgICAgICAgSGlnaFByaW9yaXR5
UHJvcGVydGllcywKKyAgICAgICAgTG93UHJpb3JpdHlQcm9wZXJ0aWVzCisgICAgfTsKKyAgICB0
ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBib29sIGltcG9ydGFudCwgaW50IHN0YXJ0
SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KTsKKyAgICB0ZW1wbGF0ZSA8
U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5UHJvcGVydGllcyhjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqLCBib29sIGlzSW1wb3J0
YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5
V2hpdGVsaXN0Tm9uZSk7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgdm9pZCByZXNv
bHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwgVmVjdG9yPHN0ZDo6cGFpcjxD
U1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpOworI2VuZGlmCisgICAg
c3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7Cisj
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIHN0YXRpYyBib29sIGlzVmFsaWRDdWVTdHlsZVBy
b3BlcnR5KENTU1Byb3BlcnR5SUQpOworI2VuZGlmCisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhN
YXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0
KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxl
UnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3Ry
aW5nJiBwYWdlTmFtZSk7CisgICAgU2V0dGluZ3MqIGRvY3VtZW50U2V0dGluZ3MoKSB7IHJldHVy
biBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9CisKKyAgICBib29sIGlzTGVmdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBpc1JpZ2h0UGFnZShpbnQgcGFnZUluZGV4KSBjb25z
dCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgpOyB9CisgICAgYm9vbCBpc0ZpcnN0UGFn
ZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBTdHJpbmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRl
eCkgY29uc3Q7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzIG1fcnVsZVNldHM7CisKKyAgICB0eXBl
ZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+
ID4gS2V5ZnJhbWVzUnVsZU1hcDsKKyAgICBLZXlmcmFtZXNSdWxlTWFwIG1fa2V5ZnJhbWVzUnVs
ZU1hcDsKKworcHVibGljOgorICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBSZWZQ
dHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA7CisjaWYgRU5BQkxFKENTU19G
SUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgIHR5cGVkZWYgSGFzaE1hcDxGaWx0ZXJPcGVyYXRp
b24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZT4gPiBQZW5kaW5nU1ZHRG9jdW1l
bnRNYXA7CisjZW5kaWYKKworICAgIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoU3RhdGUpOworICAgIHB1YmxpYzoKKyAgICAgICAgU3RhdGUoKQorICAgICAgICA6
IG1fZWxlbWVudCgwKQorICAgICAgICAsIG1fc3R5bGVkRWxlbWVudCgwKQorICAgICAgICAsIG1f
cGFyZW50Tm9kZSgwKQorICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3Jv
b3RFbGVtZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKKyAgICAg
ICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQorICAgICAgICAsIG1fcHNldWRvU3R5bGVSZXF1
ZXN0KE5PUFNFVURPKQorICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShOb3RJbnNpZGVMaW5r
KQorICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZhbHNlKQorICAgICAg
ICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQorICAgICAgICAsIG1fbW9k
ZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQorICAgICAgICAsIG1fYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCisgICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9WaXNp
dGVkTGlua1N0eWxlKGZhbHNlKQorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgLCBt
X2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQorI2VuZGlmCisgICAgICAgICwgbV9saW5lSGVpZ2h0
VmFsdWUoMCkKKyAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxzZSkKKyAgICAgICAgLCBtX2hhc1VB
QXBwZWFyYW5jZShmYWxzZSkKKyAgICAgICAgLCBtX2JhY2tncm91bmREYXRhKEJhY2tncm91bmRG
aWxsTGF5ZXIpIHsgfQorCisgICAgcHVibGljOgorICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVs
ZW1lbnQqKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxl
bWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVx
dWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgICAgIERvY3Vt
ZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC0+ZG9jdW1lbnQoKTsgfQor
ICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9Cisg
ICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3N0
eWxlZEVsZW1lbnQ7IH0KKyAgICAgICAgdm9pZCBzZXRTdHlsZShQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQorICAgICAgICBQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVhc2UoKTsgfQor
CisgICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICBQ
YXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBtX3J1bGVMaXN0
LnJlbGVhc2UoKTsgfQorCisgICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUo
KSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KKyAgICAgICAgdm9pZCBzZXRQYXJlbnRT
dHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0
eWxlOyB9CisgICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJu
IG1fcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KKworICAgICAgICBjb25zdCBS
ZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBtX3JlZ2lvbkZv
clN0eWxpbmc7IH0KKyAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGlzU2FtZU9y
aWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7IH0KKyAgICAg
ICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1lT3JpZ2luT25s
eTsgfQorICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVz
dCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9CisgICAgICAgIEVJbnNp
ZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5rU3Rh
dGU7IH0KKyAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7
IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQorICAgICAgICB2b2lkIHNl
dEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CisgICAgICAgIGJvb2wgZWxlbWVu
dEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXM7IH0KKyAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9k
ZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2Rl
IG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KKyAgICAgICAgCisgICAgICAgIHZvaWQg
c2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAgICAgdm9pZCBzZXRBcHBseVBy
b3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9CisgICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0
eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFy
U3R5bGU7IH0KKyAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkg
Y29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOyB9CisgICAg
ICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkgeyBy
ZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9CisjaWYgRU5BQkxFKENTU19GSUxURVJT
KSAmJiBFTkFCTEUoU1ZHKQorICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAmIHBlbmRpbmdT
VkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdEb2N1bWVudHM7IH0KKyNlbmRpZgor
I2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgdm9pZCBzZXRIYXNQZW5kaW5nU2hhZGVy
cyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBoYXNQZW5k
aW5nU2hhZGVyczsgfQorICAgICAgICBib29sIGhhc1BlbmRpbmdTaGFkZXJzKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQorI2VuZGlmCisKKyAgICAgICAgdm9pZCBzZXRM
aW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1fbGluZUhlaWdodFZhbHVlID0gdmFs
dWU7IH0KKyAgICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRWYWx1ZSgpIHsgcmV0dXJuIG1fbGlu
ZUhlaWdodFZhbHVlOyB9CisgICAgICAgIHZvaWQgc2V0Rm9udERpcnR5KGJvb2wgaXNEaXJ0eSkg
eyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KKyAgICAgICAgYm9vbCBmb250RGlydHkoKSBjb25z
dCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQorCisgICAgICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRC
YWNrZ3JvdW5kKCk7CisgICAgICAgIGJvb2wgaGFzVUFBcHBlYXJhbmNlKCkgY29uc3QgeyByZXR1
cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KKyAgICAgICAgQm9yZGVyRGF0YSBib3JkZXJEYXRhKCkg
Y29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9CisgICAgICAgIEZpbGxMYXllciBiYWNrZ3Jv
dW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZERhdGE7IH0KKyAgICAgICAgQ29s
b3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7IH0K
KworICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0
dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9CisgICAgICAgIGNvbnN0IEZvbnREZXNj
cmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9wYXJlbnRTdHlsZS0+
Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAgICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29u
c3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9mb250RGlydHkgfD0gbV9z
dHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAgICAgICAgdm9p
ZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Wm9vbShmKTsg
fQorICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8
PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgICAgIHZvaWQgc2V0V3JpdGlu
Z01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+
c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9CisgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVu
dGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KKworICAgICAg
ICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1f
bWF0Y2hlZFJ1bGVzOyB9CisgICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURh
dGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9CisgICAgICAgIAorICAg
IHByaXZhdGU6CisgICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2ll
ciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgorICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1Ymxp
Yy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCisgICAgICAgIC8vIHRo
ZXNlIHZhcmlhYmxlcy4KKyAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OworICAgICAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IG1fc3R5bGU7CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVk
RWxlbWVudDsKKyAgICAgICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOworICAgICAgICBS
ZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsKKyAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVs
ZW1lbnRTdHlsZTsKKyAgICAgICAgCisgICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JT
dHlsaW5nOworICAgICAgICBib29sIG1fc2FtZU9yaWdpbk9ubHk7CisgICAgICAgIFBzZXVkb1N0
eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKKworICAgICAgICBFSW5zaWRlTGluayBt
X2VsZW1lbnRMaW5rU3RhdGU7CisKKyAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRp
b25Qb2ludDsKKworICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOwor
CisgICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7CisKKyAgICAgICAgLy8gQSBi
dWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVu
dCwKKyAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0
aW5nLgorICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7
CisgICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKworICAgICAg
ICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOworICAgICAgICBib29sIG1fYXBw
bHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsKKworICAgICAgICBQZW5kaW5nSW1hZ2VQcm9w
ZXJ0eU1hcCBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7CisjaWYgRU5BQkxFKENTU19TSEFERVJT
KQorICAgICAgICBib29sIG1faGFzUGVuZGluZ1NoYWRlcnM7CisjZW5kaWYKKyNpZiBFTkFCTEUo
Q1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1h
cCBtX3BlbmRpbmdTVkdEb2N1bWVudHM7CisjZW5kaWYKKyAgICAgICAgQ1NTVmFsdWUqIG1fbGlu
ZUhlaWdodFZhbHVlOworICAgICAgICBib29sIG1fZm9udERpcnR5OworCisgICAgICAgIGJvb2wg
bV9oYXNVQUFwcGVhcmFuY2U7CisgICAgICAgIEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOworICAg
ICAgICBGaWxsTGF5ZXIgbV9iYWNrZ3JvdW5kRGF0YTsKKyAgICAgICAgQ29sb3IgbV9iYWNrZ3Jv
dW5kQ29sb3I7CisgICAgfTsKKworICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRB
dmFpbGFibGUoKSB7IHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOyB9CisKKyAgICBQYXNz
UmVmUHRyPFN0eWxlSW1hZ2U+IHN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsK
KyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQ
cm9wZXJ0eUlELCBDU1NJbWFnZVZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBn
ZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0
b3JWYWx1ZSopOworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIFBhc3NSZWZQdHI8U3R5
bGVJbWFnZT4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0
VmFsdWUqKTsKKyNlbmRpZgorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5k
aW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0N1cnNvckltYWdlVmFsdWUqKTsKKworICAg
IGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0
ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKTsgfQorICAgIGJvb2wgYXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZSgpOyB9CisKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0lu
dExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJv
b3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZl
cnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJT
dHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworCisgICAgQ1NTVG9TdHls
ZU1hcCogc3R5bGVNYXAoKSB7IHJldHVybiAmbV9zdHlsZU1hcDsgfQorICAgIEluc3BlY3RvckNT
U09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3Rv
ckNTU09NV3JhcHBlcnM7IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlw
dGlvbigpIHsgcmV0dXJuIG1fc3RhdGUuZm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICBjb25zdCBG
b250RGVzY3JpcHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUu
cGFyZW50Rm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihj
b25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnRE
ZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9CisgICAgdm9pZCBzZXRab29tKGZsb2F0IGYp
IHsgbV9zdGF0ZS5zZXRab29tKGYpOyB9CisgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0
IGYpIHsgbV9zdGF0ZS5zZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgdm9pZCBzZXRXcml0aW5n
TW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX3N0YXRlLnNldFdyaXRpbmdNb2RlKHdy
aXRpbmdNb2RlKTsgfQorICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlv
biB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVu
dGF0aW9uKTsgfQorICAgIAorICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0
SW5mbyopIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHNf
c3R5bGVOb3RZZXRBdmFpbGFibGU7CisKKyAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3Vu
ZCgpOworCitwcml2YXRlOgorICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxl
ZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZvaWQgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlE
LCBDU1NWYWx1ZSopOworCisjaWYgRU5BQkxFKFNWRykKKyAgICB2b2lkIGFwcGx5U1ZHUHJvcGVy
dHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyNlbmRpZgorCisgICAgUGFzc1JlZlB0cjxT
dHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKik7CisgICAgdm9p
ZCBsb2FkUGVuZGluZ0ltYWdlcygpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVNYXRj
aGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqLCB1bnNpZ25lZCBzaXpl
KTsKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0geworICAgICAgICB2b2lk
IHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKyAgICAgICAgVmVj
dG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVkUHJvcGVydGllczsKKyAgICAgICAgTWF0Y2hS
YW5nZXMgcmFuZ2VzOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHJlbmRlclN0eWxlOwor
ICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBhcmVudFJlbmRlclN0eWxlOworICAgIH07Cisg
ICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGZpbmRGcm9tTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOworICAgIHZvaWQg
YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYp
OworCisgICAgLy8gRXZlcnkgTiBhZGRpdGlvbnMgdG8gdGhlIG1hdGNoZWQgZGVjbGFyYXRpb24g
Y2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJlIGVudHJpZXMgaG9sZGluZworICAgIC8vIHRoZSBs
YXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRlY2xhcmF0aW9uIGFyZSBnYXJiYWdlIGNvbGxlY3Rl
ZC4KKyAgICB2b2lkIHN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29s
dmVyPiopOworCisgICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNl
U3BsaXRTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGlj
YWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAg
dW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXA7
CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJ
dGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hlOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUg
bV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOworCisgICAgVGltZXI8U3R5bGVSZXNvbHZlcj4gbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcjsKKworICAgIE93blB0cjxNZWRpYVF1ZXJ5
RXZhbHVhdG9yPiBtX21lZGl1bTsKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fcm9vdERlZmF1
bHRTdHlsZTsKKworICAgIERvY3VtZW50KiBtX2RvY3VtZW50OworICAgIFNlbGVjdG9yRmlsdGVy
IG1fc2VsZWN0b3JGaWx0ZXI7CisKKyAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
OworCisgICAgUmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7CisgICAgVmVj
dG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1
ZXJ5UmVzdWx0czsKKworI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgUmVm
UHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXI7CisjZW5k
aWYKKworICAgIGNvbnN0IFN0eWxlQnVpbGRlciYgbV9zdHlsZUJ1aWxkZXI7CisKKyAgICBPd25Q
dHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7CisgICAgQ1NTVG9TdHlsZU1h
cCBtX3N0eWxlTWFwOworICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMgbV9pbnNwZWN0b3JDU1NP
TVdyYXBwZXJzOworCisgICAgU3RhdGUgbV9zdGF0ZTsKKworICAgIGZyaWVuZCBjbGFzcyBTdHls
ZUJ1aWxkZXI7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaGVkUHJvcGVy
dGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7
CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1h
dGNoUmFuZ2VzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaFJhbmdl
cyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Cit9OworCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
OjpoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcgJmF0dHJpYnV0ZU5h
bWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFhdHRyaWJ1dGVOYW1lLmlzRW1wdHkoKSk7CisgICAg
cmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuY29udGFpbnMoYXR0cmli
dXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxl
Y3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYgY2xhc3NWYWx1ZSkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5m
ZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzVmFsdWUuaW1wbCgpKTsKK30K
KworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZChjb25zdCBBdG9t
aWNTdHJpbmcmIGlkVmFsdWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFpZFZhbHVlLmlzRW1wdHko
KSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5z
KGlkVmFsdWUuaW1wbCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gU3R5bGVSZXNvbHZlcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVD
b2xsZWN0b3IuaAkocmV2aXNpb24gMTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUvY3NzL0VsZW1l
bnRSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDY3OSArMTksMTA0IEBACiAg
KgogICovCiAKLSNpZm5kZWYgU3R5bGVSZXNvbHZlcl9oCi0jZGVmaW5lIFN0eWxlUmVzb2x2ZXJf
aAorI2lmbmRlZiBFbGVtZW50UnVsZUNvbGxlY3Rvcl9oCisjZGVmaW5lIEVsZW1lbnRSdWxlQ29s
bGVjdG9yX2gKIAotI2luY2x1ZGUgIkNTU1J1bGVMaXN0LmgiCi0jaW5jbHVkZSAiQ1NTVG9TdHls
ZU1hcC5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlTGlzdC5oIgotI2luY2x1ZGUgIkRvY3VtZW50UnVs
ZVNldHMuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmgiCi0jaW5jbHVkZSAi
TGlua0hhc2guaCIKLSNpbmNsdWRlICJNZWRpYVF1ZXJ5RXhwLmgiCi0jaW5jbHVkZSAiUmVuZGVy
U3R5bGUuaCIKLSNpbmNsdWRlICJSdWxlRmVhdHVyZS5oIgotI2luY2x1ZGUgIlJ1bGVTZXQuaCIK
LSNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCi0jaW5jbHVkZSAiU2Nyb2xsVHlw
ZXMuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCiAjaW5jbHVkZSAiU2VsZWN0
b3JDaGVja2VyLmgiCi0jaW5jbHVkZSAiU2VsZWN0b3JGaWx0ZXIuaCIKLSNpbmNsdWRlICJTdHls
ZUluaGVyaXRlZERhdGEuaCIKLSNpbmNsdWRlICJTdHlsZVNjb3BlUmVzb2x2ZXIuaCIKLSNpbmNs
dWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYm
IEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgotI2Vu
ZGlmCi0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgor
I2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2gu
aD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotZW51bSBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgeyBEb05vdFVzZVNtYXJ0TWluaW11
bUZvckZvbnRTaXplLCBVc2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSB9OwotCi1jbGFzcyBDU1ND
dXJzb3JJbWFnZVZhbHVlOwotY2xhc3MgQ1NTRm9udFNlbGVjdG9yOwotY2xhc3MgQ1NTRm9udEZh
Y2U7Ci1jbGFzcyBDU1NGb250RmFjZVJ1bGU7Ci1jbGFzcyBDU1NJbWFnZUdlbmVyYXRvclZhbHVl
OwotY2xhc3MgQ1NTSW1hZ2VTZXRWYWx1ZTsKLWNsYXNzIENTU0ltYWdlVmFsdWU7Ci1jbGFzcyBD
U1NQYWdlUnVsZTsKLWNsYXNzIENTU1ByaW1pdGl2ZVZhbHVlOwotY2xhc3MgQ1NTUHJvcGVydHk7
CiBjbGFzcyBDU1NSdWxlTGlzdDsKLWNsYXNzIENTU1NlbGVjdG9yOwotY2xhc3MgQ1NTU3R5bGVT
aGVldDsKLWNsYXNzIENTU1ZhbHVlOwotY2xhc3MgQ29udGFpbmVyTm9kZTsKLWNsYXNzIEN1c3Rv
bUZpbHRlck9wZXJhdGlvbjsKLWNsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlcjsKLWNsYXNzIEN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3Q7Ci1jbGFzcyBEb2N1bWVudDsKLWNsYXNzIEVsZW1lbnQ7
Ci1jbGFzcyBGcmFtZTsKLWNsYXNzIEZyYW1lVmlldzsKLWNsYXNzIEtVUkw7Ci1jbGFzcyBLZXlm
cmFtZUxpc3Q7Ci1jbGFzcyBLZXlmcmFtZVZhbHVlOwotY2xhc3MgTWVkaWFRdWVyeUV2YWx1YXRv
cjsKLWNsYXNzIE5vZGU7CitjbGFzcyBEb2N1bWVudFJ1bGVTZXRzOwogY2xhc3MgUmVuZGVyUmVn
aW9uOwotY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOwogY2xhc3MgUnVsZURhdGE7CiBjbGFzcyBSdWxl
U2V0OwotY2xhc3MgU2V0dGluZ3M7Ci1jbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKLWNsYXNzIFN0
eWxlQnVpbGRlcjsKK2NsYXNzIFNlbGVjdG9yRmlsdGVyOwogY2xhc3MgU3R5bGVTY29wZVJlc29s
dmVyOwotY2xhc3MgU3R5bGVJbWFnZTsKLWNsYXNzIFN0eWxlS2V5ZnJhbWU7Ci1jbGFzcyBTdHls
ZVBlbmRpbmdJbWFnZTsKLWNsYXNzIFN0eWxlUHJvcGVydHlTZXQ7Ci1jbGFzcyBTdHlsZVJ1bGU7
Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi1jbGFzcyBTdHlsZVJ1bGVIb3N0OwotI2VuZGlmCi1j
bGFzcyBTdHlsZVJ1bGVLZXlmcmFtZXM7Ci1jbGFzcyBTdHlsZVJ1bGVQYWdlOwotY2xhc3MgU3R5
bGVSdWxlUmVnaW9uOwotY2xhc3MgU3R5bGVTaGFkZXI7Ci1jbGFzcyBTdHlsZVNoZWV0OwotY2xh
c3MgU3R5bGVTaGVldExpc3Q7Ci1jbGFzcyBTdHlsZWRFbGVtZW50OwotY2xhc3MgVmlld3BvcnRT
dHlsZVJlc29sdmVyOwotY2xhc3MgV2ViS2l0Q1NTRmlsdGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRD
U1NTaGFkZXJWYWx1ZTsKLWNsYXNzIFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU7Ci0KLWNsYXNz
IE1lZGlhUXVlcnlSZXN1bHQgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKE1lZGlhUXVlcnlS
ZXN1bHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBNZWRpYVF1ZXJ5
UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAmIGV4cHIsIGJvb2wgcmVzdWx0KQotICAgICAgICA6
IG1fZXhwcmVzc2lvbihleHByKQotICAgICAgICAsIG1fcmVzdWx0KHJlc3VsdCkKLSAgICB7Ci0g
ICAgfQotICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0
OwotCi0gICAgTWVkaWFRdWVyeUV4cCBtX2V4cHJlc3Npb247Ci0gICAgYm9vbCBtX3Jlc3VsdDsK
LX07Ci0KLWVudW0gU3R5bGVTaGFyaW5nQmVoYXZpb3IgewotICAgIEFsbG93U3R5bGVTaGFyaW5n
LAotICAgIERpc2FsbG93U3R5bGVTaGFyaW5nLAotfTsKLQotLy8gTWF0Y2hPbmx5VXNlckFnZW50
UnVsZXMgaXMgdXNlZCBpbiBtZWRpYSBxdWVyaWVzLCB3aGVyZSByZWxhdGl2ZSB1bml0cwotLy8g
YXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50IHN0
eWxlLCBhbmQgc3R5bGVkIG9ubHkKLS8vIGZyb20gdGhlIFVzZXIgQWdlbnQgU3R5bGVzaGVldCBy
dWxlcy4KLQotZW51bSBSdWxlTWF0Y2hpbmdCZWhhdmlvciB7Ci0gICAgTWF0Y2hBbGxSdWxlcywK
LSAgICBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCwKLSAgICBNYXRjaE9ubHlVc2VyQWdlbnRS
dWxlcywKLX07Ci0KLWNsYXNzIFBzZXVkb1N0eWxlUmVxdWVzdCB7Ci1wdWJsaWM6Ci0gICAgUHNl
dWRvU3R5bGVSZXF1ZXN0KFBzZXVkb0lkIHBzZXVkb0lkLCBSZW5kZXJTY3JvbGxiYXIqIHNjcm9s
bGJhciA9IDAsIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydCA9IE5vUGFydCkKLSAgICAgICAg
OiBwc2V1ZG9JZChwc2V1ZG9JZCkKLSAgICAgICAgLCBzY3JvbGxiYXJQYXJ0KHNjcm9sbGJhclBh
cnQpCi0gICAgICAgICwgc2Nyb2xsYmFyKHNjcm9sbGJhcikKLSAgICB7Ci0gICAgfQotCi0gICAg
UHNldWRvSWQgcHNldWRvSWQ7Ci0gICAgU2Nyb2xsYmFyUGFydCBzY3JvbGxiYXJQYXJ0OwotICAg
IFJlbmRlclNjcm9sbGJhciogc2Nyb2xsYmFyOwotfTsKLQotY2xhc3MgTWF0Y2hSZXF1ZXN0IHsK
LXB1YmxpYzoKLSAgICBNYXRjaFJlcXVlc3QoUnVsZVNldCogcnVsZVNldCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcyA9IGZhbHNlLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSA9IDAsIFNlbGVj
dG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVj
dG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCi0gICAgICAgIDogcnVsZVNldChydWxl
U2V0KQotICAgICAgICAsIGluY2x1ZGVFbXB0eVJ1bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKQotICAg
ICAgICAsIHNjb3BlKHNjb3BlKQotICAgICAgICAsIGJlaGF2aW9yQXRCb3VuZGFyeShiZWhhdmlv
ckF0Qm91bmRhcnkpIHsgfQotICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVTZXQ7Ci0gICAgY29uc3Qg
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlczsKLSAgICBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZTsK
LSAgICBjb25zdCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0
Qm91bmRhcnk7Ci19OwotCi0vLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBSZW5kZXJTdHlsZSBmb3Ig
YSBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBzdHlsZXNoZWV0cy4KLWNs
YXNzIFN0eWxlUmVzb2x2ZXIgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0eWxlUmVzb2x2
ZXIpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBTdHlsZVJlc29sdmVy
KERvY3VtZW50KiwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpOwotICAgIH5TdHlsZVJl
c29sdmVyKCk7Ci0KLSAgICAvLyBVc2luZyB0aGVzZSBkdXJpbmcgdHJlZSB3YWxrIHdpbGwgYWxs
b3cgc3R5bGUgc2VsZWN0b3IgdG8gb3B0aW1pemUgY2hpbGQgYW5kIGRlc2NlbmRhbnQgc2VsZWN0
b3IgbG9va3Vwcy4KLSAgICB2b2lkIHB1c2hQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICB2
b2lkIHBvcFBhcmVudEVsZW1lbnQoRWxlbWVudCopOwotICAgIHZvaWQgcHVzaFBhcmVudFNoYWRv
d1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOwotICAgIHZvaWQgcG9wUGFyZW50U2hhZG93Um9vdChj
b25zdCBTaGFkb3dSb290Kik7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgdm9pZCBhZGRI
b3N0UnVsZShTdHlsZVJ1bGVIb3N0KiBydWxlLCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmln
aW4sIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlKSB7IGVuc3VyZVNjb3BlUmVzb2x2ZXIoKS0+
YWRkSG9zdFJ1bGUocnVsZSwgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgc2NvcGUpOyB9Ci0j
ZW5kaWYKLQotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRWxlbWVudChFbGVt
ZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gMCwgU3R5bGVTaGFyaW5nQmVoYXZpb3Ig
PSBBbGxvd1N0eWxlU2hhcmluZywKLSAgICAgICAgUnVsZU1hdGNoaW5nQmVoYXZpb3IgPSBNYXRj
aEFsbFJ1bGVzLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKLQotICAgIHZv
aWQga2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCosIGNvbnN0IFJlbmRlclN0eWxl
KiwgS2V5ZnJhbWVMaXN0Jik7Ci0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBwc2V1ZG9T
dHlsZUZvckVsZW1lbnQoRWxlbWVudCosIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYsIFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHls
ZUZvclBhZ2UoaW50IHBhZ2VJbmRleCk7Ci0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gZGVm
YXVsdFN0eWxlRm9yRWxlbWVudCgpOwotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxl
Rm9yVGV4dChUZXh0Kik7Ci0KLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5
bGVGb3JEb2N1bWVudChEb2N1bWVudCosIENTU0ZvbnRTZWxlY3RvciogPSAwKTsKLQotICAgIFJl
bmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuc3R5bGUoKTsgfQotICAg
IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50
U3R5bGUoKTsgfQotICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCk7IH0KLSAgICBFbGVtZW50KiBlbGVtZW50
KCkgeyByZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCk7IH0KLSAgICBEb2N1bWVudCogZG9jdW1lbnQo
KSB7IHJldHVybiBtX2RvY3VtZW50OyB9Ci0gICAgU3R5bGVTY29wZVJlc29sdmVyKiBzY29wZVJl
c29sdmVyKCkgY29uc3QgeyByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOyB9Ci0gICAgYm9v
bCBoYXNQYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnROb2RlKCk7IH0K
LQotICAgIC8vIEZJWE1FOiBJdCBjb3VsZCBiZSBiZXR0ZXIgdG8gY2FsbCBtX3J1bGVTZXRzLmFw
cGVuZEF1dGhvclN0eWxlU2hlZXRzKCkgZGlyZWN0bHkgYWZ0ZXIgd2UgZmFjdG9yIFN0eWxlUnNv
bHZlciBmdXJ0aGVyLgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xMDg4OTAKLSAgICB2b2lkIGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZp
cnN0TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mKTsKLQotICAgIERv
Y3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyByZXR1cm4gbV9ydWxlU2V0czsgfQotICAgIGNv
bnN0IERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0
czsgfQotCi0jaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCi0g
ICAgU3R5bGVTY29wZVJlc29sdmVyKiBlbnN1cmVTY29wZVJlc29sdmVyKCkKLSAgICB7Ci0jaWYg
RU5BQkxFKFNUWUxFX1NDT1BFRCkKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICAgICAgQVNT
RVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSB8fCBSdW50aW1l
RW5hYmxlZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVuYWJsZWQoKSk7Ci0jZWxzZQotICAgICAgICBB
U1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOwotI2Vu
ZGlmCi0jZWxzZQotICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93
RE9NRW5hYmxlZCgpKTsKLSNlbmRpZgotICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAg
ICAgICAgICAgIG1fc2NvcGVSZXNvbHZlciA9IGFkb3B0UHRyKG5ldyBTdHlsZVNjb3BlUmVzb2x2
ZXIoKSk7Ci0gICAgICAgIHJldHVybiBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCk7Ci0gICAgfQotI2Vu
ZGlmCi0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7Ci0gICAgUmVu
ZGVyU3R5bGUqIGxvY2F0ZVNoYXJlZFN0eWxlKCk7Ci0gICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5k
aWRhdGVNYXRjaGVzUnVsZVNldChSdWxlU2V0Kik7Ci0gICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5k
aWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCk7Ci0gICAgTm9kZSogbG9jYXRlQ291c2luTGlzdChFbGVt
ZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdDsKLSAgICBTdHls
ZWRFbGVtZW50KiBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiwgdW5zaWduZWQmIGNv
dW50KSBjb25zdDsKLSAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVt
ZW50KikgY29uc3Q7Ci0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvcktleWZy
YW1lKGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgU3R5bGVLZXlmcmFtZSosIEtleWZyYW1lVmFs
dWUmKTsKLQotcHVibGljOgotICAgIC8vIFRoZXNlIG1ldGhvZHMgd2lsbCBnaXZlIGJhY2sgdGhl
IHNldCBvZiBydWxlcyB0aGF0IG1hdGNoZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudCAob3IgYSBwc2V1
ZG8tZWxlbWVudCkuCi0gICAgZW51bSBDU1NSdWxlRmlsdGVyIHsKLSAgICAgICAgVUFBbmRVc2Vy
Q1NTUnVsZXMgICA9IDEgPDwgMSwKLSAgICAgICAgQXV0aG9yQ1NTUnVsZXMgICAgICA9IDEgPDwg
MiwKLSAgICAgICAgRW1wdHlDU1NSdWxlcyAgICAgICA9IDEgPDwgMywKLSAgICAgICAgQ3Jvc3NP
cmlnaW5DU1NSdWxlcyA9IDEgPDwgNCwKLSAgICAgICAgQWxsQnV0RW1wdHlDU1NSdWxlcyA9IFVB
QW5kVXNlckNTU1J1bGVzIHwgQXV0aG9yQ1NTUnVsZXMgfCBDcm9zc09yaWdpbkNTU1J1bGVzLAot
ICAgICAgICBBbGxDU1NSdWxlcyAgICAgICAgID0gQWxsQnV0RW1wdHlDU1NSdWxlcyB8IEVtcHR5
Q1NTUnVsZXMsCi0gICAgfTsKLSAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBzdHlsZVJ1bGVz
Rm9yRWxlbWVudChFbGVtZW50KiwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0
eUNTU1J1bGVzKTsKLSAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBwc2V1ZG9TdHlsZVJ1bGVz
Rm9yRWxlbWVudChFbGVtZW50KiwgUHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0g
QWxsQnV0RW1wdHlDU1NSdWxlcyk7Ci0KLSAgICAvLyBHaXZlbiBhIENTUyBrZXl3b3JkIGluIHRo
ZSByYW5nZSAoeHgtc21hbGwgdG8gLXdlYmtpdC14eHgtbGFyZ2UpLCB0aGlzIGZ1bmN0aW9uIHdp
bGwgcmV0dXJuCi0gICAgLy8gdGhlIGNvcnJlY3QgZm9udCBzaXplIHNjYWxlZCByZWxhdGl2ZSB0
byB0aGUgdXNlcidzIGRlZmF1bHQgKG1lZGl1bSkuCi0gICAgc3RhdGljIGZsb2F0IGZvbnRTaXpl
Rm9yS2V5d29yZChEb2N1bWVudCosIGludCBrZXl3b3JkLCBib29sIHNob3VsZFVzZUZpeGVkRGVm
YXVsdFNpemUpOwotCi0gICAgLy8gR2l2ZW4gYSBmb250IHNpemUgaW4gcGl4ZWwsIHRoaXMgZnVu
Y3Rpb24gd2lsbCByZXR1cm4gbGVnYWN5IGZvbnQgc2l6ZSBiZXR3ZWVuIDEgYW5kIDcuCi0gICAg
c3RhdGljIGludCBsZWdhY3lGb250U2l6ZShEb2N1bWVudCosIGludCBwaXhlbEZvbnRTaXplLCBi
b29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhcHBs
eVByb3BlcnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFJlbmRlclN0eWxlKik7
Ci0KLSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlELCBD
U1NWYWx1ZSopOwotCi0gICAgdm9pZCB1cGRhdGVGb250KCk7Ci0gICAgdm9pZCBpbml0aWFsaXpl
Rm9udFN0eWxlKFNldHRpbmdzKik7Ci0KLSAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXpl
RnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJz
b2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUg
PSBVc2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSk7Ci0KLSAgICB2b2lkIHNldEZvbnRTaXplKEZv
bnREZXNjcmlwdGlvbiYsIGZsb2F0IHNpemUpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBmbG9h
dCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIFJlbmRlclN0eWxl
KiwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkda
b29tUnVsZXMpOwotCi1wdWJsaWM6Ci0gICAgYm9vbCB1c2VTVkdab29tUnVsZXMoKTsKLQotICAg
IHN0YXRpYyBib29sIGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQo
Q1NTUHJpbWl0aXZlVmFsdWUqKTsKLSAgICBDb2xvciBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShD
U1NQcmltaXRpdmVWYWx1ZSosIGJvb2wgZm9yVmlzaXRlZExpbmsgPSBmYWxzZSkgY29uc3Q7Ci0K
LSAgICBib29sIGhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7Ci0g
ICAgYm9vbCBoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0Owot
ICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nJikgY29u
c3Q7Ci0KLSAgICBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0IHsgcmV0dXJu
IG1fZm9udFNlbGVjdG9yLmdldCgpOyB9Ci0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElP
TikKLSAgICBWaWV3cG9ydFN0eWxlUmVzb2x2ZXIqIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpIHsg
cmV0dXJuIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyLmdldCgpOyB9Ci0jZW5kaWYKLQotICAgIHZv
aWQgYWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlF
eHAqLCBib29sIHJlc3VsdCk7Ci0gICAgYm9vbCBoYXNWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cmllcygpIGNvbnN0IHsgcmV0dXJuICFtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3Vs
dHMuaXNFbXB0eSgpOyB9Ci0gICAgYm9vbCBhZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25z
dDsKLQotICAgIHZvaWQgYWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZy
YW1lcz4pOwotCi0gICAgYm9vbCBjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1l
bnQpOwotCi0gICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fcnVs
ZVNldHMuZmVhdHVyZXMoKS5zaWJsaW5nUnVsZXMuaXNFbXB0eSgpOyB9Ci0gICAgYm9vbCB1c2Vz
Rmlyc3RMaW5lUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNl
c0ZpcnN0TGluZVJ1bGVzOyB9Ci0gICAgYm9vbCB1c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0
IHsgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS51c2VzQmVmb3JlQWZ0ZXJSdWxlczsgfQot
Ci0gICAgc3RhdGljIGJvb2wgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5W
YWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5z
Zm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwotICAgIAotICAgIHZvaWQgaW52YWxpZGF0
ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLSAg
ICBib29sIGNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0
eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBv
dXRPcGVyYXRpb25zKTsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgU3R5bGVTaGFkZXIq
IHN0eWxlU2hhZGVyKENTU1ZhbHVlKik7Ci0gICAgU3R5bGVTaGFkZXIqIGNhY2hlZE9yUGVuZGlu
Z1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKik7Ci0gICAgYm9vbCBw
YXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqLCBDdXN0b21GaWx0ZXJQYXJh
bWV0ZXJMaXN0Jik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNl
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqKTsKLSAg
ICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJBcnJh
eVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOwotICAgIFBhc3NS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOwotICAgIFBhc3NSZWZQdHI8
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRl
cihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCopOwotICAgIFBhc3NSZWZQdHI8Q3Vz
dG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxl
UmVmZXJlbmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxD
dXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxp
bmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZp
bHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRl
clZhbHVlKik7Ci0gICAgdm9pZCBsb2FkUGVuZGluZ1NoYWRlcnMoKTsKLSNlbmRpZgotI2lmIEVO
QUJMRShTVkcpCi0gICAgdm9pZCBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOwotI2VuZGlmCi0j
ZW5kaWYgLy8gRU5BQkxFKENTU19GSUxURVJTKQotCi0gICAgdm9pZCBsb2FkUGVuZGluZ1Jlc291
cmNlcygpOwotCi1wcml2YXRlOgotICAgIC8vIFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRl
ZmF1bHQgZm9udCBzaXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZv
bnQgZmFtaWx5IGhhcyBjaGFuZ2VkLiAtZHdoCi0gICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1p
bHlDaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotICAgIHZv
aWQgY2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlKTsKLQotICAgIHZvaWQgYWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9B
ZGp1c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCopOwotCi0gICAgc3RydWN0
IFJ1bGVSYW5nZSB7Ci0gICAgICAgIFJ1bGVSYW5nZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQm
IGxhc3RSdWxlSW5kZXgpOiBmaXJzdFJ1bGVJbmRleChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxl
SW5kZXgobGFzdFJ1bGVJbmRleCkgeyB9Ci0gICAgICAgIGludCYgZmlyc3RSdWxlSW5kZXg7Ci0g
ICAgICAgIGludCYgbGFzdFJ1bGVJbmRleDsKLSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoUmFu
Z2VzIHsKLSAgICAgICAgTWF0Y2hSYW5nZXMoKSA6IGZpcnN0VUFSdWxlKC0xKSwgbGFzdFVBUnVs
ZSgtMSksIGZpcnN0QXV0aG9yUnVsZSgtMSksIGxhc3RBdXRob3JSdWxlKC0xKSwgZmlyc3RVc2Vy
UnVsZSgtMSksIGxhc3RVc2VyUnVsZSgtMSkgeyB9Ci0gICAgICAgIGludCBmaXJzdFVBUnVsZTsK
LSAgICAgICAgaW50IGxhc3RVQVJ1bGU7Ci0gICAgICAgIGludCBmaXJzdEF1dGhvclJ1bGU7Ci0g
ICAgICAgIGludCBsYXN0QXV0aG9yUnVsZTsKLSAgICAgICAgaW50IGZpcnN0VXNlclJ1bGU7Ci0g
ICAgICAgIGludCBsYXN0VXNlclJ1bGU7Ci0gICAgICAgIFJ1bGVSYW5nZSBVQVJ1bGVSYW5nZSgp
IHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVBUnVsZSwgbGFzdFVBUnVsZSk7IH0KLSAgICAgICAg
UnVsZVJhbmdlIGF1dGhvclJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdEF1dGhv
clJ1bGUsIGxhc3RBdXRob3JSdWxlKTsgfQotICAgICAgICBSdWxlUmFuZ2UgdXNlclJ1bGVSYW5n
ZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVzZXJSdWxlLCBsYXN0VXNlclJ1bGUpOyB9Ci0g
ICAgfTsKLQotICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGllcyB7Ci0gICAgICAgIE1hdGNoZWRQ
cm9wZXJ0aWVzKCk7Ci0gICAgICAgIH5NYXRjaGVkUHJvcGVydGllcygpOwotICAgICAgICB2b2lk
IHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKLSAgICAgICAgCi0g
ICAgICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiBwcm9wZXJ0aWVzOwotICAgICAgICB1bmlv
biB7Ci0gICAgICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtN
YXRjaFR5cGUgOiAyOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHdoaXRlbGlzdFR5cGUgOiAy
OwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIC8vIFVzZWQgdG8gbWFrZSBzdXJlIGFsbCBt
ZW1vcnkgaXMgemVyby1pbml0aWFsaXplZCBzaW5jZSB3ZSBjb21wdXRlIHRoZSBoYXNoIG92ZXIg
dGhlIGJ5dGVzIG9mIHRoaXMgb2JqZWN0LgotICAgICAgICAgICAgdm9pZCogcG9zc2libHlQYWRk
ZWRNZW1iZXI7Ci0gICAgICAgIH07Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNYXRjaFJlc3VsdCB7
Ci0gICAgICAgIE1hdGNoUmVzdWx0KCkgOiBpc0NhY2hlYWJsZSh0cnVlKSB7IH0KLSAgICAgICAg
VmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzLCA2ND4gbWF0Y2hlZFByb3BlcnRpZXM7Ci0gICAgICAg
IFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0Y2hlZFJ1bGVzOwotICAgICAgICBNYXRjaFJhbmdl
cyByYW5nZXM7Ci0gICAgICAgIGJvb2wgaXNDYWNoZWFibGU7Ci0gICAgfTsKLQotICAgIHN0YXRp
YyB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9w
ZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiA9IDAsIHVuc2lnbmVkIGxpbmtNYXRjaFR5
cGUgPSBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoQWxsLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQ
cm9wZXJ0eVdoaXRlbGlzdE5vbmUpOwotICAgIHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGll
cyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxl
ID0gdHJ1ZSk7Ci0KLSAgICB2b2lkIG1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGlu
Y2x1ZGVTTUlMUHJvcGVydGllcyk7Ci0gICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQm
KTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqKTsKLSAgICB2
b2lkIG1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVz
KTsKLSAgICB2b2lkIG1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0Jiwg
Ym9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaEhvc3RSdWxlcyhNYXRjaFJl
c3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotCi0gICAgdm9pZCBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYp
OwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxl
RGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKLQotICAgIGJvb2wgZmFz
dFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVEYXRhJikgY29uc3Q7Ci0gICAgdm9pZCBzb3J0TWF0
Y2hlZFJ1bGVzKCk7Ci0gICAgdm9pZCBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hS
ZXN1bHQmKTsKLQotICAgIGJvb2wgcnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBD
b250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9y
QXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpOwotICAg
IGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0
b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwotICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVy
dGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGNvbnN0IEVsZW1lbnQqKTsKLSAgICBlbnVtIFN0eWxl
QXBwbGljYXRpb25QYXNzIHsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAgICAgVmFy
aWFibGVEZWZpbml0aW9ucywKLSNlbmRpZgotICAgICAgICBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVz
LAotICAgICAgICBMb3dQcmlvcml0eVByb3BlcnRpZXMKLSAgICB9OwotICAgIHRlbXBsYXRlIDxT
dHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGll
cyhjb25zdCBNYXRjaFJlc3VsdCYsIGJvb2wgaW1wb3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50
IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9ubHkpOwotICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxp
Y2F0aW9uUGFzcyBwYXNzPgotICAgIHZvaWQgYXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJv
cGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSosIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wg
aW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3RO
b25lKTsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICB2b2lkIHJlc29sdmVWYXJpYWJs
ZXMoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5
SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNzaW9ucyk7Ci0jZW5kaWYKLSAgICBzdGF0aWMgYm9v
bCBpc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEKTsKLSNpZiBFTkFCTEUo
VklERU9fVFJBQ0spCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NT
UHJvcGVydHlJRCk7Ci0jZW5kaWYKLSAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0
JiwgUnVsZVNldCosIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3Ry
aW5nJiBwYWdlTmFtZSk7Ci0gICAgdm9pZCBtYXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0
eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+
JiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VO
YW1lKTsKLSAgICBTZXR0aW5ncyogZG9jdW1lbnRTZXR0aW5ncygpIHsgcmV0dXJuIG1fZG9jdW1l
bnQtPnNldHRpbmdzKCk7IH0KLQotICAgIGJvb2wgaXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBj
b25zdDsKLSAgICBib29sIGlzUmlnaHRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0IHsgcmV0dXJu
ICFpc0xlZnRQYWdlKHBhZ2VJbmRleCk7IH0KLSAgICBib29sIGlzRmlyc3RQYWdlKGludCBwYWdl
SW5kZXgpIGNvbnN0OwotICAgIFN0cmluZyBwYWdlTmFtZShpbnQgcGFnZUluZGV4KSBjb25zdDsK
LQotICAgIERvY3VtZW50UnVsZVNldHMgbV9ydWxlU2V0czsKLQotICAgIHR5cGVkZWYgSGFzaE1h
cDxBdG9taWNTdHJpbmdJbXBsKiwgUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4gPiBLZXlmcmFt
ZXNSdWxlTWFwOwotICAgIEtleWZyYW1lc1J1bGVNYXAgbV9rZXlmcmFtZXNSdWxlTWFwOworY2xh
c3MgU3RhdGljQ1NTUnVsZUxpc3Q7CiAKK2NsYXNzIEVsZW1lbnRSdWxlQ29sbGVjdG9yIHsKIHB1
YmxpYzoKLSAgICB0eXBlZGVmIEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwgUmVmUHRyPENTU1ZhbHVl
PiA+IFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOwotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYg
RU5BQkxFKFNWRykKLSAgICB0eXBlZGVmIEhhc2hNYXA8RmlsdGVyT3BlcmF0aW9uKiwgUmVmUHRy
PFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU+ID4gUGVuZGluZ1NWR0RvY3VtZW50TWFwOwotI2Vu
ZGlmCi0KLSAgICBjbGFzcyBTdGF0ZSB7Ci0gICAgICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0
YXRlKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFN0YXRlKCkKLSAgICAgICAgOiBtX2VsZW1lbnQo
MCkKLSAgICAgICAgLCBtX3N0eWxlZEVsZW1lbnQoMCkKLSAgICAgICAgLCBtX3BhcmVudE5vZGUo
MCkKLSAgICAgICAgLCBtX3BhcmVudFN0eWxlKDApCi0gICAgICAgICwgbV9yb290RWxlbWVudFN0
eWxlKDApCisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IoU3R5bGVSZXNvbHZlciogc3R5bGVSZXNv
bHZlciwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQorICAgICAgICA6IG1fc3Rh
dGUoc3RhdGUpCisgICAgICAgICwgbV9ydWxlU2V0cyhzdHlsZVJlc29sdmVyLT5ydWxlU2V0cygp
KQorICAgICAgICAsIG1fc2VsZWN0b3JGaWx0ZXIoc3R5bGVSZXNvbHZlci0+c2VsZWN0b3JGaWx0
ZXIoKSkKKyAgICAgICAgLCBtX2luc3BlY3RvckNTU09NV3JhcHBlcnMoc3R5bGVSZXNvbHZlci0+
aW5zcGVjdG9yQ1NTT01XcmFwcGVycygpKQorICAgICAgICAsIG1fc2NvcGVSZXNvbHZlcihzdHls
ZVJlc29sdmVyLT5zY29wZVJlc29sdmVyKCkpCisgICAgICAgICwgbV9pc1ByaW50U3R5bGUoZmFs
c2UpCiAgICAgICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCi0gICAgICAgICwgbV9zYW1lT3Jp
Z2luT25seShmYWxzZSkKICAgICAgICAgLCBtX3BzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETykK
LSAgICAgICAgLCBtX2VsZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRlTGluaykKLSAgICAgICAgLCBt
X2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludChmYWxzZSkKLSAgICAgICAgLCBtX2VsZW1lbnRB
ZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxzZSkKKyAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZh
bHNlKQogICAgICAgICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQot
ICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCi0gICAgICAgICwg
bV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQotI2lmIEVOQUJMRShDU1Nf
U0hBREVSUykKLSAgICAgICAgLCBtX2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQotI2VuZGlmCi0g
ICAgICAgICwgbV9saW5lSGVpZ2h0VmFsdWUoMCkKLSAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxz
ZSkKLSAgICAgICAgLCBtX2hhc1VBQXBwZWFyYW5jZShmYWxzZSkKLSAgICAgICAgLCBtX2JhY2tn
cm91bmREYXRhKEJhY2tncm91bmRGaWxsTGF5ZXIpIHsgfQotCi0gICAgcHVibGljOgotICAgICAg
ICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVS
ZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAs
IGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8p
LCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKLSAgICAgICAgdm9pZCBjbGVh
cigpOwotCi0gICAgICAgIERvY3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxl
bWVudC0+ZG9jdW1lbnQoKTsgfQotICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9lbGVtZW50OyB9Ci0gICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQo
KSBjb25zdCB7IHJldHVybiBtX3N0eWxlZEVsZW1lbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRTdHls
ZShQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KLSAg
ICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsg
fQotICAgICAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBt
X3N0eWxlLnJlbGVhc2UoKTsgfQotCi0gICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVS
dWxlTGlzdCgpOwotICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3Qo
KSB7IHJldHVybiBtX3J1bGVMaXN0LnJlbGVhc2UoKTsgfQotCi0gICAgICAgIGNvbnN0IENvbnRh
aW5lck5vZGUqIHBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KLSAg
ICAgICAgdm9pZCBzZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9w
YXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KLSAgICAgICAgUmVuZGVyU3R5
bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7
IH0KLQotICAgICAgICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25z
dCB7IHJldHVybiBtX3JlZ2lvbkZvclN0eWxpbmc7IH0KLSAgICAgICAgdm9pZCBzZXRTYW1lT3Jp
Z2luT25seShib29sIGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2Ft
ZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyBy
ZXR1cm4gbV9zYW1lT3JpZ2luT25seTsgfQotICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVl
c3QmIHBzZXVkb1N0eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1
ZXN0OyB9Ci0gICAgICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJl
dHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KLSAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2lu
dDsgfQotICAgICAgICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlz
QWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9
Ci0gICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1
cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KLSAgICAgICAgdm9pZCBzZXRNb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAgICAg
U2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAg
ICAgICAgCi0gICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wg
aXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KLSAg
ICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBs
eSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAg
ICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9h
cHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0KLSAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5
VG9WaXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNp
dGVkTGlua1N0eWxlOyB9Ci0gICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5n
SW1hZ2VQcm9wZXJ0aWVzKCkgeyByZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9Ci0j
aWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgICAgICBQZW5kaW5nU1ZH
RG9jdW1lbnRNYXAmIHBlbmRpbmdTVkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdE
b2N1bWVudHM7IH0KLSNlbmRpZgotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgdm9p
ZCBzZXRIYXNQZW5kaW5nU2hhZGVycyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVu
ZGluZ1NoYWRlcnMgPSBoYXNQZW5kaW5nU2hhZGVyczsgfQotICAgICAgICBib29sIGhhc1BlbmRp
bmdTaGFkZXJzKCkgY29uc3QgeyByZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQotI2VuZGlm
Ci0KLSAgICAgICAgdm9pZCBzZXRMaW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1f
bGluZUhlaWdodFZhbHVlID0gdmFsdWU7IH0KLSAgICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRW
YWx1ZSgpIHsgcmV0dXJuIG1fbGluZUhlaWdodFZhbHVlOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9u
dERpcnR5KGJvb2wgaXNEaXJ0eSkgeyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KLSAgICAgICAg
Ym9vbCBmb250RGlydHkoKSBjb25zdCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQotCi0gICAgICAg
IHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIGJvb2wgaGFzVUFBcHBl
YXJhbmNlKCkgY29uc3QgeyByZXR1cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KLSAgICAgICAgQm9y
ZGVyRGF0YSBib3JkZXJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9Ci0gICAg
ICAgIEZpbGxMYXllciBiYWNrZ3JvdW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3Vu
ZERhdGE7IH0KLSAgICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4g
bV9iYWNrZ3JvdW5kQ29sb3I7IH0KLQotICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZv
bnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9Ci0g
ICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyBy
ZXR1cm4gbV9wYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KLSAgICAgICAgdm9pZCBz
ZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24p
IHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7IH0KLSAgICAgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0Wm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxv
YXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYpOyB9Ci0g
ICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9m
b250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAg
ICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRp
b24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmll
bnRhdGlvbik7IH0KLQotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNo
ZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9Ci0gICAgICAgIHZvaWQgYWRkTWF0
Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1
bGUpOyB9Ci0gICAgICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1
NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgotICAgICAgICAv
LyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8g
YWNjZXNzCi0gICAgICAgIC8vIHRoZXNlIHZhcmlhYmxlcy4KLSAgICAgICAgRWxlbWVudCogbV9l
bGVtZW50OwotICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fc3R5bGU7Ci0gICAgICAgIFN0
eWxlZEVsZW1lbnQqIG1fc3R5bGVkRWxlbWVudDsKLSAgICAgICAgQ29udGFpbmVyTm9kZSogbV9w
YXJlbnROb2RlOwotICAgICAgICBSZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsKLSAgICAgICAg
UmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHlsZTsKLSAgICAgICAgCi0gICAgICAgIFJlbmRl
clJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOwotICAgICAgICBib29sIG1fc2FtZU9yaWdpbk9u
bHk7Ci0gICAgICAgIFBzZXVkb1N0eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKLQot
ICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3RhdGU7Ci0KLSAgICAgICAgYm9vbCBt
X2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKLQotICAgICAgICBib29sIG1fZWxlbWVudEFm
ZmVjdGVkQnlDbGFzc1J1bGVzOworICAgICAgICAsIG1fY2FuVXNlRmFzdFJlamVjdChtX3NlbGVj
dG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkpCisg
ICAgICAgICwgbV9iZWhhdmlvckF0Qm91bmRhcnkoU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jv
c3NCb3VuZGFyeSkgeyB9CiAKLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsK
KyAgICB2b2lkIG1hdGNoQWxsUnVsZXMoYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIGJv
b2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKKyAgICB2b2lkIG1hdGNoVUFSdWxlcygpOworICAg
IHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lk
IG1hdGNoVXNlclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworCisgICAgdm9pZCBzZXRN
b2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICB2
b2lkIHNldFBzZXVkb1N0eWxlUmVxdWVzdChjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHJlcXVl
c3QpIHsgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSByZXF1ZXN0OyB9CisgICAgdm9pZCBzZXRTYW1l
T3JpZ2luT25seShib29sIGYpIHsgbV9zYW1lT3JpZ2luT25seSA9IGY7IH0gCisgICAgdm9pZCBz
ZXRSZWdpb25Gb3JTdHlsaW5nKFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykgeyBtX3Jl
Z2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOyB9CisgICAgdm9pZCBzZXRNZWRpdW0o
Y29uc3QgTWVkaWFRdWVyeUV2YWx1YXRvciogbWVkaXVtKSB7IG1faXNQcmludFN0eWxlID0gbWVk
aXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpOyB9CiAKLSAgICAgICAgLy8gQSBi
dWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVu
dCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0
aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7
Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKyAgICBib29s
IGhhc0FueU1hdGNoaW5nUnVsZXMoUnVsZVNldCopOwogCi0gICAgICAgIGJvb2wgbV9hcHBseVBy
b3BlcnR5VG9SZWd1bGFyU3R5bGU7Ci0gICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9WaXNp
dGVkTGlua1N0eWxlOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVz
dWx0KCk7CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gbWF0Y2hlZFJ1bGVMaXN0KCk7CiAK
LSAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVz
OwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFk
ZXJzOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAg
ICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlm
Ci0gICAgICAgIENTU1ZhbHVlKiBtX2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2Zv
bnREaXJ0eTsKLQotICAgICAgICBib29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAgICAgICBCb3Jk
ZXJEYXRhIG1fYm9yZGVyRGF0YTsKLSAgICAgICAgRmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7
Ci0gICAgICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMg
UmVuZGVyU3R5bGUqIHN0eWxlTm90WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFll
dEF2YWlsYWJsZTsgfQotCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENT
U1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNo
ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAg
IFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1By
b3BlcnR5SUQsIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdF
X1NFVCkKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShD
U1NQcm9wZXJ0eUlELCBDU1NJbWFnZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1ND
dXJzb3JJbWFnZVZhbHVlKik7Ci0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7
IH0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX3N0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAg
c3RhdGljIExlbmd0aCBjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5k
ZXJTdHlsZSosIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7
Ci0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1
ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxp
ZXIgPSAxKTsKLQotICAgIENTU1RvU3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5
bGVNYXA7IH0KLSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBw
ZXJzKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNj
cmlwdGlvbigpOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3Jp
cHRpb24oKSB7IHJldHVybiBtX3N0YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAg
dm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3Jp
cHRpb24pIHsgbV9zdGF0ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQot
ICAgIHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZv
aWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShm
KTsgfQotICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsg
bV9zdGF0ZS5zZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KLSAgICB2b2lkIHNldFRleHRP
cmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4dE9yaWVudGF0aW9uKSB7IG1fc3RhdGUuc2V0
VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KLSAgICAKLSAgICB2b2lkIHJlcG9y
dE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKLSAgICAKIHByaXZhdGU6Ci0g
ICAgc3RhdGljIFJlbmRlclN0eWxlKiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOworICAgIERvY3Vt
ZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fc3RhdGUuZG9jdW1lbnQoKTsgfQorICAgIHZvaWQg
YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiwgYm9vbCBp
c0NhY2hlYWJsZSA9IHRydWUpOwogCi0gICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQo
KTsKLQotcHJpdmF0ZToKLSAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRF
bGVtZW50KikgY29uc3Q7Ci0KLSAgICB2b2lkIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCwg
Q1NTVmFsdWUqKTsKLQotI2lmIEVOQUJMRShTVkcpCi0gICAgdm9pZCBhcHBseVNWR1Byb3BlcnR5
KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoUnVsZVNl
dCopOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIHZvaWQgbWF0Y2hTaGFkb3dEaXN0cmli
dXRlZFJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5n
ZSYpOwogI2VuZGlmCisgICAgdm9pZCBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlS
dWxlcyk7CiAKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRQZW5kaW5nSW1hZ2UoU3R5
bGVQZW5kaW5nSW1hZ2UqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5nSW1hZ2VzKCk7Ci0KLSAgICBz
dGF0aWMgdW5zaWduZWQgY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVk
UHJvcGVydGllcyosIHVuc2lnbmVkIHNpemUpOwotICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGll
c0NhY2hlSXRlbSB7Ci0gICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0
SW5mbyopIGNvbnN0OwotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+IG1hdGNoZWRQ
cm9wZXJ0aWVzOwotICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7Ci0gICAgICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gcmVuZGVyU3R5bGU7Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcGFy
ZW50UmVuZGVyU3R5bGU7Ci0gICAgfTsKLSAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hl
SXRlbSogZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0
IE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29u
c3QgUmVuZGVyU3R5bGUqLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVk
IGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7Ci0KLSAgICAvLyBFdmVyeSBOIGFkZGl0aW9ucyB0
byB0aGUgbWF0Y2hlZCBkZWNsYXJhdGlvbiBjYWNoZSB0cmlnZ2VyIGEgc3dlZXAgd2hlcmUgZW50
cmllcyBob2xkaW5nCi0gICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGEgc3R5bGUgZGVjbGFy
YXRpb24gYXJlIGdhcmJhZ2UgY29sbGVjdGVkLgotICAgIHZvaWQgc3dlZXBNYXRjaGVkUHJvcGVy
dGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+Kik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hp
bmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsK
KyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYpOworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3Qm
LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsKKyAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0
IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJik7CiAKLSAg
ICBib29sIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYp
IGNvbnN0OwotICAgIGJvb2wgc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0
aW5nQXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB1bnNpZ25lZCBtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcDsKLQotICAgIHR5cGVk
ZWYgSGFzaE1hcDx1bnNpZ25lZCwgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0+IE1hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGU7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSBtX21hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGU7Ci0KLSAgICBUaW1lcjxTdHlsZVJlc29sdmVyPiBtX21hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGVTd2VlcFRpbWVyOwotCi0gICAgT3duUHRyPE1lZGlhUXVlcnlFdmFsdWF0b3I+IG1f
bWVkaXVtOwotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbV9yb290RGVmYXVsdFN0eWxlOwotCi0g
ICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7Ci0gICAgU2VsZWN0b3JGaWx0ZXIgbV9zZWxlY3RvckZp
bHRlcjsKLQotICAgIGJvb2wgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXM7Ci0KLSAgICBSZWZQ
dHI8Q1NTRm9udFNlbGVjdG9yPiBtX2ZvbnRTZWxlY3RvcjsKLSAgICBWZWN0b3I8T3duUHRyPE1l
ZGlhUXVlcnlSZXN1bHQ+ID4gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzOwot
Ci0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBSZWZQdHI8Vmlld3BvcnRT
dHlsZVJlc29sdmVyPiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKLSNlbmRpZgorICAgIHZvaWQg
c29ydE1hdGNoZWRSdWxlcygpOworICAgIHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVz
KCk7CiAKLSAgICBjb25zdCBTdHlsZUJ1aWxkZXImIG1fc3R5bGVCdWlsZGVyOworICAgIHZvaWQg
YWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqKTsKKyAgICB2b2lkIGNsZWFyTWF0Y2hlZFJ1
bGVzKCk7CiAKLSAgICBPd25QdHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7
Ci0gICAgQ1NTVG9TdHlsZU1hcCBtX3N0eWxlTWFwOwotICAgIEluc3BlY3RvckNTU09NV3JhcHBl
cnMgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwotCi0gICAgU3RhdGUgbV9zdGF0ZTsKLQotICAg
IGZyaWVuZCBjbGFzcyBTdHlsZUJ1aWxkZXI7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7Ci0gICAg
ZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1h
dGNoZWRQcm9wZXJ0aWVzJik7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRj
aFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3Ih
PShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7CisgICAgU3RhdGljQ1NT
UnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0KCk7CisgICAgICAgIAorcHJpdmF0ZToKKyAgICBjb25z
dCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgbV9zdGF0ZTsKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBt
X3J1bGVTZXRzOworICAgIFNlbGVjdG9yRmlsdGVyJiBtX3NlbGVjdG9yRmlsdGVyOworICAgIElu
c3BlY3RvckNTU09NV3JhcHBlcnMmIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKKyAgICBTdHls
ZVNjb3BlUmVzb2x2ZXIqIG1fc2NvcGVSZXNvbHZlcjsKKworICAgIGJvb2wgbV9pc1ByaW50U3R5
bGU7CisgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7CisgICAgUHNldWRvU3R5
bGVSZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0OworICAgIGJvb2wgbV9zYW1lT3JpZ2luT25s
eTsKKyAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbV9tb2RlOworICAgIGJvb2wgbV9jYW5Vc2VG
YXN0UmVqZWN0OworICAgIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IG1fYmVo
YXZpb3JBdEJvdW5kYXJ5OworCisgICAgT3duUHRyPFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMy
PiA+IG1fbWF0Y2hlZFJ1bGVzOworCisgICAgLy8gT3V0cHV0LgorICAgIFJlZlB0cjxTdGF0aWND
U1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKyAgICBTdHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBt
X3Jlc3VsdDsKIH07CiAKLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9y
QXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyAmYXR0cmlidXRlTmFtZSkgY29uc3QKLXsKLSAg
ICBBU1NFUlQoIWF0dHJpYnV0ZU5hbWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0
cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxlcy5jb250YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7
Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29u
c3QgQXRvbWljU3RyaW5nJiBjbGFzc1ZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVCghY2xhc3NW
YWx1ZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nl
c0luUnVsZXMuY29udGFpbnMoY2xhc3NWYWx1ZS5pbXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBT
dHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1
ZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWlkVmFsdWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4g
bV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkp
OwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZiAvLyBTdHlsZVJlc29sdmVy
X2gKKyNlbmRpZiAvLyBFbGVtZW50UnVsZUNvbGxlY3Rvcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAJKHJldmlzaW9uIDE0NTE4MSkJKGZyb20gU291cmNl
L1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOjE0NTE4MSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MTg3
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcp
CisgKiAgICAgICAgICAgKEMpIDIwMDQtMjAwNSBBbGxhbiBTYW5kZmVsZCBKZW5zZW4gKGtkZUBj
YXJld29sZi5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgTmljaG9sYXMgU2hhbmtz
ICh3ZWJraXRAbmlja3NoYW5rcy5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIw
MDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFsZXhleSBQcm9za3VyeWFrb3Yg
PGFwQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRXJpYyBTZWlkZWwg
PGVyaWNAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2Jp
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20v
KQorICogQ29weXJpZ2h0IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAx
MS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3R5
bGVSZXNvbHZlci5oIgorCisjaW5jbHVkZSAiQXR0cmlidXRlLmgiCisjaW5jbHVkZSAiQ1NTQm9y
ZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJDU1NDYWxjdWxhdGlvblZhbHVlLmgiCisjaW5jbHVkZSAi
Q1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oIgorI2luY2x1ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5o
IgorI2luY2x1ZGUgIkNTU0ZvbnRGYWNlUnVsZS5oIgorI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rv
ci5oIgorI2luY2x1ZGUgIkNTU0xpbmVCb3hDb250YWluVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NQ
YWdlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1BhcnNlci5oIgorI2luY2x1ZGUgIkNTU1ByaW1pdGl2
ZVZhbHVlTWFwcGluZ3MuaCIKKyNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCisjaW5jbHVk
ZSAiQ1NTUmVmbGVjdFZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRl
ICJDU1NTZWxlY3Rvckxpc3QuaCIKKyNpbmNsdWRlICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNsdWRl
ICJDU1NTdXBwb3J0c1J1bGUuaCIKKyNpbmNsdWRlICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgi
CisjaW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisj
aW5jbHVkZSAiQ1NTVmFyaWFibGVWYWx1ZS5oIgorI2VuZGlmCisjaW5jbHVkZSAiQ2FjaGVkSW1h
Z2UuaCIKKyNpbmNsdWRlICJDYWxjdWxhdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ29udGVudERh
dGEuaCIKKyNpbmNsdWRlICJDb250ZXh0RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgi
CisjaW5jbHVkZSAiQ291bnRlckNvbnRlbnQuaCIKKyNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCisj
aW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbi5oIgorI2luY2x1ZGUgIkVsZW1l
bnRTaGFkb3cuaCIKKyNpbmNsdWRlICJGb250RmVhdHVyZVZhbHVlLmgiCisjaW5jbHVkZSAiRm9u
dFZhbHVlLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5o
IgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2lu
Y2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5o
IgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50Lmgi
CisjaW5jbHVkZSAiSFRNTFByb2dyZXNzRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxTdHlsZUVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5z
ZXJ0aW9uUG9pbnQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKKyNp
bmNsdWRlICJLZXlmcmFtZUxpc3QuaCIKKyNpbmNsdWRlICJMaW5rSGFzaC5oIgorI2luY2x1ZGUg
IkxvY2FsZVRvU2NyaXB0TWFwcGluZy5oIgorI2luY2x1ZGUgIk1hdGhNTE5hbWVzLmgiCisjaW5j
bHVkZSAiTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJNYXRyaXhUcmFu
c2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJNZWRpYUxpc3QuaCIKKyNpbmNsdWRlICJNZWRp
YVF1ZXJ5RXZhbHVhdG9yLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCisjaW5jbHVk
ZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
UGFpci5oIgorI2luY2x1ZGUgIlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5j
bHVkZSAiUXVvdGVzRGF0YS5oIgorI2luY2x1ZGUgIlJlY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJS
ZWdpb24uaCIKKyNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXIuaCIKKyNpbmNsdWRlICJSZW5kZXJT
Y3JvbGxiYXJUaGVtZS5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlQ29uc3RhbnRzLmgiCisjaW5j
bHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAi
Um90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1
ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9ucy5oIgorI2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVu
dC5oIgorI2luY2x1ZGUgIlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiU2Vj
dXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgorI2lu
Y2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU2hhZG93RGF0YS5oIgorI2luY2x1ZGUgIlNo
YWRvd1Jvb3QuaCIKKyNpbmNsdWRlICJTaGFkb3dWYWx1ZS5oIgorI2luY2x1ZGUgIlNpYmxpbmdU
cmF2ZXJzYWxTdHJhdGVnaWVzLmgiCisjaW5jbHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5o
IgorI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5oIgorI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2Uu
aCIKKyNpbmNsdWRlICJTdHlsZUdlbmVyYXRlZEltYWdlLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5k
aW5nSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZVByb3BlcnR5U2V0LmgiCisjaW5jbHVkZSAiU3R5
bGVQcm9wZXJ0eVNob3J0aGFuZC5oIgorI2luY2x1ZGUgIlN0eWxlUnVsZS5oIgorI2luY2x1ZGUg
IlN0eWxlUnVsZUltcG9ydC5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2lu
Y2x1ZGUgIlN0eWxlU2hlZXRMaXN0LmgiCisjaW5jbHVkZSAiVGV4dC5oIgorI2luY2x1ZGUgIlRy
YW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0
aW9uLmgiCisjaW5jbHVkZSAiVXNlckFnZW50U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJWaWV3
cG9ydFN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCisjaW5j
bHVkZSAiV2ViQ29yZU1lbW9yeUluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENT
U0tleWZyYW1lUnVsZS5oIgorI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIKKyNp
bmNsdWRlICJXZWJLaXRDU1NSZWdpb25SdWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWUuaCIKKyNpbmNsdWRlICJXZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKKyNpbmNsdWRl
ICJYTUxOYW1lcy5oIgorI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFw
Lmg+CisjaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KKyNpbmNs
dWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uVmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL1N0
ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lmIEVOQUJMRShDU1Nf
RklMVEVSUykKKyNpbmNsdWRlICJGaWx0ZXJPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJXZWJLaXRD
U1NGaWx0ZXJWYWx1ZS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQp
CisjaW5jbHVkZSAiRGFzaGJvYXJkUmVnaW9uLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcp
CisjaW5jbHVkZSAiQ2FjaGVkU1ZHRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJDYWNoZWRTVkdEb2N1
bWVudFJlZmVyZW5jZS5oIgorI2luY2x1ZGUgIlNWR0RvY3VtZW50LmgiCisjaW5jbHVkZSAiU1ZH
RWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR05hbWVzLmgiCisjaW5jbHVkZSAiU1ZHVVJJUmVmZXJl
bmNlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgorI2VuZGlmCisK
KyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisjaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJh
bWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJDb25zdGFudHMuaCIKKyNpbmNsdWRlICJD
dXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVy
YXRpb24uaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJD
dXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJTdHlsZUNhY2hlZFNo
YWRlci5oIgorI2luY2x1ZGUgIlN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgorI2luY2x1ZGUg
IlN0eWxlUGVuZGluZ1NoYWRlci5oIgorI2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCisjaW5jbHVk
ZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZS5oIgorI2luY2x1ZGUgIldlYktpdENTU1NoYWRl
clZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorI2luY2x1ZGUg
IkNTU0ltYWdlU2V0VmFsdWUuaCIKKyNpbmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCisj
ZW5kaWYKKworI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyNpbmNsdWRlICJXZWJWVFRFbGVtZW50
LmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdURiB7CisK
K3RlbXBsYXRlPD4gc3RydWN0IFNlcXVlbmNlTWVtb3J5SW5zdHJ1bWVudGF0aW9uVHJhaXRzPGNv
bnN0IFdlYkNvcmU6OlJ1bGVEYXRhKj4geworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJPiBzdGF0
aWMgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShJLCBJLCBNZW1vcnlDbGFzc0luZm8mKSB7IH0KK307
CisKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVz
OworCisjZGVmaW5lIEhBTkRMRV9JTkhFUklUKHByb3AsIFByb3ApIFwKK2lmIChpc0luaGVyaXQp
IHsgXAorICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0IyNQcm9wKG1fc3RhdGUucGFyZW50U3R5bGUo
KS0+cHJvcCgpKTsgXAorICAgIHJldHVybjsgXAorfQorCisjZGVmaW5lIEhBTkRMRV9JTkhFUklU
X0FORF9JTklUSUFMKHByb3AsIFByb3ApIFwKK0hBTkRMRV9JTkhFUklUKHByb3AsIFByb3ApIFwK
K2lmIChpc0luaXRpYWwpIHsgXAorICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0IyNQcm9wKFJlbmRl
clN0eWxlOjppbml0aWFsIyNQcm9wKCkpOyBcCisgICAgcmV0dXJuOyBcCit9CisKK1JlbmRlclN0
eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0eWxlTm90WWV0QXZhaWxhYmxlOworCitzdGF0aWMgU3R5
bGVQcm9wZXJ0eVNldCogbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpCit7CisgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIGxlZnRUb1JpZ2h0RGVjbCwgKFN0
eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7CisgICAgaWYgKGxlZnRUb1JpZ2h0RGVjbC0+aXNF
bXB0eSgpKQorICAgICAgICBsZWZ0VG9SaWdodERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5
RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7CisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0RGVjbC5nZXQo
KTsKK30KKworc3RhdGljIFN0eWxlUHJvcGVydHlTZXQqIHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24o
KQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCBy
aWdodFRvTGVmdERlY2wsIChTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKSkpOworICAgIGlmIChy
aWdodFRvTGVmdERlY2wtPmlzRW1wdHkoKSkKKyAgICAgICAgcmlnaHRUb0xlZnREZWNsLT5zZXRQ
cm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwgQ1NTVmFsdWVSdGwpOworICAgIHJldHVybiBy
aWdodFRvTGVmdERlY2wuZ2V0KCk7Cit9CisKKworaW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBT
dHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVsZUxpc3QoKQoreworICAgIGlmICghbV9ydWxl
TGlzdCkKKyAgICAgICAgbV9ydWxlTGlzdCA9IFN0YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsK
KyAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsKK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNv
bHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpCit7CisgICAgbV9oYXNVQUFw
cGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJhbmNlKCk7CisgICAgaWYgKG1faGFzVUFBcHBl
YXJhbmNlKSB7CisgICAgICAgIG1fYm9yZGVyRGF0YSA9IG1fc3R5bGUtPmJvcmRlcigpOworICAg
ICAgICBtX2JhY2tncm91bmREYXRhID0gKm1fc3R5bGUtPmJhY2tncm91bmRMYXllcnMoKTsKKyAg
ICAgICAgbV9iYWNrZ3JvdW5kQ29sb3IgPSBtX3N0eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKKyAg
ICB9Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpjbGVhcigpCit7Cisg
ICAgbV9lbGVtZW50ID0gMDsKKyAgICBtX3N0eWxlZEVsZW1lbnQgPSAwOworICAgIG1fcGFyZW50
U3R5bGUgPSAwOworICAgIG1fcGFyZW50Tm9kZSA9IDA7CisgICAgbV9yZWdpb25Gb3JTdHlsaW5n
ID0gMDsKKyAgICBtX3J1bGVMaXN0ID0gMDsKKyAgICBtX21hdGNoZWRSdWxlcy5jbGVhcigpOwor
ICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOworI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKKyAgICBtX2hhc1BlbmRpbmdTaGFkZXJzID0gZmFsc2U7CisjZW5kaWYKKyNpZiBFTkFC
TEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRz
LmNsZWFyKCk7CisjZW5kaWYKK30KKworU3R5bGVSZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1
bWVudCogZG9jdW1lbnQsIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgIDogbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAoMCkKKyAgICAsIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3
ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSkKKyAgICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCisg
ICAgLCBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyhtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMp
CisgICAgLCBtX2ZvbnRTZWxlY3RvcihDU1NGb250U2VsZWN0b3I6OmNyZWF0ZShkb2N1bWVudCkp
CisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICAsIG1fdmlld3BvcnRTdHls
ZVJlc29sdmVyKFZpZXdwb3J0U3R5bGVSZXNvbHZlcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNlbmRp
ZgorICAgICwgbV9zdHlsZUJ1aWxkZXIoU3R5bGVCdWlsZGVyOjpzaGFyZWRTdHlsZUJ1aWxkZXIo
KSkKKyAgICAsIG1fc3R5bGVNYXAodGhpcykKK3sKKyAgICBFbGVtZW50KiByb290ID0gZG9jdW1l
bnQtPmRvY3VtZW50RWxlbWVudCgpOworCisgICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjppbml0
RGVmYXVsdFN0eWxlKHJvb3QpOworCisgICAgLy8gY29uc3RydWN0IGRvY3VtZW50IHJvb3QgZWxl
bWVudCBkZWZhdWx0IHN0eWxlLiB0aGlzIGlzIG5lZWRlZAorICAgIC8vIHRvIGV2YWx1YXRlIG1l
ZGlhIHF1ZXJpZXMgdGhhdCBjb250YWluIHJlbGF0aXZlIGNvbnN0cmFpbnRzLCBsaWtlICJzY3Jl
ZW4gYW5kIChtYXgtd2lkdGg6IDEwZW0pIgorICAgIC8vIFRoaXMgaXMgaGVyZSBpbnN0ZWFkIG9m
IGNvbnN0cnVjdG9yLCBiZWNhdXNlIHdoZW4gY29uc3RydWN0b3IgaXMgcnVuLAorICAgIC8vIGRv
Y3VtZW50IGRvZXNuJ3QgaGF2ZSBkb2N1bWVudEVsZW1lbnQKKyAgICAvLyBOT1RFOiB0aGlzIGFz
c3VtZXMgdGhhdCBlbGVtZW50IHRoYXQgZ2V0cyBwYXNzZWQgdG8gc3R5bGVGb3JFbGVtZW50IC1j
YWxsCisgICAgLy8gaXMgYWx3YXlzIGZyb20gdGhlIGRvY3VtZW50IHRoYXQgb3ducyB0aGUgc3R5
bGUgc2VsZWN0b3IKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBkb2N1bWVudC0+dmlldygpOworICAg
IGlmICh2aWV3KQorICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZh
bHVhdG9yKHZpZXctPm1lZGlhVHlwZSgpKSk7CisgICAgZWxzZQorICAgICAgICBtX21lZGl1bSA9
IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKCJhbGwiKSk7CisKKyAgICBpZiAocm9v
dCkKKyAgICAgICAgbV9yb290RGVmYXVsdFN0eWxlID0gc3R5bGVGb3JFbGVtZW50KHJvb3QsIDAs
IERpc2FsbG93U3R5bGVTaGFyaW5nLCBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcyk7CisKKyAgICBp
ZiAobV9yb290RGVmYXVsdFN0eWxlICYmIHZpZXcpCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQ
dHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmlldy0+bWVkaWFUeXBlKCksIHZpZXctPmZyYW1l
KCksIG1fcm9vdERlZmF1bHRTdHlsZS5nZXQoKSkpOworCisgICAgbV9ydWxlU2V0cy5yZXNldEF1
dGhvclN0eWxlKCk7CisKKyAgICBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNo
ZWV0Q29sbGVjdGlvbiA9IGRvY3VtZW50LT5zdHlsZVNoZWV0Q29sbGVjdGlvbigpOworICAgIG1f
cnVsZVNldHMuaW5pdFVzZXJTdHlsZShzdHlsZVNoZWV0Q29sbGVjdGlvbiwgKm1fbWVkaXVtLCAq
dGhpcyk7CisKKyNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQorICAgIGlmIChkb2N1bWVudC0+c3ZnRXh0
ZW5zaW9ucygpKSB7CisgICAgICAgIGNvbnN0IEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj4m
IHN2Z0ZvbnRGYWNlRWxlbWVudHMgPSBkb2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpLT5zdmdGb250
RmFjZUVsZW1lbnRzKCk7CisgICAgICAgIEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IHN2Z0ZvbnRGYWNlRWxlbWVudHMuZW5kKCk7CisgICAgICAgIGZv
ciAoSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdmdG
b250RmFjZUVsZW1lbnRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgIGZv
bnRTZWxlY3RvcigpLT5hZGRGb250RmFjZVJ1bGUoKCppdCktPmZvbnRGYWNlUnVsZSgpKTsKKyAg
ICB9CisjZW5kaWYKKworICAgIGFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKDAsIHN0eWxlU2hlZXRD
b2xsZWN0aW9uLT5hY3RpdmVBdXRob3JTdHlsZVNoZWV0cygpKTsKK30KKwordm9pZCBTdHlsZVJl
c29sdmVyOjphcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3Qg
VmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+JiBzdHlsZVNoZWV0cykKK3sKKyAgICBtX3J1
bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKGZpcnN0TmV3LCBzdHlsZVNoZWV0cywgbV9t
ZWRpdW0uZ2V0KCksIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVycywgZG9jdW1lbnQoKS0+aXNWaWV3
U291cmNlKCksIHRoaXMpOworICAgIGlmIChkb2N1bWVudCgpLT5yZW5kZXJlcigpICYmIGRvY3Vt
ZW50KCktPnJlbmRlcmVyKCktPnN0eWxlKCkpCisgICAgICAgIGRvY3VtZW50KCktPnJlbmRlcmVy
KCktPnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKCkpOworCisjaWYgRU5BQkxF
KENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKS0+cmVz
b2x2ZSgpOworI2VuZGlmCit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudEVsZW1l
bnQoRWxlbWVudCogcGFyZW50KQoreworICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudHNQ
YXJlbnQgPSBwYXJlbnQtPnBhcmVudE9yU2hhZG93SG9zdEVsZW1lbnQoKTsKKworICAgIC8vIFdl
IGFyZSBub3QgYWx3YXlzIGludm9rZWQgY29uc2lzdGVudGx5LiBGb3IgZXhhbXBsZSwgc2NyaXB0
IGV4ZWN1dGlvbiBjYW4gY2F1c2UgdXMgdG8gZW50ZXIKKyAgICAvLyBzdHlsZSByZWNhbGMgaW4g
dGhlIG1pZGRsZSBvZiB0cmVlIGJ1aWxkaW5nLiBXZSBtYXkgYWxzbyBiZSBpbnZva2VkIGZyb20g
c29tZXdoZXJlIHdpdGhpbiB0aGUgdHJlZS4KKyAgICAvLyBSZXNldCB0aGUgc3RhY2sgaW4gdGhp
cyBjYXNlLCBvciBpZiB3ZSBzZWUgYSBuZXcgcm9vdCBlbGVtZW50LgorICAgIC8vIE90aGVyd2lz
ZSBqdXN0IHB1c2ggdGhlIG5ldyBwYXJlbnQuCisgICAgaWYgKCFwYXJlbnRzUGFyZW50IHx8IG1f
c2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0VtcHR5KCkpCisgICAgICAgIG1fc2VsZWN0b3JG
aWx0ZXIuc2V0dXBQYXJlbnRTdGFjayhwYXJlbnQpOworICAgIGVsc2UKKyAgICAgICAgbV9zZWxl
Y3RvckZpbHRlci5wdXNoUGFyZW50KHBhcmVudCk7CisKKyAgICAvLyBOb3RlOiBXZSBtdXN0bid0
IHNraXAgU2hhZG93Um9vdCBub2RlcyBmb3IgdGhlIHNjb3BlIHN0YWNrLgorICAgIGlmIChtX3Nj
b3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cHVzaChwYXJlbnQsIHBhcmVu
dC0+cGFyZW50T3JTaGFkb3dIb3N0Tm9kZSgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpw
b3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVudCkKK3sKKyAgICAvLyBOb3RlIHRoYXQgd2Ug
bWF5IGdldCBpbnZva2VkIGZvciBzb21lIHJhbmRvbSBlbGVtZW50cyBpbiBzb21lIHdhY2t5IGNh
c2VzIGR1cmluZyBzdHlsZSByZXNvbHZlLgorICAgIC8vIFBhdXNlIG1haW50YWluaW5nIHRoZSBz
dGFjayBpbiB0aGlzIGNhc2UuCisgICAgaWYgKG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJ
c0NvbnNpc3RlbnQocGFyZW50KSkKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5wb3BQYXJlbnQo
KTsKKyAgICBpZiAobV9zY29wZVJlc29sdmVyKQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnBv
cChwYXJlbnQpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRTaGFkb3dSb290
KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3Qt
Pmhvc3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29s
dmVyLT5wdXNoKHNoYWRvd1Jvb3QsIHNoYWRvd1Jvb3QtPmhvc3QoKSk7Cit9CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6cG9wUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dS
b290KQoreworICAgIEFTU0VSVChzaGFkb3dSb290LT5ob3N0KCkpOworICAgIGlmIChtX3Njb3Bl
UmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHNoYWRvd1Jvb3QpOworfQor
CisvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCBzdHlsZSBzZXR0aW5nIGZ1bmN0aW9uIGZvciBrZXlm
cmFtZSBzdHlsZXMKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVm
UHRyPFN0eWxlUnVsZUtleWZyYW1lcz4gcnVsZSkKK3sKKyAgICBBdG9taWNTdHJpbmcgcyhydWxl
LT5uYW1lKCkpOworICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5zZXQocy5pbXBsKCksIHJ1bGUpOwor
fQorCitTdHlsZVJlc29sdmVyOjp+U3R5bGVSZXNvbHZlcigpCit7CisgICAgbV9mb250U2VsZWN0
b3ItPmNsZWFyRG9jdW1lbnQoKTsKKworI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04p
CisgICAgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXItPmNsZWFyRG9jdW1lbnQoKTsKKyNlbmRpZgor
fQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1l
cjxTdHlsZVJlc29sdmVyPiopCit7CisgICAgLy8gTG9vayBmb3IgY2FjaGUgZW50cmllcyBjb250
YWluaW5nIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aCBhIHNpbmdsZSByZWYgYW5kIHJlbW92ZSB0
aGVtLgorICAgIC8vIFRoaXMgbWF5IGhhcHBlbiB3aGVuIGFuIGVsZW1lbnQgYXR0cmlidXRlIG11
dGF0aW9uIGNhdXNlcyBpdCB0byBnZW5lcmF0ZSBhIG5ldyBpbmxpbmVTdHlsZSgpCisgICAgLy8g
b3IgcHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSwgcG90ZW50aWFsbHkgbGVhdmluZyB0aGlz
IGNhY2hlIHdpdGggdGhlIGxhc3QgcmVmIG9uIHRoZSBvbGQgb25lLgorICAgIFZlY3Rvcjx1bnNp
Z25lZCwgMTY+IHRvUmVtb3ZlOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9y
IGl0ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmJlZ2luKCk7CisgICAgTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZTo6aXRlcmF0b3IgZW5kID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgp
OworICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQ
cm9wZXJ0aWVzPiYgbWF0Y2hlZFByb3BlcnRpZXMgPSBpdC0+dmFsdWUubWF0Y2hlZFByb3BlcnRp
ZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtYXRjaGVkUHJvcGVydGllc1tpXS5wcm9wZXJ0
aWVzLT5oYXNPbmVSZWYoKSkgeworICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFwcGVuZChpdC0+
a2V5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgKytpKQor
ICAgICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUucmVtb3ZlKHRvUmVtb3ZlW2ldKTsKKwor
ICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3Vs
dCYgbWF0Y2hSZXN1bHQsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxl
UnVsZSogcnVsZSwgdW5zaWduZWQgbGlua01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBl
IHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAgICBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5ncm93KG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOworICAg
IE1hdGNoZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMubGFzdCgpOworICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nh
c3Q8U3R5bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRpZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlu
a01hdGNoVHlwZSA9IGxpbmtNYXRjaFR5cGU7CisgICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RU
eXBlID0gcHJvcGVydHlXaGl0ZWxpc3RUeXBlOworICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxl
cy5hcHBlbmQocnVsZSk7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1l
bnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0
eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXNDYWNoZWFibGUpCit7CisgICAgaWYgKCFwcm9wZXJ0
eVNldCkKKyAgICAgICAgcmV0dXJuOworICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUg
PSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChyZXN1bHQucmFuZ2Vz
LmZpcnN0QXV0aG9yUnVsZSA9PSAtMSkKKyAgICAgICAgcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhv
clJ1bGUgPSByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOworICAgIGFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKHJlc3VsdCwgcHJvcGVydHlTZXQpOworICAgIGlmICghaXNDYWNoZWFibGUpCisgICAg
ICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOworfQorCitjbGFzcyBNYXRjaGluZ1VBUnVs
ZXNTY29wZSB7CitwdWJsaWM6CisgICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKyAgICB+TWF0
Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKworICAgIHN0YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVz
KCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgbV9tYXRjaGluZ1VBUnVsZXM7Cit9Owor
CitNYXRjaGluZ1VBUnVsZXNTY29wZTo6TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKQoreworICAgIEFT
U0VSVCghbV9tYXRjaGluZ1VBUnVsZXMpOworICAgIG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsK
K30KKworTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6On5NYXRjaGluZ1VBUnVsZXNTY29wZSgpCit7Cisg
ICAgbV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgTWF0Y2hpbmdV
QVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9tYXRjaGlu
Z1VBUnVsZXM7Cit9CisKK2Jvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1
bGVzID0gZmFsc2U7CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMo
Y29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQor
eworICAgIEFTU0VSVChtYXRjaFJlcXVlc3QucnVsZVNldCk7CisgICAgQVNTRVJUKG1fc3RhdGUu
ZWxlbWVudCgpKTsKKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgRWxlbWVudCog
ZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKTsKKyAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHls
ZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpOworICAgIGNvbnN0IEF0b21pY1N0cmlu
ZyYgcHNldWRvSWQgPSBlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpOworICAgIGlmICghcHNldWRv
SWQuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VSVChzdHlsZWRFbGVtZW50KTsKKyAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQ
c2V1ZG9FbGVtZW50UnVsZXMocHNldWRvSWQuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOworICAgIH0KKworI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyAgICBpZiAoZWxlbWVudC0+
aXNXZWJWVFRFbGVtZW50KCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCht
YXRjaFJlcXVlc3QucnVsZVNldC0+Y3VlUHNldWRvUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxl
UmFuZ2UpOworI2VuZGlmCisgICAgLy8gQ2hlY2sgd2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxl
cyBhcmUgYXBwbGljYWJsZSBpbiB0aGUgY3VycmVudCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3Ig
dGhpczoKKyAgICAvLyBhKSBpdCdzIGEgVUEgcnVsZQorICAgIC8vIGIpIHRoZSB0cmVlIHNjb3Bl
IGFsbG93cyBhdXRob3IgcnVsZXMKKyAgICAvLyBjKSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNj
b3BlZCBzdHlsZSBzaGVldCB3aXRoaW4gdGhlIHNhbWUgdHJlZSBzY29wZQorICAgIFRyZWVTY29w
ZSogdHJlZVNjb3BlID0gZWxlbWVudC0+dHJlZVNjb3BlKCk7CisgICAgaWYgKCFNYXRjaGluZ1VB
UnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQorICAgICAgICAmJiAhdHJlZVNjb3BlLT5h
cHBseUF1dGhvclN0eWxlcygpCisgICAgICAgICYmICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1h
dGNoUmVxdWVzdC5zY29wZS0+dHJlZVNjb3BlKCkgIT0gdHJlZVNjb3BlKQorICAgICAgICAmJiBt
YXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05v
dENyb3NzQm91bmRhcnkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5lZWQgdG8gY29s
bGVjdCB0aGUgcnVsZXMgZm9yIGlkLCBjbGFzcywgdGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGlu
dG8gYSBidWZmZXIgYW5kCisgICAgLy8gdGhlbiBzb3J0IHRoZSBidWZmZXIuCisgICAgaWYgKGVs
ZW1lbnQtPmhhc0lEKCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRj
aFJlcXVlc3QucnVsZVNldC0+aWRSdWxlcyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigp
LmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBpZiAoc3R5bGVkRWxlbWVu
dCAmJiBzdHlsZWRFbGVtZW50LT5oYXNDbGFzcygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpLnNpemUoKTsgKytpKQorICAgICAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5j
bGFzc1J1bGVzKHN0eWxlZEVsZW1lbnQtPmNsYXNzTmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgfQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQor
ICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQt
PmxpbmtQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBp
ZiAoU2VsZWN0b3JDaGVja2VyOjptYXRjaGVzRm9jdXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKKyAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5m
b2N1c1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMo
ZWxlbWVudC0+bG9jYWxOYW1lKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwor
ICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5p
dmVyc2FsUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVz
dCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3sKKyAgICBpZiAoIW1fc3Rh
dGUucmVnaW9uRm9yU3R5bGluZygpKQorICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBz
aXplID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMu
c2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAg
ICAgY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVT
ZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3I7CisgICAgICAg
IGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKHJlZ2lvblNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVt
ZW50Kj4obV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCktPm5vZGUoKSkpKSB7CisgICAgICAgICAg
ICBSdWxlU2V0KiByZWdpb25SdWxlcyA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNl
bGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCk7CisgICAgICAgICAgICBBU1NF
UlQocmVnaW9uUnVsZXMpOworICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hS
ZXF1ZXN0KHJlZ2lvblJ1bGVzLCBtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNo
UmVxdWVzdC5zY29wZSksIHJ1bGVSYW5nZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQpCit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBWZWN0b3I8Y29uc3Qg
UnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9IHN0YXRlLm1hdGNoZWRSdWxlcygpOworICAg
IGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzb3J0
TWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tl
cjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBt
YXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlz
dCgpLT5ydWxlcygpLmFwcGVuZChtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01X
cmFwcGVyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm93IHRyYW5zZmVy
IHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBvdmVyIHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9u
cy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsr
KSB7CisgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFp
bnNVbmNvbW1vbkF0dHJpYnV0ZVNlbGVjdG9yKCkpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRVbmlxdWUoKTsKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRj
aGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUo
KSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJv
cGVydHlXaGl0ZWxpc3RUeXBlKCkpOworICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpt
YXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVt
cHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19E
T00pCisgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IE1hdGNoIHNjb3BlZCBhdXRob3IgcnVsZXMgYnkgdHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1l
bnQgc3RhY2sgKHJlYnVpbGQgaXQgaWYgaXQgZ290IGluY29uc2lzdGVudCkuCisgICAgaWYgKG1f
c2NvcGVSZXNvbHZlci0+aGFzU2NvcGVkU3R5bGVzKCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1
cmVTdGFja0NvbnNpc3RlbmN5KG1fc3RhdGUuZWxlbWVudCgpKSkgeworICAgICAgICBib29sIGFw
cGx5QXV0aG9yU3R5bGVzID0gbV9zdGF0ZS5lbGVtZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1
dGhvclN0eWxlcygpOworICAgICAgICBib29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOworICAgICAg
ICB1bnNpZ25lZCBzY29wZVNpemUgPSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOworICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2NvcGVTaXplOyArK2kpIHsKKyAgICAgICAg
ICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5y
YW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MTsKKworICAgICAgICAgICAgY29uc3QgU3R5bGVTY29wZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBm
cmFtZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tGcmFtZUF0KGkpOworICAgICAgICAgICAgZG9j
dW1lbnRTY29wZSA9IGRvY3VtZW50U2NvcGUgJiYgIWZyYW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dU
cmVlKCk7CisgICAgICAgICAgICBpZiAoZG9jdW1lbnRTY29wZSkgeworICAgICAgICAgICAgICAg
IGlmICghYXBwbHlBdXRob3JTdHlsZXMpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZl
ci0+bWF0Y2hlc1N0eWxlQm91bmRzKGZyYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVl
c3QoZnJhbWUubV9ydWxlU2V0LCBpbmNsdWRlRW1wdHlSdWxlcywgZnJhbWUubV9zY29wZSk7Cisg
ICAgICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxl
UmFuZ2UoKTsKKyAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwg
cnVsZVJhbmdlKTsKKyAgICAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1h
dGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICAgICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcyhyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgbWF0Y2hIb3N0UnVsZXMo
cmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1
bHQpOworICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKwor
aW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hv
c3RSdWxlcygpCit7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgcmV0dXJuIG1fc2NvcGVS
ZXNvbHZlciAmJiBtX3Njb3BlUmVzb2x2ZXItPnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNI
b3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCkpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7Cisj
ZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3Vs
dCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQoreworI2lmIEVOQUJMRShTSEFET1df
RE9NKQorICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2ZXIpOworCisgICAgbV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5jbGVhcigpOworICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgIFZlY3RvcjxSdWxlU2V0Kj4g
bWF0Y2hlZFJ1bGVzOworICAgIG1fc2NvcGVSZXNvbHZlci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0
ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxlcyk7CisgICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxl
cy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJl
c3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1
bGVzKE1hdGNoUmVxdWVzdChtYXRjaGVkUnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMs
IG1fc3RhdGUuZWxlbWVudCgpKSwgcnVsZVJhbmdlKTsKKyAgICB9CisgICAgc29ydEFuZFRyYW5z
ZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQp
OworICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKwordm9p
ZCBTdHlsZVJlc29sdmVyOjptYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVh
cigpOworICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCisgICAgTWF0
Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRo
b3JSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIFZlY3RvcjxNYXRjaFJl
cXVlc3Q+IG1hdGNoUmVxdWVzdHM7CisgICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1
bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVz
dHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsr
aSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJh
bmdlKTsKKyNlbmRpZgorCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7
CisKKyAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMp
OworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisgICAgaWYgKCFtX3J1bGVTZXRzLnVz
ZXJTdHlsZSgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOworCisgICAgcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQu
bWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1
ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxl
UmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7CisgICAgY29s
bGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKworICAgIHNv
cnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcykKK3sK
KyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgCisgICAgcmVzdWx0LnJh
bmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Cisg
ICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKKyAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwor
CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxl
RGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdl
JiBydWxlUmFuZ2UpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAgICAgcmV0dXJuOworCisgICAg
U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICAvLyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQg
dXAgbG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9tIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2Yg
YSByZWN1cnNpdmUgdHJlZSByZXNvbHZlLgorICAgIC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmls
dGVyIHdvbid0IGJlIHVwLXRvLWRhdGUgaW4gdGhhdCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhl
IGZhc3QgcGF0aC4KKyAgICBib29sIGNhblVzZUZhc3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVy
LnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1
ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0Jv
dW5kYXJ5OworCisgICAgdW5zaWduZWQgc2l6ZSA9IHJ1bGVzLT5zaXplKCk7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBSdWxlRGF0YSYg
cnVsZURhdGEgPSBydWxlcy0+YXQoaSk7CisgICAgICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYm
IG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNlbGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRl
bnRpZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5kYW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVz
KCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgU3R5bGVSdWxlKiBydWxlID0g
cnVsZURhdGEucnVsZSgpOworICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUg
Y29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50
KCksIHJ1bGUsIHRoaXMpOworICAgICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VV
RE87CisgICAgICAgIGlmIChydWxlTWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3Bl
LCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgeworICAg
ICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4g
aWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9kZS4KKyAgICAgICAgICAgIGNvbnN0IFN0eWxl
UHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgICAg
ICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRpZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1
ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgeworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5n
IHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENTU1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9u
bHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgorICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9y
aWdpbk9ubHkoKSAmJiAhcnVsZURhdGEuaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbigpKSB7Cisg
ICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29v
a2llLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGluZyBub3JtYWwgcnVsZXMsIHNldCBhIHBzZXVk
byBiaXQgaWYKKyAgICAgICAgICAgIC8vIHdlIHJlYWxseSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8t
ZWxlbWVudC4KKyAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvICE9IE5PUFNFVURPICYmIHN0
YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkID09IE5PUFNFVURPKSB7CisgICAgICAg
ICAgICAgICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdS
dWxlcykgeworICAgICAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwg
RklSU1RfSU5URVJOQUxfUFNFVURPSUQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEhhc1BzZXVkb1N0eWxlKGR5bmFtaWNQc2V1ZG8pOworICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgb3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2Vz
IGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFycmF5LgorICAgICAgICAgICAgICAgICsrcnVsZVJhbmdl
Lmxhc3RSdWxlSW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJ
bmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4
ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhp
cyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCisgICAgICAgICAgICAgICAgbV9z
dGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEpOworICAgICAgICAgICAgICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgdHJ1ZSk7CisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgfQor
fQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwg
Y29uc3QgUnVsZURhdGEqIHIyKQoreworICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5z
cGVjaWZpY2l0eSgpOworICAgIHVuc2lnbmVkIHNwZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0
eSgpOworICAgIHJldHVybiAoc3BlY2lmaWNpdHkxID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9z
aXRpb24oKSA8IHIyLT5wb3NpdGlvbigpIDogc3BlY2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOwor
fQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRNYXRjaGVkUnVsZXMoKQoreworICAgIHN0ZDo6
c29ydChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmJlZ2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVz
KCkuZW5kKCksIGNvbXBhcmVSdWxlcyk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hB
bGxSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykK
K3sKKyAgICBtYXRjaFVBUnVsZXMocmVzdWx0KTsKKworICAgIC8vIE5vdyB3ZSBjaGVjayB1c2Vy
IHNoZWV0IHJ1bGVzLgorICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAg
ICAgbWF0Y2hVc2VyUnVsZXMocmVzdWx0LCBmYWxzZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgYXV0
aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmlyc3Qgd2l0aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVz
IG1hcHBlZCBmcm9tIEhUTUwuCisgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7Cisg
ICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgLy8gTm93
IHdlIGNoZWNrIGFkZGl0aW9uYWwgbWFwcGVkIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgLy8gVGFi
bGVzIGFuZCB0YWJsZSBjZWxscyBzaGFyZSBhbiBhZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQg
bXVzdCBiZSBhcHBsaWVkCisgICAgICAgIC8vIGFmdGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0
aGVpciBtYXBwZWQgc3R5bGUgZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJp
YnV0ZXMuCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkp
OworCisgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgp
KSB7CisgICAgICAgICAgICBib29sIGlzQXV0bzsKKyAgICAgICAgICAgIFRleHREaXJlY3Rpb24g
dGV4dERpcmVjdGlvbiA9IHRvSFRNTEVsZW1lbnQobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5k
aXJlY3Rpb25hbGl0eUlmaGFzRGlyQXV0b0F0dHJpYnV0ZShpc0F1dG8pOworICAgICAgICAgICAg
aWYgKGlzQXV0bykKKyAgICAgICAgICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQs
IHRleHREaXJlY3Rpb24gPT0gTFRSID8gbGVmdFRvUmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRU
b0xlZnREZWNsYXJhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBDaGVj
ayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cyBuZXh0LgorICAgIGlmIChtX21hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsK
KworICAgIC8vIE5vdyBjaGVjayBvdXIgaW5saW5lIHN0eWxlIGF0dHJpYnV0ZS4KKyAgICBpZiAo
bV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYg
bV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsKKyAgICAgICAgLy8gSW5s
aW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBw
ZXIuCisgICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRv
IGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgorICAgICAgICBib29sIGlzSW5saW5lU3R5bGVD
YWNoZWFibGUgPSAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0
YWJsZSgpICYmICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKKyAg
ICAgICAgLy8gRklYTUU6IENvbnN0aWZ5LgorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0
aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5s
aW5lU3R5bGVDYWNoZWFibGUpOworICAgIH0KKworI2lmIEVOQUJMRShTVkcpCisgICAgLy8gTm93
IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92ZXJyaWRlIHN0eWxlLgorICAgIGlmIChpbmNsdWRlU01J
TFByb3BlcnRpZXMgJiYgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQor
ICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZH
RWxlbWVudCo+KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9w
ZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2FjaGVhYmxlICovKTsKKyNlbHNlCisgICAgVU5VU0VEX1BB
UkFNKGluY2x1ZGVTTUlMUHJvcGVydGllcyk7CisjZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29s
dmVyOjpjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNs
YXNzTmFtZXMpIGNvbnN0Cit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFt
ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFz
c2VzSW5SdWxlcy5jb250YWlucyhjbGFzc05hbWVzW2ldLmltcGwoKSkpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBT
dHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKK3sKKyAgICBtX2Vs
ZW1lbnQgPSBlOworICAgIG1fc3R5bGVkRWxlbWVudCA9IGUgJiYgZS0+aXNTdHlsZWRFbGVtZW50
KCkgPyBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4oZSkgOiAwOworICAgIG1fZWxlbWVudExp
bmtTdGF0ZSA9IGUgPyBlLT5kb2N1bWVudCgpLT52aXNpdGVkTGlua1N0YXRlKCktPmRldGVybWlu
ZUxpbmtTdGF0ZShlKSA6IE5vdEluc2lkZUxpbms7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVz
b2x2ZXI6OmluaXRFbGVtZW50KEVsZW1lbnQqIGUpCit7CisgICAgaWYgKG1fc3RhdGUuZWxlbWVu
dCgpICE9IGUpIHsKKyAgICAgICAgbV9zdGF0ZS5pbml0RWxlbWVudChlKTsKKyAgICAgICAgaWYg
KGUgJiYgZSA9PSBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICAg
ICAgZS0+ZG9jdW1lbnQoKS0+c2V0RGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2Up
OworICAgICAgICAgICAgZS0+ZG9jdW1lbnQoKS0+c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50
RWxlbWVudChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2lubGluZSB2b2lkIFN0eWxl
UmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwg
RWxlbWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5n
KQoreworICAgIG1fcHNldWRvU3R5bGVSZXF1ZXN0ID0gcHNldWRvU3R5bGVSZXF1ZXN0OworICAg
IG1fcmVnaW9uRm9yU3R5bGluZyA9IHJlZ2lvbkZvclN0eWxpbmc7CisKKyAgICBpZiAoZSkgewor
ICAgICAgICBOb2RlUmVuZGVyaW5nQ29udGV4dCBjb250ZXh0KGUpOworICAgICAgICBtX3BhcmVu
dE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOworICAgICAg
ICBtX3BhcmVudFN0eWxlID0gY29udGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSA/IDAgOgor
ICAgICAgICAgICAgcGFyZW50U3R5bGUgPyBwYXJlbnRTdHlsZSA6CisgICAgICAgICAgICBtX3Bh
cmVudE5vZGUgPyBtX3BhcmVudE5vZGUtPnJlbmRlclN0eWxlKCkgOiAwOworICAgICAgICBtX2Rp
c3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCA9IGNvbnRleHQuaW5zZXJ0aW9uUG9pbnQoKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBtX3BhcmVudE5vZGUgPSAwOworICAgICAgICBtX3BhcmVudFN0
eWxlID0gcGFyZW50U3R5bGU7CisgICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50
ID0gZmFsc2U7CisgICAgfQorCisgICAgTm9kZSogZG9jRWxlbWVudCA9IGUgPyBlLT5kb2N1bWVu
dCgpLT5kb2N1bWVudEVsZW1lbnQoKSA6IDA7CisgICAgUmVuZGVyU3R5bGUqIGRvY1N0eWxlID0g
ZG9jdW1lbnQtPnJlbmRlclN0eWxlKCk7CisgICAgbV9yb290RWxlbWVudFN0eWxlID0gZG9jRWxl
bWVudCAmJiBlICE9IGRvY0VsZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJTdHlsZSgpIDogZG9j
U3R5bGU7CisKKyAgICBtX3N0eWxlID0gMDsKKyAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMu
Y2xlYXIoKTsKKyAgICBtX3J1bGVMaXN0ID0gMDsKKyAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwor
fQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY1N0eWxlU2VhcmNoVGhyZXNob2xkID0gMTA7Citz
dGF0aWMgY29uc3QgdW5zaWduZWQgY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgPSAxMDsKKwor
c3RhdGljIGlubGluZSBib29sIHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoY29uc3QgRWxl
bWVudCogcGFyZW50RWxlbWVudCkKK3sKKyAgICBpZiAoIXBhcmVudEVsZW1lbnQpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcGFyZW50RWxlbWVudC0+aGFzRmxhZ3NTZXREdXJp
bmdTdHlsaW5nT2ZDaGlsZHJlbigpOworfQorCitOb2RlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVD
b3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNv
bnN0Cit7CisgICAgaWYgKHZpc2l0ZWROb2RlQ291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xk
ICogY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQpCisgICAgICAgIHJldHVybiAwOworICAgIGlm
ICghcGFyZW50IHx8ICFwYXJlbnQtPmlzU3R5bGVkRWxlbWVudCgpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBpZiAocGFyZW50LT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICBTdHlsZWRFbGVtZW50KiBwID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVu
dCo+KHBhcmVudCk7CisgICAgaWYgKHAtPmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAw
OworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKHAtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19j
YXN0PFNWR0VsZW1lbnQqPihwKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAg
ICAgIHJldHVybiAwOworI2VuZGlmCisgICAgaWYgKHAtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5m
ZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMocC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5p
bXBsKCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSA9IHAtPnJlbmRlclN0eWxlKCk7CisgICAgdW5zaWduZWQgc3ViY291bnQgPSAwOworICAgIE5v
ZGUqIHRoaXNDb3VzaW4gPSBwOworICAgIE5vZGUqIGN1cnJlbnROb2RlID0gcC0+cHJldmlvdXNT
aWJsaW5nKCk7CisKKyAgICAvLyBSZXNlcnZlIHRoZSB0cmllcyBmb3IgdGhpcyBsZXZlbC4gVGhp
cyBlZmZlY3RpdmVseSBtYWtlcyBzdXJlIHRoYXQgdGhlIGFsZ29yaXRobQorICAgIC8vIHdpbGwg
bmV2ZXIgZ28gZGVlcGVyIHRoYW4gY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQgbGV2ZWxzIGlu
dG8gcmVjdXJzaW9uLgorICAgIHZpc2l0ZWROb2RlQ291bnQgKz0gY1N0eWxlU2VhcmNoVGhyZXNo
b2xkOworICAgIHdoaWxlICh0aGlzQ291c2luKSB7CisgICAgICAgIHdoaWxlIChjdXJyZW50Tm9k
ZSkgeworICAgICAgICAgICAgKytzdWJjb3VudDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Tm9k
ZS0+cmVuZGVyU3R5bGUoKSA9PSBwYXJlbnRTdHlsZSAmJiBjdXJyZW50Tm9kZS0+bGFzdENoaWxk
KCkKKyAgICAgICAgICAgICAgICAmJiBjdXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmICFw
YXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHRvRWxlbWVudChjdXJyZW50Tm9kZSkpCisjaWYg
RU5BQkxFKFNIQURPV19ET00pCisgICAgICAgICAgICAgICAgJiYgIXRvRWxlbWVudChjdXJyZW50
Tm9kZSktPnNoYWRvdygpCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAg
ICAgICAvLyBBZGp1c3QgZm9yIHVudXNlZCByZXNlcnZlZCB0cmllcy4KKyAgICAgICAgICAgICAg
ICB2aXNpdGVkTm9kZUNvdW50IC09IGNTdHlsZVNlYXJjaFRocmVzaG9sZCAtIHN1YmNvdW50Owor
ICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBpZiAoc3ViY291bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xk
KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBj
dXJyZW50Tm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVu
dE5vZGUgPSBsb2NhdGVDb3VzaW5MaXN0KHRoaXNDb3VzaW4tPnBhcmVudEVsZW1lbnQoKSwgdmlz
aXRlZE5vZGVDb3VudCk7CisgICAgICAgIHRoaXNDb3VzaW4gPSBjdXJyZW50Tm9kZTsKKyAgICB9
CisKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdD
YW5kaWRhdGVNYXRjaGVzUnVsZVNldChSdWxlU2V0KiBydWxlU2V0KQoreworICAgIGlmICghcnVs
ZVNldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCku
Y2xlYXIoKTsKKworICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdS
dWxlcyk7CisgICAgaW50IGZpcnN0UnVsZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsK
KyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlKGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsK
KyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5n
ZSk7CisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUp
OworICAgIGlmIChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aENvbnRy
b2woU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3Rh
dGUgPSBtX3N0YXRlOworICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQgPSBl
bGVtZW50LT50b0lucHV0RWxlbWVudCgpOworICAgIEhUTUxJbnB1dEVsZW1lbnQqIG90aGVySW5w
dXRFbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpLT50b0lucHV0RWxlbWVudCgpOworCisgICAgaWYg
KCF0aGlzSW5wdXRFbGVtZW50IHx8ICFvdGhlcklucHV0RWxlbWVudCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0gb3Ro
ZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkpIHsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVs
ZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5m
YXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRy
KSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0aGlzSW5wdXRFbGVt
ZW50LT5pc0F1dG9maWxsZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+c2hvdWxk
QXBwZWFyQ2hlY2tlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2Vk
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNJ
bmRldGVybWluYXRlKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVxdWly
ZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZvcm1Db250cm9sKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChlbGVtZW50LT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3RhdGUu
ZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChzdGF0ZS5kb2N1bWVudCgpLT5jb250YWluc1ZhbGlkaXR5U3R5bGVSdWxl
cygpKSB7CisgICAgICAgIGJvb2wgd2lsbFZhbGlkYXRlID0gZWxlbWVudC0+d2lsbFZhbGlkYXRl
KCk7CisKKyAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndpbGxW
YWxpZGF0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICh3aWxs
VmFsaWRhdGUgJiYgKGVsZW1lbnQtPmlzVmFsaWRGb3JtQ29udHJvbEVsZW1lbnQoKSAhPSBzdGF0
ZS5lbGVtZW50KCktPmlzVmFsaWRGb3JtQ29udHJvbEVsZW1lbnQoKSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGVsZW1lbnQtPmlzSW5SYW5nZSgpICE9IHN0YXRl
LmVsZW1lbnQoKS0+aXNJblJhbmdlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgaWYgKGVsZW1lbnQtPmlzT3V0T2ZSYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNP
dXRPZlJhbmdlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbGVtZW50SGFzRGlyZWN0aW9uQXV0
byhFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8vIEZJWE1FOiBUaGlzIGxpbmUgaXMgc3VycHJp
c2luZ2x5IGhvdCwgd2UgbWF5IHdpc2ggdG8gaW5saW5lIGhhc0RpcmVjdGlvbkF1dG8gaW50byBT
dHlsZVJlc29sdmVyLgorICAgIHJldHVybiBlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgdG9I
VE1MRWxlbWVudChlbGVtZW50KS0+aGFzRGlyZWN0aW9uQXV0bygpOworfQorCitib29sIFN0eWxl
UmVzb2x2ZXI6OnNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJp
YnV0ZXMoU3R5bGVkRWxlbWVudCogc2hhcmluZ0NhbmRpZGF0ZSkgY29uc3QKK3sKKyAgICBjb25z
dCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmVsZW1l
bnREYXRhKCkgPT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZWxlbWVudERhdGEoKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxO
YW1lczo6bGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUoWE1M
TmFtZXM6OmxhbmdBdHRyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdGF0ZS5l
bGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUt
PmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBpZiAoIXN0YXRlLmVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygpKSB7CisgICAgICAgIGlm
IChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVs
ZXMoc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9IGVsc2UgaWYgKHNoYXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkpIHsKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgICAgICAvLyBTVkcgZWxlbWVudHMgcmVxdWlyZSBhIChzbG93ISkg
Z2V0QXR0cmlidXRlIGNvbXBhcmlzaW9uIGJlY2F1c2UgImNsYXNzIiBpcyBhbiBhbmltYXRhYmxl
IGF0dHJpYnV0ZSBmb3IgU1ZHLgorICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5pc1NWR0Vs
ZW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRl
KGNsYXNzQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworI2VuZGlm
CisgICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5jbGFzc05hbWVzKCkgIT0gc2hhcmlu
Z0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0
aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5wcmVzZW50YXRpb25BdHRy
aWJ1dGVTdHlsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFCTEUoUFJPR1JF
U1NfRUxFTUVOVCkKKyAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5oYXNUYWdOYW1lKHByb2dyZXNz
VGFnKSkgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHN0
YXRlLmVsZW1lbnQoKSktPmlzRGV0ZXJtaW5hdGUoKSAhPSBzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jl
c3NFbGVtZW50Kj4oc2hhcmluZ0NhbmRpZGF0ZSktPmlzRGV0ZXJtaW5hdGUoKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOworfQor
Citib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVt
ZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IGVsZW1lbnQt
PnJlbmRlclN0eWxlKCk7CisgICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAg
IGlmICghc3R5bGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1
ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT5oYXNVbmlxdWVQc2V1
ZG9TdHlsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPnRhZ1FO
YW1lKCkgIT0gc3RhdGUuZWxlbWVudCgpLT50YWdRTmFtZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKGVsZW1lbnQtPmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoZWxlbWVudC0+bmVlZHNTdHlsZVJlY2FsYygpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoZWxlbWVudC0+aXNTVkdFbGVtZW50KCkg
JiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KGVsZW1lbnQpLT5hbmltYXRlZFNNSUxTdHlsZVBy
b3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgaWYgKGVsZW1l
bnQtPmlzTGluaygpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+aG92ZXJlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
aG92ZXJlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmFjdGl2
ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+YWN0aXZlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAoZWxlbWVudC0+Zm9jdXNlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+Zm9jdXNlZCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lk
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5zaGFkb3dQc2V1ZG9JZCgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXNoYXJpbmdDYW5kaWRhdGVIYXNJ
ZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoZWxlbWVudCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkgIT0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9u
QXR0cmlidXRlU3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1l
bnQtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMo
ZWxlbWVudC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgc2hhcmUgc3R5bGUg
Zm9yIG9wdGlvbiBhbmQgb3B0Z3JvdXAgd2hlbmV2ZXIgcG9zc2libGUuCisgICAgLy8gQmVmb3Jl
IGRvaW5nIHNvLCB3ZSBuZWVkIHRvIHJlc29sdmUgaXNzdWVzIGluIEhUTUxTZWxlY3RFbGVtZW50
OjpyZWNhbGNMaXN0SXRlbXMKKyAgICAvLyBhbmQgUmVuZGVyTWVudUxpc3Q6OnNldFRleHQuIFNl
ZSBhbHNvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04ODQwNQorICAg
IGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFt
ZShvcHRncm91cFRhZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgaXNDb250
cm9sID0gZWxlbWVudC0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKTsKKworICAgIGlmIChpc0NvbnRy
b2wgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXNDb250cm9sICYmICFjYW5TaGFyZVN0eWxlV2l0aENv
bnRyb2woZWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdHlsZS0+
dHJhbnNpdGlvbnMoKSB8fCBzdHlsZS0+YW5pbWF0aW9ucygpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gVHVybiBvZmYg
c3R5bGUgc2hhcmluZyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2FpbiBsYXllcnMgZm9yIHJlYXNv
bnMgb3V0c2lkZSBvZiB0aGUgc3R5bGUgc3lzdGVtLgorICAgIC8vIFNlZSBjb21tZW50cyBpbiBS
ZW5kZXJPYmplY3Q6OnNldFN0eWxlKCkuCisgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaWZy
YW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNU
YWdOYW1lKGVtYmVkVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9iamVjdFRhZykgfHwgZWxl
bWVudC0+aGFzVGFnTmFtZShhcHBsZXRUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoY2FudmFz
VGFnKQorI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlfRk9SX1ZJREVPKQorICAgICAgICAvLyBXaXRo
IHByb3h5aW5nLCB0aGUgbWVkaWEgZWxlbWVudHMgYXJlIGJhY2tlZCBieSBhIFJlbmRlckVtYmVk
ZGVkT2JqZWN0LgorICAgICAgICB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKHZpZGVvVGFnKSB8fCBl
bGVtZW50LT5oYXNUYWdOYW1lKGF1ZGlvVGFnKQorI2VuZGlmCisgICAgICAgICkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8o
ZWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc0xp
bmsoKSAmJiBzdGF0ZS5lbGVtZW50TGlua1N0YXRlKCkgIT0gc3R5bGUtPmluc2lkZUxpbmsoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIC8v
IERlbnkgc2hhcmluZyBzdHlsZXMgYmV0d2VlbiBXZWJWVFQgYW5kIG5vbi1XZWJWVFQgbm9kZXMu
CisgICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
aXNXZWJWVFRFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVt
ZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVu
dCgpICYmIHRvV2ViVlRURWxlbWVudChlbGVtZW50KS0+aXNQYXN0Tm9kZSgpICE9IHRvV2ViVlRU
RWxlbWVudChzdGF0ZS5lbGVtZW50KCkpLT5pc1Bhc3ROb2RlKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKEZVTExTQ1JFRU5fQVBJKQorICAgIGlmIChlbGVt
ZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVu
dCgpIHx8IHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50
RnVsbFNjcmVlbkVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBTdHlsZWRFbGVtZW50KiBTdHlsZVJlc29sdmVyOjpm
aW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiBub2RlLCB1bnNpZ25lZCYgY291bnQpIGNv
bnN0Cit7CisgICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkg
eworICAgICAgICBpZiAoIW5vZGUtPmlzU3R5bGVkRWxlbWVudCgpKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIGlmIChjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoc3RhdGljX2Nhc3Q8
U3R5bGVkRWxlbWVudCo+KG5vZGUpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAo
Y291bnQrKyA9PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKK30K
KworUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZVNoYXJlZFN0eWxlKCkKK3sKKyAg
ICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGlmICghc3RhdGUuc3R5bGVkRWxlbWVudCgp
IHx8ICFzdGF0ZS5wYXJlbnRTdHlsZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIElm
IHRoZSBlbGVtZW50IGhhcyBpbmxpbmUgc3R5bGUgaXQgaXMgcHJvYmFibHkgdW5pcXVlLgorICAg
IGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpCisgICAgICAgIHJldHVy
biAwOworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNT
VkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHN0YXRlLnN0eWxlZEVsZW1l
bnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gMDsK
KyNlbmRpZgorICAgIC8vIElkcyBzdG9wIHN0eWxlIHNoYXJpbmcgaWYgdGhleSBzaG93IHVwIGlu
IHRoZSBzdHlsZXNoZWV0cy4KKyAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNJRCgp
ICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHN0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1
cm4gMDsKKyAgICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50
KCktPnBhcmVudEVsZW1lbnQoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVy
biAwOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+Y3NzVGFy
Z2V0KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0
byhzdGF0ZS5lbGVtZW50KCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIENhY2hlIHdo
ZXRoZXIgc3RhdGUuZWxlbWVudCBpcyBhZmZlY3RlZCBieSBhbnkga25vd24gY2xhc3Mgc2VsZWN0
b3JzLgorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBhIG1lbWJlciB2YXJpYWJsZS4g
VGhlIHN0eWxlIHNoYXJpbmcgY29kZSBjb3VsZCBiZSBmYWN0b3JlZCBvdXQgb2YgU3R5bGVSZXNv
bHZlci4KKyAgICBzdGF0ZS5zZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoc3RhdGUuZWxl
bWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0
ZWRCeVJ1bGVzKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygpKSk7CisKKyAgICAvLyBDaGVj
ayBwcmV2aW91cyBzaWJsaW5ncyBhbmQgdGhlaXIgY291c2lucy4KKyAgICB1bnNpZ25lZCBjb3Vu
dCA9IDA7CisgICAgdW5zaWduZWQgdmlzaXRlZE5vZGVDb3VudCA9IDA7CisgICAgU3R5bGVkRWxl
bWVudCogc2hhcmVFbGVtZW50ID0gMDsKKyAgICBOb2RlKiBjb3VzaW5MaXN0ID0gc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5wcmV2aW91c1NpYmxpbmcoKTsKKyAgICB3aGlsZSAoY291c2luTGlzdCkg
eworICAgICAgICBzaGFyZUVsZW1lbnQgPSBmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhjb3Vz
aW5MaXN0LCBjb3VudCk7CisgICAgICAgIGlmIChzaGFyZUVsZW1lbnQpCisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY291c2luTGlzdCA9IGxvY2F0ZUNvdXNpbkxpc3QoY291c2luTGlzdC0+
cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKKyAgICB9CisKKyAgICAvLyBJZiB3
ZSBoYXZlIGV4aGF1c3RlZCBhbGwgb3VyIGJ1ZGdldCBvciBvdXIgY291c2lucy4KKyAgICBpZiAo
IXNoYXJlRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBDYW4ndCBzaGFyZSBp
ZiBzaWJsaW5nIHJ1bGVzIGFwcGx5LiBUaGlzIGlzIGNoZWNrZWQgYXQgdGhlIGVuZCBhcyBpdCBz
aG91bGQgcmFyZWx5IGZhaWwuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNS
dWxlU2V0KG1fcnVsZVNldHMuc2libGluZygpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8g
Q2FuJ3Qgc2hhcmUgaWYgYXR0cmlidXRlIHJ1bGVzIGFwcGx5LgorICAgIGlmIChzdHlsZVNoYXJp
bmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnVuY29tbW9uQXR0cmlidXRlKCkp
KQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBDYW4ndCBzaGFyZSBpZiBAaG9zdCBALXJ1bGVz
IGFwcGx5LgorICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkp
CisgICAgICAgIHJldHVybiAwOworICAgIC8vIFRyYWNraW5nIGNoaWxkIGluZGV4IHJlcXVpcmVz
IHVuaXF1ZSBzdHlsZSBmb3IgZWFjaCBub2RlLiBUaGlzIG1heSBnZXQgc2V0IGJ5IHRoZSBzaWJs
aW5nIHJ1bGUgbWF0Y2ggYWJvdmUuCisgICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJp
bmcoc3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQorICAgICAgICByZXR1cm4gMDsK
KyAgICByZXR1cm4gc2hhcmVFbGVtZW50LT5yZW5kZXJTdHlsZSgpOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0KQoreworICAgIE1hdGNo
aW5nVUFSdWxlc1Njb3BlIHNjb3BlOworCisgICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJv
bSB0aGUgdXNlciBhZ2VudCBzaGVldC4KKyAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpz
aW1wbGVEZWZhdWx0U3R5bGVTaGVldCkKKyAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFs
c2U7CisgICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5
cGVNYXRjaFNwZWNpZmljKCJwcmludCIpCisgICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxl
OworICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQpOworCisgICAg
Ly8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFn
ZW50IHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkKKyAgICAgICAg
bWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtz
U3R5bGUpOworCisgICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGlu
IHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBy
dWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQo
KS0+aXNWaWV3U291cmNlKCkpCisgICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRT
dHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBS
ZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRp
b246OlVucGFnaW5hdGVkKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIHN3aXRjaCAo
cGFnaW5hdGlvbk1vZGUpIHsKKyAgICBjYXNlIFBhZ2luYXRpb246OkxlZnRUb1JpZ2h0UGFnaW5h
dGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7
CisgICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Np
b24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Np
b24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJv
Z3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgUGFnaW5hdGlvbjo6UmlnaHRUb0xlZnRQYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5z
ZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5p
c0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblBy
b2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1u
UHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxv
Y2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVt
blByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpUb3BU
b0JvdHRvbVBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxD
b2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgp
KQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBw
ZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFs
Q29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0
Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1h
bENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpCb3R0b21Ub1RvcFBhZ2luYXRlZDoKKyAgICAg
ICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYg
KHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8g
Tm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUt
PmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5v
cm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
IGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRp
b24oY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBGb250T3JpZW50YXRpb24mIGZvbnRPcmllbnRh
dGlvbiwgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiYgZ2x5cGhPcmllbnRhdGlvbikKK3sKKyAgICBp
ZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpIHsKKyAgICAgICAgZm9udE9yaWVu
dGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0ds
eXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgc3dpdGNoIChzdHlsZS0+dGV4dE9yaWVudGF0aW9uKCkpIHsKKyAgICBjYXNlIFRleHRPcmll
bnRhdGlvblZlcnRpY2FsUmlnaHQ6CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2Fs
OworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRp
Y2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblVwcmln
aHQ6CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9y
aWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblVwcmlnaHQ7CisgICAgICAgIHJldHVy
bjsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzOgorICAgICAgICBpZiAoc3R5bGUt
PndyaXRpbmdNb2RlKCkgPT0gTGVmdFRvUmlnaHRXcml0aW5nTW9kZSkgeworICAgICAgICAgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIG1hcCB0byBzaWRld2F5cy1sZWZ0LCB3aGljaCBpcyBub3Qg
c3VwcG9ydGVkIHlldC4KKyAgICAgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOwor
ICAgICAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0
aWNhbFJpZ2h0OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvbnRP
cmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25D
SktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXNSaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9u
ID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhv
cml6b250YWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0
aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworUGFzc1JlZlB0
cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCog
ZG9jdW1lbnQsIENTU0ZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKQoreworICAgIEZyYW1lKiBm
cmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOworCisgICAgLy8gSFRNTDUgc3RhdGVzIHRoYXQgc2Vh
bWxlc3MgaWZyYW1lcyBzaG91bGQgcmVwbGFjZSBkZWZhdWx0IENTUyB2YWx1ZXMKKyAgICAvLyB3
aXRoIHZhbHVlcyBpbmhlcml0ZWQgZnJvbSB0aGUgY29udGFpbmluZyBpZnJhbWUgZWxlbWVudC4g
SG93ZXZlciwKKyAgICAvLyBzb21lIHZhbHVlcyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBkZXNpZ25N
b2RlID0gIm9uIikgc3RpbGwgbmVlZCB0bworICAgIC8vIGJlIHNldCBieSB0aGlzICJkb2N1bWVu
dCBzdHlsZSIuCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBkb2N1bWVudFN0eWxlID0gUmVuZGVy
U3R5bGU6OmNyZWF0ZSgpOworICAgIGJvb2wgc2VhbWxlc3NXaXRoUGFyZW50ID0gZG9jdW1lbnQt
PnNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpOworICAgIGlmIChzZWFtbGVzc1dp
dGhQYXJlbnQpIHsKKyAgICAgICAgUmVuZGVyU3R5bGUqIGlmcmFtZVN0eWxlID0gZG9jdW1lbnQt
PnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPnJlbmRlclN0eWxlKCk7CisgICAgICAgIGlmIChpZnJh
bWVTdHlsZSkKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPmluaGVyaXRGcm9tKGlmcmFtZVN0
eWxlKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogSXQncyBub3QgY2xlYXIgd2hpY2ggdmFsdWVz
IGJlbG93IHdlIHdhbnQgdG8gb3ZlcnJpZGUgaW4gdGhlIHNlYW1sZXNzIGNhc2UhCisgICAgZG9j
dW1lbnRTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7CisgICAgaWYgKCFzZWFtbGVzc1dpdGhQYXJl
bnQpIHsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UlRMT3JkZXJpbmcoZG9jdW1lbnQtPnZp
c3VhbGx5T3JkZXJlZCgpID8gVmlzdWFsT3JkZXIgOiBMb2dpY2FsT3JkZXIpOworICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRab29tKGZyYW1lICYmICFkb2N1bWVudC0+cHJpbnRpbmcoKSA/IGZy
YW1lLT5wYWdlWm9vbUZhY3RvcigpIDogMSk7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFBh
Z2VTY2FsZVRyYW5zZm9ybShmcmFtZSA/IGZyYW1lLT5mcmFtZVNjYWxlRmFjdG9yKCkgOiAxKTsK
KyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0TG9jYWxlKGRvY3VtZW50LT5jb250ZW50TGFuZ3Vh
Z2UoKSk7CisgICAgfQorICAgIC8vIFRoaXMgb3ZlcnJpZGVzIGFueSAtd2Via2l0LXVzZXItbW9k
aWZ5IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgaWZyYW1lLgorICAgIGRvY3VtZW50U3R5bGUt
PnNldFVzZXJNb2RpZnkoZG9jdW1lbnQtPmluRGVzaWduTW9kZSgpID8gUkVBRF9XUklURSA6IFJF
QURfT05MWSk7CisKKyAgICBFbGVtZW50KiBkb2NFbGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50
RWxlbWVudCgpOworICAgIFJlbmRlck9iamVjdCogZG9jRWxlbWVudFJlbmRlcmVyID0gZG9jRWxl
bWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlcmVyKCkgOiAwOworICAgIGlmIChkb2NFbGVtZW50UmVu
ZGVyZXIpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSBv
ZiB0aGUgYm9keSB0byBzZXQgdGhlCisgICAgICAgIC8vIHZpZXdwb3J0J3MgZGlyZWN0aW9uIGFu
ZCB3cml0aW5nLW1vZGUgdW5sZXNzIHRoZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlIGRvY3VtZW50
IGVsZW1lbnQuCisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJvZHksIHRoZW4gdXNlIHRoZSBk
b2N1bWVudCBlbGVtZW50LgorICAgICAgICBSZW5kZXJPYmplY3QqIGJvZHlSZW5kZXJlciA9IGRv
Y3VtZW50LT5ib2R5KCkgPyBkb2N1bWVudC0+Ym9keSgpLT5yZW5kZXJlcigpIDogMDsKKyAgICAg
ICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVu
dEVsZW1lbnQoKSkKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGJv
ZHlSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGRvY0VsZW1lbnRSZW5kZXJlci0+
c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7CisgICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRv
Y3VtZW50LT5kaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgZG9j
dW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rp
b24oZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAgfQorCisg
ICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1l
LT52aWV3KCkpIHsKKyAgICAgICAgICAgIGNvbnN0IFBhZ2luYXRpb24mIHBhZ2luYXRpb24gPSBm
cmFtZVZpZXctPnBhZ2luYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChwYWdpbmF0aW9uLm1vZGUg
IT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHlsZXNG
b3JQYWdpbmF0aW9uTW9kZShwYWdpbmF0aW9uLm1vZGUsIGRvY3VtZW50U3R5bGUuZ2V0KCkpOwor
ICAgICAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldENvbHVtbkdhcChwYWdpbmF0aW9uLmdh
cCk7CisgICAgICAgICAgICAgICAgaWYgKFJlbmRlclZpZXcqIHZpZXcgPSBkb2N1bWVudC0+cmVu
ZGVyVmlldygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3LT5oYXNDb2x1bW5zKCkp
CisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LT51cGRhdGVDb2x1bW5JbmZvRnJvbVN0eWxl
KGRvY3VtZW50U3R5bGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgd2FudCB0byBpbmhl
cml0IHRoZWlyIGZvbnQgZnJvbSB0aGVpciBwYXJlbnQgaWZyYW1lLCBzbyBlYXJseSByZXR1cm4g
YmVmb3JlIHNldHRpbmcgdGhlIGZvbnQuCisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkKKyAg
ICAgICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOworCisgICAgRm9udERlc2NyaXB0
aW9uIGZvbnREZXNjcmlwdGlvbjsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2Fs
ZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24oZG9jdW1lbnRTdHlsZS0+bG9jYWxlKCkpKTsK
KyAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCkpIHsKKyAg
ICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGlu
ZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVy
aW5nTW9kZSgpKTsKKyAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBzdGFuZGFyZEZvbnQgPSBz
ZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KGZvbnREZXNjcmlwdGlvbi5zY3JpcHQoKSk7Cisg
ICAgICAgIGlmICghc3RhbmRhcmRGb250LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWls
eSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHko
c3RhbmRhcmRGb250KTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgp
LmFwcGVuZEZhbWlseSgwKTsKKyAgICAgICAgfQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRpdW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKKyAgICAg
ICAgaW50IHNpemUgPSBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQs
IENTU1ZhbHVlTWVkaXVtLCBmYWxzZSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVj
aWZpZWRTaXplKHNpemUpOworICAgICAgICBib29sIHVzZVNWR1pvb21SdWxlcyA9IGRvY3VtZW50
LT5pc1NWR0RvY3VtZW50KCk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNp
emUoU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1l
bnQsIGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgp
LCBzaXplLCB1c2VTVkdab29tUnVsZXMpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpKTsKKworICAgIEZv
bnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247CisgICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlv
biBnbHlwaE9yaWVudGF0aW9uOworICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGRvY3Vt
ZW50U3R5bGUuZ2V0KCksIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7CisgICAg
Zm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmllbnRhdGlvbik7CisgICAgZm9u
dERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7
CisKKyAgICBkb2N1bWVudFN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9u
KTsKKyAgICBkb2N1bWVudFN0eWxlLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3Rvcik7CisKKyAg
ICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9v
bCBpc0F0U2hhZG93Qm91bmRhcnkoY29uc3QgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAo
IWVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBDb250YWluZXJOb2RlKiBwYXJl
bnROb2RlID0gZWxlbWVudC0+cGFyZW50Tm9kZSgpOworICAgIHJldHVybiBwYXJlbnROb2RlICYm
IHBhcmVudE5vZGUtPmlzU2hhZG93Um9vdCgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVy
U3R5bGUqIGRlZmF1bHRQYXJlbnQsCisgICAgU3R5bGVTaGFyaW5nQmVoYXZpb3Igc2hhcmluZ0Jl
aGF2aW9yLCBSdWxlTWF0Y2hpbmdCZWhhdmlvciBtYXRjaGluZ0JlaGF2aW9yLCBSZW5kZXJSZWdp
b24qIHJlZ2lvbkZvclN0eWxpbmcpCit7CisgICAgLy8gT25jZSBhbiBlbGVtZW50IGhhcyBhIHJl
bmRlcmVyLCB3ZSBkb24ndCB0cnkgdG8gZGVzdHJveSBpdCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSBy
ZW5kZXJlcgorICAgIC8vIHdpbGwgdmFuaXNoIGlmIGEgc3R5bGUgcmVjYWxjIGhhcHBlbnMgZHVy
aW5nIGxvYWRpbmcuCisgICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmlu
ZyAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgIWVs
ZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAgaWYgKCFzX3N0eWxlTm90WWV0QXZhaWxhYmxl
KSB7CisgICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlID0gUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPnNl
dERpc3BsYXkoTk9ORSk7CisgICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5mb250
KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50LT5k
b2N1bWVudCgpLT5zZXRIYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0eWxlKCk7CisgICAgICAgIHJl
dHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOworICAgIH0KKworICAgIFN0YXRlJiBzdGF0ZSA9
IG1fc3RhdGU7CisgICAgaW5pdEVsZW1lbnQoZWxlbWVudCk7CisgICAgc3RhdGUuaW5pdEZvclN0
eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywg
cmVnaW9uRm9yU3R5bGluZyk7CisgICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxl
U2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKKyAgICAg
ICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoKTsKKyAgICAg
ICAgaWYgKHNoYXJlZFN0eWxlKQorICAgICAgICAgICAgcmV0dXJuIHNoYXJlZFN0eWxlOworICAg
IH0KKworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gY2xvbmVGb3JQYXJlbnQ7CisKKyAgICBpZiAo
c3RhdGUucGFyZW50U3R5bGUoKSkgeworICAgICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHls
ZTo6Y3JlYXRlKCkpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShzdGF0ZS5w
YXJlbnRTdHlsZSgpLCBpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkgPyBSZW5kZXJTdHlsZTo6
QXRTaGFkb3dCb3VuZGFyeSA6IFJlbmRlclN0eWxlOjpOb3RBdFNoYWRvd0JvdW5kYXJ5KTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBzdGF0ZS5zZXRTdHlsZShkZWZhdWx0U3R5bGVGb3JFbGVtZW50
KCkpOworICAgICAgICBjbG9uZUZvclBhcmVudCA9IFJlbmRlclN0eWxlOjpjbG9uZShzdGF0ZS5z
dHlsZSgpKTsKKyAgICAgICAgc3RhdGUuc2V0UGFyZW50U3R5bGUoY2xvbmVGb3JQYXJlbnQuZ2V0
KCkpOworICAgIH0KKyAgICAvLyBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlIChpbXBsZW1lbnRl
ZCBieSAtd2Via2l0LXVzZXItbW9kaWZ5KSBzaG91bGQKKyAgICAvLyBiZSBwcm9wYWdhdGVkIGZy
b20gc2hhZG93IGhvc3QgdG8gZGlzdHJpYnV0ZWQgbm9kZS4KKyAgICBpZiAoc3RhdGUuZGlzdHJp
YnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKKyAgICAgICAgaWYgKEVsZW1lbnQqIHBhcmVudCA9
IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKFJlbmRlclN0eWxl
KiBzdHlsZU9mU2hhZG93SG9zdCA9IHBhcmVudC0+cmVuZGVyU3R5bGUoKSkKKyAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VyTW9kaWZ5KHN0eWxlT2ZTaGFkb3dIb3N0LT51c2Vy
TW9kaWZ5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygp
KSB7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldElzTGluayh0cnVlKTsKKyAgICAgICAgRUlu
c2lkZUxpbmsgbGlua1N0YXRlID0gc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpOworICAgICAgICBp
ZiAobGlua1N0YXRlICE9IE5vdEluc2lkZUxpbmspIHsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VW
aXNpdGVkID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpmb3JjZVBzZXVkb1N0YXRlKGVsZW1l
bnQsIENTU1NlbGVjdG9yOjpQc2V1ZG9WaXNpdGVkKTsKKyAgICAgICAgICAgIGlmIChmb3JjZVZp
c2l0ZWQpCisgICAgICAgICAgICAgICAgbGlua1N0YXRlID0gSW5zaWRlVmlzaXRlZExpbms7Cisg
ICAgICAgIH0KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdGUp
OworICAgIH0KKworICAgIGJvb2wgbmVlZHNDb2xsZWN0aW9uID0gZmFsc2U7CisgICAgQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjplbnN1cmVEZWZhdWx0U3R5bGVTaGVldHNGb3JFbGVtZW50KGVsZW1l
bnQsIG5lZWRzQ29sbGVjdGlvbik7CisgICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKKyAgICAgICAg
bV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1f
c2NvcGVSZXNvbHZlci5nZXQoKSk7CisKKyAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAg
ICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9PSBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcykKKyAgICAg
ICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKyAgICBlbHNlCisgICAgICAgIG1hdGNoQWxs
UnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1
ZGluZ1NNSUwpOworCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxl
bWVudCk7CisKKyAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQg
dGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KKyAgICBhZGp1c3RSZW5kZXJT
dHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBlbGVtZW50KTsKKworICAg
IHN0YXRlLmNsZWFyKCk7IC8vIENsZWFyIG91dCBmb3IgdGhlIG5leHQgcmVzb2x2ZS4KKworICAg
IGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1
cm4gdGhlIHN0eWxlLgorICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JLZXlmcmFtZShjb25zdCBS
ZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSwg
S2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVWYWx1ZSkKK3sKKyAgICBNYXRjaFJlc3VsdCByZXN1bHQ7
CisgICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCisgICAgICAgIGFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSk7CisKKyAgICBBU1NFUlQoIW1f
c3RhdGUuc3R5bGUoKSk7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgLy8g
Q3JlYXRlIHRoZSBzdHlsZQorICAgIHN0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjbG9uZShl
bGVtZW50U3R5bGUpKTsKKyAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisKKyAgICAv
LyBXZSBkb24ndCBuZWVkIHRvIGJvdGhlciB3aXRoICFpbXBvcnRhbnQuIFNpbmNlIHRoZXJlIGlz
IG9ubHkgZXZlciBvbmUKKyAgICAvLyBkZWNsLCB0aGVyZSdzIG5vdGhpbmcgdG8gb3ZlcnJpZGUu
IFNvIGp1c3QgYWRkIHRoZSBmaXJzdCBwcm9wZXJ0aWVzLgorICAgIGJvb2wgaW5oZXJpdGVkT25s
eSA9IGZhbHNlOworICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2Us
IDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsK
KworICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0
IG5vdy4KKyAgICB1cGRhdGVGb250KCk7CisKKyAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hl
biB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUKKyAgICBpZiAoc3RhdGUu
bGluZUhlaWdodFZhbHVlKCkpCisgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5l
SGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7CisKKyAgICAvLyBOb3cgZG8gcmVzdCBv
ZiB0aGUgcHJvcGVydGllcy4KKyAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAg
ICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwg
ZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRP
bmx5KTsKKworICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkIGJ5IG9uZSBvZiB0aGUgbm9u
LWVzc2VudGlhbCBmb250IHByb3BzLAorICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgYSBz
ZWNvbmQgdGltZS4KKyAgICB1cGRhdGVGb250KCk7CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJl
c291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJj
ZXMoKTsKKyAgICAKKyAgICAvLyBBZGQgYWxsIHRoZSBhbmltYXRpbmcgcHJvcGVydGllcyB0byB0
aGUga2V5ZnJhbWUuCisgICAgaWYgKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHN0eWxlRGVjbGFy
YXRpb24gPSBrZXlmcmFtZS0+cHJvcGVydGllcygpKSB7CisgICAgICAgIHVuc2lnbmVkIHByb3Bl
cnR5Q291bnQgPSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUNvdW50KCk7CisgICAgICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKKyAgICAgICAgICAg
IENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUF0KGkp
LmlkKCk7CisgICAgICAgICAgICAvLyBUaW1pbmctZnVuY3Rpb24gd2l0aGluIGtleWZyYW1lcyBp
cyBzcGVjaWFsLCBiZWNhdXNlIGl0IGlzIG5vdCBhbmltYXRlZDsgaXQganVzdAorICAgICAgICAg
ICAgLy8gZGVzY3JpYmVzIHRoZSB0aW1pbmcgZnVuY3Rpb24gYmV0d2VlbiB0aGlzIGtleWZyYW1l
IGFuZCB0aGUgbmV4dC4KKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uKQorICAgICAgICAgICAgICAgIGtleWZyYW1lVmFs
dWUuYWRkUHJvcGVydHkocHJvcGVydHkpOworICAgICAgICB9CisgICAgfQorCisgICAgZG9jdW1l
bnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgcmV0dXJuIHN0YXRlLnRha2VT
dHlsZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmtleWZyYW1lU3R5bGVzRm9yQW5pbWF0
aW9uKEVsZW1lbnQqIGUsIGNvbnN0IFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIEtleWZyYW1l
TGlzdCYgbGlzdCkKK3sKKyAgICBsaXN0LmNsZWFyKCk7CisKKyAgICAvLyBHZXQgdGhlIGtleWZy
YW1lc1J1bGUgZm9yIHRoaXMgbmFtZQorICAgIGlmICghZSB8fCBsaXN0LmFuaW1hdGlvbk5hbWUo
KS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5j
aGVja0NvbnNpc3RlbmN5KCk7CisKKyAgICBLZXlmcmFtZXNSdWxlTWFwOjppdGVyYXRvciBpdCA9
IG1fa2V5ZnJhbWVzUnVsZU1hcC5maW5kKGxpc3QuYW5pbWF0aW9uTmFtZSgpLmltcGwoKSk7Cisg
ICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVzUnVsZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY29uc3QgU3R5bGVSdWxlS2V5ZnJhbWVzKiBrZXlmcmFtZXNSdWxlID0gaXQtPnZhbHVl
LmdldCgpOworCisgICAgLy8gQ29uc3RydWN0IGFuZCBwb3B1bGF0ZSB0aGUgc3R5bGUgZm9yIGVh
Y2gga2V5ZnJhbWUKKyAgICBjb25zdCBWZWN0b3I8UmVmUHRyPFN0eWxlS2V5ZnJhbWU+ID4mIGtl
eWZyYW1lcyA9IGtleWZyYW1lc1J1bGUtPmtleWZyYW1lcygpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBrZXlmcmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gQXBwbHkgdGhl
IGRlY2xhcmF0aW9uIHRvIHRoZSBzdHlsZS4gVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBv
ZiB0aGUgbG9naWMgaW4gc3R5bGVGb3JFbGVtZW50CisgICAgICAgIGluaXRFbGVtZW50KGUpOwor
ICAgICAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSk7CisKKyAg
ICAgICAgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUgPSBrZXlmcmFtZXNbaV0uZ2V0KCk7
CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBr
ZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBrZXlm
cmFtZSwga2V5ZnJhbWVWYWx1ZSkpOworCisgICAgICAgIC8vIEFkZCB0aGlzIGtleWZyYW1lIHN0
eWxlIHRvIGFsbCB0aGUgaW5kaWNhdGVkIGtleSB0aW1lcworICAgICAgICBWZWN0b3I8ZmxvYXQ+
IGtleXM7CisgICAgICAgIGtleWZyYW1lLT5nZXRLZXlzKGtleXMpOworICAgICAgICBmb3IgKHNp
emVfdCBrZXlJbmRleCA9IDA7IGtleUluZGV4IDwga2V5cy5zaXplKCk7ICsra2V5SW5kZXgpIHsK
KyAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0S2V5KGtleXNba2V5SW5kZXhdKTsKKyAgICAg
ICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gSWYgdGhlIDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkg
aWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1lKQorICAgIGludCBpbml0aWFs
TGlzdFNpemUgPSBsaXN0LnNpemUoKTsKKyAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiBs
aXN0WzBdLmtleSgpKSB7CisgICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiB6ZXJvUGVyY2Vu
dEtleWZyYW1lOworICAgICAgICBpZiAoIXplcm9QZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAg
ICAgIHplcm9QZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVm
KCk7CisgICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIwJSIpOwor
ICAgICAgICB9CisgICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKKyAg
ICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHls
ZSwgemVyb1BlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOworICAgICAgICBsaXN0Lmlu
c2VydChrZXlmcmFtZVZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgMTAwJSBrZXlmcmFt
ZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9u
ZSBvdGhlciBrZXlmcmFtZSkKKyAgICBpZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiAobGlzdFts
aXN0LnNpemUoKSAtIDFdLmtleSgpICE9IDEpKSB7CisgICAgICAgIHN0YXRpYyBTdHlsZUtleWZy
YW1lKiBodW5kcmVkUGVyY2VudEtleWZyYW1lOworICAgICAgICBpZiAoIWh1bmRyZWRQZXJjZW50
S2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtl
eWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7CisgICAgICAgICAgICBodW5kcmVkUGVyY2VudEtl
eWZyYW1lLT5zZXRLZXlUZXh0KCIxMDAlIik7CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWVW
YWx1ZSBrZXlmcmFtZVZhbHVlKDEsIDApOworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxl
KHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBodW5kcmVkUGVyY2VudEtleWZyYW1lLCBr
ZXlmcmFtZVZhbHVlKSk7CisgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAg
IH0KK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5
bGVGb3JFbGVtZW50KEVsZW1lbnQqIGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRv
U3R5bGVSZXF1ZXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgQVNTRVJUKHBh
cmVudFN0eWxlKTsKKyAgICBpZiAoIWUpCisgICAgICAgIHJldHVybiAwOworCisgICAgU3RhdGUm
IHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGluaXRFbGVtZW50KGUpOworCisgICAgc3RhdGUuaW5p
dEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVS
ZXF1ZXN0KTsKKyAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAg
IHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucGFyZW50U3R5bGUoKSk7CisKKyAg
ICAvLyBTaW5jZSB3ZSBkb24ndCB1c2UgcHNldWRvLWVsZW1lbnRzIGluIGFueSBvZiBvdXIgcXVp
cmsvcHJpbnQgdXNlciBhZ2VudCBydWxlcywgZG9uJ3Qgd2FzdGUgdGltZSB3YWxraW5nCisgICAg
Ly8gdGhvc2UgcnVsZXMuCisKKyAgICAvLyBDaGVjayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVz
LgorICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OworICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJl
c3VsdCk7CisKKyAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpIHsKKyAgICAgICAg
bWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKKyAgICAgICAgbWF0Y2hBdXRob3JS
dWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOworICAgIH0KKworICAgIGlmIChtYXRjaFJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCk7CisK
KyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlKTsKKworICAgIC8vIENs
ZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChh
bW9uZyBvdGhlciBmaXh1cHMpLgorICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCks
IG1fc3RhdGUucGFyZW50U3R5bGUoKSwgMCk7CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291
cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMo
KTsKKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKKworICAgIC8v
IE5vdyByZXR1cm4gdGhlIHN0eWxlLgorICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKK30K
KworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKGlu
dCBwYWdlSW5kZXgpCit7CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50
KCksIGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKTsgLy8gbV9yb290RWxlbWVudFN0eWxl
IHdpbGwgYmUgc2V0IHRvIHRoZSBkb2N1bWVudCBzdHlsZS4KKworICAgIG1fc3RhdGUuc2V0U3R5
bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKKyAgICBtX3N0YXRlLnN0eWxlKCktPmluaGVyaXRG
cm9tKG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKworICAgIGNvbnN0IGJvb2wgaXNMZWZ0
ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOworICAgIGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmly
c3RQYWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgU3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdl
SW5kZXgpOworICAgIAorICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKKyAgICBtYXRjaFBhZ2VSdWxl
cyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVm
dCwgaXNGaXJzdCwgcGFnZSk7CisgICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lk
ZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUg
SFRNTDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9y
U3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWln
aHRWYWx1ZSgwKTsKKyAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyNpZiBFTkFCTEUo
Q1NTX1ZBUklBQkxFUykKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5p
dGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxLCBpbmhlcml0ZWRPbmx5KTsKKyNlbmRpZgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8
SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZv
bnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZv
bnQoKTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRl
Y2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4KKyAgICBpZiAobV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUo
KSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIG1fc3RhdGUu
bGluZUhlaWdodFZhbHVlKCkpOworCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlv
cml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVz
b3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNl
cygpOworCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAg
Ly8gTm93IHJldHVybiB0aGUgc3R5bGUuCisgICAgcmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7
Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OmRlZmF1bHRTdHls
ZUZvckVsZW1lbnQoKQoreworICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0
ZSgpKTsKKyAgICAvLyBNYWtlIHN1cmUgb3VyIGZvbnRzIGFyZSBpbml0aWFsaXplZCBpZiB3ZSBk
b24ndCBpbmhlcml0IHRoZW0gZnJvbSBvdXIgcGFyZW50IHN0eWxlLgorICAgIGlmIChTZXR0aW5n
cyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCkpIHsKKyAgICAgICAgaW5pdGlhbGl6ZUZv
bnRTdHlsZShzZXR0aW5ncyk7CisgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0
ZShmb250U2VsZWN0b3IoKSk7CisgICAgfSBlbHNlCisgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+
Zm9udCgpLnVwZGF0ZSgwKTsKKworICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOworfQor
CitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvclRleHQoVGV4
dCogdGV4dE5vZGUpCit7CisgICAgQVNTRVJUKHRleHROb2RlKTsKKworICAgIE5vZGVSZW5kZXJp
bmdDb250ZXh0IGNvbnRleHQodGV4dE5vZGUpOworICAgIE5vZGUqIHBhcmVudE5vZGUgPSBjb250
ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOworICAgIHJldHVybiBjb250ZXh0
LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpIHx8ICFwYXJlbnROb2RlID8KKyAgICAgICAgZGVmYXVs
dFN0eWxlRm9yRWxlbWVudCgpIDogcGFyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKTsKK30KKworc3Rh
dGljIHZvaWQgYWRkSW50cmluc2ljTWFyZ2lucyhSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAg
Ly8gSW50cmluc2ljIG1hcmdpbiB2YWx1ZS4KKyAgICBjb25zdCBpbnQgaW50cmluc2ljTWFyZ2lu
ID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisKKyAgICAvLyBGSVhNRTogVXNpbmcgd2lk
dGgvaGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13
aWR0aCBpcyBmbGF3ZWQuCisgICAgLy8gRklYTUU6IFVzaW5nICJxdWlyayIgdG8gZGVjaWRlIHRo
ZSBtYXJnaW4gd2Fzbid0IHNldCBpcyBraW5kIG9mIGxhbWUuCisgICAgaWYgKHN0eWxlLT53aWR0
aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpIHsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0
KCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChpbnRy
aW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luUmlnaHQoKS5x
dWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblJpZ2h0KExlbmd0aChpbnRyaW5z
aWNNYXJnaW4sIEZpeGVkKSk7CisgICAgfQorCisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1
dG8oKSkgeworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCisgICAgICAg
ICAgICBzdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7
CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsK
KyAgICB9Cit9CisKK3N0YXRpYyBFRGlzcGxheSBlcXVpdmFsZW50QmxvY2tEaXNwbGF5KEVEaXNw
bGF5IGRpc3BsYXksIGJvb2wgaXNGbG9hdGluZywgYm9vbCBzdHJpY3RQYXJzaW5nKQoreworICAg
IHN3aXRjaCAoZGlzcGxheSkgeworICAgIGNhc2UgQkxPQ0s6CisgICAgY2FzZSBUQUJMRToKKyAg
ICBjYXNlIEJPWDoKKyAgICBjYXNlIEZMRVg6CisgICAgY2FzZSBHUklEOgorICAgICAgICByZXR1
cm4gZGlzcGxheTsKKworICAgIGNhc2UgTElTVF9JVEVNOgorICAgICAgICAvLyBJdCBpcyBhIFdp
bklFIGJ1ZyB0aGF0IGZsb2F0ZWQgbGlzdCBpdGVtcyBsb3NlIHRoZWlyIGJ1bGxldHMsIHNvIHdl
J2xsIGVtdWxhdGUgdGhlIHF1aXJrLCBidXQgb25seSBpbiBxdWlya3MgbW9kZS4KKyAgICAgICAg
aWYgKCFzdHJpY3RQYXJzaW5nICYmIGlzRmxvYXRpbmcpCisgICAgICAgICAgICByZXR1cm4gQkxP
Q0s7CisgICAgICAgIHJldHVybiBkaXNwbGF5OworICAgIGNhc2UgSU5MSU5FX1RBQkxFOgorICAg
ICAgICByZXR1cm4gVEFCTEU7CisgICAgY2FzZSBJTkxJTkVfQk9YOgorICAgICAgICByZXR1cm4g
Qk9YOworICAgIGNhc2UgSU5MSU5FX0ZMRVg6CisgICAgICAgIHJldHVybiBGTEVYOworICAgIGNh
c2UgSU5MSU5FX0dSSUQ6CisgICAgICAgIHJldHVybiBHUklEOworCisgICAgY2FzZSBJTkxJTkU6
CisgICAgY2FzZSBSVU5fSU46CisgICAgY2FzZSBDT01QQUNUOgorICAgIGNhc2UgSU5MSU5FX0JM
T0NLOgorICAgIGNhc2UgVEFCTEVfUk9XX0dST1VQOgorICAgIGNhc2UgVEFCTEVfSEVBREVSX0dS
T1VQOgorICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgorICAgIGNhc2UgVEFCTEVfUk9XOgor
ICAgIGNhc2UgVEFCTEVfQ09MVU1OX0dST1VQOgorICAgIGNhc2UgVEFCTEVfQ09MVU1OOgorICAg
IGNhc2UgVEFCTEVfQ0VMTDoKKyAgICBjYXNlIFRBQkxFX0NBUFRJT046CisgICAgICAgIHJldHVy
biBCTE9DSzsKKyAgICBjYXNlIE5PTkU6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICByZXR1cm4gTk9ORTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgcmV0dXJuIEJMT0NLOworfQorCisvLyBDU1MgcmVxdWlyZXMgdGV4dC1kZWNvcmF0aW9uIHRv
IGJlIHJlc2V0IGF0IGVhY2ggRE9NIGVsZW1lbnQgZm9yIHRhYmxlcywgCisvLyBpbmxpbmUgYmxv
Y2tzLCBpbmxpbmUgdGFibGVzLCBydW4taW5zLCBzaGFkb3cgRE9NIGNyb3NzaW5ncywgZmxvYXRp
bmcgZWxlbWVudHMsCisvLyBhbmQgYWJzb2x1dGUgb3IgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVs
ZW1lbnRzLgorc3RhdGljIGJvb2wgZG9lc05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihSZW5kZXJT
dHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpCit7CisgICAgcmV0dXJuIHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBSVU5fSU4KKyAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVf
QkxPQ0sgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9YIHx8IGlzQXRTaGFkb3dCb3Vu
ZGFyeShlKQorICAgICAgICB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8IHN0eWxlLT5oYXNPdXRP
ZkZsb3dQb3NpdGlvbigpOworfQorCitzdGF0aWMgYm9vbCBpc0Rpc3BsYXlGbGV4aWJsZUJveChF
RGlzcGxheSBkaXNwbGF5KQoreworICAgIHJldHVybiBkaXNwbGF5ID09IEZMRVggfHwgZGlzcGxh
eSA9PSBJTkxJTkVfRkxFWDsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGp1c3RSZW5kZXJT
dHlsZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVu
dCAqZSkKK3sKKyAgICBBU1NFUlQocGFyZW50U3R5bGUpOworCisgICAgLy8gQ2FjaGUgb3VyIG9y
aWdpbmFsIGRpc3BsYXkuCisgICAgc3R5bGUtPnNldE9yaWdpbmFsRGlzcGxheShzdHlsZS0+ZGlz
cGxheSgpKTsKKworICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpICE9IE5PTkUpIHsKKyAgICAgICAg
Ly8gSWYgd2UgaGF2ZSBhIDx0ZD4gdGhhdCBzcGVjaWZpZXMgYSBmbG9hdCBwcm9wZXJ0eSwgaW4g
cXVpcmtzIG1vZGUgd2UganVzdCBkcm9wIHRoZSBmbG9hdAorICAgICAgICAvLyBwcm9wZXJ0eS4K
KyAgICAgICAgLy8gU2l0ZXMgYWxzbyBjb21tb25seSB1c2UgZGlzcGxheTppbmxpbmUvYmxvY2sg
b24gPHRkPnMgYW5kIDx0YWJsZT5zLiBJbiBxdWlya3MgbW9kZSB3ZSBmb3JjZQorICAgICAgICAv
LyB0aGVzZSB0YWdzIHRvIHJldGFpbiB0aGVpciBkaXNwbGF5IHR5cGVzLgorICAgICAgICBpZiAo
ZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkgJiYgZSkgeworICAgICAgICAgICAgaWYgKGUtPmhh
c1RhZ05hbWUodGRUYWcpKSB7CisgICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFC
TEVfQ0VMTCk7CisgICAgICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOwor
ICAgICAgICAgICAgfSBlbHNlIGlmIChlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSkKKyAgICAgICAg
ICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShzdHlsZS0+aXNEaXNwbGF5SW5saW5lVHlwZSgpID8g
SU5MSU5FX1RBQkxFIDogVEFCTEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGUgJiYgKGUt
Pmhhc1RhZ05hbWUodGRUYWcpIHx8IGUtPmhhc1RhZ05hbWUodGhUYWcpKSkgeworICAgICAgICAg
ICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gS0hUTUxfTk9XUkFQKSB7CisgICAgICAgICAg
ICAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBhcmUgcmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYgd2Ug
c2hvdWxkIGp1c3QKKyAgICAgICAgICAgICAgICAvLyB1c2Ugbm9ybWFsIGluc3RlYWQuIElmIHRo
ZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBmaXhlZCwgdGhlbgorICAgICAgICAgICAgICAgIC8vIHdl
IGRvbid0IGFjdHVhbGx5IHVzZSBOT1dSQVAuCisgICAgICAgICAgICAgICAgaWYgKHN0eWxlLT53
aWR0aCgpLmlzRml4ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3Bh
Y2UoTk9STUFMKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0
eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JBUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwor
ICAgICAgICAvLyBUYWJsZXMgbmV2ZXIgc3VwcG9ydCB0aGUgLXdlYmtpdC0qIHZhbHVlcyBmb3Ig
dGV4dC1hbGlnbiBhbmQgd2lsbCByZXNldCBiYWNrIHRvIHRoZSBkZWZhdWx0LgorICAgICAgICBp
ZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSAmJiAoc3R5bGUtPnRleHRBbGlnbigpID09
IFdFQktJVF9MRUZUIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfQ0VOVEVSIHx8IHN0
eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dFRleHRBbGlnbihUQVNUQVJUKTsKKworICAgICAgICAvLyBGcmFtZXMgYW5kIGZyYW1lc2V0cyBu
ZXZlciBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlvbjphYnNvbHV0ZS4gVGhpcyBp
cyBuZWNlc3NhcnkgdG8KKyAgICAgICAgLy8gZml4IGEgY3Jhc2ggd2hlcmUgYSBzaXRlIHRyaWVz
IHRvIHBvc2l0aW9uIHRoZXNlIG9iamVjdHMuIFRoZXkgYWxzbyBuZXZlciBob25vciBkaXNwbGF5
LgorICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZS0+aGFzVGFn
TmFtZShmcmFtZXNldFRhZykpKSB7CisgICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3Rh
dGljUG9zaXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gUnVieSB0ZXh0IGRvZXMgbm90IHN1cHBvcnQgZmxvYXQgb3Ig
cG9zaXRpb24uIFRoaXMgbWlnaHQgY2hhbmdlIHdpdGggZXZvbHV0aW9uIG9mIHRoZSBzcGVjaWZp
Y2F0aW9uLgorICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHJ0VGFnKSkgeworICAgICAg
ICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHN0
eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1F
OiBXZSBzaG91bGRuJ3QgYmUgb3ZlcnJpZGluZyBzdGFydC8td2Via2l0LWF1dG8gbGlrZSB0aGlz
LiBEbyBpdCBpbiBodG1sLmNzcyBpbnN0ZWFkLgorICAgICAgICAvLyBUYWJsZSBoZWFkZXJzIHdp
dGggYSB0ZXh0LWFsaWduIG9mIC13ZWJraXQtYXV0byB3aWxsIGNoYW5nZSB0aGUgdGV4dC1hbGln
biB0byBjZW50ZXIuCisgICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGhUYWcpICYmIHN0
eWxlLT50ZXh0QWxpZ24oKSA9PSBUQVNUQVJUKQorICAgICAgICAgICAgc3R5bGUtPnNldFRleHRB
bGlnbihDRU5URVIpOworCisgICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUobGVnZW5kVGFn
KSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKKworICAgICAgICAvLyBB
YnNvbHV0ZS9maXhlZCBwb3NpdGlvbmVkIGVsZW1lbnRzLCBmbG9hdGluZyBlbGVtZW50cyBhbmQg
dGhlIGRvY3VtZW50IGVsZW1lbnQgbmVlZCBibG9jay1saWtlIG91dHNpZGUgZGlzcGxheS4KKyAg
ICAgICAgaWYgKHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpIHx8IHN0eWxlLT5pc0Zsb2F0
aW5nKCkgfHwgKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxl
LT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1bWVudCgpLT5pblF1aXJrc01v
ZGUoKSkpOworCisgICAgICAgIC8vIEZJWE1FOiBEb24ndCBzdXBwb3J0IHRoaXMgbXV0YXRpb24g
Zm9yIHBzZXVkbyBzdHlsZXMgbGlrZSBmaXJzdC1sZXR0ZXIgb3IgZmlyc3QtbGluZSwgc2luY2Ug
aXQncyBub3QgY29tcGxldGVseQorICAgICAgICAvLyBjbGVhciBob3cgdGhhdCBzaG91bGQgd29y
ay4KKyAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0eWxlLT5zdHls
ZVR5cGUoKSA9PSBOT1BTRVVETyAmJiBzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBwYXJlbnRTdHls
ZS0+d3JpdGluZ01vZGUoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9C
TE9DSyk7CisKKyAgICAgICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyB0aGUgZGlzcGxheSBtdXRhdGlv
biwgY2hlY2sgdGFibGUgcm93cy4gV2UgZG8gbm90IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9y
IHBvc2l0aW9uOnN0aWNreSBvbgorICAgICAgICAvLyB0YWJsZSByb3dzIG9yIGNlbGxzLiBUaGlz
IGhhcyBiZWVuIGVzdGFibGlzaGVkIGZvciBwb3NpdGlvbjpyZWxhdGl2ZSBpbiBDU1MyLjEgKGFu
ZCBjYXVzZWQgYSBjcmFzaCBpbiBjb250YWluaW5nQmxvY2soKQorICAgICAgICAvLyBvbiBzb21l
IHNpdGVzKS4KKyAgICAgICAgaWYgKChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9H
Uk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAorICAgICAgICAgICAg
fHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9ST1cpCisgICAgICAgICAgICAmJiBzdHlsZS0+aGFzSW5GbG93UG9zaXRp
b24oKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7CisK
KyAgICAgICAgLy8gd3JpdGluZy1tb2RlIGRvZXMgbm90IGFwcGx5IHRvIHRhYmxlIHJvdyBncm91
cHMsIHRhYmxlIGNvbHVtbiBncm91cHMsIHRhYmxlIHJvd3MsIGFuZCB0YWJsZSBjb2x1bW5zLgor
ICAgICAgICAvLyBGSVhNRTogVGFibGUgY2VsbHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgcGVy
cGVuZGljdWxhciBvciBmbGlwcGVkIHdpdGggcmVzcGVjdCB0byB0aGUgdGFibGUsIHRob3VnaC4K
KyAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OIHx8IHN0eWxlLT5k
aXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfRk9PVEVSX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxF
X0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVyB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAorICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRV9DRUxMKQorICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKHBh
cmVudFN0eWxlLT53cml0aW5nTW9kZSgpKTsKKworICAgICAgICAvLyBGSVhNRTogU2luY2Ugd2Ug
ZG9uJ3Qgc3VwcG9ydCBibG9jay1mbG93IG9uIGZsZXhpYmxlIGJveGVzIHlldCwgZGlzYWxsb3cg
c2V0dGluZworICAgICAgICAvLyBvZiBibG9jay1mbG93IHRvIGFueXRoaW5nIG90aGVyIHRoYW4g
VG9wVG9Cb3R0b21Xcml0aW5nTW9kZS4KKyAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTQ2NDE4IC0gRmxleGlibGUgYm94IHN1cHBvcnQuCisgICAgICAg
IGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlICYmIChz
dHlsZS0+ZGlzcGxheSgpID09IEJPWCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gp
KQorICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKFRvcFRvQm90dG9tV3JpdGluZ01v
ZGUpOworCisgICAgICAgIGlmIChpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlz
cGxheSgpKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAg
ICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+
ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2Rl
KCkpKTsKKyAgICAgICAgfQorCisjaWYgRU5BQkxFKERJQUxPR19FTEVNRU5UKQorICAgICAgICAv
LyBQZXIgdGhlIHNwZWMsIHBvc2l0aW9uICdzdGF0aWMnIGFuZCAncmVsYXRpdmUnIGluIHRoZSB0
b3AgbGF5ZXIgY29tcHV0ZSB0byAnYWJzb2x1dGUnLgorICAgICAgICBpZiAoZSAmJiBlLT5pc0lu
VG9wTGF5ZXIoKSAmJiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RhdGljUG9zaXRpb24gfHwgc3R5
bGUtPnBvc2l0aW9uKCkgPT0gUmVsYXRpdmVQb3NpdGlvbikpIHsKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRQb3NpdGlvbihBYnNvbHV0ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRE
aXNwbGF5KEJMT0NLKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgLy8gTWFrZSBz
dXJlIG91ciB6LWluZGV4IHZhbHVlIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgb2JqZWN0IGlzIHBv
c2l0aW9uZWQuCisgICAgaWYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uICYm
ICFpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkKKyAgICAgICAg
c3R5bGUtPnNldEhhc0F1dG9aSW5kZXgoKTsKKworICAgIC8vIEF1dG8gei1pbmRleCBiZWNvbWVz
IDAgZm9yIHRoZSByb290IGVsZW1lbnQgYW5kIHRyYW5zcGFyZW50IG9iamVjdHMuIFRoaXMgcHJl
dmVudHMKKyAgICAvLyBjYXNlcyB3aGVyZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGJsZW5kZWQg
YXMgYSBzaW5nbGUgdW5pdCBlbmQgdXAgd2l0aCBhIG5vbi10cmFuc3BhcmVudAorICAgIC8vIG9i
amVjdCB3ZWRnZWQgaW4gYmV0d2VlbiB0aGVtLiBBdXRvIHotaW5kZXggYWxzbyBiZWNvbWVzIDAg
Zm9yIG9iamVjdHMgdGhhdCBzcGVjaWZ5IHRyYW5zZm9ybXMvbWFza3MvcmVmbGVjdGlvbnMuCisg
ICAgaWYgKHN0eWxlLT5oYXNBdXRvWkluZGV4KCkgJiYgKChlICYmIGUtPmRvY3VtZW50KCktPmRv
Y3VtZW50RWxlbWVudCgpID09IGUpCisgICAgICAgIHx8IHN0eWxlLT5vcGFjaXR5KCkgPCAxLjBm
CisgICAgICAgIHx8IHN0eWxlLT5oYXNUcmFuc2Zvcm1SZWxhdGVkUHJvcGVydHkoKQorICAgICAg
ICB8fCBzdHlsZS0+aGFzTWFzaygpCisgICAgICAgIHx8IHN0eWxlLT5jbGlwUGF0aCgpCisgICAg
ICAgIHx8IHN0eWxlLT5ib3hSZWZsZWN0KCkKKyAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigp
CisgICAgICAgIHx8IHN0eWxlLT5oYXNCbGVuZE1vZGUoKQorICAgICAgICB8fCBzdHlsZS0+cG9z
aXRpb24oKSA9PSBTdGlja3lQb3NpdGlvbgorICAgICAgICB8fCAoc3R5bGUtPnBvc2l0aW9uKCkg
PT0gRml4ZWRQb3NpdGlvbiAmJiBlICYmIGUtPmRvY3VtZW50KCktPnBhZ2UoKSAmJiBlLT5kb2N1
bWVudCgpLT5wYWdlKCktPnNldHRpbmdzKCktPmZpeGVkUG9zaXRpb25DcmVhdGVzU3RhY2tpbmdD
b250ZXh0KCkpCisjaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9XX1NDUk9MTElORykKKyAg
ICAgICAgLy8gVG91Y2ggb3ZlcmZsb3cgc2Nyb2xsaW5nIGNyZWF0ZXMgYSBzdGFja2luZyBjb250
ZXh0LgorICAgICAgICB8fCAoKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOIHx8IHN0eWxl
LT5vdmVyZmxvd1koKSAhPSBPSElEREVOKSAmJiBzdHlsZS0+dXNlVG91Y2hPdmVyZmxvd1Njcm9s
bGluZygpKQorI2VuZGlmCisjaWYgRU5BQkxFKERJQUxPR19FTEVNRU5UKQorICAgICAgICB8fCAo
ZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSkKKyNlbmRpZgorICAgICAgICApKQorICAgICAgICBzdHls
ZS0+c2V0WkluZGV4KDApOworCisgICAgLy8gVGV4dGFyZWEgY29uc2lkZXJzIG92ZXJmbG93IHZp
c2libGUgYXMgYXV0by4KKyAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRleHRhcmVhVGFnKSkg
eworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklT
SUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WCgpKTsKKyAgICAgICAgc3R5bGUtPnNldE92
ZXJmbG93WShzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5v
dmVyZmxvd1koKSk7CisgICAgfQorCisgICAgaWYgKGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRp
b24oc3R5bGUsIGUpKQorICAgICAgICBzdHlsZS0+c2V0VGV4dERlY29yYXRpb25zSW5FZmZlY3Qo
c3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOworICAgIGVsc2UKKyAgICAgICAgc3R5bGUtPmFkZFRv
VGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOworCisgICAg
Ly8gSWYgZWl0aGVyIG92ZXJmbG93IHZhbHVlIGlzIG5vdCB2aXNpYmxlLCBjaGFuZ2UgdG8gYXV0
by4KKyAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVy
Zmxvd1koKSAhPSBPTUFSUVVFRSkKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPTUFSUVVF
RSk7CisgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9NQVJRVUVFICYmIHN0eWxl
LT5vdmVyZmxvd1goKSAhPSBPTUFSUVVFRSkKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChP
TUFSUVVFRSk7CisgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFICYm
IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRSkgeworICAgICAgICAvLyBGSVhNRTogT25j
ZSB3ZSBpbXBsZW1lbnQgcGFnaW5hdGlvbiBjb250cm9scywgb3ZlcmZsb3cteCBzaG91bGQgZGVm
YXVsdCB0byBoaWRkZW4KKyAgICAgICAgLy8gaWYgb3ZlcmZsb3cteSBpcyBzZXQgdG8gLXdlYmtp
dC1wYWdlZC14IG9yIC13ZWJraXQtcGFnZS15LiBGb3Igbm93LCB3ZSdsbCBsZXQgaXQKKyAgICAg
ICAgLy8gZGVmYXVsdCB0byBhdXRvIHNvIHdlIGNhbiBhdCBsZWFzdCBzY3JvbGwgdGhyb3VnaCB0
aGUgcGFnZXMuCisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT0FVVE8pOworICAgIH0gZWxz
ZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1go
KSAhPSBPVklTSUJMRSkKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPQVVUTyk7CisKKyAg
ICAvLyBDYWxsIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKCkgaWYgYSBwYWdpbmF0aW9uIG1v
ZGUgaXMgc2V0IGZvciBhbnkgbm9uLXJvb3QgZWxlbWVudHMuIElmIHRoZXNlCisgICAgLy8gc3R5
bGVzIGFyZSBzcGVjaWZpZWQgb24gYSByb290IGVsZW1lbnQsIHRoZW4gdGhleSB3aWxsIGJlIGlu
Y29ycG9yYXRlZCBpbgorICAgIC8vIFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoKS4K
KyAgICBpZiAoKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURYIHx8IHN0eWxlLT5vdmVyZmxv
d1koKSA9PSBPUEFHRURZKSAmJiAhKGUgJiYgKGUtPmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgZS0+
aGFzVGFnTmFtZShib2R5VGFnKSkpKQorICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9k
ZShXZWJDb3JlOjpwYWdpbmF0aW9uTW9kZUZvclJlbmRlclN0eWxlKHN0eWxlKSwgc3R5bGUpOwor
CisgICAgLy8gVGFibGUgcm93cywgc2VjdGlvbnMgYW5kIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBz
dXBwb3J0IG92ZXJmbG93OmhpZGRlbiBhbmQgd2lsbCBpZ25vcmUgc2Nyb2xsL2F1dG8uCisgICAg
Ly8gRklYTUU6IEV2ZW50dWFsbHkgdGFibGUgc2VjdGlvbnMgd2lsbCBzdXBwb3J0IGF1dG8gYW5k
IHNjcm9sbC4KKyAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlz
cGxheSgpID09IElOTElORV9UQUJMRQorICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPV19HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVykgeworICAgICAg
ICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1go
KSAhPSBPSElEREVOKQorICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7
CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92
ZXJmbG93WSgpICE9IE9ISURERU4pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9W
SVNJQkxFKTsKKyAgICB9CisKKyAgICAvLyBNZW51bGlzdHMgc2hvdWxkIGhhdmUgdmlzaWJsZSBv
dmVyZmxvdworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkgewor
ICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKyAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WShPVklTSUJMRSk7CisgICAgfQorCisgICAgLy8gQ3VsbCBvdXQgYW55IHVzZWxl
c3MgbGF5ZXJzIGFuZCBhbHNvIHJlcGVhdCBwYXR0ZXJucyBpbnRvIGFkZGl0aW9uYWwgbGF5ZXJz
LgorICAgIHN0eWxlLT5hZGp1c3RCYWNrZ3JvdW5kTGF5ZXJzKCk7CisgICAgc3R5bGUtPmFkanVz
dE1hc2tMYXllcnMoKTsKKworICAgIC8vIERvIHRoZSBzYW1lIGZvciBhbmltYXRpb25zIGFuZCB0
cmFuc2l0aW9ucy4KKyAgICBzdHlsZS0+YWRqdXN0QW5pbWF0aW9ucygpOworICAgIHN0eWxlLT5h
ZGp1c3RUcmFuc2l0aW9ucygpOworCisgICAgLy8gSW1wb3J0YW50OiBJbnRyaW5zaWMgbWFyZ2lu
cyBnZXQgYWRkZWQgdG8gY29udHJvbHMgYmVmb3JlIHRoZSB0aGVtZSBoYXMgYWRqdXN0ZWQgdGhl
IHN0eWxlLCBzaW5jZSB0aGUgdGhlbWUgd2lsbAorICAgIC8vIGFsdGVyIGZvbnRzIGFuZCBoZWln
aHRzL3dpZHRocy4KKyAgICBpZiAoZSAmJiBlLT5pc0Zvcm1Db250cm9sRWxlbWVudCgpICYmIHN0
eWxlLT5mb250U2l6ZSgpID49IDExKSB7CisgICAgICAgIC8vIERvbid0IGFwcGx5IGludHJpbnNp
YyBtYXJnaW5zIHRvIGltYWdlIGJ1dHRvbnMuIFRoZSBkZXNpZ25lciBrbm93cyBob3cgYmlnIHRo
ZSBpbWFnZXMgYXJlLAorICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHRyZWF0IGFsbCBpbWFnZSBi
dXR0b25zIGFzIHRob3VnaCB0aGV5IHdlcmUgZXhwbGljaXRseSBzaXplZC4KKyAgICAgICAgaWYg
KCFlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSB8fCAhc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVu
dCo+KGUpLT5pc0ltYWdlQnV0dG9uKCkpCisgICAgICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5z
KHN0eWxlKTsKKyAgICB9CisKKyAgICAvLyBMZXQgdGhlIHRoZW1lIGFsc28gaGF2ZSBhIGNyYWNr
IGF0IGFkanVzdGluZyB0aGUgc3R5bGUuCisgICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkp
CisgICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWRqdXN0U3R5bGUodGhpcywg
c3R5bGUsIGUsIG1fc3RhdGUuaGFzVUFBcHBlYXJhbmNlKCksIG1fc3RhdGUuYm9yZGVyRGF0YSgp
LCBtX3N0YXRlLmJhY2tncm91bmREYXRhKCksIG1fc3RhdGUuYmFja2dyb3VuZENvbG9yKCkpOwor
CisgICAgLy8gSWYgd2UgaGF2ZSBmaXJzdC1sZXR0ZXIgcHNldWRvIHN0eWxlLCBkbyBub3Qgc2hh
cmUgdGhpcyBzdHlsZS4KKyAgICBpZiAoc3R5bGUtPmhhc1BzZXVkb1N0eWxlKEZJUlNUX0xFVFRF
UikpCisgICAgICAgIHN0eWxlLT5zZXRVbmlxdWUoKTsKKworICAgIC8vIEZJWE1FOiB3aGVuIGRy
b3BwaW5nIHRoZSAtd2Via2l0IHByZWZpeCBvbiB0cmFuc2Zvcm0tc3R5bGUsIHdlIHNob3VsZCBh
bHNvIGhhdmUgb3BhY2l0eSA8IDEgY2F1c2UgZmxhdHRlbmluZy4KKyAgICBpZiAoc3R5bGUtPnBy
ZXNlcnZlczNEKCkgJiYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRQorICAgICAgICB8
fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUKKyAgICAgICAgfHwgc3R5bGUtPmhhc0Zp
bHRlcigpKSkKKyAgICAgICAgc3R5bGUtPnNldFRyYW5zZm9ybVN0eWxlM0QoVHJhbnNmb3JtU3R5
bGUzREZsYXQpOworCisgICAgLy8gU2VhbWxlc3MgaWZyYW1lcyBiZWhhdmUgbGlrZSBibG9ja3Mu
IE1hcCB0aGVpciBkaXNwbGF5IHRvIGlubGluZS1ibG9jayB3aGVuIG1hcmtlZCBpbmxpbmUuCisg
ICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpICYmIHN0eWxlLT5kaXNwbGF5KCkg
PT0gSU5MSU5FICYmIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVtZW50Kj4oZSktPnNob3VsZERp
c3BsYXlTZWFtbGVzc2x5KCkpCisgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9D
Syk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChlICYmIGUtPmlzU1ZHRWxlbWVudCgpKSB7
CisgICAgICAgIC8vIFNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwj
T3ZlcmZsb3dQcm9wZXJ0eQorICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9TQ1JP
TEwpCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9ISURERU4pOworICAgICAgICBl
bHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgp
ID09IE9TQ1JPTEwpCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOwor
ICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT0FVVE8pCisgICAgICAgICAg
ICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBy
b290IDxzdmc+IGVsZW1lbnQgaW4gYW4gU1ZHIGRvY3VtZW50IGZyYWdtZW50IHRyZWUgaG9ub3Jz
IGNzcyBwb3NpdGlvbgorICAgICAgICBpZiAoIShlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdU
YWcpICYmIGUtPnBhcmVudE5vZGUoKSAmJiAhZS0+cGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQo
KSkpCisgICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oUmVuZGVyU3R5bGU6OmluaXRpYWxQ
b3NpdGlvbigpKTsKKworICAgICAgICAvLyBSZW5kZXJTVkdSb290IGhhbmRsZXMgem9vbWluZyBm
b3IgdGhlIHdob2xlIFNWRyBzdWJ0cmVlLCBzbyBmb3JlaWduT2JqZWN0IGNvbnRlbnQgc2hvdWxk
CisgICAgICAgIC8vIG5vdCBiZSBzY2FsZWQgYWdhaW4uCisgICAgICAgIGlmIChlLT5oYXNUYWdO
YW1lKFNWR05hbWVzOjpmb3JlaWduT2JqZWN0VGFnKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRF
ZmZlY3RpdmVab29tKFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgpKTsKKyAgICB9CisjZW5kaWYK
K30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lv
bkVsZW1lbnQpCit7CisgICAgLy8gRklYTUUgKEJVRyA3MjQ3Mik6IFdlIGRvbid0IGFkZCBALXdl
YmtpdC1yZWdpb24gcnVsZXMgb2Ygc2NvcGVkIHN0eWxlIHNoZWV0cyBmb3IgdGhlIG1vbWVudCwK
KyAgICAvLyBzbyBhbGwgcmVnaW9uIHJ1bGVzIGFyZSBnbG9iYWwgYnkgZGVmYXVsdC4gVmVyaWZ5
IHdoZXRoZXIgdGhhdCBjYW4gc3RhbmQgb3IgbmVlZHMgY2hhbmdpbmcuCisKKyAgICB1bnNpZ25l
ZCBydWxlc1NpemUgPSBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3Jz
QW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1Np
emU7ICsraSkgeworICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3Jl
Z2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOworICAgICAgICBp
ZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9u
U2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1fcnVsZVNldHMudXNlclN0
eWxlKCkpIHsKKyAgICAgICAgcnVsZXNTaXplID0gbV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgeworICAgICAgICAgICAgQVNTRVJUKG1fcnVsZVNl
dHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNl
dC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRz
LnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9y
LCByZWdpb25FbGVtZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tGb3JP
cmllbnRhdGlvbkNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgRm9udE9yaWVudGF0
aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAgICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3Jp
ZW50YXRpb247CisgICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oc3R5bGUsIGZvbnRPcmll
bnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7CisKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24m
IGZvbnREZXNjcmlwdGlvbiA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoZm9u
dERlc2NyaXB0aW9uLm9yaWVudGF0aW9uKCkgPT0gZm9udE9yaWVudGF0aW9uICYmIGZvbnREZXNj
cmlwdGlvbi5ub25DSktHbHlwaE9yaWVudGF0aW9uKCkgPT0gZ2x5cGhPcmllbnRhdGlvbikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihm
b250RGVzY3JpcHRpb24pOworICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9y
aWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOworICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRP
cmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24obmV3Rm9udERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjp1cGRhdGVG
b250KCkKK3sKKyAgICBpZiAoIW1fc3RhdGUuZm9udERpcnR5KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fc3RhdGUuc3R5bGUoKTsKKyAgICBjaGVja0Zv
ckdlbmVyaWNGYW1pbHlDaGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFyZW50U3R5bGUoKSk7CisgICAg
Y2hlY2tGb3Jab29tQ2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVudFN0eWxlKCkpOworICAgIGNo
ZWNrRm9yT3JpZW50YXRpb25DaGFuZ2Uoc3R5bGUpOworICAgIHN0eWxlLT5mb250KCkudXBkYXRl
KG1fZm9udFNlbGVjdG9yKTsKKyAgICBtX3N0YXRlLnNldEZvbnREaXJ0eShmYWxzZSk7Cit9CisK
K1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlUnVsZXNGb3JFbGVt
ZW50KEVsZW1lbnQqIGUsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlKQoreworICAgIHJldHVybiBw
c2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChlLCBOT1BTRVVETywgcnVsZXNUb0luY2x1ZGUpOwor
fQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZVJ1
bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCBQc2V1ZG9JZCBwc2V1ZG9JZCwgdW5zaWduZWQgcnVs
ZXNUb0luY2x1ZGUpCit7CisgICAgaWYgKCFlIHx8ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVz
aGVldHNMb2FkZWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtX3N0YXRlLnNldE1vZGUo
U2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOworCisgICAgaW5pdEVsZW1lbnQoZSk7
CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVk
b0lkKTsKKworICAgIE1hdGNoUmVzdWx0IGR1bW15OworICAgIGlmIChydWxlc1RvSW5jbHVkZSAm
IFVBQW5kVXNlckNTU1J1bGVzKSB7CisgICAgICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZy
b20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgICAgIG1hdGNoVUFSdWxlcyhkdW1teSk7CisK
KyAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCisgICAgICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1
bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworICAgIH0KKworICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNUb0luY2x1ZGUgJiBBdXRob3JDU1NS
dWxlcykpIHsKKyAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNs
dWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOworCisgICAgICAgIC8vIENoZWNrIHRoZSBydWxl
cyBpbiBhdXRob3Igc2hlZXRzLgorICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxl
c1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworCisgICAgICAgIG1fc3RhdGUuc2V0U2FtZU9y
aWdpbk9ubHkoZmFsc2UpOworICAgIH0KKworICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNo
ZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKworICAgIHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlz
dCgpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBS
dWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYg
ZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZp
b3JBdEJvdW5kYXJ5KQoreworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAo
cnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKKyAgICAgICAgLy8gV2Uga25v
dyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KKyAg
ICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURP
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmlj
aWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNl
IHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KKyAgICAgICAgLy8gVGhpcyBpcyBsaW1p
dGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2Uu
CisgICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJh
c2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Cisg
ICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNlbGVjdG9yKCkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bGVEYXRhLnNl
bGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2Vy
Ojp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5h
bWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFNlbGVjdG9yQ2hlY2tl
ckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0
YXRlLmVsZW1lbnQoKSk7CisgICAgICAgIGlmICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0
Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsK
KyAgICB9CisKKyAgICAvLyBTbG93IHBhdGguCisgICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9y
Q2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOworICAgIFNlbGVjdG9yQ2hlY2tlcjo6
U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0
ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7CisgICAg
Y29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOworICAgIGNvbnRleHQuc2NvcGUg
PSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVkb0lkID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkucHNldWRvSWQ7CisgICAgY29udGV4dC5zY3JvbGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJl
cXVlc3QoKS5zY3JvbGxiYXI7CisgICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNl
dWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKKyAgICBjb250ZXh0LmJlaGF2aW9yQXRC
b3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKKyAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNo
IG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERP
TVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKKyAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JD
aGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAo
c3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUu
cHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6
OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBF
bGVtZW50KiByZWdpb25FbGVtZW50KQoreworICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJl
Z2lvbkVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNlbGVjdG9yQ2hlY2tl
ciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5tb2RlKCkpOworICAgIGZvciAo
Y29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9y
TGlzdDo6bmV4dChzKSkgeworICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tp
bmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVj
dG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOworICAgICAgICBQc2V1ZG9JZCBpZ25v
cmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIu
bWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNp
YmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0
Y2hlcykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxz
ZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhpcyBpcyBtb3N0
bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBhcHBseSBhIGNlcnRhaW4gcnVsZSB0byB0aGUgcmVu
ZGVyc3R5bGUuLi4KKworTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0ludExlbmd0aChD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCit7CisgICAgcmV0dXJuIHBy
aW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVn
ZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8
IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0eWxl
LCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Cit9CisKK0xlbmd0
aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHls
ZSwgZG91YmxlIG11bHRpcGxpZXIpCit7CisgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJp
bWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEZsb2F0Q29udmVyc2lvbiB8IFBlcmNl
bnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24g
fCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBs
aWVyKSA6IExlbmd0aChVbmRlZmluZWQpOworfQorCit0ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6
U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9w
ZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVs
ZSwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlz
dFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAgIEFTU0VSVCgocHJvcGVydHlXaGl0
ZWxpc3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uKSB8fCBtX3N0YXRlLnJlZ2lvbkZv
clN0eWxpbmcoKSk7CisgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nlc3NSdWxlKGRvY3VtZW50KCksIHJ1
bGUsIHRoaXMpOworCisgICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHByb3BlcnRpZXMtPnBy
b3BlcnR5Q291bnQoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3Vu
dDsgKytpKSB7CisgICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIGN1
cnJlbnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUF0KGkpOworICAgICAgICBpZiAoaXNJbXBvcnRh
bnQgIT0gY3VycmVudC5pc0ltcG9ydGFudCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIGlmIChpbmhlcml0ZWRPbmx5ICYmICFjdXJyZW50LmlzSW5oZXJpdGVkKCkpIHsKKyAgICAg
ICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBleHBsaWNpdGx5IGluaGVyaXRlZCwg
d2UgbmVlZCB0byBhcHBseSBmdXJ0aGVyIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcworICAgICAg
ICAgICAgLy8gYXMgdGhleSBtaWdodCBvdmVycmlkZSB0aGUgdmFsdWUgaW5oZXJpdGVkIGhlcmUu
IEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBhbGxvdyBkZWNsYXJhdGlvbnMgd2l0aAorICAgICAg
ICAgICAgLy8gZXhwbGljaXRseSBpbmhlcml0ZWQgcHJvcGVydGllcyB0byBiZSBjYWNoZWQuCisg
ICAgICAgICAgICBBU1NFUlQoIWN1cnJlbnQudmFsdWUoKS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIENTU1Byb3BlcnR5SUQg
cHJvcGVydHkgPSBjdXJyZW50LmlkKCk7CisKKyAgICAgICAgaWYgKHByb3BlcnR5V2hpdGVsaXN0
VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbiAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxp
ZFJlZ2lvblN0eWxlUHJvcGVydHkocHJvcGVydHkpKQorICAgICAgICAgICAgY29udGludWU7Cisj
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgICAgICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBl
ID09IFByb3BlcnR5V2hpdGVsaXN0Q3VlICYmICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5
bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyNlbmRpZgorICAg
ICAgICBzd2l0Y2ggKHBhc3MpIHsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAg
Y2FzZSBWYXJpYWJsZURlZmluaXRpb25zOgorICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NT
UHJvcGVydHlWYXJpYWJsZSA8IGZpcnN0Q1NTUHJvcGVydHksIENTU192YXJpYWJsZV9pc19iZWZv
cmVfZmlyc3RfcHJvcGVydHkpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IENTU1Byb3Bl
cnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCks
IGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBj
YXNlIEhpZ2hQcmlvcml0eVByb3BlcnRpZXM6CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChm
aXJzdENTU1Byb3BlcnR5ID09IENTU1Byb3BlcnR5Q29sb3IsIENTU19jb2xvcl9pc19maXJzdF9w
cm9wZXJ0eSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVpvb20gPT0g
Q1NTUHJvcGVydHlDb2xvciArIDE3LCBDU1Nfem9vbV9pc19lbmRfb2ZfZmlyc3RfcHJvcF9yYW5n
ZSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eUxpbmVIZWlnaHQgPT0g
Q1NTUHJvcGVydHlab29tICsgMSwgQ1NTX2xpbmVfaGVpZ2h0X2lzX2FmdGVyX3pvb20pOworI2lm
IEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IENTU1By
b3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYKKyAgICAg
ICAgICAgIC8vIGdpdmUgc3BlY2lhbCBwcmlvcml0eSB0byBmb250LXh4eCwgY29sb3IgcHJvcGVy
dGllcywgZXRjCisgICAgICAgICAgICBpZiAocHJvcGVydHkgPCBDU1NQcm9wZXJ0eUxpbmVIZWln
aHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQu
dmFsdWUoKSk7CisgICAgICAgICAgICAvLyB3ZSBhcHBseSBsaW5lLWhlaWdodCBsYXRlcgorICAg
ICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQorICAg
ICAgICAgICAgICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKGN1cnJlbnQudmFsdWUoKSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMb3dQcmlvcml0eVByb3BlcnRpZXM6
CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPiBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAg
ICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7
CisgICAgICAgIH0KKyAgICB9CisgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRQcm9j
ZXNzUnVsZShjb29raWUpOworfQorCit0ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBs
aWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVy
dGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGJvb2wgaXNJbXBvcnRhbnQsIGlu
dCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSkKK3sKKyAgICBp
ZiAoc3RhcnRJbmRleCA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKKyAgICBpZiAoc3RhdGUuc3R5bGUoKS0+aW5zaWRlTGluaygpICE9IE5vdElu
c2lkZUxpbmspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5k
ZXg7ICsraSkgeworICAgICAgICAgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQ
cm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07CisgICAgICAgICAg
ICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gbWF0Y2hlZFByb3BlcnRpZXMubGlua01hdGNoVHlw
ZTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlciB0byBwYXNzIHRoZXNl
IGFzIGFyZ3VtZW50cyBidXQgdGhhdCByZXF1aXJlcyBjaGFuZ2VzIGluIG1hbnkgcGxhY2VzLgor
ICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGxpbmtNYXRj
aFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoTGluayk7CisgICAgICAgICAgICBzdGF0ZS5z
ZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3Rv
ckNoZWNrZXI6Ok1hdGNoVmlzaXRlZCk7CisKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydGllczxw
YXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRj
aGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9w
ZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKKyAg
ICAgICAgfQorICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1
ZSk7CisgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFs
c2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4
OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKKyAgICAgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMm
IG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07Cisg
ICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVz
LmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0
ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0
aWVzLndoaXRlbGlzdFR5cGUpKTsKKyAgICB9Cit9CisKK3Vuc2lnbmVkIFN0eWxlUmVzb2x2ZXI6
OmNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqIHBy
b3BlcnRpZXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgCisgICAgcmV0dXJuIFN0cmluZ0hhc2hl
cjo6aGFzaE1lbW9yeShwcm9wZXJ0aWVzLCBzaXplb2YoTWF0Y2hlZFByb3BlcnRpZXMpICogc2l6
ZSk7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdl
cyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCit7CisgICAgcmV0dXJu
IGEuZmlyc3RVQVJ1bGUgPT0gYi5maXJzdFVBUnVsZQorICAgICAgICAmJiBhLmxhc3RVQVJ1bGUg
PT0gYi5sYXN0VUFSdWxlCisgICAgICAgICYmIGEuZmlyc3RBdXRob3JSdWxlID09IGIuZmlyc3RB
dXRob3JSdWxlCisgICAgICAgICYmIGEubGFzdEF1dGhvclJ1bGUgPT0gYi5sYXN0QXV0aG9yUnVs
ZQorICAgICAgICAmJiBhLmZpcnN0VXNlclJ1bGUgPT0gYi5maXJzdFVzZXJSdWxlCisgICAgICAg
ICYmIGEubGFzdFVzZXJSdWxlID09IGIubGFzdFVzZXJSdWxlOworfQorCitib29sIG9wZXJhdG9y
IT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoUmFuZ2VzJiBiKQoreworICAgIHJldHVybiAhKGEgPT0gYik7Cit9CisKK2Jvb2wg
b3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29u
c3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGIpCit7CisgICAgcmV0dXJuIGEu
cHJvcGVydGllcyA9PSBiLnByb3BlcnRpZXMgJiYgYS5saW5rTWF0Y2hUeXBlID09IGIubGlua01h
dGNoVHlwZTsKK30KKworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNo
ZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYg
YikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOworfQorCitjb25zdCBTdHlsZVJlc29sdmVyOjpN
YXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogU3R5bGVSZXNvbHZlcjo6ZmluZEZyb21NYXRjaGVk
UHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJl
c3VsdCkKK3sKKyAgICBBU1NFUlQoaGFzaCk7CisKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hl
OjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5maW5kKGhhc2gpOworICAg
IGlmIChpdCA9PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCkpCisgICAgICAgIHJldHVy
biAwOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtJiBjYWNoZUl0ZW0gPSBpdC0+dmFs
dWU7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNp
emUoKTsKKyAgICBpZiAoc2l6ZSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsr
aSkgeworICAgICAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXNbaV0gIT0gY2Fj
aGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzW2ldKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorICAgIGlmIChjYWNoZUl0ZW0ucmFuZ2VzICE9IG1hdGNoUmVzdWx0LnJhbmdlcykKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICZjYWNoZUl0ZW07Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiBzdHls
ZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBN
YXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCit7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1h
dGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3ZWVwcyA9IDEwMDsKKyAgICBp
ZiAoKyttX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCA+PSBt
YXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5Td2VlcHMKKyAgICAgICAgJiYg
IW1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJ
blNlY29uZHMgPSA2MDsKKyAgICAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ci5zdGFydE9uZVNob3QobWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMp
OworICAgIH0KKworICAgIEFTU0VSVChoYXNoKTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hl
SXRlbSBjYWNoZUl0ZW07CisgICAgY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzLmFwcGVuZCht
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcyk7CisgICAgY2FjaGVJdGVtLnJhbmdlcyA9IG1h
dGNoUmVzdWx0LnJhbmdlczsKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FjaGUgdGhlIG9y
aWdpbmFsIFJlbmRlclN0eWxlIGluc3RhbmNlLiBJdCBtYXkgYmUgZnVydGhlciBtb2RpZmllZC4K
KyAgICAvLyBUaGUgUmVuZGVyU3R5bGUgaW4gdGhlIGNhY2hlIGlzIHJlYWxseSBqdXN0IGEgaG9s
ZGVyIGZvciB0aGUgc3Vic3RydWN0dXJlcyBhbmQgbmV2ZXIgdXNlZCBhcy1pcy4KKyAgICBjYWNo
ZUl0ZW0ucmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3R5bGUpOworICAgIGNhY2hl
SXRlbS5wYXJlbnRSZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShwYXJlbnRTdHlsZSk7
CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmFkZChoYXNoLCBjYWNoZUl0ZW0pOworfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OmludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCkK
K3sKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuY2xlYXIoKTsKK30KKworc3RhdGljIGJv
b2wgaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgRWxlbWVudCogZWxl
bWVudCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUpCit7CisgICAgLy8gRklYTUU6IENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGUgbW9k
aWZpZXMgc3RhdGUgd2hlbiBhcHBseWluZyB0byBkb2N1bWVudCBlbGVtZW50LiBXZSBjYW4ndCBz
a2lwIHRoZSBhcHBseWluZyBieSBjYWNoaW5nLgorICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQt
PmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpICYmIGVsZW1lbnQtPmRvY3VtZW50KCktPndy
aXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIGlmIChzdHlsZS0+dW5pcXVlKCkgfHwgKHN0eWxlLT5zdHlsZVR5cGUoKSAhPSBOT1BTRVVE
TyAmJiBwYXJlbnRTdHlsZS0+dW5pcXVlKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoc3R5bGUtPnpvb20oKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBSZW5kZXJTdHls
ZTo6aW5pdGlhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBU
aGUgY2FjaGUgYXNzdW1lcyBzdGF0aWMga25vd2xlZGdlIGFib3V0IHdoaWNoIHByb3BlcnRpZXMg
YXJlIGluaGVyaXRlZC4KKyAgICBpZiAocGFyZW50U3R5bGUtPmhhc0V4cGxpY2l0bHlJbmhlcml0
ZWRQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1h
dGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBB
U1NFUlQoZWxlbWVudCk7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICB1bnNpZ25l
ZCBjYWNoZUhhc2ggPSBtYXRjaFJlc3VsdC5pc0NhY2hlYWJsZSA/IGNvbXB1dGVNYXRjaGVkUHJv
cGVydGllc0hhc2gobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuZGF0YSgpLCBtYXRjaFJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpIDogMDsKKyAgICBib29sIGFwcGx5SW5oZXJp
dGVkT25seSA9IGZhbHNlOworICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBj
YWNoZUl0ZW0gPSAwOworICAgIGlmIChjYWNoZUhhc2ggJiYgKGNhY2hlSXRlbSA9IGZpbmRGcm9t
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KSkpIHsKKyAgICAg
ICAgLy8gV2UgY2FuIGJ1aWxkIHVwIHRoZSBzdHlsZSBieSBjb3B5aW5nIG5vbi1pbmhlcml0ZWQg
cHJvcGVydGllcyBmcm9tIGFuIGVhcmxpZXIgc3R5bGUgb2JqZWN0IGJ1aWx0IHVzaW5nIHRoZSBz
YW1lIGV4YWN0CisgICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0aW9ucy4gV2UgdGhlbiBvbmx5IG5l
ZWQgdG8gYXBwbHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBpZiBhbnksIGFzIHRoZWlyIHZh
bHVlcyBjYW4gZGVwZW5kIG9uIHRoZSAKKyAgICAgICAgLy8gZWxlbWVudCBjb250ZXh0LiBUaGlz
IGlzIGZhc3QgYW5kIHNhdmVzIG1lbW9yeSBieSByZXVzaW5nIHRoZSBzdHlsZSBkYXRhIHN0cnVj
dHVyZXMuCisgICAgICAgIHN0YXRlLnN0eWxlKCktPmNvcHlOb25Jbmhlcml0ZWRGcm9tKGNhY2hl
SXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworICAgICAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUo
KS0+aW5oZXJpdGVkRGF0YVNoYXJlZChjYWNoZUl0ZW0tPnBhcmVudFJlbmRlclN0eWxlLmdldCgp
KSAmJiAhaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpKSB7CisgICAgICAgICAgICBFSW5zaWRl
TGluayBsaW5rU3RhdHVzID0gc3RhdGUuc3R5bGUoKS0+aW5zaWRlTGluaygpOworICAgICAgICAg
ICAgLy8gSWYgdGhlIGNhY2hlIGl0ZW0gcGFyZW50IHN0eWxlIGhhcyBpZGVudGljYWwgaW5oZXJp
dGVkIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgcGFyZW50IHN0eWxlIHRoZW4gdGhlCisgICAg
ICAgICAgICAvLyByZXN1bHRpbmcgc3R5bGUgd2lsbCBiZSBpZGVudGljYWwgdG9vLiBXZSBjb3B5
IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcyBvdmVyIGZyb20gdGhlIGNhY2hlIGFuZCBhcmUgZG9u
ZS4KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKGNhY2hlSXRlbS0+cmVu
ZGVyU3R5bGUuZ2V0KCkpOworCisgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBsaW5r
IHN0YXR1cyBpcyB0cmVhdGVkIGxpa2UgYW4gaW5oZXJpdGVkIHByb3BlcnR5LiBXZSBuZWVkIHRv
IGV4cGxpY2l0bHkgcmVzdG9yZSBpdC4KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldElu
c2lkZUxpbmsobGlua1N0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gdHJ1ZTsgCisgICAgfQorCisjaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCisgICAgLy8gRmlyc3QgYXBwbHkgYWxsIHZhcmlhYmxlIGRlZmluaXRpb25z
LCBhcyB0aGV5IG1heSBiZSB1c2VkIGR1cmluZyBhcHBsaWNhdGlvbiBvZiBsYXRlciBwcm9wZXJ0
aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0
Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFy
aWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5m
aXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJ
bmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5p
dGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsK
KyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVz
dWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworI2VuZGlmCisKKyAgICAvLyBO
b3cgd2UgaGF2ZSBhbGwgb2YgdGhlIG1hdGNoZWQgcnVsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIG9y
ZGVyLiBXYWxrIHRoZSBydWxlcyBhbmQgYXBwbHkKKyAgICAvLyBoaWdoLXByaW9yaXR5IHByb3Bl
cnRpZXMgZmlyc3QsIGkuZS4sIHRob3NlIHByb3BlcnRpZXMgdGhhdCBvdGhlciBwcm9wZXJ0aWVz
IGRlcGVuZCBvbi4KKyAgICAvLyBUaGUgb3JkZXIgaXMgKDEpIGhpZ2gtcHJpb3JpdHkgbm90IGlt
cG9ydGFudCwgKDIpIGhpZ2gtcHJpb3JpdHkgaW1wb3J0YW50LCAoMykgbm9ybWFsIG5vdCBpbXBv
cnRhbnQKKyAgICAvLyBhbmQgKDQpIG5vcm1hbCBpbXBvcnRhbnQuCisgICAgc3RhdGUuc2V0TGlu
ZUhlaWdodFZhbHVlKDApOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5
UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlv
cml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmly
c3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9u
bHkpOworCisgICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5lZmZl
Y3RpdmVab29tKCkgIT0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKSB7CisgICAgICAg
IHN0YXRlLnNldEZvbnREaXJ0eSh0cnVlKTsKKyAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0g
ZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFk
IGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVp
Z2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4K
KyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisgICAgICAgIGFwcGx5UHJvcGVydHko
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7CisKKyAgICAv
LyBNYW55IHByb3BlcnRpZXMgZGVwZW5kIG9uIHRoZSBmb250LiBJZiBpdCBjaGFuZ2VzIHdlIGp1
c3QgYXBwbHkgYWxsIHByb3BlcnRpZXMuCisgICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0t
PnJlbmRlclN0eWxlLT5mb250RGVzY3JpcHRpb24oKSAhPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVz
Y3JpcHRpb24oKSkKKyAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisKKyAgICAv
LyBOb3cgZG8gdGhlIG5vcm1hbCBwcmlvcml0eSBVQSBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2Us
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgCisgICAgLy8gQ2FjaGUgb3VyIGJvcmRl
ciBhbmQgYmFja2dyb3VuZCBzbyB0aGF0IHdlIGNhbiBleGFtaW5lIHRoZW0gbGF0ZXIuCisgICAg
c3RhdGUuY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7CisgICAgCisgICAgLy8gTm93IGRvIHRo
ZSBhdXRob3IgYW5kIHVzZXIgbm9ybWFsIHByaW9yaXR5IHByb3BlcnRpZXMgYW5kIGFsbCB0aGUg
IWltcG9ydGFudCBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJp
b3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5s
YXN0VUFSdWxlICsgMSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwg
YXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9y
aXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVy
dGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxl
LCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwor
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJl
c3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5y
YW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgIAorICAgIC8vIFN0YXJ0
IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVu
ZGluZ1Jlc291cmNlcygpOworICAgIAorICAgIEFTU0VSVCghc3RhdGUuZm9udERpcnR5KCkpOwor
ICAgIAorICAgIGlmIChjYWNoZUl0ZW0gfHwgIWNhY2hlSGFzaCkKKyAgICAgICAgcmV0dXJuOwor
ICAgIGlmICghaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuZWxlbWVu
dCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpKSkKKyAgICAgICAgcmV0dXJu
OworICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5w
YXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKK30KKworc3RhdGljIGlubGlu
ZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0
eWxlUnVsZVBhZ2UqIHIyKQoreworICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNp
dHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVz
LCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5h
bWUpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPFN0
eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlz
dChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmly
c3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMu
YmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7CisKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykK
KyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUGFnZVJ1bGVzW2ld
LT5wcm9wZXJ0aWVzKCkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBv
bmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wg
aXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgZm9yIChjb25zdCBD
U1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0g
Y29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRj
aCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7CisgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcm
IGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5hbWUoKTsKKyAgICAgICAg
ICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIENTU1Nl
bGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsK
KyAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAm
JiAhaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9y
OjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9U
eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzRm9y
TGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJ1bGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0eWxlUnVsZVBhZ2UqIHJ1bGUgPSBydWxl
c1tpXTsKKworICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5z
ZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpKQorICAgICAgICAg
ICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMg
dG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgorICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0
KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOworICAgICAgICBpZiAoIXByb3BlcnRp
ZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgorICAg
ICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOworICAgIH0KK30KKworYm9vbCBTdHlsZVJl
c29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Cit7CisgICAgYm9vbCBpc0Zp
cnN0UGFnZUxlZnQgPSBmYWxzZTsKKyAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRy
dWU7CisKKyAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkp
ICUgMjsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4
KSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBh
Z2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KKyAgICBy
ZXR1cm4gKCFwYWdlSW5kZXgpOworfQorCitTdHJpbmcgU3R5bGVSZXNvbHZlcjo6cGFnZU5hbWUo
aW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBh
Z2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCisgICAgcmV0dXJuICIiOworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENT
U1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIGluaXRFbGVtZW50KDAp
OworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCAwLCBzdHlsZSk7
CisgICAgbV9zdGF0ZS5zZXRTdHlsZShzdHlsZSk7CisgICAgYXBwbHlQcm9wZXJ0eVRvQ3VycmVu
dFN0eWxlKGlkLCB2YWx1ZSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0
eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAg
ICBpZiAodmFsdWUpCisgICAgICAgIGFwcGx5UHJvcGVydHkoaWQsIHZhbHVlKTsKK30KKworaW5s
aW5lIGJvb2wgaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sK
KyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJSaWdodENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxs
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKKyNpZiBF
TkFCTEUoU1ZHKQorICAgIGNhc2UgQ1NTUHJvcGVydHlGaWxsOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlTdHJva2U6CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBodHRwOi8v
ZGV2LnczLm9yZy9jc3N3Zy9jc3MzLXJlZ2lvbnMvI3RoZS1hdC1yZWdpb24tc3R5bGUtcnVsZQor
Ly8gRklYTUU6IGFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBvdGhlciByZWdpb24gc3R5bGlu
ZyBwcm9wZXJ0aWVzLgoraW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0
eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29s
b3I6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmIEVOQUJMRShWSURFT19UUkFDSykK
K2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1By
b3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlv
blg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblk6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKKyAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9y
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFt
aWx5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250VmFyaWFudDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFdlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGluZUhlaWdodDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlP
dXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0
eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRTaGFkb3c6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZh
dWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlm
CisvLyBTVkcgaGFuZGxlcyB6b29taW5nIGluIGEgZGlmZmVyZW50IHdheSBjb21wYXJlZCB0byBD
U1MuIFRoZSB3aG9sZSBkb2N1bWVudCBpcyBzY2FsZWQgaW5zdGVhZAorLy8gb2YgZWFjaCBpbmRp
dmlkdWFsIGxlbmd0aCB2YWx1ZSBpbiB0aGUgcmVuZGVyIHN0eWxlIC8gdHJlZS4gQ1NTUHJpbWl0
aXZlVmFsdWU6OmNvbXB1dGVMZW5ndGgqKCkKKy8vIG11bHRpcGxpZXMgZWFjaCByZXNvbHZlZCBs
ZW5ndGggd2l0aCB0aGUgem9vbSBtdWx0aXBsaWVyIC0gc28gZm9yIFNWRyB3ZSBuZWVkIHRvIGRp
c2FibGUgdGhhdC4KKy8vIFRob3VnaCBhbGwgQ1NTIHZhbHVlcyB0aGF0IGNhbiBiZSBhcHBsaWVk
IHRvIG91dGVybW9zdCA8c3ZnPiBlbGVtZW50cyAod2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5n
Li4uKQorLy8gbmVlZCB0byByZXNwZWN0IHRoZSBzY2FsaW5nLiBSZW5kZXJCb3ggKHRoZSBwYXJl
bnQgY2xhc3Mgb2YgUmVuZGVyU1ZHUm9vdCkgZ3JhYnMgdmFsdWVzIGxpa2UKKy8vIHdpZHRoL2hl
aWdodC9ib3JkZXIvcGFkZGluZy8uLi4gZnJvbSB0aGUgUmVuZGVyU3R5bGUgLT4gZm9yIFNWRyB0
aGVzZSB2YWx1ZXMgd291bGQgbmV2ZXIgc2NhbGUsCisvLyBpZiB3ZSdkIHBhc3MgYSAxLjAgem9v
bSBmYWN0b3IgZXZlcnlod2VyZS4gU28gd2Ugb25seSBwYXNzIGEgem9vbSBmYWN0b3Igb2YgMS4w
IGZvciBzcGVjaWZpYworLy8gcHJvcGVydGllcyB0aGF0IGFyZSBOT1QgYWxsb3dlZCB0byBzY2Fs
ZSB3aXRoaW4gYSB6b29tZWQgU1ZHIGRvY3VtZW50IChsZXR0ZXIvd29yZC1zcGFjaW5nL2ZvbnQt
c2l6ZSkuCitib29sIFN0eWxlUmVzb2x2ZXI6OnVzZVNWR1pvb21SdWxlcygpCit7CisgICAgcmV0
dXJuIG1fc3RhdGUuZWxlbWVudCgpICYmIG1fc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQo
KTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChDU1NQcmltaXRpdmVW
YWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwg
TGVuZ3RoJiB3b3JraW5nTGVuZ3RoKQoreworICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1pbkNvbnRlbnQpIHsKKyAgICAgICAgd29ya2luZ0xlbmd0
aCA9IExlbmd0aChNaW5Db250ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlV2Via2l0TWF4Q29u
dGVudCkgeworICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3RoKE1heENvbnRlbnQpOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3b3JraW5nTGVuZ3RoID0gcHJpbWl0aXZl
VmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENv
bnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uIHwgQXV0b0NvbnZlcnNpb24+
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgc3RhdGUuc3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICBpZiAod29ya2luZ0xlbmd0aC5pc1VuZGVmaW5lZCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3Ro
KCkpCisgICAgICAgIHdvcmtpbmdMZW5ndGguc2V0UXVpcmsocHJpbWl0aXZlVmFsdWUtPmlzUXVp
cmtWYWx1ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVH
cmlkVHJhY2tNaW5NYXgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBT
dHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIEdyaWRUcmFja1NpemUmIHRyYWNrU2l6ZSkKK3sK
KyAgICBQYWlyKiBtaW5NYXhUcmFja0JyZWFkdGggPSBwcmltaXRpdmVWYWx1ZS0+Z2V0UGFpclZh
bHVlKCk7CisgICAgaWYgKCFtaW5NYXhUcmFja0JyZWFkdGgpIHsKKyAgICAgICAgTGVuZ3RoIHdv
cmtpbmdMZW5ndGg7CisgICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChwcmltaXRp
dmVWYWx1ZSwgc3RhdGUsIHdvcmtpbmdMZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgICAgIHRyYWNrU2l6ZS5zZXRMZW5ndGgod29ya2luZ0xlbmd0aCk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIExlbmd0aCBtaW5UcmFja0JyZWFkdGg7CisgICAg
TGVuZ3RoIG1heFRyYWNrQnJlYWR0aDsKKyAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgo
bWluTWF4VHJhY2tCcmVhZHRoLT5maXJzdCgpLCBzdGF0ZSwgbWluVHJhY2tCcmVhZHRoKSB8fCAh
Y3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFkdGgtPnNlY29uZCgpLCBzdGF0
ZSwgbWF4VHJhY2tCcmVhZHRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdHJhY2tT
aXplLnNldE1pbk1heChtaW5UcmFja0JyZWFkdGgsIG1heFRyYWNrQnJlYWR0aCk7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0dyb3VwKENTU1ZhbHVl
KiB2YWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBWZWN0b3I8R3JpZFRy
YWNrU2l6ZT4mIHRyYWNrU2l6ZXMpCit7CisgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBp
ID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICBDU1NWYWx1ZSog
Y3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEdyaWRUcmFj
a1NpemUgdHJhY2tTaXplOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja01pbk1heChzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGN1cnJWYWx1ZSksIHN0YXRlLCB0cmFja1NpemUp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyYWNrU2l6ZXMuYXBwZW5k
KHRyYWNrU2l6ZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBj
cmVhdGVHcmlkVHJhY2tMaXN0KENTU1ZhbHVlKiB2YWx1ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+
JiB0cmFja1NpemVzLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUpCit7CisgICAg
Ly8gSGFuZGxlICdub25lJy4KKyAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewor
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRl
R3JpZFRyYWNrR3JvdXAodmFsdWUsIHN0YXRlLCB0cmFja1NpemVzKTsKK30KKworCitzdGF0aWMg
Ym9vbCBjcmVhdGVHcmlkUG9zaXRpb24oQ1NTVmFsdWUqIHZhbHVlLCBHcmlkUG9zaXRpb24mIHBv
c2l0aW9uKQoreworICAgIC8vIEZvciBub3csIHdlIG9ubHkgYWNjZXB0OiA8aW50ZWdlcj4gfCAn
YXV0bycKKyAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04ocHJpbWl0aXZlVmFsdWUtPmlzTnVt
YmVyKCkpOworICAgIHBvc2l0aW9uLnNldEludGVnZXJQb3NpdGlvbihwcmltaXRpdmVWYWx1ZS0+
Z2V0SW50VmFsdWUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKK3N0YXRpYyBib29sIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKENTU1ZhbHVlKiB2YWx1
ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5oYXNWYXJpYWJs
ZVJlZmVyZW5jZSgpOworICAgIH0KKworICAgIGlmICh2YWx1ZS0+aXNDYWxjdWxhdGlvblZhbHVl
KCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1NDYWxjVmFsdWUqPih2YWx1ZSktPmhh
c1ZhcmlhYmxlUmVmZXJlbmNlKCk7CisKKyAgICBpZiAodmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkp
IHsKKyAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBkaXJl
Y3Rpb24gPSByZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpOworICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogb2Zmc2V0ID0gcmVmbGVjdFZhbHVlLT5vZmZzZXQoKTsKKyAgICAgICAgQ1NTVmFsdWUq
IG1hc2sgPSByZWZsZWN0VmFsdWUtPm1hc2soKTsKKyAgICAgICAgcmV0dXJuIChkaXJlY3Rpb24g
JiYgaGFzVmFyaWFibGVSZWZlcmVuY2UoZGlyZWN0aW9uKSkgfHwgKG9mZnNldCAmJiBoYXNWYXJp
YWJsZVJlZmVyZW5jZShvZmZzZXQpKSB8fCAobWFzayAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZSht
YXNrKSk7CisgICAgfQorCisgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7
IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICBpZiAoaGFzVmFyaWFibGVSZWZl
cmVuY2UoaS52YWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpyZXNvbHZlVmFyaWFibGVz
KENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQ
cm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpCit7CisgICAgc3RkOjpwYWly
PENTU1Byb3BlcnR5SUQsIFN0cmluZz4gZXhwcmVzc2lvbihpZCwgdmFsdWUtPnNlcmlhbGl6ZVJl
c29sdmluZ1ZhcmlhYmxlcygqbV9zdGF0ZS5zdHlsZSgpLT52YXJpYWJsZXMoKSkpOworCisgICAg
aWYgKGtub3duRXhwcmVzc2lvbnMuY29udGFpbnMoZXhwcmVzc2lvbikpCisgICAgICAgIHJldHVy
bjsgLy8gY3ljbGUgZGV0ZWN0ZWQuCisKKyAgICBrbm93bkV4cHJlc3Npb25zLmFwcGVuZChleHBy
ZXNzaW9uKTsKKworICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBmYXN0ZXIgbm90IHRvIHJlLXBh
cnNlIGZyb20gc3RyaW5ncywgYnV0IGZvciBub3cgQ1NTIHByb3BlcnR5IHZhbGlkYXRpb24gbGl2
ZXMgaW5zaWRlIHRoZSBwYXJzZXIgc28gd2UgZG8gaXQgdGhlcmUuCisgICAgUmVmUHRyPFN0eWxl
UHJvcGVydHlTZXQ+IHJlc3VsdFNldCA9IFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpOworICAg
IGlmICghQ1NTUGFyc2VyOjpwYXJzZVZhbHVlKHJlc3VsdFNldC5nZXQoKSwgaWQsIGV4cHJlc3Np
b24uc2Vjb25kLCBmYWxzZSwgZG9jdW1lbnQoKSkpCisgICAgICAgIHJldHVybjsgLy8gZXhwcmVz
c2lvbiBmYWlsZWQgdG8gcGFyc2UuCisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVz
dWx0U2V0LT5wcm9wZXJ0eUNvdW50KCk7IGkrKykgeworICAgICAgICBTdHlsZVByb3BlcnR5U2V0
OjpQcm9wZXJ0eVJlZmVyZW5jZSBwcm9wZXJ0eSA9IHJlc3VsdFNldC0+cHJvcGVydHlBdChpKTsK
KyAgICAgICAgaWYgKHByb3BlcnR5LmlkKCkgIT0gQ1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNW
YXJpYWJsZVJlZmVyZW5jZShwcm9wZXJ0eS52YWx1ZSgpKSkKKyAgICAgICAgICAgIHJlc29sdmVW
YXJpYWJsZXMocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSwga25vd25FeHByZXNzaW9u
cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkocHJvcGVydHkuaWQo
KSwgcHJvcGVydHkudmFsdWUoKSk7CisgICAgfQorfQorI2VuZGlmCisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCit7
CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgaWYgKGlkICE9IENTU1Byb3BlcnR5VmFy
aWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UodmFsdWUpKSB7CisgICAgICAgIFZlY3Rvcjxz
dGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+IGtub3duRXhwcmVzc2lvbnM7CisgICAg
ICAgIHJlc29sdmVWYXJpYWJsZXMoaWQsIHZhbHVlLCBrbm93bkV4cHJlc3Npb25zKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gQ1NTIHZhcmlhYmxlcyBkb24ndCBy
ZXNvbHZlIHNob3J0aGFuZHMgYXQgcGFyc2luZyB0aW1lLCBzbyB0aGlzIHNob3VsZCBiZSAqYWZ0
ZXIqIGhhbmRsaW5nIHZhcmlhYmxlcy4KKyAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCFpc0V4cGFu
ZGVkU2hvcnRoYW5kKGlkKSwgIlNob3J0aGFuZCBwcm9wZXJ0eSBpZCA9ICVkIHdhc24ndCBleHBh
bmRlZCBhdCBwYXJzaW5nIHRpbWUiLCBpZCk7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OworICAgIGJvb2wgaXNJbmhlcml0ID0gc3RhdGUucGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0lu
aGVyaXRlZFZhbHVlKCk7CisgICAgYm9vbCBpc0luaXRpYWwgPSB2YWx1ZS0+aXNJbml0aWFsVmFs
dWUoKSB8fCAoIXN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1ZS0+aXNJbmhlcml0ZWRWYWx1ZSgp
KTsKKworICAgIEFTU0VSVCghaXNJbmhlcml0IHx8ICFpc0luaXRpYWwpOyAvLyBpc0luaGVyaXQg
LT4gIWlzSW5pdGlhbCAmJiBpc0luaXRpYWwgLT4gIWlzSW5oZXJpdAorICAgIEFTU0VSVCghaXNJ
bmhlcml0IHx8IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUucGFyZW50U3R5bGUoKSkpOyAv
LyBpc0luaGVyaXQgLT4gKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgp
KQorCisgICAgaWYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKSAmJiAoIXN0
YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSB8fCAhaXNWYWxpZFZpc2l0ZWRM
aW5rUHJvcGVydHkoaWQpKSkgeworICAgICAgICAvLyBMaW1pdCB0aGUgcHJvcGVydGllcyB0aGF0
IGNhbiBiZSBhcHBsaWVkIHRvIG9ubHkgdGhlIG9uZXMgaG9ub3JlZCBieSA6dmlzaXRlZC4KKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpc0luaGVyaXQgJiYgIXN0YXRlLnBhcmVu
dFN0eWxlKCktPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgJiYgIUNTU1Byb3Bl
cnR5Ojppc0luaGVyaXRlZFByb3BlcnR5KGlkKSkKKyAgICAgICAgc3RhdGUucGFyZW50U3R5bGUo
KS0+c2V0SGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKTsKKworI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQorICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKSB7CisgICAg
ICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHZhbHVlLT5pc1ZhcmlhYmxlVmFs
dWUoKSk7CisgICAgICAgIENTU1ZhcmlhYmxlVmFsdWUqIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8
Q1NTVmFyaWFibGVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+bmFt
ZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VSVCghdmFyaWFibGUtPnZhbHVlKCkuaXNFbXB0
eSgpKTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VmFyaWFibGUodmFyaWFibGUtPm5hbWUo
KSwgdmFyaWFibGUtPnZhbHVlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisK
KyAgICAvLyBDaGVjayBsb29rdXAgdGFibGUgZm9yIGltcGxlbWVudGF0aW9ucyBhbmQgdXNlIHdo
ZW4gYXZhaWxhYmxlLgorICAgIGNvbnN0IFByb3BlcnR5SGFuZGxlciYgaGFuZGxlciA9IG1fc3R5
bGVCdWlsZGVyLnByb3BlcnR5SGFuZGxlcihpZCk7CisgICAgaWYgKGhhbmRsZXIuaXNWYWxpZCgp
KSB7CisgICAgICAgIGlmIChpc0luaGVyaXQpCisgICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5o
ZXJpdFZhbHVlKGlkLCB0aGlzKTsKKyAgICAgICAgZWxzZSBpZiAoaXNJbml0aWFsKQorICAgICAg
ICAgICAgaGFuZGxlci5hcHBseUluaXRpYWxWYWx1ZShpZCwgdGhpcyk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlWYWx1ZShpZCwgdGhpcywgdmFsdWUpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVl
ID0gdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSA/IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odmFsdWUpIDogMDsKKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdGF0ZS5zdHlsZSgp
LT5lZmZlY3RpdmVab29tKCk7CisKKyAgICAvLyBXaGF0IGZvbGxvd3MgaXMgYSBsaXN0IHRoYXQg
bWFwcyB0aGUgQ1NTIHByb3BlcnRpZXMgaW50byB0aGVpciBjb3JyZXNwb25kaW5nIGZyb250LWVu
ZAorICAgIC8vIFJlbmRlclN0eWxlIHZhbHVlcy4KKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgLy8g
bGlzdHMKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoKKyAgICAgICAgLy8gbGlzdCBvZiBz
dHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQorICAgICAgICB7CisgICAgICAgICAgICAvLyBG
SVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBpbmhlcml0IGNvbnRlbnQuIElu
IENTUzIgaXQgaXMgbm90LiBUaGlzCisgICAgICAgICAgICAvLyBub3RlIGlzIGEgcmVtaW5kZXIg
dGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuCisKKyAgICAg
ICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5j
bGVhckNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgICAgICBib29sIGRpZFNldCA9IGZhbHNlOworICAgICAgICAgICAg
Zm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgeworICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOworICAg
ICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZhbHVlKCkpCisgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6
OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4oaXRlbSktPmdyYWRpZW50V2l0
aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVu
dChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0
b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0g
dHJ1ZTsKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
aWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29u
dGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAg
ICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyNlbmRpZgorICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlVmFsdWUoKSkgeworICAgICAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNhY2hlZE9yUGVuZGluZ0Zy
b21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPihp
dGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOworCisgICAgICAg
ICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkgeworICAgICAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFs
dWUoKS5pbXBsKCksIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7
CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUtPmlzQXR0cigpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBuYW1lc3BhY2UgYmUgc3BlY2lmaWVk
IGZvciBhbiBhdHRyKGZvbyk/CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgp
LT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51bGxBdG9tLCBjb250ZW50VmFsdWUt
PmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7CisgICAgICAgICAgICAgICAgICAg
IGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0
ZShhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudCh2
YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmltcGwoKSwgZGlkU2V0KTsKKyAgICAg
ICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVn
aXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVlIGFmZmVjdHMgdGhlIHN0eWxl
CisgICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMu
YWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYg
KGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ291bnRl
ciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRDb3VudGVyVmFsdWUoKTsKKyAgICAg
ICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0eWxlVHlwZSA9IE5vbmVMaXN0U3R5
bGU7CisgICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5bGVJZGVudCA9IGNvdW50ZXJWYWx1
ZS0+bGlzdFN0eWxlSWRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RTdHlsZUlk
ZW50ICE9IENTU1ZhbHVlTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5
cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlzdFN0eWxlSWRlbnQgLSBDU1NWYWx1
ZURpc2MpOworICAgICAgICAgICAgICAgICAgICBPd25QdHI8Q291bnRlckNvbnRlbnQ+IGNvdW50
ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291bnRlclZhbHVlLT5pZGVudGlmaWVy
KCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2VwYXJhdG9yKCkpKTsKKyAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb3VudGVyLnJlbGVhc2UoKSwg
ZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+
Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlT3BlblF1b3Rl
OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChPUEVO
X1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNl
IENTU1ZhbHVlQ2xvc2VRdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5RdW90ZToKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fT1BFTl9RVU9URSwgZGlkU2V0
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vQ2xv
c2VRdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRT
ZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWwgYW5kIG5v
bmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgfQor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKCFkaWRTZXQpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICBjYXNl
IENTU1Byb3BlcnR5UXVvdGVzOgorICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFyZW50U3R5bGUoKS0+cXVvdGVzKCkp
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luaXRpYWwp
IHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcygwKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsK
KyAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlz
dCo+KHZhbHVlKTsKKyAgICAgICAgICAgIFJlZlB0cjxRdW90ZXNEYXRhPiBxdW90ZXMgPSBRdW90
ZXNEYXRhOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlz
dC0+bGVuZ3RoKCk7IGkgKz0gMikgeworICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBmaXJzdCA9
IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgICAgICAgICAgLy8gaXRl
bSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNvIHRoaXMgaXMgc2FmZS4KKyAgICAg
ICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+aXRlbShpICsgMSk7CisgICAgICAg
ICAgICAgICAgaWYgKCFzZWNvbmQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKGZpcnN0LT5pc1By
aW1pdGl2ZVZhbHVlKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBT
dHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlyc3Qp
LT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBlbmRRdW90ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25kKS0+Z2V0U3RyaW5nVmFsdWUoKTsK
KyAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3RkOjptYWtlX3BhaXIoc3RhcnRRdW90
ZSwgZW5kUXVvdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFF1b3RlcyhxdW90ZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkpOworICAgICAgICB9CisgICAgICAg
IHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseTogeworICAgICAgICAvLyBs
aXN0IG9mIHN0cmluZ3MgYW5kIGlkcworICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAg
ICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50
U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAg
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShwYXJlbnRGb250RGVzY3Jp
cHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRG
YW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkpOworICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChwYXJlbnRGb250RGVzY3JpcHRpb24u
aXNTcGVjaWZpZWRGb250KCkpOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnRE
ZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24gaW5pdGlhbERlc2Mg
PSBGb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVz
Y3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAg
IC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFjY291bnQgZm9yIHRoZSBnZW5lcmlj
IGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKKyAgICAgICAgICAgIC8vIHRvIG5vbi1tb25v
c3BhY2UuCisgICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYg
Zm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKKyAgICAgICAgICAgICAgICBz
ZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgp
LCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsIGZh
bHNlKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShpbml0
aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOworICAgICAgICAgICAgaWYgKCFpbml0aWFsRGVzYy5m
aXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkpOworICAgICAgICAgICAg
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0g
c3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIEZvbnRGYW1pbHkmIGZp
cnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCk7CisgICAgICAgIEZvbnRG
YW1pbHkqIGN1cnJGYW1pbHkgPSAwOworCisgICAgICAgIC8vIEJlZm9yZSBtYXBwaW5nIGluIGEg
bmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQgcmVzZXQgdGhlIGdlbmVyaWMgZmFt
aWx5LgorICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplID0gZm9udERl
c2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7CisKKyAgICAgICAg
Zm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBpLnZhbHVlKCk7CisgICAgICAg
ICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOworICAgICAgICAgICAgQXRvbWljU3Ry
aW5nIGZhY2U7CisgICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRp
bmdzKCk7CisgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0cmluZygpKQorICAgICAg
ICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAg
ICAgICBlbHNlIGlmIChzZXR0aW5ncykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29udGVu
dFZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dEJvZHk6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250
RmFtaWx5KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNh
c2UgQ1NTVmFsdWVTZXJpZjoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNlcmlmRmFtaWx5
OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShG
b250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNTZXJpZjoKKyAgICAgICAgICAgICAg
ICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1p
bHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlQ3Vyc2l2ZToKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGN1cnNpdmVGYW1pbHk7
CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50YXN5OgorICAgICAgICAgICAgICAg
ICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5KTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZU1vbm9zcGFjZToKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG1vbm9zcGFjZUZhbWlseTsK
KyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0UGljdG9ncmFwaDoKKyAgICAg
ICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1pbHk7CisgICAgICAgICAgICAgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6UGlj
dG9ncmFwaEZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmYWNlLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCisgICAgICAgICAgICAgICAgICAgIGZp
cnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1p
bHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGluaGVyaXRlZCBmYW1pbHktZmFsbGJh
Y2sgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9ICZmaXJzdEZhbWlseTsK
KyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChm
b250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1p
bHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFJlZlB0
cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFyZWRGb250RmFtaWx5OjpjcmVhdGUo
KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5zZXRGYW1pbHkoZmFjZSk7CisgICAg
ICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZhbWlseShuZXdGYW1pbHkpOworICAg
ICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFtaWx5LmdldCgpOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIGNhbid0
IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFsbCBuZXcgZm9udCBmYW1pbGllcyBo
YXZlIGJlZW4gYWRkZWQKKyAgICAgICAgLy8gSWYgY3VyckZhbWlseSBpcyBub24temVybyB0aGVu
IHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMgZGVzY3JpcHRpb24uCisgICAgICAg
IGlmIChjdXJyRmFtaWx5KSB7CisgICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdv
cmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSAhPSBvbGRG
YW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKKyAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShm
b250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4
U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAtIDEsICFvbGRGYW1pbHlVc2Vk
Rml4ZWREZWZhdWx0U2l6ZSkpOworCisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9u
dERlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8v
IFNob3J0aGFuZCBwcm9wZXJ0aWVzLgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgorICAgICAg
ICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2Ny
aXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KHN0YXRlLnBhcmVudFN0eWxlKCktPnNw
ZWNpZmllZExpbmVIZWlnaHQoKSk7CisgICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFs
dWUoMCk7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsK
KyAgICAgICAgfSBlbHNlIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIEFTU0VSVChzZXR0aW5n
cyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hv
dWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MKKyAgICAgICAg
ICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAg
aW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7CisgICAgICAgIH0gZWxzZSBpZiAocHJpbWl0
aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVu
ZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworICAgICAgICAgICAgc3RhdGUuc2V0TGlu
ZUhlaWdodFZhbHVlKDApOworCisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2Ny
aXB0aW9uOworICAgICAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1G
b250KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpLCBmb250RGVzY3JpcHRpb24pOworCisgICAg
ICAgICAgICAvLyBEb3VibGUtY2hlY2sgYW5kIHNlZSBpZiB0aGUgdGhlbWUgZGlkIGFueXRoaW5n
LiBJZiBub3QsIGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgZm9udC4KKyAgICAgICAgICAgIGlm
IChmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSkgeworICAgICAgICAgICAgICAgIC8v
IE1ha2Ugc3VyZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHByaW50ZXIgZm9udCBzZXR0aW5ncyBh
cmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVu
dFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2Un
cmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJl
IGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncworICAgICAgICAgICAgICAgIGlmICgh
c2V0dGluZ3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01v
ZGUoKSk7CisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250
KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0
aW9uRW5hYmxlZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgem9vbSBmYWN0
b3IuCisgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRD
b21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBm
b250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgZm9udERlc2NyaXB0aW9uLnNwZWNpZmll
ZFNpemUoKSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKKyAgICAgICAgICAgICAgICBzZXRGb250RGVz
Y3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl
IGlmICh2YWx1ZS0+aXNGb250VmFsdWUoKSkgeworICAgICAgICAgICAgRm9udFZhbHVlKiBmb250
ID0gc3RhdGljX2Nhc3Q8Rm9udFZhbHVlKj4odmFsdWUpOworICAgICAgICAgICAgaWYgKCFmb250
LT5zdHlsZSB8fCAhZm9udC0+dmFyaWFudCB8fCAhZm9udC0+d2VpZ2h0CisgICAgICAgICAgICAg
ICAgfHwgIWZvbnQtPnNpemUgfHwgIWZvbnQtPmxpbmVIZWlnaHQgfHwgIWZvbnQtPmZhbWlseSkK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1By
b3BlcnR5Rm9udFN0eWxlLCBmb250LT5zdHlsZS5nZXQoKSk7CisgICAgICAgICAgICBhcHBseVBy
b3BlcnR5KENTU1Byb3BlcnR5Rm9udFZhcmlhbnQsIGZvbnQtPnZhcmlhbnQuZ2V0KCkpOworICAg
ICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRXZWlnaHQsIGZvbnQtPndlaWdo
dC5nZXQoKSk7CisgICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgcHJvcGVydGllcyBjYW4gZGly
dHkgb3VyIGZvbnQgYnV0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJlYWQgdGhlIGZvbnQncworICAgICAg
ICAgICAgLy8gcHJvcGVydGllcyBiYWNrLCB3aGljaCBpcyBzYWZlLiBIb3dldmVyIGlmIGZvbnQt
c2l6ZSBpcyB1c2luZyB0aGUgJ2V4JyB1bml0LCBpdCB3aWxsCisgICAgICAgICAgICAvLyBuZWVk
IHF1ZXJ5IHRoZSBkaXJ0aWVkIGZvbnQncyB4LWhlaWdodCB0byBnZXQgdGhlIGNvbXB1dGVkIHNp
emUuIFRvIGJlIHNhZmUgaW4gdGhpcworICAgICAgICAgICAgLy8gY2FzZSwgbGV0J3MganVzdCB1
cGRhdGUgdGhlIGZvbnQgbm93LgorICAgICAgICAgICAgdXBkYXRlRm9udCgpOworICAgICAgICAg
ICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTaXplLCBmb250LT5zaXplLmdldCgpKTsK
KworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKGZvbnQtPmxpbmVIZWlnaHQu
Z2V0KCkpOworCisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udEZhbWls
eSwgZm9udC0+ZmFtaWx5LmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisKKyAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dy
b3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCb3JkZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRv
bToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRk
aW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRBbmltYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVy
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJvcmRlckVuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
U3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclJhZGl1czoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uUnVsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0RmxleEZsb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1
bW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3c6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcmdpbkNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJx
dWVlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXNrUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBl
YXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpczoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJh
bnNpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luOgorI2lm
IEVOQUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcDoK
KyNlbmRpZgorICAgICAgICBBU1NFUlQoaXNFeHBhbmRlZFNob3J0aGFuZChpZCkpOworICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyBDU1MzIFBy
b3BlcnRpZXMKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNoYWRvdzoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm94U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3c6IHsK
KyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAgICAgICAgICAgaWYgKGlkID09IENTU1Byb3Bl
cnR5VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0
VGV4dFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hhZG93KCkgPyBhZG9wdFB0cihu
ZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4dFNoYWRvdygpKSkgOiBudWxs
cHRyKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc3Rh
dGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgq
c3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkpKSA6IG51bGxwdHIpOworICAgICAgICB9
CisgICAgICAgIGlmIChpc0luaXRpYWwgfHwgcHJpbWl0aXZlVmFsdWUpIC8vIGluaXRpYWwgfCBu
b25lCisgICAgICAgICAgICByZXR1cm4gaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93ID8gc3Rh
dGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhudWxscHRyKSA6IHN0YXRlLnN0eWxlKCktPnNldEJv
eFNoYWRvdyhudWxscHRyKTsKKworICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQor
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgIENTU1Zh
bHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+
aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
U2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dWYWx1ZSo+KGN1cnJWYWx1ZSk7
CisgICAgICAgICAgICBpbnQgeCA9IGl0ZW0tPngtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICAg
ICAgaW50IHkgPSBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGludCBibHVy
ID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHls
ZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAg
ICAgIGludCBzcHJlYWQgPSBpdGVtLT5zcHJlYWQgPyBpdGVtLT5zcHJlYWQtPmNvbXB1dGVMZW5n
dGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpIDogMDsKKyAgICAgICAgICAgIFNoYWRvd1N0eWxlIHNoYWRvd1N0eWxlID0gaXRlbS0+c3R5
bGUgJiYgaXRlbS0+c3R5bGUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVJbnNldCA/IEluc2V0IDog
Tm9ybWFsOworICAgICAgICAgICAgQ29sb3IgY29sb3I7CisgICAgICAgICAgICBpZiAoaXRlbS0+
Y29sb3IpCisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShp
dGVtLT5jb2xvci5nZXQoKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZS5zdHlsZSgpKQor
ICAgICAgICAgICAgICAgIGNvbG9yID0gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKKworICAgICAg
ICAgICAgT3duUHRyPFNoYWRvd0RhdGE+IHNoYWRvd0RhdGEgPSBhZG9wdFB0cihuZXcgU2hhZG93
RGF0YShJbnRQb2ludCh4LCB5KSwgYmx1ciwgc3ByZWFkLCBzaGFkb3dTdHlsZSwgaWQgPT0gQ1NT
UHJvcGVydHlXZWJraXRCb3hTaGFkb3csIGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6
OnRyYW5zcGFyZW50KSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hh
ZG93KQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3coc2hhZG93
RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlz
IG5vdCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgo
KSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3hSZWZsZWN0OiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGJveFJl
ZmxlY3QsIEJveFJlZmxlY3QpCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChSZW5kZXJTdHlsZTo6aW5pdGlhbEJv
eFJlZmxlY3QoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIXZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVj
dFZhbHVlKj4odmFsdWUpOworICAgICAgICBSZWZQdHI8U3R5bGVSZWZsZWN0aW9uPiByZWZsZWN0
aW9uID0gU3R5bGVSZWZsZWN0aW9uOjpjcmVhdGUoKTsKKyAgICAgICAgcmVmbGVjdGlvbi0+c2V0
RGlyZWN0aW9uKCpyZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpKTsKKyAgICAgICAgaWYgKHJlZmxl
Y3RWYWx1ZS0+b2Zmc2V0KCkpCisgICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRPZmZzZXQocmVm
bGVjdFZhbHVlLT5vZmZzZXQoKS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNp
b24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uPihzdGF0ZS5zdHls
ZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpKTsKKyAgICAgICAgTmlu
ZVBpZWNlSW1hZ2UgbWFzazsKKyAgICAgICAgbWFzay5zZXRNYXNrRGVmYXVsdHMoKTsKKyAgICAg
ICAgbV9zdHlsZU1hcC5tYXBOaW5lUGllY2VJbWFnZShpZCwgcmVmbGVjdFZhbHVlLT5tYXNrKCks
IG1hc2spOworICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNrKG1hc2spOworCisgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QocmVmbGVjdGlvbi5yZWxlYXNlKCkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlTcmM6IC8vIE9ubHkgdXNlZCBp
biBAZm9udC1mYWNlIHJ1bGVzLgorICAgICAgICByZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVVuaWNvZGVSYW5nZTogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCisgICAgICAg
IHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVJlcGV0aXRpb246IHsK
KyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUxvb3BDb3VudCwgTWFy
cXVlZUxvb3BDb3VudCkKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlSW5maW5pdGUpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENv
dW50KC0xKTsgLy8gLTEgbWVhbnMgcmVwZWF0IGZvcmV2ZXIuCisgICAgICAgIGVsc2UgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
TWFycXVlZUxvb3BDb3VudChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTcGVlZDog
eworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlU3BlZWQsIE1hcnF1
ZWVTcGVlZCkKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgaWYgKGludCBpZGVudCA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7
CisgICAgICAgICAgICBzd2l0Y2ggKGlkZW50KSB7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVl
U2xvdzoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoNTAw
KTsgLy8gNTAwIG1zZWMuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNl
IENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1
ZWVTcGVlZCg4NSk7IC8vIDg1bXNlYy4gVGhlIFdpbklFIGRlZmF1bHQuCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFzdDoKKyAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoMTApOyAvLyAxMG1zZWMuIFN1cGVyIGZh
c3QuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzVGltZSgpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlVGltZTxpbnQsIENTU1By
aW1pdGl2ZVZhbHVlOjpNaWxsaXNlY29uZHM+KCkpOworICAgICAgICBlbHNlIGlmIChwcmltaXRp
dmVWYWx1ZS0+aXNOdW1iZXIoKSkgLy8gRm9yIHNjcm9sbGFtb3VudCBzdXBwb3J0LgorICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5nZXRJ
bnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFycXVlZUluY3JlbWVudDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTChtYXJxdWVlSW5jcmVtZW50LCBNYXJxdWVlSW5jcmVtZW50KQorICAgICAgICBpZiAoIXBy
aW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUt
PmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTbWFsbDoKKyAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCgxLCBGaXhl
ZCkpOyAvLyAxcHguCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJ
bmNyZW1lbnQoTGVuZ3RoKDYsIEZpeGVkKSk7IC8vIDZweC4gVGhlIFdpbklFIGRlZmF1bHQuCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTGFyZ2U6Cisg
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgo
MzYsIEZpeGVkKSk7IC8vIDM2cHguCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMZW5ndGggbWFycXVlZUxlbmd0aCA9
IGNvbnZlcnRUb0ludExlbmd0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIGlmICghbWFycXVlZUxlbmd0aC5pc1Vu
ZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNy
ZW1lbnQobWFycXVlZUxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9jYWxlOiB7CisgICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKGxvY2FsZSwgTG9jYWxlKTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dExvY2FsZShudWxsQXRvbSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldExvY2FsZShwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKSk7CisgICAgICAg
IEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVz
Y3JpcHRpb24oKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1Nj
cmlwdENvZGVGb3JGb250U2VsZWN0aW9uKHN0YXRlLnN0eWxlKCktPmxvY2FsZSgpKSk7CisgICAg
ICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm47
CisgICAgfQorI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0RGFzaGJvYXJkUmVnaW9uOgorICAgIHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwoZGFzaGJvYXJkUmVnaW9ucywgRGFzaGJvYXJkUmVnaW9ucykKKyAgICAgICAg
aWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7CisgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb25zKFJlbmRlclN0eWxlOjpub25lRGFz
aGJvYXJkUmVnaW9ucygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAg
ICAgIERhc2hib2FyZFJlZ2lvbiogcmVnaW9uID0gcHJpbWl0aXZlVmFsdWUtPmdldERhc2hib2Fy
ZFJlZ2lvblZhbHVlKCk7CisgICAgICAgIGlmICghcmVnaW9uKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiogZmlyc3QgPSByZWdpb247CisgICAgICAgIHdo
aWxlIChyZWdpb24pIHsKKyAgICAgICAgICAgIExlbmd0aCB0b3AgPSBjb252ZXJ0VG9JbnRMZW5n
dGgocmVnaW9uLT50b3AoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
KTsKKyAgICAgICAgICAgIExlbmd0aCByaWdodCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24t
PnJpZ2h0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAg
ICAgICAgICBMZW5ndGggYm90dG9tID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+Ym90dG9t
KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAg
ICBMZW5ndGggbGVmdCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPmxlZnQoKSwgc3RhdGUu
c3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKworICAgICAgICAgICAgaWYgKHRv
cC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHRvcCA9IExlbmd0aCgpOworICAgICAg
ICAgICAgaWYgKHJpZ2h0LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmlnaHQgPSBM
ZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChib3R0b20uaXNVbmRlZmluZWQoKSkKKyAgICAgICAg
ICAgICAgICBib3R0b20gPSBMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZWZ0LmlzVW5kZWZp
bmVkKCkpCisgICAgICAgICAgICAgICAgbGVmdCA9IExlbmd0aCgpOworCisgICAgICAgICAgICBp
ZiAocmVnaW9uLT5tX2lzQ2lyY2xlKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6Q2lyY2xlLCByZWdpb24tPm1f
bGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2Ug
OiB0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lvbi0+bV9pc1JlY3RhbmdsZSkKKyAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNo
Ym9hcmRSZWdpb246OlJlY3RhbmdsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0
b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgICAgICBy
ZWdpb24gPSByZWdpb24tPm1fbmV4dC5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRl
LmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7CisKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJMRShEUkFHR0FCTEVfUkVHSU9OKQorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBcHBSZWdpb246IHsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSB8fCAhcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERyYWdnYWJsZVJlZ2lvbk1vZGUocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEcmFnID8gRHJhZ2dhYmxlUmVnaW9uRHJhZyA6
IERyYWdnYWJsZVJlZ2lvbk5vRHJhZyk7CisgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhh
c0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZVdpZHRoOiB7CisgICAgICAgIEhB
TkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRTdHJva2VXaWR0aCwgVGV4dFN0cm9rZVdpZHRo
KQorICAgICAgICBmbG9hdCB3aWR0aCA9IDA7CisgICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgY2FzZSBDU1NWYWx1ZVRoaW46CisgICAgICAgIGNh
c2UgQ1NTVmFsdWVNZWRpdW06CisgICAgICAgIGNhc2UgQ1NTVmFsdWVUaGljazogeworICAgICAg
ICAgICAgZG91YmxlIHJlc3VsdCA9IDEuMCAvIDQ4OworICAgICAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTWVkaXVtKQorICAgICAgICAgICAgICAgIHJl
c3VsdCAqPSAzOworICAgICAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkgPT0gQ1NTVmFsdWVUaGljaykKKyAgICAgICAgICAgICAgICByZXN1bHQgKj0gNTsKKyAgICAg
ICAgICAgIHdpZHRoID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZShyZXN1bHQsIENTU1ByaW1p
dGl2ZVZhbHVlOjpDU1NfRU1TKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwg
c3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB3aWR0aCA9IHByaW1p
dGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFN0cm9rZVdpZHRoKHdpZHRoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3Jt
OiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRyYW5zZm9ybSwgVHJhbnNm
b3JtKTsKKyAgICAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgICAgICBj
cmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRU
cmFuc2Zvcm0ob3BlcmF0aW9ucyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHBlcnNwZWN0aXZlLCBQZXJzcGVjdGl2ZSkKKworICAgICAgICBpZiAoIXByaW1p
dGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChwcmltaXRpdmVW
YWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldFBlcnNwZWN0aXZlKDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisKKyAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVWYWx1ZTsKKyAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IHByaW1p
dGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVW
YWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGli
aWxpdHksIHRyZWF0IHZhbHVlbGVzcyBudW1iZXJzIGFzIHB4LgorICAgICAgICAgICAgcGVyc3Bl
Y3RpdmVWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocHJpbWl0aXZlVmFsdWUtPmdl
dERvdWJsZVZhbHVlKCksIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfUFgpLT5jb21wdXRlTGVuZ3Ro
PGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAo
cGVyc3BlY3RpdmVWYWx1ZSA+PSAwLjBmKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVWYWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisj
aWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGFwSGln
aGxpZ2h0Q29sb3I6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGFwSGln
aGxpZ2h0Q29sb3IsIFRhcEhpZ2hsaWdodENvbG9yKTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENvbG9yIGNvbCA9IGNvbG9yRnJv
bVByaW1pdGl2ZVZhbHVlKHByaW1pdGl2ZVZhbHVlKTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0VGFwSGlnaGxpZ2h0Q29sb3IoY29sKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRp
ZgorI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiB7CisgICAgICAgIEhBTkRMRV9JTkhF
UklUX0FORF9JTklUSUFMKHVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcsIFVzZVRvdWNoT3ZlcmZs
b3dTY3JvbGxpbmcpOworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxp
bmcocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUb3VjaCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5SW52YWxpZDoKKyAg
ICAgICAgcmV0dXJuOworICAgIC8vIERpcmVjdGlvbmFsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVk
IGJ5IHJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KCkgYmVmb3JlIHRoZSBzd2l0Y2guCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJFbmRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVyRW5kV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0Q29sb3I6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0U3R5bGU6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckJlZm9yZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJC
ZWZvcmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlV2lkdGg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyQ29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlckFmdGVyV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkVu
ZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luU3RhcnQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFy
Z2luQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Ub3BDb2xsYXBzZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFBhZGRpbmdFbmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UGFkZGluZ0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2Fs
V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxIZWlnaHQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWluTG9naWNhbEhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9n
aWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0Ogor
ICAgIHsKKyAgICAgICAgQ1NTUHJvcGVydHlJRCBuZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZl
RGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0
YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOworICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQp
OworICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwgdmFsdWUpOworICAgIH0KKyAg
ICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhy
b3VnaE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hXaWR0aDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dE92ZXJsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dE92ZXJsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxp
bmVNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Rm9udFNpemVEZWx0YToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRp
b25zSW5FZmZlY3Q6CisgICAgICAgIHJldHVybjsKKworICAgIC8vIENTUyBUZXh0IExheW91dCBN
b2R1bGUgTGV2ZWwgMzogVmVydGljYWwgd3JpdGluZyBzdXBwb3J0CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFdyaXRpbmdNb2RlOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklU
SUFMKHdyaXRpbmdNb2RlLCBXcml0aW5nTW9kZSk7CisgICAgICAgIAorICAgICAgICBpZiAocHJp
bWl0aXZlVmFsdWUpCisgICAgICAgICAgICBzZXRXcml0aW5nTW9kZSgqcHJpbWl0aXZlVmFsdWUp
OworCisgICAgICAgIC8vIEZJWE1FOiBJdCBpcyBub3Qgb2sgdG8gbW9kaWZ5IGRvY3VtZW50IHN0
YXRlIHdoaWxlIGFwcGx5aW5nIHN0eWxlLgorICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpICYm
IHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkK
KyAgICAgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVu
dEVsZW1lbnQodHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VGV4dE9yaWVudGF0aW9uOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHRleHRPcmllbnRhdGlvbiwgVGV4dE9yaWVudGF0aW9uKTsKKworICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBzZXRUZXh0T3JpZW50YXRpb24oKnByaW1p
dGl2ZVZhbHVlKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdExpbmVCb3hDb250YWluOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9J
TklUSUFMKGxpbmVCb3hDb250YWluLCBMaW5lQm94Q29udGFpbikKKyAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkg
eworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4oTGluZUJveENv
bnRhaW5Ob25lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICghdmFsdWUtPmlzQ1NTTGluZUJveENvbnRhaW5WYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIENTU0xpbmVCb3hDb250YWluVmFsdWUqIGxpbmVCb3hDb250YWluVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NMaW5lQm94Q29udGFpblZhbHVlKj4odmFsdWUpOworICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFpbihsaW5lQm94Q29udGFpblZhbHVlLT52YWx1
ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENTUyBGb250cyBNb2R1bGUg
TGV2ZWwgMworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250RmVhdHVyZVNldHRpbmdzOiB7
CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQo
KSA9PSBDU1NWYWx1ZU5vcm1hbCkgeworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKHN0
YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpLm1ha2VOb3JtYWxGZWF0dXJlU2V0dGluZ3Mo
KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24o
KTsKKyAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0
Kj4odmFsdWUpOworICAgICAgICBSZWZQdHI8Rm9udEZlYXR1cmVTZXR0aW5ncz4gc2V0dGluZ3Mg
PSBGb250RmVhdHVyZVNldHRpbmdzOjpjcmVhdGUoKTsKKyAgICAgICAgaW50IGxlbiA9IGxpc3Qt
Pmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAg
ICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7
CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzRm9udEZlYXR1cmVWYWx1ZSgpKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgRm9udEZlYXR1cmVWYWx1ZSogZmVhdHVyZSA9
IHN0YXRpY19jYXN0PEZvbnRGZWF0dXJlVmFsdWUqPihpdGVtKTsKKyAgICAgICAgICAgIHNldHRp
bmdzLT5hcHBlbmQoRm9udEZlYXR1cmUoZmVhdHVyZS0+dGFnKCksIGZlYXR1cmUtPnZhbHVlKCkp
KTsKKyAgICAgICAgfQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmVhdHVyZVNldHRpbmdz
KHNldHRpbmdzLnJlbGVhc2UoKSk7CisgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgRU5BQkxFKENTU19GSUxU
RVJTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGaWx0ZXI6IHsKKyAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwoZmlsdGVyLCBGaWx0ZXIpOworICAgICAgICBGaWx0ZXJPcGVy
YXRpb25zIG9wZXJhdGlvbnM7CisgICAgICAgIGlmIChjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKHZh
bHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMp
KQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RmlsdGVyKG9wZXJhdGlvbnMpOworICAg
ICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdy
aWRDb2x1bW5zOiB7CisgICAgICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOwor
ICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRl
KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZENv
bHVtbnModHJhY2tTaXplcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEdyaWRSb3dzOiB7CisgICAgICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0
cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNr
U2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0R3JpZFJvd3ModHJhY2tTaXplcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFN0YXJ0OiB7CisgICAgICAgIEdyaWRQb3NpdGlv
biBzdGFydFBvc2l0aW9uOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwg
c3RhcnRQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRJdGVtU3RhcnQoc3RhcnRQb3NpdGlvbik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRFbmQ6IHsKKyAgICAgICAgR3JpZFBv
c2l0aW9uIGVuZFBvc2l0aW9uOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1
ZSwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRHcmlkSXRlbUVuZChlbmRQb3NpdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEJlZm9yZTogeworICAgICAgICBHcmlk
UG9zaXRpb24gYmVmb3JlUG9zaXRpb247CisgICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9u
KHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBvc2l0aW9uKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7Cisg
ICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOworICAgICAgICBpZiAoIWNyZWF0ZUdy
aWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlh
c2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUg
cHJlZml4ZWQgdmVyc2lvbi4KKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRp
bWluZ0Z1bmN0aW9uOgorICAgICAgICByZXR1cm47CisgICAgLy8gVGhlc2UgcHJvcGVydGllcyBh
cmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29rdXAgdGFibGUuCisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblk6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
UmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJC
b3R0b21MZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJh
ZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tU3R5bGU6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJD
b2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VPdXRzZXQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJJbWFnZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNvdXJjZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyTGVmdENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0U3R5bGU6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRTdHlsZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Qm9yZGVyVG9wQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcExlZnRSYWRp
dXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFJpZ2h0UmFkaXVzOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJUb3BTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvdHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm94U2l6aW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9uU2lkZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5Q2xlYXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNsaXA6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVySW5jcmVtZW50OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNv
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlE
aXNwbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxzOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlGbG9hdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoK
KyNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFUSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJ
bWFnZU9yaWVudGF0aW9uOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVy
aW5nOgorI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVTT0xVVElPTikKKyAgICBjYXNlIENTU1Byb3Bl
cnR5SW1hZ2VSZXNvbHV0aW9uOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxp
bmVIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZUltYWdlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGVQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0
eWxlVHlwZToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luQm90dG9tOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlNYXJnaW5MZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5SaWdodDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luVG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhIZWln
aHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlN
aW5IZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1pbldpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPcGFjaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcnBoYW5zOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlPdXRsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3V0bGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1dyYXA6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU92ZXJmbG93WDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dZOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nQm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQ
YWRkaW5nTGVmdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1JpZ2h0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlQYWRkaW5nVG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtBZnRl
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlQYWdlQnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBvaW50ZXJFdmVudHM6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlSZXNp
emU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVJpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTaXpl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTcGVhazoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGFiU2l6
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGFibGVMYXlvdXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRBbGlnbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRJbmRlbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVyZmxv
dzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFJlbmRlcmluZzoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dFRyYW5zZm9ybToKKyAgICBjYXNlIENTU1Byb3BlcnR5VG9wOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlVbmljb2RlQmlkaToKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBjYXNl
IENTU1Byb3BlcnR5VmFyaWFibGU6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5VmVydGlj
YWxBbGlnbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0QW5pbWF0aW9uRGVsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFu
aW1hdGlvbkRpcmVjdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRHVy
YXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkZpbGxNb2RlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25JdGVyYXRpb25Db3VudDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uTmFtZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QW5pbWF0aW9uUGxheVN0YXRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRp
b25UaW1pbmdGdW5jdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwZWFyYW5jZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXNwZWN0UmF0aW86CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDb21w
b3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRPcmlnaW46CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJGaXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6
b250YWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJJbWFnZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVmVydGljYWxTcGFjaW5nOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hBbGlnbjoKKyNpZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9O
X0JSRUFLKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hEZWNvcmF0aW9uQnJlYWs6Cisj
ZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGlyZWN0aW9uOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hGbGV4OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hG
bGV4R3JvdXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveExpbmVzOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3hPcmRpbmFsR3JvdXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJveE9yaWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UGFjazoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Q29sb3JDb3JyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRDb2x1bW5BeGlzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVh
a0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0JlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1
bW5HYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblByb2dyZXNzaW9uOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdENvbHVtblJ1bGVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uUnVsZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5TcGFuOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aDoKKyNpZiBFTkFCTEUoQ1VSU09SX1ZJ
U0lCSUxJVFkpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEN1cnNvclZpc2liaWxpdHk6Cisj
ZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25Db250ZW50OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRBbGlnbkl0ZW1zOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bGlnblNlbGY6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhCYXNpczoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0RmxleERpcmVjdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0RmxleEdyb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhTaHJpbms6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhXcmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRKdXN0aWZ5Q29udGVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3JkZXI6CisjaWYg
RU5BQkxFKENTU19SRUdJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93RnJvbToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxvd0ludG86CisjZW5kaWYKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Rm9udEtlcm5pbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZv
bnRTbW9vdGhpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRWYXJpYW50TGlnYXR1
cmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIaWdobGlnaHQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUNoYXJhY3RlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0SHlwaGVuYXRlTGltaXRBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVu
YXRlTGltaXRCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0
TGluZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbnM6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdExpbmVBbGlnbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJy
ZWFrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQ2xhbXA6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdExpbmVHcmlkOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lU25h
cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZURpcmVjdGlvbjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQm94SW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZU91
dHNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlUmVwZWF0OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQm94SW1hZ2VXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0NsaXA6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza09y
aWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uWDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza1JlcGVhdFg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRZOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TmJzcE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3Jp
Z2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luWToKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UHJpbnRDb2xvckFkanVzdDoKKyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRSZWdpb25CcmVha0luc2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uT3Zl
cmZsb3c6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UnRsT3JkZXJpbmc6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ1YnlQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dENvbWJpbmU6CisjaWYgRU5BQkxFKENTUzNfVEVYVCkKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25MaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RGVjb3JhdGlvblN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0
QWxpZ25MYXN0OgorI2VuZGlmIC8vIENTUzNfVEVYVAorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRUZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhh
c2lzUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1N0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0U2VjdXJpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRTdHJva2VDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2lu
WDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNmb3JtU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRp
b25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VXNlckRyYWc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2Rp
Znk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJTZWxlY3Q6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdENsaXBQYXRoOgorI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFNoYXBlTWFyZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZVBhZGRpbmc6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBUaHJvdWdoOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRTaGFwZUluc2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRz
aWRlOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdpZG93czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2lkdGg6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdvcmRCcmVhazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V29yZFNwYWNpbmc6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206CisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRB
VElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5TWF4Wm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5
TWluWm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3JpZW50YXRpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVVzZXJab29tOgorI2VuZGlmCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAv
LyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCisgICAgICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZh
bHVlKTsKKyNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorfQorCitQYXNzUmVmUHRyPFN0
eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0
eSwgQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCisg
ICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19j
YXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOworCisgICAgaWYgKHZhbHVlLT5pc0ltYWdlR2Vu
ZXJhdG9yVmFsdWUoKSkgeworICAgICAgICBpZiAodmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQor
ICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwg
c3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVz
UmVzb2x2ZWQodGhpcykuZ2V0KCkpOworICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5n
RnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4o
dmFsdWUpKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAgICBpZiAodmFs
dWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQorICAgICAgICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZh
bHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVlKj4odmFsdWUpKTsKKyNl
bmRpZgorCisgICAgaWYgKHZhbHVlLT5pc0N1cnNvckltYWdlVmFsdWUoKSkKKyAgICAgICAgcmV0
dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vy
c29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0
cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VWYWx1ZSogdmFsdWUpCit7CisgICAgUmVmUHRy
PFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlKCk7CisgICAg
aWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBl
bmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4g
aW1hZ2UucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2
ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBD
U1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzUGVuZGlu
ZygpKSB7CisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9w
ZXJ0eSwgdmFsdWUpOworICAgICAgICByZXR1cm4gU3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2
YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFs
dWUpOworfQorCisjaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCitQYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHBy
b3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1ZSkKK3sKKyAgICBSZWZQdHI8U3R5bGVJbWFn
ZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7Cisg
ICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICBtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKKyAgICByZXR1
cm4gaW1hZ2UucmVsZWFzZSgpOworfQorI2VuZGlmCisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4g
U3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJv
cGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZhbHVlKQoreworICAgIFJlZlB0cjxTdHlsZUlt
YWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZShkb2N1bWVudCgpKTsKKyAg
ICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUu
cGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVy
biBpbWFnZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29t
Q2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQorewor
ICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVa
b29tKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hp
bGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOworICAgIEZvbnREZXNjcmlwdGlvbiBu
ZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKKyAgICBzZXRGb250U2l6ZShuZXdGb250RGVz
Y3JpcHRpb24sIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkpOworICAgIHN0eWxlLT5zZXRGb250
RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
OjpjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZv
bnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7CisKKyAgICBpZiAoY2hpbGRGb250LmlzQWJz
b2x1dGVTaXplKCkgfHwgIXBhcmVudFN0eWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnQgPSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0
aW9uKCk7CisgICAgaWYgKGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50
Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZv
ciBub3csIGx1bXAgYWxsIGZhbWlsaWVzIGJ1dCBtb25vc3BhY2UgdG9nZXRoZXIuCisgICAgaWYg
KGNoaWxkRm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VG
YW1pbHkKKyAgICAgICAgJiYgcGFyZW50Rm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2Ny
aXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGtu
b3cgdGhlIHBhcmVudCBpcyBtb25vc3BhY2Ugb3IgdGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5k
IHRoYXQgZm9udAorICAgIC8vIHNpemUgd2FzIHVuc3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxl
IG91ciBmb250IHNpemUgYXMgYXBwcm9wcmlhdGUuCisgICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBh
IGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSByZWZldGNoIGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFu
CisgICAgLy8gbXVsdGlwbHlpbmcgYnkgb3VyIHNjYWxlIGZhY3Rvci4KKyAgICBmbG9hdCBzaXpl
OworICAgIGlmIChjaGlsZEZvbnQua2V5d29yZFNpemUoKSkKKyAgICAgICAgc2l6ZSA9IGZvbnRT
aXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5
d29yZFNpemUoKSAtIDEsIGNoaWxkRm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpOworICAgIGVs
c2UgeworICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Cisg
ICAgICAgIGZsb2F0IGZpeGVkU2NhbGVGYWN0b3IgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRl
ZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYgc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKQorICAg
ICAgICAgICAgPyBzdGF0aWNfY2FzdDxmbG9hdD4oc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRT
aXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpCisgICAgICAgICAgICA6IDE7Cisg
ICAgICAgIHNpemUgPSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSA/CisgICAgICAg
ICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgor
ICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFj
dG9yOworICAgIH0KKworICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hp
bGRGb250KTsKKyAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIHNpemUpOworICAg
IHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKK30KKwordm9p
ZCBTdHlsZVJlc29sdmVyOjppbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykK
K3sKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwor
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVy
aW5nTW9kZSgpKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1l
bnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFi
bGVkKCkpOworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9j
dW1lbnRTZXR0aW5ncygpLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKKyAgICBpZiAoIXN0YW5kYXJk
Rm9udEZhbWlseS5pc0VtcHR5KCkpIHsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFt
aWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udEZhbWlseSk7CisgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKKyAgICB9CisgICAgZm9udERlc2Ny
aXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsg
MSk7CisgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQo
ZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKSk7CisgICAgbV9zdGF0ZS5zdHlsZSgp
LT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAgICBt
X3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBzZXRGb250RGVzY3JpcHRpb24oZm9u
dERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250
RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgZmxvYXQgc2l6ZSkKK3sKKyAgICBmb250RGVz
Y3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0
Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCks
IG1fc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUs
IHVzZVNWR1pvb21SdWxlcygpKSk7Cit9CisKK2Zsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVz
ZVNWR1pvb21SdWxlcykKK3sKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gMS4wZjsKKyAgICBpZiAo
IXVzZVNWR1pvb21SdWxlcykgeworICAgICAgICB6b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2
ZVpvb20oKTsKKyAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQor
ICAgICAgICAgICAgem9vbUZhY3RvciAqPSBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKTsKKyAgICB9
CisKKyAgICByZXR1cm4gU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmll
ZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0b3IsIGlzQWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXpl
KTsKK30KKworZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmll
ZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBmbG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1
dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNl
U21hcnRNaW5pbXVtRm9yRm9udFNpemUpCit7CisgICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQg
c2l6ZSBzaG91bGQgbm90IGJlIHZpc2libGUgYW5kIHRoZXJlZm9yZSBuZWVkcyB0byBiZQorICAg
IC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0gZm9udCBzaXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24g
dGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAorICAgIC8vIHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNv
bXBhdGlibGUgd2l0aCBvdGhlciBicm93c2VycyB0aGF0IGhhdmUgbWluaW11bQorICAgIC8vIGZv
bnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBGaXJlZm94KS4KKyAgICBpZiAoZmFic2Yoc3BlY2lmaWVk
U2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKQorICAgICAgICBy
ZXR1cm4gMC4wZjsKKworICAgIC8vIFdlIHN1cHBvcnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9u
dCBzaXplLiBUaGUgZmlyc3QgaXMgYSBoYXJkIG92ZXJyaWRlIHRoYXQgYXBwbGllcyB0bworICAg
IC8vIGFsbCBmb250cy4gVGhpcyBpcyAibWluU2l6ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5p
bXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFydCBtaW5pbXVtIgorICAgIC8vIHRoYXQgaXMgYXBwbGll
ZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdlIGNhbid0IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBh
c2tlZCBmb3IsIGUuZy4sCisgICAgLy8gd2hlbiBpdCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAi
c21hbGwiIG9yIGV4cHJlc3NlcyB0aGUgZm9udC1zaXplIGFzIGEgcGVyY2VudGFnZSBvZgorICAg
IC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBmb250IHNldHRpbmcuCisKKyAgICAvLyBXaXRoIHRoZSBz
bWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3YW50IHRvIGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmlt
dW0gZm9udCBzaXplIHRvIGtlZXAgZm9udHMgcmVhZGFibGUuCisgICAgLy8gSG93ZXZlciB3ZSBh
bHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8gc2V0IGFuIGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBp
cyBzbWFsbGVyLAorICAgIC8vIHNpbmNlIHNpdGVzIHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2Ug
KGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNwb3QuY29tIHdpdGggYSA5cHggbWluaW11bSkuCisKKyAg
ICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNl
dHRpbmdzKQorICAgICAgICByZXR1cm4gMS4wZjsKKworICAgIGludCBtaW5TaXplID0gc2V0dGlu
Z3MtPm1pbmltdW1Gb250U2l6ZSgpOworICAgIGludCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdz
LT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7CisgICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNp
ZmllZFNpemUgKiB6b29tRmFjdG9yOworCisgICAgLy8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBm
aXJzdC4gV2Ugb25seSBhcHBseSB0aGUgaGFyZCBtaW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2Un
cmUgc3RpbGwgdG9vIHNtYWxsLgorICAgIGlmICh6b29tZWRTaXplIDwgbWluU2l6ZSkKKyAgICAg
ICAgem9vbWVkU2l6ZSA9IG1pblNpemU7CisKKyAgICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBt
aW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlzIGFsc28gb25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxs
IHRvbyBzbWFsbAorICAgIC8vIGFmdGVyIHpvb21pbmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRo
ZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIgZGVmYXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQor
ICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGFibGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5
IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVtIHdoZW5ldmVyIHdlJ3JlIHBvc2l0aXZlCisgICAgLy8g
ZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0aGUgbGF5b3V0LgorICAgIGlmICh1c2VTbWFydE1pbmlt
dW1Gb3JGb250U2l6ZSAmJiB6b29tZWRTaXplIDwgbWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmll
ZFNpemUgPj0gbWluTG9naWNhbFNpemUgfHwgIWlzQWJzb2x1dGVTaXplKSkKKyAgICAgICAgem9v
bWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXplOworCisgICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNv
bmFibGUgbWF4aW11bSB0byBwcmV2ZW50IGluc2FuZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBj
cmFzaGVzIG9uIHZhcmlvdXMKKyAgICAvLyBwbGF0Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwg
V2luZG93cy4pCisgICAgcmV0dXJuIG1pbihtYXhpbXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRT
aXplKTsKK30KKworY29uc3QgaW50IGZvbnRTaXplVGFibGVNYXggPSAxNjsKK2NvbnN0IGludCBm
b250U2l6ZVRhYmxlTWluID0gOTsKK2NvbnN0IGludCB0b3RhbEtleXdvcmRzID0gODsKKworLy8g
V2luSUUvTmF2NCB0YWJsZSBmb3IgZm9udCBzaXplcy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxl
Z2FjeSBmb250IG1hcHBpbmcgc3lzdGVtIG9mIEhUTUwuCitzdGF0aWMgY29uc3QgaW50IHF1aXJr
c0ZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0
b3RhbEtleXdvcmRzXSA9Cit7CisgICAgICB7IDksICAgIDksICAgICA5LCAgICAgOSwgICAgMTEs
ICAgIDE0LCAgICAxOCwgICAgMjggfSwKKyAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAg
ICAxMiwgICAgMTUsICAgIDIwLCAgICAzMSB9LAorICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAg
MTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDM0IH0sCisgICAgICB7IDksICAgIDksICAgIDEw
LCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzcgfSwKKyAgICAgIHsgOSwgICAgOSwg
ICAgMTAsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250
IGRlZmF1bHQgKDEzKQorICAgICAgeyA5LCAgICA5LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAy
MSwgICAgMjgsICAgIDQyIH0sCisgICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcs
ICAgIDIzLCAgICAzMCwgICAgNDUgfSwKKyAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAg
ICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQg
KDE2KQorfTsKKy8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAg
ICA2ICAgICAgNworLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAgIG0gICAgICBsICAgICB4bCAg
ICAgeHhsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgICAg
ICAgICAgdXNlciBwcmVmCisKKy8vIFN0cmljdCBtb2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5k
IE1vemlsbGEncyBzZXR0aW5ncyBleGFjdGx5Lgorc3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250
U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxL
ZXl3b3Jkc10gPQoreworICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAx
NCwgICAgMTgsICAgIDI3IH0sCisgICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIs
ICAgIDE1LCAgICAyMCwgICAgMzAgfSwKKyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAg
ICAxMywgICAgMTcsICAgIDIyLCAgICAzMyB9LAorICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAg
MTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM2IH0sCisgICAgICB7IDksICAgMTAsICAgIDEy
LCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZh
dWx0ICgxMykKKyAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDE0LCAgICAxNywgICAgMjEsICAg
IDI4LCAgICA0MiB9LAorICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTUsICAgIDE4LCAgICAy
MywgICAgMzAsICAgIDQ1IH0sCisgICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgs
ICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikK
K307CisvLyBIVE1MICAgICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAg
ICAgIDcKKy8vIENTUyAgeHhzICAgeHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4
bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAg
IHVzZXIgcHJlZgorCisvLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJs
ZSwgd2UgdXNlIFRvZGQgRmFocm5lcidzIHN1Z2dlc3RlZCBzY2FsZQorLy8gZmFjdG9ycyBmb3Ig
ZWFjaCBrZXl3b3JkIHZhbHVlLgorc3RhdGljIGNvbnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0
b3RhbEtleXdvcmRzXSA9IHsgMC42MGYsIDAuNzVmLCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41Ziwg
Mi4wZiwgMy4wZiB9OworCitmbG9hdCBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQo
RG9jdW1lbnQqIGRvY3VtZW50LCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1
bHRTaXplKQoreworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygp
OworICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgIHJldHVybiAxLjBmOworCisgICAgYm9vbCBx
dWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOworICAgIGludCBtZWRpdW1TaXpl
ID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250
U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXpl
ID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7
CisgICAgICAgIC8vIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSB0YWJsZS4KKyAgICAgICAgaW50
IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWluOworICAgICAgICBpbnQgY29sID0g
KGtleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGwpOworICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/
IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XVtjb2xdIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3dd
W2NvbF07CisgICAgfQorCisgICAgLy8gVmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhl
IHRhYmxlLiBBcHBseSB0aGUgc2NhbGUgZmFjdG9yIGluc3RlYWQuCisgICAgZmxvYXQgbWluTG9n
aWNhbFNpemUgPSBtYXgoc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7Cisg
ICAgcmV0dXJuIG1heChmb250U2l6ZUZhY3RvcnNba2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0q
bWVkaXVtU2l6ZSwgbWluTG9naWNhbFNpemUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgor
c3RhdGljIGludCBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBj
b25zdCBUKiB0YWJsZSwgaW50IG11bHRpcGxpZXIpCit7CisgICAgLy8gSWdub3JlIHRhYmxlWzBd
IGJlY2F1c2UgeHgtc21hbGwgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQg
c2l6ZS4KKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsK
KyAgICAgICAgaWYgKHBpeGVsRm9udFNpemUgKiAyIDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFd
KSAqIG11bHRpcGxpZXIpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJu
IHRvdGFsS2V5d29yZHMgLSAxOworfQorCitpbnQgU3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNp
emUoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VG
aXhlZERlZmF1bHRTaXplKQoreworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5z
ZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgIHJldHVybiAxOworCisgICAg
Ym9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOworICAgIGludCBtZWRp
dW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4
ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRp
dW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxl
TWF4KSB7CisgICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsK
KyAgICAgICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRT
aXplLCBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNp
emVUYWJsZVtyb3ddLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lG
b250U2l6ZTxmbG9hdD4ocGl4ZWxGb250U2l6ZSwgZm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXpl
KTsKK30KKworc3RhdGljIENvbG9yIGNvbG9yRm9yQ1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCit7
CisgICAgc3RydWN0IENvbG9yVmFsdWUgeworICAgICAgICBpbnQgY3NzVmFsdWVJZDsKKyAgICAg
ICAgUkdCQTMyIGNvbG9yOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBj
b2xvclZhbHVlc1tdID0geworICAgICAgICB7IENTU1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAor
ICAgICAgICB7IENTU1ZhbHVlQmxhY2ssIDB4RkYwMDAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1
ZUJsdWUsIDB4RkYwMDAwRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAw
RkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUdyYXksIDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBD
U1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAwICB9LAorICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhG
RjgwODA4MCB9LAorICAgICAgICB7IENTU1ZhbHVlTGltZSwgMHhGRjAwRkYwMCB9LAorICAgICAg
ICB7IENTU1ZhbHVlTWFyb29uLCAweEZGODAwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVOYXZ5
LCAweEZGMDAwMDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwK
KyAgICAgICAgeyBDU1NWYWx1ZU9yYW5nZSwgMHhGRkZGQTUwMCB9LAorICAgICAgICB7IENTU1Zh
bHVlUHVycGxlLCAweEZGODAwMDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAw
MDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVNpbHZlciwgMHhGRkMwQzBDMCB9LAorICAgICAgICB7
IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4MCAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFy
ZW50LCAweDAwMDAwMDAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9
LAorICAgICAgICB7IENTU1ZhbHVlWWVsbG93LCAweEZGRkZGRjAwIH0sCisgICAgICAgIHsgMCwg
MCB9CisgICAgfTsKKworICAgIGZvciAoY29uc3QgQ29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1
ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytjb2wpIHsKKyAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJ
ZCA9PSBjc3NWYWx1ZUlkKQorICAgICAgICAgICAgcmV0dXJuIGNvbC0+Y29sb3I7CisgICAgfQor
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1Zh
bHVlSWQpOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVl
SXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlKQoreworICAgIGlu
dCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOworICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBj
YXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0TGluazoKKyAg
ICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVu
dGNvbG9yOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorfQorCitDb2xvciBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21Qcmlt
aXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmsp
IGNvbnN0Cit7CisgICAgaWYgKHZhbHVlLT5pc1JHQkNvbG9yKCkpCisgICAgICAgIHJldHVybiBD
b2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7CisKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOworICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOworICAgIHN3aXRj
aCAoaWRlbnQpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBDb2xvcigpOworICAgIGNh
c2UgQ1NTVmFsdWVXZWJraXRUZXh0OgorICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+
dGV4dENvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6CisgICAgICAgIHJldHVy
biAoc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSAmJiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5k
b2N1bWVudCgpLT52aXNpdGVkTGlua0NvbG9yKCkgOiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29s
b3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKKyAgICAgICAgcmV0dXJu
IHN0YXRlLmRvY3VtZW50KCktPmFjdGl2ZUxpbmtDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVX
ZWJraXRGb2N1c1JpbmdDb2xvcjoKKyAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1Jp
bmdDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6CisgICAgICAgIHJldHVy
biBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBj
b2xvckZvckNTU1ZhbHVlKGlkZW50KTsKKyAgICB9Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
YWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAq
IGV4cHIsIGJvb2wgcmVzdWx0KQoreworICAgIG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5
UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3Vs
dCkpKTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2Uo
KSBjb25zdAoreworICAgIHVuc2lnbmVkIHMgPSBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHMuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsK
KyAgICAgICAgaWYgKG1fbWVkaXVtLT5ldmFsKCZtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lvbikgIT0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJh
dGlvblR5cGUgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgewor
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9u
OiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRTsKKyAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246OlNDQUxFX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2Nh
bGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9Z
OworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWjsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8zRDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRp
b246OlRSQU5TTEFURTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xB
VEVfWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKKyAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWjsKKyAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9y
bU9wZXJhdGlvbjo6Uk9UQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFU
RV9YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9ZOworICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpST1RBVEVfM0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tl
d1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKKyAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpTS0VXX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4
VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7Cisg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8zRDsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJu
IFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVSU1BFQ1RJVkU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6Tk9ORTsKKyAgICB9CisgICAgcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9O
RTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENT
U1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCit7CisgICAgaWYgKCFpblZh
bHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7CisgICAgICAgIG91dE9wZXJhdGlvbnMu
Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZsb2F0IHpvb21G
YWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29tKCkgOiAxOworICAgIFRyYW5zZm9y
bU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkg
PSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKKyAgICAgICAgQ1NTVmFsdWUq
IGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKworICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqIHRyYW5zZm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihpLnZhbHVlKCkpOworICAgICAgICBpZiAoIXRyYW5zZm9y
bVZhbHVlLT5sZW5ndGgoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJvb2wg
aGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9
IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgaWYg
KCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVW
YWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
ICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsK
KworICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRp
b246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9y
bU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZ
VHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7CisgICAg
ICAgICAgICBkb3VibGUgc3kgPSAxLjA7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUt
Pm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNm
b3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91Ymxl
VmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RW
YWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJh
bnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7
CisgICAgICAgICAgICBkb3VibGUgc3ogPSAxLjA7CisgICAgICAgICAgICBpZiAodHJhbnNmb3Jt
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVa
VHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0
RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVy
YXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9w
ZXJhdGlvbikKKyAgICAgICAgICAgICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5v
cGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9y
bU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxl
bmd0aCgpID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkg
eworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29u
ZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxl
VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0
aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Cisg
ICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVu
Z3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZ
VHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRM
ZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZp
cnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEp
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vj
b25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp
ZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAs
IEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoK
KyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zv
cm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7
CisgICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAg
TGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1W
YWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVaVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxv
YXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAg
ICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAg
ICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAg
ICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUs
IHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3Jt
T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVu
Z3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
dGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOworICAgICAgICAgICAgICAgICAgICAgICAg
dHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aCh0aGlyZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6
b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZh
bHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR4
LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4
LCB0eSwgdHosIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogewor
ICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsK
KyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCAxLCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90
YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAg
ZG91YmxlIHggPSAwOworICAgICAgICAgICAgZG91YmxlIHkgPSAwOworICAgICAgICAgICAgZG91
YmxlIHogPSAwOworICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0
ZURlZ3JlZXMoKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRp
b24pCisgICAgICAgICAgICAgICAgeCA9IDE7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3Rh
dGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHkgPSAxOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIHogPSAxOworICAgICAgICAgICAgb3BlcmF0aW9ucy5v
cGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHks
IHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVy
YXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjog
eworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDQpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0
aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVW
YWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKTsKKyAgICAgICAgICAgIGRvdWJs
ZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSB5
ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgeiA9
IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUg
PSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5
LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRp
b246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3Jt
T3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW5nbGVYID0gMDsKKyAgICAgICAgICAg
IGRvdWJsZSBhbmdsZVkgPSAwOworICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1
ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9w
ZXJhdGlvbikKKyAgICAgICAgICAgICAgICBhbmdsZVkgPSBhbmdsZTsKKyAgICAgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgICAgIGFuZ2xlWCA9IGFuZ2xlOworICAgICAgICAgICAgICAgIGlm
ICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGFuZ2xlWSA9IHNlY29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygp
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zv
cm1PcGVyYXRpb246OmNyZWF0ZShhbmdsZVgsIGFuZ2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0
cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUt
Pmxlbmd0aCgpIDwgNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRvdWJs
ZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBi
ID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3Vi
bGUgYyA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAg
ZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAg
ICAgIGRvdWJsZSBlID0gem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVW
YWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGYgPSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
ayg1KSktPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwg
ZSwgZikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCAxNikKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDApKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91Ymxl
VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQp
KS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDYpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91
YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDEwKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSkt
PmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZh
Y3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXRE
b3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVu
ZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1hdHJpeCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIExlbmd0aCBw
ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0
aCgpKQorICAgICAgICAgICAgICAgIHAgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVl
LCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgeworICAg
ICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdWlyayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4g
M2QgdHJhbnNmb3JtcyBhcmUgZmluYWxpemVkLgorICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwg
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIHAgPSB2YWwg
Pj0gMCA/IExlbmd0aChjbGFtcFRvUG9zaXRpdmVJbnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0
aChVbmRlZmluZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocC5pc1VuZGVm
aW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgb3Bl
cmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9u
OjpjcmVhdGUocCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjoKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKK3N0YXRpYyBGaWx0ZXJPcGVy
YXRpb246Ok9wZXJhdGlvblR5cGUgZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9uVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkg
eworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlv
bjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFOworICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
cmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOworICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3Bl
cmF0aW9uOjpTRVBJQTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZp
bHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7
CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9u
OgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpIVUVfUk9UQVRFOworICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFs
dWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRp
b246Ok9QQUNJVFk7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0Zp
bHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVT
UzsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlv
bjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q09OVFJBU1Q7CisgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJu
IEZpbHRlck9wZXJhdGlvbjo6QkxVUjsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpE
cm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9u
OjpEUk9QX1NIQURPVzsKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgY2FzZSBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmls
dGVyT3BlcmF0aW9uOjpDVVNUT007CisjZW5kaWYKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpOT05FOworICAgIH0KKyAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOworfQor
CisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQordm9pZCBTdHlsZVJlc29s
dmVyOjpsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpCit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKKyAgICBpZiAoIXN0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRp
bmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIENhY2hl
ZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCkt
PmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisgICAgVmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRp
b24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBzdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCku
b3BlcmF0aW9ucygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRp
b25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRl
ck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7CisgICAgICAgIGlmIChmaWx0ZXJP
cGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5D
RSkgeworICAgICAgICAgICAgUmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0
ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRp
b24uZ2V0KCkpOworCisgICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1
ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQo
KTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICBDYWNoZWRTVkdEb2N1bWVudCogY2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9h
ZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBTdGFzaCB0aGUg
Q2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhlIHJlZmVyZW5jZSBmaWx0ZXIuCisgICAgICAgICAgICBy
ZWZlcmVuY2VGaWx0ZXItPnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5l
dyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShjYWNoZWREb2N1bWVudCkpKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuY2xlYXIoKTsKK30KKyNl
bmRpZgorCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2
ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzV2Vi
S2l0Q1NTU2hhZGVyVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxl
U2hhZGVyRnJvbVZhbHVlKHN0YXRpY19jYXN0PFdlYktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUp
KTsKKyAgICByZXR1cm4gMDsKK30KKworU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hl
ZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1
ZSkKK3sKKyAgICBTdHlsZVNoYWRlciogc2hhZGVyID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1No
YWRlcigpOworICAgIGlmIChzaGFkZXIgJiYgc2hhZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKKyAg
ICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyh0cnVlKTsKKyAgICByZXR1cm4gc2hh
ZGVyOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU2hhZGVycygpCit7Cisg
ICAgaWYgKCFtX3N0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRp
bmdTaGFkZXJzKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENhY2hlZFJlc291cmNlTG9hZGVy
KiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3Vy
Y2VMb2FkZXIoKTsKKworICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0
ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9u
cygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUo
KTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlv
biA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7CisgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24t
PmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgeworICAgICAg
ICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKiBjdXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxD
dXN0b21GaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOworICAgICAgICAg
ICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKKyAgICAgICAgICAgIFN0eWxlQ3Vz
dG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3JhbSA9IHN0YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVy
UHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKKyAgICAgICAgICAgIGlmIChwcm9n
cmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5n
U2hhZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVy
VmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhT
aGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0
VmVydGV4U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2Fk
ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNo
YWRlcigpICYmIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7
CisgICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3Rh
dGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSkt
PmNzc1NoYWRlclZhbHVlKCk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRT
aGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1fc3RhdGUuc2V0SGFzUGVuZGlu
Z1NoYWRlcnMoZmFsc2UpOworfQorCitzdGF0aWMgYm9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNv
bXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJl
ZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBiKQoreworICAgIHJldHVybiBjb2RlUG9pbnRD
b21wYXJlTGVzc1RoYW4oYS0+bmFtZSgpLCBiLT5uYW1lKCkpOworfQorCitQYXNzUmVmUHRyPEN1
c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJh
eVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQorewor
ICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBD
dXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlcy0+bGVuZ3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgewor
ICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
aSk7CisgICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1C
RVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZh
bHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJu
IGFycmF5UGFyYW1ldGVyLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVy
KGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRy
PEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcj4gbnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmls
dGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7ICsraSkgeworICAgICAgICBDU1NWYWx1ZSogdmFsdWUg
PSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgIGlmICghdmFsdWUt
PmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBDU1NQ
cmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBl
KCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgbnVtYmVyUGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0
RG91YmxlVmFsdWUoKSk7CisgICAgfQorICAgIHJldHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFz
ZSgpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZl
cjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1l
LCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNm
b3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1QYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1Q
YXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKKyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlv
bnM7CisgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUo
KSwgbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOworICAgIHRyYW5zZm9y
bVBhcmFtZXRlci0+c2V0T3BlcmF0aW9ucyhvcGVyYXRpb25zKTsKKyAgICByZXR1cm4gdHJhbnNm
b3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJh
bWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0
cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBhcmFtZXRlclZhbHVlKQoreworICAgIC8vIEZJWE1FOiBJ
bXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVycyB0eXBlcyBwYXJzaW5nLgorICAgIC8vIGJvb2xlYW5z
OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKKyAgICAvLyB0
ZXh0dXJlczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCisg
ICAgLy8gbWF0MiwgbWF0MywgbWF0NDogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTcxNDQ0CisgICAgLy8gTnVtYmVyIHBhcmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRl
IGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwKKyAgICAvLyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVl
cyBpbmhlcml0IGZyb20gQ1NTVmFsdWVMaXN0LgorICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlz
VmFsdWVMaXN0KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgQ1NTVmFsdWVMaXN0KiB2YWx1
ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihwYXJhbWV0ZXJWYWx1ZSk7CisgICAgaWYg
KCF2YWx1ZXMtPmxlbmd0aCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwYXJhbWV0
ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJheUZ1bmN0aW9uVmFsdWUoKSkKKyAgICAgICAgcmV0dXJu
IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8v
IElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbGlzdCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwK
KyAgICAvLyB0aGVuIHdlIGNvdWxkIHNhZmVseSBhc3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmlu
ZyBpdGVtcworICAgIC8vIGFyZSB0cmFuc2Zvcm1zLiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9y
bVBhcmFtZXRlciB3aWxsCisgICAgLy8gcmV0dXJuIDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGlu
Y29ycmVjdC4KKyAgICBpZiAodmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dl
YktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRl
clRyYW5zZm9ybVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOworCisgICAgLy8gV2UgY2FuIGhhdmUg
b25seSBhcnJheXMgb2YgYm9vbGVhbnMgb3IgbnVtYmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1
ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9zZSB0d28uCisgICAgLy8gV2UgbmVlZCB1cCB0byA0IHZh
bHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFsbCBudW1iZXJzKS4KKyAgICBpZiAoIXZhbHVlcy0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVu
Z3RoKCkgPiA0KQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBDU1NQcmltaXRpdmVWYWx1
ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKyAgICBpZiAoZmlyc3RQcmltaXRp
dmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVS
KQorICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwg
dmFsdWVzKTsKKworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFy
YW1ldGVyIGhlcmUuCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTc2NDM4CisKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJz
ZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3Vz
dG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYgcGFyYW1ldGVyTGlzdCkKK3sKKyAgICBIYXNoU2V0PFN0
cmluZz4ga25vd25QYXJhbWV0ZXJOYW1lczsKKyAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJh
bWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJzVmFsdWUpOworICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVy
YXRvci5oYXNNb3JlKCk7IHBhcmFtZXRlckl0ZXJhdG9yLmFkdmFuY2UoKSkgeworICAgICAgICBp
ZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCktPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBh
cmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0
aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
PihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRp
dmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJTkcpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZh
bHVlLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRl
IHBhcmFtZXRlciBuYW1lcy4KKyAgICAgICAgaWYgKGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFp
bnMobmFtZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGtub3duUGFyYW1l
dGVyTmFtZXMuYWRkKG5hbWUpOworICAgICAgICAKKyAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgp
OworICAgICAgICAKKyAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNNb3JlKCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFy
YW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVy
YXRvci52YWx1ZSgpKTsKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXIpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIHBhcmFtZXRlckxpc3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNl
KCkpOworICAgIH0KKyAgICAKKyAgICAvLyBNYWtlIHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVy
cyBiZWZvcmUgcGFzc2luZyB0aGVtIGRvd24gdG8gdGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4K
KyAgICBzdGQ6OnNvcnQocGFyYW1ldGVyTGlzdC5iZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgp
LCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IpOworICAgIAorICAgIHJldHVybiB0cnVl
OworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6
Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVu
dCBzdHlsZSByZXNvbHV0aW9uIGZvciB0aGUgY3VzdG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5j
ZSBzeW50YXguCisgICAgVU5VU0VEX1BBUkFNKGZpbHRlclZhbHVlKTsKKyAgICByZXR1cm4gMDsK
K30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVy
VmFsdWUqIGZpbHRlclZhbHVlKQoreworICAgIENTU1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0
ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKKyAgICBBU1NFUlRfV0lUSF9TRUNV
UklUWV9JTVBMSUNBVElPTihzaGFkZXJzVmFsdWUtPmlzVmFsdWVMaXN0KCkpOworICAgIENTU1Zh
bHVlTGlzdCogc2hhZGVyc0xpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJz
VmFsdWUpOworCisgICAgdW5zaWduZWQgc2hhZGVyc0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+
bGVuZ3RoKCk7CisgICAgQVNTRVJUKHNoYWRlcnNMaXN0TGVuZ3RoKTsKKworICAgIFJlZlB0cjxT
dHlsZVNoYWRlcj4gdmVydGV4U2hhZGVyID0gc3R5bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMCkpOworICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRT
aGFkZXI7CisgICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFN
X1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVYVFVSRTsKKyAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4
U2V0dGluZ3MgbWl4U2V0dGluZ3M7CisKKyAgICBpZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7
CisgICAgICAgIENTU1ZhbHVlKiBmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJz
TGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKKworICAgICAgICBpZiAoZnJhZ21lbnRT
aGFkZXJPck1peEZ1bmN0aW9uLT5pc1dlYktpdENTU01peEZ1bmN0aW9uVmFsdWUoKSkgeworICAg
ICAgICAgICAgV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNf
Y2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0
aW9uKTsKKyAgICAgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0
aW9uKTsKKworICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSk7CisgICAg
ICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOwor
ICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworCisgICAgICAgICAgICBBU1NFUlQobWl4
RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhh
c01vcmUoKSkgeworICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVW
YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7
CisgICAgICAgICAgICAgICAgaWYgKENTU1BhcnNlcjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1v
ZGUgPSAqcHJpbWl0aXZlVmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2Vy
Ojppc0NvbXBvc2l0ZU9wZXJhdG9yKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAg
ICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuY29tcG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZl
VmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBS
T0dSQU1fVFlQRV9OT19FTEVNRU5UX1RFWFRVUkU7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRl
ciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7CisgICAgICAgIH0K
KyAgICB9CisgICAgCisgICAgdW5zaWduZWQgbWVzaFJvd3MgPSAxOworICAgIHVuc2lnbmVkIG1l
c2hDb2x1bW5zID0gMTsKKyAgICBDdXN0b21GaWx0ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hU
eXBlQXR0YWNoZWQ7CisgICAgCisgICAgQ1NTVmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7Cisg
ICAgCisgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgQ1NTVmFs
dWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IoZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMSkpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0
aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyczoKKyAgICAgICAgLy8gSWYgaXQg
c3RhcnRzIHdpdGggYSBudW1iZXIgb3IgYW55IG9mIHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBp
dCBpcyAKKyAgICAgICAgLy8gdGhlIG1lc2gtYm94IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBp
cyB0aGUgcGFyYW1ldGVycyBsaXN0LgorCisgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkg
JiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051
bWJlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBp
cyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0IGJvdGgKKyAgICAgICAgICAgICAgICAvLyB0aGUgcm93
cyBhbmQgdGhlIGNvbHVtbnMuCisgICAgICAgICAgICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93
cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGl0ZXJh
dG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUcnkg
dG8gbWF0Y2ggYW5vdGhlciBudW1iZXIgZm9yIHRoZSByb3dzLgorICAgICAgICAgICAgICAgIGlm
IChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAg
ICAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1By
aW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRp
dmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUo
KSk7CisgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVEZXRhY2hlZCkgeworICAgICAgICAgICAgICAgIG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hl
ZDsKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghaXRlcmF0b3IuaW5kZXgoKSkgeworICAg
ICAgICAgICAgLy8gSWYgbm8gdmFsdWUgd2FzIGNvbnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUs
IHRoZW4gaXQgaXMganVzdCBhIHBhcmFtZXRlciBsaXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVw
CisgICAgICAgICAgICAvLyBoYXZpbmcganVzdCB0d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBz
aGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFtZXRlcnMuCisgICAgICAgICAgICBBU1NFUlQoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpID09IDIpOworICAgICAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmls
dGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1
ZSkKKyAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMik7CisgICAgCisgICAgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0
ZXJMaXN0OworICAgIGlmIChwYXJhbWV0ZXJzVmFsdWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFy
YW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFsdWUsIHBhcmFtZXRlckxpc3QpKQorICAgICAgICByZXR1
cm4gMDsKKyAgICAKKyAgICBSZWZQdHI8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFt
ID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtOjpjcmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2Uo
KSwgZnJhZ21lbnRTaGFkZXIucmVsZWFzZSgpLCBwcm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1l
c2hUeXBlKTsKKyAgICByZXR1cm4gQ3VzdG9tRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3Jh
bS5yZWxlYXNlKCksIHBhcmFtZXRlckxpc3QsIG1lc2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5
cGUpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZl
cjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0
ZXJWYWx1ZSkKK3sKKyAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpKTsKKyAgICBib29s
IGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKTsKKyAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVu
Y2VTeW50YXggPyBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNl
U3ludGF4KGZpbHRlclZhbHVlKSA6IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxp
bmVTeW50YXgoZmlsdGVyVmFsdWUpOworfQorCisjZW5kaWYKKworYm9vbCBTdHlsZVJlc29sdmVy
OjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSog
c3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJh
dGlvbnMpCit7CisgICAgQVNTRVJUKG91dE9wZXJhdGlvbnMuaXNFbXB0eSgpKTsKKyAgICAKKyAg
ICBpZiAoIWluVmFsdWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiAoaW5W
YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7
CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUp
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaWYgKCFpblZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmbG9hdCB6b29t
RmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpIDogMTsKKyAgICBGaWx0ZXJP
cGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0g
aW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgIENTU1ZhbHVlKiBj
dXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAgIGlmICghY3VyclZhbHVlLT5pc1dlYktpdENT
U0ZpbHRlclZhbHVlKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJW
YWx1ZSo+KGkudmFsdWUoKSk7CisgICAgICAgIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlw
ZSBvcGVyYXRpb25UeXBlID0gZmlsdGVyT3BlcmF0aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKTsKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgaWYgKG9w
ZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpWQUxJREFURURfQ1VTVE9NKSB7CisgICAg
ICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0b21GaWx0ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2Vk
IHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVyU3R5bGUuCisgICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChv
cGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NKSB7CisgICAgICAgICAgICBS
ZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0
ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUpOworICAgICAgICAgICAgaWYgKCFvcGVyYXRpb24pCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0g
RmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAg
ICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgQ1NTVmFsdWUqIGFyZ3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMCk7CisKKyAgICAgICAgICAgIGlmICghYXJndW1lbnQtPmlzV2Vi
S2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0g
c3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSo+KGFyZ3VtZW50KTsKKyAgICAg
ICAgICAgIEtVUkwgdXJsID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1
bWVudFZhbHVlLT51cmwoKSk7CisKKyAgICAgICAgICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJP
cGVyYXRpb24+IG9wZXJhdGlvbiA9IFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2
Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1cmwuZnJhZ21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlv
blR5cGUpOworICAgICAgICAgICAgaWYgKFNWR1VSSVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJl
ZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgewor
ICAgICAgICAgICAgICAgIGlmICghc3ZnRG9jdW1lbnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQor
ICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3Bl
cmF0aW9uLmdldCgpLCBzdmdEb2N1bWVudFZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlm
IChzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKQorICAgICAgICAgICAgICAg
ICAgICBvcGVyYXRpb24tPnNldENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5l
dyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdE
b2N1bWVudCgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUg
cHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0aGUKKyAgICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Ag
c2hhZG93IHdoaWNoIGhhcyBhIFNoYWRvd1ZhbHVlIHBhcmFtZXRlci4KKyAgICAgICAgaWYgKG9w
ZXJhdGlvblR5cGUgIT0gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVykgeworICAgICAgICAg
ICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAo
dW5zaWduZWQgaiA9IDA7IGogPCBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCk7ICsraikgeworICAgICAg
ICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlz
UHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZl
VmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVl
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDApKSA6IDA7CisgICAgICAgIHN3aXRjaCAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkgeworICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJP
cGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVy
T3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZp
bHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9IDE7CisgICAgICAg
ICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBh
bW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlm
IChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50
IC89IDEwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91
bnQsIG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjog
eworICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gMDsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJW
YWx1ZS0+bGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUt
PmNvbXB1dGVEZWdyZWVzKCk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygp
LmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9w
ZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNh
c2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAg
ICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246
CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRp
b246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlv
bikgPyAwIDogMTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkg
eworICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQorICAgICAg
ICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZp
bHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
Qmx1ckZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9
IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID49IDEpCisgICAgICAgICAgICAgICAgc3RkRGV2aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5n
dGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAg
ICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1
ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN0ZERldmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICAgICAgQ1NTVmFsdWUqIGNzc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMCk7CisgICAgICAgICAgICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1Zh
bHVlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFNoYWRvd1Zh
bHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjc3NWYWx1ZSk7CisgICAgICAg
ICAgICBJbnRQb2ludCBsb2NhdGlvbihpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUs
IHJvb3RTdHlsZSwgem9vbUZhY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
dGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcikp
OworICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAg
ICAgIENvbG9yIGNvbG9yOworICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQorICAgICAgICAg
ICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkp
OworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRv
d0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGxvY2F0aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkg
PyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworI2VuZGlmCisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBl
bmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSogcGVuZGluZ0ltYWdlKQoreworICAgIENhY2hl
ZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQo
KS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKworICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0lt
YWdlVmFsdWUoKSkgeworICAgICAgICBDU1NJbWFnZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGlu
Z0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7CisgICAgICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNo
ZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJ
bWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7CisgICAgICAgIENTU0ltYWdlR2VuZXJh
dG9yVmFsdWUqIGltYWdlR2VuZXJhdG9yVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2Vu
ZXJhdG9yVmFsdWUoKTsKKyAgICAgICAgaW1hZ2VHZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdl
cyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZElt
YWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0b3JWYWx1ZSk7CisgICAgfQorCisgICAgaWYgKHBlbmRp
bmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpKSB7CisgICAgICAgIENTU0N1cnNvckltYWdl
VmFsdWUqIGN1cnNvckltYWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFs
dWUoKTsKKyAgICAgICAgcmV0dXJuIGN1cnNvckltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hl
ZFJlc291cmNlTG9hZGVyKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAg
ICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1h
Z2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1
ZSgpOworICAgICAgICByZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVk
UmVzb3VyY2VMb2FkZXIpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZXMoKQoreworICAgIGlmIChtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBt
X3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5lbmQoKS5rZXlzKCk7CisgICAgZm9yIChQ
ZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5iZWdpbigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIENTU1Byb3BlcnR5SUQgY3VycmVudFByb3BlcnR5ID0gKml0OworCisgICAg
ICAgIHN3aXRjaCAoY3VycmVudFByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kSW1hZ2U6IHsKKyAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5k
TGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vzc0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dy
b3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5ZXIgPSBiYWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgewor
ICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3Vu
ZExheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgICAgICBi
YWNrZ3JvdW5kTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5
bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3Bl
cnR5Q29udGVudDogeworICAgICAgICAgICAgZm9yIChDb250ZW50RGF0YSogY29udGVudERhdGEg
PSBjb25zdF9jYXN0PENvbnRlbnREYXRhKj4obV9zdGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgp
KTsgY29udGVudERhdGE7IGNvbnRlbnREYXRhID0gY29udGVudERhdGEtPm5leHQoKSkgeworICAg
ICAgICAgICAgICAgIGlmIChjb250ZW50RGF0YS0+aXNJbWFnZSgpKSB7CisgICAgICAgICAgICAg
ICAgICAgIFN0eWxlSW1hZ2UqIGltYWdlID0gc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+
KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLT5p
c1BlbmRpbmdJbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJ
bWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVu
ZGluZ0ltYWdlKj4oaW1hZ2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJ
bWFnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRl
bnREYXRhKj4oY29udGVudERhdGEpLT5zZXRJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1
cnNvcjogeworICAgICAgICAgICAgaWYgKEN1cnNvckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRl
LnN0eWxlKCktPmN1cnNvcnMoKSkgeworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgQ3Vy
c29yRGF0YSYgY3VycmVudEN1cnNvciA9IGN1cnNvckxpc3QtPmF0KGkpOworICAgICAgICAgICAg
ICAgICAgICBpZiAoU3R5bGVJbWFnZSogaW1hZ2UgPSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5k
aW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpKTsKKyAgICAg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5
bGVJbWFnZTogeworICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1h
Z2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdl
KCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShs
b2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5z
dHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU291cmNlOiB7CisgICAgICAg
ICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUu
c3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAg
ICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldEJvcmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5n
SW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJv
cmRlckltYWdlU291cmNlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVjdDogeworICAgICAgICAgICAgaWYg
KFN0eWxlUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVj
dCgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgTmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9
IHJlZmxlY3Rpb24tPm1hc2soKTsKKyAgICAgICAgICAgICAgICBpZiAobWFza0ltYWdlLmltYWdl
KCkgJiYgbWFza0ltYWdlLmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFn
ZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7Cisg
ICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9h
ZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNrSW1hZ2UuaW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZp
bGwoKSwgbWFza0ltYWdlLmJvcmRlclNsaWNlcygpLCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJ
bWFnZS5ob3Jpem9udGFsUnVsZSgpLCBtYXNrSW1hZ2UudmVydGljYWxSdWxlKCkpKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOiB7Cisg
ICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBt
X3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQor
ICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TWFza0JveEltYWdlU291cmNlKGxv
YWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0
eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZTogeworICAgICAg
ICAgICAgZm9yIChGaWxsTGF5ZXIqIG1hc2tMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNz
TWFza0xheWVycygpOyBtYXNrTGF5ZXI7IG1hc2tMYXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7
CisgICAgICAgICAgICAgICAgaWYgKG1hc2tMYXllci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmlt
YWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgICAgIG1hc2tMYXllci0+
c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+
KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJv
cGVydGllcygpLmNsZWFyKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdS
ZXNvdXJjZXMoKQoreworICAgIC8vIFN0YXJ0IGxvYWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkg
dGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ0ltYWdlcygpOworCisjaWYgRU5BQkxFKENTU19T
SEFERVJTKQorICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0
aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nU2hhZGVycygpOworI2VuZGlmCisgICAgCisjaWYg
RU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgIC8vIFN0YXJ0IGxvYWRpbmcg
dGhlIFNWRyBEb2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5k
aW5nU1ZHRG9jdW1lbnRzKCk7CisjZW5kaWYKK30KKworaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVkUHJvcGVydGllcygpCisgICAgOiBwb3NzaWJseVBhZGRl
ZE1lbWJlcigwKQoreworfQorCitpbmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRp
ZXM6On5NYXRjaGVkUHJvcGVydGllcygpCit7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9y
eU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2Jq
ZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVt
YmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0aWVzIik7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW06OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGlu
Zm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAg
IGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQcm9wZXJ0aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsK
KyAgICBpbmZvLmFkZE1lbWJlcihyYW5nZXMsICJyYW5nZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJl
cihyZW5kZXJTdHlsZSwgInJlbmRlclN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIocGFyZW50
UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5kZXJTdHlsZSIpOworfQorCit2b2lkIE1lZGlhUXVlcnlS
ZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdElu
Zm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywg
dGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1fZXhw
cmVzc2lvbiwgImV4cHJlc3Npb24iKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRN
ZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAorewor
ICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVN
ZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNl
dHMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2tleWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNS
dWxlTWFwIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAi
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ciIpOworCisgICAgaW5mby5hZGRNZW1iZXIobV9tZWRpdW0sICJtZWRpdW0iKTsKKyAgICBpbmZv
LmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0U3R5bGUsICJyb290RGVmYXVsdFN0eWxlIik7CisgICAg
aW5mby5hZGRNZW1iZXIobV9kb2N1bWVudCwgImRvY3VtZW50Iik7CisKKyAgICBpbmZvLmFkZE1l
bWJlcihtX2ZvbnRTZWxlY3RvciwgImZvbnRTZWxlY3RvciIpOworICAgIGluZm8uYWRkTWVtYmVy
KG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50
TWVkaWFRdWVyeVJlc3VsdHMiKTsKKyAgICBpbmZvLmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRl
cik7CisgICAgaW5mby5hZGRNZW1iZXIobV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBp
bmZvLmFkZE1lbWJlcihtX3Njb3BlUmVzb2x2ZXIsICJzY29wZVJlc29sdmVyIik7CisKKyAgICBp
bmZvLmFkZE1lbWJlcihtX3N0YXRlLCAic3RhdGUiKTsKKworICAgIC8vIEZJWE1FOiBtb3ZlIHRo
aXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3b3VsZCBiZSBjYWxsZWQgb25seSBvbmNlPworICAgIGlu
Zm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVs
dFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZh
dWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0UXVpcmtzU3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJl
cihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRT
dHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1bHRWaWV3U291cmNlU3R5bGUiKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVj
dG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0
b3IuY3BwCShyZXZpc2lvbiAxNDUxODEpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVD
b2xsZWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw1MTYxICsyNywxMDQgQEAKICAqLwog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorI2luY2x1
ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmgiCiAKLSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNs
dWRlICJDU1NCb3JkZXJJbWFnZS5oIgotI2luY2x1ZGUgIkNTU0NhbGN1bGF0aW9uVmFsdWUuaCIK
LSNpbmNsdWRlICJDU1NDdXJzb3JJbWFnZVZhbHVlLmgiCiAjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAiQ1NTRm9udEZhY2VSdWxlLmgiCi0jaW5jbHVkZSAiQ1NT
Rm9udFNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NTTGluZUJveENvbnRhaW5WYWx1ZS5oIgotI2lu
Y2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCi0jaW5jbHVkZSAi
Q1NTUHJpbWl0aXZlVmFsdWVNYXBwaW5ncy5oIgotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMu
aCIKLSNpbmNsdWRlICJDU1NSZWZsZWN0VmFsdWUuaCIKLSNpbmNsdWRlICJDU1NTZWxlY3Rvci5o
IgotI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgotI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5o
IgotI2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgotI2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0
aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKLSNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKLSNpbmNsdWRlICJDU1NWYXJpYWJsZVZhbHVlLmgiCi0jZW5kaWYKLSNpbmNsdWRl
ICJDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUuaCIKLSNpbmNsdWRl
ICJDb250ZW50RGF0YS5oIgotI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgotI2luY2x1ZGUg
IkNvdW50ZXIuaCIKLSNpbmNsdWRlICJDb3VudGVyQ29udGVudC5oIgotI2luY2x1ZGUgIkN1cnNv
ckxpc3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uLmgiCi0jaW5j
bHVkZSAiRWxlbWVudFNoYWRvdy5oIgotI2luY2x1ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKLSNp
bmNsdWRlICJGb250VmFsdWUuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1l
U2VsZWN0aW9uLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAiSFRNTERvY3Vt
ZW50LmgiCi0jaW5jbHVkZSAiSFRNTElGcmFtZUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSW5w
dXRFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlv
bkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MUHJvZ3Jlc3NFbGVtZW50LmgiCi0jaW5jbHVkZSAi
SFRNTFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNp
bmNsdWRlICJJbnNlcnRpb25Qb2ludC5oIgotI2luY2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRh
dGlvbi5oIgotI2luY2x1ZGUgIktleWZyYW1lTGlzdC5oIgotI2luY2x1ZGUgIkxpbmtIYXNoLmgi
Ci0jaW5jbHVkZSAiTG9jYWxlVG9TY3JpcHRNYXBwaW5nLmgiCi0jaW5jbHVkZSAiTWF0aE1MTmFt
ZXMuaCIKLSNpbmNsdWRlICJNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUg
Ik1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIk1lZGlhTGlzdC5oIgotI2lu
Y2x1ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIKLSNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUu
aCIKLSNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIK
LSNpbmNsdWRlICJQYWlyLmgiCi0jaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRp
b24uaCIKLSNpbmNsdWRlICJRdW90ZXNEYXRhLmgiCi0jaW5jbHVkZSAiUmVjdC5oIgotI2luY2x1
ZGUgIlJlbmRlclJlZ2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhci5oIgotI2luY2x1
ZGUgIlJlbmRlclNjcm9sbGJhclRoZW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGVDb25zdGFu
dHMuaCIKLSNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIK
LSNpbmNsdWRlICJSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJSdWxlU2V0
LmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiU1ZHRm9u
dEZhY2VFbGVtZW50LmgiCi0jaW5jbHVkZSAiU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNp
bmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgotI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlckZhc3RQ
YXRoLmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCi0j
aW5jbHVkZSAiU2hhZG93Um9vdC5oIgotI2luY2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCi0jaW5jbHVk
ZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKLSNpbmNsdWRlICJTa2V3VHJhbnNmb3Jt
T3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiU3R5bGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVD
YWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIlN0eWxlR2VuZXJhdGVkSW1hZ2UuaCIKLSNpbmNsdWRl
ICJTdHlsZVBlbmRpbmdJbWFnZS5oIgogI2luY2x1ZGUgIlN0eWxlUHJvcGVydHlTZXQuaCIKLSNp
bmNsdWRlICJTdHlsZVByb3BlcnR5U2hvcnRoYW5kLmgiCiAjaW5jbHVkZSAiU3R5bGVSdWxlLmgi
Ci0jaW5jbHVkZSAiU3R5bGVSdWxlSW1wb3J0LmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldENvbnRl
bnRzLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0j
aW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKLSNpbmNsdWRlICJUcmFuc2xhdGVUcmFu
c2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2lu
Y2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgotI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3Rh
dGUuaCIKLSNpbmNsdWRlICJXZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVk
ZSAiV2ViS2l0Q1NTS2V5ZnJhbWVSdWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVz
UnVsZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1JlZ2lvblJ1bGUuaCIKLSNpbmNsdWRlICJXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZS5oIgotI2luY2x1ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5o
IgotI2luY2x1ZGUgIlhNTE5hbWVzLmgiCi0jaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRh
dGlvbkhhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNl
dC5oPgotI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0b3IuaD4KLSNpbmNs
dWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotCi0jaWYg
RU5BQkxFKENTU19GSUxURVJTKQotI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1
ZGUgIldlYktpdENTU0ZpbHRlclZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShEQVNIQk9B
UkRfU1VQUE9SVCkKLSNpbmNsdWRlICJEYXNoYm9hcmRSZWdpb24uaCIKLSNlbmRpZgotCi0jaWYg
RU5BQkxFKFNWRykKLSNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNh
Y2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlLmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKLSNp
bmNsdWRlICJTVkdFbGVtZW50LmgiCi0jaW5jbHVkZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJT
VkdVUklSZWZlcmVuY2UuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgi
Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSNpbmNsdWRlICJDdXN0b21GaWx0
ZXJBcnJheVBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgot
I2luY2x1ZGUgIkN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3Rv
bUZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgot
I2luY2x1ZGUgIkN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlci5oIgotI2luY2x1ZGUgIlN0
eWxlQ2FjaGVkU2hhZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgi
Ci0jaW5jbHVkZSAiU3R5bGVQZW5kaW5nU2hhZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGFkZXIu
aCIKLSNpbmNsdWRlICJXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiV2Vi
S2l0Q1NTU2hhZGVyVmFsdWUuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQp
Ci0jaW5jbHVkZSAiQ1NTSW1hZ2VTZXRWYWx1ZS5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1h
Z2VTZXQuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotI2luY2x1ZGUgIldl
YlZUVEVsZW1lbnQuaCIKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1uYW1lc3Bh
Y2UgV1RGIHsKLQotdGVtcGxhdGU8PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRp
b25UcmFpdHM8Y29uc3QgV2ViQ29yZTo6UnVsZURhdGEqPiB7Ci0gICAgdGVtcGxhdGUgPHR5cGVu
YW1lIEk+IHN0YXRpYyB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5m
byYpIHsgfQotfTsKLQotfQogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFj
ZSBIVE1MTmFtZXM7Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYg
KGlzSW5oZXJpdCkgeyBcCi0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5w
YXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCi0gICAgcmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFO
RExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwgUHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJv
cCwgUHJvcCkgXAotaWYgKGlzSW5pdGlhbCkgeyBcCi0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQj
I1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1Byb3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0K
LQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0K
LXN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmln
aHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmln
aHREZWNsLT5pc0VtcHR5KCkpCi0gICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHko
Q1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlTHRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmln
aHREZWNsLmdldCgpOwotfQotCi1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnRE
ZWNsYXJhdGlvbigpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9w
ZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7
Ci0gICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICByaWdodFRvTGVm
dERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0g
ICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQoKTsKLX0KLQotCi1pbmxpbmUgU3RhdGljQ1NT
UnVsZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAg
aWYgKCFtX3J1bGVMaXN0KQotICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6
OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOwotfQotCi1pbmxpbmUgdm9p
ZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKLXsKLSAg
ICBtX2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKLSAgICBpZiAo
bV9oYXNVQUFwcGVhcmFuY2UpIHsKLSAgICAgICAgbV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9y
ZGVyKCk7Ci0gICAgICAgIG1fYmFja2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExh
eWVycygpOwotICAgICAgICBtX2JhY2tncm91bmRDb2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRD
b2xvcigpOwotICAgIH0KLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNs
ZWFyKCkKLXsKLSAgICBtX2VsZW1lbnQgPSAwOwotICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7Ci0g
ICAgbV9wYXJlbnRTdHlsZSA9IDA7Ci0gICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICBtX3JlZ2lv
bkZvclN0eWxpbmcgPSAwOwotICAgIG1fcnVsZUxpc3QgPSAwOwotICAgIG1fbWF0Y2hlZFJ1bGVz
LmNsZWFyKCk7Ci0gICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0jaWYgRU5B
QkxFKENTU19TSEFERVJTKQotICAgIG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKLSNlbmRp
ZgotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICBtX3BlbmRpbmdT
VkdEb2N1bWVudHMuY2xlYXIoKTsKLSNlbmRpZgotfQotCi1TdHlsZVJlc29sdmVyOjpTdHlsZVJl
c29sdmVyKERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMp
Ci0gICAgOiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgw
KQotICAgICwgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVS
ZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKQotICAgICwgbV9kb2N1bWVudChk
b2N1bWVudCkKLSAgICAsIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcykKLSAgICAsIG1fZm9udFNlbGVjdG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRl
KGRvY3VtZW50KSkKLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgICwgbV92
aWV3cG9ydFN0eWxlUmVzb2x2ZXIoVmlld3BvcnRTdHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1l
bnQpKQotI2VuZGlmCi0gICAgLCBtX3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0
eWxlQnVpbGRlcigpKQotICAgICwgbV9zdHlsZU1hcCh0aGlzKQotewotICAgIEVsZW1lbnQqIHJv
b3QgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OmluaXREZWZhdWx0U3R5bGUocm9vdCk7Ci0KLSAgICAvLyBjb25zdHJ1Y3QgZG9jdW1l
bnQgcm9vdCBlbGVtZW50IGRlZmF1bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVkCi0gICAgLy8gdG8g
ZXZhbHVhdGUgbWVkaWEgcXVlcmllcyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMs
IGxpa2UgInNjcmVlbiBhbmQgKG1heC13aWR0aDogMTBlbSkiCi0gICAgLy8gVGhpcyBpcyBoZXJl
IGluc3RlYWQgb2YgY29uc3RydWN0b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4s
Ci0gICAgLy8gZG9jdW1lbnQgZG9lc24ndCBoYXZlIGRvY3VtZW50RWxlbWVudAotICAgIC8vIE5P
VEU6IHRoaXMgYXNzdW1lcyB0aGF0IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZv
ckVsZW1lbnQgLWNhbGwKLSAgICAvLyBpcyBhbHdheXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBv
d25zIHRoZSBzdHlsZSBzZWxlY3RvcgotICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52
aWV3KCk7Ci0gICAgaWYgKHZpZXcpCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1l
ZGlhUXVlcnlFdmFsdWF0b3Iodmlldy0+bWVkaWFUeXBlKCkpKTsKLSAgICBlbHNlCi0gICAgICAg
IG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKLQot
ICAgIGlmIChyb290KQotICAgICAgICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1l
bnQocm9vdCwgMCwgRGlzYWxsb3dTdHlsZVNoYXJpbmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVz
KTsKLQotICAgIGlmIChtX3Jvb3REZWZhdWx0U3R5bGUgJiYgdmlldykKLSAgICAgICAgbV9tZWRp
dW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwg
dmlldy0+ZnJhbWUoKSwgbV9yb290RGVmYXVsdFN0eWxlLmdldCgpKSk7Ci0KLSAgICBtX3J1bGVT
ZXRzLnJlc2V0QXV0aG9yU3R5bGUoKTsKLQotICAgIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rp
b24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9u
KCk7Ci0gICAgbV9ydWxlU2V0cy5pbml0VXNlclN0eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAq
bV9tZWRpdW0sICp0aGlzKTsKLQotI2lmIEVOQUJMRShTVkdfRk9OVFMpCi0gICAgaWYgKGRvY3Vt
ZW50LT5zdmdFeHRlbnNpb25zKCkpIHsKLSAgICAgICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFj
ZUVsZW1lbnQqPiYgc3ZnRm9udEZhY2VFbGVtZW50cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25z
KCktPnN2Z0ZvbnRGYWNlRWxlbWVudHMoKTsKLSAgICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVs
ZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsK
LSAgICAgICAgZm9yIChIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IHN2Z0ZvbnRGYWNlRWxlbWVudHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAg
ICAgICAgICAgZm9udFNlbGVjdG9yKCktPmFkZEZvbnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VS
dWxlKCkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwg
c3R5bGVTaGVldENvbGxlY3Rpb24tPmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRzKCkpOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0
TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQot
ewotICAgIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxl
U2hlZXRzLCBtX21lZGl1bS5nZXQoKSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVu
dCgpLT5pc1ZpZXdTb3VyY2UoKSwgdGhpcyk7Ci0gICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVy
KCkgJiYgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUoKSkKLSAgICAgICAgZG9jdW1lbnQo
KS0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7Ci0K
LSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIHZpZXdwb3J0U3R5bGVSZXNv
bHZlcigpLT5yZXNvbHZlKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpwdXNo
UGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJlbnQpCi17Ci0gICAgY29uc3QgQ29udGFpbmVyTm9k
ZSogcGFyZW50c1BhcmVudCA9IHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOwot
Ci0gICAgLy8gV2UgYXJlIG5vdCBhbHdheXMgaW52b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFt
cGxlLCBzY3JpcHQgZXhlY3V0aW9uIGNhbiBjYXVzZSB1cyB0byBlbnRlcgotICAgIC8vIHN0eWxl
IHJlY2FsYyBpbiB0aGUgbWlkZGxlIG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGlu
dm9rZWQgZnJvbSBzb21ld2hlcmUgd2l0aGluIHRoZSB0cmVlLgotICAgIC8vIFJlc2V0IHRoZSBz
dGFjayBpbiB0aGlzIGNhc2UsIG9yIGlmIHdlIHNlZSBhIG5ldyByb290IGVsZW1lbnQuCi0gICAg
Ly8gT3RoZXJ3aXNlIGp1c3QgcHVzaCB0aGUgbmV3IHBhcmVudC4KLSAgICBpZiAoIXBhcmVudHNQ
YXJlbnQgfHwgbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzRW1wdHkoKSkKLSAgICAgICAg
bV9zZWxlY3RvckZpbHRlci5zZXR1cFBhcmVudFN0YWNrKHBhcmVudCk7Ci0gICAgZWxzZQotICAg
ICAgICBtX3NlbGVjdG9yRmlsdGVyLnB1c2hQYXJlbnQocGFyZW50KTsKLQotICAgIC8vIE5vdGU6
IFdlIG11c3RuJ3Qgc2tpcCBTaGFkb3dSb290IG5vZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCi0g
ICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBh
cmVudCwgcGFyZW50LT5wYXJlbnRPclNoYWRvd0hvc3ROb2RlKCkpOwotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6OnBvcFBhcmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQotewotICAgIC8vIE5v
dGUgdGhhdCB3ZSBtYXkgZ2V0IGludm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNv
bWUgd2Fja3kgY2FzZXMgZHVyaW5nIHN0eWxlIHJlc29sdmUuCi0gICAgLy8gUGF1c2UgbWFpbnRh
aW5pbmcgdGhlIHN0YWNrIGluIHRoaXMgY2FzZS4KLSAgICBpZiAobV9zZWxlY3RvckZpbHRlci5w
YXJlbnRTdGFja0lzQ29uc2lzdGVudChwYXJlbnQpKQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVy
LnBvcFBhcmVudCgpOwotICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCi0gICAgICAgIG1fc2NvcGVS
ZXNvbHZlci0+cG9wKHBhcmVudCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVu
dFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKLXsKLSAgICBBU1NFUlQo
c2hhZG93Um9vdC0+aG9zdCgpKTsKLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBt
X3Njb3BlUmVzb2x2ZXItPnB1c2goc2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jv
b3QqIHNoYWRvd1Jvb3QpCi17Ci0gICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7Ci0gICAg
aWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93
Um9vdCk7Ci19Ci0KLS8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rp
b24gZm9yIGtleWZyYW1lIHN0eWxlcwotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0
eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQotewotICAgIEF0b21pY1N0
cmluZyBzKHJ1bGUtPm5hbWUoKSk7Ci0gICAgbV9rZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwo
KSwgcnVsZSk7Ci19Ci0KLVN0eWxlUmVzb2x2ZXI6On5TdHlsZVJlc29sdmVyKCkKLXsKLSAgICBt
X2ZvbnRTZWxlY3Rvci0+Y2xlYXJEb2N1bWVudCgpOwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0Vf
QURBUFRBVElPTikKLSAgICBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgp
OwotI2VuZGlmCi19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGll
c0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+KikKLXsKLSAgICAvLyBMb29rIGZvciBjYWNoZSBl
bnRyaWVzIGNvbnRhaW5pbmcgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBh
bmQgcmVtb3ZlIHRoZW0uCi0gICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBh
dHRyaWJ1dGUgbXV0YXRpb24gY2F1c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxl
KCkKLSAgICAvLyBvciBwcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBs
ZWF2aW5nIHRoaXMgY2FjaGUgd2l0aCB0aGUgbGFzdCByZWYgb24gdGhlIG9sZCBvbmUuCi0gICAg
VmVjdG9yPHVuc2lnbmVkLCAxNj4gdG9SZW1vdmU7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKLSAgICBN
YXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUuZW5kKCk7Ci0gICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBWZWN0
b3I8TWF0Y2hlZFByb3BlcnRpZXM+JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRj
aGVkUHJvcGVydGllczsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJv
cGVydGllcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVz
W2ldLnByb3BlcnRpZXMtPmhhc09uZVJlZigpKSB7Ci0gICAgICAgICAgICAgICAgdG9SZW1vdmUu
YXBwZW5kKGl0LT5rZXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6
ZSgpOyArK2kpCi0gICAgICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1v
dmVbaV0pOwotCi0gICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0
U3dlZXAgPSAwOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVz
KE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVy
dGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdo
aXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQotewotICAgIG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
ICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVz
ID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJv
cGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVz
LndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQu
bWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZl
cjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBT
dHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKLXsKLSAgICBp
ZiAoIXByb3BlcnR5U2V0KQotICAgICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJl
c3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQucmFuZ2Vz
LmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRk
TWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hl
YWJsZSkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1h
dGNoaW5nVUFSdWxlc1Njb3BlIHsKLXB1YmxpYzoKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgp
OwotICAgIH5NYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotCi0gICAgc3RhdGljIGJvb2wgaXNNYXRj
aGluZ1VBUnVsZXMoKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFS
dWxlczsKLX07Ci0KLU1hdGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgp
Ci17Ci0gICAgQVNTRVJUKCFtX21hdGNoaW5nVUFSdWxlcyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVs
ZXMgPSB0cnVlOwotfQotCi1NYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Nj
b3BlKCkKLXsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotfQotCi1pbmxpbmUgYm9v
bCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotewotICAgIHJldHVy
biBtX21hdGNoaW5nVUFSdWxlczsKLX0KLQotYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9t
YXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0
Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBy
dWxlUmFuZ2UpCi17Ci0gICAgQVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKLSAgICBBU1NF
UlQobV9zdGF0ZS5lbGVtZW50KCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAg
ICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpOwotICAgIGNvbnN0IFN0eWxlZEVs
ZW1lbnQqIHN0eWxlZEVsZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7Ci0gICAgY29uc3Qg
QXRvbWljU3RyaW5nJiBwc2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7Ci0gICAg
aWYgKCFwc2V1ZG9JZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQp
OwotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVT
ZXQtPnNoYWRvd1BzZXVkb0VsZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIGlm
IChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7Ci0jZW5kaWYKLSAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5
cGVzIG9mIHJ1bGVzIGFyZSBhcHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENy
aXRlcmlhIGZvciB0aGlzOgotICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCi0gICAgLy8gYikgdGhl
IHRyZWUgc2NvcGUgYWxsb3dzIGF1dGhvciBydWxlcwotICAgIC8vIGMpIHRoZSBydWxlcyBjb21l
cyBmcm9tIGEgc2NvcGVkIHN0eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCi0g
ICAgVHJlZVNjb3BlKiB0cmVlU2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKLSAgICBpZiAo
IU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi0gICAgICAgICYmICF0
cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkKLSAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Qu
c2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0g
ICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVj
a2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2Ug
bmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRo
aW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKLSAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4K
LSAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVS
ZXNvbHV0aW9uKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChz
dHlsZWRFbGVtZW50ICYmIHN0eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKLSAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyAr
K2kpCi0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0
LnJ1bGVTZXQtPmNsYXNzUnVsZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwo
KSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICB9Ci0KLSAgICBpZiAoZWxlbWVudC0+
aXNMaW5rKCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVl
c3QucnVsZVNldC0+bGlua1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotICAgIGlmIChTZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVs
ZW1lbnQpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0
LnJ1bGVTZXQtPmZvY3VzUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5n
ZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0
LT50YWdSdWxlcyhlbGVtZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci19Ci0K
LXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3Qg
TWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAg
IGlmICghbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IHVuc2lnbmVkIHNpemUgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNB
bmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsr
aSkgewotICAgICAgICBjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJl
cXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3Rv
cjsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRp
Y19jYXN0PEVsZW1lbnQqPihtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsK
LSAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQt
Pm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKLSAgICAg
ICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlcyhNYXRjaFJlcXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlS
dWxlcywgbWF0Y2hSZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKLSAgICAgICAgfQotICAgIH0K
LX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0
Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIFZl
Y3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1
bGVzKCk7Ci0gICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKLQotICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2Vs
ZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHN0YXRlLmVu
c3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5j
cmVhdGVDU1NPTVdyYXBwZXIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBO
b3cgdHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2Yg
ZGVjbGFyYXRpb25zLgotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMu
c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVz
W2ldLT5jb250YWluc1VuY29tbW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhy
ZXN1bHQsIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxl
c1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1
bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9v
bCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFC
TEUoU0hBRE9XX0RPTSkKLSAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gTWF0Y2ggc2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBz
Y29wZWQgZWxlbWVudCBzdGFjayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4K
LSAgICBpZiAobV9zY29wZVJlc29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVz
b2x2ZXItPmVuc3VyZVN0YWNrQ29uc2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7Ci0gICAg
ICAgIGJvb2wgYXBwbHlBdXRob3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3Bl
KCktPmFwcGx5QXV0aG9yU3R5bGVzKCk7Ci0gICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRy
dWU7Ci0gICAgICAgIHVuc2lnbmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tT
aXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkg
ewotICAgICAgICAgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAg
ICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGll
cy5zaXplKCkgLSAxOwotCi0gICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0
YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7Ci0gICAg
ICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+
aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7Ci0gICAg
ICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykKLSAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbV9z
Y29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0
IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5t
X3Njb3BlKTsKLSAgICAgICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2Vz
LmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0
Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgc29ydEFuZFRy
YW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXRj
aEhvc3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbHNlCi0gICAgVU5VU0VE
X1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNl
bmRpZgotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRh
dGVNYXRjaGVzSG9zdFJ1bGVzKCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVz
KGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBjb25zdCBTdHlsZVJ1bGVQYWdlKiByMikKIHsKLSNp
ZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYmIG1fc2Nv
cGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyhtX3N0YXRl
LmVsZW1lbnQoKSk7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgorICAgIHJldHVy
biByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZp
Y2l0eSgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCitib29sIFBhZ2VSdWxlQ29sbGVj
dG9yOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0CiB7Ci0jaWYgRU5BQkxFKFNIQURP
V19ET00pCi0gICAgQVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7Ci0KLSAgICBtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0gICAgVmVjdG9yPFJ1bGVTZXQq
PiBtYXRjaGVkUnVsZXM7Ci0gICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0
YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1w
dHkoKSkKLSAgICAgICAgcmV0dXJuOworICAgIGJvb2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7
CisgICAgaWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVj
dGlvbigpKQorICAgICAgICBpc0ZpcnN0UGFnZUxlZnQgPSB0cnVlOwogCi0gICAgZm9yICh1bnNp
Z25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAgICBSdWxl
UmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICAg
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEp
LCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwotICAg
IH0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSNlbHNlCi0gICAg
VU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVz
KTsKLSNlbmRpZgorICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEg
OiAwKSkgJSAyOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0
Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK2Jvb2wgUGFnZVJ1bGVD
b2xsZWN0b3I6OmlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0CiB7Ci0gICAgbV9zdGF0
ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1
bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLQotICAgIGlmICghbV9z
dGF0ZS5lbGVtZW50KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIE1hdGNoIGdsb2JhbCBh
dXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLmF1
dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdS
dWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotI2lmIEVOQUJMRShTSEFET1dfRE9N
KQotICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0
cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVt
cHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0
Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0
Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKLSNlbmRpZgotCi0gICAgc29ydEFuZFRyYW5zZmVy
TWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0KLSAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVzKHJlc3Vs
dCwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBs
ZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3Qg
cGFnZS4KKyAgICByZXR1cm4gKCFwYWdlSW5kZXgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpCitTdHJpbmcgUGFnZVJ1bGVDb2xsZWN0b3I6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXgg
Ki8pIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0gICAg
cmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpIC0gMTsKLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0
eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVz
dWx0LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0
Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9u
KG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLQotICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyhyZXN1bHQpOworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdl
IG5hbWUgbWFwcGluZy4KKyAgICByZXR1cm4gIiI7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6
bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQordm9pZCBQ
YWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxQYWdlUnVsZXMoaW50IHBhZ2VJbmRleCkKIHsKLSAg
ICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgY29uc3QgYm9vbCBpc0xlZnQg
PSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJz
dFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJ
bmRleCk7CiAgICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3Vs
dC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJl
cXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKHJlc3VsdCk7CisgICAgbWF0Y2hQYWdlUnVsZXMoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpk
ZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VS
dWxlcyhtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAg
IC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVs
ZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRz
LmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CiB9CiAKLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0
YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBy
dWxlUmFuZ2UpCit2b2lkIFBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlcyhSdWxlU2V0
KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcm
IHBhZ2VOYW1lKQogewogICAgIGlmICghcnVsZXMpCiAgICAgICAgIHJldHVybjsKIAotICAgIFN0
YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVw
IGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBlbGVtZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEg
cmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KLSAgICAvLyBBbmNlc3RvciBpZGVudGlmaWVyIGZpbHRl
ciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQgY2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBm
YXN0IHBhdGguCi0gICAgYm9vbCBjYW5Vc2VGYXN0UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRlci5w
YXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5wYXJlbnROb2RlKCkpICYmIG1hdGNoUmVxdWVz
dC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3Vu
ZGFyeTsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOwotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1
bGVEYXRhID0gcnVsZXMtPmF0KGkpOwotICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBt
X3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50
aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygp
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1
bGVEYXRhLnJ1bGUoKTsKLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNv
b2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgp
LCBydWxlLCB0aGlzKTsKLSAgICAgICAgUHNldWRvSWQgZHluYW1pY1BzZXVkbyA9IE5PUFNFVURP
OwotICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVsZURhdGEsIG1hdGNoUmVxdWVzdC5zY29wZSwg
ZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSkpIHsKLSAgICAg
ICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGln
bm9yZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUuCi0gICAgICAgICAgICBjb25zdCBTdHlsZVBy
b3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICAgICAg
aWYgKCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVz
dC5pbmNsdWRlRW1wdHlSdWxlcykpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0
aGUgbm9uLXN0YW5kYXJkIGdldE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5
IHJlYXNvbiB0aGlzIGlzIG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NhbWVPcmln
aW5Pbmx5KCkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgewotICAg
ICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tp
ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8g
Yml0IGlmCi0gICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVs
ZW1lbnQuCi0gICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0
ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCA9PSBOT1BTRVVETykgewotICAgICAgICAg
ICAgICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVs
ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRN
YXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyA8IEZJ
UlNUX0lOVEVSTkFMX1BTRVVET0lEKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRIYXNQc2V1ZG9TdHlsZShkeW5hbWljUHNldWRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIG91ciBmaXJzdC9sYXN0IHJ1bGUgaW5kaWNlcyBp
biB0aGUgbWF0Y2hlZCBydWxlcyBhcnJheS4KLSAgICAgICAgICAgICAgICArK3J1bGVSYW5nZS5s
YXN0UnVsZUluZGV4OwotICAgICAgICAgICAgICAgIGlmIChydWxlUmFuZ2UuZmlyc3RSdWxlSW5k
ZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9
IHJ1bGVSYW5nZS5sYXN0UnVsZUluZGV4OwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMg
cnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICAgICAgICAgIG1fc3Rh
dGUuYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIHRydWUpOwotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgIH0KLX0K
LQotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdWxlRGF0YSogcjEsIGNv
bnN0IFJ1bGVEYXRhKiByMikKLXsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTEgPSByMS0+c3Bl
Y2lmaWNpdHkoKTsKLSAgICB1bnNpZ25lZCBzcGVjaWZpY2l0eTIgPSByMi0+c3BlY2lmaWNpdHko
KTsKLSAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0
aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNpZmljaXR5MSA8IHNwZWNpZmljaXR5MjsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0Y2hlZFJ1bGVzKCkKLXsKLSAgICBzdGQ6OnNv
cnQobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5iZWdpbigpLCBtX3N0YXRlLm1hdGNoZWRSdWxlcygp
LmVuZCgpLCBjb21wYXJlUnVsZXMpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQWxs
UnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCi17
Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCk7Ci0KLSAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBz
aGVldCBydWxlcy4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAg
IG1hdGNoVXNlclJ1bGVzKHJlc3VsdCwgZmFsc2UpOwotCi0gICAgLy8gTm93IGNoZWNrIGF1dGhv
ciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGggcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcyBt
YXBwZWQgZnJvbSBIVE1MLgotICAgIGlmIChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkgewotICAg
ICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOwotCi0gICAgICAgIC8vIE5vdyB3
ZSBjaGVjayBhZGRpdGlvbmFsIG1hcHBlZCBkZWNsYXJhdGlvbnMuCi0gICAgICAgIC8vIFRhYmxl
cyBhbmQgdGFibGUgY2VsbHMgc2hhcmUgYW4gYWRkaXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11
c3QgYmUgYXBwbGllZAotICAgICAgICAvLyBhZnRlciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhl
aXIgbWFwcGVkIHN0eWxlIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1
dGVzLgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsK
LQotICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkg
ewotICAgICAgICAgICAgYm9vbCBpc0F1dG87Ci0gICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRl
eHREaXJlY3Rpb24gPSB0b0hUTUxFbGVtZW50KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+ZGly
ZWN0aW9uYWxpdHlJZmhhc0RpckF1dG9BdHRyaWJ1dGUoaXNBdXRvKTsKLSAgICAgICAgICAgIGlm
IChpc0F1dG8pCi0gICAgICAgICAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0
ZXh0RGlyZWN0aW9uID09IExUUiA/IGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9M
ZWZ0RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sg
dGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMgbmV4dC4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFu
ZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMocmVzdWx0LCBmYWxzZSk7Ci0K
LSAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBzdHlsZSBhdHRyaWJ1dGUuCi0gICAgaWYgKG1f
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKSB7Ci0gICAgICAgIC8vIElubGlu
ZSBzdHlsZSBpcyBpbW11dGFibGUgYXMgbG9uZyBhcyB0aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVy
LgotICAgICAgICAvLyBGSVhNRTogTWVkaWEgY29udHJvbCBzaGFkb3cgdHJlZXMgc2VlbSB0byBo
YXZlIHByb2JsZW1zIHdpdGggY2FjaGluZy4KLSAgICAgICAgYm9vbCBpc0lubGluZVN0eWxlQ2Fj
aGVhYmxlID0gIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFi
bGUoKSAmJiAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSW5TaGFkb3dUcmVlKCk7Ci0gICAg
ICAgIC8vIEZJWE1FOiBDb25zdGlmeS4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGll
cyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGlu
ZVN0eWxlQ2FjaGVhYmxlKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIC8vIE5vdyBj
aGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHlsZS4KLSAgICBpZiAoaW5jbHVkZVNNSUxQ
cm9wZXJ0aWVzICYmIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVk
RWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAg
ICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRpY19jYXN0PFNWR0Vs
ZW1lbnQqPihtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVy
dGllcygpLCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAqLyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJB
TShpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotI2VuZGlmCi19CisgICAgVmVjdG9yPFN0eWxlUnVs
ZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRj
aGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdl
LCBwYWdlTmFtZSk7CisgICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CiAKLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxl
cyhjb25zdCBTcGFjZVNwbGl0U3RyaW5nJiBjbGFzc05hbWVzKSBjb25zdAotewotICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlm
IChtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NOYW1l
c1tpXS5pbXBsKCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVy
biBmYWxzZTsKLX0KKyAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4o
KSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7CiAKLWlubGluZSB2
b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0RWxlbWVudChFbGVtZW50KiBlKQotewotICAg
IG1fZWxlbWVudCA9IGU7Ci0gICAgbV9zdHlsZWRFbGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVs
ZW1lbnQoKSA/IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihlKSA6IDA7Ci0gICAgbV9lbGVt
ZW50TGlua1N0YXRlID0gZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0
ZXJtaW5lTGlua1N0YXRlKGUpIDogTm90SW5zaWRlTGluazsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgbV9yZXN1bHQu
YWRkTWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hlZFBhZ2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsK
IH0KIAotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkK
K3N0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rv
ciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3Ry
aW5nJiBwYWdlTmFtZSkKIHsKLSAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkgewotICAg
ICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOwotICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRv
Y3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgp
LT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7Ci0gICAgICAgICAgICBl
LT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsK
KyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9u
ZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAgICAgICBpZiAo
Y29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAgICAgICAgIGNv
bnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2Fs
TmFtZSgpOworICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5h
bWUgIT0gcGFnZU5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9
Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0
eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3Qs
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKLXsKLSAgICBtX3BzZXVkb1N0eWxlUmVx
dWVzdCA9IHBzZXVkb1N0eWxlUmVxdWVzdDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdp
b25Gb3JTdHlsaW5nOwogCi0gICAgaWYgKGUpIHsKLSAgICAgICAgTm9kZVJlbmRlcmluZ0NvbnRl
eHQgY29udGV4dChlKTsKLSAgICAgICAgbV9wYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2Rl
Rm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IGNvbnRleHQu
cmVzZXRTdHlsZUluaGVyaXRhbmNlKCkgPyAwIDoKLSAgICAgICAgICAgIHBhcmVudFN0eWxlID8g
cGFyZW50U3R5bGUgOgotICAgICAgICAgICAgbV9wYXJlbnROb2RlID8gbV9wYXJlbnROb2RlLT5y
ZW5kZXJTdHlsZSgpIDogMDsKLSAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQg
PSBjb250ZXh0Lmluc2VydGlvblBvaW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wYXJl
bnROb2RlID0gMDsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOwotICAgICAg
ICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCA9IGZhbHNlOwotICAgIH0KLQotICAgIE5v
ZGUqIGRvY0VsZW1lbnQgPSBlID8gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgOiAw
OwotICAgIFJlbmRlclN0eWxlKiBkb2NTdHlsZSA9IGRvY3VtZW50LT5yZW5kZXJTdHlsZSgpOwot
ICAgIG1fcm9vdEVsZW1lbnRTdHlsZSA9IGRvY0VsZW1lbnQgJiYgZSAhPSBkb2NFbGVtZW50ID8g
ZG9jRWxlbWVudC0+cmVuZGVyU3R5bGUoKSA6IGRvY1N0eWxlOwotCi0gICAgbV9zdHlsZSA9IDA7
Ci0gICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9
IDA7Ci0gICAgbV9mb250RGlydHkgPSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNTdHlsZVNlYXJjaFRocmVzaG9sZCA9IDEwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHls
ZVNlYXJjaExldmVsVGhyZXNob2xkID0gMTA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwYXJlbnRF
bGVtZW50UHJldmVudHNTaGFyaW5nKGNvbnN0IEVsZW1lbnQqIHBhcmVudEVsZW1lbnQpCi17Ci0g
ICAgaWYgKCFwYXJlbnRFbGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJu
IHBhcmVudEVsZW1lbnQtPmhhc0ZsYWdzU2V0RHVyaW5nU3R5bGluZ09mQ2hpbGRyZW4oKTsKLX0K
LQotTm9kZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQs
IHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdAotewotICAgIGlmICh2aXNpdGVkTm9k
ZUNvdW50ID49IGNTdHlsZVNlYXJjaFRocmVzaG9sZCAqIGNTdHlsZVNlYXJjaExldmVsVGhyZXNo
b2xkKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc1N0
eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudC0+aGFzU2Nv
cGVkSFRNTFN0eWxlQ2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3R5bGVkRWxlbWVu
dCogcCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihwYXJlbnQpOwotICAgIGlmIChwLT5p
bmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlm
IChwLT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4ocCktPmFuaW1h
dGVkU01JTFN0eWxlUHJvcGVydGllcygpKQotICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAg
IGlmIChwLT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRh
aW5zKHAtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSBwLT5yZW5kZXJTdHlsZSgpOwotICAg
IHVuc2lnbmVkIHN1YmNvdW50ID0gMDsKLSAgICBOb2RlKiB0aGlzQ291c2luID0gcDsKLSAgICBO
b2RlKiBjdXJyZW50Tm9kZSA9IHAtPnByZXZpb3VzU2libGluZygpOwotCi0gICAgLy8gUmVzZXJ2
ZSB0aGUgdHJpZXMgZm9yIHRoaXMgbGV2ZWwuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMgc3VyZSB0
aGF0IHRoZSBhbGdvcml0aG0KLSAgICAvLyB3aWxsIG5ldmVyIGdvIGRlZXBlciB0aGFuIGNTdHls
ZVNlYXJjaExldmVsVGhyZXNob2xkIGxldmVscyBpbnRvIHJlY3Vyc2lvbi4KLSAgICB2aXNpdGVk
Tm9kZUNvdW50ICs9IGNTdHlsZVNlYXJjaFRocmVzaG9sZDsKLSAgICB3aGlsZSAodGhpc0NvdXNp
bikgewotICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKLSAgICAgICAgICAgICsrc3ViY291
bnQ7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUtPnJlbmRlclN0eWxlKCkgPT0gcGFyZW50
U3R5bGUgJiYgY3VycmVudE5vZGUtPmxhc3RDaGlsZCgpCi0gICAgICAgICAgICAgICAgJiYgY3Vy
cmVudE5vZGUtPmlzRWxlbWVudE5vZGUoKSAmJiAhcGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmlu
Zyh0b0VsZW1lbnQoY3VycmVudE5vZGUpKQotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgICAg
ICAgICAgICAgICYmICF0b0VsZW1lbnQoY3VycmVudE5vZGUpLT5zaGFkb3coKQotI2VuZGlmCi0g
ICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB1bnVzZWQg
cmVzZXJ2ZWQgdHJpZXMuCi0gICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVDb3VudCAtPSBjU3R5
bGVTZWFyY2hUaHJlc2hvbGQgLSBzdWJjb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3Vy
cmVudE5vZGUtPmxhc3RDaGlsZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1
YmNvdW50ID49IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnByZXZpb3VzU2libGlu
ZygpOworICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9u
ZW50LT5wc2V1ZG9UeXBlKCk7CisgICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rv
cjo6UHNldWRvTGVmdFBhZ2UgJiYgIWlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRv
VHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAg
ICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYm
ICFpc0ZpcnN0UGFnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICAgICAgfQotICAgICAgICBjdXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNp
bi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKLSAgICAgICAgdGhpc0NvdXNp
biA9IGN1cnJlbnROb2RlOwogICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1ib29sIFN0eWxl
UmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1
bGVTZXQpCi17Ci0gICAgaWYgKCFydWxlU2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNl
bGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKLSAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAt
MSwgbGFzdFJ1bGVJbmRleCA9IC0xOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxl
SW5kZXgsIGxhc3RSdWxlSW5kZXgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVx
dWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JD
aGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0gICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCku
aXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOwogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFN0eWxlUmVzb2x2ZXI6
OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAor
dm9pZCBQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHls
ZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYg
cnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBw
YWdlTmFtZSkKIHsKLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIEhUTUxJ
bnB1dEVsZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgp
OwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVu
dCgpLT50b0lucHV0RWxlbWVudCgpOwotCi0gICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFv
dGhlcklucHV0RWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHRoaXNJ
bnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnRE
YXRhKCkpIHsKLSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUo
dHlwZUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRy
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1l
bnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+
ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLQotICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBv
dGhlcklucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVy
SW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJ
bnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVu
dC0+aXNSZXF1aXJlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVu
dC0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZv
cm1Db250cm9sKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5p
c0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0
b25Gb3JGb3JtKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5kb2N1
bWVudCgpLT5jb250YWluc1ZhbGlkaXR5U3R5bGVSdWxlcygpKSB7Ci0gICAgICAgIGJvb2wgd2ls
bFZhbGlkYXRlID0gZWxlbWVudC0+d2lsbFZhbGlkYXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpbGxW
YWxpZGF0ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlcy5zaXplKCk7
ICsraSkgeworICAgICAgICBTdHlsZVJ1bGVQYWdlKiBydWxlID0gcnVsZXNbaV07CiAKLSAgICAg
ICAgaWYgKHdpbGxWYWxpZGF0ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVu
dCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNv
bXBvbmVudHMocnVsZS0+c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VO
YW1lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChlbGVtZW50LT5pc0lu
UmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzSW5SYW5nZSgpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBh
cHBseSwgdGhlbiBpZ25vcmUgaXQuCisgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHBy
b3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmICghcHJvcGVydGllcyB8
fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAg
ICBpZiAoZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9m
UmFuZ2UoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQWRkIHRoaXMg
cnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMu
YXBwZW5kKHJ1bGUpOwogICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5s
aW5lIGJvb2wgZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oRWxlbWVudCogZWxlbWVudCkKLXsKLSAg
ICAvLyBGSVhNRTogVGhpcyBsaW5lIGlzIHN1cnByaXNpbmdseSBob3QsIHdlIG1heSB3aXNoIHRv
IGlubGluZSBoYXNEaXJlY3Rpb25BdXRvIGludG8gU3R5bGVSZXNvbHZlci4KLSAgICByZXR1cm4g
ZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpICYmIHRvSFRNTEVsZW1lbnQoZWxlbWVudCktPmhhc0Rp
cmVjdGlvbkF1dG8oKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpzaGFyaW5nQ2FuZGlkYXRl
SGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqIHNoYXJp
bmdDYW5kaWRhdGUpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
LSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5lbGVtZW50RGF0YSgpID09IHNoYXJpbmdDYW5kaWRh
dGUtPmVsZW1lbnREYXRhKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGlmIChzdGF0ZS5l
bGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSAhPSBzaGFyaW5n
Q2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRl
KGxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRy
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFzdGF0ZS5lbGVtZW50QWZmZWN0
ZWRCeUNsYXNzUnVsZXMoKSkgewotICAgICAgICBpZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xh
c3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNz
TmFtZXMoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChzaGFy
aW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpKSB7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLy8g
U1ZHIGVsZW1lbnRzIHJlcXVpcmUgYSAoc2xvdyEpIGdldEF0dHJpYnV0ZSBjb21wYXJpc2lvbiBi
ZWNhdXNlICJjbGFzcyIgaXMgYW4gYW5pbWF0YWJsZSBhdHRyaWJ1dGUgZm9yIFNWRy4KLSAgICAg
ICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlm
IChzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpICE9IHNoYXJpbmdDYW5k
aWRhdGUtPmdldEF0dHJpYnV0ZShjbGFzc0F0dHIpKQotICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHN0YXRlLmVs
ZW1lbnQoKS0+Y2xhc3NOYW1lcygpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAg
fQotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChz
dGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc2hh
cmluZ0NhbmRpZGF0ZS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFBST0dSRVNTX0VMRU1FTlQpCi0gICAgaWYgKHN0YXRl
LmVsZW1lbnQoKS0+aGFzVGFnTmFtZShwcm9ncmVzc1RhZykpIHsKLSAgICAgICAgaWYgKHN0YXRp
Y19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihzdGF0ZS5lbGVtZW50KCkpLT5pc0RldGVybWlu
YXRlKCkgIT0gc3RhdGljX2Nhc3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHNoYXJpbmdDYW5kaWRh
dGUpLT5pc0RldGVybWluYXRlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
I2VuZGlmCi0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5T
aGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAg
ICBSZW5kZXJTdHlsZSogc3R5bGUgPSBlbGVtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIGNvbnN0
IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAoIXN0eWxlKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlxdWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIGlmIChzdHlsZS0+aGFzVW5pcXVlUHNldWRvU3R5bGUoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChlbGVtZW50LT50YWdRTmFtZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+
dGFnUU5hbWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5pbmxp
bmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPm5lZWRz
U3R5bGVSZWNhbGMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2lmIEVOQUJMRShTVkcpCi0g
ICAgaWYgKGVsZW1lbnQtPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQq
PihlbGVtZW50KS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSNlbmRpZgotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAhPSBzdGF0ZS5lbGVt
ZW50KCktPmlzTGluaygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQt
PmhvdmVyZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmhvdmVyZWQoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5hY3RpdmUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmFj
dGl2ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmZvY3VzZWQo
KSAhPSBzdGF0ZS5lbGVtZW50KCktPmZvY3VzZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIGlmIChlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+c2hh
ZG93UHNldWRvSWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50ID09
IGVsZW1lbnQtPmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKCFzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRy
aWJ1dGVzKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQt
PmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHN0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+YWRkaXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5oYXNJRCgpICYmIG1fcnVsZVNldHMu
ZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0
aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5o
YXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAv
LyBGSVhNRTogV2Ugc2hvdWxkIHNoYXJlIHN0eWxlIGZvciBvcHRpb24gYW5kIG9wdGdyb3VwIHdo
ZW5ldmVyIHBvc3NpYmxlLgotICAgIC8vIEJlZm9yZSBkb2luZyBzbywgd2UgbmVlZCB0byByZXNv
bHZlIGlzc3VlcyBpbiBIVE1MU2VsZWN0RWxlbWVudDo6cmVjYWxjTGlzdEl0ZW1zCi0gICAgLy8g
YW5kIFJlbmRlck1lbnVMaXN0OjpzZXRUZXh0LiBTZWUgYWxzbyBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg0MDUKLSAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShv
cHRpb25UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0Z3JvdXBUYWcpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGlzQ29udHJvbCA9IGVsZW1lbnQtPmlzRm9ybUNvbnRy
b2xFbGVtZW50KCk7Ci0KLSAgICBpZiAoaXNDb250cm9sICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNG
b3JtQ29udHJvbEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGlz
Q29udHJvbCAmJiAhY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKGVsZW1lbnQpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoc3R5bGUtPnRyYW5zaXRpb25zKCkgfHwgc3R5bGUtPmFu
aW1hdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQotICAgIC8vIFR1cm4gb2ZmIHN0eWxlIHNoYXJpbmcgZm9yIGVsZW1lbnRz
IHRoYXQgY2FuIGdhaW4gbGF5ZXJzIGZvciByZWFzb25zIG91dHNpZGUgb2YgdGhlIHN0eWxlIHN5
c3RlbS4KLSAgICAvLyBTZWUgY29tbWVudHMgaW4gUmVuZGVyT2JqZWN0OjpzZXRTdHlsZSgpLgot
ICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKGlmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFn
TmFtZShmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShlbWJlZFRhZykgfHwgZWxlbWVu
dC0+aGFzVGFnTmFtZShvYmplY3RUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXBwbGV0VGFn
KSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGNhbnZhc1RhZykKLSNpZiBFTkFCTEUoUExVR0lOX1BS
T1hZX0ZPUl9WSURFTykKLSAgICAgICAgLy8gV2l0aCBwcm94eWluZywgdGhlIG1lZGlhIGVsZW1l
bnRzIGFyZSBiYWNrZWQgYnkgYSBSZW5kZXJFbWJlZGRlZE9iamVjdC4KLSAgICAgICAgfHwgZWxl
bWVudC0+aGFzVGFnTmFtZSh2aWRlb1RhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhdWRpb1Rh
ZykKLSNlbmRpZgotICAgICAgICApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0g
ICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgJiYgc3RhdGUuZWxlbWVudExpbmtT
dGF0ZSgpICE9IHN0eWxlLT5pbnNpZGVMaW5rKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
I2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICAvLyBEZW55IHNoYXJpbmcgc3R5bGVzIGJldHdl
ZW4gV2ViVlRUIGFuZCBub24tV2ViVlRUIG5vZGVzLgotICAgIGlmIChlbGVtZW50LT5pc1dlYlZU
VEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkgJiYg
c3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSAmJiB0b1dlYlZUVEVsZW1lbnQoZWxl
bWVudCktPmlzUGFzdE5vZGUoKSAhPSB0b1dlYlZUVEVsZW1lbnQoc3RhdGUuZWxlbWVudCgpKS0+
aXNQYXN0Tm9kZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotI2lmIEVOQUJM
RShGVUxMU0NSRUVOX0FQSSkKLSAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgp
LT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSB8fCBzdGF0ZS5lbGVtZW50KCkgPT0g
c3RhdGUuZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUg
U3R5bGVkRWxlbWVudCogU3R5bGVSZXNvbHZlcjo6ZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmco
Tm9kZSogbm9kZSwgdW5zaWduZWQmIGNvdW50KSBjb25zdAotewotICAgIGZvciAoOyBub2RlOyBu
b2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKCFub2RlLT5pc1N0
eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoY2FuU2hh
cmVTdHlsZVdpdGhFbGVtZW50KHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihub2RlKSkpCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGNvdW50KysgPT0gY1N0eWxlU2VhcmNoVGhy
ZXNob2xkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSk7Ci19Ci0KLVJlbmRlclN0eWxlKiBTdHlsZVJlc29s
dmVyOjpsb2NhdGVTaGFyZWRTdHlsZSgpCi17Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsK
LSAgICBpZiAoIXN0YXRlLnN0eWxlZEVsZW1lbnQoKSB8fCAhc3RhdGUucGFyZW50U3R5bGUoKSkK
LSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgaW5saW5lIHN0
eWxlIGl0IGlzIHByb2JhYmx5IHVuaXF1ZS4KLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAg
IGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0
PFNWR0VsZW1lbnQqPihzdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVBy
b3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAvLyBJZHMgc3RvcCBz
dHlsZSBzaGFyaW5nIGlmIHRoZXkgc2hvdyB1cCBpbiB0aGUgc3R5bGVzaGVldHMuCi0gICAgaWYg
KHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCku
aWRzSW5SdWxlcy5jb250YWlucyhzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlkRm9yU3R5bGVSZXNv
bHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudEVsZW1l
bnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5oYXNTY29wZWRI
VE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUuZWxlbWVu
dCgpID09IHN0YXRlLmRvY3VtZW50KCktPmNzc1RhcmdldCgpKQotICAgICAgICByZXR1cm4gMDsK
LSAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oc3RhdGUuZWxlbWVudCgpKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDYWNoZSB3aGV0aGVyIHN0YXRlLmVsZW1lbnQgaXMgYWZm
ZWN0ZWQgYnkgYW55IGtub3duIGNsYXNzIHNlbGVjdG9ycy4KLSAgICAvLyBGSVhNRTogVGhpcyBz
aG91bGRuJ3QgYmUgYSBtZW1iZXIgdmFyaWFibGUuIFRoZSBzdHlsZSBzaGFyaW5nIGNvZGUgY291
bGQgYmUgZmFjdG9yZWQgb3V0IG9mIFN0eWxlUmVzb2x2ZXIuCi0gICAgc3RhdGUuc2V0RWxlbWVu
dEFmZmVjdGVkQnlDbGFzc1J1bGVzKHN0YXRlLmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCkt
Pmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzdGF0ZS5lbGVtZW50KCkt
PmNsYXNzTmFtZXMoKSkpOwotCi0gICAgLy8gQ2hlY2sgcHJldmlvdXMgc2libGluZ3MgYW5kIHRo
ZWlyIGNvdXNpbnMuCi0gICAgdW5zaWduZWQgY291bnQgPSAwOwotICAgIHVuc2lnbmVkIHZpc2l0
ZWROb2RlQ291bnQgPSAwOwotICAgIFN0eWxlZEVsZW1lbnQqIHNoYXJlRWxlbWVudCA9IDA7Ci0g
ICAgTm9kZSogY291c2luTGlzdCA9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJldmlvdXNTaWJs
aW5nKCk7Ci0gICAgd2hpbGUgKGNvdXNpbkxpc3QpIHsKLSAgICAgICAgc2hhcmVFbGVtZW50ID0g
ZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoY291c2luTGlzdCwgY291bnQpOwotICAgICAgICBp
ZiAoc2hhcmVFbGVtZW50KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNvdXNpbkxpc3Qg
PSBsb2NhdGVDb3VzaW5MaXN0KGNvdXNpbkxpc3QtPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5v
ZGVDb3VudCk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UgaGF2ZSBleGhhdXN0ZWQgYWxsIG91ciBi
dWRnZXQgb3Igb3VyIGNvdXNpbnMuCi0gICAgaWYgKCFzaGFyZUVsZW1lbnQpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgc2libGluZyBydWxlcyBhcHBseS4gVGhp
cyBpcyBjaGVja2VkIGF0IHRoZSBlbmQgYXMgaXQgc2hvdWxkIHJhcmVseSBmYWlsLgotICAgIGlm
IChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnNpYmxpbmco
KSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8vIENhbid0IHNoYXJlIGlmIGF0dHJpYnV0ZSBy
dWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQo
bV9ydWxlU2V0cy51bmNvbW1vbkF0dHJpYnV0ZSgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Ly8gQ2FuJ3Qgc2hhcmUgaWYgQGhvc3QgQC1ydWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFy
aW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAv
LyBUcmFja2luZyBjaGlsZCBpbmRleCByZXF1aXJlcyB1bmlxdWUgc3R5bGUgZm9yIGVhY2ggbm9k
ZS4gVGhpcyBtYXkgZ2V0IHNldCBieSB0aGUgc2libGluZyBydWxlIG1hdGNoIGFib3ZlLgotICAg
IGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50
RWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+
cmVuZGVyU3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0
Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSBzY29wZTsKLQot
ICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0g
ICAgaWYgKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCi0g
ICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNlOwotICAgIFJ1bGVTZXQqIHVzZXJBZ2Vu
dFN0eWxlU2hlZXQgPSBtX21lZGl1bS0+bWVkaWFUeXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQot
ICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NE
ZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0
LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAgIC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRj
aCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1l
bnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0Rl
ZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3Vt
ZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChpbiB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHht
bCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ug
c3R5bGUgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAg
ICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VT
dHlsZSgpKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFn
aW5hdGlvbjo6TW9kZSBwYWdpbmF0aW9uTW9kZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAg
IGlmIChwYWdpbmF0aW9uTW9kZSA9PSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkKLSAgICAgICAg
cmV0dXJuOwotICAgICAgICAKLSAgICBzd2l0Y2ggKHBhZ2luYXRpb25Nb2RlKSB7Ci0gICAgY2Fz
ZSBQYWdpbmF0aW9uOjpMZWZ0VG9SaWdodFBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENv
bHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMpOwotICAgICAgICBpZiAoc3R5bGUtPmlzSG9y
aXpvbnRhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jl
c3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dy
ZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NX
cml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBhZ2luYXRpb246OlJpZ2h0VG9M
ZWZ0UGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29s
dW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkK
LSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1u
UHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1u
UHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxD
b2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJy
ZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VG9wVG9Cb3R0b21QYWdpbmF0ZWQ6Ci0gICAgICAg
IHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChz
dHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRD
b2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJl
dmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKLSAgICAg
ICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5p
c0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVy
c2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlv
bjo6Qm90dG9tVG9Ub3BQYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZl
cnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+
aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDog
UmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5
bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkg
PyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0g
ICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQ6Ci0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRp
YyB2b2lkIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKGNvbnN0IFJlbmRlclN0eWxlKiBzdHls
ZSwgRm9udE9yaWVudGF0aW9uJiBmb250T3JpZW50YXRpb24sIE5vbkNKS0dseXBoT3JpZW50YXRp
b24mIGdseXBoT3JpZW50YXRpb24pCi17Ci0gICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0
aW5nTW9kZSgpKSB7Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAg
ICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdo
dDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoc3R5bGUtPnRleHRPcmll
bnRhdGlvbigpKSB7Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OgotICAg
ICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlv
biA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47
Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25VcHJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRp
b24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3Jp
ZW50YXRpb25VcHJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRp
b25TaWRld2F5czoKLSAgICAgICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpID09IExlZnRUb1Jp
Z2h0V3JpdGluZ01vZGUpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBtYXAg
dG8gc2lkZXdheXMtbGVmdCwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAgICAg
ICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAgICAgIGdseXBoT3JpZW50YXRp
b24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwot
ICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2Fs
UmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlz
UmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGds
eXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAg
ICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9y
aWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2
ZXI6OnN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50LCBDU1NGb250U2VsZWN0b3Iq
IGZvbnRTZWxlY3RvcikKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsK
LQotICAgIC8vIEhUTUw1IHN0YXRlcyB0aGF0IHNlYW1sZXNzIGlmcmFtZXMgc2hvdWxkIHJlcGxh
Y2UgZGVmYXVsdCBDU1MgdmFsdWVzCi0gICAgLy8gd2l0aCB2YWx1ZXMgaW5oZXJpdGVkIGZyb20g
dGhlIGNvbnRhaW5pbmcgaWZyYW1lIGVsZW1lbnQuIEhvd2V2ZXIsCi0gICAgLy8gc29tZSB2YWx1
ZXMgKHN1Y2ggYXMgdGhlIGNhc2Ugb2YgZGVzaWduTW9kZSA9ICJvbiIpIHN0aWxsIG5lZWQgdG8K
LSAgICAvLyBiZSBzZXQgYnkgdGhpcyAiZG9jdW1lbnQgc3R5bGUiLgotICAgIFJlZlB0cjxSZW5k
ZXJTdHlsZT4gZG9jdW1lbnRTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLSAgICBib29s
IHNlYW1sZXNzV2l0aFBhcmVudCA9IGRvY3VtZW50LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdp
dGhQYXJlbnQoKTsKLSAgICBpZiAoc2VhbWxlc3NXaXRoUGFyZW50KSB7Ci0gICAgICAgIFJlbmRl
clN0eWxlKiBpZnJhbWVTdHlsZSA9IGRvY3VtZW50LT5zZWFtbGVzc1BhcmVudElGcmFtZSgpLT5y
ZW5kZXJTdHlsZSgpOwotICAgICAgICBpZiAoaWZyYW1lU3R5bGUpCi0gICAgICAgICAgICBkb2N1
bWVudFN0eWxlLT5pbmhlcml0RnJvbShpZnJhbWVTdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gRklY
TUU6IEl0J3Mgbm90IGNsZWFyIHdoaWNoIHZhbHVlcyBiZWxvdyB3ZSB3YW50IHRvIG92ZXJyaWRl
IGluIHRoZSBzZWFtbGVzcyBjYXNlIQotICAgIGRvY3VtZW50U3R5bGUtPnNldERpc3BsYXkoQkxP
Q0spOwotICAgIGlmICghc2VhbWxlc3NXaXRoUGFyZW50KSB7Ci0gICAgICAgIGRvY3VtZW50U3R5
bGUtPnNldFJUTE9yZGVyaW5nKGRvY3VtZW50LT52aXN1YWxseU9yZGVyZWQoKSA/IFZpc3VhbE9y
ZGVyIDogTG9naWNhbE9yZGVyKTsKLSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0Wm9vbShmcmFt
ZSAmJiAhZG9jdW1lbnQtPnByaW50aW5nKCkgPyBmcmFtZS0+cGFnZVpvb21GYWN0b3IoKSA6IDEp
OwotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRQYWdlU2NhbGVUcmFuc2Zvcm0oZnJhbWUgPyBm
cmFtZS0+ZnJhbWVTY2FsZUZhY3RvcigpIDogMSk7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNl
dExvY2FsZShkb2N1bWVudC0+Y29udGVudExhbmd1YWdlKCkpOwotICAgIH0KLSAgICAvLyBUaGlz
IG92ZXJyaWRlcyBhbnkgLXdlYmtpdC11c2VyLW1vZGlmeSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFy
ZW50IGlmcmFtZS4KLSAgICBkb2N1bWVudFN0eWxlLT5zZXRVc2VyTW9kaWZ5KGRvY3VtZW50LT5p
bkRlc2lnbk1vZGUoKSA/IFJFQURfV1JJVEUgOiBSRUFEX09OTFkpOwotCi0gICAgRWxlbWVudCog
ZG9jRWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVudEVsZW1lbnQoKTsKLSAgICBSZW5kZXJPYmpl
Y3QqIGRvY0VsZW1lbnRSZW5kZXJlciA9IGRvY0VsZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJl
cigpIDogMDsKLSAgICBpZiAoZG9jRWxlbWVudFJlbmRlcmVyKSB7Ci0gICAgICAgIC8vIFVzZSB0
aGUgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgb2YgdGhlIGJvZHkgdG8gc2V0IHRoZQotICAg
ICAgICAvLyB2aWV3cG9ydCdzIGRpcmVjdGlvbiBhbmQgd3JpdGluZy1tb2RlIHVubGVzcyB0aGUg
cHJvcGVydHkgaXMgc2V0IG9uIHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAgICAvLyBJZiB0
aGVyZSBpcyBubyBib2R5LCB0aGVuIHVzZSB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgICAg
UmVuZGVyT2JqZWN0KiBib2R5UmVuZGVyZXIgPSBkb2N1bWVudC0+Ym9keSgpID8gZG9jdW1lbnQt
PmJvZHkoKS0+cmVuZGVyZXIoKSA6IDA7Ci0gICAgICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRv
Y3VtZW50LT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCi0gICAgICAgICAgICBk
b2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShib2R5UmVuZGVyZXItPnN0eWxlKCktPndyaXRp
bmdNb2RlKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRX
cml0aW5nTW9kZShkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwot
ICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+ZGlyZWN0aW9uU2V0T25Eb2N1
bWVudEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihi
b2R5UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlvbigpKTsKLSAgICAgICAgZWxzZQotICAgICAg
ICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5
bGUoKS0+ZGlyZWN0aW9uKCkpOwotICAgIH0KLQotICAgIGlmIChmcmFtZSkgewotICAgICAgICBp
ZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFtZS0+dmlldygpKSB7Ci0gICAgICAgICAgICBj
b25zdCBQYWdpbmF0aW9uJiBwYWdpbmF0aW9uID0gZnJhbWVWaWV3LT5wYWdpbmF0aW9uKCk7Ci0g
ICAgICAgICAgICBpZiAocGFnaW5hdGlvbi5tb2RlICE9IFBhZ2luYXRpb246OlVucGFnaW5hdGVk
KSB7Ci0gICAgICAgICAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUocGFnaW5hdGlv
bi5tb2RlLCBkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudFN0
eWxlLT5zZXRDb2x1bW5HYXAocGFnaW5hdGlvbi5nYXApOwotICAgICAgICAgICAgICAgIGlmIChS
ZW5kZXJWaWV3KiB2aWV3ID0gZG9jdW1lbnQtPnJlbmRlclZpZXcoKSkgewotICAgICAgICAgICAg
ICAgICAgICBpZiAodmlldy0+aGFzQ29sdW1ucygpKQotICAgICAgICAgICAgICAgICAgICAgICAg
dmlldy0+dXBkYXRlQ29sdW1uSW5mb0Zyb21TdHlsZShkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBTZWFtbGVzcyBpZnJhbWVzIHdhbnQgdG8gaW5oZXJpdCB0aGVpciBmb250IGZyb20gdGhlaXIg
cGFyZW50IGlmcmFtZSwgc28gZWFybHkgcmV0dXJuIGJlZm9yZSBzZXR0aW5nIHRoZSBmb250Lgot
ICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpCi0gICAgICAgIHJldHVybiBkb2N1bWVudFN0eWxl
LnJlbGVhc2UoKTsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAg
Zm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0
aW9uKGRvY3VtZW50U3R5bGUtPmxvY2FsZSgpKSk7Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5n
cyA9IGRvY3VtZW50LT5zZXR0aW5ncygpKSB7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRV
c2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZv
bnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVu
ZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7Ci0gICAgICAgIGNvbnN0
IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250ID0gc2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWls
eShmb250RGVzY3JpcHRpb24uc2NyaXB0KCkpOwotICAgICAgICBpZiAoIXN0YW5kYXJkRm9udC5p
c0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5
KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOwotICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udCk7Ci0gICAgICAgICAg
ICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7Ci0gICAgICAg
IH0KLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVt
IC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgICAgIGludCBzaXplID0gU3R5bGVSZXNvbHZl
cjo6Zm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50LCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpOwot
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAgICAgICAg
Ym9vbCB1c2VTVkdab29tUnVsZXMgPSBkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgpOwotICAgICAg
ICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1
dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCBkb2N1bWVudFN0eWxlLmdldCgpLCBm
b250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKSk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChk
b2N1bWVudC0+cHJpbnRpbmcoKSk7Ci0KLSAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0
aW9uOwotICAgIE5vbkNKS0dseXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKLSAgICBn
ZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihkb2N1bWVudFN0eWxlLmdldCgpLCBmb250T3JpZW50
YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRh
dGlvbihmb250T3JpZW50YXRpb24pOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlw
aE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOwotCi0gICAgZG9jdW1lbnRTdHlsZS0+c2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgZG9jdW1lbnRTdHlsZS0+Zm9u
dCgpLnVwZGF0ZShmb250U2VsZWN0b3IpOwotCi0gICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVs
ZWFzZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdFNoYWRvd0JvdW5kYXJ5KGNvbnN0
IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYgKCFlbGVtZW50KQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgQ29udGFpbmVyTm9kZSogcGFyZW50Tm9kZSA9IGVsZW1lbnQtPnBhcmVudE5v
ZGUoKTsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLT5pc1NoYWRvd1Jvb3Qo
KTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JF
bGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIFJlbmRlclN0eWxlKiBkZWZhdWx0UGFyZW50LAotICAg
IFN0eWxlU2hhcmluZ0JlaGF2aW9yIHNoYXJpbmdCZWhhdmlvciwgUnVsZU1hdGNoaW5nQmVoYXZp
b3IgbWF0Y2hpbmdCZWhhdmlvciwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQotewot
ICAgIC8vIE9uY2UgYW4gZWxlbWVudCBoYXMgYSByZW5kZXJlciwgd2UgZG9uJ3QgdHJ5IHRvIGRl
c3Ryb3kgaXQsIHNpbmNlIG90aGVyd2lzZSB0aGUgcmVuZGVyZXIKLSAgICAvLyB3aWxsIHZhbmlz
aCBpZiBhIHN0eWxlIHJlY2FsYyBoYXBwZW5zIGR1cmluZyBsb2FkaW5nLgotICAgIGlmIChzaGFy
aW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIWVsZW1lbnQtPmRvY3VtZW50KCkt
PmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpICYmICFlbGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAg
ICAgIGlmICghc19zdHlsZU5vdFlldEF2YWlsYWJsZSkgewotICAgICAgICAgICAgc19zdHlsZU5v
dFlldEF2YWlsYWJsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAg
ICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5zZXREaXNwbGF5KE5PTkUpOwotICAgICAgICAg
ICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+Zm9udCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7
Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC0+ZG9jdW1lbnQoKS0+c2V0SGFzTm9kZXNXaXRo
UGxhY2Vob2xkZXJTdHlsZSgpOwotICAgICAgICByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJs
ZTsKLSAgICB9Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGluaXRFbGVtZW50
KGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxl
bWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOwotICAgIGlm
IChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1
dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHls
ZSA9IGxvY2F0ZVNoYXJlZFN0eWxlKCk7Ci0gICAgICAgIGlmIChzaGFyZWRTdHlsZSkKLSAgICAg
ICAgICAgIHJldHVybiBzaGFyZWRTdHlsZTsKLSAgICB9Ci0KLSAgICBSZWZQdHI8UmVuZGVyU3R5
bGU+IGNsb25lRm9yUGFyZW50OwotCi0gICAgaWYgKHN0YXRlLnBhcmVudFN0eWxlKCkpIHsKLSAg
ICAgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oc3RhdGUucGFyZW50U3R5bGUoKSwgaXNBdFNoYWRvd0Jv
dW5kYXJ5KGVsZW1lbnQpID8gUmVuZGVyU3R5bGU6OkF0U2hhZG93Qm91bmRhcnkgOiBSZW5kZXJT
dHlsZTo6Tm90QXRTaGFkb3dCb3VuZGFyeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGUu
c2V0U3R5bGUoZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpKTsKLSAgICAgICAgY2xvbmVGb3JQYXJl
bnQgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3RhdGUuc3R5bGUoKSk7Ci0gICAgICAgIHN0YXRlLnNl
dFBhcmVudFN0eWxlKGNsb25lRm9yUGFyZW50LmdldCgpKTsKLSAgICB9Ci0gICAgLy8gY29udGVu
dGVkaXRhYmxlIGF0dHJpYnV0ZSAoaW1wbGVtZW50ZWQgYnkgLXdlYmtpdC11c2VyLW1vZGlmeSkg
c2hvdWxkCi0gICAgLy8gYmUgcHJvcGFnYXRlZCBmcm9tIHNoYWRvdyBob3N0IHRvIGRpc3RyaWJ1
dGVkIG5vZGUuCi0gICAgaWYgKHN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7
Ci0gICAgICAgIGlmIChFbGVtZW50KiBwYXJlbnQgPSBlbGVtZW50LT5wYXJlbnRFbGVtZW50KCkp
IHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJTdHlsZSogc3R5bGVPZlNoYWRvd0hvc3QgPSBwYXJl
bnQtPnJlbmRlclN0eWxlKCkpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNl
ck1vZGlmeShzdHlsZU9mU2hhZG93SG9zdC0+dXNlck1vZGlmeSgpKTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSkgewotICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRJc0xpbmsodHJ1ZSk7Ci0gICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0ZSA9IHN0YXRl
LmVsZW1lbnRMaW5rU3RhdGUoKTsKLSAgICAgICAgaWYgKGxpbmtTdGF0ZSAhPSBOb3RJbnNpZGVM
aW5rKSB7Ci0gICAgICAgICAgICBib29sIGZvcmNlVmlzaXRlZCA9IEluc3BlY3Rvckluc3RydW1l
bnRhdGlvbjo6Zm9yY2VQc2V1ZG9TdGF0ZShlbGVtZW50LCBDU1NTZWxlY3Rvcjo6UHNldWRvVmlz
aXRlZCk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VWaXNpdGVkKQotICAgICAgICAgICAgICAgIGxp
bmtTdGF0ZSA9IEluc2lkZVZpc2l0ZWRMaW5rOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXRlKTsKLSAgICB9Ci0KLSAgICBib29sIG5lZWRz
Q29sbGVjdGlvbiA9IGZhbHNlOwotICAgIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZW5zdXJlRGVm
YXVsdFN0eWxlU2hlZXRzRm9yRWxlbWVudChlbGVtZW50LCBuZWVkc0NvbGxlY3Rpb24pOwotICAg
IGlmIChuZWVkc0NvbGxlY3Rpb24pCi0gICAgICAgIG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVz
KGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwotCi0g
ICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7Ci0gICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0g
TWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3Vs
dCk7Ci0gICAgZWxzZQotICAgICAgICBtYXRjaEFsbFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRjaGlu
Z0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNsdWRpbmdTTUlMKTsKLQotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGVsZW1lbnQpOwotCi0gICAgLy8gQ2xlYW4gdXAg
b3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90
aGVyIGZpeHVwcykuCi0gICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cGFyZW50U3R5bGUoKSwgZWxlbWVudCk7Ci0KLSAgICBzdGF0ZS5jbGVhcigpOyAvLyBDbGVhciBv
dXQgZm9yIHRoZSBuZXh0IHJlc29sdmUuCi0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHls
ZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4g
c3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwg
Y29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUsIEtleWZyYW1lVmFsdWUmIGtleWZyYW1lVmFs
dWUpCi17Ci0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVy
dGllcygpKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5w
cm9wZXJ0aWVzKCkpOwotCi0gICAgQVNTRVJUKCFtX3N0YXRlLnN0eWxlKCkpOwotCi0gICAgU3Rh
dGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIC8vIENyZWF0ZSB0aGUgc3R5bGUKLSAgICBzdGF0
ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y2xvbmUoZWxlbWVudFN0eWxlKSk7Ci0gICAgc3RhdGUu
c2V0TGluZUhlaWdodFZhbHVlKDApOwotCi0gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBib3RoZXIg
d2l0aCAhaW1wb3J0YW50LiBTaW5jZSB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lCi0gICAgLy8gZGVj
bCwgdGhlcmUncyBub3RoaW5nIHRvIG92ZXJyaWRlLiBTbyBqdXN0IGFkZCB0aGUgZmlyc3QgcHJv
cGVydGllcy4KLSAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICBpZiAoa2V5ZnJh
bWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJp
b3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3Qg
ZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwot
Ci0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBv
biB0aGUgZm9udC1zaXplCi0gICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQotICAgICAg
ICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZh
bHVlKCkpOwotCi0gICAgLy8gTm93IGRvIHJlc3Qgb2YgdGhlIHByb3BlcnRpZXMuCi0gICAgaWYg
KGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8
TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9u
dCBnb3QgZGlydGllZCBieSBvbmUgb2YgdGhlIG5vbi1lc3NlbnRpYWwgZm9udCBwcm9wcywKLSAg
ICAvLyBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IGEgc2Vjb25kIHRpbWUuCi0gICAgdXBkYXRlRm9u
dCgpOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlz
IHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0gICAgCi0gICAgLy8gQWRkIGFs
bCB0aGUgYW5pbWF0aW5nIHByb3BlcnRpZXMgdG8gdGhlIGtleWZyYW1lLgotICAgIGlmIChjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiBzdHlsZURlY2xhcmF0aW9uID0ga2V5ZnJhbWUtPnByb3BlcnRp
ZXMoKSkgewotICAgICAgICB1bnNpZ25lZCBwcm9wZXJ0eUNvdW50ID0gc3R5bGVEZWNsYXJhdGlv
bi0+cHJvcGVydHlDb3VudCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJv
cGVydHlDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0g
c3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlBdChpKS5pZCgpOwotICAgICAgICAgICAgLy8gVGlt
aW5nLWZ1bmN0aW9uIHdpdGhpbiBrZXlmcmFtZXMgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBu
b3QgYW5pbWF0ZWQ7IGl0IGp1c3QKLSAgICAgICAgICAgIC8vIGRlc2NyaWJlcyB0aGUgdGltaW5n
IGZ1bmN0aW9uIGJldHdlZW4gdGhpcyBrZXlmcmFtZSBhbmQgdGhlIG5leHQuCi0gICAgICAgICAg
ICBpZiAocHJvcGVydHkgIT0gQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlv
bikKLSAgICAgICAgICAgICAgICBrZXlmcmFtZVZhbHVlLmFkZFByb3BlcnR5KHByb3BlcnR5KTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2
ZXIoKTsKLQotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjprZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVtZW50KiBlLCBjb25zdCBSZW5k
ZXJTdHlsZSogZWxlbWVudFN0eWxlLCBLZXlmcmFtZUxpc3QmIGxpc3QpCi17Ci0gICAgbGlzdC5j
bGVhcigpOwotCi0gICAgLy8gR2V0IHRoZSBrZXlmcmFtZXNSdWxlIGZvciB0aGlzIG5hbWUKLSAg
ICBpZiAoIWUgfHwgbGlzdC5hbmltYXRpb25OYW1lKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBtX2tleWZyYW1lc1J1bGVNYXAuY2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAg
S2V5ZnJhbWVzUnVsZU1hcDo6aXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lc1J1bGVNYXAuZmluZChs
aXN0LmFuaW1hdGlvbk5hbWUoKS5pbXBsKCkpOwotICAgIGlmIChpdCA9PSBtX2tleWZyYW1lc1J1
bGVNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IFN0eWxlUnVsZUtleWZy
YW1lcyoga2V5ZnJhbWVzUnVsZSA9IGl0LT52YWx1ZS5nZXQoKTsKLQotICAgIC8vIENvbnN0cnVj
dCBhbmQgcG9wdWxhdGUgdGhlIHN0eWxlIGZvciBlYWNoIGtleWZyYW1lCi0gICAgY29uc3QgVmVj
dG9yPFJlZlB0cjxTdHlsZUtleWZyYW1lPiA+JiBrZXlmcmFtZXMgPSBrZXlmcmFtZXNSdWxlLT5r
ZXlmcmFtZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwga2V5ZnJhbWVzLnNpemUo
KTsgKytpKSB7Ci0gICAgICAgIC8vIEFwcGx5IHRoZSBkZWNsYXJhdGlvbiB0byB0aGUgc3R5bGUu
IFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGxvZ2ljIGluIHN0eWxlRm9yRWxl
bWVudAotICAgICAgICBpbml0RWxlbWVudChlKTsKLSAgICAgICAgbV9zdGF0ZS5pbml0Rm9yU3R5
bGVSZXNvbHZlKGRvY3VtZW50KCksIGUpOwotCi0gICAgICAgIGNvbnN0IFN0eWxlS2V5ZnJhbWUq
IGtleWZyYW1lID0ga2V5ZnJhbWVzW2ldLmdldCgpOwotCi0gICAgICAgIEtleWZyYW1lVmFsdWUg
a2V5ZnJhbWVWYWx1ZSgwLCAwKTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHls
ZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwga2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLQot
ICAgICAgICAvLyBBZGQgdGhpcyBrZXlmcmFtZSBzdHlsZSB0byBhbGwgdGhlIGluZGljYXRlZCBr
ZXkgdGltZXMKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBrZXlzOwotICAgICAgICBrZXlmcmFtZS0+
Z2V0S2V5cyhrZXlzKTsKLSAgICAgICAgZm9yIChzaXplX3Qga2V5SW5kZXggPSAwOyBrZXlJbmRl
eCA8IGtleXMuc2l6ZSgpOyArK2tleUluZGV4KSB7Ci0gICAgICAgICAgICBrZXlmcmFtZVZhbHVl
LnNldEtleShrZXlzW2tleUluZGV4XSk7Ci0gICAgICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFt
ZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZSAwJSBrZXlmcmFtZSBp
cyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBv
dGhlciBrZXlmcmFtZSkKLSAgICBpbnQgaW5pdGlhbExpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0g
ICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgbGlzdFswXS5rZXkoKSkgewotICAgICAgICBz
dGF0aWMgU3R5bGVLZXlmcmFtZSogemVyb1BlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCF6
ZXJvUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lID0g
U3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgemVyb1BlcmNl
bnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMCUiKTsKLSAgICAgICAgfQotICAgICAgICBLZXlmcmFt
ZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7Ci0gICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5
bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIHplcm9QZXJjZW50S2V5ZnJhbWUsIGtl
eWZyYW1lVmFsdWUpKTsKLSAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7Ci0gICAg
fQotCi0gICAgLy8gSWYgdGhlIDEwMCUga2V5ZnJhbWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChi
dXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5ZnJhbWUpCi0gICAgaWYg
KGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgKGxpc3RbbGlzdC5zaXplKCkgLSAxXS5rZXkoKSAhPSAx
KSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogaHVuZHJlZFBlcmNlbnRLZXlmcmFt
ZTsKLSAgICAgICAgaWYgKCFodW5kcmVkUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAgICAgICBo
dW5kcmVkUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigp
OwotICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMTAwJSIp
OwotICAgICAgICB9Ci0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgxLCAwKTsK
LSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRT
dHlsZSwgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotICAgICAgICBs
aXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiBlLCBj
b25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlKQotewotICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7Ci0gICAgaWYgKCFlKQot
ICAgICAgICByZXR1cm4gMDsKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBp
bml0RWxlbWVudChlKTsKLQotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQo
KSwgZSwgcGFyZW50U3R5bGUsIHBzZXVkb1N0eWxlUmVxdWVzdCk7Ci0gICAgc3RhdGUuc2V0U3R5
bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJv
bShtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotCi0gICAgLy8gU2luY2Ugd2UgZG9uJ3QgdXNlIHBz
ZXVkby1lbGVtZW50cyBpbiBhbnkgb2Ygb3VyIHF1aXJrL3ByaW50IHVzZXIgYWdlbnQgcnVsZXMs
IGRvbid0IHdhc3RlIHRpbWUgd2Fsa2luZwotICAgIC8vIHRob3NlIHJ1bGVzLgotCi0gICAgLy8g
Q2hlY2sgVUEsIHVzZXIgYW5kIGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJl
c3VsdDsKLSAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOwotCi0gICAgaWYgKG1fbWF0Y2hB
dXRob3JBbmRVc2VyU3R5bGVzKSB7Ci0gICAgICAgIG1hdGNoVXNlclJ1bGVzKG1hdGNoUmVzdWx0
LCBmYWxzZSk7Ci0gICAgICAgIG1hdGNoQXV0aG9yUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsK
LSAgICB9Ci0KLSAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN0YXRlLnN0eWxlKCktPnNldFN0eWxlVHlwZShw
c2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
cyhtYXRjaFJlc3VsdCwgZSk7Ci0KLSAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3Mg
ZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KLSAgICBh
ZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnBhcmVudFN0eWxlKCksIDAp
OwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0
eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLSAgICBkb2N1bWVudCgpLT5kaWRB
Y2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAg
ICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+
IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KQotewotICAgIG1fc3Rh
dGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBkb2N1bWVudCgpLT5kb2N1bWVudEVs
ZW1lbnQoKSk7IC8vIG1fcm9vdEVsZW1lbnRTdHlsZSB3aWxsIGJlIHNldCB0byB0aGUgZG9jdW1l
bnQgc3R5bGUuCi0KLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnJvb3RFbGVtZW50U3R5
bGUoKSk7Ci0KLSAgICBjb25zdCBib29sIGlzTGVmdCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsK
LSAgICBjb25zdCBib29sIGlzRmlyc3QgPSBpc0ZpcnN0UGFnZShwYWdlSW5kZXgpOwotICAgIGNv
bnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUocGFnZUluZGV4KTsKLSAgICAKLSAgICBNYXRjaFJl
c3VsdCByZXN1bHQ7Ci0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVT
aGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIG1h
dGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBpc0Zp
cnN0LCBwYWdlKTsKLSAgICAvLyBPbmx5IGNvbnNpZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1bGVT
ZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhlIEhUTUw1IHNwZWMuCi0gICAgbWF0Y2hQYWdl
UnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwg
cGFnZSk7Ci0gICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgYm9vbCBpbmhl
cml0ZWRPbmx5ID0gZmFsc2U7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihyZXN1bHQsIGZhbHNlLCAwLCBy
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0jZW5k
aWYKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJl
c3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhl
cml0ZWRPbmx5KTsKLQotICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBh
bmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdo
dCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUuCi0g
ICAgaWYgKG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHko
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBtX3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAg
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZh
bHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25s
eSk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMg
c3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLQotICAgIGRvY3VtZW50KCktPmRp
ZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgot
ICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBTdHlsZVJlc29sdmVyOjpkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkKLXsKLSAgICBtX3N0
YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgLy8gTWFrZSBzdXJlIG91
ciBmb250cyBhcmUgaW5pdGlhbGl6ZWQgaWYgd2UgZG9uJ3QgaW5oZXJpdCB0aGVtIGZyb20gb3Vy
IHBhcmVudCBzdHlsZS4KLSAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0
aW5ncygpKSB7Ci0gICAgICAgIGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOwotICAgICAg
ICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9udFNlbGVjdG9yKCkpOwotICAgIH0g
ZWxzZQotICAgICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51cGRhdGUoMCk7Ci0KLSAgICBy
ZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4g
U3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JUZXh0KFRleHQqIHRleHROb2RlKQotewotICAgIEFTU0VS
VCh0ZXh0Tm9kZSk7Ci0KLSAgICBOb2RlUmVuZGVyaW5nQ29udGV4dCBjb250ZXh0KHRleHROb2Rl
KTsKLSAgICBOb2RlKiBwYXJlbnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5n
QW5kU3R5bGUoKTsKLSAgICByZXR1cm4gY29udGV4dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSB8
fCAhcGFyZW50Tm9kZSA/Ci0gICAgICAgIGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSA6IHBhcmVu
dE5vZGUtPnJlbmRlclN0eWxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZEludHJpbnNpY01hcmdp
bnMoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIC8vIEludHJpbnNpYyBtYXJnaW4gdmFsdWUu
Ci0gICAgY29uc3QgaW50IGludHJpbnNpY01hcmdpbiA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9v
bSgpOwotCi0gICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFs
c28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgotICAgIC8vIEZJ
WE1FOiBVc2luZyAicXVpcmsiIHRvIGRlY2lkZSB0aGUgbWFyZ2luIHdhc24ndCBzZXQgaXMga2lu
ZCBvZiBsYW1lLgotICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7
Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luTGVmdCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBz
dHlsZS0+c2V0TWFyZ2luTGVmdChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAg
ICAgICBpZiAoc3R5bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxl
LT5zZXRNYXJnaW5SaWdodChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgIH0K
LQotICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpIHsKLSAgICAgICAgaWYgKHN0eWxl
LT5tYXJnaW5Ub3AoKS5xdWlyaygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblRvcChM
ZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdp
bkJvdHRvbSgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExl
bmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgRURpc3Bs
YXkgZXF1aXZhbGVudEJsb2NrRGlzcGxheShFRGlzcGxheSBkaXNwbGF5LCBib29sIGlzRmxvYXRp
bmcsIGJvb2wgc3RyaWN0UGFyc2luZykKLXsKLSAgICBzd2l0Y2ggKGRpc3BsYXkpIHsKLSAgICBj
YXNlIEJMT0NLOgotICAgIGNhc2UgVEFCTEU6Ci0gICAgY2FzZSBCT1g6Ci0gICAgY2FzZSBGTEVY
OgotICAgIGNhc2UgR1JJRDoKLSAgICAgICAgcmV0dXJuIGRpc3BsYXk7Ci0KLSAgICBjYXNlIExJ
U1RfSVRFTToKLSAgICAgICAgLy8gSXQgaXMgYSBXaW5JRSBidWcgdGhhdCBmbG9hdGVkIGxpc3Qg
aXRlbXMgbG9zZSB0aGVpciBidWxsZXRzLCBzbyB3ZSdsbCBlbXVsYXRlIHRoZSBxdWlyaywgYnV0
IG9ubHkgaW4gcXVpcmtzIG1vZGUuCi0gICAgICAgIGlmICghc3RyaWN0UGFyc2luZyAmJiBpc0Zs
b2F0aW5nKQotICAgICAgICAgICAgcmV0dXJuIEJMT0NLOwotICAgICAgICByZXR1cm4gZGlzcGxh
eTsKLSAgICBjYXNlIElOTElORV9UQUJMRToKLSAgICAgICAgcmV0dXJuIFRBQkxFOwotICAgIGNh
c2UgSU5MSU5FX0JPWDoKLSAgICAgICAgcmV0dXJuIEJPWDsKLSAgICBjYXNlIElOTElORV9GTEVY
OgotICAgICAgICByZXR1cm4gRkxFWDsKLSAgICBjYXNlIElOTElORV9HUklEOgotICAgICAgICBy
ZXR1cm4gR1JJRDsKLQotICAgIGNhc2UgSU5MSU5FOgotICAgIGNhc2UgUlVOX0lOOgotICAgIGNh
c2UgQ09NUEFDVDoKLSAgICBjYXNlIElOTElORV9CTE9DSzoKLSAgICBjYXNlIFRBQkxFX1JPV19H
Uk9VUDoKLSAgICBjYXNlIFRBQkxFX0hFQURFUl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0ZPT1RF
Ul9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX1JPVzoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9V
UDoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTjoKLSAgICBjYXNlIFRBQkxFX0NFTEw6Ci0gICAgY2Fz
ZSBUQUJMRV9DQVBUSU9OOgotICAgICAgICByZXR1cm4gQkxPQ0s7Ci0gICAgY2FzZSBOT05FOgot
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuIE5PTkU7Ci0gICAg
fQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBCTE9DSzsKLX0KLQotLy8g
Q1NTIHJlcXVpcmVzIHRleHQtZGVjb3JhdGlvbiB0byBiZSByZXNldCBhdCBlYWNoIERPTSBlbGVt
ZW50IGZvciB0YWJsZXMsIAotLy8gaW5saW5lIGJsb2NrcywgaW5saW5lIHRhYmxlcywgcnVuLWlu
cywgc2hhZG93IERPTSBjcm9zc2luZ3MsIGZsb2F0aW5nIGVsZW1lbnRzLAotLy8gYW5kIGFic29s
dXRlIG9yIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBlbGVtZW50cy4KLXN0YXRpYyBib29sIGRvZXNO
b3RJbmhlcml0VGV4dERlY29yYXRpb24oUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKQot
ewotICAgIHJldHVybiBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5
KCkgPT0gSU5MSU5FX1RBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gUlVOX0lOCi0gICAgICAg
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JMT0NLIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gSU5MSU5FX0JPWCB8fCBpc0F0U2hhZG93Qm91bmRhcnkoZSkKLSAgICAgICAgfHwgc3R5bGUt
PmlzRmxvYXRpbmcoKSB8fCBzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKTsKLX0KLQotc3Rh
dGljIGJvb2wgaXNEaXNwbGF5RmxleGlibGVCb3goRURpc3BsYXkgZGlzcGxheSkKLXsKLSAgICBy
ZXR1cm4gZGlzcGxheSA9PSBGTEVYIHx8IGRpc3BsYXkgPT0gSU5MSU5FX0ZMRVg7Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6YWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlLCBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQgKmUpCi17Ci0gICAgQVNTRVJUKHBhcmVu
dFN0eWxlKTsKLQotICAgIC8vIENhY2hlIG91ciBvcmlnaW5hbCBkaXNwbGF5LgotICAgIHN0eWxl
LT5zZXRPcmlnaW5hbERpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSk7Ci0KLSAgICBpZiAoc3R5bGUt
PmRpc3BsYXkoKSAhPSBOT05FKSB7Ci0gICAgICAgIC8vIElmIHdlIGhhdmUgYSA8dGQ+IHRoYXQg
c3BlY2lmaWVzIGEgZmxvYXQgcHJvcGVydHksIGluIHF1aXJrcyBtb2RlIHdlIGp1c3QgZHJvcCB0
aGUgZmxvYXQKLSAgICAgICAgLy8gcHJvcGVydHkuCi0gICAgICAgIC8vIFNpdGVzIGFsc28gY29t
bW9ubHkgdXNlIGRpc3BsYXk6aW5saW5lL2Jsb2NrIG9uIDx0ZD5zIGFuZCA8dGFibGU+cy4gSW4g
cXVpcmtzIG1vZGUgd2UgZm9yY2UKLSAgICAgICAgLy8gdGhlc2UgdGFncyB0byByZXRhaW4gdGhl
aXIgZGlzcGxheSB0eXBlcy4KLSAgICAgICAgaWYgKGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgp
ICYmIGUpIHsKLSAgICAgICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSkgewotICAgICAg
ICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KFRBQkxFX0NFTEwpOwotICAgICAgICAgICAgICAg
IHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS0+
aGFzVGFnTmFtZSh0YWJsZVRhZykpCi0gICAgICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXko
c3R5bGUtPmlzRGlzcGxheUlubGluZVR5cGUoKSA/IElOTElORV9UQUJMRSA6IFRBQkxFKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBlLT5o
YXNUYWdOYW1lKHRoVGFnKSkpIHsKLSAgICAgICAgICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgp
ID09IEtIVE1MX05PV1JBUCkgewotICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ug
YXJlIHJlYWxseSBub3dyYXBwaW5nIG9yIGlmIHdlIHNob3VsZCBqdXN0Ci0gICAgICAgICAgICAg
ICAgLy8gdXNlIG5vcm1hbCBpbnN0ZWFkLiBJZiB0aGUgd2lkdGggb2YgdGhlIGNlbGwgaXMgZml4
ZWQsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBhY3R1YWxseSB1c2UgTk9XUkFQ
LgotICAgICAgICAgICAgICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ZpeGVkKCkpCi0gICAgICAg
ICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PUk1BTCk7Ci0gICAgICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVAp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGFibGVzIG5ldmVyIHN1
cHBvcnQgdGhlIC13ZWJraXQtKiB2YWx1ZXMgZm9yIHRleHQtYWxpZ24gYW5kIHdpbGwgcmVzZXQg
YmFjayB0byB0aGUgZGVmYXVsdC4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0YWJs
ZVRhZykgJiYgKHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfTEVGVCB8fCBzdHlsZS0+dGV4
dEFsaWduKCkgPT0gV0VCS0lUX0NFTlRFUiB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lU
X1JJR0hUKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oVEFTVEFSVCk7Ci0KLSAg
ICAgICAgLy8gRnJhbWVzIGFuZCBmcmFtZXNldHMgbmV2ZXIgaG9ub3IgcG9zaXRpb246cmVsYXRp
dmUgb3IgcG9zaXRpb246YWJzb2x1dGUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCi0gICAgICAgIC8v
IGZpeCBhIGNyYXNoIHdoZXJlIGEgc2l0ZSB0cmllcyB0byBwb3NpdGlvbiB0aGVzZSBvYmplY3Rz
LiBUaGV5IGFsc28gbmV2ZXIgaG9ub3IgZGlzcGxheS4KLSAgICAgICAgaWYgKGUgJiYgKGUtPmhh
c1RhZ05hbWUoZnJhbWVUYWcpIHx8IGUtPmhhc1RhZ05hbWUoZnJhbWVzZXRUYWcpKSkgewotICAg
ICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9uKTsKLSAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1Ynkg
dGV4dCBkb2VzIG5vdCBzdXBwb3J0IGZsb2F0IG9yIHBvc2l0aW9uLiBUaGlzIG1pZ2h0IGNoYW5n
ZSB3aXRoIGV2b2x1dGlvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgaWYgKGUgJiYg
ZS0+aGFzVGFnTmFtZShydFRhZykpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihT
dGF0aWNQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7
Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIG92ZXJyaWRp
bmcgc3RhcnQvLXdlYmtpdC1hdXRvIGxpa2UgdGhpcy4gRG8gaXQgaW4gaHRtbC5jc3MgaW5zdGVh
ZC4KLSAgICAgICAgLy8gVGFibGUgaGVhZGVycyB3aXRoIGEgdGV4dC1hbGlnbiBvZiAtd2Via2l0
LWF1dG8gd2lsbCBjaGFuZ2UgdGhlIHRleHQtYWxpZ24gdG8gY2VudGVyLgotICAgICAgICBpZiAo
ZSAmJiBlLT5oYXNUYWdOYW1lKHRoVGFnKSAmJiBzdHlsZS0+dGV4dEFsaWduKCkgPT0gVEFTVEFS
VCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0QWxpZ24oQ0VOVEVSKTsKLQotICAgICAgICBp
ZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGxlZ2VuZFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0
RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgLy8gQWJzb2x1dGUvZml4ZWQgcG9zaXRpb25lZCBl
bGVtZW50cywgZmxvYXRpbmcgZWxlbWVudHMgYW5kIHRoZSBkb2N1bWVudCBlbGVtZW50IG5lZWQg
YmxvY2stbGlrZSBvdXRzaWRlIGRpc3BsYXkuCi0gICAgICAgIGlmIChzdHlsZS0+aGFzT3V0T2ZG
bG93UG9zaXRpb24oKSB8fCBzdHlsZS0+aXNGbG9hdGluZygpIHx8IChlICYmIGUtPmRvY3VtZW50
KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpKQotICAgICAgICAgICAgc3R5bGUtPnNldERpc3Bs
YXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9h
dGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKLQotICAgICAgICAvLyBGSVhN
RTogRG9uJ3Qgc3VwcG9ydCB0aGlzIG11dGF0aW9uIGZvciBwc2V1ZG8gc3R5bGVzIGxpa2UgZmly
c3QtbGV0dGVyIG9yIGZpcnN0LWxpbmUsIHNpbmNlIGl0J3Mgbm90IGNvbXBsZXRlbHkKLSAgICAg
ICAgLy8gY2xlYXIgaG93IHRoYXQgc2hvdWxkIHdvcmsuCi0gICAgICAgIGlmIChzdHlsZS0+ZGlz
cGxheSgpID09IElOTElORSAmJiBzdHlsZS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgc3R5
bGUtPndyaXRpbmdNb2RlKCkgIT0gcGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpCi0gICAgICAg
ICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOwotCi0gICAgICAgIC8vIEFmdGVy
IHBlcmZvcm1pbmcgdGhlIGRpc3BsYXkgbXV0YXRpb24sIGNoZWNrIHRhYmxlIHJvd3MuIFdlIGRv
IG5vdCBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlvbjpzdGlja3kgb24KLSAgICAg
ICAgLy8gdGFibGUgcm93cyBvciBjZWxscy4gVGhpcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBmb3Ig
cG9zaXRpb246cmVsYXRpdmUgaW4gQ1NTMi4xIChhbmQgY2F1c2VkIGEgY3Jhc2ggaW4gY29udGFp
bmluZ0Jsb2NrKCkKLSAgICAgICAgLy8gb24gc29tZSBzaXRlcykuCi0gICAgICAgIGlmICgoc3R5
bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFC
TEVfRk9PVEVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XKQotICAgICAg
ICAgICAgJiYgc3R5bGUtPmhhc0luRmxvd1Bvc2l0aW9uKCkpCi0gICAgICAgICAgICBzdHlsZS0+
c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOwotCi0gICAgICAgIC8vIHdyaXRpbmctbW9kZSBk
b2VzIG5vdCBhcHBseSB0byB0YWJsZSByb3cgZ3JvdXBzLCB0YWJsZSBjb2x1bW4gZ3JvdXBzLCB0
YWJsZSByb3dzLCBhbmQgdGFibGUgY29sdW1ucy4KLSAgICAgICAgLy8gRklYTUU6IFRhYmxlIGNl
bGxzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGJlIHBlcnBlbmRpY3VsYXIgb3IgZmxpcHBlZCB3aXRo
IHJlc3BlY3QgdG8gdGhlIHRhYmxlLCB0aG91Z2guCi0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxh
eSgpID09IFRBQkxFX0NPTFVNTiB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9H
Uk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RFUl9HUk9VUAotICAgICAgICAg
ICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBUQUJMRV9ST1cgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JP
VVAKLSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ0VMTCkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSk7
Ci0KLSAgICAgICAgLy8gRklYTUU6IFNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYmxvY2stZmxvdyBv
biBmbGV4aWJsZSBib3hlcyB5ZXQsIGRpc2FsbG93IHNldHRpbmcKLSAgICAgICAgLy8gb2YgYmxv
Y2stZmxvdyB0byBhbnl0aGluZyBvdGhlciB0aGFuIFRvcFRvQm90dG9tV3JpdGluZ01vZGUuCi0g
ICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NjQxOCAt
IEZsZXhpYmxlIGJveCBzdXBwb3J0LgotICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkg
IT0gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSAmJiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBCT1ggfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9YKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRX
cml0aW5nTW9kZShUb3BUb0JvdHRvbVdyaXRpbmdNb2RlKTsKLQotICAgICAgICBpZiAoaXNEaXNw
bGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkpIHsKLSAgICAgICAgICAgIHN0
eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5
KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRp
bmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7Ci0gICAgICAgIH0KLQotI2lmIEVO
QUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgLy8gUGVyIHRoZSBzcGVjLCBwb3NpdGlvbiAn
c3RhdGljJyBhbmQgJ3JlbGF0aXZlJyBpbiB0aGUgdG9wIGxheWVyIGNvbXB1dGUgdG8gJ2Fic29s
dXRlJy4KLSAgICAgICAgaWYgKGUgJiYgZS0+aXNJblRvcExheWVyKCkgJiYgKHN0eWxlLT5wb3Np
dGlvbigpID09IFN0YXRpY1Bvc2l0aW9uIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFJlbGF0aXZl
UG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oQWJzb2x1dGVQb3Np
dGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgICAgIH0K
LSNlbmRpZgotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSBvdXIgei1pbmRleCB2YWx1ZSBpcyBv
bmx5IGFwcGxpZWQgaWYgdGhlIG9iamVjdCBpcyBwb3NpdGlvbmVkLgotICAgIGlmIChzdHlsZS0+
cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiAmJiAhaXNEaXNwbGF5RmxleGlibGVCb3gocGFy
ZW50U3R5bGUtPmRpc3BsYXkoKSkpCi0gICAgICAgIHN0eWxlLT5zZXRIYXNBdXRvWkluZGV4KCk7
Ci0KLSAgICAvLyBBdXRvIHotaW5kZXggYmVjb21lcyAwIGZvciB0aGUgcm9vdCBlbGVtZW50IGFu
ZCB0cmFuc3BhcmVudCBvYmplY3RzLiBUaGlzIHByZXZlbnRzCi0gICAgLy8gY2FzZXMgd2hlcmUg
b2JqZWN0cyB0aGF0IHNob3VsZCBiZSBibGVuZGVkIGFzIGEgc2luZ2xlIHVuaXQgZW5kIHVwIHdp
dGggYSBub24tdHJhbnNwYXJlbnQKLSAgICAvLyBvYmplY3Qgd2VkZ2VkIGluIGJldHdlZW4gdGhl
bS4gQXV0byB6LWluZGV4IGFsc28gYmVjb21lcyAwIGZvciBvYmplY3RzIHRoYXQgc3BlY2lmeSB0
cmFuc2Zvcm1zL21hc2tzL3JlZmxlY3Rpb25zLgotICAgIGlmIChzdHlsZS0+aGFzQXV0b1pJbmRl
eCgpICYmICgoZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSBlKQotICAg
ICAgICB8fCBzdHlsZS0+b3BhY2l0eSgpIDwgMS4wZgotICAgICAgICB8fCBzdHlsZS0+aGFzVHJh
bnNmb3JtUmVsYXRlZFByb3BlcnR5KCkKLSAgICAgICAgfHwgc3R5bGUtPmhhc01hc2soKQotICAg
ICAgICB8fCBzdHlsZS0+Y2xpcFBhdGgoKQotICAgICAgICB8fCBzdHlsZS0+Ym94UmVmbGVjdCgp
Ci0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKQotICAgICAgICB8fCBzdHlsZS0+aGFzQmxl
bmRNb2RlKCkKLSAgICAgICAgfHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3RpY2t5UG9zaXRpb24K
LSAgICAgICAgfHwgKHN0eWxlLT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb24gJiYgZSAmJiBl
LT5kb2N1bWVudCgpLT5wYWdlKCkgJiYgZS0+ZG9jdW1lbnQoKS0+cGFnZSgpLT5zZXR0aW5ncygp
LT5maXhlZFBvc2l0aW9uQ3JlYXRlc1N0YWNraW5nQ29udGV4dCgpKQotI2lmIEVOQUJMRShBQ0NF
TEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCi0gICAgICAgIC8vIFRvdWNoIG92ZXJmbG93IHNj
cm9sbGluZyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dC4KLSAgICAgICAgfHwgKChzdHlsZS0+
b3ZlcmZsb3dYKCkgIT0gT0hJRERFTiB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikg
JiYgc3R5bGUtPnVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcoKSkKLSNlbmRpZgotI2lmIEVOQUJM
RShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgfHwgKGUgJiYgZS0+aXNJblRvcExheWVyKCkpCi0j
ZW5kaWYKLSAgICAgICAgKSkKLSAgICAgICAgc3R5bGUtPnNldFpJbmRleCgwKTsKLQotICAgIC8v
IFRleHRhcmVhIGNvbnNpZGVycyBvdmVyZmxvdyB2aXNpYmxlIGFzIGF1dG8uCi0gICAgaWYgKGUg
JiYgZS0+aGFzVGFnTmFtZSh0ZXh0YXJlYVRhZykpIHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJm
bG93WChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVy
Zmxvd1goKSk7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koc3R5bGUtPm92ZXJmbG93WSgp
ID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dZKCkpOwotICAgIH0KLQotICAg
IGlmIChkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0aW9uKHN0eWxlLCBlKSkKLSAgICAgICAgc3R5
bGUtPnNldFRleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsK
LSAgICBlbHNlCi0gICAgICAgIHN0eWxlLT5hZGRUb1RleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0
eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLQotICAgIC8vIElmIGVpdGhlciBvdmVyZmxvdyB2YWx1
ZSBpcyBub3QgdmlzaWJsZSwgY2hhbmdlIHRvIGF1dG8uCi0gICAgaWYgKHN0eWxlLT5vdmVyZmxv
d1goKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT01BUlFVRUUpCi0gICAg
ICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5v
dmVyZmxvd1koKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT01BUlFVRUUp
Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0
eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJ
U0lCTEUpIHsKLSAgICAgICAgLy8gRklYTUU6IE9uY2Ugd2UgaW1wbGVtZW50IHBhZ2luYXRpb24g
Y29udHJvbHMsIG92ZXJmbG93LXggc2hvdWxkIGRlZmF1bHQgdG8gaGlkZGVuCi0gICAgICAgIC8v
IGlmIG92ZXJmbG93LXkgaXMgc2V0IHRvIC13ZWJraXQtcGFnZWQteCBvciAtd2Via2l0LXBhZ2Ut
eS4gRm9yIG5vdywgd2UnbGwgbGV0IGl0Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gYXV0byBzbyB3
ZSBjYW4gYXQgbGVhc3Qgc2Nyb2xsIHRocm91Z2ggdGhlIHBhZ2VzLgotICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dYKE9BVVRPKTsKLSAgICB9IGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9
PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUpCi0gICAgICAgIHN0
eWxlLT5zZXRPdmVyZmxvd1koT0FVVE8pOwotCi0gICAgLy8gQ2FsbCBzZXRTdHlsZXNGb3JQYWdp
bmF0aW9uTW9kZSgpIGlmIGEgcGFnaW5hdGlvbiBtb2RlIGlzIHNldCBmb3IgYW55IG5vbi1yb290
IGVsZW1lbnRzLiBJZiB0aGVzZQotICAgIC8vIHN0eWxlcyBhcmUgc3BlY2lmaWVkIG9uIGEgcm9v
dCBlbGVtZW50LCB0aGVuIHRoZXkgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW4KLSAgICAvLyBTdHls
ZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KCkuCi0gICAgaWYgKChzdHlsZS0+b3ZlcmZsb3dZ
KCkgPT0gT1BBR0VEWCB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWSkgJiYgIShlICYm
IChlLT5oYXNUYWdOYW1lKGh0bWxUYWcpIHx8IGUtPmhhc1RhZ05hbWUoYm9keVRhZykpKSkKLSAg
ICAgICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoV2ViQ29yZTo6cGFnaW5hdGlvbk1vZGVG
b3JSZW5kZXJTdHlsZShzdHlsZSksIHN0eWxlKTsKLQotICAgIC8vIFRhYmxlIHJvd3MsIHNlY3Rp
b25zIGFuZCB0aGUgdGFibGUgaXRzZWxmIHdpbGwgc3VwcG9ydCBvdmVyZmxvdzpoaWRkZW4gYW5k
IHdpbGwgaWdub3JlIHNjcm9sbC9hdXRvLgotICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5IHRhYmxl
IHNlY3Rpb25zIHdpbGwgc3VwcG9ydCBhdXRvIGFuZCBzY3JvbGwuCi0gICAgaWYgKHN0eWxlLT5k
aXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUKLSAg
ICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBUQUJMRV9ST1cpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSAh
PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTikKLSAgICAgICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOwotICAgICAgICBpZiAoc3R5bGUtPm92ZXJm
bG93WSgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVOKQotICAg
ICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8g
TWVudWxpc3RzIHNob3VsZCBoYXZlIHZpc2libGUgb3ZlcmZsb3cKLSAgICBpZiAoc3R5bGUtPmFw
cGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpIHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93
WChPVklTSUJMRSk7Ci0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwotICAg
IH0KLQotICAgIC8vIEN1bGwgb3V0IGFueSB1c2VsZXNzIGxheWVycyBhbmQgYWxzbyByZXBlYXQg
cGF0dGVybnMgaW50byBhZGRpdGlvbmFsIGxheWVycy4KLSAgICBzdHlsZS0+YWRqdXN0QmFja2dy
b3VuZExheWVycygpOwotICAgIHN0eWxlLT5hZGp1c3RNYXNrTGF5ZXJzKCk7Ci0KLSAgICAvLyBE
byB0aGUgc2FtZSBmb3IgYW5pbWF0aW9ucyBhbmQgdHJhbnNpdGlvbnMuCi0gICAgc3R5bGUtPmFk
anVzdEFuaW1hdGlvbnMoKTsKLSAgICBzdHlsZS0+YWRqdXN0VHJhbnNpdGlvbnMoKTsKLQotICAg
IC8vIEltcG9ydGFudDogSW50cmluc2ljIG1hcmdpbnMgZ2V0IGFkZGVkIHRvIGNvbnRyb2xzIGJl
Zm9yZSB0aGUgdGhlbWUgaGFzIGFkanVzdGVkIHRoZSBzdHlsZSwgc2luY2UgdGhlIHRoZW1lIHdp
bGwKLSAgICAvLyBhbHRlciBmb250cyBhbmQgaGVpZ2h0cy93aWR0aHMuCi0gICAgaWYgKGUgJiYg
ZS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSAmJiBzdHlsZS0+Zm9udFNpemUoKSA+PSAxMSkgewot
ICAgICAgICAvLyBEb24ndCBhcHBseSBpbnRyaW5zaWMgbWFyZ2lucyB0byBpbWFnZSBidXR0b25z
LiBUaGUgZGVzaWduZXIga25vd3MgaG93IGJpZyB0aGUgaW1hZ2VzIGFyZSwKLSAgICAgICAgLy8g
c28gd2UgaGF2ZSB0byB0cmVhdCBhbGwgaW1hZ2UgYnV0dG9ucyBhcyB0aG91Z2ggdGhleSB3ZXJl
IGV4cGxpY2l0bHkgc2l6ZWQuCi0gICAgICAgIGlmICghZS0+aGFzVGFnTmFtZShpbnB1dFRhZykg
fHwgIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihlKS0+aXNJbWFnZUJ1dHRvbigpKQot
ICAgICAgICAgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8g
TGV0IHRoZSB0aGVtZSBhbHNvIGhhdmUgYSBjcmFjayBhdCBhZGp1c3RpbmcgdGhlIHN0eWxlLgot
ICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICBSZW5kZXJUaGVtZTo6ZGVm
YXVsdFRoZW1lKCktPmFkanVzdFN0eWxlKHRoaXMsIHN0eWxlLCBlLCBtX3N0YXRlLmhhc1VBQXBw
ZWFyYW5jZSgpLCBtX3N0YXRlLmJvcmRlckRhdGEoKSwgbV9zdGF0ZS5iYWNrZ3JvdW5kRGF0YSgp
LCBtX3N0YXRlLmJhY2tncm91bmRDb2xvcigpKTsKLQotICAgIC8vIElmIHdlIGhhdmUgZmlyc3Qt
bGV0dGVyIHBzZXVkbyBzdHlsZSwgZG8gbm90IHNoYXJlIHRoaXMgc3R5bGUuCi0gICAgaWYgKHN0
eWxlLT5oYXNQc2V1ZG9TdHlsZShGSVJTVF9MRVRURVIpKQotICAgICAgICBzdHlsZS0+c2V0VW5p
cXVlKCk7Ci0KLSAgICAvLyBGSVhNRTogd2hlbiBkcm9wcGluZyB0aGUgLXdlYmtpdCBwcmVmaXgg
b24gdHJhbnNmb3JtLXN0eWxlLCB3ZSBzaG91bGQgYWxzbyBoYXZlIG9wYWNpdHkgPCAxIGNhdXNl
IGZsYXR0ZW5pbmcuCi0gICAgaWYgKHN0eWxlLT5wcmVzZXJ2ZXMzRCgpICYmIChzdHlsZS0+b3Zl
cmZsb3dYKCkgIT0gT1ZJU0lCTEUKLSAgICAgICAgfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9W
SVNJQkxFCi0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIoKSkpCi0gICAgICAgIHN0eWxlLT5z
ZXRUcmFuc2Zvcm1TdHlsZTNEKFRyYW5zZm9ybVN0eWxlM0RGbGF0KTsKLQotICAgIC8vIFNlYW1s
ZXNzIGlmcmFtZXMgYmVoYXZlIGxpa2UgYmxvY2tzLiBNYXAgdGhlaXIgZGlzcGxheSB0byBpbmxp
bmUtYmxvY2sgd2hlbiBtYXJrZWQgaW5saW5lLgotICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUo
aWZyYW1lVGFnKSAmJiBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdGF0aWNfY2FzdDxI
VE1MSUZyYW1lRWxlbWVudCo+KGUpLT5zaG91bGREaXNwbGF5U2VhbWxlc3NseSgpKQotICAgICAg
ICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxPQ0spOwotCi0jaWYgRU5BQkxFKFNWRykKLSAg
ICBpZiAoZSAmJiBlLT5pc1NWR0VsZW1lbnQoKSkgewotICAgICAgICAvLyBTcGVjOiBodHRwOi8v
d3d3LnczLm9yZy9UUi9TVkcvbWFza2luZy5odG1sI092ZXJmbG93UHJvcGVydHkKLSAgICAgICAg
aWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPU0NST0xMKQotICAgICAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WShPSElEREVOKTsKLSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgp
ID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Ci0K
LSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPU0NST0xMKQotICAgICAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WChPSElEREVOKTsKLSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92
ZXJmbG93WCgpID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklT
SUJMRSk7Ci0KLSAgICAgICAgLy8gT25seSB0aGUgcm9vdCA8c3ZnPiBlbGVtZW50IGluIGFuIFNW
RyBkb2N1bWVudCBmcmFnbWVudCB0cmVlIGhvbm9ycyBjc3MgcG9zaXRpb24KLSAgICAgICAgaWYg
KCEoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3ZnVGFnKSAmJiBlLT5wYXJlbnROb2RlKCkgJiYg
IWUtPnBhcmVudE5vZGUoKS0+aXNTVkdFbGVtZW50KCkpKQotICAgICAgICAgICAgc3R5bGUtPnNl
dFBvc2l0aW9uKFJlbmRlclN0eWxlOjppbml0aWFsUG9zaXRpb24oKSk7Ci0KLSAgICAgICAgLy8g
UmVuZGVyU1ZHUm9vdCBoYW5kbGVzIHpvb21pbmcgZm9yIHRoZSB3aG9sZSBTVkcgc3VidHJlZSwg
c28gZm9yZWlnbk9iamVjdCBjb250ZW50IHNob3VsZAotICAgICAgICAvLyBub3QgYmUgc2NhbGVk
IGFnYWluLgotICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6Zm9yZWlnbk9iamVj
dFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShSZW5kZXJTdHlsZTo6
aW5pdGlhbFpvb20oKSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6
Y2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50KQotewotICAgIC8vIEZJWE1F
IChCVUcgNzI0NzIpOiBXZSBkb24ndCBhZGQgQC13ZWJraXQtcmVnaW9uIHJ1bGVzIG9mIHNjb3Bl
ZCBzdHlsZSBzaGVldHMgZm9yIHRoZSBtb21lbnQsCi0gICAgLy8gc28gYWxsIHJlZ2lvbiBydWxl
cyBhcmUgZ2xvYmFsIGJ5IGRlZmF1bHQuIFZlcmlmeSB3aGV0aGVyIHRoYXQgY2FuIHN0YW5kIG9y
IG5lZWRzIGNoYW5naW5nLgotCi0gICAgdW5zaWduZWQgcnVsZXNTaXplID0gbV9ydWxlU2V0cy5h
dXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgQVNTRVJU
KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5h
dChpKS5ydWxlU2V0LmdldCgpKTsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9y
dWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkp
LnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
IH0KLQotICAgIGlmIChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKSB7Ci0gICAgICAgIHJ1bGVzU2l6
ZSA9IG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMu
c2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kp
IHsKLSAgICAgICAgICAgIEFTU0VSVChtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNl
bGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQuZ2V0KCkpOwotICAgICAgICAgICAgaWYg
KGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxl
Y3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvciwgcmVnaW9uRWxlbWVudCkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2UoUmVuZGVyU3R5
bGUqIHN0eWxlKQotewotICAgIEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247Ci0gICAg
Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRH
bHlwaE9yaWVudGF0aW9uKHN0eWxlLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24p
OwotCi0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24gPSBzdHlsZS0+
Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGZvbnREZXNjcmlwdGlvbi5vcmllbnRhdGlvbigp
ID09IGZvbnRPcmllbnRhdGlvbiAmJiBmb250RGVzY3JpcHRpb24ubm9uQ0pLR2x5cGhPcmllbnRh
dGlvbigpID09IGdseXBoT3JpZW50YXRpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIEZvbnRE
ZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICBuZXdG
b250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9u
KTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9u
KTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6dXBkYXRlRm9udCgpCi17Ci0gICAgaWYgKCFtX3N0YXRl
LmZvbnREaXJ0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUg
PSBtX3N0YXRlLnN0eWxlKCk7Ci0gICAgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKHN0eWxl
LCBtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotICAgIGNoZWNrRm9yWm9vbUNoYW5nZShzdHlsZSwg
bV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKLSAgICBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKHN0
eWxlKTsKLSAgICBzdHlsZS0+Zm9udCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgbV9z
dGF0ZS5zZXRGb250RGlydHkoZmFsc2UpOwotfQotCi1QYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBT
dHlsZVJlc29sdmVyOjpzdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCB1bnNpZ25lZCBy
dWxlc1RvSW5jbHVkZSkKLXsKLSAgICByZXR1cm4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQo
ZSwgTk9QU0VVRE8sIHJ1bGVzVG9JbmNsdWRlKTsKLX0KLQotUGFzc1JlZlB0cjxDU1NSdWxlTGlz
dD4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwg
UHNldWRvSWQgcHNldWRvSWQsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlKQotewotICAgIGlmICgh
ZSB8fCAhZS0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hlZXRzTG9hZGVkKCkpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGlu
Z1J1bGVzKTsKLQotICAgIGluaXRFbGVtZW50KGUpOwotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxl
UmVzb2x2ZShkb2N1bWVudCgpLCBlLCAwLCBwc2V1ZG9JZCk7Ci0KLSAgICBNYXRjaFJlc3VsdCBk
dW1teTsKLSAgICBpZiAocnVsZXNUb0luY2x1ZGUgJiBVQUFuZFVzZXJDU1NSdWxlcykgewotICAg
ICAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0Lgot
ICAgICAgICBtYXRjaFVBUnVsZXMoZHVtbXkpOwotCi0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayB1
c2VyIHNoZWV0IHJ1bGVzLgotICAgICAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMp
Ci0gICAgICAgICAgICBtYXRjaFVzZXJSdWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0
eUNTU1J1bGVzKTsKLSAgICB9Ci0KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMg
JiYgKHJ1bGVzVG9JbmNsdWRlICYgQXV0aG9yQ1NTUnVsZXMpKSB7Ci0gICAgICAgIG1fc3RhdGUu
c2V0U2FtZU9yaWdpbk9ubHkoIShydWxlc1RvSW5jbHVkZSAmIENyb3NzT3JpZ2luQ1NTUnVsZXMp
KTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cy4KLSAgICAg
ICAgbWF0Y2hBdXRob3JSdWxlcyhkdW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVz
KTsKLQotICAgICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KGZhbHNlKTsKLSAgICB9Ci0K
LSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0K
LSAgICByZXR1cm4gbV9zdGF0ZS50YWtlUnVsZUxpc3QoKTsKLX0KLQotaW5saW5lIGJvb2wgU3R5
bGVSZXNvbHZlcjo6cnVsZU1hdGNoZXMoY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBD
b250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQmIGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hl
Y2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2aW9yQXRCb3VuZGFyeSkKLXsKLSAgICBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgaWYgKHJ1bGVEYXRhLmhhc0Zhc3RDaGVja2FibGVT
ZWxlY3RvcigpKSB7Ci0gICAgICAgIC8vIFdlIGtub3cgdGhpcyBzZWxlY3RvciBkb2VzIG5vdCBp
bmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVudHMuCi0gICAgICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHls
ZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBOT1BTRVVETykKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgLy8gV2Uga25vdyBhIHN1ZmZpY2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQg
c2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkgYmVjYXVzZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxl
IGhhc2guCi0gICAgICAgIC8vIFRoaXMgaXMgbGltaXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9u
J3QgbmVlZCB0byBjaGVjayB0aGUgbmFtZXNwYWNlLgotICAgICAgICBpZiAocnVsZURhdGEuaGFz
UmlnaHRtb3N0U2VsZWN0b3JNYXRjaGluZ0hUTUxCYXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5l
bGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5o
YXNNdWx0aXBhcnRTZWxlY3RvcigpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChydWxlRGF0YS5zZWxlY3RvcigpLT5tX21hdGNoID09IENTU1Nl
bGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9yQ2hlY2tlcjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50
KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCktPnRhZ1FOYW1lKCkpKQotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICBTZWxlY3RvckNoZWNrZXJGYXN0UGF0aCBzZWxlY3RvckNoZWNrZXJG
YXN0UGF0aChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCkpOwotICAgICAgICBp
ZiAoIXNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXNSaWdodG1vc3RBdHRyaWJ1dGVTZWxl
Y3RvcigpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiBzZWxl
Y3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzKCk7Ci0gICAgfQotCi0gICAgLy8gU2xvdyBwYXRo
LgotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgc3RhdGUu
bW9kZSgpKTsKLSAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNv
bnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNr
ZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOwotICAgIGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3Rh
dGUuc3R5bGUoKTsKLSAgICBjb250ZXh0LnNjb3BlID0gc2NvcGU7Ci0gICAgY29udGV4dC5wc2V1
ZG9JZCA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkOwotICAgIGNvbnRleHQu
c2Nyb2xsYmFyID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyOwotICAgIGNv
bnRleHQuc2Nyb2xsYmFyUGFydCA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJh
clBhcnQ7Ci0gICAgY29udGV4dC5iZWhhdmlvckF0Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRh
cnk7Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpNYXRjaCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5t
YXRjaChjb250ZXh0LCBkeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3ko
KSk7Ci0gICAgaWYgKG1hdGNoICE9IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgp
LnBzZXVkb0lkICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVk
b0lkICE9IGR5bmFtaWNQc2V1ZG8pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0
IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCkKLXsK
LSAgICBpZiAoIXJlZ2lvblNlbGVjdG9yIHx8ICFyZWdpb25FbGVtZW50KQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBTZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50
KCksIG1fc3RhdGUubW9kZSgpKTsKLSAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVn
aW9uU2VsZWN0b3I7IHM7IHMgPSBDU1NTZWxlY3Rvckxpc3Q6Om5leHQocykpIHsKLSAgICAgICAg
U2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBzZWxlY3RvckNoZWNraW5n
Q29udGV4dChzLCByZWdpb25FbGVtZW50LCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERp
c2FibGVkKTsKLSAgICAgICAgUHNldWRvSWQgaWdub3JlRHluYW1pY1BzZXVkbyA9IE5PUFNFVURP
OwotICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLm1hdGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250
ZXh0LCBpZ25vcmVEeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkg
PT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLS8vIHRoaXMgaXMgbW9zdGx5IGJvcmluZyBzdHVmZiBvbiBob3cgdG8g
YXBwbHkgYSBjZXJ0YWluIHJ1bGUgdG8gdGhlIHJlbmRlcnN0eWxlLi4uCi0KLUxlbmd0aCBTdHls
ZVJlc29sdmVyOjpjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2
ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJs
ZSBtdWx0aXBsaWVyKQotewotICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZh
bHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252
ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3
cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6
IExlbmd0aChVbmRlZmluZWQpOwotfQotCi1MZW5ndGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRv
RmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHls
ZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQotewot
ICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5n
dGg8Rml4ZWRGbG9hdENvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRD
b252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVy
c2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsK
LX0KLQotdGVtcGxhdGUgPFN0eWxlUmVzb2x2ZXI6OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5
U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1bGUsIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wg
aW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlw
ZSkKLXsKLSAgICBBU1NFUlQoKHByb3BlcnR5V2hpdGVsaXN0VHlwZSAhPSBQcm9wZXJ0eVdoaXRl
bGlzdFJlZ2lvbikgfHwgbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpOwotICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246
OndpbGxQcm9jZXNzUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKLQotICAgIHVuc2lnbmVk
IHByb3BlcnR5Q291bnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUNvdW50KCk7Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHByb3BlcnR5Q291bnQ7ICsraSkgewotICAgICAgICBTdHlsZVBy
b3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVyZW5jZSBjdXJyZW50ID0gcHJvcGVydGllcy0+cHJvcGVy
dHlBdChpKTsKLSAgICAgICAgaWYgKGlzSW1wb3J0YW50ICE9IGN1cnJlbnQuaXNJbXBvcnRhbnQo
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoaW5oZXJpdGVkT25seSAmJiAh
Y3VycmVudC5pc0luaGVyaXRlZCgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkg
dmFsdWUgaXMgZXhwbGljaXRseSBpbmhlcml0ZWQsIHdlIG5lZWQgdG8gYXBwbHkgZnVydGhlciBu
b24taW5oZXJpdGVkIHByb3BlcnRpZXMKLSAgICAgICAgICAgIC8vIGFzIHRoZXkgbWlnaHQgb3Zl
cnJpZGUgdGhlIHZhbHVlIGluaGVyaXRlZCBoZXJlLiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3Qg
YWxsb3cgZGVjbGFyYXRpb25zIHdpdGgKLSAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgaW5oZXJp
dGVkIHByb3BlcnRpZXMgdG8gYmUgY2FjaGVkLgotICAgICAgICAgICAgQVNTRVJUKCFjdXJyZW50
LnZhbHVlKCktPmlzSW5oZXJpdGVkVmFsdWUoKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgfQotICAgICAgICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0gY3VycmVudC5pZCgpOwot
Ci0gICAgICAgIGlmIChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RS
ZWdpb24gJiYgIVN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KHByb3Bl
cnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAg
ICAgICAgaWYgKHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdEN1ZSAm
JiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkocHJvcGVydHkpKQotICAg
ICAgICAgICAgY29udGludWU7Ci0jZW5kaWYKLSAgICAgICAgc3dpdGNoIChwYXNzKSB7Ci0jaWYg
RU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAgIGNhc2UgVmFyaWFibGVEZWZpbml0aW9uczoK
LSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENTU1Byb3BlcnR5VmFyaWFibGUgPCBmaXJzdENT
U1Byb3BlcnR5LCBDU1NfdmFyaWFibGVfaXNfYmVmb3JlX2ZpcnN0X3Byb3BlcnR5KTsKLSAgICAg
ICAgICAgIGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKQotICAgICAgICAgICAg
ICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgY2FzZSBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVz
OgotICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoZmlyc3RDU1NQcm9wZXJ0eSA9PSBDU1NQcm9w
ZXJ0eUNvbG9yLCBDU1NfY29sb3JfaXNfZmlyc3RfcHJvcGVydHkpOwotICAgICAgICAgICAgQ09N
UElMRV9BU1NFUlQoQ1NTUHJvcGVydHlab29tID09IENTU1Byb3BlcnR5Q29sb3IgKyAxNywgQ1NT
X3pvb21faXNfZW5kX29mX2ZpcnN0X3Byb3BfcmFuZ2UpOwotICAgICAgICAgICAgQ09NUElMRV9B
U1NFUlQoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0ID09IENTU1Byb3BlcnR5Wm9vbSArIDEsIENTU19s
aW5lX2hlaWdodF9pc19hZnRlcl96b29tKTsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAg
ICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eVZhcmlhYmxlKQotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotI2VuZGlmCi0gICAgICAgICAgICAvLyBnaXZlIHNwZWNpYWwgcHJp
b3JpdHkgdG8gZm9udC14eHgsIGNvbG9yIHByb3BlcnRpZXMsIGV0YwotICAgICAgICAgICAgaWYg
KHByb3BlcnR5IDwgQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQotICAgICAgICAgICAgICAgIGFwcGx5
UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOwotICAgICAgICAgICAgLy8g
d2UgYXBwbHkgbGluZS1oZWlnaHQgbGF0ZXIKLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5
ID09IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBtX3N0YXRlLnNldExp
bmVIZWlnaHRWYWx1ZShjdXJyZW50LnZhbHVlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgTG93UHJpb3JpdHlQcm9wZXJ0aWVzOgotICAgICAgICAgICAgaWYgKHByb3BlcnR5
ID4gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQotICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHko
Y3VycmVudC5pZCgpLCBjdXJyZW50LnZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIElu
c3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkUHJvY2Vzc1J1bGUoY29va2llKTsKLX0KLQotdGVt
cGxhdGUgPFN0eWxlUmVzb2x2ZXI6OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci12b2lkIFN0
eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1h
dGNoUmVzdWx0LCBib29sIGlzSW1wb3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4
LCBib29sIGluaGVyaXRlZE9ubHkpCi17Ci0gICAgaWYgKHN0YXJ0SW5kZXggPT0gLTEpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgaWYgKHN0YXRl
LnN0eWxlKCktPmluc2lkZUxpbmsoKSAhPSBOb3RJbnNpZGVMaW5rKSB7Ci0gICAgICAgIGZvciAo
aW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKLSAgICAgICAgICAgIGNv
bnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzW2ldOwotICAgICAgICAgICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9
IG1hdGNoZWRQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5cGU7Ci0gICAgICAgICAgICAvLyBGSVhNRTog
SXQgd291bGQgYmUgbmljZXIgdG8gcGFzcyB0aGVzZSBhcyBhcmd1bWVudHMgYnV0IHRoYXQgcmVx
dWlyZXMgY2hhbmdlcyBpbiBtYW55IHBsYWNlcy4KLSAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5
UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShsaW5rTWF0Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpN
YXRjaExpbmspOwotICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExp
bmtTdHlsZShsaW5rTWF0Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpNYXRjaFZpc2l0ZWQpOwot
Ci0gICAgICAgICAgICBhcHBseVByb3BlcnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJv
cGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwg
aW5oZXJpdGVkT25seSwgc3RhdGljX2Nhc3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVk
UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUuc2V0
QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpOwotICAgICAgICBzdGF0ZS5zZXRBcHBs
eVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0g
ICAgICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNo
UmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldOwotICAgICAgICBhcHBseVByb3BlcnRpZXM8cGFz
cz4obWF0Y2hlZFByb3BlcnRpZXMucHJvcGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hl
ZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwgaW5oZXJpdGVkT25seSwgc3RhdGljX2Nhc3Q8UHJvcGVy
dHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVkUHJvcGVydGllcy53aGl0ZWxpc3RUeXBlKSk7Ci0gICAg
fQotfQotCi11bnNpZ25lZCBTdHlsZVJlc29sdmVyOjpjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNI
YXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzKiBwcm9wZXJ0aWVzLCB1bnNpZ25lZCBzaXplKQot
ewotICAgIAotICAgIHJldHVybiBTdHJpbmdIYXNoZXI6Omhhc2hNZW1vcnkocHJvcGVydGllcywg
c2l6ZW9mKE1hdGNoZWRQcm9wZXJ0aWVzKSAqIHNpemUpOwotfQotCi1ib29sIG9wZXJhdG9yPT0o
Y29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6
Ok1hdGNoUmFuZ2VzJiBiKQotewotICAgIHJldHVybiBhLmZpcnN0VUFSdWxlID09IGIuZmlyc3RV
QVJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VUFSdWxlID09IGIubGFzdFVBUnVsZQotICAgICAgICAm
JiBhLmZpcnN0QXV0aG9yUnVsZSA9PSBiLmZpcnN0QXV0aG9yUnVsZQotICAgICAgICAmJiBhLmxh
c3RBdXRob3JSdWxlID09IGIubGFzdEF1dGhvclJ1bGUKLSAgICAgICAgJiYgYS5maXJzdFVzZXJS
dWxlID09IGIuZmlyc3RVc2VyUnVsZQotICAgICAgICAmJiBhLmxhc3RVc2VyUnVsZSA9PSBiLmxh
c3RVc2VyUnVsZTsKLX0KLQotYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYikKLXsKLSAg
ICByZXR1cm4gIShhID09IGIpOwotfQotCi1ib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNv
bHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQ
cm9wZXJ0aWVzJiBiKQotewotICAgIHJldHVybiBhLnByb3BlcnRpZXMgPT0gYi5wcm9wZXJ0aWVz
ICYmIGEubGlua01hdGNoVHlwZSA9PSBiLmxpbmtNYXRjaFR5cGU7Ci19Ci0KLWJvb2wgb3BlcmF0
b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5
bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGIpCi17Ci0gICAgcmV0dXJuICEoYSA9PSBi
KTsKLX0KLQotY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0q
IFN0eWxlUmVzb2x2ZXI6OmZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBo
YXNoLCBjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCi17Ci0gICAgQVNTRVJUKGhhc2gp
OwotCi0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGUuZmluZChoYXNoKTsKLSAgICBpZiAoaXQgPT0gbV9tYXRjaGVkUHJvcGVy
dGllc0NhY2hlLmVuZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBNYXRjaGVkUHJvcGVydGll
c0NhY2hlSXRlbSYgY2FjaGVJdGVtID0gaXQtPnZhbHVlOwotCi0gICAgc2l6ZV90IHNpemUgPSBt
YXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHNpemUgIT0gY2Fj
aGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKG1hdGNoUmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldICE9IGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllc1tp
XSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoY2FjaGVJdGVtLnJhbmdl
cyAhPSBtYXRjaFJlc3VsdC5yYW5nZXMpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAm
Y2FjaGVJdGVtOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZFRvTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZShjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJl
bnRTdHlsZSwgdW5zaWduZWQgaGFzaCwgY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQot
ewotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0
aW9uc0JldHdlZW5Td2VlcHMgPSAxMDA7Ci0gICAgaWYgKCsrbV9tYXRjaGVkUHJvcGVydGllc0Nh
Y2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPj0gbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRp
dGlvbnNCZXR3ZWVuU3dlZXBzCi0gICAgICAgICYmICFtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVT
d2VlcFRpbWVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1h
dGNoZWREZWNsYXJhdGlvbkNhY2hlU3dlZXBUaW1lSW5TZWNvbmRzID0gNjA7Ci0gICAgICAgIG1f
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIuc3RhcnRPbmVTaG90KG1hdGNoZWREZWNs
YXJhdGlvbkNhY2hlU3dlZXBUaW1lSW5TZWNvbmRzKTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaGFz
aCk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0gY2FjaGVJdGVtOwotICAgIGNhY2hl
SXRlbS5tYXRjaGVkUHJvcGVydGllcy5hcHBlbmQobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMpOwotICAgIGNhY2hlSXRlbS5yYW5nZXMgPSBtYXRjaFJlc3VsdC5yYW5nZXM7Ci0gICAgLy8g
Tm90ZSB0aGF0IHdlIGRvbid0IGNhY2hlIHRoZSBvcmlnaW5hbCBSZW5kZXJTdHlsZSBpbnN0YW5j
ZS4gSXQgbWF5IGJlIGZ1cnRoZXIgbW9kaWZpZWQuCi0gICAgLy8gVGhlIFJlbmRlclN0eWxlIGlu
IHRoZSBjYWNoZSBpcyByZWFsbHkganVzdCBhIGhvbGRlciBmb3IgdGhlIHN1YnN0cnVjdHVyZXMg
YW5kIG5ldmVyIHVzZWQgYXMtaXMuCi0gICAgY2FjaGVJdGVtLnJlbmRlclN0eWxlID0gUmVuZGVy
U3R5bGU6OmNsb25lKHN0eWxlKTsKLSAgICBjYWNoZUl0ZW0ucGFyZW50UmVuZGVyU3R5bGUgPSBS
ZW5kZXJTdHlsZTo6Y2xvbmUocGFyZW50U3R5bGUpOwotICAgIG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZS5hZGQoaGFzaCwgY2FjaGVJdGVtKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjppbnZh
bGlkYXRlTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSgpCi17Ci0gICAgbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlLmNsZWFyKCk7Ci19Ci0KLXN0YXRpYyBib29sIGlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJv
cGVydGllc0NhY2hlKGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IFJlbmRlclN0eWxlKiBz
dHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIC8vIEZJWE1FOiBD
U1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdNb2RlIG1vZGlmaWVzIHN0YXRlIHdoZW4gYXBwbHlpbmcg
dG8gZG9jdW1lbnQgZWxlbWVudC4gV2UgY2FuJ3Qgc2tpcCB0aGUgYXBwbHlpbmcgYnkgY2FjaGlu
Zy4KLSAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1l
bnQoKSAmJiBlbGVtZW50LT5kb2N1bWVudCgpLT53cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVt
ZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpIHx8
IChzdHlsZS0+c3R5bGVUeXBlKCkgIT0gTk9QU0VVRE8gJiYgcGFyZW50U3R5bGUtPnVuaXF1ZSgp
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT56b29tKCkgIT0gUmVuZGVy
U3R5bGU6OmluaXRpYWxab29tKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5
bGUtPndyaXRpbmdNb2RlKCkgIT0gUmVuZGVyU3R5bGU6OmluaXRpYWxXcml0aW5nTW9kZSgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gVGhlIGNhY2hlIGFzc3VtZXMgc3RhdGljIGtu
b3dsZWRnZSBhYm91dCB3aGljaCBwcm9wZXJ0aWVzIGFyZSBpbmhlcml0ZWQuCi0gICAgaWYgKHBh
cmVudFN0eWxlLT5oYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNv
bnN0IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgQVNTRVJUKGVsZW1lbnQpOwotICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgdW5zaWduZWQgY2FjaGVIYXNoID0gbWF0Y2hSZXN1bHQu
aXNDYWNoZWFibGUgPyBjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNIYXNoKG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLmRhdGEoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpKSA6IDA7Ci0gICAgYm9vbCBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKLSAgICBjb25z
dCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogY2FjaGVJdGVtID0gMDsKLSAgICBpZiAoY2Fj
aGVIYXNoICYmIChjYWNoZUl0ZW0gPSBmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY2Fj
aGVIYXNoLCBtYXRjaFJlc3VsdCkpKSB7Ci0gICAgICAgIC8vIFdlIGNhbiBidWlsZCB1cCB0aGUg
c3R5bGUgYnkgY29weWluZyBub24taW5oZXJpdGVkIHByb3BlcnRpZXMgZnJvbSBhbiBlYXJsaWVy
IHN0eWxlIG9iamVjdCBidWlsdCB1c2luZyB0aGUgc2FtZSBleGFjdAotICAgICAgICAvLyBzdHls
ZSBkZWNsYXJhdGlvbnMuIFdlIHRoZW4gb25seSBuZWVkIHRvIGFwcGx5IHRoZSBpbmhlcml0ZWQg
cHJvcGVydGllcywgaWYgYW55LCBhcyB0aGVpciB2YWx1ZXMgY2FuIGRlcGVuZCBvbiB0aGUgCi0g
ICAgICAgIC8vIGVsZW1lbnQgY29udGV4dC4gVGhpcyBpcyBmYXN0IGFuZCBzYXZlcyBtZW1vcnkg
YnkgcmV1c2luZyB0aGUgc3R5bGUgZGF0YSBzdHJ1Y3R1cmVzLgotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5jb3B5Tm9uSW5oZXJpdGVkRnJvbShjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsK
LSAgICAgICAgaWYgKHN0YXRlLnBhcmVudFN0eWxlKCktPmluaGVyaXRlZERhdGFTaGFyZWQoY2Fj
aGVJdGVtLT5wYXJlbnRSZW5kZXJTdHlsZS5nZXQoKSkgJiYgIWlzQXRTaGFkb3dCb3VuZGFyeShl
bGVtZW50KSkgewotICAgICAgICAgICAgRUluc2lkZUxpbmsgbGlua1N0YXR1cyA9IHN0YXRlLnN0
eWxlKCktPmluc2lkZUxpbmsoKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBjYWNoZSBpdGVtIHBh
cmVudCBzdHlsZSBoYXMgaWRlbnRpY2FsIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJy
ZW50IHBhcmVudCBzdHlsZSB0aGVuIHRoZQotICAgICAgICAgICAgLy8gcmVzdWx0aW5nIHN0eWxl
IHdpbGwgYmUgaWRlbnRpY2FsIHRvby4gV2UgY29weSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMg
b3ZlciBmcm9tIHRoZSBjYWNoZSBhbmQgYXJlIGRvbmUuCi0gICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5pbmhlcml0RnJvbShjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKLQotICAgICAg
ICAgICAgLy8gVW5mb3J0dW5hdGVseSB0aGUgbGluayBzdGF0dXMgaXMgdHJlYXRlZCBsaWtlIGFu
IGluaGVyaXRlZCBwcm9wZXJ0eS4gV2UgbmVlZCB0byBleHBsaWNpdGx5IHJlc3RvcmUgaXQuCi0g
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJbnNpZGVMaW5rKGxpbmtTdGF0dXMpOwotICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9
IHRydWU7IAotICAgIH0KLQotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIC8vIEZpcnN0
IGFwcGx5IGFsbCB2YXJpYWJsZSBkZWZpbml0aW9ucywgYXMgdGhleSBtYXkgYmUgdXNlZCBkdXJp
bmcgYXBwbGljYXRpb24gb2YgbGF0ZXIgcHJvcGVydGllcy4KLSAgICBhcHBseU1hdGNoZWRQcm9w
ZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsK
LSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVz
dWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
czxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhl
cml0ZWRPbmx5KTsKLSNlbmRpZgotCi0gICAgLy8gTm93IHdlIGhhdmUgYWxsIG9mIHRoZSBtYXRj
aGVkIHJ1bGVzIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlci4gV2FsayB0aGUgcnVsZXMgYW5kIGFw
cGx5Ci0gICAgLy8gaGlnaC1wcmlvcml0eSBwcm9wZXJ0aWVzIGZpcnN0LCBpLmUuLCB0aG9zZSBw
cm9wZXJ0aWVzIHRoYXQgb3RoZXIgcHJvcGVydGllcyBkZXBlbmQgb24uCi0gICAgLy8gVGhlIG9y
ZGVyIGlzICgxKSBoaWdoLXByaW9yaXR5IG5vdCBpbXBvcnRhbnQsICgyKSBoaWdoLXByaW9yaXR5
IGltcG9ydGFudCwgKDMpIG5vcm1hbCBub3QgaW1wb3J0YW50Ci0gICAgLy8gYW5kICg0KSBub3Jt
YWwgaW1wb3J0YW50LgotICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBm
YWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJ
bmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVBy
b3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRo
b3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVk
T25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAg
YXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3Vs
dCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5n
ZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLQotICAgIGlmIChjYWNoZUl0ZW0g
JiYgY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS0+ZWZmZWN0aXZlWm9vbSgpICE9IHN0YXRlLnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKSkgewotICAgICAgICBzdGF0ZS5zZXRGb250RGlydHkodHJ1ZSk7
Ci0gICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIElm
IG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1
cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3Vy
ZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUuCi0gICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRW
YWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3Rh
dGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgLy8gTWFueSBwcm9wZXJ0aWVzIGRlcGVuZCBv
biB0aGUgZm9udC4gSWYgaXQgY2hhbmdlcyB3ZSBqdXN0IGFwcGx5IGFsbCBwcm9wZXJ0aWVzLgot
ICAgIGlmIChjYWNoZUl0ZW0gJiYgY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS0+Zm9udERlc2NyaXB0
aW9uKCkgIT0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkpCi0gICAgICAgIGFwcGx5
SW5oZXJpdGVkT25seSA9IGZhbHNlOwotCi0gICAgLy8gTm93IGRvIHRoZSBub3JtYWwgcHJpb3Jp
dHkgVUEgcHJvcGVydGllcy4KLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5
UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RV
QVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkp
OwotICAgIAotICAgIC8vIENhY2hlIG91ciBib3JkZXIgYW5kIGJhY2tncm91bmQgc28gdGhhdCB3
ZSBjYW4gZXhhbWluZSB0aGVtIGxhdGVyLgotICAgIHN0YXRlLmNhY2hlQm9yZGVyQW5kQmFja2dy
b3VuZCgpOwotICAgIAotICAgIC8vIE5vdyBkbyB0aGUgYXV0aG9yIGFuZCB1c2VyIG5vcm1hbCBw
cmlvcml0eSBwcm9wZXJ0aWVzIGFuZCBhbGwgdGhlICFpbXBvcnRhbnQgcHJvcGVydGllcy4KLSAg
ICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1
bHQsIGZhbHNlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSArIDEsIG1hdGNoUmVzdWx0
Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAg
YXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0
LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5y
YW5nZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRj
aGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
c2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
PExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5o
ZXJpdGVkT25seSk7Ci0gICAKLSAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVu
Y2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLSAgICAKLSAg
ICBBU1NFUlQoIXN0YXRlLmZvbnREaXJ0eSgpKTsKLSAgICAKLSAgICBpZiAoY2FjaGVJdGVtIHx8
ICFjYWNoZUhhc2gpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIWlzQ2FjaGVhYmxlSW5NYXRj
aGVkUHJvcGVydGllc0NhY2hlKHN0YXRlLmVsZW1lbnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cGFyZW50U3R5bGUoKSkpCi0gICAgICAgIHJldHVybjsKLSAgICBhZGRUb01hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgY2FjaGVIYXNoLCBt
YXRjaFJlc3VsdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNv
bnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBjb25zdCBTdHlsZVJ1bGVQYWdlKiByMikKLXsKLSAgICBy
ZXR1cm4gcjEtPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5KCkgPCByMi0+c2VsZWN0b3IoKS0+c3Bl
Y2lmaWNpdHkoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlcyhNYXRj
aFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlz
Rmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQotewotICAgIGlmICghcnVsZXMpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VS
dWxlczsKLSAgICBtYXRjaFBhZ2VSdWxlc0Zvckxpc3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMt
PnBhZ2VSdWxlcygpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpOwotICAgIGlm
IChtYXRjaGVkUGFnZVJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc3Rk
OjpzdGFibGVfc29ydChtYXRjaGVkUGFnZVJ1bGVzLmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMu
ZW5kKCksIGNvbXBhcmVQYWdlUnVsZXMpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1hdGNoZWRQYWdlUnVsZXMuc2l6ZSgpOyBpKyspCi0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0
aWVzKHJlc3VsdCwgbWF0Y2hlZFBhZ2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsKLX0KLQotc3Rh
dGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBz
ZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcm
IHBhZ2VOYW1lKQotewotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNl
bGVjdG9yOyBjb21wb25lbnQ7IGNvbXBvbmVudCA9IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7
Ci0gICAgICAgIGlmIChjb21wb25lbnQtPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgewot
ICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRh
Z1FOYW1lKCkubG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJB
dG9tICYmIGxvY2FsTmFtZSAhPSBwYWdlTmFtZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIH0KLQotICAgICAgICBDU1NTZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9U
eXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7Ci0gICAgICAgIGlmICgocHNldWRvVHlwZSA9
PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2UgJiYgIWlzTGVmdFBhZ2UpCi0gICAgICAgICAg
ICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVm
dFBhZ2UpCi0gICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRv
Rmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBT
dHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2Uq
PiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9v
bCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQot
ewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgewotICAg
ICAgICBTdHlsZVJ1bGVQYWdlKiBydWxlID0gcnVsZXNbaV07Ci0KLSAgICAgICAgaWYgKCFjaGVj
a1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNG
aXJzdFBhZ2UsIHBhZ2VOYW1lKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8v
IElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4K
LSAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3Bl
cnRpZXMoKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHko
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8g
b3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAgICAgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChy
dWxlKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6aXNMZWZ0UGFnZShpbnQgcGFn
ZUluZGV4KSBjb25zdAotewotICAgIGJvb2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7Ci0gICAg
aWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KQotICAgICAgICBpc0ZpcnN0UGFnZUxlZnQgPSB0cnVlOwotCi0gICAgcmV0dXJuIChwYWdlSW5k
ZXggKyAoaXNGaXJzdFBhZ2VMZWZ0ID8gMSA6IDApKSAlIDI7Ci19Ci0KLWJvb2wgU3R5bGVSZXNv
bHZlcjo6aXNGaXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTog
SW4gY2FzZSBvZiBmb3JjZWQgbGVmdC9yaWdodCBwYWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAw
KSBjYW4gYmUgdGhlIGZpcnN0IHBhZ2UuCi0gICAgcmV0dXJuICghcGFnZUluZGV4KTsKLX0KLQot
U3RyaW5nIFN0eWxlUmVzb2x2ZXI6OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0
Ci17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudCBwYWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBw
aW5nLgotICAgIHJldHVybiAiIjsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3Bl
cnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFJlbmRlclN0eWxl
KiBzdHlsZSkKLXsKLSAgICBpbml0RWxlbWVudCgwKTsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHls
ZVJlc29sdmUoZG9jdW1lbnQoKSwgMCwgc3R5bGUpOwotICAgIG1fc3RhdGUuc2V0U3R5bGUoc3R5
bGUpOwotICAgIGFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShpZCwgdmFsdWUpOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0
eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlKQotICAgICAgICBhcHBs
eVByb3BlcnR5KGlkLCB2YWx1ZSk7Ci19Ci0KLWlubGluZSBib29sIGlzVmFsaWRWaXNpdGVkTGlu
a1Byb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckxlZnRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
ckJvdHRvbUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxl
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBjYXNlIENTU1By
b3BlcnR5RmlsbDoKLSAgICBjYXNlIENTU1Byb3BlcnR5U3Ryb2tlOgotI2VuZGlmCi0gICAgICAg
IHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdp
b25zLyN0aGUtYXQtcmVnaW9uLXN0eWxlLXJ1bGUKLS8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwg
c3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9uIHN0eWxpbmcgcHJvcGVydGllcy4KLWlubGluZSBib29s
IFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQg
aWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5k
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
Ojppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRj
aCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKLSAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRT
aXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9u
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWlseToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1By
b3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxp
bmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZU9mZnNldDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdo
aXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBp
biBhIGRpZmZlcmVudCB3YXkgY29tcGFyZWQgdG8gQ1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMg
c2NhbGVkIGluc3RlYWQKLS8vIG9mIGVhY2ggaW5kaXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhl
IHJlbmRlciBzdHlsZSAvIHRyZWUuIENTU1ByaW1pdGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigp
Ci0vLyBtdWx0aXBsaWVzIGVhY2ggcmVzb2x2ZWQgbGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlw
bGllciAtIHNvIGZvciBTVkcgd2UgbmVlZCB0byBkaXNhYmxlIHRoYXQuCi0vLyBUaG91Z2ggYWxs
IENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVu
dHMgKHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy4uLikKLS8vIG5lZWQgdG8gcmVzcGVjdCB0
aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0aGUgcGFyZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3Qp
IGdyYWJzIHZhbHVlcyBsaWtlCi0vLyB3aWR0aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZy
b20gdGhlIFJlbmRlclN0eWxlIC0+IGZvciBTVkcgdGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNj
YWxlLAotLy8gaWYgd2UnZCBwYXNzIGEgMS4wIHpvb20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdl
IG9ubHkgcGFzcyBhIHpvb20gZmFjdG9yIG9mIDEuMCBmb3Igc3BlY2lmaWMKLS8vIHByb3BlcnRp
ZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQgdG8gc2NhbGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1
bWVudCAobGV0dGVyL3dvcmQtc3BhY2luZy9mb250LXNpemUpLgotYm9vbCBTdHlsZVJlc29sdmVy
Ojp1c2VTVkdab29tUnVsZXMoKQotewotICAgIHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBt
X3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCk7Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0
ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25z
dCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIExlbmd0aCYgd29ya2luZ0xlbmd0aCkKLXsK
LSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5D
b250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdMZW5ndGggPSBMZW5ndGgoTWluQ29udGVudCk7Ci0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0
SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1heENvbnRlbnQpIHsKLSAgICAgICAgd29ya2luZ0xl
bmd0aCA9IExlbmd0aChNYXhDb250ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgd29ya2luZ0xlbmd0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4
ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50
YWdlQ29udmVyc2lvbiB8IEF1dG9Db252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7Ci0gICAgaWYg
KHdvcmtpbmdMZW5ndGguaXNVbmRlZmluZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICB3b3JraW5nTGVuZ3Ro
LnNldFF1aXJrKHByaW1pdGl2ZVZhbHVlLT5pc1F1aXJrVmFsdWUoKSk7Ci0KLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2
ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRl
LCBHcmlkVHJhY2tTaXplJiB0cmFja1NpemUpCi17Ci0gICAgUGFpciogbWluTWF4VHJhY2tCcmVh
ZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdldFBhaXJWYWx1ZSgpOwotICAgIGlmICghbWluTWF4VHJh
Y2tCcmVhZHRoKSB7Ci0gICAgICAgIExlbmd0aCB3b3JraW5nTGVuZ3RoOwotICAgICAgICBpZiAo
IWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVu
Z3RoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cmFja1NpemUuc2V0
TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAg
ICBMZW5ndGggbWluVHJhY2tCcmVhZHRoOwotICAgIExlbmd0aCBtYXhUcmFja0JyZWFkdGg7Ci0g
ICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3Qo
KSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0aCkgfHwgIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWlu
TWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQoKSwgc3RhdGUsIG1heFRyYWNrQnJlYWR0aCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRyYWNrU2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVh
ZHRoLCBtYXhUcmFja0JyZWFkdGgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9v
bCBjcmVhdGVHcmlkVHJhY2tHcm91cChDU1NWYWx1ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzKQotewot
ICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5h
ZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAg
ICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgICAgICBHcmlkVHJhY2tTaXplIHRyYWNrU2l6ZTsKLSAgICAgICAg
aWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5NYXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
PihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJhY2tTaXplKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICB0cmFja1NpemVzLmFwcGVuZCh0cmFja1NpemUpOwotICAgIH0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1
ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVS
ZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQotewotICAgIC8vIEhhbmRsZSAnbm9uZScuCi0gICAgaWYg
KHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7
Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5v
bmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0
ZSwgdHJhY2tTaXplcyk7Ci19Ci0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENT
U1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0aW9uJiBwb3NpdGlvbikKLXsKLSAgICAvLyBGb3Igbm93
LCB3ZSBvbmx5IGFjY2VwdDogPGludGVnZXI+IHwgJ2F1dG8nCi0gICAgaWYgKCF2YWx1ZS0+aXNQ
cmltaXRpdmVWYWx1ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHZhbHVlKTsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVB
dXRvKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKTsKLSAgICBwb3NpdGlvbi5zZXRJ
bnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAgIHJldHVy
biB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi1zdGF0aWMgYm9vbCBoYXNW
YXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1By
aW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJl
dHVybiBwcmltaXRpdmVWYWx1ZS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKLSAgICB9Ci0KLSAg
ICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRpb25WYWx1ZSgpKQotICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFsdWUpLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOwotCi0g
ICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKSB7Ci0gICAgICAgIENTU1JlZmxlY3RWYWx1
ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOwot
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZGlyZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJl
Y3Rpb24oKTsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1
ZS0+b2Zmc2V0KCk7Ci0gICAgICAgIENTU1ZhbHVlKiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNr
KCk7Ci0gICAgICAgIHJldHVybiAoZGlyZWN0aW9uICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRp
cmVjdGlvbikpIHx8IChvZmZzZXQgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwg
KG1hc2sgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UobWFzaykpOwotICAgIH0KLQotICAgIGZvciAo
Q1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKLSAgICAgICAgaWYgKGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGkudmFsdWUoKSkpCi0gICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQg
U3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1
ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93
bkV4cHJlc3Npb25zKQotewotICAgIHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4
cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJpYWxpemVSZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUu
c3R5bGUoKS0+dmFyaWFibGVzKCkpKTsKLQotICAgIGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRh
aW5zKGV4cHJlc3Npb24pKQotICAgICAgICByZXR1cm47IC8vIGN5Y2xlIGRldGVjdGVkLgotCi0g
ICAga25vd25FeHByZXNzaW9ucy5hcHBlbmQoZXhwcmVzc2lvbik7Ci0KLSAgICAvLyBGSVhNRTog
SXQgd291bGQgYmUgZmFzdGVyIG5vdCB0byByZS1wYXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Ig
bm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0aW9uIGxpdmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdl
IGRvIGl0IHRoZXJlLgotICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBT
dHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKTsKLSAgICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1
ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBleHByZXNzaW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50
KCkpKQotICAgICAgICByZXR1cm47IC8vIGV4cHJlc3Npb24gZmFpbGVkIHRvIHBhcnNlLgotCi0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBp
KyspIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNldDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVy
dHkgPSByZXN1bHRTZXQtPnByb3BlcnR5QXQoaSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5pZCgp
ICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHku
dmFsdWUoKSkpCi0gICAgICAgICAgICByZXNvbHZlVmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHBy
b3BlcnR5LnZhbHVlKCksIGtub3duRXhwcmVzc2lvbnMpOwotICAgICAgICBlbHNlCi0gICAgICAg
ICAgICBhcHBseVByb3BlcnR5KHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCkpOwotICAg
IH0KLX0KLSNlbmRpZgotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJv
cGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQotewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVT
KQotICAgIGlmIChpZCAhPSBDU1NQcm9wZXJ0eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJl
bmNlKHZhbHVlKSkgewotICAgICAgICBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0
cmluZz4gPiBrbm93bkV4cHJlc3Npb25zOwotICAgICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2
YWx1ZSwga25vd25FeHByZXNzaW9ucyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYK
LQotICAgIC8vIENTUyB2YXJpYWJsZXMgZG9uJ3QgcmVzb2x2ZSBzaG9ydGhhbmRzIGF0IHBhcnNp
bmcgdGltZSwgc28gdGhpcyBzaG91bGQgYmUgKmFmdGVyKiBoYW5kbGluZyB2YXJpYWJsZXMuCi0g
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghaXNFeHBhbmRlZFNob3J0aGFuZChpZCksICJTaG9ydGhh
bmQgcHJvcGVydHkgaWQgPSAlZCB3YXNuJ3QgZXhwYW5kZWQgYXQgcGFyc2luZyB0aW1lIiwgaWQp
OwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBib29sIGlzSW5oZXJpdCA9IHN0
YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpOwotICAgIGJvb2wg
aXNJbml0aWFsID0gdmFsdWUtPmlzSW5pdGlhbFZhbHVlKCkgfHwgKCFzdGF0ZS5wYXJlbnROb2Rl
KCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUoKSk7Ci0KLSAgICBBU1NFUlQoIWlzSW5oZXJp
dCB8fCAhaXNJbml0aWFsKTsgLy8gaXNJbmhlcml0IC0+ICFpc0luaXRpYWwgJiYgaXNJbml0aWFs
IC0+ICFpc0luaGVyaXQKLSAgICBBU1NFUlQoIWlzSW5oZXJpdCB8fCAoc3RhdGUucGFyZW50Tm9k
ZSgpICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpKTsgLy8gaXNJbmhlcml0IC0+IChzdGF0ZS5wYXJl
bnROb2RlKCkgJiYgc3RhdGUucGFyZW50U3R5bGUoKSkKLQotICAgIGlmICghc3RhdGUuYXBwbHlQ
cm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgJiYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9WaXNpdGVk
TGlua1N0eWxlKCkgfHwgIWlzVmFsaWRWaXNpdGVkTGlua1Byb3BlcnR5KGlkKSkpIHsKLSAgICAg
ICAgLy8gTGltaXQgdGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBvbmx5IHRo
ZSBvbmVzIGhvbm9yZWQgYnkgOnZpc2l0ZWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBpZiAoaXNJbmhlcml0ICYmICFzdGF0ZS5wYXJlbnRTdHlsZSgpLT5oYXNFeHBsaWNpdGx5SW5o
ZXJpdGVkUHJvcGVydGllcygpICYmICFDU1NQcm9wZXJ0eTo6aXNJbmhlcml0ZWRQcm9wZXJ0eShp
ZCkpCi0gICAgICAgIHN0YXRlLnBhcmVudFN0eWxlKCktPnNldEhhc0V4cGxpY2l0bHlJbmhlcml0
ZWRQcm9wZXJ0aWVzKCk7Ci0KLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICBpZiAoaWQg
PT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkgewotICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9J
TVBMSUNBVElPTih2YWx1ZS0+aXNWYXJpYWJsZVZhbHVlKCkpOwotICAgICAgICBDU1NWYXJpYWJs
ZVZhbHVlKiB2YXJpYWJsZSA9IHN0YXRpY19jYXN0PENTU1ZhcmlhYmxlVmFsdWUqPih2YWx1ZSk7
Ci0gICAgICAgIEFTU0VSVCghdmFyaWFibGUtPm5hbWUoKS5pc0VtcHR5KCkpOwotICAgICAgICBB
U1NFUlQoIXZhcmlhYmxlLT52YWx1ZSgpLmlzRW1wdHkoKSk7Ci0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldFZhcmlhYmxlKHZhcmlhYmxlLT5uYW1lKCksIHZhcmlhYmxlLT52YWx1ZSgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gQ2hlY2sgbG9va3VwIHRhYmxl
IGZvciBpbXBsZW1lbnRhdGlvbnMgYW5kIHVzZSB3aGVuIGF2YWlsYWJsZS4KLSAgICBjb25zdCBQ
cm9wZXJ0eUhhbmRsZXImIGhhbmRsZXIgPSBtX3N0eWxlQnVpbGRlci5wcm9wZXJ0eUhhbmRsZXIo
aWQpOwotICAgIGlmIChoYW5kbGVyLmlzVmFsaWQoKSkgewotICAgICAgICBpZiAoaXNJbmhlcml0
KQotICAgICAgICAgICAgaGFuZGxlci5hcHBseUluaGVyaXRWYWx1ZShpZCwgdGhpcyk7Ci0gICAg
ICAgIGVsc2UgaWYgKGlzSW5pdGlhbCkKLSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlJbml0aWFs
VmFsdWUoaWQsIHRoaXMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5
VmFsdWUoaWQsIHRoaXMsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVl
KCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKSA6IDA7Ci0KLSAgICBm
bG9hdCB6b29tRmFjdG9yID0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAg
Ly8gV2hhdCBmb2xsb3dzIGlzIGEgbGlzdCB0aGF0IG1hcHMgdGhlIENTUyBwcm9wZXJ0aWVzIGlu
dG8gdGhlaXIgY29ycmVzcG9uZGluZyBmcm9udC1lbmQKLSAgICAvLyBSZW5kZXJTdHlsZSB2YWx1
ZXMuCi0gICAgc3dpdGNoIChpZCkgewotICAgIC8vIGxpc3RzCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eUNvbnRlbnQ6Ci0gICAgICAgIC8vIGxpc3Qgb2Ygc3RyaW5nLCB1cmksIGNvdW50ZXIsIGF0dHIs
IGkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRklYTUU6IEluIENTUzMsIGl0IHdpbGwgYmUg
cG9zc2libGUgdG8gaW5oZXJpdCBjb250ZW50LiBJbiBDU1MyIGl0IGlzIG5vdC4gVGhpcwotICAg
ICAgICAgICAgLy8gbm90ZSBpcyBhIHJlbWluZGVyIHRoYXQgZXZlbnR1YWxseSAiaW5oZXJpdCIg
bmVlZHMgdG8gYmUgc3VwcG9ydGVkLgotCi0gICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0g
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAg
ICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXZhbHVlLT5p
c1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgYm9v
bCBkaWRTZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgICAgICAgICBD
U1NWYWx1ZSogaXRlbSA9IGkudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJ
bWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlz
R3JhZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTR3Jh
ZGllbnRWYWx1ZSo+KGl0ZW0pLT5ncmFkaWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQo
KSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3Jl
YXRlKHN0YXRpY19jYXN0PENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqPihpdGVtKSksIGRpZFNldCk7
Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0jaWYgRU5BQkxFKENTU19JTUFH
RV9TRVQpCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLT5pc0ltYWdlU2V0VmFsdWUo
KSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KHNldE9y
UGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdl
U2V0VmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAo
aXRlbS0+aXNJbWFnZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0Q29udGVudChjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50
LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZhbHVlKj4oaXRlbSkpLCBkaWRTZXQpOwotICAgICAgICAg
ICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0
aXZlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogY29udGVudFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPihpdGVtKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb250ZW50VmFsdWUt
PmlzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29u
dGVudChjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBkaWRTZXQpOwotICAg
ICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBp
ZiAoY29udGVudFZhbHVlLT5pc0F0dHIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGSVhN
RTogQ2FuIGEgbmFtZXNwYWNlIGJlIHNwZWNpZmllZCBmb3IgYW4gYXR0cihmb28pPwotICAgICAg
ICAgICAgICAgICAgICBpZiAoc3RhdGUuc3R5bGUoKS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8p
Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAg
ICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGFy
ZW50U3R5bGUoKS0+c2V0VW5pcXVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZE5h
bWUgYXR0cihudWxsQXRvbSwgY29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwg
bnVsbEF0b20pOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVl
ID0gc3RhdGUuZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoYXR0cik7Ci0gICAgICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQodmFsdWUuaXNOdWxsKCkgPyBlbXB0eUF0b20g
OiB2YWx1ZS5pbXBsKCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBmYWN0IHRoYXQgdGhlIGF0
dHJpYnV0ZSB2YWx1ZSBhZmZlY3RzIHRoZSBzdHlsZQotICAgICAgICAgICAgICAgICAgICBtX3J1
bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJblJ1bGVzLmFkZChhdHRyLmxvY2FsTmFtZSgpLmltcGwo
KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFsdWUtPmlzQ291bnRlcigp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIENvdW50ZXIqIGNvdW50ZXJWYWx1ZSA9IGNvbnRlbnRW
YWx1ZS0+Z2V0Q291bnRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEVMaXN0U3R5bGVU
eXBlIGxpc3RTdHlsZVR5cGUgPSBOb25lTGlzdFN0eWxlOwotICAgICAgICAgICAgICAgICAgICBp
bnQgbGlzdFN0eWxlSWRlbnQgPSBjb3VudGVyVmFsdWUtPmxpc3RTdHlsZUlkZW50KCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGlmIChsaXN0U3R5bGVJZGVudCAhPSBDU1NWYWx1ZU5vbmUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICBsaXN0U3R5bGVUeXBlID0gc3RhdGljX2Nhc3Q8RUxpc3RTdHls
ZVR5cGU+KGxpc3RTdHlsZUlkZW50IC0gQ1NTVmFsdWVEaXNjKTsKLSAgICAgICAgICAgICAgICAg
ICAgT3duUHRyPENvdW50ZXJDb250ZW50PiBjb3VudGVyID0gYWRvcHRQdHIobmV3IENvdW50ZXJD
b250ZW50KGNvdW50ZXJWYWx1ZS0+aWRlbnRpZmllcigpLCBsaXN0U3R5bGVUeXBlLCBjb3VudGVy
VmFsdWUtPnNlcGFyYXRvcigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldENvbnRlbnQoY291bnRlci5yZWxlYXNlKCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
ICAgICAgICAgc3dpdGNoIChjb250ZW50VmFsdWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZU9wZW5RdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoT1BFTl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUNsb3NlUXVvdGU6Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KENMT1NFX1FVT1RF
LCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1Zh
bHVlTm9PcGVuUXVvdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRDb250ZW50KE5PX09QRU5fUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb0Nsb3NlUXVvdGU6Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KE5PX0NMT1NFX1FVT1RFLCBkaWRTZXQp
OwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gbm9ybWFsIGFuZCBub25lIGRvIG5vdCBoYXZlIGFueSBlZmZlY3Qu
Ci0gICAgICAgICAgICAgICAgICAgICAgICB7IH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZGlkU2V0KQot
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmNsZWFyQ29udGVudCgpOwotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVF1b3RlczoKLSAgICAg
ICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVz
KHN0YXRlLnBhcmVudFN0eWxlKCktPnF1b3RlcygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgfQotICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRRdW90ZXMoMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKHZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7Ci0gICAgICAgICAgICBDU1NWYWx1ZUxpc3Qq
IGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7Ci0gICAgICAgICAgICBS
ZWZQdHI8UXVvdGVzRGF0YT4gcXVvdGVzID0gUXVvdGVzRGF0YTo6Y3JlYXRlKCk7Ci0gICAgICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3QtPmxlbmd0aCgpOyBpICs9IDIpIHsKLSAg
ICAgICAgICAgICAgICBDU1NWYWx1ZSogZmlyc3QgPSBsaXN0LT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKGkpOwotICAgICAgICAgICAgICAgIC8vIGl0ZW0oKSByZXR1cm5zIG51bGwgaWYgb3V0IG9m
IGJvdW5kcyBzbyB0aGlzIGlzIHNhZmUuCi0gICAgICAgICAgICAgICAgQ1NTVmFsdWUqIHNlY29u
ZCA9IGxpc3QtPml0ZW0oaSArIDEpOwotICAgICAgICAgICAgICAgIGlmICghc2Vjb25kKQotICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9T
RUNVUklUWV9JTVBMSUNBVElPTihmaXJzdC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsKLSAgICAgICAg
ICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzZWNvbmQtPmlzUHJpbWl0
aXZlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN0YXJ0UXVvdGUgPSBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpcnN0KS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAg
ICAgICAgICAgICBTdHJpbmcgZW5kUXVvdGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHNlY29uZCktPmdldFN0cmluZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcXVvdGVzLT5h
ZGRQYWlyKHN0ZDo6bWFrZV9wYWlyKHN0YXJ0UXVvdGUsIGVuZFF1b3RlKSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMocXVvdGVzKTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsK
LSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5v
bmUpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKFF1b3Rlc0RhdGE6
OmNyZWF0ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUZvbnRGYW1pbHk6IHsKLSAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmdzIGFuZCBpZHMKLSAg
ICAgICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIHBhcmVu
dEZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigp
OwotICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0
eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dEdlbmVyaWNGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSk7Ci0g
ICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlv
bi5maXJzdEZhbWlseSgpKTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNp
ZmllZEZvbnQocGFyZW50Rm9udERlc2NyaXB0aW9uLmlzU3BlY2lmaWVkRm9udCgpKTsKLSAgICAg
ICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzSW5pdGlhbCkgewotICAgICAgICAg
ICAgRm9udERlc2NyaXB0aW9uIGluaXRpYWxEZXNjID0gRm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
ICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCB0aGUg
c2l6ZSB0byBhY2NvdW50IGZvciB0aGUgZ2VuZXJpYyBmYW1pbHkgY2hhbmdlIGZyb20gbW9ub3Nw
YWNlCi0gICAgICAgICAgICAvLyB0byBub24tbW9ub3NwYWNlLgotICAgICAgICAgICAgaWYgKGZv
bnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERl
ZmF1bHRTaXplKCkpCi0gICAgICAgICAgICAgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9u
LCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERl
c2NyaXB0aW9uLmtleXdvcmRTaXplKCkgLSAxLCBmYWxzZSkpOwotICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoaW5pdGlhbERlc2MuZ2VuZXJpY0ZhbWlseSgpKTsK
LSAgICAgICAgICAgIGlmICghaW5pdGlhbERlc2MuZmlyc3RGYW1pbHkoKS5mYW1pbHlJc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZhbWlseShpbml0aWFsRGVz
Yy5maXJzdEZhbWlseSgpKTsKLSAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgRm9u
dERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlw
dGlvbigpOwotICAgICAgICBGb250RmFtaWx5JiBmaXJzdEZhbWlseSA9IGZvbnREZXNjcmlwdGlv
bi5maXJzdEZhbWlseSgpOwotICAgICAgICBGb250RmFtaWx5KiBjdXJyRmFtaWx5ID0gMDsKLQot
ICAgICAgICAvLyBCZWZvcmUgbWFwcGluZyBpbiBhIG5ldyBmb250LWZhbWlseSBwcm9wZXJ0eSwg
d2Ugc2hvdWxkIHJlc2V0IHRoZSBnZW5lcmljIGZhbWlseS4KLSAgICAgICAgYm9vbCBvbGRGYW1p
bHlVc2VkRml4ZWREZWZhdWx0U2l6ZSA9IGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRT
aXplKCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNj
cmlwdGlvbjo6Tm9GYW1pbHkpOwotCi0gICAgICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgICAgIENTU1Zh
bHVlKiBpdGVtID0gaS52YWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2
ZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogY29udGVudFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
PihpdGVtKTsKLSAgICAgICAgICAgIEF0b21pY1N0cmluZyBmYWNlOwotICAgICAgICAgICAgU2V0
dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOwotICAgICAgICAgICAgaWYgKGNv
bnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkKLSAgICAgICAgICAgICAgICBmYWNlID0gY29udGVudFZh
bHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MpIHsK
LSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAg
ICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRCb2R5OgotICAgICAgICAgICAgICAgICAg
ICBmYWNlID0gc2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseSgpOwotICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2VyaWY6Ci0gICAgICAg
ICAgICAgICAgICAgIGZhY2UgPSBzZXJpZkZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWls
eSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NT
VmFsdWVTYW5zU2VyaWY6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzYW5zU2VyaWZGYW1p
bHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5
KEZvbnREZXNjcmlwdGlvbjo6U2Fuc1NlcmlmRmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUN1cnNpdmU6Ci0gICAgICAgICAg
ICAgICAgICAgIGZhY2UgPSBjdXJzaXZlRmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250
RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OkN1cnNpdmVGYW1p
bHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlRmFudGFzeToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IGZhbnRhc3lGYW1pbHk7
Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6RmFudGFzeUZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVNb25vc3BhY2U6Ci0gICAgICAgICAgICAg
ICAgICAgIGZhY2UgPSBtb25vc3BhY2VGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFt
aWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZVdlYmtpdFBpY3RvZ3JhcGg6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBwaWN0
b2dyYXBoRmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2Vu
ZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlBpY3RvZ3JhcGhGYW1pbHkpOwotICAgICAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIGlmICghZmFjZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1
cnJGYW1pbHkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmlsbGluZyBpbiB0aGUgZmlyc3Qg
ZmFtaWx5LgotICAgICAgICAgICAgICAgICAgICBmaXJzdEZhbWlseS5zZXRGYW1pbHkoZmFjZSk7
Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LmFwcGVuZEZhbWlseSgwKTsgLy8gUmVt
b3ZlIGFueSBpbmhlcml0ZWQgZmFtaWx5LWZhbGxiYWNrIGxpc3QuCi0gICAgICAgICAgICAgICAg
ICAgIGN1cnJGYW1pbHkgPSAmZmlyc3RGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmllZEZvbnQoZm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1p
bHkoKSA9PSBGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKLSAgICAgICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U2hhcmVkRm9udEZhbWlseT4gbmV3RmFt
aWx5ID0gU2hhcmVkRm9udEZhbWlseTo6Y3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5l
d0ZhbWlseS0+c2V0RmFtaWx5KGZhY2UpOwotICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5
LT5hcHBlbmRGYW1pbHkobmV3RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWls
eSA9IG5ld0ZhbWlseS5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4ndCBjYWxsIHVzZUZpeGVkRGVmYXVsdFNpemUo
KSB1bnRpbCBhbGwgbmV3IGZvbnQgZmFtaWxpZXMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgIC8v
IElmIGN1cnJGYW1pbHkgaXMgbm9uLXplcm8gdGhlbiB3ZSBzZXQgYXQgbGVhc3Qgb25lIGZhbWls
eSBvbiB0aGlzIGRlc2NyaXB0aW9uLgotICAgICAgICBpZiAoY3VyckZhbWlseSkgewotICAgICAg
ICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlv
bi51c2VGaXhlZERlZmF1bHRTaXplKCkgIT0gb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUp
Ci0gICAgICAgICAgICAgICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZv
cktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtl
eXdvcmRTaXplKCkgLSAxLCAhb2xkRmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpKTsKLQotICAg
ICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBTaG9ydGhhbmQgcHJvcGVydGllcy4KLSAg
ICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAg
ICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxl
KCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGlu
ZUhlaWdodChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zcGVjaWZpZWRMaW5lSGVpZ2h0KCkpOwotICAg
ICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotICAgICAgICAgICAgc2V0Rm9u
dERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNJbml0
aWFsKSB7Ci0gICAgICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdz
KCk7Ci0gICAgICAgICAgICBBU1NFUlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHls
ZSByZXNvbHV0aW9uLCB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBh
bmQgdGh1cyBoYXZlIHNldHRpbmdzCi0gICAgICAgICAgICBpZiAoIXNldHRpbmdzKQotICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGluaXRpYWxpemVGb250U3R5bGUoc2V0dGlu
Z3MpOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlKSB7Ci0gICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdo
dCgpKTsKLSAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLQotICAgICAg
ICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICAgICAgICAgIFJlbmRl
clRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+c3lzdGVtRm9udChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRl
bnQoKSwgZm9udERlc2NyaXB0aW9uKTsKLQotICAgICAgICAgICAgLy8gRG91YmxlLWNoZWNrIGFu
ZCBzZWUgaWYgdGhlIHRoZW1lIGRpZCBhbnl0aGluZy4gSWYgbm90LCBkb24ndCBib3RoZXIgdXBk
YXRpbmcgdGhlIGZvbnQuCi0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1
dGVTaXplKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBt
b2RlIGFuZCBwcmludGVyIGZvbnQgc2V0dGluZ3MgYXJlIHVwZGF0ZWQuCi0gICAgICAgICAgICAg
ICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOwotICAgICAgICAgICAg
ICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24s
IHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUg
c2V0dGluZ3MKLSAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICAgICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmlu
Z01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOwotICAgICAgICAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8
ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7Ci0KLSAgICAgICAg
ICAgICAgICAvLyBIYW5kbGUgdGhlIHpvb20gZmFjdG9yLgotICAgICAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNp
emUoZG9jdW1lbnQoKSwgc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVT
aXplKCksIGZvbnREZXNjcmlwdGlvbi5zcGVjaWZpZWRTaXplKCksIHVzZVNWR1pvb21SdWxlcygp
KSk7Ci0gICAgICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUtPmlzRm9udFZhbHVlKCkp
IHsKLSAgICAgICAgICAgIEZvbnRWYWx1ZSogZm9udCA9IHN0YXRpY19jYXN0PEZvbnRWYWx1ZSo+
KHZhbHVlKTsKLSAgICAgICAgICAgIGlmICghZm9udC0+c3R5bGUgfHwgIWZvbnQtPnZhcmlhbnQg
fHwgIWZvbnQtPndlaWdodAotICAgICAgICAgICAgICAgIHx8ICFmb250LT5zaXplIHx8ICFmb250
LT5saW5lSGVpZ2h0IHx8ICFmb250LT5mYW1pbHkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTdHlsZSwgZm9udC0+c3R5
bGUuZ2V0KCkpOwotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRWYXJp
YW50LCBmb250LT52YXJpYW50LmdldCgpKTsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NT
UHJvcGVydHlGb250V2VpZ2h0LCBmb250LT53ZWlnaHQuZ2V0KCkpOwotICAgICAgICAgICAgLy8g
VGhlIHByZXZpb3VzIHByb3BlcnRpZXMgY2FuIGRpcnR5IG91ciBmb250IGJ1dCB0aGV5IGRvbid0
IHRyeSB0byByZWFkIHRoZSBmb250J3MKLSAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYmFjaywg
d2hpY2ggaXMgc2FmZS4gSG93ZXZlciBpZiBmb250LXNpemUgaXMgdXNpbmcgdGhlICdleCcgdW5p
dCwgaXQgd2lsbAotICAgICAgICAgICAgLy8gbmVlZCBxdWVyeSB0aGUgZGlydGllZCBmb250J3Mg
eC1oZWlnaHQgdG8gZ2V0IHRoZSBjb21wdXRlZCBzaXplLiBUbyBiZSBzYWZlIGluIHRoaXMKLSAg
ICAgICAgICAgIC8vIGNhc2UsIGxldCdzIGp1c3QgdXBkYXRlIHRoZSBmb250IG5vdy4KLSAgICAg
ICAgICAgIHVwZGF0ZUZvbnQoKTsKLSAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVy
dHlGb250U2l6ZSwgZm9udC0+c2l6ZS5nZXQoKSk7Ci0KLSAgICAgICAgICAgIHN0YXRlLnNldExp
bmVIZWlnaHRWYWx1ZShmb250LT5saW5lSGVpZ2h0LmdldCgpKTsKLQotICAgICAgICAgICAgYXBw
bHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRGYW1pbHksIGZvbnQtPmZhbWlseS5nZXQoKSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJv
cmRlckNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmFkaXVzOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3R5bGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclRvcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2lu
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVy
ZmxvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5
VHJhbnNpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVyQmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbnM6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZsZXg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhGbG93OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQ29sdW1uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRHcmlkUm93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Db2xsYXBzZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFzazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRUZXh0RW1waGFzaXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpbjoKLSNpZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXA6Ci0jZW5kaWYKLSAgICAgICAgQVNTRVJUKGlz
RXhwYW5kZWRTaG9ydGhhbmQoaWQpKTsKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0g
ICAgICAgIGJyZWFrOwotCi0gICAgLy8gQ1NTMyBQcm9wZXJ0aWVzCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRTaGFkb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJveFNoYWRvdzoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93OiB7Ci0gICAgICAgIGlmIChpc0luaGVyaXQpIHsK
LSAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3coc3RhdGUucGFyZW50U3R5
bGUoKS0+dGV4dFNoYWRvdygpID8gYWRvcHRQdHIobmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVu
dFN0eWxlKCktPnRleHRTaGFkb3coKSkpIDogbnVsbHB0cik7Ci0gICAgICAgICAgICByZXR1cm4g
c3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRv
dygpID8gYWRvcHRQdHIobmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNo
YWRvdygpKSkgOiBudWxscHRyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNJbml0aWFsIHx8
IHByaW1pdGl2ZVZhbHVlKSAvLyBpbml0aWFsIHwgbm9uZQotICAgICAgICAgICAgcmV0dXJuIGlk
ID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdyA/IHN0YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3co
bnVsbHB0cikgOiBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3cobnVsbHB0cik7Ci0KLSAgICAg
ICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAg
ICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGku
YWR2YW5jZSgpKSB7Ci0gICAgICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgp
OwotICAgICAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGlj
X2Nhc3Q8U2hhZG93VmFsdWUqPihjdXJyVmFsdWUpOwotICAgICAgICAgICAgaW50IHggPSBpdGVt
LT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRT
dHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGludCB5ID0gaXRlbS0+eS0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9v
bUZhY3Rvcik7Ci0gICAgICAgICAgICBpbnQgYmx1ciA9IGl0ZW0tPmJsdXIgPyBpdGVtLT5ibHVy
LT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKSA6IDA7Ci0gICAgICAgICAgICBpbnQgc3ByZWFkID0gaXRlbS0+c3By
ZWFkID8gaXRlbS0+c3ByZWFkLT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSA6IDA7Ci0gICAgICAgICAgICBTaGFk
b3dTdHlsZSBzaGFkb3dTdHlsZSA9IGl0ZW0tPnN0eWxlICYmIGl0ZW0tPnN0eWxlLT5nZXRJZGVu
dCgpID09IENTU1ZhbHVlSW5zZXQgPyBJbnNldCA6IE5vcm1hbDsKLSAgICAgICAgICAgIENvbG9y
IGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvbG9yKQotICAgICAgICAgICAgICAgIGNv
bG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOwotICAgICAg
ICAgICAgZWxzZSBpZiAoc3RhdGUuc3R5bGUoKSkKLSAgICAgICAgICAgICAgICBjb2xvciA9IHN0
YXRlLnN0eWxlKCktPmNvbG9yKCk7Ci0KLSAgICAgICAgICAgIE93blB0cjxTaGFkb3dEYXRhPiBz
aGFkb3dEYXRhID0gYWRvcHRQdHIobmV3IFNoYWRvd0RhdGEoSW50UG9pbnQoeCwgeSksIGJsdXIs
IHNwcmVhZCwgc2hhZG93U3R5bGUsIGlkID09IENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93LCBj
b2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCkpOwotICAgICAgICAg
ICAgaWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdykKLSAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBpLmluZGV4KCkp
OyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGVudHJ5Ci0gICAg
ICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93
KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBpLmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYg
dGhpcyBpcyBub3QgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVjdDogewotICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChib3hSZWZsZWN0LCBCb3hSZWZsZWN0KQotICAgICAg
ICBpZiAocHJpbWl0aXZlVmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJv
eFJlZmxlY3QoUmVuZGVyU3R5bGU6OmluaXRpYWxCb3hSZWZsZWN0KCkpOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNSZWZsZWN0VmFsdWUo
KSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxl
Y3RWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAg
UmVmUHRyPFN0eWxlUmVmbGVjdGlvbj4gcmVmbGVjdGlvbiA9IFN0eWxlUmVmbGVjdGlvbjo6Y3Jl
YXRlKCk7Ci0gICAgICAgIHJlZmxlY3Rpb24tPnNldERpcmVjdGlvbigqcmVmbGVjdFZhbHVlLT5k
aXJlY3Rpb24oKSk7Ci0gICAgICAgIGlmIChyZWZsZWN0VmFsdWUtPm9mZnNldCgpKQotICAgICAg
ICAgICAgcmVmbGVjdGlvbi0+c2V0T2Zmc2V0KHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCktPmNvbnZl
cnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBD
YWxjdWxhdGVkQ29udmVyc2lvbj4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCB6b29tRmFjdG9yKSk7Ci0gICAgICAgIE5pbmVQaWVjZUltYWdlIG1hc2s7Ci0gICAgICAg
IG1hc2suc2V0TWFza0RlZmF1bHRzKCk7Ci0gICAgICAgIG1fc3R5bGVNYXAubWFwTmluZVBpZWNl
SW1hZ2UoaWQsIHJlZmxlY3RWYWx1ZS0+bWFzaygpLCBtYXNrKTsKLSAgICAgICAgcmVmbGVjdGlv
bi0+c2V0TWFzayhtYXNrKTsKLQotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0
KHJlZmxlY3Rpb24ucmVsZWFzZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNl
IENTU1Byb3BlcnR5U3JjOiAvLyBPbmx5IHVzZWQgaW4gQGZvbnQtZmFjZSBydWxlcy4KLSAgICAg
ICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlUmFuZ2U6IC8vIE9ubHkgdXNl
ZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0aW9uOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKG1hcnF1ZWVMb29wQ291bnQsIE1hcnF1ZWVMb29wQ291bnQpCi0gICAgICAgIGlm
ICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUluZmluaXRlKQotICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVh
dCBmb3JldmVyLgotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkK
LSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZl
VmFsdWUtPmdldEludFZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3BlZWQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwobWFycXVlZVNwZWVkLCBNYXJxdWVlU3BlZWQpCi0gICAgICAgIGlmICghcHJp
bWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChpbnQgaWRlbnQg
PSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgc3dpdGNoIChpZGVu
dCkgewotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNsb3c6Ci0gICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDUwMCk7IC8vIDUwMCBtc2VjLgotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRo
ZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZUZhc3Q6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVl
ZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBTdXBlciBmYXN0LgotICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1Rp
bWUoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRp
dmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50LCBDU1NQcmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRz
PigpKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZv
ciBzY3JvbGxhbW91bnQgc3VwcG9ydC4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1h
cnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsK
LSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFy
cXVlZUluY3JlbWVudCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAg
IHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAg
ICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAg
ICBjYXNlIENTU1ZhbHVlU21hbGw6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
TWFycXVlZUluY3JlbWVudChMZW5ndGgoMSwgRml4ZWQpKTsgLy8gMXB4LgotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkp
OyAvLyA2cHguIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZUxhcmdlOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDM2LCBGaXhlZCkpOyAvLyAzNnB4LgotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVMZW5ndGggPSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0
aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAg
ICAgICAgICBpZiAoIW1hcnF1ZWVMZW5ndGguaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVtZW50KG1hcnF1ZWVMZW5ndGgpOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dExvY2FsZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExv
Y2FsZSk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8p
Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUobnVsbEF0b20pOwotICAgICAg
ICBlbHNlCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFs
dWUtPmdldFN0cmluZ1ZhbHVlKCkpOwotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2Ny
aXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihz
dGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkpOwotICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9u
dERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNpZiBFTkFCTEUoREFTSEJP
QVJEX1NVUFBPUlQpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoK
LSAgICB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lv
bnMsIERhc2hib2FyZFJlZ2lvbnMpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAg
ICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
ID09IENTU1ZhbHVlTm9uZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJv
YXJkUmVnaW9ucyhSZW5kZXJTdHlsZTo6bm9uZURhc2hib2FyZFJlZ2lvbnMoKSk7Ci0gICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lv
biA9IHByaW1pdGl2ZVZhbHVlLT5nZXREYXNoYm9hcmRSZWdpb25WYWx1ZSgpOwotICAgICAgICBp
ZiAoIXJlZ2lvbikKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBEYXNoYm9hcmRSZWdp
b24qIGZpcnN0ID0gcmVnaW9uOwotICAgICAgICB3aGlsZSAocmVnaW9uKSB7Ci0gICAgICAgICAg
ICBMZW5ndGggdG9wID0gY29udmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0
eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBMZW5ndGggcmln
aHQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBz
dGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNv
bnZlcnRUb0ludExlbmd0aChyZWdpb24tPmJvdHRvbSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAgICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9J
bnRMZW5ndGgocmVnaW9uLT5sZWZ0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50
U3R5bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmICh0b3AuaXNVbmRlZmluZWQoKSkKLSAgICAgICAg
ICAgICAgICB0b3AgPSBMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5l
ZCgpKQotICAgICAgICAgICAgICAgIHJpZ2h0ID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAo
Ym90dG9tLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7
Ci0gICAgICAgICAgICBpZiAobGVmdC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIGxl
ZnQgPSBMZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKLSAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNo
Ym9hcmRSZWdpb246OkNpcmNsZSwgcmVnaW9uLT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20s
IGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgICAgICAgICBlbHNl
IGlmIChyZWdpb24tPm1faXNSZWN0YW5nbGUpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJl
Z2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3Qg
PyBmYWxzZSA6IHRydWUpOwotICAgICAgICAgICAgcmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0
KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0
ZWRSZWdpb25zKHRydWUpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSNpZiBF
TkFCTEUoRFJBR0dBQkxFX1JFR0lPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVn
aW9uOiB7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXREcmFnZ2FibGVSZWdpb25Nb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlRHJhZyA/IERyYWdnYWJsZVJlZ2lvbkRyYWcgOiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOwot
ICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRleHRTdHJva2VXaWR0aDogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0
ZXh0U3Ryb2tlV2lkdGgsIFRleHRTdHJva2VXaWR0aCkKLSAgICAgICAgZmxvYXQgd2lkdGggPSAw
OwotICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAg
IGNhc2UgQ1NTVmFsdWVUaGluOgotICAgICAgICBjYXNlIENTU1ZhbHVlTWVkaXVtOgotICAgICAg
ICBjYXNlIENTU1ZhbHVlVGhpY2s6IHsKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAg
LyA0ODsKLSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZU1lZGl1bSkKLSAgICAgICAgICAgICAgICByZXN1bHQgKj0gMzsKLSAgICAgICAgICAgIGVs
c2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVGhpY2spCi0gICAg
ICAgICAgICAgICAgcmVzdWx0ICo9IDU7Ci0gICAgICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2
ZVZhbHVlOjpjcmVhdGUocmVzdWx0LCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1
dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwg
em9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgd2lkdGggPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxm
bG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9y
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFRleHRTdHJva2VXaWR0aCh3aWR0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybTogewotICAgICAgICBIQU5ETEVfSU5IRVJJ
VF9BTkRfSU5JVElBTCh0cmFuc2Zvcm0sIFRyYW5zZm9ybSk7Ci0gICAgICAgIFRyYW5zZm9ybU9w
ZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2
YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25z
KTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VHJhbnNmb3JtKG9wZXJhdGlvbnMpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2
ZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVy
c3BlY3RpdmUpCi0KLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJl
dHVybjsKLQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHBlcnNwZWN0
aXZlVmFsdWU7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKLSAgICAg
ICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxm
bG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9y
KTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAg
ICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVt
YmVycyBhcyBweC4KLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVW
YWx1ZTo6Y3JlYXRlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRp
dmVWYWx1ZTo6Q1NTX1BYKS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikK
LSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFs
dWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiB7Ci0gICAgICAgIEhB
TkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRhcEhpZ2hsaWdodENvbG9yLCBUYXBIaWdobGlnaHRD
b2xvcik7Ci0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBicmVhazsK
LQotICAgICAgICBDb2xvciBjb2wgPSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShwcmltaXRpdmVW
YWx1ZSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRhcEhpZ2hsaWdodENvbG9yKGNvbCk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSNpZiBFTkFCTEUoQUNDRUxFUkFURURf
T1ZFUkZMT1dfU0NST0xMSU5HKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRPdmVyZmxvd1Nj
cm9sbGluZzogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh1c2VUb3VjaE92
ZXJmbG93U2Nyb2xsaW5nLCBVc2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKTsKLSAgICAgICAgaWYg
KCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRVc2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpID09IENTU1ZhbHVlVG91Y2gpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUludmFsaWQ6Ci0gICAgICAgIHJldHVybjsKLSAgICAvLyBEaXJl
Y3Rpb25hbCBwcm9wZXJ0aWVzIGFyZSByZXNvbHZlZCBieSByZXNvbHZlRGlyZWN0aW9uQXdhcmVQ
cm9wZXJ0eSgpIGJlZm9yZSB0aGUgc3dpdGNoLgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJFbmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFdpZHRoOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRCb3JkZXJTdGFydENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJTdGFydFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFy
dFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlU3R5bGU6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJBZnRlckNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRl
clN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlcldpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5FbmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hcmdpblN0YXJ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5CZWZvcmU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFmdGVyOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXJnaW5CZWZvcmVDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFyZ2luVG9wQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFm
dGVyQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJvdHRvbUNvbGxh
cHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nRW5kOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRQYWRkaW5nU3RhcnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBh
ZGRpbmdCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdBZnRlcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9naWNhbFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRMb2dpY2FsSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dp
Y2FsV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxIZWlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1heExvZ2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWF4TG9naWNhbEhlaWdodDoKLSAgICB7Ci0gICAgICAgIENTU1Byb3BlcnR5
SUQgbmV3SWQgPSBDU1NQcm9wZXJ0eTo6cmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoaWQs
IHN0YXRlLnN0eWxlKCktPmRpcmVjdGlvbigpLCBzdGF0ZS5zdHlsZSgpLT53cml0aW5nTW9kZSgp
KTsKLSAgICAgICAgQVNTRVJUKG5ld0lkICE9IGlkKTsKLSAgICAgICAgcmV0dXJuIGFwcGx5UHJv
cGVydHkobmV3SWQsIHZhbHVlKTsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHJl
dGNoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
TGluZVRocm91Z2g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaENvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hNb2RlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlUZXh0TGluZVRocm91Z2hTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVU
aHJvdWdoV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRP
dmVybGluZU1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVN0eWxlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dFVuZGVybGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZUNvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lTW9kZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dFVuZGVybGluZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5l
V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRTaXplRGVsdGE6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uc0luRWZmZWN0OgotICAgICAgICByZXR1
cm47Ci0KLSAgICAvLyBDU1MgVGV4dCBMYXlvdXQgTW9kdWxlIExldmVsIDM6IFZlcnRpY2FsIHdy
aXRpbmcgc3VwcG9ydAotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcml0aW5nTW9kZTogewot
ICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh3cml0aW5nTW9kZSwgV3JpdGluZ01v
ZGUpOwotICAgICAgICAKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAg
c2V0V3JpdGluZ01vZGUoKnByaW1pdGl2ZVZhbHVlKTsKLQotICAgICAgICAvLyBGSVhNRTogSXQg
aXMgbm90IG9rIHRvIG1vZGlmeSBkb2N1bWVudCBzdGF0ZSB3aGlsZSBhcHBseWluZyBzdHlsZS4K
LSAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUu
ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpCi0gICAgICAgICAgICBzdGF0ZS5kb2N1bWVu
dCgpLT5zZXRXcml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KHRydWUpOwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRPcmllbnRhdGlv
bjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0T3JpZW50YXRpb24s
IFRleHRPcmllbnRhdGlvbik7Ci0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKQotICAgICAg
ICAgICAgc2V0VGV4dE9yaWVudGF0aW9uKCpwcmltaXRpdmVWYWx1ZSk7Ci0KLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQm94Q29udGFpbjog
ewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChsaW5lQm94Q29udGFpbiwgTGlu
ZUJveENvbnRhaW4pCi0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldExpbmVCb3hDb250YWluKExpbmVCb3hDb250YWluTm9uZSk7Ci0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc0NTU0xpbmVCb3hDb250
YWluVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDU1NMaW5lQm94Q29u
dGFpblZhbHVlKiBsaW5lQm94Q29udGFpblZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTTGluZUJveENv
bnRhaW5WYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENv
bnRhaW4obGluZUJveENvbnRhaW5WYWx1ZS0+dmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICAvLyBDU1MgRm9udHMgTW9kdWxlIExldmVsIDMKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Rm9udEZlYXR1cmVTZXR0aW5nczogewotICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb3JtYWwpIHsKLSAg
ICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRp
b24oKS5tYWtlTm9ybWFsRmVhdHVyZVNldHRpbmdzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAg
ICAgIHJldHVybjsKLQotICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0g
c3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIENTU1ZhbHVlTGlzdCog
bGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKLSAgICAgICAgUmVmUHRy
PEZvbnRGZWF0dXJlU2V0dGluZ3M+IHNldHRpbmdzID0gRm9udEZlYXR1cmVTZXR0aW5nczo6Y3Jl
YXRlKCk7Ci0gICAgICAgIGludCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBs
aXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwotICAgICAgICAgICAgaWYgKCFpdGVtLT5p
c0ZvbnRGZWF0dXJlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIEZvbnRGZWF0dXJlVmFsdWUqIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGb250RmVhdHVyZVZh
bHVlKj4oaXRlbSk7Ci0gICAgICAgICAgICBzZXR0aW5ncy0+YXBwZW5kKEZvbnRGZWF0dXJlKGZl
YXR1cmUtPnRhZygpLCBmZWF0dXJlLT52YWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9u
dERlc2NyaXB0aW9uLnNldEZlYXR1cmVTZXR0aW5ncyhzZXR0aW5ncy5yZWxlYXNlKCkpOwotICAg
ICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0RmlsdGVyOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGZpbHRl
ciwgRmlsdGVyKTsKLSAgICAgICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgICAg
ICBpZiAoY3JlYXRlRmlsdGVyT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEZpbHRlcihvcGVyYXRpb25zKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRp
ZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQ29sdW1uczogewotICAgICAgICBWZWN0
b3I8R3JpZFRyYWNrU2l6ZT4gdHJhY2tTaXplczsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJh
Y2tMaXN0KHZhbHVlLCB0cmFja1NpemVzLCBzdGF0ZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRDb2x1bW5zKHRyYWNrU2l6ZXMpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93czogewot
ICAgICAgICBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4gdHJhY2tTaXplczsKLSAgICAgICAgaWYgKCFj
cmVhdGVHcmlkVHJhY2tMaXN0KHZhbHVlLCB0cmFja1NpemVzLCBzdGF0ZSkpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRSb3dzKHRyYWNrU2l6ZXMp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdy
aWRTdGFydDogewotICAgICAgICBHcmlkUG9zaXRpb24gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAg
aWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIHN0YXJ0UG9zaXRpb24pKQotICAgICAgICAg
ICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0
UG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRHcmlkRW5kOiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBlbmRQb3NpdGlvbjsKLSAgICAg
ICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGVuZFBvc2l0aW9uKSkKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9z
aXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEdyaWRCZWZvcmU6IHsKLSAgICAgICAgR3JpZFBvc2l0aW9uIGJlZm9yZVBvc2l0aW9uOwot
ICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYmVmb3JlUG9zaXRpb24pKQot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUJl
Zm9yZShiZWZvcmVQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEdyaWRBZnRlcjogewotICAgICAgICBHcmlkUG9zaXRpb24gYWZ0ZXJQ
b3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGFmdGVyUG9z
aXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRH
cmlkSXRlbUFmdGVyKGFmdGVyUG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgYWxpYXNlZCBhbmQgU3R5bGVCdWlsZGVyIGFscmVh
ZHkgYXBwbGllZCB0aGUgcHJvcGVydHkgb24gdGhlIHByZWZpeGVkIHZlcnNpb24uCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNp
dGlvbkR1cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uUHJvcGVydHk6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICAgICAgcmV0
dXJuOwotICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIGltcGxlbWVudGVkIGluIHRoZSBTdHls
ZUJ1aWxkZXIgbG9va3VwIHRhYmxlLgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0
YWNobWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZEltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kUG9zaXRpb25ZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJhY2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tTGVmdFJhZGl1czoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckJvdHRvbVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21XaWR0
aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckltYWdlT3V0c2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVJl
cGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VTbGljZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVySW1hZ2VTb3VyY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcklt
YWdlV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyTGVmdFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJM
ZWZ0V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clJpZ2h0V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcENvbG9yOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BMZWZ0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJUb3BSaWdodFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wU3R5bGU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJveFNpemluZzoKLSAgICBjYXNlIENTU1By
b3BlcnR5Q2FwdGlvblNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNsZWFyOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5Q291bnRlckluY3JlbWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlclJl
c2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlDdXJzb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eURp
cmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5RGlzcGxheToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5RW1wdHlDZWxsczoKLSAgICBjYXNlIENTU1Byb3BlcnR5RmxvYXQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUZvbnRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUZvbnRWYXJpYW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlIZWlnaHQ6Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9PUklF
TlRBVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VPcmllbnRhdGlvbjoKLSNlbmRpZgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZVJlbmRlcmluZzoKLSNpZiBFTkFCTEUoQ1NTX0lNQUdF
X1JFU09MVVRJT04pCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVzb2x1dGlvbjoKLSNlbmRp
ZgotICAgIGNhc2UgQ1NTUHJvcGVydHlMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlMZXR0ZXJT
cGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlMaW5lSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlMaXN0U3R5bGVJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlUG9zaXRp
b246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVR5cGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU1hcmdpbkJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luTGVmdDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5TWFyZ2luUmlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRv
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4SGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlN
YXhXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWluSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlNaW5XaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3JwaGFuczoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3ZlcmZsb3dXcmFwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvd1g6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93WToKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGlu
Z0JvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ0xlZnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVBhZGRpbmdSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ1RvcDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBh
Z2VCcmVha0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrSW5zaWRlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlQb2ludGVyRXZlbnRzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQb3Np
dGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5UmVzaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlS
aWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5U2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5U3Bl
YWs6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRhYlNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRh
YmxlTGF5b3V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0QWxpZ246Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHREZWNvcmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0SW5kZW50Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmZsb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHRSZW5kZXJpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRUcmFuc2Zvcm06Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRvcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZUJpZGk6Ci0jaWYg
RU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVZhcmlhYmxlOgotI2Vu
ZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVZlcnRpY2FsQWxpZ246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVZpc2liaWxpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRlbGF5
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EaXJlY3Rpb246Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkR1cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRBbmltYXRpb25GaWxsTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5p
bWF0aW9uSXRlcmF0aW9uQ291bnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlv
bk5hbWU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblBsYXlTdGF0ZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb246Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEFwcGVhcmFuY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEFzcGVjdFJhdGlvOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZmFjZVZpc2liaWxp
dHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDbGlwOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ29tcG9zaXRlOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCYWNrZ3JvdW5kT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNr
Z3JvdW5kU2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRml0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJIb3Jpem9udGFsU3BhY2luZzoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVySW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclZlcnRpY2FsU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246
Ci0jaWYgRU5BQkxFKENTU19CT1hfREVDT1JBVElPTl9CUkVBSykKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm94RGVjb3JhdGlvbkJyZWFrOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveERpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RmxleEdyb3VwOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3hMaW5lczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5h
bEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmllbnQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJveFBhY2s6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9y
Q29ycmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQXhpczoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uQnJlYWtCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENv
bHVtbkJyZWFrSW5zaWRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uR2FwOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRDb2x1bW5Qcm9ncmVzc2lvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uUnVsZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uU3BhbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uV2lkdGg6Ci0jaWYgRU5BQkxFKENVUlNPUl9WSVNJQklMSVRZKQotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRDdXJzb3JWaXNpYmlsaXR5OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEFsaWduQ29udGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVt
czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25TZWxmOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRGbGV4QmFzaXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJl
Y3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhHcm93OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRGbGV4U2hyaW5rOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4
V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SnVzdGlmeUNvbnRlbnQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE9yZGVyOgotI2lmIEVOQUJMRShDU1NfUkVHSU9OUykKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Rmxvd0Zyb206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEZsb3dJbnRvOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRLZXJuaW5n
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250U21vb3RoaW5nOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRGb250VmFyaWFudExpZ2F0dXJlczoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0SGlnaGxpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVDaGFy
YWN0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QWZ0ZXI6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0QmVmb3JlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdExpbmVzOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRIeXBoZW5zOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQWxpZ246Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVCcmVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TGluZUNsYW1wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lR3JpZDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZVNuYXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hcnF1ZWVEaXJlY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVT
dHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VPdXRzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hc2tCb3hJbWFnZVJlcGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFz
a0JveEltYWdlU2xpY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNv
dXJjZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlV2lkdGg6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrQ29tcG9zaXRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hc2tQb3NpdGlvblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3Np
dGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRYOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFza1NpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE5ic3BNb2RlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0UGVyc3BlY3RpdmVPcmlnaW5YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJz
cGVjdGl2ZU9yaWdpblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1
c3Q6Ci0jaWYgRU5BQkxFKENTU19SRUdJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRS
ZWdpb25CcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0Jl
Zm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtJbnNpZGU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbk92ZXJmbG93OgotI2VuZGlmCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFJ0bE9yZGVyaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRS
dWJ5UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRDb21iaW5lOgotI2lm
IEVOQUJMRShDU1MzX1RFWFQpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0
aW9uTGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEFsaWduTGFzdDoKLSNlbmRpZiAvLyBDU1Mz
X1RFWFQKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1Bvc2l0aW9uOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zZm9ybU9yaWdpblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9y
bU9yaWdpblo6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybVN0eWxlOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uRGVsYXk6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRyYW5zaXRpb25EdXJhdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNpdGlvblByb3BlcnR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9u
VGltaW5nRnVuY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJEcmFnOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyTW9kaWZ5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRVc2VyU2VsZWN0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDbGlwUGF0aDoKLSNp
ZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBG
bG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZU1hcmdpbjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0U2hhcGVQYWRkaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRX
cmFwVGhyb3VnaDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVJbnNpZGU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlT3V0c2lkZToKLSNlbmRpZgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXaGl0ZVNwYWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXaWRvd3M6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkQnJlYWs6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdvcmRTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkV3Jh
cDoKLSAgICBjYXNlIENTU1Byb3BlcnR5WkluZGV4OgotICAgIGNhc2UgQ1NTUHJvcGVydHlab29t
OgotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAgY2FzZSBDU1NQcm9wZXJ0
eU1heFpvb206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1pblpvb206Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU9yaWVudGF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlVc2VyWm9vbToKLSNlbmRpZgot
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIGRlZmF1
bHQ6Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgLy8gVHJ5IHRoZSBTVkcgcHJvcGVydGllcwot
ICAgICAgICBhcHBseVNWR1Byb3BlcnR5KGlkLCB2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpz
dHlsZUltYWdlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAg
ICBpZiAodmFsdWUtPmlzSW1hZ2VWYWx1ZSgpKQotICAgICAgICByZXR1cm4gY2FjaGVkT3JQZW5k
aW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZhbHVlKj4odmFsdWUp
KTsKLQotICAgIGlmICh2YWx1ZS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKLSAgICAgICAg
aWYgKHZhbHVlLT5pc0dyYWRpZW50VmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBnZW5lcmF0
ZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFs
dWUqPih2YWx1ZSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKTsKLSAg
ICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGlj
X2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KHZhbHVlKSk7Ci0gICAgfQotCi0jaWYgRU5B
QkxFKENTU19JTUFHRV9TRVQpCi0gICAgaWYgKHZhbHVlLT5pc0ltYWdlU2V0VmFsdWUoKSkKLSAg
ICAgICAgcmV0dXJuIHNldE9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8
Q1NTSW1hZ2VTZXRWYWx1ZSo+KHZhbHVlKSk7Ci0jZW5kaWYKLQotICAgIGlmICh2YWx1ZS0+aXND
dXJzb3JJbWFnZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjdXJzb3JPclBlbmRpbmdGcm9tVmFs
dWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0N1cnNvckltYWdlVmFsdWUqPih2YWx1ZSkpOwot
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZl
cjo6Y2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0lt
YWdlVmFsdWUqIHZhbHVlKQotewotICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVl
LT5jYWNoZWRPclBlbmRpbmdJbWFnZSgpOwotICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5k
aW5nSW1hZ2UoKSkKLSAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0
KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKLX0KLQotUGFz
c1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpnZW5lcmF0ZWRPclBlbmRpbmdGcm9t
VmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogdmFs
dWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1BlbmRpbmcoKSkgewotICAgICAgICBtX3N0YXRlLnBl
bmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgcmV0
dXJuIFN0eWxlUGVuZGluZ0ltYWdlOjpjcmVhdGUodmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4g
U3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHZhbHVlKTsKLX0KLQotI2lmIEVOQUJMRShDU1Nf
SU1BR0VfU0VUKQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzZXRPclBl
bmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VTZXRWYWx1ZSog
dmFsdWUpCi17Ci0gICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9y
UGVuZGluZ0ltYWdlU2V0KGRvY3VtZW50KCkpOwotICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQ
ZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCku
c2V0KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKLX0KLSNl
bmRpZgotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmN1cnNvck9yUGVu
ZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NDdXJzb3JJbWFnZVZhbHVl
KiB2YWx1ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVk
T3JQZW5kaW5nSW1hZ2UoZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1Bl
bmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5z
ZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUs
IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsKLSAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpv
b20oKSA9PSBwYXJlbnRTdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3Jp
cHRpb24oKTsKLSAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9u
dCk7Ci0gICAgc2V0Rm9udFNpemUobmV3Rm9udERlc2NyaXB0aW9uLCBjaGlsZEZvbnQuc3BlY2lm
aWVkU2l6ZSgpKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlw
dGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hh
bmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAg
IGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlv
bigpOwotCi0gICAgaWYgKGNoaWxkRm9udC5pc0Fic29sdXRlU2l6ZSgpIHx8ICFwYXJlbnRTdHls
ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRG
b250ID0gcGFyZW50U3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwotICAgIGlmIChjaGlsZEZvbnQu
dXNlRml4ZWREZWZhdWx0U2l6ZSgpID09IHBhcmVudEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGb3Igbm93LCBsdW1wIGFsbCBmYW1pbGllcyBi
dXQgbW9ub3NwYWNlIHRvZ2V0aGVyLgotICAgIGlmIChjaGlsZEZvbnQuZ2VuZXJpY0ZhbWlseSgp
ICE9IEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5Ci0gICAgICAgICYmIHBhcmVudEZv
bnQuZ2VuZXJpY0ZhbWlseSgpICE9IEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBrbm93IHRoZSBwYXJlbnQgaXMgbW9ub3NwYWNl
IG9yIHRoZSBjaGlsZCBpcyBtb25vc3BhY2UsIGFuZCB0aGF0IGZvbnQKLSAgICAvLyBzaXplIHdh
cyB1bnNwZWNpZmllZC4gV2Ugd2FudCB0byBzY2FsZSBvdXIgZm9udCBzaXplIGFzIGFwcHJvcHJp
YXRlLgotICAgIC8vIElmIHRoZSBmb250IHVzZXMgYSBrZXl3b3JkIHNpemUsIHRoZW4gd2UgcmVm
ZXRjaCBmcm9tIHRoZSB0YWJsZSByYXRoZXIgdGhhbgotICAgIC8vIG11bHRpcGx5aW5nIGJ5IG91
ciBzY2FsZSBmYWN0b3IuCi0gICAgZmxvYXQgc2l6ZTsKLSAgICBpZiAoY2hpbGRGb250LmtleXdv
cmRTaXplKCkpCi0gICAgICAgIHNpemUgPSBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwg
Q1NTVmFsdWVYeFNtYWxsICsgY2hpbGRGb250LmtleXdvcmRTaXplKCkgLSAxLCBjaGlsZEZvbnQu
dXNlRml4ZWREZWZhdWx0U2l6ZSgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgU2V0dGluZ3MqIHNl
dHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOwotICAgICAgICBmbG9hdCBmaXhlZFNjYWxlRmFj
dG9yID0gKHNldHRpbmdzICYmIHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpICYmIHNl
dHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSkKLSAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpKSAvIHNldHRpbmdzLT5kZWZhdWx0
Rm9udFNpemUoKQotICAgICAgICAgICAgOiAxOwotICAgICAgICBzaXplID0gcGFyZW50Rm9udC51
c2VGaXhlZERlZmF1bHRTaXplKCkgPwotICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZp
ZWRTaXplKCkgLyBmaXhlZFNjYWxlRmFjdG9yIDoKLSAgICAgICAgICAgICAgICBjaGlsZEZvbnQu
c3BlY2lmaWVkU2l6ZSgpICogZml4ZWRTY2FsZUZhY3RvcjsKLSAgICB9Ci0KLSAgICBGb250RGVz
Y3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7Ci0gICAgc2V0Rm9udFNpemUo
bmV3Rm9udERlc2NyaXB0aW9uLCBzaXplKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9u
KG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdGlhbGl6
ZUZvbnRTdHlsZShTZXR0aW5ncyogc2V0dGluZ3MpCi17Ci0gICAgRm9udERlc2NyaXB0aW9uIGZv
bnREZXNjcmlwdGlvbjsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250
RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0UmVu
ZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7Ci0gICAgZm9udERlc2Ny
aXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRp
bmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKLSAgICBjb25zdCBBdG9taWNT
dHJpbmcmIHN0YW5kYXJkRm9udEZhbWlseSA9IGRvY3VtZW50U2V0dGluZ3MoKS0+c3RhbmRhcmRG
b250RmFtaWx5KCk7Ci0gICAgaWYgKCFzdGFuZGFyZEZvbnRGYW1pbHkuaXNFbXB0eSgpKSB7Ci0g
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZv
bnRGYW1pbHkpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRG
YW1pbHkoMCk7Ci0gICAgfQotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NW
YWx1ZU1lZGl1bSAtIENTU1ZhbHVlWHhTbWFsbCArIDEpOwotICAgIHNldEZvbnRTaXplKGZvbnRE
ZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlTWVkaXVt
LCBmYWxzZSkpOwotICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHls
ZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci0gICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUo
MCk7Ci0gICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQg
U3R5bGVSZXNvbHZlcjo6c2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRp
b24sIGZsb2F0IHNpemUpCi17Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUo
c2l6ZSk7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNp
emVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCgpLCBtX3N0YXRlLnN0eWxlKCksIGZvbnREZXNj
cmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMoKSkpOwotfQot
Ci1mbG9hdCBTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShE
b2N1bWVudCogZG9jdW1lbnQsIFJlbmRlclN0eWxlKiBzdHlsZSwgYm9vbCBpc0Fic29sdXRlU2l6
ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVsZXMpCi17Ci0gICAgZmxv
YXQgem9vbUZhY3RvciA9IDEuMGY7Ci0gICAgaWYgKCF1c2VTVkdab29tUnVsZXMpIHsKLSAgICAg
ICAgem9vbUZhY3RvciA9IHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0gICAgICAgIGlmIChGcmFt
ZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKSkKLSAgICAgICAgICAgIHpvb21GYWN0b3IgKj0g
ZnJhbWUtPnRleHRab29tRmFjdG9yKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0eWxlUmVzb2x2
ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3VtZW50LCB6b29tRmFjdG9y
LCBpc0Fic29sdXRlU2l6ZSwgc3BlY2lmaWVkU2l6ZSk7Ci19Ci0KLWZsb2F0IFN0eWxlUmVzb2x2
ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwg
ZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6
ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplKQot
ewotICAgIC8vIFRleHQgd2l0aCBhIDBweCBmb250IHNpemUgc2hvdWxkIG5vdCBiZSB2aXNpYmxl
IGFuZCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUKLSAgICAvLyBleGVtcHQgZnJvbSBtaW5pbXVtIGZv
bnQgc2l6ZSBydWxlcy4gQWNpZDMgcmVsaWVzIG9uIHRoaXMgZm9yIHBpeGVsLXBlcmZlY3QKLSAg
ICAvLyByZW5kZXJpbmcuIFRoaXMgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggb3RoZXIgYnJvd3Nl
cnMgdGhhdCBoYXZlIG1pbmltdW0KLSAgICAvLyBmb250IHNpemUgc2V0dGluZ3MgKGUuZy4gRmly
ZWZveCkuCi0gICAgaWYgKGZhYnNmKHNwZWNpZmllZFNpemUpIDwgc3RkOjpudW1lcmljX2xpbWl0
czxmbG9hdD46OmVwc2lsb24oKSkKLSAgICAgICAgcmV0dXJuIDAuMGY7Ci0KLSAgICAvLyBXZSBz
dXBwb3J0IHR3byB0eXBlcyBvZiBtaW5pbXVtIGZvbnQgc2l6ZS4gVGhlIGZpcnN0IGlzIGEgaGFy
ZCBvdmVycmlkZSB0aGF0IGFwcGxpZXMgdG8KLSAgICAvLyBhbGwgZm9udHMuIFRoaXMgaXMgIm1p
blNpemUuIiBUaGUgc2Vjb25kIHR5cGUgb2YgbWluaW11bSBmb250IHNpemUgaXMgYSAic21hcnQg
bWluaW11bSIKLSAgICAvLyB0aGF0IGlzIGFwcGxpZWQgb25seSB3aGVuIHRoZSBXZWIgcGFnZSBj
YW4ndCBrbm93IHdoYXQgc2l6ZSBpdCByZWFsbHkgYXNrZWQgZm9yLCBlLmcuLAotICAgIC8vIHdo
ZW4gaXQgdXNlcyBsb2dpY2FsIHNpemVzIGxpa2UgInNtYWxsIiBvciBleHByZXNzZXMgdGhlIGZv
bnQtc2l6ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YKLSAgICAvLyB0aGUgdXNlcidzIGRlZmF1bHQgZm9u
dCBzZXR0aW5nLgotCi0gICAgLy8gV2l0aCB0aGUgc21hcnQgbWluaW11bSwgd2UgbmV2ZXIgd2Fu
dCB0byBnZXQgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIGZvbnQgc2l6ZSB0byBrZWVwIGZvbnRz
IHJlYWRhYmxlLgotICAgIC8vIEhvd2V2ZXIgd2UgYWx3YXlzIGFsbG93IHRoZSBwYWdlIHRvIHNl
dCBhbiBleHBsaWNpdCBwaXhlbCBzaXplIHRoYXQgaXMgc21hbGxlciwKLSAgICAvLyBzaW5jZSBz
aXRlcyB3aWxsIG1pcy1yZW5kZXIgb3RoZXJ3aXNlIChlLmcuLCBodHRwOi8vd3d3LmdhbWVzcG90
LmNvbSB3aXRoIGEgOXB4IG1pbmltdW0pLgotCi0gICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9j
dW1lbnQtPnNldHRpbmdzKCk7Ci0gICAgaWYgKCFzZXR0aW5ncykKLSAgICAgICAgcmV0dXJuIDEu
MGY7Ci0KLSAgICBpbnQgbWluU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtRm9udFNpemUoKTsKLSAg
ICBpbnQgbWluTG9naWNhbFNpemUgPSBzZXR0aW5ncy0+bWluaW11bUxvZ2ljYWxGb250U2l6ZSgp
OwotICAgIGZsb2F0IHpvb21lZFNpemUgPSBzcGVjaWZpZWRTaXplICogem9vbUZhY3RvcjsKLQot
ICAgIC8vIEFwcGx5IHRoZSBoYXJkIG1pbmltdW0gZmlyc3QuIFdlIG9ubHkgYXBwbHkgdGhlIGhh
cmQgbWluaW11bSBpZiBhZnRlciB6b29taW5nIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbC4KLSAgICBp
ZiAoem9vbWVkU2l6ZSA8IG1pblNpemUpCi0gICAgICAgIHpvb21lZFNpemUgPSBtaW5TaXplOwot
Ci0gICAgLy8gTm93IGFwcGx5IHRoZSAic21hcnQgbWluaW11bS4iIFRoaXMgbWluaW11bSBpcyBh
bHNvIG9ubHkgYXBwbGllZCBpZiB3ZSdyZSBzdGlsbCB0b28gc21hbGwKLSAgICAvLyBhZnRlciB6
b29taW5nLiBUaGUgZm9udCBzaXplIG11c3QgZWl0aGVyIGJlIHJlbGF0aXZlIHRvIHRoZSB1c2Vy
IGRlZmF1bHQgb3IgdGhlIG9yaWdpbmFsIHNpemUKLSAgICAvLyBtdXN0IGhhdmUgYmVlbiBhY2Nl
cHRhYmxlLiBJbiBvdGhlciB3b3Jkcywgd2Ugb25seSBhcHBseSB0aGUgc21hcnQgbWluaW11bSB3
aGVuZXZlciB3ZSdyZSBwb3NpdGl2ZQotICAgIC8vIGRvaW5nIHNvIHdvbid0IGRpc3J1cHQgdGhl
IGxheW91dC4KLSAgICBpZiAodXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUgJiYgem9vbWVkU2l6
ZSA8IG1pbkxvZ2ljYWxTaXplICYmIChzcGVjaWZpZWRTaXplID49IG1pbkxvZ2ljYWxTaXplIHx8
ICFpc0Fic29sdXRlU2l6ZSkpCi0gICAgICAgIHpvb21lZFNpemUgPSBtaW5Mb2dpY2FsU2l6ZTsK
LQotICAgIC8vIEFsc28gY2xhbXAgdG8gYSByZWFzb25hYmxlIG1heGltdW0gdG8gcHJldmVudCBp
bnNhbmUgZm9udCBzaXplcyBmcm9tIGNhdXNpbmcgY3Jhc2hlcyBvbiB2YXJpb3VzCi0gICAgLy8g
cGxhdGZvcm1zIChJJ20gbG9va2luZyBhdCB5b3UsIFdpbmRvd3MuKQotICAgIHJldHVybiBtaW4o
bWF4aW11bUFsbG93ZWRGb250U2l6ZSwgem9vbWVkU2l6ZSk7Ci19Ci0KLWNvbnN0IGludCBmb250
U2l6ZVRhYmxlTWF4ID0gMTY7Ci1jb25zdCBpbnQgZm9udFNpemVUYWJsZU1pbiA9IDk7Ci1jb25z
dCBpbnQgdG90YWxLZXl3b3JkcyA9IDg7Ci0KLS8vIFdpbklFL05hdjQgdGFibGUgZm9yIGZvbnQg
c2l6ZXMuIERlc2lnbmVkIHRvIG1hdGNoIHRoZSBsZWdhY3kgZm9udCBtYXBwaW5nIHN5c3RlbSBv
ZiBIVE1MLgotc3RhdGljIGNvbnN0IGludCBxdWlya3NGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFi
bGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQotewotICAgICAg
eyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI4IH0sCi0g
ICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzEg
fSwKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAg
ICAzNCB9LAotICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAg
MjQsICAgIDM3IH0sCi0gICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMywgICAgMTYsICAgIDIw
LCAgICAyNiwgICAgNDAgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKLSAgICAgIHsgOSwg
ICAgOSwgICAgMTEsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAotICAgICAg
eyA5LCAgIDEwLCAgICAxMiwgICAgMTUsICAgIDE3LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCi0g
ICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDgg
fSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBIVE1MICAgICAgIDEg
ICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8vIENTUyAgeHhzICAg
eHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAgICAgICAgICAgICAg
ICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgotCi0vLyBTdHJp
Y3QgbW9kZSB0YWJsZSBtYXRjaGVzIE1hY0lFIGFuZCBNb3ppbGxhJ3Mgc2V0dGluZ3MgZXhhY3Rs
eS4KLXN0YXRpYyBjb25zdCBpbnQgc3RyaWN0Rm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4
IC0gZm9udFNpemVUYWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KLXsKLSAgICAgIHsgOSwg
ICAgOSwgICAgIDksICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyNyB9LAotICAgICAg
eyA5LCAgICA5LCAgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMwIH0sCi0g
ICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzMg
fSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAg
ICAzNiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTMsICAgIDE2LCAgICAyMCwgICAg
MjYsICAgIDM5IH0sIC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCi0gICAgICB7IDksICAgMTAs
ICAgIDEyLCAgICAxNCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKLSAgICAgIHsgOSwg
ICAxMCwgICAgMTMsICAgIDE1LCAgICAxOCwgICAgMjMsICAgIDMwLCAgICA0NSB9LAotICAgICAg
eyA5LCAgIDEwLCAgICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8g
cHJvcG9ydGlvbmFsIGZvbnQgZGVmYXVsdCAoMTYpCi19OwotLy8gSFRNTCAgICAgICAxICAgICAg
MiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3Ci0vLyBDU1MgIHh4cyAgIHhzICAg
ICBzICAgICAgbSAgICAgIGwgICAgIHhsICAgICB4eGwKLS8vICAgICAgICAgICAgICAgICAgICAg
ICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKLQotLy8gRm9yIHZhbHVl
cyBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgdGFibGUsIHdlIHVzZSBUb2RkIEZhaHJuZXIncyBz
dWdnZXN0ZWQgc2NhbGUKLS8vIGZhY3RvcnMgZm9yIGVhY2gga2V5d29yZCB2YWx1ZS4KLXN0YXRp
YyBjb25zdCBmbG9hdCBmb250U2l6ZUZhY3RvcnNbdG90YWxLZXl3b3Jkc10gPSB7IDAuNjBmLCAw
Ljc1ZiwgMC44OWYsIDEuMGYsIDEuMmYsIDEuNWYsIDIuMGYsIDMuMGYgfTsKLQotZmxvYXQgU3R5
bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiBkb2N1bWVudCwgaW50IGtl
eXdvcmQsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKLXsKLSAgICBTZXR0aW5ncyog
c2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAg
ICAgICByZXR1cm4gMS4wZjsKLQotICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1
aXJrc01vZGUoKTsKLSAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNp
emUgPyBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0
Rm9udFNpemUoKTsKLSAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1l
ZGl1bVNpemUgPD0gZm9udFNpemVUYWJsZU1heCkgewotICAgICAgICAvLyBMb29rIHVwIHRoZSBl
bnRyeSBpbiB0aGUgdGFibGUuCi0gICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNp
emVUYWJsZU1pbjsKLSAgICAgICAgaW50IGNvbCA9IChrZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxs
KTsKLSAgICAgICAgcmV0dXJuIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRhYmxlW3Jvd11b
Y29sXSA6IHN0cmljdEZvbnRTaXplVGFibGVbcm93XVtjb2xdOwotICAgIH0KLQotICAgIC8vIFZh
bHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZS4gQXBwbHkgdGhlIHNjYWxlIGZh
Y3RvciBpbnN0ZWFkLgotICAgIGZsb2F0IG1pbkxvZ2ljYWxTaXplID0gbWF4KHNldHRpbmdzLT5t
aW5pbXVtTG9naWNhbEZvbnRTaXplKCksIDEpOwotICAgIHJldHVybiBtYXgoZm9udFNpemVGYWN0
b3JzW2tleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGxdKm1lZGl1bVNpemUsIG1pbkxvZ2ljYWxTaXpl
KTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbnQgZmluZE5lYXJlc3RMZWdh
Y3lGb250U2l6ZShpbnQgcGl4ZWxGb250U2l6ZSwgY29uc3QgVCogdGFibGUsIGludCBtdWx0aXBs
aWVyKQotewotICAgIC8vIElnbm9yZSB0YWJsZVswXSBiZWNhdXNlIHh4LXNtYWxsIGRvZXMgbm90
IGNvcnJlc3BvbmQgdG8gYW55IGxlZ2FjeSBmb250IHNpemUuCi0gICAgZm9yIChpbnQgaSA9IDE7
IGkgPCB0b3RhbEtleXdvcmRzIC0gMTsgaSsrKSB7Ci0gICAgICAgIGlmIChwaXhlbEZvbnRTaXpl
ICogMiA8ICh0YWJsZVtpXSArIHRhYmxlW2kgKyAxXSkgKiBtdWx0aXBsaWVyKQotICAgICAgICAg
ICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIHJldHVybiB0b3RhbEtleXdvcmRzIC0gMTsKLX0KLQot
aW50IFN0eWxlUmVzb2x2ZXI6OmxlZ2FjeUZvbnRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgaW50
IHBpeGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSkKLXsKLSAgICBT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNldHRp
bmdzKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50
LT5pblF1aXJrc01vZGUoKTsKLSAgICBpbnQgbWVkaXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVm
YXVsdFNpemUgPyBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5k
ZWZhdWx0Rm9udFNpemUoKTsKLSAgICBpZiAobWVkaXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWlu
ICYmIG1lZGl1bVNpemUgPD0gZm9udFNpemVUYWJsZU1heCkgewotICAgICAgICBpbnQgcm93ID0g
bWVkaXVtU2l6ZSAtIGZvbnRTaXplVGFibGVNaW47Ci0gICAgICAgIHJldHVybiBmaW5kTmVhcmVz
dExlZ2FjeUZvbnRTaXplPGludD4ocGl4ZWxGb250U2l6ZSwgcXVpcmtzTW9kZSA/IHF1aXJrc0Zv
bnRTaXplVGFibGVbcm93XSA6IHN0cmljdEZvbnRTaXplVGFibGVbcm93XSwgMSk7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9udFNpemU8ZmxvYXQ+KHBpeGVsRm9udFNp
emUsIGZvbnRTaXplRmFjdG9ycywgbWVkaXVtU2l6ZSk7Ci19Ci0KLXN0YXRpYyBDb2xvciBjb2xv
ckZvckNTU1ZhbHVlKGludCBjc3NWYWx1ZUlkKQotewotICAgIHN0cnVjdCBDb2xvclZhbHVlIHsK
LSAgICAgICAgaW50IGNzc1ZhbHVlSWQ7Ci0gICAgICAgIFJHQkEzMiBjb2xvcjsKLSAgICB9Owot
Ci0gICAgc3RhdGljIGNvbnN0IENvbG9yVmFsdWUgY29sb3JWYWx1ZXNbXSA9IHsKLSAgICAgICAg
eyBDU1NWYWx1ZUFxdWEsIDB4RkYwMEZGRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUJsYWNrLCAw
eEZGMDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVCbHVlLCAweEZGMDAwMEZGIH0sCi0gICAg
ICAgIHsgQ1NTVmFsdWVGdWNoc2lhLCAweEZGRkYwMEZGIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVH
cmF5LCAweEZGODA4MDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVHcmVlbiwgMHhGRjAwODAwMCAg
fSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZXksIDB4RkY4MDgwODAgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZUxpbWUsIDB4RkYwMEZGMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZU1hcm9vbiwgMHhGRjgw
MDAwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTmF2eSwgMHhGRjAwMDA4MCB9LAotICAgICAgICB7
IENTU1ZhbHVlT2xpdmUsIDB4RkY4MDgwMDAgIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVPcmFuZ2Us
IDB4RkZGRkE1MDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVB1cnBsZSwgMHhGRjgwMDA4MCB9LAot
ICAgICAgICB7IENTU1ZhbHVlUmVkLCAweEZGRkYwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVT
aWx2ZXIsIDB4RkZDMEMwQzAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVRlYWwsIDB4RkYwMDgwODAg
IH0sCi0gICAgICAgIHsgQ1NTVmFsdWVUcmFuc3BhcmVudCwgMHgwMDAwMDAwMCB9LAotICAgICAg
ICB7IENTU1ZhbHVlV2hpdGUsIDB4RkZGRkZGRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVllbGxv
dywgMHhGRkZGRkYwMCB9LAotICAgICAgICB7IDAsIDAgfQotICAgIH07Ci0KLSAgICBmb3IgKGNv
bnN0IENvbG9yVmFsdWUqIGNvbCA9IGNvbG9yVmFsdWVzOyBjb2wtPmNzc1ZhbHVlSWQ7ICsrY29s
KSB7Ci0gICAgICAgIGlmIChjb2wtPmNzc1ZhbHVlSWQgPT0gY3NzVmFsdWVJZCkKLSAgICAgICAg
ICAgIHJldHVybiBjb2wtPmNvbG9yOwotICAgIH0KLSAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmRl
ZmF1bHRUaGVtZSgpLT5zeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKLX0KLQotYm9vbCBTdHlsZVJl
c29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1By
aW1pdGl2ZVZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0SWRlbnQo
KTsKLSAgICBzd2l0Y2ggKGlkZW50KSB7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6Ci0g
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2
ZWxpbms6Ci0gICAgY2FzZSBDU1NWYWx1ZUN1cnJlbnRjb2xvcjoKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotQ29s
b3IgU3R5bGVSZXNvbHZlcjo6Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFs
dWUqIHZhbHVlLCBib29sIGZvclZpc2l0ZWRMaW5rKSBjb25zdAotewotICAgIGlmICh2YWx1ZS0+
aXNSR0JDb2xvcigpKQotICAgICAgICByZXR1cm4gQ29sb3IodmFsdWUtPmdldFJHQkEzMlZhbHVl
KCkpOwotCi0gICAgY29uc3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpbnQgaWRlbnQg
PSB2YWx1ZS0+Z2V0SWRlbnQoKTsKLSAgICBzd2l0Y2ggKGlkZW50KSB7Ci0gICAgY2FzZSAwOgot
ICAgICAgICByZXR1cm4gQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKLSAg
ICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPnRleHRDb2xvcigpOwotICAgIGNhc2UgQ1NT
VmFsdWVXZWJraXRMaW5rOgotICAgICAgICByZXR1cm4gKHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5r
KCkgJiYgZm9yVmlzaXRlZExpbmspID8gc3RhdGUuZG9jdW1lbnQoKS0+dmlzaXRlZExpbmtDb2xv
cigpIDogc3RhdGUuZG9jdW1lbnQoKS0+bGlua0NvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdl
YmtpdEFjdGl2ZWxpbms6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5kb2N1bWVudCgpLT5hY3RpdmVM
aW5rQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0Rm9jdXNSaW5nQ29sb3I6Ci0gICAg
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6Zm9jdXNSaW5nQ29sb3IoKTsKLSAgICBjYXNlIENTU1Zh
bHVlQ3VycmVudGNvbG9yOgotICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsK
LSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gY29sb3JGb3JDU1NWYWx1ZShpZGVudCk7Ci0g
ICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFR
dWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwKiBleHByLCBib29sIHJlc3VsdCkKLXsKLSAg
ICBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuYXBwZW5kKGFkb3B0UHRyKG5l
dyBNZWRpYVF1ZXJ5UmVzdWx0KCpleHByLCByZXN1bHQpKSk7Ci19Ci0KLWJvb2wgU3R5bGVSZXNv
bHZlcjo6YWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3QKLXsKLSAgICB1bnNpZ25lZCBz
ID0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLnNpemUoKTsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0gICAgICAgIGlmIChtX21lZGl1bS0+ZXZh
bCgmbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX2V4cHJlc3Npb24p
ICE9IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9yZXN1bHQpCi0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1z
dGF0aWMgVHJhbnNmb3JtT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGdldFRyYW5zZm9ybU9wZXJh
dGlvblR5cGUoV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zZm9ybU9wZXJhdGlvblR5cGUg
dHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6U0NBTEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNm
b3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9YOwotICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246OlNDQUxFX1o7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUz
RFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfM0Q7
Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEU7Ci0gICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJh
dGlvbjo6VFJBTlNMQVRFX1o7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJh
bnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRS
QU5TTEFURV8zRDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURTsKLSAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpST1RBVEVfWTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpS
b3RhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RB
VEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFXzNEOwotICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVc7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
OlNLRVdfWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19ZOwotICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJu
IFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6Ok1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpNQVRSSVhfM0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3Bl
Y3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlBFUlNQ
RUNUSVZFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFuc2Zv
cm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok5PTkU7Ci0gICAgfQotICAg
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok5PTkU7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZl
cjo6Y3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5
bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBv
dXRPcGVyYXRpb25zKQotewotICAgIGlmICghaW5WYWx1ZSB8fCAhaW5WYWx1ZS0+aXNWYWx1ZUxp
c3QoKSkgewotICAgICAgICBvdXRPcGVyYXRpb25zLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZm
ZWN0aXZlWm9vbSgpIDogMTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0g
ICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGku
YWR2YW5jZSgpKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0K
LSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKiB0
cmFuc2Zvcm1WYWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKj4oaS52
YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLQotICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZh
bHNlOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgdHJhbnNmb3JtVmFsdWUtPmxl
bmd0aCgpOyArK2opIHsKLSAgICAgICAgICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAg
IGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1
ZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBm
aXJzdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7Ci0KLSAgICAgICAgc3dpdGNoICh0cmFuc2Zv
cm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAg
ICAgICAgICAgZG91YmxlIHN4ID0gMS4wOwotICAgICAgICAgICAgZG91YmxlIHN5ID0gMS4wOwot
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAg
ICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0g
ICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAg
ICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5n
ZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3Jt
T3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCAxLjAsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUo
dHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRy
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2NhbGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIHN4ID0gMS4w
OwotICAgICAgICAgICAgZG91YmxlIHN5ID0gMS4wOwotICAgICAgICAgICAgZG91YmxlIHN6ID0g
MS4wOwotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0g
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICBzeiA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAg
ICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAg
c3kgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeiA9IHRoaXJkVmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
LSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzeSA9
IHN4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wZXJh
dGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRl
KHN4LCBzeSwgc3osIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9w
ZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5z
Zm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJh
bnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgTGVuZ3RoIHR4ID0gTGVu
Z3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgwLCBGaXhlZCk7
Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCBy
b290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxl
LCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9y
bU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxl
bmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxl
LCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHku
aXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1PcGVy
YXRpb246OmNyZWF0ZSh0eCwgdHksIExlbmd0aCgwLCBGaXhlZCksIGdldFRyYW5zZm9ybU9wZXJh
dGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlRyYW5zbGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAg
ICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0g
TGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIExlbmd0aCB0eiA9IExlbmd0aCgwLCBGaXhl
ZCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbikKLSAg
ICAgICAgICAgICAgICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxl
LCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3Jt
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNs
YXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zs
b2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAg
ICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0
aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgewotICAgICAgICAgICAg
ICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgo
dGhpcmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNv
bmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHkg
PSBjb252ZXJ0VG9GbG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5k
ZWZpbmVkKCkgfHwgdHouaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xh
dGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh0eCwgdHksIHR6LCBnZXRUcmFuc2Zvcm1PcGVy
YXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9
IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoMCwgMCwg
MSwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246Ci0g
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVy
YXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFu
c2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSB4ID0gMDsKLSAgICAgICAgICAg
IGRvdWJsZSB5ID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSB6ID0gMDsKLSAgICAgICAgICAgIGRv
dWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0KLSAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHggPSAx
OwotICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9
PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAg
ICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB6
ID0gMTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVU
cmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3Bl
cmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6Um90YXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCkgPCA0KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0g
ICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MikpOwotICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZvdXJ0aFZhbHVlID0gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygzKSk7Ci0gICAgICAgICAgICBkb3VibGUgeCA9IGZpcnN0VmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVW
YWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIHogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZm91cnRoVmFsdWUtPmNvbXB1dGVEZWdy
ZWVzKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRl
VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9w
ZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNrZXdYVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAg
ZG91YmxlIGFuZ2xlWCA9IDA7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGVZID0gMDsKLSAgICAg
ICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0gICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAg
YW5nbGVZID0gYW5nbGU7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbmds
ZVggPSBhbmdsZTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlv
blR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlv
bikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4g
MSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZVkg
PSBzZWNvbmRWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGVY
LCBhbmdsZVksIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogewot
ICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA8IDYpCi0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkb3VibGUgYSA9IGZpcnN0VmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgYiA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXRE
b3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGMgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+
Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBkID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygz
KSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUgZSA9IHpvb21GYWN0b3Ig
KiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJs
ZSBmID0gem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNm
b3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpOwot
ICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeFRyYW5zZm9y
bU9wZXJhdGlvbjo6Y3JlYXRlKGEsIGIsIGMsIGQsIGUsIGYpKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJp
eDNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUt
Pmxlbmd0aCgpIDwgMTYpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXgoc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0
cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSktPmdldERvdWJsZVZhbHVl
KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdl
dERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygyKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygzKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
Pih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZh
bHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg2KSkt
PmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjayg3KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayg4KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg5KSktPmdldERvdWJsZVZhbHVlKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMCkpLT5nZXREb3Vi
bGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MTEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6
b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMikpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEzKSkt
PmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxNCkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTUpKS0+Z2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgICAgICAg
ICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRp
b246OmNyZWF0ZShtYXRyaXgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3Bl
cmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5ndGggcCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAg
ICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNMZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBwID0g
Y29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZh
Y3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEg
cXVpcmsgdGhhdCBzaG91bGQgZ28gYXdheSB3aGVuIDNkIHRyYW5zZm9ybXMgYXJlIGZpbmFsaXpl
ZC4KLSAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFs
dWUoKTsKLSAgICAgICAgICAgICAgICBwID0gdmFsID49IDAgPyBMZW5ndGgoY2xhbXBUb1Bvc2l0
aXZlSW50ZWdlcih2YWwpLCBGaXhlZCkgOiBMZW5ndGgoVW5kZWZpbmVkKTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgaWYgKHAuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVu
ZChQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHApKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlVua25vd25UcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb3V0T3Bl
cmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBFTkFCTEUo
Q1NTX0ZJTFRFUlMpCi1zdGF0aWMgRmlsdGVyT3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIGZpbHRl
ck9wZXJhdGlvbkZvclR5cGUoV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkZpbHRlck9wZXJhdGlvblR5
cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRl
clZhbHVlOjpSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OlJFRkVSRU5DRTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5
c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkdS
QVlTQ0FMRTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJh
dGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6U0VQSUE7Ci0gICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJl
dHVybiBGaWx0ZXJPcGVyYXRpb246OlNBVFVSQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6SFVFX1JPVEFURTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZl
cnRGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OklOVkVS
VDsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpPUEFDSVRZOwotICAgIGNhc2UgV2Vi
S2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJl
dHVybiBGaWx0ZXJPcGVyYXRpb246OkJSSUdIVE5FU1M7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0
ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJP
cGVyYXRpb246OkNPTlRSQVNUOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJG
aWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkJMVVI7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjoK
LSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6RFJPUF9TSEFET1c7Ci0jaWYgRU5BQkxF
KENTU19TSEFERVJTKQotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkN1c3RvbUZpbHRl
ck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9NOwotI2Vu
ZGlmCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlv
bjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Tk9ORTsKLSAgICB9Ci0gICAgcmV0
dXJuIEZpbHRlck9wZXJhdGlvbjo6Tk9ORTsKLX0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdTVkdEb2N1bWVu
dHMoKQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgaWYgKCFzdGF0ZS5zdHls
ZSgpLT5oYXNGaWx0ZXIoKSB8fCBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuaXNFbXB0eSgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVz
b3VyY2VMb2FkZXIgPSBzdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOwot
ICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0g
c3RhdGUuc3R5bGUoKS0+bXV0YWJsZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgZmlsdGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgewotICAgICAg
ICBSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRp
b25zLmF0KGkpOwotICAgICAgICBpZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBl
KCkgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIFJlZmVyZW5j
ZUZpbHRlck9wZXJhdGlvbiogcmVmZXJlbmNlRmlsdGVyID0gc3RhdGljX2Nhc3Q8UmVmZXJlbmNl
RmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9uLmdldCgpKTsKLQotICAgICAgICAgICAg
V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSogdmFsdWUgPSBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1l
bnRzKCkuZ2V0KHJlZmVyZW5jZUZpbHRlcikuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoIXZhbHVl
KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ2FjaGVkU1ZHRG9jdW1l
bnQqIGNhY2hlZERvY3VtZW50ID0gdmFsdWUtPmxvYWQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwot
ICAgICAgICAgICAgaWYgKCFjYWNoZWREb2N1bWVudCkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLQotICAgICAgICAgICAgLy8gU3Rhc2ggdGhlIENhY2hlZFNWR0RvY3VtZW50IG9uIHRoZSBy
ZWZlcmVuY2UgZmlsdGVyLgotICAgICAgICAgICAgcmVmZXJlbmNlRmlsdGVyLT5zZXRDYWNoZWRT
VkdEb2N1bWVudFJlZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVu
Y2UoY2FjaGVkRG9jdW1lbnQpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3RhdGUucGVuZGlu
Z1NWR0RvY3VtZW50cygpLmNsZWFyKCk7Ci19Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLVN0eWxlU2hhZGVyKiBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYWRlcihDU1NWYWx1ZSog
dmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1dlYktpdENTU1NoYWRlclZhbHVlKCkpCi0gICAg
ICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShzdGF0aWNfY2Fz
dDxXZWJLaXRDU1NTaGFkZXJWYWx1ZSo+KHZhbHVlKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVN0
eWxlU2hhZGVyKiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21W
YWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSogdmFsdWUpCi17Ci0gICAgU3R5bGVTaGFkZXIqIHNo
YWRlciA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdTaGFkZXIoKTsKLSAgICBpZiAoc2hhZGVyICYm
IHNoYWRlci0+aXNQZW5kaW5nU2hhZGVyKCkpCi0gICAgICAgIG1fc3RhdGUuc2V0SGFzUGVuZGlu
Z1NoYWRlcnModHJ1ZSk7Ci0gICAgcmV0dXJuIHNoYWRlcjsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpsb2FkUGVuZGluZ1NoYWRlcnMoKQotewotICAgIGlmICghbV9zdGF0ZS5zdHlsZSgpLT5o
YXNGaWx0ZXIoKSB8fCAhbV9zdGF0ZS5oYXNQZW5kaW5nU2hhZGVycygpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBt
X3N0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7Ci0KLSAgICBWZWN0b3I8
UmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IG1fc3RhdGUuc3R5
bGUoKS0+bXV0YWJsZUZpbHRlcigpLm9wZXJhdGlvbnMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgZmlsdGVyT3BlcmF0aW9ucy5zaXplKCk7ICsraSkgewotICAgICAgICBSZWZQdHI8
RmlsdGVyT3BlcmF0aW9uPiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkp
OwotICAgICAgICBpZiAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmls
dGVyT3BlcmF0aW9uOjpDVVNUT00pIHsKLSAgICAgICAgICAgIEN1c3RvbUZpbHRlck9wZXJhdGlv
biogY3VzdG9tRmlsdGVyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKj4oZmls
dGVyT3BlcmF0aW9uLmdldCgpKTsKLSAgICAgICAgICAgIEFTU0VSVChjdXN0b21GaWx0ZXItPnBy
b2dyYW0oKSk7Ci0gICAgICAgICAgICBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qIHByb2dyYW0g
PSBzdGF0aWNfY2FzdDxTdHlsZUN1c3RvbUZpbHRlclByb2dyYW0qPihjdXN0b21GaWx0ZXItPnBy
b2dyYW0oKSk7Ci0gICAgICAgICAgICBpZiAocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkgJiYgcHJv
Z3JhbS0+dmVydGV4U2hhZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAg
ICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQ
ZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgp
OwotICAgICAgICAgICAgICAgIHByb2dyYW0tPnNldFZlcnRleFNoYWRlcihzaGFkZXJWYWx1ZS0+
Y2FjaGVkU2hhZGVyKGNhY2hlZFJlc291cmNlTG9hZGVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBpZiAocHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSAmJiBwcm9ncmFtLT5mcmFnbWVu
dFNoYWRlcigpLT5pc1BlbmRpbmdTaGFkZXIoKSkgewotICAgICAgICAgICAgICAgIFdlYktpdENT
U1NoYWRlclZhbHVlKiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRl
cio+KHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOwotICAgICAg
ICAgICAgICAgIHByb2dyYW0tPnNldEZyYWdtZW50U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRT
aGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgIH0KLSAgICBtX3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKTsKLX0KLQotc3Rh
dGljIGJvb2wgc29ydFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKGNvbnN0IFJlZlB0cjxDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI+JiBhLCBjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVy
PiYgYikKLXsKLSAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZUxlc3NUaGFuKGEtPm5hbWUoKSwg
Yi0+bmFtZSgpKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxl
UmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBu
YW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKLXsKLSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyQXJy
YXlQYXJhbWV0ZXI+IGFycmF5UGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI6
OmNyZWF0ZShuYW1lKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBsZW5ndGggPSB2YWx1ZXMt
Pmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICAgICAgQ1NTVmFsdWUqIHZhbHVlID0g
dmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwotICAgICAgICBpZiAoIXZhbHVlLT5p
c1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih2YWx1ZSk7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgp
ICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICAgICAgcmV0dXJuIDA7
Ci0gICAgICAgIGFycmF5UGFyYW1ldGVyLT5hZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBhcnJheVBhcmFtZXRlci5yZWxlYXNlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpw
YXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1Zh
bHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0
ZXI+IG51bWJlclBhcmFtZXRlciA9IEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcjo6Y3JlYXRl
KG5hbWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB2YWx1ZXMtPmxlbmd0aCgpOyAr
K2kpIHsKLSAgICAgICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKGkpOwotICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpD
U1NfTlVNQkVSKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG51bWJlclBhcmFtZXRl
ci0+YWRkVmFsdWUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCkpOwotICAgIH0KLSAg
ICByZXR1cm4gbnVtYmVyUGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNm
b3JtUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCi17
Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcj4gdHJhbnNmb3JtUGFy
YW1ldGVyID0gQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0g
ICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgIGNyZWF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbnModmFsdWVzLCBtX3N0YXRlLnN0eWxlKCksIG1fc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpLCBvcGVyYXRpb25zKTsKLSAgICB0cmFuc2Zvcm1QYXJhbWV0ZXItPnNldE9wZXJhdGlvbnMo
b3BlcmF0aW9ucyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybVBhcmFtZXRlci5yZWxlYXNlKCk7Ci19
Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJz
ZUN1c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKiBwYXJh
bWV0ZXJWYWx1ZSkKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IG90aGVyIHBhcmFtZXRlcnMg
dHlwZXMgcGFyc2luZy4KLSAgICAvLyBib29sZWFuczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTc2NDM4Ci0gICAgLy8gdGV4dHVyZXM6IGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTQ0MgotICAgIC8vIG1hdDIsIG1hdDMsIG1hdDQ6IGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTQ0NAotICAgIC8vIE51bWJl
ciBwYXJhbWV0ZXJzIGFyZSB3cmFwcGVkIGluc2lkZSBhIENTU1ZhbHVlTGlzdCBhbmQgYWxsCi0g
ICAgLy8gdGhlIG90aGVyIGZ1bmN0aW9ucyB2YWx1ZXMgaW5oZXJpdCBmcm9tIENTU1ZhbHVlTGlz
dC4KLSAgICBpZiAoIXBhcmFtZXRlclZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIENTU1ZhbHVlTGlzdCogdmFsdWVzID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVM
aXN0Kj4ocGFyYW1ldGVyVmFsdWUpOwotICAgIGlmICghdmFsdWVzLT5sZW5ndGgoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAocGFyYW1ldGVyVmFsdWUtPmlzV2ViS2l0Q1NTQXJyYXlG
dW5jdGlvblZhbHVlKCkpCi0gICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFy
YW1ldGVyKG5hbWUsIHZhbHVlcyk7Ci0KLSAgICAvLyBJZiB0aGUgZmlyc3QgdmFsdWUgb2YgdGhl
IGxpc3QgaXMgYSB0cmFuc2Zvcm0gZnVuY3Rpb24sCi0gICAgLy8gdGhlbiB3ZSBjb3VsZCBzYWZl
bHkgYXNzdW1lIHRoYXQgYWxsIHRoZSByZW1haW5pbmcgaXRlbXMKLSAgICAvLyBhcmUgdHJhbnNm
b3Jtcy4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIgd2lsbAotICAgIC8vIHJl
dHVybiAwIGlmIHRoYXQgYXNzdW1wdGlvbiBpcyBpbmNvcnJlY3QuCi0gICAgaWYgKHZhbHVlcy0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQot
ICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIobmFtZSwg
dmFsdWVzKTsKLQotICAgIC8vIFdlIGNhbiBoYXZlIG9ubHkgYXJyYXlzIG9mIGJvb2xlYW5zIG9y
IG51bWJlcnMsIHNvIHVzZSB0aGUgZmlyc3QgdmFsdWUgdG8gY2hvb3NlIGJldHdlZW4gdGhvc2Ug
dHdvLgotICAgIC8vIFdlIG5lZWQgdXAgdG8gNCB2YWx1ZXMgKGFsbCBib29sZWFucyBvciBhbGwg
bnVtYmVycykuCi0gICAgaWYgKCF2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlz
UHJpbWl0aXZlVmFsdWUoKSB8fCB2YWx1ZXMtPmxlbmd0aCgpID4gNCkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgCi0gICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0UHJpbWl0aXZlVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygwKSk7Ci0gICAgaWYgKGZpcnN0UHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA9
PSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3Vz
dG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7Ci0KLSAgICAvLyBGSVhNRTog
SW1wbGVtZW50IHRoZSBib29sZWFuIGFycmF5IHBhcmFtZXRlciBoZXJlLgotICAgIC8vIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03NjQzOAotCi0gICAgcmV0dXJuIDA7
Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0
KENTU1ZhbHVlKiBwYXJhbWV0ZXJzVmFsdWUsIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmIHBh
cmFtZXRlckxpc3QpCi17Ci0gICAgSGFzaFNldDxTdHJpbmc+IGtub3duUGFyYW1ldGVyTmFtZXM7
Ci0gICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgcGFyYW1ldGVySXRlcmF0b3IocGFyYW1ldGVyc1Zh
bHVlKTsKLSAgICBmb3IgKDsgcGFyYW1ldGVySXRlcmF0b3IuaGFzTW9yZSgpOyBwYXJhbWV0ZXJJ
dGVyYXRvci5hZHZhbmNlKCkpIHsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXJJdGVyYXRvci52YWx1
ZSgpLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBD
U1NWYWx1ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpKTsK
LSAgICAgICAgaWYgKCFpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZh
bHVlOjpDU1NfU1RSSU5HKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAg
ICAgICAgU3RyaW5nIG5hbWUgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAg
ICAgICAgLy8gRG8gbm90IGFsbG93IGR1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZXMuCi0gICAgICAg
IGlmIChrbm93blBhcmFtZXRlck5hbWVzLmNvbnRhaW5zKG5hbWUpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICBrbm93blBhcmFtZXRlck5hbWVzLmFkZChuYW1lKTsKLSAgICAg
ICAgCi0gICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICgh
aXRlcmF0b3IuaGFzTW9yZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAK
LSAgICAgICAgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyYW1ldGVyID0gcGFyc2VD
dXN0b21GaWx0ZXJQYXJhbWV0ZXIobmFtZSwgaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgIGlm
ICghcGFyYW1ldGVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBwYXJhbWV0
ZXJMaXN0LmFwcGVuZChwYXJhbWV0ZXIucmVsZWFzZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8g
TWFrZSBzdXJlIHdlIHNvcnQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHBhc3NpbmcgdGhlbSBkb3du
IHRvIHRoZSBDdXN0b21GaWx0ZXJPcGVyYXRpb24uCi0gICAgc3RkOjpzb3J0KHBhcmFtZXRlckxp
c3QuYmVnaW4oKSwgcGFyYW1ldGVyTGlzdC5lbmQoKSwgc29ydFBhcmFtZXRlcnNCeU5hbWVDb21w
YXJhdG9yKTsKLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlv
bldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZh
bHVlKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgc3R5bGUgcmVzb2x1dGlvbiBmb3IgdGhl
IGN1c3RvbSBmaWx0ZXIgYXQtcnVsZSByZWZlcmVuY2Ugc3ludGF4LgotICAgIFVOVVNFRF9QQVJB
TShmaWx0ZXJWYWx1ZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmls
dGVyT3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25X
aXRoSW5saW5lU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAg
ICBDU1NWYWx1ZSogc2hhZGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRz
Q2hlY2soMCk7Ci0gICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2hhZGVyc1Zh
bHVlLT5pc1ZhbHVlTGlzdCgpKTsKLSAgICBDU1NWYWx1ZUxpc3QqIHNoYWRlcnNMaXN0ID0gc3Rh
dGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4oc2hhZGVyc1ZhbHVlKTsKLQotICAgIHVuc2lnbmVkIHNo
YWRlcnNMaXN0TGVuZ3RoID0gc2hhZGVyc0xpc3QtPmxlbmd0aCgpOwotICAgIEFTU0VSVChzaGFk
ZXJzTGlzdExlbmd0aCk7Ci0KLSAgICBSZWZQdHI8U3R5bGVTaGFkZXI+IHZlcnRleFNoYWRlciA9
IHN0eWxlU2hhZGVyKHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLSAg
ICBSZWZQdHI8U3R5bGVTaGFkZXI+IGZyYWdtZW50U2hhZGVyOwotICAgIEN1c3RvbUZpbHRlclBy
b2dyYW1UeXBlIHByb2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX0JMRU5EU19FTEVNRU5UX1RFWFRV
UkU7Ci0gICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbU1peFNldHRpbmdzIG1peFNldHRpbmdzOwotCi0g
ICAgaWYgKHNoYWRlcnNMaXN0TGVuZ3RoID4gMSkgewotICAgICAgICBDU1NWYWx1ZSogZnJhZ21l
bnRTaGFkZXJPck1peEZ1bmN0aW9uID0gc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMSk7Ci0KLSAgICAgICAgaWYgKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbi0+aXNXZWJL
aXRDU1NNaXhGdW5jdGlvblZhbHVlKCkpIHsKLSAgICAgICAgICAgIFdlYktpdENTU01peEZ1bmN0
aW9uVmFsdWUqIG1peEZ1bmN0aW9uID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZSo+KGZyYWdtZW50U2hhZGVyT3JNaXhGdW5jdGlvbik7Ci0gICAgICAgICAgICBDU1NWYWx1
ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihtaXhGdW5jdGlvbik7Ci0KLSAgICAgICAgICAgIEFTU0VS
VChtaXhGdW5jdGlvbi0+bGVuZ3RoKCkpOwotICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBz
dHlsZVNoYWRlcihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFu
Y2UoKTsKLQotICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9uLT5sZW5ndGgoKSA8PSAzKTsK
LSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNNb3JlKCkpIHsKLSAgICAgICAgICAgICAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGlmIChDU1NQ
YXJzZXI6OmlzQmxlbmRNb2RlKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSkKLSAgICAgICAg
ICAgICAgICAgICAgbWl4U2V0dGluZ3MuYmxlbmRNb2RlID0gKnByaW1pdGl2ZVZhbHVlOwotICAg
ICAgICAgICAgICAgIGVsc2UgaWYgKENTU1BhcnNlcjo6aXNDb21wb3NpdGVPcGVyYXRvcihwcmlt
aXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkpCi0gICAgICAgICAgICAgICAgICAgIG1peFNldHRpbmdz
LmNvbXBvc2l0ZU9wZXJhdG9yID0gKnByaW1pdGl2ZVZhbHVlOwotICAgICAgICAgICAgICAgIGVs
c2UKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAg
ICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfTk9fRUxFTUVOVF9URVhU
VVJFOwotICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihmcmFnbWVudFNo
YWRlck9yTWl4RnVuY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHVuc2lnbmVk
IG1lc2hSb3dzID0gMTsKLSAgICB1bnNpZ25lZCBtZXNoQ29sdW1ucyA9IDE7Ci0gICAgQ3VzdG9t
RmlsdGVyTWVzaFR5cGUgbWVzaFR5cGUgPSBNZXNoVHlwZUF0dGFjaGVkOwotICAgIAotICAgIENT
U1ZhbHVlKiBwYXJhbWV0ZXJzVmFsdWUgPSAwOwotICAgIAotICAgIGlmIChmaWx0ZXJWYWx1ZS0+
bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKGZp
bHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgCi0gICAgICAg
IC8vIFRoZSBzZWNvbmQgdmFsdWUgbWlnaHQgYmUgdGhlIG1lc2ggYm94IG9yIHRoZSBsaXN0IG9m
IHBhcmFtZXRlcnM6Ci0gICAgICAgIC8vIElmIGl0IHN0YXJ0cyB3aXRoIGEgbnVtYmVyIG9yIGFu
eSBvZiB0aGUgbWVzaC1ib3ggaWRlbnRpZmllcnMgaXQgaXMgCi0gICAgICAgIC8vIHRoZSBtZXNo
LWJveCBsaXN0LCBpZiBub3QgaXQgbWVhbnMgaXQgaXMgdGhlIHBhcmFtZXRlcnMgbGlzdC4KLQot
ICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFs
dWUoKSkgewotICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAg
ICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAgICAgICAg
IC8vIElmIG9ubHkgb25lIGludGVnZXIgdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHNldCBi
b3RoCi0gICAgICAgICAgICAgICAgLy8gdGhlIHJvd3MgYW5kIHRoZSBjb2x1bW5zLgotICAgICAg
ICAgICAgICAgIG1lc2hDb2x1bW5zID0gbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50
VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGFub3RoZXIgbnVtYmVyIGZv
ciB0aGUgcm93cy4KLSAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0
ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc2hSb3dzID0g
cHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
dGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpdGVy
YXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRGV0YWNoZWQpIHsKLSAgICAgICAgICAg
ICAgICBtZXNoVHlwZSA9IE1lc2hUeXBlRGV0YWNoZWQ7Ci0gICAgICAgICAgICAgICAgaXRlcmF0
b3IuYWR2YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAg
ICBpZiAoIWl0ZXJhdG9yLmluZGV4KCkpIHsKLSAgICAgICAgICAgIC8vIElmIG5vIHZhbHVlIHdh
cyBjb25zdW1lZCBmcm9tIHRoZSBtZXNoIHZhbHVlLCB0aGVuIGl0IGlzIGp1c3QgYSBwYXJhbWV0
ZXIgbGlzdCwgbWVhbmluZyB0aGF0IHdlIGVuZCB1cAotICAgICAgICAgICAgLy8gaGF2aW5nIGp1
c3QgdHdvIENTU0xpc3RWYWx1ZXM6IGxpc3Qgb2Ygc2hhZGVycyBhbmQgbGlzdCBvZiBwYXJhbWV0
ZXJzLgotICAgICAgICAgICAgQVNTRVJUKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAyKTsKLSAg
ICAgICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChmaWx0ZXJWYWx1ZS0+
bGVuZ3RoKCkgPiAyICYmICFwYXJhbWV0ZXJzVmFsdWUpCi0gICAgICAgIHBhcmFtZXRlcnNWYWx1
ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpOwotICAgIAotICAgIEN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3QgcGFyYW1ldGVyTGlzdDsKLSAgICBpZiAocGFyYW1ldGVy
c1ZhbHVlICYmICFwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QocGFyYW1ldGVyc1ZhbHVl
LCBwYXJhbWV0ZXJMaXN0KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVmUHRyPFN0
eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbT4gcHJvZ3JhbSA9IFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3Jh
bTo6Y3JlYXRlKHZlcnRleFNoYWRlci5yZWxlYXNlKCksIGZyYWdtZW50U2hhZGVyLnJlbGVhc2Uo
KSwgcHJvZ3JhbVR5cGUsIG1peFNldHRpbmdzLCBtZXNoVHlwZSk7Ci0gICAgcmV0dXJuIEN1c3Rv
bUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHByb2dyYW0ucmVsZWFzZSgpLCBwYXJhbWV0ZXJMaXN0
LCBtZXNoUm93cywgbWVzaENvbHVtbnMsIG1lc2hUeXBlKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0
b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJh
dGlvbihXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAgQVNTRVJUKGZp
bHRlclZhbHVlLT5sZW5ndGgoKSk7Ci0gICAgYm9vbCBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA9
IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVl
KCk7Ci0gICAgcmV0dXJuIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID8gY3JlYXRlQ3VzdG9tRmls
dGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChmaWx0ZXJWYWx1ZSkgOiBjcmVh
dGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KGZpbHRlclZhbHVlKTsKLX0K
LQotI2VuZGlmCi0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhD
U1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0
eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKQotewotICAgIEFTU0VSVChvdXRP
cGVyYXRpb25zLmlzRW1wdHkoKSk7Ci0gICAgCi0gICAgaWYgKCFpblZhbHVlKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKGluVmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkg
ewotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KGluVmFsdWUpOwotICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotICAgIAotICAgIGlmICghaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKSA6IDE7Ci0gICAgRmlsdGVyT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAg
IGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFk
dmFuY2UoKSkgewotICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOwotICAg
ICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NGaWx0ZXJWYWx1ZSgpKQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVl
ID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTRmlsdGVyVmFsdWUqPihpLnZhbHVlKCkpOwotICAgICAg
ICBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9IGZpbHRlck9w
ZXJhdGlvbkZvclR5cGUoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSk7Ci0KLSNpZiBFTkFC
TEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJh
dGlvbjo6VkFMSURBVEVEX0NVU1RPTSkgewotICAgICAgICAgICAgLy8gVmFsaWRhdGVkQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBlbmQgdXAgaW4gdGhlIFJlbmRlclN0
eWxlLgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVy
YXRpb246OkNVU1RPTSkgewotICAgICAgICAgICAgUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlv
bj4gb3BlcmF0aW9uID0gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKGZpbHRlclZhbHVlKTsK
LSAgICAgICAgICAgIGlmICghb3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBw
ZW5kKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotI2VuZGlm
Ci0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNF
KSB7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3Ro
KCkgIT0gMSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENTU1ZhbHVl
KiBhcmd1bWVudCA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOwotCi0g
ICAgICAgICAgICBpZiAoIWFyZ3VtZW50LT5pc1dlYktpdENTU1NWR0RvY3VtZW50VmFsdWUoKSkK
LSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgV2ViS2l0Q1NTU1ZHRG9j
dW1lbnRWYWx1ZSogc3ZnRG9jdW1lbnRWYWx1ZSA9IHN0YXRpY19jYXN0PFdlYktpdENTU1NWR0Rv
Y3VtZW50VmFsdWUqPihhcmd1bWVudCk7Ci0gICAgICAgICAgICBLVVJMIHVybCA9IG1fc3RhdGUu
ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCkpOwotCi0gICAg
ICAgICAgICBSZWZQdHI8UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24gPSBSZWZl
cmVuY2VGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgdXJs
LmZyYWdtZW50SWRlbnRpZmllcigpLCBvcGVyYXRpb25UeXBlKTsKLSAgICAgICAgICAgIGlmIChT
VkdVUklSZWZlcmVuY2U6OmlzRXh0ZXJuYWxVUklSZWZlcmVuY2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+
dXJsKCksIG1fc3RhdGUuZG9jdW1lbnQoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN2Z0Rv
Y3VtZW50VmFsdWUtPmxvYWRSZXF1ZXN0ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbV9zdGF0
ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuc2V0KG9wZXJhdGlvbi5nZXQoKSwgc3ZnRG9jdW1lbnRW
YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVk
U1ZHRG9jdW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLT5zZXRDYWNoZWRT
VkdEb2N1bWVudFJlZmVyZW5jZShhZG9wdFB0cihuZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVu
Y2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQoKSkpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24p
OwotI2VuZGlmCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IENoZWNrIHRoYXQgYWxsIHBhcmFtZXRlcnMgYXJlIHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggdGhl
Ci0gICAgICAgIC8vIGV4Y2VwdGlvbiBvZiBkcm9wIHNoYWRvdyB3aGljaCBoYXMgYSBTaGFkb3dW
YWx1ZSBwYXJhbWV0ZXIuCi0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlICE9IEZpbHRlck9wZXJh
dGlvbjo6RFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZh
bHVlID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgZmlsdGVy
VmFsdWUtPmxlbmd0aCgpOyArK2opIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbHRlclZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgfQotCi0gICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0g
ZmlsdGVyVmFsdWUtPmxlbmd0aCgpID8gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihm
aWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSkgOiAwOwotICAgICAgICBzd2l0
Y2ggKGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZTo6R3JheXNjYWxlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdl
YktpdENTU0ZpbHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2F0dXJhdGVGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAg
ICAgIGRvdWJsZSBhbW91bnQgPSAxOwotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RWYWx1ZS0+Z2V0RG91
YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNQZXJjZW50YWdl
KCkpCi0gICAgICAgICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0
cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVyYXRpb25UeXBlKSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpIdWVSb3RhdGVGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbmds
ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpCi0gICAg
ICAgICAgICAgICAgYW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwotCi0gICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZp
bHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFuZ2xlLCBvcGVyYXRpb25UeXBlKSk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJ
bnZlcnRGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkNvbnRyYXN0RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUg
YW1vdW50ID0gKGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb24pID8gMCA6IDE7Ci0gICAgICAgICAgICBp
ZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBhbW91bnQg
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChmaXJz
dFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEw
MDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCku
YXBwZW5kKEJhc2ljQ29tcG9uZW50VHJhbnNmZXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91
bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRpb246IHsKLSAg
ICAgICAgICAgIExlbmd0aCBzdGREZXZpYXRpb24gPSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAg
ICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+PSAxKQotICAgICAgICAgICAgICAgIHN0
ZERldmlhdGlvbiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290
U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgaWYgKHN0ZERldmlhdGlvbi5pc1VuZGVm
aW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3Bl
cmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJsdXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShz
dGREZXZpYXRpb24sIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJP
cGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIENTU1ZhbHVlKiBj
c3NWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApOwotICAgICAg
ICAgICAgaWYgKCFjc3NWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotCi0gICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNo
YWRvd1ZhbHVlKj4oY3NzVmFsdWUpOwotICAgICAgICAgICAgSW50UG9pbnQgbG9jYXRpb24oaXRl
bS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+
KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpKTsKLSAgICAgICAgICAgIGludCBibHVyID0g
aXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKSA6IDA7Ci0gICAgICAgICAgICBDb2xvciBjb2xvcjsKLSAgICAgICAg
ICAgIGlmIChpdGVtLT5jb2xvcikKLSAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVBy
aW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKLQotICAgICAgICAgICAgb3BlcmF0aW9u
cy5vcGVyYXRpb25zKCkuYXBwZW5kKERyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShs
b2NhdGlvbiwgYmx1ciwgY29sb3IuaXNWYWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJl
bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb3V0T3BlcmF0aW9ucyA9IG9w
ZXJhdGlvbnM7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZgotCi1QYXNzUmVmUHRyPFN0
eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1h
Z2UqIHBlbmRpbmdJbWFnZSkKLXsKLSAgICBDYWNoZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVz
b3VyY2VMb2FkZXIgPSBtX3N0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7
Ci0KLSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NT
SW1hZ2VWYWx1ZSogaW1hZ2VWYWx1ZSA9IHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpOwot
ICAgICAgICByZXR1cm4gaW1hZ2VWYWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2Fk
ZXIpOwotICAgIH0KLQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFs
dWUoKSkgewotICAgICAgICBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiBpbWFnZUdlbmVyYXRvclZh
bHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCk7Ci0gICAgICAgIGlt
YWdlR2VuZXJhdG9yVmFsdWUtPmxvYWRTdWJpbWFnZXMoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwot
ICAgICAgICByZXR1cm4gU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKGltYWdlR2VuZXJhdG9y
VmFsdWUpOwotICAgIH0KLQotICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFs
dWUoKSkgewotICAgICAgICBDU1NDdXJzb3JJbWFnZVZhbHVlKiBjdXJzb3JJbWFnZVZhbHVlID0g
cGVuZGluZ0ltYWdlLT5jc3NDdXJzb3JJbWFnZVZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjdXJz
b3JJbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgfQot
Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1h
Z2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0ltYWdlU2V0VmFsdWUqIGltYWdlU2V0VmFsdWUg
PSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlU2V0VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGltYWdl
U2V0VmFsdWUtPmNhY2hlZEltYWdlU2V0KGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0j
ZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5k
aW5nSW1hZ2VzKCkKLXsKLSAgICBpZiAobV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCku
aXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1h
cDo6Y29uc3RfaXRlcmF0b3I6OktleXMgZW5kID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzKCkuZW5kKCkua2V5cygpOwotICAgIGZvciAoUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNv
bnN0X2l0ZXJhdG9yOjpLZXlzIGl0ID0gbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCku
YmVnaW4oKS5rZXlzKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBDU1NQcm9wZXJ0eUlE
IGN1cnJlbnRQcm9wZXJ0eSA9ICppdDsKLQotICAgICAgICBzd2l0Y2ggKGN1cnJlbnRQcm9wZXJ0
eSkgewotICAgICAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOiB7Ci0gICAgICAg
ICAgICBmb3IgKEZpbGxMYXllciogYmFja2dyb3VuZExheWVyID0gbV9zdGF0ZS5zdHlsZSgpLT5h
Y2Nlc3NCYWNrZ3JvdW5kTGF5ZXJzKCk7IGJhY2tncm91bmRMYXllcjsgYmFja2dyb3VuZExheWVy
ID0gYmFja2dyb3VuZExheWVyLT5uZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYmFja2dy
b3VuZExheWVyLT5pbWFnZSgpICYmIGJhY2tncm91bmRMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5n
SW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZExheWVyLT5zZXRJbWFnZShs
b2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oYmFja2dyb3Vu
ZExheWVyLT5pbWFnZSgpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6IHsKLSAgICAgICAgICAg
IGZvciAoQ29udGVudERhdGEqIGNvbnRlbnREYXRhID0gY29uc3RfY2FzdDxDb250ZW50RGF0YSo+
KG1fc3RhdGUuc3R5bGUoKS0+Y29udGVudERhdGEoKSk7IGNvbnRlbnREYXRhOyBjb250ZW50RGF0
YSA9IGNvbnRlbnREYXRhLT5uZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudERh
dGEtPmlzSW1hZ2UoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHlsZUltYWdlKiBpbWFnZSA9
IHN0YXRpY19jYXN0PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPmltYWdlKCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkgewotICAgICAg
ICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBl
bmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGltYWdlKSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVkSW1hZ2UpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+c2V0
SW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlDdXJzb3I6IHsKLSAgICAgICAgICAgIGlmIChD
dXJzb3JMaXN0KiBjdXJzb3JMaXN0ID0gbV9zdGF0ZS5zdHlsZSgpLT5jdXJzb3JzKCkpIHsKLSAg
ICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGN1cnNvckxpc3QtPnNpemUoKTsg
KytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEN1cnNvckRhdGEmIGN1cnJlbnRDdXJzb3IgPSBj
dXJzb3JMaXN0LT5hdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFN0eWxlSW1hZ2UqIGlt
YWdlID0gY3VycmVudEN1cnNvci5pbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y3VycmVudEN1cnNvci5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxl
UGVuZGluZ0ltYWdlKj4oaW1hZ2UpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
ICAgICAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlSW1hZ2U6IHsKLSAgICAgICAgICAgIGlm
IChtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5s
aXN0U3R5bGVJbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgIG1fc3Rh
dGUuc3R5bGUoKS0+c2V0TGlzdFN0eWxlSW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2Fz
dDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSkp
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJJbWFnZVNvdXJjZTogewotICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+
Ym9yZGVySW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNl
KCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5z
ZXRCb3JkZXJJbWFnZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVu
ZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpKSkpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJveFJlZmxlY3Q6IHsKLSAgICAgICAgICAgIGlmIChTdHlsZVJlZmxlY3Rpb24qIHJlZmxlY3Rp
b24gPSBtX3N0YXRlLnN0eWxlKCktPmJveFJlZmxlY3QoKSkgewotICAgICAgICAgICAgICAgIGNv
bnN0IE5pbmVQaWVjZUltYWdlJiBtYXNrSW1hZ2UgPSByZWZsZWN0aW9uLT5tYXNrKCk7Ci0gICAg
ICAgICAgICAgICAgaWYgKG1hc2tJbWFnZS5pbWFnZSgpICYmIG1hc2tJbWFnZS5pbWFnZSgpLT5p
c1BlbmRpbmdJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdl
PiBsb2FkZWRJbWFnZSA9IGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5n
SW1hZ2UqPihtYXNrSW1hZ2UuaW1hZ2UoKSkpOwotICAgICAgICAgICAgICAgICAgICByZWZsZWN0
aW9uLT5zZXRNYXNrKE5pbmVQaWVjZUltYWdlKGxvYWRlZEltYWdlLnJlbGVhc2UoKSwgbWFza0lt
YWdlLmltYWdlU2xpY2VzKCksIG1hc2tJbWFnZS5maWxsKCksIG1hc2tJbWFnZS5ib3JkZXJTbGlj
ZXMoKSwgbWFza0ltYWdlLm91dHNldCgpLCBtYXNrSW1hZ2UuaG9yaXpvbnRhbFJ1bGUoKSwgbWFz
a0ltYWdlLnZlcnRpY2FsUnVsZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hc2tCb3hJbWFnZVNvdXJjZTogewotICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5
bGUoKS0+bWFza0JveEltYWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1h
Z2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRlLnN0
eWxlKCktPnNldE1hc2tCb3hJbWFnZVNvdXJjZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0
PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2Uo
KSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXNrSW1hZ2U6IHsKLSAgICAgICAgICAgIGZvciAoRmlsbExheWVyKiBtYXNr
TGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vzc01hc2tMYXllcnMoKTsgbWFza0xheWVyOyBt
YXNrTGF5ZXIgPSBtYXNrTGF5ZXItPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChtYXNr
TGF5ZXItPmltYWdlKCkgJiYgbWFza0xheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICAgICAgICAgICAgICBtYXNrTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uo
c3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNrTGF5ZXItPmltYWdlKCkpKSk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5jbGVhcigpOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nUmVzb3VyY2VzKCkKLXsKLSAgICAvLyBTdGFy
dCBsb2FkaW5nIGltYWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRp
bmdJbWFnZXMoKTsKLQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAvLyBTdGFydCBsb2Fk
aW5nIHRoZSBzaGFkZXJzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGlu
Z1NoYWRlcnMoKTsKLSNlbmRpZgotICAgIAotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5B
QkxFKFNWRykKLSAgICAvLyBTdGFydCBsb2FkaW5nIHRoZSBTVkcgRG9jdW1lbnRzIHJlZmVyZW5j
ZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpOwotI2VuZGlm
Ci19Ci0KLWlubGluZSBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6TWF0Y2hlZFBy
b3BlcnRpZXMoKQotICAgIDogcG9zc2libHlQYWRkZWRNZW1iZXIoMCkKLXsKLX0KLQotaW5saW5l
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjp+TWF0Y2hlZFByb3BlcnRpZXMoKQot
ewotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpyZXBvcnRNZW1v
cnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewotICAg
IE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1v
cnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlcihwcm9wZXJ0aWVzLCAicHJvcGVydGll
cyIpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVt
OjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBj
b25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMs
IFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtYXRjaGVkUHJv
cGVydGllcywgIm1hdGNoZWRQcm9wZXJ0aWVzIik7Ci0gICAgaW5mby5hZGRNZW1iZXIocmFuZ2Vz
LCAicmFuZ2VzIik7Ci0gICAgaW5mby5hZGRNZW1iZXIocmVuZGVyU3R5bGUsICJyZW5kZXJTdHls
ZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKHBhcmVudFJlbmRlclN0eWxlLCAicGFyZW50UmVuZGVy
U3R5bGUiKTsKLX0KLQotdm9pZCBNZWRpYVF1ZXJ5UmVzdWx0OjpyZXBvcnRNZW1vcnlVc2FnZShN
ZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNs
YXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6
Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2V4cHJlc3Npb24sICJleHByZXNzaW9uIik7Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5m
byogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKLXsKLSAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyht
ZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7Ci0gICAgaW5m
by5hZGRNZW1iZXIobV9ydWxlU2V0cywgInJ1bGVTZXRzIik7Ci0gICAgaW5mby5hZGRNZW1iZXIo
bV9rZXlmcmFtZXNSdWxlTWFwLCAia2V5ZnJhbWVzUnVsZU1hcCIpOwotICAgIGluZm8uYWRkTWVt
YmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZSwgIm1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUiKTsK
LSAgICBpbmZvLmFkZE1lbWJlcihtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLCAi
bWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIiKTsKLQotICAgIGluZm8uYWRkTWVtYmVy
KG1fbWVkaXVtLCAibWVkaXVtIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9yb290RGVmYXVsdFN0
eWxlLCAicm9vdERlZmF1bHRTdHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fZG9jdW1lbnQs
ICJkb2N1bWVudCIpOwotCi0gICAgaW5mby5hZGRNZW1iZXIobV9mb250U2VsZWN0b3IsICJmb250
U2VsZWN0b3IiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFR
dWVyeVJlc3VsdHMsICJ2aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzIik7Ci0gICAg
aW5mby5pZ25vcmVNZW1iZXIobV9zdHlsZUJ1aWxkZXIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1f
aW5zcGVjdG9yQ1NTT01XcmFwcGVycyk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9zY29wZVJlc29s
dmVyLCAic2NvcGVSZXNvbHZlciIpOwotCi0gICAgaW5mby5hZGRNZW1iZXIobV9zdGF0ZSwgInN0
YXRlIik7Ci0KLSAgICAvLyBGSVhNRTogbW92ZSB0aGlzIHRvIGEgcGxhY2Ugd2hlcmUgaXQgd291
bGQgYmUgY2FsbGVkIG9ubHkgb25jZT8KLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRTdHlsZSwgImRlZmF1bHRTdHlsZSIpOwotICAgIGluZm8uYWRkTWVt
YmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJrc1N0eWxlLCAiZGVmYXVsdFF1
aXJrc1N0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpk
ZWZhdWx0UHJpbnRTdHlsZSwiZGVmYXVsdFByaW50U3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRWaWV3U291cmNlU3R5bGUsICJkZWZhdWx0
Vmlld1NvdXJjZVN0eWxlIik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oCShyZXZpc2lvbiAxNDUxODEpCShmcm9t
IFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmg6MTQ1MTgxKQorKysgU291cmNlL1dl
YkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2
OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9y
ZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZu
ZGVmIFN0eWxlUmVzb2x2ZXJfaAorI2RlZmluZSBTdHlsZVJlc29sdmVyX2gKKworI2luY2x1ZGUg
IkNTU1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NTVG9TdHlsZU1hcC5oIgorI2luY2x1ZGUgIkNT
U1ZhbHVlTGlzdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzLmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRl
ICJNZWRpYVF1ZXJ5RXhwLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJS
dWxlRmVhdHVyZS5oIgorI2luY2x1ZGUgIlJ1bGVTZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5h
YmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKKyNpbmNsdWRlICJTZWxl
Y3RvckNoZWNrZXIuaCIKKyNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlN0
eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUgIlN0eWxlU2NvcGVSZXNvbHZlci5oIgorI2lu
Y2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykg
JiYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisj
ZW5kaWYKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+
CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3Ry
aW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0gRVNtYXJ0TWluaW11bUZv
ckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5p
bXVtRm9yRm9udEZpemUgfTsKKworY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKK2NsYXNzIENT
U0ZvbnRTZWxlY3RvcjsKK2NsYXNzIENTU0ZvbnRGYWNlOworY2xhc3MgQ1NTRm9udEZhY2VSdWxl
OworY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsKK2NsYXNzIENTU0ltYWdlU2V0VmFsdWU7
CitjbGFzcyBDU1NJbWFnZVZhbHVlOworY2xhc3MgQ1NTUGFnZVJ1bGU7CitjbGFzcyBDU1NQcmlt
aXRpdmVWYWx1ZTsKK2NsYXNzIENTU1Byb3BlcnR5OworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFz
cyBDU1NTZWxlY3RvcjsKK2NsYXNzIENTU1N0eWxlU2hlZXQ7CitjbGFzcyBDU1NWYWx1ZTsKK2Ns
YXNzIENvbnRhaW5lck5vZGU7CitjbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247CitjbGFzcyBD
dXN0b21GaWx0ZXJQYXJhbWV0ZXI7CitjbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0Owor
Y2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBFbGVtZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFt
ZVZpZXc7CitjbGFzcyBLVVJMOworY2xhc3MgS2V5ZnJhbWVMaXN0OworY2xhc3MgS2V5ZnJhbWVW
YWx1ZTsKK2NsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7CitjbGFzcyBOb2RlOworY2xhc3MgUmVu
ZGVyUmVnaW9uOworY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOworY2xhc3MgUnVsZURhdGE7CitjbGFz
cyBSdWxlU2V0OworY2xhc3MgU2V0dGluZ3M7CitjbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKK2Ns
YXNzIFN0eWxlQnVpbGRlcjsKK2NsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKK2NsYXNzIFN0eWxl
SW1hZ2U7CitjbGFzcyBTdHlsZUtleWZyYW1lOworY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7Citj
bGFzcyBTdHlsZVByb3BlcnR5U2V0OworY2xhc3MgU3R5bGVSdWxlOworI2lmIEVOQUJMRShTSEFE
T1dfRE9NKQorY2xhc3MgU3R5bGVSdWxlSG9zdDsKKyNlbmRpZgorY2xhc3MgU3R5bGVSdWxlS2V5
ZnJhbWVzOworY2xhc3MgU3R5bGVSdWxlUGFnZTsKK2NsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKK2Ns
YXNzIFN0eWxlU2hhZGVyOworY2xhc3MgU3R5bGVTaGVldDsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0
OworY2xhc3MgU3R5bGVkRWxlbWVudDsKK2NsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKK2Ns
YXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOworY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7Citj
bGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOworCitjbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRp
YVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKKyAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhw
cikKKyAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCisgICAgeworICAgIH0KKyAgICB2b2lkIHJl
cG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKworICAgIE1lZGlhUXVl
cnlFeHAgbV9leHByZXNzaW9uOworICAgIGJvb2wgbV9yZXN1bHQ7Cit9OworCitlbnVtIFN0eWxl
U2hhcmluZ0JlaGF2aW9yIHsKKyAgICBBbGxvd1N0eWxlU2hhcmluZywKKyAgICBEaXNhbGxvd1N0
eWxlU2hhcmluZywKK307CisKKy8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4g
bWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKKy8vIGFyZSBpbnRlcnByZXRlZCBh
Y2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBv
bmx5CisvLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCisKK2VudW0gUnVs
ZU1hdGNoaW5nQmVoYXZpb3IgeworICAgIE1hdGNoQWxsUnVsZXMsCisgICAgTWF0Y2hBbGxSdWxl
c0V4Y2x1ZGluZ1NNSUwsCisgICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCit9OworCitjbGFz
cyBQc2V1ZG9TdHlsZVJlcXVlc3QgeworcHVibGljOgorICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQ
c2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxi
YXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCisgICAgICAgIDogcHNldWRvSWQocHNldWRv
SWQpCisgICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQorICAgICAgICAsIHNj
cm9sbGJhcihzY3JvbGxiYXIpCisgICAgeworICAgIH0KKworICAgIFBzZXVkb0lkIHBzZXVkb0lk
OworICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKKyAgICBSZW5kZXJTY3JvbGxiYXIq
IHNjcm9sbGJhcjsKK307CisKK2NsYXNzIE1hdGNoUmVxdWVzdCB7CitwdWJsaWM6CisgICAgTWF0
Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxz
ZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2
aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNO
b3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKKyAgICAgICAgLCBp
bmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKKyAgICAgICAgLCBzY29wZShzY29w
ZSkKKyAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0K
KyAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OworICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXM7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7CisgICAgY29uc3QgU2VsZWN0
b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OworfTsKKwor
Ly8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBi
YXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCitjbGFzcyBTdHlsZVJlc29sdmVy
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3R5bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wg
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKKyAgICB+U3R5bGVSZXNvbHZlcigpOworCisgICAg
Ly8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9y
IHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9yIGxvb2t1cHMuCisgICAg
dm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50Kik7CisgICAgdm9pZCBwb3BQYXJlbnRFbGVt
ZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRv
d1Jvb3QqKTsKKyAgICB2b2lkIHBvcFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCop
OworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxl
SG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWlu
ZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJlc29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUs
IGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNjb3BlKTsgfQorI2VuZGlmCisKKyAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmluZ0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJp
bmcsCisgICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVy
UmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CisKKyAgICB2b2lkIGtleWZyYW1lU3R5bGVz
Rm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBSZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYp
OworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVs
ZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdl
SW5kZXgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1l
bnQoKTsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOwor
CisgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9j
dW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxlKCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudFN0eWxlKCk7IH0KKyAgICBS
ZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpOyB9CisgICAgRWxlbWVudCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3Rh
dGUuZWxlbWVudCgpOyB9CisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1
bWVudDsgfQorICAgIFN0eWxlU2NvcGVSZXNvbHZlciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsg
cmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsgfQorICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Tm9kZSgpOyB9CisKKyAgICAvLyBGSVhNRTog
SXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNo
ZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3RvciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KKyAg
ICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCisgICAg
dm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVj
dG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBy
dWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKyAgICBjb25zdCBEb2N1bWVudFJ1bGVT
ZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKworI2lmIEVOQUJM
RShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIFN0eWxlU2NvcGVSZXNv
bHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCisgICAgeworI2lmIEVOQUJMRShTVFlMRV9TQ09Q
RUQpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxl
ZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkgfHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6
c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFi
bGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAg
ICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7Cisj
ZW5kaWYKKyAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgICAgICBtX3Njb3Bl
UmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVTY29wZVJlc29sdmVyKCkpOworICAgICAgICBy
ZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOworICAgIH0KKyNlbmRpZgorCitwcml2YXRlOgor
ICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgIFJlbmRlclN0eWxlKiBsb2NhdGVT
aGFyZWRTdHlsZSgpOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVT
ZXQoUnVsZVNldCopOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RS
dWxlcygpOworICAgIE5vZGUqIGxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNp
Z25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7CisgICAgU3R5bGVkRWxlbWVudCogZmluZFNp
YmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVuc2lnbmVkJiBjb3VudCkgY29uc3Q7CisgICAg
Ym9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisg
ICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJT
dHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBLZXlmcmFtZVZhbHVlJik7CisKK3B1YmxpYzoK
KyAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhh
dCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgKG9yIGEgcHNldWRvLWVsZW1lbnQpLgorICAg
IGVudW0gQ1NTUnVsZUZpbHRlciB7CisgICAgICAgIFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8
IDEsCisgICAgICAgIEF1dGhvckNTU1J1bGVzICAgICAgPSAxIDw8IDIsCisgICAgICAgIEVtcHR5
Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCisgICAgICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAx
IDw8IDQsCisgICAgICAgIEFsbEJ1dEVtcHR5Q1NTUnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8
IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5DU1NSdWxlcywKKyAgICAgICAgQWxsQ1NTUnVs
ZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMgfCBFbXB0eUNTU1J1bGVzLAorICAgIH07
CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gc3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVu
dCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7CisgICAg
UGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVu
dCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVs
ZXMpOworCisgICAgLy8gR2l2ZW4gYSBDU1Mga2V5d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxs
IHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICAgIC8v
IHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZh
dWx0IChtZWRpdW0pLgorICAgIHN0YXRpYyBmbG9hdCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1l
bnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKKworICAg
IC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJu
IGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFuZCA3LgorICAgIHN0YXRpYyBpbnQgbGVnYWN5
Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhl
ZERlZmF1bHRTaXplKTsKKworcHVibGljOgorICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUo
Q1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5kZXJTdHlsZSopOworCisgICAgdm9pZCBhcHBs
eVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKworICAg
IHZvaWQgdXBkYXRlRm9udCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5n
cyopOworCisgICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXpl
KERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQg
c3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVt
Rm9yRm9udEZpemUpOworCisgICAgdm9pZCBzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mLCBm
bG9hdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXpl
RnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBSZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0
ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKTsKKworcHVi
bGljOgorICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCk7CisKKyAgICBzdGF0aWMgYm9vbCBjb2xv
ckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVl
Kik7CisgICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUq
LCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2UpIGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxl
Y3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0
b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIGhhc1NlbGVj
dG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworCisgICAgQ1NTRm9u
dFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5n
ZXQoKTsgfQorI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgVmlld3BvcnRT
dHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0
U3R5bGVSZXNvbHZlci5nZXQoKTsgfQorI2VuZGlmCisKKyAgICB2b2lkIGFkZFZpZXdwb3J0RGVw
ZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQp
OworICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJl
dHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQor
ICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFk
ZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+KTsKKworICAgIGJv
b2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKworICAgIGJvb2wg
dXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCku
c2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQorICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkg
Y29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsg
fQorICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVT
ZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KKworICAgIHN0YXRpYyBib29s
IGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxl
KiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBv
dXRPcGVyYXRpb25zKTsKKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGll
c0NhY2hlKCk7CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisgICAgYm9vbCBjcmVhdGVGaWx0
ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Cisj
aWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIFN0eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NW
YWx1ZSopOworICAgIFN0eWxlU2hhZGVyKiBjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21W
YWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOworICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYpOworICAg
IFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3Qg
U3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRl
clBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5n
JiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBu
YW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlv
bj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChX
ZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0
aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KFdlYktpdENT
U0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNy
ZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIHZv
aWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5kaWYKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZv
aWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKKyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShD
U1NfRklMVEVSUykKKworICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworcHJpdmF0
ZToKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBp
ZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hh
bmdlZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0
eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNo
YW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7CisKKyAgICB2b2lk
IGFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHls
ZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKKworICAgIHN0cnVjdCBSdWxlUmFuZ2UgeworICAg
ICAgICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTog
Zmlyc3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5k
ZXgpIHsgfQorICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OworICAgICAgICBpbnQmIGxhc3RS
dWxlSW5kZXg7CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRjaFJhbmdlcyB7CisgICAgICAgIE1h
dGNoUmFuZ2VzKCkgOiBmaXJzdFVBUnVsZSgtMSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhv
clJ1bGUoLTEpLCBsYXN0QXV0aG9yUnVsZSgtMSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNl
clJ1bGUoLTEpIHsgfQorICAgICAgICBpbnQgZmlyc3RVQVJ1bGU7CisgICAgICAgIGludCBsYXN0
VUFSdWxlOworICAgICAgICBpbnQgZmlyc3RBdXRob3JSdWxlOworICAgICAgICBpbnQgbGFzdEF1
dGhvclJ1bGU7CisgICAgICAgIGludCBmaXJzdFVzZXJSdWxlOworICAgICAgICBpbnQgbGFzdFVz
ZXJSdWxlOworICAgICAgICBSdWxlUmFuZ2UgVUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFu
Z2UoZmlyc3RVQVJ1bGUsIGxhc3RVQVJ1bGUpOyB9CisgICAgICAgIFJ1bGVSYW5nZSBhdXRob3JS
dWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9y
UnVsZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxl
UmFuZ2UoZmlyc3RVc2VyUnVsZSwgbGFzdFVzZXJSdWxlKTsgfQorICAgIH07CisKKyAgICBzdHJ1
Y3QgTWF0Y2hlZFByb3BlcnRpZXMgeworICAgICAgICBNYXRjaGVkUHJvcGVydGllcygpOworICAg
ICAgICB+TWF0Y2hlZFByb3BlcnRpZXMoKTsKKyAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2Fn
ZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8U3R5
bGVQcm9wZXJ0eVNldD4gcHJvcGVydGllczsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAg
c3RydWN0IHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKKyAg
ICAgICAgICAgICAgICB1bnNpZ25lZCB3aGl0ZWxpc3RUeXBlIDogMjsKKyAgICAgICAgICAgIH07
CisgICAgICAgICAgICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5p
dGlhbGl6ZWQgc2luY2Ugd2UgY29tcHV0ZSB0aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlz
IG9iamVjdC4KKyAgICAgICAgICAgIHZvaWQqIHBvc3NpYmx5UGFkZGVkTWVtYmVyOworICAgICAg
ICB9OworICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0Y2hSZXN1bHQgeworICAgICAgICBNYXRjaFJl
c3VsdCgpIDogaXNDYWNoZWFibGUodHJ1ZSkgeyB9CisgICAgICAgIFZlY3RvcjxNYXRjaGVkUHJv
cGVydGllcywgNjQ+IG1hdGNoZWRQcm9wZXJ0aWVzOworICAgICAgICBWZWN0b3I8U3R5bGVSdWxl
KiwgNjQ+IG1hdGNoZWRSdWxlczsKKyAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAg
ICBib29sIGlzQ2FjaGVhYmxlOworICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVk
UHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRp
ZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVj
a2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3RO
b25lKTsKKyAgICB2b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworCisgICAg
dm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRp
ZXMpOworICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0Jik7CisgICAgdm9pZCBtYXRj
aFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1
bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRj
aFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZv
aWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpOworICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1
ZGVFbXB0eVJ1bGVzKTsKKworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0
Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
clJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0
Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisKKyAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihj
b25zdCBSdWxlRGF0YSYpIGNvbnN0OworICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOworICAg
IHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CisKKyAgICBi
b29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2Nv
cGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxl
Y3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKKyAgICBib29sIGNoZWNrUmVnaW9u
U2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdp
b25FbGVtZW50KTsKKyAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hS
ZXN1bHQmLCBjb25zdCBFbGVtZW50Kik7CisgICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7
CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMs
CisjZW5kaWYKKyAgICAgICAgSGlnaFByaW9yaXR5UHJvcGVydGllcywKKyAgICAgICAgTG93UHJp
b3JpdHlQcm9wZXJ0aWVzCisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBh
c3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1
bHQmLCBib29sIGltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBp
bmhlcml0ZWRPbmx5KTsKKyAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4K
KyAgICB2b2lkIGFwcGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0
aWVzLCBTdHlsZVJ1bGUqLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFBy
b3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CisjaWYgRU5BQkxF
KENTU19WQVJJQUJMRVMpCisgICAgdm9pZCByZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQs
IENTU1ZhbHVlKiwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtu
b3duRXhwcmVzc2lvbnMpOworI2VuZGlmCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0
eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAg
IHN0YXRpYyBib29sIGlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOworI2Vu
ZGlmCisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29s
IGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwor
ICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1h
dGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFn
ZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgU2V0dGlu
Z3MqIGRvY3VtZW50U2V0dGluZ3MoKSB7IHJldHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9
CisKKyAgICBib29sIGlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBp
c1JpZ2h0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdl
SW5kZXgpOyB9CisgICAgYm9vbCBpc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAg
ICBTdHJpbmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisKKyAgICBEb2N1bWVudFJ1
bGVTZXRzIG1fcnVsZVNldHM7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1w
bCosIFJlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKKyAgICBL
ZXlmcmFtZXNSdWxlTWFwIG1fa2V5ZnJhbWVzUnVsZU1hcDsKKworcHVibGljOgorICAgIHR5cGVk
ZWYgSGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBSZWZQdHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdl
UHJvcGVydHlNYXA7CisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAg
IHR5cGVkZWYgSGFzaE1hcDxGaWx0ZXJPcGVyYXRpb24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9j
dW1lbnRWYWx1ZT4gPiBQZW5kaW5nU1ZHRG9jdW1lbnRNYXA7CisjZW5kaWYKKworICAgIGNsYXNz
IFN0YXRlIHsKKyAgICAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3RhdGUpOworICAgIHB1Ymxp
YzoKKyAgICAgICAgU3RhdGUoKQorICAgICAgICA6IG1fZWxlbWVudCgwKQorICAgICAgICAsIG1f
c3R5bGVkRWxlbWVudCgwKQorICAgICAgICAsIG1fcGFyZW50Tm9kZSgwKQorICAgICAgICAsIG1f
cGFyZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKKyAgICAgICAg
LCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKKyAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNl
KQorICAgICAgICAsIG1fcHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKQorICAgICAgICAsIG1f
ZWxlbWVudExpbmtTdGF0ZShOb3RJbnNpZGVMaW5rKQorICAgICAgICAsIG1fZGlzdHJpYnV0ZWRU
b0luc2VydGlvblBvaW50KGZhbHNlKQorICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFz
c1J1bGVzKGZhbHNlKQorICAgICAgICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmlu
Z1N0eWxlKQorICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCisg
ICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQorI2lmIEVO
QUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgLCBtX2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQor
I2VuZGlmCisgICAgICAgICwgbV9saW5lSGVpZ2h0VmFsdWUoMCkKKyAgICAgICAgLCBtX2ZvbnRE
aXJ0eShmYWxzZSkKKyAgICAgICAgLCBtX2hhc1VBQXBwZWFyYW5jZShmYWxzZSkKKyAgICAgICAg
LCBtX2JhY2tncm91bmREYXRhKEJhY2tncm91bmRGaWxsTGF5ZXIpIHsgfQorCisgICAgcHVibGlj
OgorICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICAgICAgdm9pZCBpbml0
Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3Qo
Tk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAg
dm9pZCBjbGVhcigpOworCisgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0
dXJuIG1fZWxlbWVudC0+ZG9jdW1lbnQoKTsgfQorICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkg
Y29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxl
ZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlZEVsZW1lbnQ7IH0KKyAgICAgICAgdm9p
ZCBzZXRTdHlsZShQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5
bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHls
ZS5nZXQoKTsgfQorICAgICAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7
IHJldHVybiBtX3N0eWxlLnJlbGVhc2UoKTsgfQorCisgICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0
KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtl
UnVsZUxpc3QoKSB7IHJldHVybiBtX3J1bGVMaXN0LnJlbGVhc2UoKTsgfQorCisgICAgICAgIGNv
bnN0IENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5v
ZGU7IH0KKyAgICAgICAgdm9pZCBzZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUpIHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOyB9CisgICAgICAgIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KKyAgICAgICAg
UmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVt
ZW50U3R5bGU7IH0KKworICAgICAgICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxp
bmcoKSBjb25zdCB7IHJldHVybiBtX3JlZ2lvbkZvclN0eWxpbmc7IH0KKyAgICAgICAgdm9pZCBz
ZXRTYW1lT3JpZ2luT25seShib29sIGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25s
eSA9IGlzU2FtZU9yaWdpbk9ubHk7IH0KKyAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkg
Y29uc3QgeyByZXR1cm4gbV9zYW1lT3JpZ2luT25seTsgfQorICAgICAgICBjb25zdCBQc2V1ZG9T
dHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRv
U3R5bGVSZXF1ZXN0OyB9CisgICAgICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBj
b25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KKyAgICAgICAgYm9vbCBkaXN0cmli
dXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNl
cnRpb25Qb2ludDsgfQorICAgICAgICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxl
cyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0Fm
ZmVjdGVkOyB9CisgICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29u
c3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KKyAgICAgICAgdm9p
ZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0K
KyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21v
ZGU7IH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0
eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBw
bHk7IH0KKyAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJv
b2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5
OyB9CisgICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0KKyAgICAgICAgYm9vbCBhcHBs
eVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3Bl
cnR5VG9WaXNpdGVkTGlua1N0eWxlOyB9CisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFw
JiBwZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkgeyByZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0
aWVzOyB9CisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgICAgICBQ
ZW5kaW5nU1ZHRG9jdW1lbnRNYXAmIHBlbmRpbmdTVkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3Bl
bmRpbmdTVkdEb2N1bWVudHM7IH0KKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAg
ICAgICAgdm9pZCBzZXRIYXNQZW5kaW5nU2hhZGVycyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7
IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBoYXNQZW5kaW5nU2hhZGVyczsgfQorICAgICAgICBib29s
IGhhc1BlbmRpbmdTaGFkZXJzKCkgY29uc3QgeyByZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsg
fQorI2VuZGlmCisKKyAgICAgICAgdm9pZCBzZXRMaW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZh
bHVlKSB7IG1fbGluZUhlaWdodFZhbHVlID0gdmFsdWU7IH0KKyAgICAgICAgQ1NTVmFsdWUqIGxp
bmVIZWlnaHRWYWx1ZSgpIHsgcmV0dXJuIG1fbGluZUhlaWdodFZhbHVlOyB9CisgICAgICAgIHZv
aWQgc2V0Rm9udERpcnR5KGJvb2wgaXNEaXJ0eSkgeyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0K
KyAgICAgICAgYm9vbCBmb250RGlydHkoKSBjb25zdCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQor
CisgICAgICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGJvb2wg
aGFzVUFBcHBlYXJhbmNlKCkgY29uc3QgeyByZXR1cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KKyAg
ICAgICAgQm9yZGVyRGF0YSBib3JkZXJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRh
OyB9CisgICAgICAgIEZpbGxMYXllciBiYWNrZ3JvdW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1f
YmFja2dyb3VuZERhdGE7IH0KKyAgICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3Qg
eyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7IH0KKworICAgICAgICBjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlv
bigpOyB9CisgICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0
aW9uKCkgeyByZXR1cm4gbV9wYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAg
ICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
Y3JpcHRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7IH0KKyAgICAgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250
RGlydHkgfD0gbV9zdHlsZS0+c2V0Wm9vbShmKTsgfQorICAgICAgICB2b2lkIHNldEVmZmVjdGl2
ZVpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29t
KGYpOyB9CisgICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01v
ZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUp
OyB9CisgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0
T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9u
KHRleHRPcmllbnRhdGlvbik7IH0KKworICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAz
Mj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9CisgICAgICAgIHZv
aWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMu
YXBwZW5kKHJ1bGUpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIC8vIEZJWE1F
KGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgor
ICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1l
dGhvZHMgdG8gYWNjZXNzCisgICAgICAgIC8vIHRoZXNlIHZhcmlhYmxlcy4KKyAgICAgICAgRWxl
bWVudCogbV9lbGVtZW50OworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fc3R5bGU7Cisg
ICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVkRWxlbWVudDsKKyAgICAgICAgQ29udGFpbmVy
Tm9kZSogbV9wYXJlbnROb2RlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsK
KyAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHlsZTsKKyAgICAgICAgCisgICAg
ICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgICAgICBib29sIG1fc2Ft
ZU9yaWdpbk9ubHk7CisgICAgICAgIFBzZXVkb1N0eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVx
dWVzdDsKKworICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3RhdGU7CisKKyAgICAg
ICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKKworICAgICAgICBib29sIG1f
ZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOworCisgICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtX21vZGU7CisKKyAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQg
b2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKKyAgICAgICAgLy8gYW5kIGEgdGVtcG9y
YXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgorICAgICAgICBWZWN0b3I8Y29uc3Qg
UnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7CisgICAgICAgIFJlZlB0cjxTdGF0aWNDU1NS
dWxlTGlzdD4gbV9ydWxlTGlzdDsKKworICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlOworICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHls
ZTsKKworICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCBtX3BlbmRpbmdJbWFnZVByb3Bl
cnRpZXM7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICBib29sIG1faGFzUGVuZGlu
Z1NoYWRlcnM7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcp
CisgICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCBtX3BlbmRpbmdTVkdEb2N1bWVudHM7Cisj
ZW5kaWYKKyAgICAgICAgQ1NTVmFsdWUqIG1fbGluZUhlaWdodFZhbHVlOworICAgICAgICBib29s
IG1fZm9udERpcnR5OworCisgICAgICAgIGJvb2wgbV9oYXNVQUFwcGVhcmFuY2U7CisgICAgICAg
IEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOworICAgICAgICBGaWxsTGF5ZXIgbV9iYWNrZ3JvdW5k
RGF0YTsKKyAgICAgICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CisgICAgfTsKKworICAgIHN0
YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRBdmFpbGFibGUoKSB7IHJldHVybiBzX3N0eWxl
Tm90WWV0QXZhaWxhYmxlOyB9CisKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHN0eWxlSW1h
Z2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+
IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZVZhbHVlKik7
CisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUo
Q1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSopOworI2lmIEVOQUJMRShDU1Nf
SU1BR0VfU0VUKQorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gc2V0T3JQZW5kaW5nRnJvbVZh
bHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0VmFsdWUqKTsKKyNlbmRpZgorICAgIFBhc3NS
ZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQs
IENTU0N1cnNvckltYWdlVmFsdWUqKTsKKworICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxh
clN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5
bGUoKTsgfQorICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpOyB9CisK
KyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSos
IFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIg
PSAxKTsKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2
ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVs
dGlwbGllciA9IDEpOworCisgICAgQ1NTVG9TdHlsZU1hcCogc3R5bGVNYXAoKSB7IHJldHVybiAm
bV9zdHlsZU1hcDsgfQorICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09N
V3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7IH0KKyAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUuZm9u
dERlc2NyaXB0aW9uKCk7IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnRE
ZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Rm9udERlc2NyaXB0aW9uKCk7IH0K
KyAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnRE
ZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24p
OyB9CisgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5zZXRab29tKGYpOyB9Cisg
ICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5zZXRFZmZlY3RpdmVa
b29tKGYpOyB9CisgICAgdm9pZCBzZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9k
ZSkgeyBtX3N0YXRlLnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2RlKTsgfQorICAgIHZvaWQgc2V0
VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0
ZS5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQorICAgIAorICAgIHZvaWQg
cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworICAgIAorcHJpdmF0
ZToKKyAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKKyAg
ICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOworCitwcml2YXRlOgorICAgIGJvb2wg
Y2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZv
aWQgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworCisjaWYgRU5BQkxF
KFNWRykKKyAgICB2b2lkIGFwcGx5U1ZHUHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUq
KTsKKyNlbmRpZgorCisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdl
KFN0eWxlUGVuZGluZ0ltYWdlKik7CisgICAgdm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOworCisg
ICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXMqLCB1bnNpZ25lZCBzaXplKTsKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZUl0ZW0geworICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRj
aGVkUHJvcGVydGllczsKKyAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHJlbmRlclN0eWxlOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IHBhcmVudFJlbmRlclN0eWxlOworICAgIH07CisgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXND
YWNoZUl0ZW0qIGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBj
b25zdCBNYXRjaFJlc3VsdCYpOworICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hl
KGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNp
Z25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOworCisgICAgLy8gRXZlcnkgTiBhZGRpdGlv
bnMgdG8gdGhlIG1hdGNoZWQgZGVjbGFyYXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJl
IGVudHJpZXMgaG9sZGluZworICAgIC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRl
Y2xhcmF0aW9uIGFyZSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICB2b2lkIHN3ZWVwTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopOworCisgICAgYm9vbCBjbGFzc05h
bWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmKSBjb25zdDsKKyAgICBi
b29sIHNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMo
U3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAgdW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXA7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8dW5z
aWduZWQsIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hl
OworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOwor
CisgICAgVGltZXI8U3R5bGVSZXNvbHZlcj4gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBU
aW1lcjsKKworICAgIE93blB0cjxNZWRpYVF1ZXJ5RXZhbHVhdG9yPiBtX21lZGl1bTsKKyAgICBS
ZWZQdHI8UmVuZGVyU3R5bGU+IG1fcm9vdERlZmF1bHRTdHlsZTsKKworICAgIERvY3VtZW50KiBt
X2RvY3VtZW50OworICAgIFNlbGVjdG9yRmlsdGVyIG1fc2VsZWN0b3JGaWx0ZXI7CisKKyAgICBi
b29sIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzOworCisgICAgUmVmUHRyPENTU0ZvbnRTZWxl
Y3Rvcj4gbV9mb250U2VsZWN0b3I7CisgICAgVmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0
PiA+IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0czsKKworI2lmIEVOQUJMRShD
U1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgUmVmUHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4g
bV92aWV3cG9ydFN0eWxlUmVzb2x2ZXI7CisjZW5kaWYKKworICAgIGNvbnN0IFN0eWxlQnVpbGRl
ciYgbV9zdHlsZUJ1aWxkZXI7CisKKyAgICBPd25QdHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Nj
b3BlUmVzb2x2ZXI7CisgICAgQ1NTVG9TdHlsZU1hcCBtX3N0eWxlTWFwOworICAgIEluc3BlY3Rv
ckNTU09NV3JhcHBlcnMgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOworCisgICAgU3RhdGUgbV9z
dGF0ZTsKKworICAgIGZyaWVuZCBjbGFzcyBTdHlsZUJ1aWxkZXI7CisgICAgZnJpZW5kIGJvb2wg
b3BlcmF0b3I9PShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0
aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGll
cyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9
PShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7CisgICAgZnJpZW5kIGJv
b2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Cit9
OworCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShj
b25zdCBBdG9taWNTdHJpbmcgJmF0dHJpYnV0ZU5hbWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFh
dHRyaWJ1dGVOYW1lLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5hdHRyc0luUnVsZXMuY29udGFpbnMoYXR0cmlidXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxp
bmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0
cmluZyYgY2xhc3NWYWx1ZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0
eSgpKTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNv
bnRhaW5zKGNsYXNzVmFsdWUuaW1wbCgpKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZl
cjo6aGFzU2VsZWN0b3JGb3JJZChjb25zdCBBdG9taWNTdHJpbmcmIGlkVmFsdWUpIGNvbnN0Cit7
CisgICAgQVNTRVJUKCFpZFZhbHVlLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMu
ZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9oCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaAkocmV2aXNpb24gMTQ1MTgxKQorKysg
U291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAg
LTE5LDY3OSArMTksNDIgQEAKICAqCiAgKi8KIAotI2lmbmRlZiBTdHlsZVJlc29sdmVyX2gKLSNk
ZWZpbmUgU3R5bGVSZXNvbHZlcl9oCisjaWZuZGVmIFBhZ2VSdWxlQ29sbGVjdG9yX2gKKyNkZWZp
bmUgUGFnZVJ1bGVDb2xsZWN0b3JfaAogCi0jaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIKLSNpbmNs
dWRlICJDU1NUb1N0eWxlTWFwLmgiCi0jaW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCiAjaW5jbHVk
ZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgotI2luY2x1ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMu
aCIKLSNpbmNsdWRlICJMaW5rSGFzaC5oIgotI2luY2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKLSNp
bmNsdWRlICJSZW5kZXJTdHlsZS5oIgotI2luY2x1ZGUgIlJ1bGVGZWF0dXJlLmgiCi0jaW5jbHVk
ZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVkRmVhdHVyZXMuaCIKLSNpbmNs
dWRlICJTY3JvbGxUeXBlcy5oIgotI2luY2x1ZGUgIlNlbGVjdG9yQ2hlY2tlci5oIgotI2luY2x1
ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCi0j
aW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCi0jaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJl
c29sdmVyLmgiCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotI2luY2x1
ZGUgIldlYktpdENTU1NWR0RvY3VtZW50VmFsdWUuaCIKLSNlbmRpZgotI2luY2x1ZGUgPHd0Zi9I
YXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlICJTdHlsZVJlc29s
dmVyLmgiCiAjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
LSNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+Ci0jaW5jbHVkZSA8d3RmL3Rl
eHQvU3RyaW5nSGFzaC5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWVudW0gRVNtYXJ0TWlu
aW11bUZvckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21h
cnRNaW5pbXVtRm9yRm9udEZpemUgfTsKLQotY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKLWNs
YXNzIENTU0ZvbnRTZWxlY3RvcjsKLWNsYXNzIENTU0ZvbnRGYWNlOwotY2xhc3MgQ1NTRm9udEZh
Y2VSdWxlOwotY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsKLWNsYXNzIENTU0ltYWdlU2V0
VmFsdWU7Ci1jbGFzcyBDU1NJbWFnZVZhbHVlOwotY2xhc3MgQ1NTUGFnZVJ1bGU7Ci1jbGFzcyBD
U1NQcmltaXRpdmVWYWx1ZTsKLWNsYXNzIENTU1Byb3BlcnR5OwotY2xhc3MgQ1NTUnVsZUxpc3Q7
Ci1jbGFzcyBDU1NTZWxlY3RvcjsKLWNsYXNzIENTU1N0eWxlU2hlZXQ7Ci1jbGFzcyBDU1NWYWx1
ZTsKLWNsYXNzIENvbnRhaW5lck5vZGU7Ci1jbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247Ci1j
bGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXI7Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJM
aXN0OwotY2xhc3MgRG9jdW1lbnQ7Ci1jbGFzcyBFbGVtZW50OwotY2xhc3MgRnJhbWU7Ci1jbGFz
cyBGcmFtZVZpZXc7Ci1jbGFzcyBLVVJMOwotY2xhc3MgS2V5ZnJhbWVMaXN0OwotY2xhc3MgS2V5
ZnJhbWVWYWx1ZTsKLWNsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7Ci1jbGFzcyBOb2RlOwotY2xh
c3MgUmVuZGVyUmVnaW9uOwotY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOwotY2xhc3MgUnVsZURhdGE7
Ci1jbGFzcyBSdWxlU2V0OwotY2xhc3MgU2V0dGluZ3M7Ci1jbGFzcyBTdGF0aWNDU1NSdWxlTGlz
dDsKLWNsYXNzIFN0eWxlQnVpbGRlcjsKLWNsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKLWNsYXNz
IFN0eWxlSW1hZ2U7Ci1jbGFzcyBTdHlsZUtleWZyYW1lOwotY2xhc3MgU3R5bGVQZW5kaW5nSW1h
Z2U7Ci1jbGFzcyBTdHlsZVByb3BlcnR5U2V0OwotY2xhc3MgU3R5bGVSdWxlOwotI2lmIEVOQUJM
RShTSEFET1dfRE9NKQotY2xhc3MgU3R5bGVSdWxlSG9zdDsKLSNlbmRpZgotY2xhc3MgU3R5bGVS
dWxlS2V5ZnJhbWVzOwogY2xhc3MgU3R5bGVSdWxlUGFnZTsKLWNsYXNzIFN0eWxlUnVsZVJlZ2lv
bjsKLWNsYXNzIFN0eWxlU2hhZGVyOwotY2xhc3MgU3R5bGVTaGVldDsKLWNsYXNzIFN0eWxlU2hl
ZXRMaXN0OwotY2xhc3MgU3R5bGVkRWxlbWVudDsKLWNsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZl
cjsKLWNsYXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOwotY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFs
dWU7Ci1jbGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOwotCi1jbGFzcyBNZWRpYVF1ZXJ5
UmVzdWx0IHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RG
X01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgTWVkaWFRdWVyeVJlc3VsdChjb25z
dCBNZWRpYVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKLSAgICAgICAgOiBtX2V4cHJlc3Np
b24oZXhwcikKLSAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCi0gICAgewotICAgIH0KLSAgICB2
b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKLQotICAgIE1l
ZGlhUXVlcnlFeHAgbV9leHByZXNzaW9uOwotICAgIGJvb2wgbV9yZXN1bHQ7Ci19OwotCi1lbnVt
IFN0eWxlU2hhcmluZ0JlaGF2aW9yIHsKLSAgICBBbGxvd1N0eWxlU2hhcmluZywKLSAgICBEaXNh
bGxvd1N0eWxlU2hhcmluZywKLX07Ci0KLS8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVz
ZWQgaW4gbWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKLS8vIGFyZSBpbnRlcnBy
ZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0
eWxlZCBvbmx5Ci0vLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCi0KLWVu
dW0gUnVsZU1hdGNoaW5nQmVoYXZpb3IgewotICAgIE1hdGNoQWxsUnVsZXMsCi0gICAgTWF0Y2hB
bGxSdWxlc0V4Y2x1ZGluZ1NNSUwsCi0gICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCi19Owot
Ci1jbGFzcyBQc2V1ZG9TdHlsZVJlcXVlc3QgewotcHVibGljOgotICAgIFBzZXVkb1N0eWxlUmVx
dWVzdChQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBT
Y3JvbGxiYXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCi0gICAgICAgIDogcHNldWRvSWQo
cHNldWRvSWQpCi0gICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQotICAgICAg
ICAsIHNjcm9sbGJhcihzY3JvbGxiYXIpCi0gICAgewotICAgIH0KLQotICAgIFBzZXVkb0lkIHBz
ZXVkb0lkOwotICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKLSAgICBSZW5kZXJTY3Jv
bGxiYXIqIHNjcm9sbGJhcjsKLX07Ci0KLWNsYXNzIE1hdGNoUmVxdWVzdCB7Ci1wdWJsaWM6Ci0g
ICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMg
PSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6
OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6
OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKLSAgICAg
ICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKLSAgICAgICAgLCBzY29w
ZShzY29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5
KSB7IH0KLSAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OwotICAgIGNvbnN0IGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXM7Ci0gICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7Ci0gICAgY29uc3Qg
U2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5Owot
fTsKIAotLy8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxl
bWVudCBiYXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCi1jbGFzcyBTdHlsZVJl
c29sdmVyIHsKLSAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CitjbGFzcyBQYWdlUnVsZUNvbGxlY3RvciB7CiBwdWJsaWM6Ci0g
ICAgU3R5bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
KTsKLSAgICB+U3R5bGVSZXNvbHZlcigpOworICAgIFBhZ2VSdWxlQ29sbGVjdG9yKFN0eWxlUmVz
b2x2ZXI6OlN0YXRlJiBzdGF0ZSwgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMpCisgICAgICAg
IDogbV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgLCBtX3J1bGVTZXRzKHJ1bGVTZXRzKSB7IH0KIAot
ICAgIC8vIFVzaW5nIHRoZXNlIGR1cmluZyB0cmVlIHdhbGsgd2lsbCBhbGxvdyBzdHlsZSBzZWxl
Y3RvciB0byBvcHRpbWl6ZSBjaGlsZCBhbmQgZGVzY2VuZGFudCBzZWxlY3RvciBsb29rdXBzLgot
ICAgIHZvaWQgcHVzaFBhcmVudEVsZW1lbnQoRWxlbWVudCopOwotICAgIHZvaWQgcG9wUGFyZW50
RWxlbWVudChFbGVtZW50Kik7Ci0gICAgdm9pZCBwdXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBT
aGFkb3dSb290Kik7Ci0gICAgdm9pZCBwb3BQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jv
b3QqKTsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICB2b2lkIGFkZEhvc3RSdWxlKFN0eWxl
UnVsZUhvc3QqIHJ1bGUsIGJvb2wgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbiwgY29uc3QgQ29u
dGFpbmVyTm9kZSogc2NvcGUpIHsgZW5zdXJlU2NvcGVSZXNvbHZlcigpLT5hZGRIb3N0UnVsZShy
dWxlLCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBzY29wZSk7IH0KLSNlbmRpZgotCi0gICAg
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUgPSAwLCBTdHlsZVNoYXJpbmdCZWhhdmlvciA9IEFsbG93U3R5bGVT
aGFyaW5nLAotICAgICAgICBSdWxlTWF0Y2hpbmdCZWhhdmlvciA9IE1hdGNoQWxsUnVsZXMsIFJl
bmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOwotCi0gICAgdm9pZCBrZXlmcmFtZVN0
eWxlc0ZvckFuaW1hdGlvbihFbGVtZW50KiwgY29uc3QgUmVuZGVyU3R5bGUqLCBLZXlmcmFtZUxp
c3QmKTsKLQotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHBzZXVkb1N0eWxlRm9yRWxlbWVu
dChFbGVtZW50KiwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiwgUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlKTsKLQotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yUGFnZShpbnQg
cGFnZUluZGV4KTsKLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBkZWZhdWx0U3R5bGVGb3JF
bGVtZW50KCk7Ci0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JUZXh0KFRleHQq
KTsKLQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckRvY3VtZW50
KERvY3VtZW50KiwgQ1NTRm9udFNlbGVjdG9yKiA9IDApOwotCi0gICAgUmVuZGVyU3R5bGUqIHN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5zdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5wYXJlbnRTdHlsZSgpOyB9Ci0g
ICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKTsgfQotICAgIEVsZW1lbnQqIGVsZW1lbnQoKSB7IHJldHVybiBt
X3N0YXRlLmVsZW1lbnQoKTsgfQotICAgIERvY3VtZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1f
ZG9jdW1lbnQ7IH0KLSAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIHNjb3BlUmVzb2x2ZXIoKSBjb25z
dCB7IHJldHVybiBtX3Njb3BlUmVzb2x2ZXIuZ2V0KCk7IH0KLSAgICBib29sIGhhc1BhcmVudE5v
ZGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudE5vZGUoKTsgfQotCi0gICAgLy8gRklY
TUU6IEl0IGNvdWxkIGJlIGJldHRlciB0byBjYWxsIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5
bGVTaGVldHMoKSBkaXJlY3RseSBhZnRlciB3ZSBmYWN0b3IgU3R5bGVSc29sdmVyIGZ1cnRoZXIu
Ci0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwODg5MAot
ICAgIHZvaWQgYXBwZW5kQXV0aG9yU3R5bGVTaGVldHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0
IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiYpOwotCi0gICAgRG9jdW1lbnRSdWxlU2V0
cyYgcnVsZVNldHMoKSB7IHJldHVybiBtX3J1bGVTZXRzOyB9Ci0gICAgY29uc3QgRG9jdW1lbnRS
dWxlU2V0cyYgcnVsZVNldHMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzOyB9Ci0KLSNpZiBF
TkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBTdHlsZVNjb3Bl
UmVzb2x2ZXIqIGVuc3VyZVNjb3BlUmVzb2x2ZXIoKQotICAgIHsKLSNpZiBFTkFCTEUoU1RZTEVf
U0NPUEVEKQotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgICAgICBBU1NFUlQoUnVudGltZUVu
YWJsZWRGZWF0dXJlczo6c2hhZG93RE9NRW5hYmxlZCgpIHx8IFJ1bnRpbWVFbmFibGVkRmVhdHVy
ZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1l
RW5hYmxlZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVuYWJsZWQoKSk7Ci0jZW5kaWYKLSNlbHNlCi0g
ICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkp
OwotI2VuZGlmCi0gICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyKQotICAgICAgICAgICAgbV9z
Y29wZVJlc29sdmVyID0gYWRvcHRQdHIobmV3IFN0eWxlU2NvcGVSZXNvbHZlcigpKTsKLSAgICAg
ICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsKLSAgICB9Ci0jZW5kaWYKKyAgICB2b2lk
IG1hdGNoQWxsUGFnZVJ1bGVzKGludCBwYWdlSW5kZXgpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoUmVzdWx0JiBtYXRjaGVkUmVzdWx0KCkgeyByZXR1cm4gbV9yZXN1bHQ7IH0KIAogcHJpdmF0
ZToKLSAgICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICBSZW5kZXJTdHlsZSogbG9j
YXRlU2hhcmVkU3R5bGUoKTsKLSAgICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNS
dWxlU2V0KFJ1bGVTZXQqKTsKLSAgICBib29sIHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNI
b3N0UnVsZXMoKTsKLSAgICBOb2RlKiBsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwg
dW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNvbnN0OwotICAgIFN0eWxlZEVsZW1lbnQqIGZp
bmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKE5vZGUqLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0Owot
ICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqKSBjb25zdDsK
LQotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVu
ZGVyU3R5bGUqLCBjb25zdCBTdHlsZUtleWZyYW1lKiwgS2V5ZnJhbWVWYWx1ZSYpOwotCi1wdWJs
aWM6Ci0gICAgLy8gVGhlc2UgbWV0aG9kcyB3aWxsIGdpdmUgYmFjayB0aGUgc2V0IG9mIHJ1bGVz
IHRoYXQgbWF0Y2hlZCBmb3IgYSBnaXZlbiBlbGVtZW50IChvciBhIHBzZXVkby1lbGVtZW50KS4K
LSAgICBlbnVtIENTU1J1bGVGaWx0ZXIgewotICAgICAgICBVQUFuZFVzZXJDU1NSdWxlcyAgID0g
MSA8PCAxLAotICAgICAgICBBdXRob3JDU1NSdWxlcyAgICAgID0gMSA8PCAyLAotICAgICAgICBF
bXB0eUNTU1J1bGVzICAgICAgID0gMSA8PCAzLAotICAgICAgICBDcm9zc09yaWdpbkNTU1J1bGVz
ID0gMSA8PCA0LAotICAgICAgICBBbGxCdXRFbXB0eUNTU1J1bGVzID0gVUFBbmRVc2VyQ1NTUnVs
ZXMgfCBBdXRob3JDU1NSdWxlcyB8IENyb3NzT3JpZ2luQ1NTUnVsZXMsCi0gICAgICAgIEFsbENT
U1J1bGVzICAgICAgICAgPSBBbGxCdXRFbXB0eUNTU1J1bGVzIHwgRW1wdHlDU1NSdWxlcywKLSAg
ICB9OwotICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHN0eWxlUnVsZXNGb3JFbGVtZW50KEVs
ZW1lbnQqLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOwot
ICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVs
ZW1lbnQqLCBQc2V1ZG9JZCwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNT
U1J1bGVzKTsKLQotICAgIC8vIEdpdmVuIGEgQ1NTIGtleXdvcmQgaW4gdGhlIHJhbmdlICh4eC1z
bWFsbCB0byAtd2Via2l0LXh4eC1sYXJnZSksIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KLSAg
ICAvLyB0aGUgY29ycmVjdCBmb250IHNpemUgc2NhbGVkIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3Mg
ZGVmYXVsdCAobWVkaXVtKS4KLSAgICBzdGF0aWMgZmxvYXQgZm9udFNpemVGb3JLZXl3b3JkKERv
Y3VtZW50KiwgaW50IGtleXdvcmQsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0K
LSAgICAvLyBHaXZlbiBhIGZvbnQgc2l6ZSBpbiBwaXhlbCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJl
dHVybiBsZWdhY3kgZm9udCBzaXplIGJldHdlZW4gMSBhbmQgNy4KLSAgICBzdGF0aWMgaW50IGxl
Z2FjeUZvbnRTaXplKERvY3VtZW50KiwgaW50IHBpeGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNl
Rml4ZWREZWZhdWx0U2l6ZSk7Ci0KLXB1YmxpYzoKLSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb1N0
eWxlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwgUmVuZGVyU3R5bGUqKTsKLQotICAgIHZvaWQg
YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0K
LSAgICB2b2lkIHVwZGF0ZUZvbnQoKTsKLSAgICB2b2lkIGluaXRpYWxpemVGb250U3R5bGUoU2V0
dGluZ3MqKTsKLQotICAgIHN0YXRpYyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVk
U2l6ZShEb2N1bWVudCosIGZsb2F0IHpvb21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZs
b2F0IHNwZWNpZmllZFNpemUsIEVTbWFydE1pbmltdW1Gb3JGb250U2l6ZSA9IFVzZVNtYXJ0TWlu
aW11bUZvckZvbnRGaXplKTsKLQotICAgIHZvaWQgc2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9u
JiwgZmxvYXQgc2l6ZSk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVk
U2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiwgUmVuZGVyU3R5bGUqLCBib29sIGlzQWJz
b2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcyk7Ci0K
LXB1YmxpYzoKLSAgICBib29sIHVzZVNWR1pvb21SdWxlcygpOwotCi0gICAgc3RhdGljIGJvb2wg
Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVW
YWx1ZSopOwotICAgIENvbG9yIGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZh
bHVlKiwgYm9vbCBmb3JWaXNpdGVkTGluayA9IGZhbHNlKSBjb25zdDsKLQotICAgIGJvb2wgaGFz
U2VsZWN0b3JGb3JJZChjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLSAgICBib29sIGhhc1Nl
bGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBoYXNT
ZWxlY3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKLQotICAgIENT
U0ZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9mb250U2VsZWN0
b3IuZ2V0KCk7IH0KLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIFZpZXdw
b3J0U3R5bGVSZXNvbHZlciogdmlld3BvcnRTdHlsZVJlc29sdmVyKCkgeyByZXR1cm4gbV92aWV3
cG9ydFN0eWxlUmVzb2x2ZXIuZ2V0KCk7IH0KLSNlbmRpZgotCi0gICAgdm9pZCBhZGRWaWV3cG9y
dERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHQoY29uc3QgTWVkaWFRdWVyeUV4cCosIGJvb2wgcmVz
dWx0KTsKLSAgICBib29sIGhhc1ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyaWVzKCkgY29uc3Qg
eyByZXR1cm4gIW1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5pc0VtcHR5KCk7
IH0KLSAgICBib29sIGFmZmVjdGVkQnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0OwotCi0gICAgdm9p
ZCBhZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPik7Ci0KLSAg
ICBib29sIGNoZWNrUmVnaW9uU3R5bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0KLSAgICBi
b29sIHVzZXNTaWJsaW5nUnVsZXMoKSBjb25zdCB7IHJldHVybiAhbV9ydWxlU2V0cy5mZWF0dXJl
cygpLnNpYmxpbmdSdWxlcy5pc0VtcHR5KCk7IH0KLSAgICBib29sIHVzZXNGaXJzdExpbmVSdWxl
cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS51c2VzRmlyc3RMaW5lUnVs
ZXM7IH0KLSAgICBib29sIHVzZXNCZWZvcmVBZnRlclJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9y
dWxlU2V0cy5mZWF0dXJlcygpLnVzZXNCZWZvcmVBZnRlclJ1bGVzOyB9Ci0KLSAgICBzdGF0aWMg
Ym9vbCBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJT
dHlsZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9u
cyYgb3V0T3BlcmF0aW9ucyk7Ci0gICAgCi0gICAgdm9pZCBpbnZhbGlkYXRlTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZSgpOwotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKQotICAgIGJvb2wgY3JlYXRl
RmlsdGVyT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUs
IFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMp
OwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICBTdHlsZVNoYWRlciogc3R5bGVTaGFkZXIo
Q1NTVmFsdWUqKTsKLSAgICBTdHlsZVNoYWRlciogY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJG
cm9tVmFsdWUoV2ViS2l0Q1NTU2hhZGVyVmFsdWUqKTsKLSAgICBib29sIHBhcnNlQ3VzdG9tRmls
dGVyUGFyYW1ldGVyTGlzdChDU1NWYWx1ZSosIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmKTsK
LSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8
Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNv
bnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0
cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQ
YXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKGNvbnN0IFN0cmlu
ZyYgbmFtZSwgQ1NTVmFsdWVMaXN0Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVy
YXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50
YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9w
ZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
PiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAg
ICB2b2lkIGxvYWRQZW5kaW5nU2hhZGVycygpOwotI2VuZGlmCi0jaWYgRU5BQkxFKFNWRykKLSAg
ICB2b2lkIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7Ci0jZW5kaWYKLSNlbmRpZiAvLyBFTkFC
TEUoQ1NTX0ZJTFRFUlMpCi0KLSAgICB2b2lkIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLXBy
aXZhdGU6Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNp
emUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFz
IGNoYW5nZWQuIC1kd2gKLSAgICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5k
ZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpv
b21DaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAg
dm9pZCBhZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVy
U3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50Kik7Ci0KLSAgICBzdHJ1Y3QgUnVsZVJhbmdlIHsK
LSAgICAgICAgUnVsZVJhbmdlKGludCYgZmlyc3RSdWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJbmRl
eCk6IGZpcnN0UnVsZUluZGV4KGZpcnN0UnVsZUluZGV4KSwgbGFzdFJ1bGVJbmRleChsYXN0UnVs
ZUluZGV4KSB7IH0KLSAgICAgICAgaW50JiBmaXJzdFJ1bGVJbmRleDsKLSAgICAgICAgaW50JiBs
YXN0UnVsZUluZGV4OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWF0Y2hSYW5nZXMgewotICAgICAg
ICBNYXRjaFJhbmdlcygpIDogZmlyc3RVQVJ1bGUoLTEpLCBsYXN0VUFSdWxlKC0xKSwgZmlyc3RB
dXRob3JSdWxlKC0xKSwgbGFzdEF1dGhvclJ1bGUoLTEpLCBmaXJzdFVzZXJSdWxlKC0xKSwgbGFz
dFVzZXJSdWxlKC0xKSB7IH0KLSAgICAgICAgaW50IGZpcnN0VUFSdWxlOwotICAgICAgICBpbnQg
bGFzdFVBUnVsZTsKLSAgICAgICAgaW50IGZpcnN0QXV0aG9yUnVsZTsKLSAgICAgICAgaW50IGxh
c3RBdXRob3JSdWxlOwotICAgICAgICBpbnQgZmlyc3RVc2VyUnVsZTsKLSAgICAgICAgaW50IGxh
c3RVc2VyUnVsZTsKLSAgICAgICAgUnVsZVJhbmdlIFVBUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVs
ZVJhbmdlKGZpcnN0VUFSdWxlLCBsYXN0VUFSdWxlKTsgfQotICAgICAgICBSdWxlUmFuZ2UgYXV0
aG9yUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0QXV0aG9yUnVsZSwgbGFzdEF1
dGhvclJ1bGUpOyB9Ci0gICAgICAgIFJ1bGVSYW5nZSB1c2VyUnVsZVJhbmdlKCkgeyByZXR1cm4g
UnVsZVJhbmdlKGZpcnN0VXNlclJ1bGUsIGxhc3RVc2VyUnVsZSk7IH0KLSAgICB9OwotCi0gICAg
c3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzIHsKLSAgICAgICAgTWF0Y2hlZFByb3BlcnRpZXMoKTsK
LSAgICAgICAgfk1hdGNoZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5
VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwotICAgICAgICAKLSAgICAgICAgUmVmUHRy
PFN0eWxlUHJvcGVydHlTZXQ+IHByb3BlcnRpZXM7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAg
ICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA6IDI7
Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgd2hpdGVsaXN0VHlwZSA6IDI7Ci0gICAgICAgICAg
ICB9OwotICAgICAgICAgICAgLy8gVXNlZCB0byBtYWtlIHN1cmUgYWxsIG1lbW9yeSBpcyB6ZXJv
LWluaXRpYWxpemVkIHNpbmNlIHdlIGNvbXB1dGUgdGhlIGhhc2ggb3ZlciB0aGUgYnl0ZXMgb2Yg
dGhpcyBvYmplY3QuCi0gICAgICAgICAgICB2b2lkKiBwb3NzaWJseVBhZGRlZE1lbWJlcjsKLSAg
ICAgICAgfTsKLSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoUmVzdWx0IHsKLSAgICAgICAgTWF0
Y2hSZXN1bHQoKSA6IGlzQ2FjaGVhYmxlKHRydWUpIHsgfQotICAgICAgICBWZWN0b3I8TWF0Y2hl
ZFByb3BlcnRpZXMsIDY0PiBtYXRjaGVkUHJvcGVydGllczsKLSAgICAgICAgVmVjdG9yPFN0eWxl
UnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7Ci0gICAgICAgIE1hdGNoUmFuZ2VzIHJhbmdlczsKLSAg
ICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKLSAgICB9OwotCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0
Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9y
Q2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVs
aXN0Tm9uZSk7Ci0gICAgdm9pZCBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0
JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJvb2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKLQot
ICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZVNNSUxQcm9w
ZXJ0aWVzKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQg
bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCopOwotICAgIHZvaWQgbWF0Y2hBdXRo
b3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQg
bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAg
ICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBp
bmNsdWRlRW1wdHlSdWxlcyk7Ci0KLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0
IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiosIGNvbnN0
IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotCi0gICAgYm9vbCBmYXN0UmVqZWN0U2VsZWN0
b3IoY29uc3QgUnVsZURhdGEmKSBjb25zdDsKLSAgICB2b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsK
LSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRjaFJlc3VsdCYpOwotCi0g
ICAgYm9vbCBydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUq
IHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5ID0g
U2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSk7Ci0gICAgYm9vbCBjaGVja1Jl
Z2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCog
cmVnaW9uRWxlbWVudCk7Ci0gICAgdm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1h
dGNoUmVzdWx0JiwgY29uc3QgRWxlbWVudCopOwotICAgIGVudW0gU3R5bGVBcHBsaWNhdGlvblBh
c3MgewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICBWYXJpYWJsZURlZmluaXRp
b25zLAotI2VuZGlmCi0gICAgICAgIEhpZ2hQcmlvcml0eVByb3BlcnRpZXMsCi0gICAgICAgIExv
d1ByaW9yaXR5UHJvcGVydGllcwotICAgIH07Ci0gICAgdGVtcGxhdGUgPFN0eWxlQXBwbGljYXRp
b25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNo
UmVzdWx0JiwgYm9vbCBpbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJv
b2wgaW5oZXJpdGVkT25seSk7Ci0gICAgdGVtcGxhdGUgPFN0eWxlQXBwbGljYXRpb25QYXNzIHBh
c3M+Ci0gICAgdm9pZCBhcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJv
cGVydGllcywgU3R5bGVSdWxlKiwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5
LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOwotI2lmIEVO
QUJMRShDU1NfVkFSSUFCTEVTKQotICAgIHZvaWQgcmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0
eUlELCBDU1NWYWx1ZSosIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+
JiBrbm93bkV4cHJlc3Npb25zKTsKLSNlbmRpZgotICAgIHN0YXRpYyBib29sIGlzVmFsaWRSZWdp
b25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOwotI2lmIEVOQUJMRShWSURFT19UUkFDSykK
LSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEKTsK
LSNlbmRpZgotICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kiwg
Ym9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1l
KTsKLSAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+
JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mLCBib29sIGlzTGVm
dFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOwotICAgIFNl
dHRpbmdzKiBkb2N1bWVudFNldHRpbmdzKCkgeyByZXR1cm4gbV9kb2N1bWVudC0+c2V0dGluZ3Mo
KTsgfQotCiAgICAgYm9vbCBpc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OwogICAgIGJv
b2wgaXNSaWdodFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3QgeyByZXR1cm4gIWlzTGVmdFBhZ2Uo
cGFnZUluZGV4KTsgfQogICAgIGJvb2wgaXNGaXJzdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7
CiAgICAgU3RyaW5nIHBhZ2VOYW1lKGludCBwYWdlSW5kZXgpIGNvbnN0OwogCi0gICAgRG9jdW1l
bnRSdWxlU2V0cyBtX3J1bGVTZXRzOwotCi0gICAgdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmlu
Z0ltcGwqLCBSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiA+IEtleWZyYW1lc1J1bGVNYXA7Ci0g
ICAgS2V5ZnJhbWVzUnVsZU1hcCBtX2tleWZyYW1lc1J1bGVNYXA7Ci0KLXB1YmxpYzoKLSAgICB0
eXBlZGVmIEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwgUmVmUHRyPENTU1ZhbHVlPiA+IFBlbmRpbmdJ
bWFnZVByb3BlcnR5TWFwOwotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykK
LSAgICB0eXBlZGVmIEhhc2hNYXA8RmlsdGVyT3BlcmF0aW9uKiwgUmVmUHRyPFdlYktpdENTU1NW
R0RvY3VtZW50VmFsdWU+ID4gUGVuZGluZ1NWR0RvY3VtZW50TWFwOwotI2VuZGlmCi0KLSAgICBj
bGFzcyBTdGF0ZSB7Ci0gICAgICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0YXRlKTsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIFN0YXRlKCkKLSAgICAgICAgOiBtX2VsZW1lbnQoMCkKLSAgICAgICAg
LCBtX3N0eWxlZEVsZW1lbnQoMCkKLSAgICAgICAgLCBtX3BhcmVudE5vZGUoMCkKLSAgICAgICAg
LCBtX3BhcmVudFN0eWxlKDApCi0gICAgICAgICwgbV9yb290RWxlbWVudFN0eWxlKDApCi0gICAg
ICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCi0gICAgICAgICwgbV9zYW1lT3JpZ2luT25seShm
YWxzZSkKLSAgICAgICAgLCBtX3BzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETykKLSAgICAgICAg
LCBtX2VsZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRlTGluaykKLSAgICAgICAgLCBtX2Rpc3RyaWJ1
dGVkVG9JbnNlcnRpb25Qb2ludChmYWxzZSkKLSAgICAgICAgLCBtX2VsZW1lbnRBZmZlY3RlZEJ5
Q2xhc3NSdWxlcyhmYWxzZSkKLSAgICAgICAgLCBtX21vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNv
bHZpbmdTdHlsZSkKLSAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVl
KQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSkKLSNp
ZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgICwgbV9oYXNQZW5kaW5nU2hhZGVycyhmYWxz
ZSkKLSNlbmRpZgotICAgICAgICAsIG1fbGluZUhlaWdodFZhbHVlKDApCi0gICAgICAgICwgbV9m
b250RGlydHkoZmFsc2UpCi0gICAgICAgICwgbV9oYXNVQUFwcGVhcmFuY2UoZmFsc2UpCi0gICAg
ICAgICwgbV9iYWNrZ3JvdW5kRGF0YShCYWNrZ3JvdW5kRmlsbExheWVyKSB7IH0KLQotICAgIHB1
YmxpYzoKLSAgICAgICAgdm9pZCBpbml0RWxlbWVudChFbGVtZW50Kik7Ci0gICAgICAgIHZvaWQg
aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCosIEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUgPSAwLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmID0gUHNldWRvU3R5bGVSZXF1
ZXN0KE5PUFNFVURPKSwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7Ci0gICAg
ICAgIHZvaWQgY2xlYXIoKTsKLQotICAgICAgICBEb2N1bWVudCogZG9jdW1lbnQoKSBjb25zdCB7
IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50KCk7IH0KLSAgICAgICAgRWxlbWVudCogZWxlbWVu
dCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsgfQotICAgICAgICBTdHlsZWRFbGVtZW50KiBz
dHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZWRFbGVtZW50OyB9Ci0gICAgICAg
IHZvaWQgc2V0U3R5bGUoUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGUpIHsgbV9zdHlsZSA9
IHN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c3R5bGUuZ2V0KCk7IH0KLSAgICAgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gdGFrZVN0eWxl
KCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KLQotICAgICAgICBTdGF0aWNDU1NSdWxl
TGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
dGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7IH0KLQotICAgICAg
ICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJl
bnROb2RlOyB9Ci0gICAgICAgIHZvaWQgc2V0UGFyZW50U3R5bGUoUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsgfQotICAgICAgICBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudFN0eWxlOyB9Ci0gICAg
ICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9yb290
RWxlbWVudFN0eWxlOyB9Ci0KLSAgICAgICAgY29uc3QgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JT
dHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JTdHlsaW5nOyB9Ci0gICAgICAgIHZv
aWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KSB7IG1fc2FtZU9yaWdp
bk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIGJvb2wgaXNTYW1lT3JpZ2luT25s
eSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgY29uc3QgUHNl
dWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QoKSBjb25zdCB7IHJldHVybiBtX3Bz
ZXVkb1N0eWxlUmVxdWVzdDsgfQotICAgICAgICBFSW5zaWRlTGluayBlbGVtZW50TGlua1N0YXRl
KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRlOyB9Ci0gICAgICAgIGJvb2wgZGlz
dHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9kaXN0cmlidXRlZFRv
SW5zZXJ0aW9uUG9pbnQ7IH0KLSAgICAgICAgdm9pZCBzZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNz
UnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzID0g
aXNBZmZlY3RlZDsgfQotICAgICAgICBib29sIGVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygp
IGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOyB9Ci0gICAgICAg
IHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2Rl
OyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4g
bV9tb2RlOyB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIHNldEFwcGx5UHJvcGVydHlUb1JlZ3Vs
YXJTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUgPSBp
c0FwcGx5OyB9Ci0gICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHls
ZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlID0gaXNB
cHBseTsgfQotICAgICAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOyB9Ci0gICAgICAgIGJvb2wg
YXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQ
cm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsgfQotICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0
eU1hcCYgcGVuZGluZ0ltYWdlUHJvcGVydGllcygpIHsgcmV0dXJuIG1fcGVuZGluZ0ltYWdlUHJv
cGVydGllczsgfQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICAg
ICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwJiBwZW5kaW5nU1ZHRG9jdW1lbnRzKCkgeyByZXR1cm4g
bV9wZW5kaW5nU1ZHRG9jdW1lbnRzOyB9Ci0jZW5kaWYKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
Ci0gICAgICAgIHZvaWQgc2V0SGFzUGVuZGluZ1NoYWRlcnMoYm9vbCBoYXNQZW5kaW5nU2hhZGVy
cykgeyBtX2hhc1BlbmRpbmdTaGFkZXJzID0gaGFzUGVuZGluZ1NoYWRlcnM7IH0KLSAgICAgICAg
Ym9vbCBoYXNQZW5kaW5nU2hhZGVycygpIGNvbnN0IHsgcmV0dXJuIG1faGFzUGVuZGluZ1NoYWRl
cnM7IH0KLSNlbmRpZgotCi0gICAgICAgIHZvaWQgc2V0TGluZUhlaWdodFZhbHVlKENTU1ZhbHVl
KiB2YWx1ZSkgeyBtX2xpbmVIZWlnaHRWYWx1ZSA9IHZhbHVlOyB9Ci0gICAgICAgIENTU1ZhbHVl
KiBsaW5lSGVpZ2h0VmFsdWUoKSB7IHJldHVybiBtX2xpbmVIZWlnaHRWYWx1ZTsgfQotICAgICAg
ICB2b2lkIHNldEZvbnREaXJ0eShib29sIGlzRGlydHkpIHsgbV9mb250RGlydHkgPSBpc0RpcnR5
OyB9Ci0gICAgICAgIGJvb2wgZm9udERpcnR5KCkgY29uc3QgeyByZXR1cm4gbV9mb250RGlydHk7
IH0KLQotICAgICAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOwotICAgICAgICBi
b29sIGhhc1VBQXBwZWFyYW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzVUFBcHBlYXJhbmNlOyB9
Ci0gICAgICAgIEJvcmRlckRhdGEgYm9yZGVyRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYm9yZGVy
RGF0YTsgfQotICAgICAgICBGaWxsTGF5ZXIgYmFja2dyb3VuZERhdGEoKSBjb25zdCB7IHJldHVy
biBtX2JhY2tncm91bmREYXRhOyB9Ci0gICAgICAgIENvbG9yIGJhY2tncm91bmRDb2xvcigpIGNv
bnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9yOyB9Ci0KLSAgICAgICAgY29uc3QgRm9udERl
c2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0eWxlLT5mb250RGVzY3Jp
cHRpb24oKTsgfQotICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnREZXNj
cmlwdGlvbigpIHsgcmV0dXJuIG1fcGFyZW50U3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9Ci0g
ICAgICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9uKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldEZvbnREZXNjcmlwdGlv
bihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgICAgIHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1f
Zm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFpvb20oZik7IH0KLSAgICAgICAgdm9pZCBzZXRFZmZl
Y3RpdmVab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0RWZmZWN0aXZl
Wm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldFdyaXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRp
bmdNb2RlKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdN
b2RlKTsgfQotICAgICAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24g
dGV4dE9yaWVudGF0aW9uKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRh
dGlvbih0ZXh0T3JpZW50YXRpb24pOyB9Ci0KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRh
KiwgMzI+JiBtYXRjaGVkUnVsZXMoKSB7IHJldHVybiBtX21hdGNoZWRSdWxlczsgfQotICAgICAg
ICB2b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1
bGVzLmFwcGVuZChydWxlKTsgfQotICAgICAgICAKLSAgICBwcml2YXRlOgotICAgICAgICAvLyBG
SVhNRShidWcgMTA4NTYzKTogdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1i
ZXIKLSAgICAgICAgLy8gdmFyaWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFk
ZCBtZXRob2RzIHRvIGFjY2VzcwotICAgICAgICAvLyB0aGVzZSB2YXJpYWJsZXMuCi0gICAgICAg
IEVsZW1lbnQqIG1fZWxlbWVudDsKLSAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3N0eWxl
OwotICAgICAgICBTdHlsZWRFbGVtZW50KiBtX3N0eWxlZEVsZW1lbnQ7Ci0gICAgICAgIENvbnRh
aW5lck5vZGUqIG1fcGFyZW50Tm9kZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5
bGU7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBtX3Jvb3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAot
ICAgICAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9uRm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBt
X3NhbWVPcmlnaW5Pbmx5OwotICAgICAgICBQc2V1ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHls
ZVJlcXVlc3Q7Ci0KLSAgICAgICAgRUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRlOwotCi0g
ICAgICAgIGJvb2wgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7Ci0KLSAgICAgICAgYm9v
bCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsKLQotICAgICAgICBTZWxlY3RvckNoZWNr
ZXI6Ok1vZGUgbV9tb2RlOwotCi0gICAgICAgIC8vIEEgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUg
c2V0IG9mIG1hdGNoZWQgcnVsZXMgZm9yIGFuIGVsZW1lbnQsCi0gICAgICAgIC8vIGFuZCBhIHRl
bXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgbWVyZ2Ugc29ydGluZy4KLSAgICAgICAgVmVjdG9yPGNv
bnN0IFJ1bGVEYXRhKiwgMzI+IG1fbWF0Y2hlZFJ1bGVzOwotICAgICAgICBSZWZQdHI8U3RhdGlj
Q1NTUnVsZUxpc3Q+IG1fcnVsZUxpc3Q7Ci0KLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlU
b1JlZ3VsYXJTdHlsZTsKLSAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5r
U3R5bGU7Ci0KLSAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQ
cm9wZXJ0aWVzOwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgYm9vbCBtX2hhc1Bl
bmRpbmdTaGFkZXJzOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUo
U1ZHKQotICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRz
OwotI2VuZGlmCi0gICAgICAgIENTU1ZhbHVlKiBtX2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAg
Ym9vbCBtX2ZvbnREaXJ0eTsKLQotICAgICAgICBib29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAg
ICAgICBCb3JkZXJEYXRhIG1fYm9yZGVyRGF0YTsKLSAgICAgICAgRmlsbExheWVyIG1fYmFja2dy
b3VuZERhdGE7Ci0gICAgICAgIENvbG9yIG1fYmFja2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAg
ICBzdGF0aWMgUmVuZGVyU3R5bGUqIHN0eWxlTm90WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19z
dHlsZU5vdFlldEF2YWlsYWJsZTsgfQotCi0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHls
ZUltYWdlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUlt
YWdlPiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1
ZSopOwotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZh
bHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUo
Q1NTX0lNQUdFX1NFVCkKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zy
b21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQ
YXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0
eUlELCBDU1NDdXJzb3JJbWFnZVZhbHVlKik7Ci0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1Jl
Z3VsYXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxh
clN0eWxlKCk7IH0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBj
b25zdCB7IHJldHVybiBtX3N0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsg
fQotCi0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFs
dWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBs
aWVyID0gMSk7Ci0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmlt
aXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91Ymxl
IG11bHRpcGxpZXIgPSAxKTsKLQotICAgIENTU1RvU3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1
cm4gJm1fc3R5bGVNYXA7IH0KLSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JD
U1NPTVdyYXBwZXJzKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAg
Y29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRl
LmZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRG
b250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigp
OyB9Ci0gICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBm
b250RGVzY3JpcHRpb24pIHsgbV9zdGF0ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0
aW9uKTsgfQotICAgIHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsg
fQotICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0
aXZlWm9vbShmKTsgfQotICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGlu
Z01vZGUpIHsgbV9zdGF0ZS5zZXRXcml0aW5nTW9kZSh3cml0aW5nTW9kZSk7IH0KLSAgICB2b2lk
IHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4dE9yaWVudGF0aW9uKSB7IG1f
c3RhdGUuc2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KLSAgICAKLSAgICB2
b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKLSAgICAKLXBy
aXZhdGU6Ci0gICAgc3RhdGljIFJlbmRlclN0eWxlKiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOwot
Ci0gICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKLQotcHJpdmF0ZToKLSAgICBi
b29sIGNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAg
ICB2b2lkIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKLQotI2lmIEVO
QUJMRShTVkcpCi0gICAgdm9pZCBhcHBseVNWR1Byb3BlcnR5KENTU1Byb3BlcnR5SUQsIENTU1Zh
bHVlKik7Ci0jZW5kaWYKLQotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZFBlbmRpbmdJ
bWFnZShTdHlsZVBlbmRpbmdJbWFnZSopOwotICAgIHZvaWQgbG9hZFBlbmRpbmdJbWFnZXMoKTsK
KyAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzKFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2Us
IGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0
Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywg
Y29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9v
bCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CiAKLSAgICBzdGF0aWMgdW5z
aWduZWQgY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGll
cyosIHVuc2lnbmVkIHNpemUpOwotICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRl
bSB7Ci0gICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNv
bnN0OwotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+IG1hdGNoZWRQcm9wZXJ0aWVz
OwotICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHls
ZT4gcmVuZGVyU3R5bGU7Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcGFyZW50UmVuZGVy
U3R5bGU7Ci0gICAgfTsKLSAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogZmlu
ZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVz
dWx0Jik7Ci0gICAgdm9pZCBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVy
U3R5bGUqLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNv
bnN0IE1hdGNoUmVzdWx0Jik7CisgICAgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIG1fc3Rh
dGU7CisgICAgRG9jdW1lbnRSdWxlU2V0cyYgbV9ydWxlU2V0czsKIAotICAgIC8vIEV2ZXJ5IE4g
YWRkaXRpb25zIHRvIHRoZSBtYXRjaGVkIGRlY2xhcmF0aW9uIGNhY2hlIHRyaWdnZXIgYSBzd2Vl
cCB3aGVyZSBlbnRyaWVzIGhvbGRpbmcKLSAgICAvLyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBz
dHlsZSBkZWNsYXJhdGlvbiBhcmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gICAgdm9pZCBzd2VlcE1h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZlcj4qKTsKLQotICAgIGJvb2wg
Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0U3RyaW5nJikgY29uc3Q7
Ci0gICAgYm9vbCBzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRy
aWJ1dGVzKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIHVuc2lnbmVkIG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwOwotCi0gICAgdHlwZWRlZiBIYXNo
TWFwPHVuc2lnbmVkLCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbT4gTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlIG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZTsKLQotICAgIFRpbWVyPFN0eWxlUmVzb2x2ZXI+IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZVN3ZWVwVGltZXI7Ci0KLSAgICBPd25QdHI8TWVkaWFRdWVyeUV2YWx1YXRvcj4gbV9tZWRpdW07
Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3Jvb3REZWZhdWx0U3R5bGU7Ci0KLSAgICBEb2N1
bWVudCogbV9kb2N1bWVudDsKLSAgICBTZWxlY3RvckZpbHRlciBtX3NlbGVjdG9yRmlsdGVyOwot
Ci0gICAgYm9vbCBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlczsKLQotICAgIFJlZlB0cjxDU1NG
b250U2VsZWN0b3I+IG1fZm9udFNlbGVjdG9yOwotICAgIFZlY3RvcjxPd25QdHI8TWVkaWFRdWVy
eVJlc3VsdD4gPiBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHM7Ci0KLSNpZiBF
TkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIFJlZlB0cjxWaWV3cG9ydFN0eWxlUmVz
b2x2ZXI+IG1fdmlld3BvcnRTdHlsZVJlc29sdmVyOwotI2VuZGlmCi0KLSAgICBjb25zdCBTdHls
ZUJ1aWxkZXImIG1fc3R5bGVCdWlsZGVyOwotCi0gICAgT3duUHRyPFN0eWxlU2NvcGVSZXNvbHZl
cj4gbV9zY29wZVJlc29sdmVyOwotICAgIENTU1RvU3R5bGVNYXAgbV9zdHlsZU1hcDsKLSAgICBJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzIG1faW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKLQotICAgIFN0
YXRlIG1fc3RhdGU7Ci0KLSAgICBmcmllbmQgY2xhc3MgU3R5bGVCdWlsZGVyOwotICAgIGZyaWVu
ZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVk
UHJvcGVydGllcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hlZFBy
b3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOwotICAgIGZyaWVuZCBib29sIG9w
ZXJhdG9yPT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdlcyYpOwotICAgIGZy
aWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdl
cyYpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0IG1fcmVzdWx0OwogfTsKIAotaW5s
aW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRv
bWljU3RyaW5nICZhdHRyaWJ1dGVOYW1lKSBjb25zdAotewotICAgIEFTU0VSVCghYXR0cmlidXRl
TmFtZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJ
blJ1bGVzLmNvbnRhaW5zKGF0dHJpYnV0ZU5hbWUuaW1wbCgpKTsKLX0KLQotaW5saW5lIGJvb2wg
U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmIGNs
YXNzVmFsdWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFjbGFzc1ZhbHVlLmlzRW1wdHkoKSk7Ci0g
ICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhj
bGFzc1ZhbHVlLmltcGwoKSk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1Nl
bGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5nJiBpZFZhbHVlKSBjb25zdAotewotICAgIEFT
U0VSVCghaWRWYWx1ZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVz
KCkuaWRzSW5SdWxlcy5jb250YWlucyhpZFZhbHVlLmltcGwoKSk7Ci19Ci0KIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKIAotI2VuZGlmIC8vIFN0eWxlUmVzb2x2ZXJfaAorI2VuZGlmIC8vIFBhZ2VS
dWxlQ29sbGVjdG9yX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAJKHJl
dmlzaW9uIDE0NTIwMCkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgIkNvdW50ZXJDb250ZW50
LmgiCiAjaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgogI2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5oIgogI2luY2x1
ZGUgIkVsZW1lbnRTaGFkb3cuaCIKICNpbmNsdWRlICJGb250RmVhdHVyZVZhbHVlLmgiCiAjaW5j
bHVkZSAiRm9udFZhbHVlLmgiCkBAIC04Niw2ICs4Nyw3IEBACiAjaW5jbHVkZSAiTm9kZVJlbmRl
clN0eWxlLmgiCiAjaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQuaCIKICNpbmNsdWRlICJQ
YWdlLmgiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xsZWN0b3IuaCIKICNpbmNsdWRlICJQYWlyLmgi
CiAjaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKICNpbmNsdWRlICJR
dW90ZXNEYXRhLmgiCkBAIC0xMDcsNyArMTA5LDYgQEAKICNpbmNsdWRlICJTaGFkb3dEYXRhLmgi
CiAjaW5jbHVkZSAiU2hhZG93Um9vdC5oIgogI2luY2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCi0jaW5j
bHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKICNpbmNsdWRlICJTa2V3VHJhbnNm
b3JtT3BlcmF0aW9uLmgiCiAjaW5jbHVkZSAiU3R5bGVCdWlsZGVyLmgiCiAjaW5jbHVkZSAiU3R5
bGVDYWNoZWRJbWFnZS5oIgpAQCAtMjEwLDMwICsyMTEsNiBAQCBpZiAoaXNJbml0aWFsKSB7IFwK
IAogUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CiAK
LXN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmln
aHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmln
aHREZWNsLT5pc0VtcHR5KCkpCi0gICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHko
Q1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlTHRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmln
aHREZWNsLmdldCgpOwotfQotCi1zdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnRE
ZWNsYXJhdGlvbigpCi17Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9w
ZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7
Ci0gICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQotICAgICAgICByaWdodFRvTGVm
dERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0g
ICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQoKTsKLX0KLQotCi1pbmxpbmUgU3RhdGljQ1NT
UnVsZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAg
aWYgKCFtX3J1bGVMaXN0KQotICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6
OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOwotfQotCiBpbmxpbmUgdm9p
ZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCkKIHsKICAg
ICBtX2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2UoKTsKQEAgLTI1MSw4
ICsyMjgsNiBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIoCiAgICAg
bV9wYXJlbnRTdHlsZSA9IDA7CiAgICAgbV9wYXJlbnROb2RlID0gMDsKICAgICBtX3JlZ2lvbkZv
clN0eWxpbmcgPSAwOwotICAgIG1fcnVsZUxpc3QgPSAwOwotICAgIG1fbWF0Y2hlZFJ1bGVzLmNs
ZWFyKCk7CiAgICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7CiAjaWYgRU5BQkxF
KENTU19TSEFERVJTKQogICAgIG1faGFzUGVuZGluZ1NoYWRlcnMgPSBmYWxzZTsKQEAgLTI2Miw2
ICsyMzcsMTYgQEAgaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKAogI2Vu
ZGlmCiB9CiAKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVs
ZSwgdW5zaWduZWQgbGlua01hdGNoVHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5
V2hpdGVsaXN0VHlwZSkKK3sKKyAgICBtYXRjaGVkUHJvcGVydGllcy5ncm93KG1hdGNoZWRQcm9w
ZXJ0aWVzLnNpemUoKSArIDEpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVz
JiBuZXdQcm9wZXJ0aWVzID0gbWF0Y2hlZFByb3BlcnRpZXMubGFzdCgpOworICAgIG5ld1Byb3Bl
cnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRp
ZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNoVHlwZSA9IGxpbmtNYXRjaFR5cGU7Cisg
ICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0gcHJvcGVydHlXaGl0ZWxpc3RUeXBlOwor
ICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Cit9CisKIFN0eWxlUmVzb2x2ZXI6OlN0eWxl
UmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxl
cykKICAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVw
KDApCiAgICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyKHRoaXMsICZTdHls
ZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCkBAIC00MDUsMTgyICszOTAs
NiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpCiAgICAgbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOwogfQogCi12b2lk
IFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJl
c3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxl
LCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlX
aGl0ZWxpc3RUeXBlKQotewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3co
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFBy
b3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5s
YXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVBy
b3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBl
ID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9w
ZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChy
dWxlKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJv
cGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9w
ZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKLXsKLSAgICBpZiAoIXByb3BlcnR5U2V0KQotICAg
ICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRo
b3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJl
c3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVz
dWx0LCBwcm9wZXJ0eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hlYWJsZSkKLSAgICAgICAgcmVzdWx0
LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsK
LXB1YmxpYzoKLSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotICAgIH5NYXRjaGluZ1VBUnVs
ZXNTY29wZSgpOwotCi0gICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKLQotcHJp
dmF0ZToKLSAgICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKLX07Ci0KLU1hdGNoaW5n
VUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgQVNTRVJUKCFtX21h
dGNoaW5nVUFSdWxlcyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwotfQotCi1NYXRj
aGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBtX21hdGNo
aW5nVUFSdWxlcyA9IGZhbHNlOwotfQotCi1pbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29w
ZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotewotICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsK
LX0KLQotYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxz
ZTsKLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRj
aFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgQVNT
RVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKLSAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkp
OwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0g
c3RhdGUuZWxlbWVudCgpOwotICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQg
PSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9J
ZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7Ci0gICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5
KCkpIHsKLSAgICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOwotICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1l
bnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAg
fQotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVs
ZW1lbnQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0j
ZW5kaWYKLSAgICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBs
aWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgotICAg
IC8vIGEpIGl0J3MgYSBVQSBydWxlCi0gICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1
dGhvciBydWxlcwotICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxl
IHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCi0gICAgVHJlZVNjb3BlKiB0cmVlU2Nv
cGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKLSAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3Bl
Ojppc01hdGNoaW5nVUFSdWxlcygpCi0gICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9y
U3R5bGVzKCkKLSAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0
LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNoUmVxdWVz
dC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3Vu
ZGFyeSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBy
dWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZl
ciBhbmQKLSAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZWxlbWVudC0+aGFz
SUQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxl
ZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBz
dHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMo
c3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVs
ZVJhbmdlKTsKLSAgICB9Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCi0gICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVk
b0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChTZWxlY3Rv
ckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQotICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRv
Q2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5s
b2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJl
cXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAgIGlmICghbV9zdGF0ZS5yZWdpb25G
b3JTdHlsaW5nKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBtYXRj
aFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25zdCBD
U1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdp
b25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGNoZWNr
UmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0
YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKLSAgICAgICAgICAgIFJ1bGVTZXQq
IHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5k
UnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsKLSAgICAgICAgICAgIEFTU0VSVChyZWdpb25S
dWxlcyk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVn
aW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNj
b3BlKSwgcnVsZVJhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsK
LSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSos
IDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7Ci0gICAgaWYgKG1hdGNo
ZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNvcnRNYXRjaGVkUnVs
ZXMoKTsKLQotICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0
aW5nUnVsZXMpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxl
cy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVz
KCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBv
ZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAg
ICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9u
QXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1
ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tp
XS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVk
UnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRl
bGlzdFR5cGUoKSk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVk
QXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykK
LXsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBp
ZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2ggc2Nv
cGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAo
cmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KLSAgICBpZiAobV9zY29wZVJlc29s
dmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29u
c2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7Ci0gICAgICAgIGJvb2wgYXBwbHlBdXRob3JT
dHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVz
KCk7Ci0gICAgICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7Ci0gICAgICAgIHVuc2lnbmVk
IHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7Ci0gICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9zdGF0
ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0gICAg
ICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9z
Y29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7Ci0gICAgICAgICAgICBkb2N1bWVudFNjb3Bl
ID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKLSAg
ICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcHBs
eUF1dGhvclN0eWxlcykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVz
U3R5bGVCb3VuZHMoZnJhbWUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5t
X3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAgICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwot
ICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJl
c3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAg
VU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCiBpbmxpbmUgYm9v
bCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkK
IHsKICNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKQEAgLTU5MCwxOTcgKzM5OSw2IEBAIGlubGluZSBi
b29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0MKICNlbmRpZgogfQogCi12b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMpCi17Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgQVNTRVJUKG1fc2Nv
cGVSZXNvbHZlcik7Ci0KLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAg
cmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxOwotCi0gICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7Ci0gICAgbV9z
Y29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1
bGVzKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkg
ewotICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxl
UmFuZ2UoKTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNo
ZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVtZW50KCkpLCBy
dWxlUmFuZ2UpOwotICAgIH0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0
KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5VU0VEX1BBUkFNKGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNo
QXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykK
LXsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwot
Ci0gICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8g
TWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0
KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVS
YW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0jaWYgRU5B
QkxFKFNIQURPV19ET00pCi0gICAgVmVjdG9yPE1hdGNoUmVxdWVzdD4gbWF0Y2hSZXF1ZXN0czsK
LSAgICBtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5jb2xsZWN0TWF0Y2hSZXF1
ZXN0cyhpbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7Ci0gICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtYXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQotICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOwotI2VuZGlmCi0KLSAgICBz
b3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLQotICAgIG1hdGNoU2NvcGVkQXV0
aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcykKLXsKLSAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkpCi0gICAgICAgIHJl
dHVybjsKLSAgICAKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0KLSAgICBy
ZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXpl
KCkgLSAxOwotICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5
bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1
bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRj
aFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24o
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKHJlc3VsdCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNo
UmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzKQotewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1
bGVzKCkuY2xlYXIoKTsKLSAgICAKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgPSByZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVz
KE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5nZSk7Ci0KLSAgICBzb3J0QW5kVHJhbnNmZXJN
YXRjaGVkUnVsZXMocmVzdWx0KTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0
Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1h
dGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBp
ZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRl
OwotICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZv
ciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29s
dmUuCi0gICAgLy8gQW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0
ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRoLgotICAgIGJvb2wg
Y2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3Rl
bnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5
ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnk7Ci0KLSAgICB1bnNpZ25l
ZCBzaXplID0gcnVsZXMtPnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6
ZTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChp
KTsKLSAgICAgICAgaWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0
UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRh
LmRlc2NlbmRhbnRTZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLQotICAgICAgICBTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxlKCk7Ci0gICAg
ICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0
cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0gICAg
ICAgIFBzZXVkb0lkIGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKLSAgICAgICAgaWYgKHJ1bGVN
YXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQc2V1ZG8sIG1hdGNo
UmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgcnVs
ZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1k
ZWJ1ZyBtb2RlLgotICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGll
cyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGlmICghcHJvcGVydGllcyB8fCAo
cHJvcGVydGllcy0+aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMp
KSB7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1
bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAvLyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRN
YXRjaGVkQ1NTUnVsZXMgQVBJIHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVk
ZWQuCi0gICAgICAgICAgICBpZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgpICYmICFydWxlRGF0
YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkpIHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIHdlJ3Jl
IG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgotICAgICAgICAgICAg
Ly8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50LgotICAgICAgICAgICAg
aWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUubW9k
ZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFs
c2UpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJTVF9JTlRFUk5BTF9QU0VVRE9J
RCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SGFzUHNldWRvU3R5bGUo
ZHluYW1pY1BzZXVkbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8v
IFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4gdGhlIG1hdGNoZWQgcnVsZXMg
YXJyYXkuCi0gICAgICAgICAgICAgICAgKytydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKLSAgICAg
ICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID09IC0xKQotICAgICAgICAg
ICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJ
bmRleDsKLQotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2Yg
bWF0Y2hlZCBydWxlcy4KLSAgICAgICAgICAgICAgICBtX3N0YXRlLmFkZE1hdGNoZWRSdWxlKCZy
dWxlRGF0YSk7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRN
YXRjaFJ1bGUoY29va2llLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRp
ZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9v
bCBjb21wYXJlUnVsZXMoY29uc3QgUnVsZURhdGEqIHIxLCBjb25zdCBSdWxlRGF0YSogcjIpCi17
Ci0gICAgdW5zaWduZWQgc3BlY2lmaWNpdHkxID0gcjEtPnNwZWNpZmljaXR5KCk7Ci0gICAgdW5z
aWduZWQgc3BlY2lmaWNpdHkyID0gcjItPnNwZWNpZmljaXR5KCk7Ci0gICAgcmV0dXJuIChzcGVj
aWZpY2l0eTEgPT0gc3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlvbigpIDwgcjItPnBvc2l0aW9u
KCkgOiBzcGVjaWZpY2l0eTEgPCBzcGVjaWZpY2l0eTI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6c29ydE1hdGNoZWRSdWxlcygpCi17Ci0gICAgc3RkOjpzb3J0KG1fc3RhdGUubWF0Y2hlZFJ1
bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVz
KTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQotewotICAgIG1hdGNoVUFSdWxlcyhy
ZXN1bHQpOwotCi0gICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgaWYg
KG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBtYXRjaFVzZXJSdWxlcyhyZXN1
bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVjayBhdXRob3IgcnVsZXMsIGJlZ2lubmluZyBm
aXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMgbWFwcGVkIGZyb20gSFRNTC4KLSAg
ICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpIHsKLSAgICAgICAgYWRkRWxlbWVudFN0eWxl
UHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25B
dHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICAvLyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBt
YXBwZWQgZGVjbGFyYXRpb25zLgotICAgICAgICAvLyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNo
YXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFwcGxpZWQKLSAgICAg
ICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBl
bmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KLSAgICAgICAgYWRkRWxl
bWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRp
dGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7Ci0KLSAgICAgICAgaWYgKG1fc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGJvb2wg
aXNBdXRvOwotICAgICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1M
RWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJB
dXRvQXR0cmlidXRlKGlzQXV0byk7Ci0gICAgICAgICAgICBpZiAoaXNBdXRvKQotICAgICAgICAg
ICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIg
PyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOwot
ICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Ig
c2hlZXRzIG5leHQuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAg
ICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2UpOwotCi0gICAgLy8gTm93IGNoZWNrIG91
ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0
eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aW5saW5lU3R5bGUoKSkgewotICAgICAgICAvLyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxl
IGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KLSAgICAgICAgLy8gRklYTUU6
IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNh
Y2hpbmcuCi0gICAgICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgpOwotICAgICAgICAvLyBGSVhNRTogQ29uc3Rp
ZnkuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7Ci0g
ICAgfQotCi0jaWYgRU5BQkxFKFNWRykKLSAgICAvLyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24g
b3ZlcnJpZGUgc3R5bGUuCi0gICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNo
QXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkpCi0gICAgICAgIGFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHls
ZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXND
YWNoZWFibGUgKi8pOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0
aWVzKTsKLSNlbmRpZgotfQotCiBib29sIFN0eWxlUmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3Rl
ZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NOYW1lcykgY29uc3QKIHsKICAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7ICsraSkgewpAQCAt
ODA4LDkgKzQyNiw4IEBAIGlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KEUK
ICAgICB9CiB9CiAKLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5
bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVuZGVyU3R5bGUqIHBh
cmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwg
UmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQoraW5saW5lIHZvaWQgU3R5bGVSZXNvbHZl
cjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50
KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5
bGluZykKIHsKLSAgICBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHBzZXVkb1N0eWxlUmVxdWVzdDsK
ICAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOwogCiAgICAgaWYgKGUp
IHsKQEAgLTgzMiw3ICs0NDksNiBAQCBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6
aW5pdEZvCiAKICAgICBtX3N0eWxlID0gMDsKICAgICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMu
Y2xlYXIoKTsKLSAgICBtX3J1bGVMaXN0ID0gMDsKICAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwog
fQogCkBAIC05MDAsMTcgKzUxNiw5IEBAIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5n
Q2FuZGlkYXQKIHsKICAgICBpZiAoIXJ1bGVTZXQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CiAKLSAgICBtX3N0YXRlLnNldE1vZGUo
U2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMpOwotICAgIGludCBmaXJzdFJ1bGVJbmRleCA9
IC0xLCBsYXN0UnVsZUluZGV4ID0gLTE7Ci0gICAgUnVsZVJhbmdlIHJ1bGVSYW5nZShmaXJzdFJ1
bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hS
ZXF1ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOwotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3Rv
ckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLSAgICBpZiAobV9zdGF0ZS5tYXRjaGVkUnVsZXMo
KS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRS
dWxlcygpLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0
b3IgY29sbGVjdG9yKHRoaXMsIG1fc3RhdGUpOworICAgIHJldHVybiBjb2xsZWN0b3IuaGFzQW55
TWF0Y2hpbmdSdWxlcyhydWxlU2V0KTsKIH0KIAogYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFy
ZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKQEAgLTExNzgs
MjYgKzc4Niw2IEBAIFJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWQKICAg
ICByZXR1cm4gc2hhcmVFbGVtZW50LT5yZW5kZXJTdHlsZSgpOwogfQogCi12b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0KQotewotICAgIE1hdGNoaW5n
VUFSdWxlc1Njb3BlIHNjb3BlOwotCi0gICAgLy8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0
aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1w
bGVEZWZhdWx0U3R5bGVTaGVldCkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7
Ci0gICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVN
YXRjaFNwZWNpZmljKCJwcmludCIpCi0gICAgICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpk
ZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOwot
ICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIHVzZXJBZ2VudFN0eWxlU2hlZXQpOwotCi0gICAgLy8g
SW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFnZW50
IHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkKLSAgICAgICAgbWF0
Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5
bGUpOwotCi0gICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZp
ZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxl
cyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+
aXNWaWV3U291cmNlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOwotfQotCiBzdGF0aWMgdm9pZCBzZXRTdHls
ZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5k
ZXJTdHlsZSogc3R5bGUpCiB7CiAgICAgaWYgKHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246
OlVucGFnaW5hdGVkKQpAQCAtMTM5NSw3ICs5ODMsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBTdHlsZVJlc29sdmVyOjpzCiAKICAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwogICAgIGlu
aXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1l
bnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcp
OworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVm
YXVsdFBhcmVudCwgcmVnaW9uRm9yU3R5bGluZyk7CiAgICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9
PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50
KCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5
bGUoKTsKICAgICAgICAgaWYgKHNoYXJlZFN0eWxlKQpAQCAtMTQzNywxMyArMTAyNSwxNiBAQCBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzCiAgICAgaWYgKG5lZWRzQ29s
bGVjdGlvbikKICAgICAgICAgbV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+
aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZlci5nZXQoKSk7CiAKLSAgICBNYXRjaFJlc3Vs
dCBtYXRjaFJlc3VsdDsKKyAgICBFbGVtZW50UnVsZUNvbGxlY3RvciBjb2xsZWN0b3IodGhpcywg
c3RhdGUpOworICAgIGNvbGxlY3Rvci5zZXRSZWdpb25Gb3JTdHlsaW5nKHJlZ2lvbkZvclN0eWxp
bmcpOworICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0obV9tZWRpdW0uZ2V0KCkpOworCiAgICAgaWYg
KG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1h
dGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMo
KTsKICAgICBlbHNlCi0gICAgICAgIG1hdGNoQWxsUnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5n
QmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOworICAgICAgICBjb2xsZWN0
b3IubWF0Y2hBbGxSdWxlcyhtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcywgbWF0Y2hpbmdCZWhh
dmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7CiAKLSAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzKGNvbGxlY3Rvci5tYXRjaGVkUmVzdWx0KCksIGVsZW1lbnQpOwogCiAgICAgLy8gQ2xlYW4g
dXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25n
IG90aGVyIGZpeHVwcykuCiAgICAgYWRqdXN0UmVuZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3Rh
dGUucGFyZW50U3R5bGUoKSwgZWxlbWVudCk7CkBAIC0xNDYwLDcgKzEwNTEsNyBAQCBQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzCiB7CiAgICAgTWF0Y2hSZXN1bHQgcmVz
dWx0OwogICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBhZGRNYXRjaGVk
UHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOworICAgICAgICByZXN1
bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXMoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSk7CiAKICAgICBB
U1NFUlQoIW1fc3RhdGUuc3R5bGUoKSk7CiAKQEAgLTE1ODQsNyArMTE3NSw3IEBAIFBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnAKIAogICAgIGluaXRFbGVtZW50KGUpOwog
Ci0gICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHls
ZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRv
Y3VtZW50KCksIGUsIHBhcmVudFN0eWxlKTsKICAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHls
ZTo6Y3JlYXRlKCkpOwogICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucGFy
ZW50U3R5bGUoKSk7CiAKQEAgLTE1OTIsMjAgKzExODMsMjIgQEAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gU3R5bGVSZXNvbHZlcjo6cAogICAgIC8vIHRob3NlIHJ1bGVzLgogCiAgICAgLy8gQ2hl
Y2sgVUEsIHVzZXIgYW5kIGF1dGhvciBydWxlcy4KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3Vs
dDsKLSAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOworICAgIEVsZW1lbnRSdWxlQ29sbGVj
dG9yIGNvbGxlY3Rvcih0aGlzLCBzdGF0ZSk7CisgICAgY29sbGVjdG9yLnNldFBzZXVkb1N0eWxl
UmVxdWVzdChwc2V1ZG9TdHlsZVJlcXVlc3QpOworICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0obV9t
ZWRpdW0uZ2V0KCkpOworICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMoKTsKIAogICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykgewotICAgICAgICBtYXRjaFVzZXJSdWxlcyhtYXRj
aFJlc3VsdCwgZmFsc2UpOwotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKG1hdGNoUmVzdWx0LCBm
YWxzZSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaFVzZXJSdWxlcyhmYWxzZSk7CisgICAgICAg
IGNvbGxlY3Rvci5tYXRjaEF1dGhvclJ1bGVzKGZhbHNlKTsKICAgICB9CiAKLSAgICBpZiAobWF0
Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgpKQorICAgIGlmIChjb2xsZWN0b3Iu
bWF0Y2hlZFJlc3VsdCgpLm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKICAgICAgICAgcmV0
dXJuIDA7CiAKICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRTdHlsZVR5cGUocHNldWRvU3R5bGVSZXF1
ZXN0LnBzZXVkb0lkKTsKIAotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQs
IGUpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQo
KSwgZSk7CiAKICAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQg
dGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4KICAgICBhZGp1c3RSZW5kZXJT
dHlsZShzdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnBhcmVudFN0eWxlKCksIDApOwpAQCAtMTYyNiwx
NyArMTIxOSwxMiBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzCiAg
ICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwogICAgIG1fc3RhdGUu
c3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwogCi0gICAg
Y29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgYm9v
bCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBTdHJpbmcgcGFn
ZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7Ci0gICAgCi0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0Owot
ICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0
UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICBtYXRjaFBhZ2VSdWxlcyhy
ZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0g
ICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFsIGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBy
dWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwg
bV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIFBh
Z2VSdWxlQ29sbGVjdG9yIGNvbGxlY3RvcihtX3N0YXRlLCBtX3J1bGVTZXRzKTsKKyAgICBjb2xs
ZWN0b3IubWF0Y2hBbGxQYWdlUnVsZXMocGFnZUluZGV4KTsKICAgICBtX3N0YXRlLnNldExpbmVI
ZWlnaHRWYWx1ZSgwKTsKICAgICBib29sIGluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKworICAgIE1h
dGNoUmVzdWx0JiByZXN1bHQgPSBjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpOwogI2lmIEVOQUJM
RShDU1NfVkFSSUFCTEVTKQogICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZp
bml0aW9ucz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGluaGVyaXRlZE9ubHkpOwogI2VuZGlmCkBAIC0yMDYyLDg5ICsxNjUwLDMxIEBAIFBh
c3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6OnAKICAgICBpZiAoIWUgfHwgIWUt
PmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQogICAgICAgICByZXR1cm4gMDsK
IAotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7
Ci0KICAgICBpbml0RWxlbWVudChlKTsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUo
ZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVz
b2x2ZShkb2N1bWVudCgpLCBlLCAwKTsKKworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxl
Y3Rvcih0aGlzLCBtX3N0YXRlKTsKKyAgICBjb2xsZWN0b3Iuc2V0TW9kZShTZWxlY3RvckNoZWNr
ZXI6OkNvbGxlY3RpbmdSdWxlcyk7CisgICAgY29sbGVjdG9yLnNldFBzZXVkb1N0eWxlUmVxdWVz
dChQc2V1ZG9TdHlsZVJlcXVlc3QocHNldWRvSWQpKTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVt
KG1fbWVkaXVtLmdldCgpKTsKIAotICAgIE1hdGNoUmVzdWx0IGR1bW15OwogICAgIGlmIChydWxl
c1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVzKSB7CiAgICAgICAgIC8vIEZpcnN0IHdlIG1h
dGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgICAgIG1hdGNoVUFSdWxl
cyhkdW1teSk7Ci0KKyAgICAgICAgY29sbGVjdG9yLm1hdGNoVUFSdWxlcygpOworICAgICAgICAK
ICAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCiAgICAgICAgIGlmICht
X21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1
bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOworICAgICAgICAgICAgY29sbGVj
dG9yLm1hdGNoVXNlclJ1bGVzKHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CiAgICAg
fQogCiAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVk
ZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAgICAgICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5
KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisgICAgICAgIGNvbGxl
Y3Rvci5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NS
dWxlcykpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgot
ICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NT
UnVsZXMpOwotCi0gICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOworICAg
ICAgICBjb2xsZWN0b3IubWF0Y2hBdXRob3JSdWxlcyhydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NT
UnVsZXMpOwogICAgIH0KIAotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJl
c29sdmluZ1N0eWxlKTsKLQotICAgIHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOwotfQot
Ci1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYg
cnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1Bz
ZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5k
YXJ5KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpZiAocnVsZURhdGEu
aGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKLSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNl
bGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYg
KHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNp
bXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5k
IGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KLSAgICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhU
TUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2UuCi0gICAgICAg
IGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxl
SGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAg
ICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCkt
Pm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRj
aGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRo
IHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1l
bnQoKSk7Ci0gICAgICAgIGlmICghc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0
bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsKLSAgICB9Ci0K
LSAgICAvLyBTbG93IHBhdGguCi0gICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihk
b2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwotICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JD
aGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50
KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5l
bGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwotICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsK
LSAgICBjb250ZXh0LnBzZXVkb0lkID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRv
SWQ7Ci0gICAgY29udGV4dC5zY3JvbGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5z
Y3JvbGxiYXI7Ci0gICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVS
ZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9
IGJlaGF2aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0g
c2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdU
cmF2ZXJzYWxTdHJhdGVneSgpKTsKLSAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpT
ZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUucHNl
dWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5
bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHluYW1pY1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVn
aW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiBy
ZWdpb25FbGVtZW50KQotewotICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1l
bnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3Rv
ckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5tb2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NT
U2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4
dChzKSkgewotICAgICAgICBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0
IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tl
cjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwotICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWlj
UHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2Vs
ZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2
ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gY29sbGVjdG9yLm1hdGNoZWRSdWxlTGlzdCgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCkBAIC0yNDIzLDg2ICsxOTUzLDYgQEAgdm9pZCBTdHlsZVJlc29sdmVy
OjphcHBseU1hdGNoZWRQcm9wZXJ0aQogICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShz
dGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0
KTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVS
dWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQotewotICAgIHJldHVybiByMS0+
c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgp
OwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAg
IG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVz
KCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQ
YWdlUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9z
b3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29t
cGFyZVBhZ2VSdWxlcyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBh
Z2VSdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0
LCBtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBj
aGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBi
b29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUp
Ci17Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNv
bXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAg
aWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5s
b2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9j
YWxOYW1lICE9IHBhZ2VOYW1lKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotCi0gICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21w
b25lbnQtPnBzZXVkb1R5cGUoKTsKLSAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVj
dG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1
ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAg
ICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2Ug
JiYgIWlzRmlyc3RQYWdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVk
UnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBh
Z2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxl
UnVsZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKLQotICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVj
dG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwg
cGFnZU5hbWUpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1
bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgotICAgICAgICBj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwot
ICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQotICAgICAg
ICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBv
ZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAg
IH0KLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNv
bnN0Ci17Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3Rh
dGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAg
IGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7Ci0KLSAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0Zp
cnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0Zp
cnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9m
IGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0
aGUgZmlyc3QgcGFnZS4KLSAgICByZXR1cm4gKCFwYWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5
bGVSZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAv
LyBGSVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAg
cmV0dXJuICIiOwotfQotCiB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxl
KENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQog
ewogICAgIGluaXRFbGVtZW50KDApOwpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVz
b2x2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5o
CShyZXZpc2lvbiAxNDUyMDApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5o
CSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiU2Nyb2xsVHlwZXMu
aCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIKICNpbmNsdWRlICJTZWxlY3RvckZpbHRl
ci5oIgorI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAi
U3R5bGVJbmhlcml0ZWREYXRhLmgiCiAjaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCiAj
aW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCkBAIC0xNTMsMTUgKzE1NCwxMyBAQCBw
dWJsaWM6CiAKIGNsYXNzIE1hdGNoUmVxdWVzdCB7CiBwdWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0
KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3Qg
Q29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3Vu
ZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0Jv
dW5kYXJ5KQorICAgIE1hdGNoUmVxdWVzdChSdWxlU2V0KiBydWxlU2V0LCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzID0gZmFsc2UsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlID0gMCkKICAgICAg
ICAgOiBydWxlU2V0KHJ1bGVTZXQpCiAgICAgICAgICwgaW5jbHVkZUVtcHR5UnVsZXMoaW5jbHVk
ZUVtcHR5UnVsZXMpCi0gICAgICAgICwgc2NvcGUoc2NvcGUpCi0gICAgICAgICwgYmVoYXZpb3JB
dEJvdW5kYXJ5KGJlaGF2aW9yQXRCb3VuZGFyeSkgeyB9CisgICAgICAgICwgc2NvcGUoc2NvcGUp
IHsgfQogICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVTZXQ7CiAgICAgY29uc3QgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlczsKICAgICBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZTsKLSAgICBjb25zdCBT
ZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnk7CiB9
OwogCiAvLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBSZW5kZXJTdHlsZSBmb3IgYSBnaXZlbiBlbGVt
ZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBzdHlsZXNoZWV0cy4KQEAgLTIwNyw2ICsyMDYs
NyBAQCBwdWJsaWM6CiAKICAgICBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJu
IG1fcnVsZVNldHM7IH0KICAgICBjb25zdCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNv
bnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKyAgICBTZWxlY3RvckZpbHRlciYgc2VsZWN0b3JG
aWx0ZXIoKSB7IHJldHVybiBtX3NlbGVjdG9yRmlsdGVyOyB9CiAKICNpZiBFTkFCTEUoU1RZTEVf
U0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKICAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIGVu
c3VyZVNjb3BlUmVzb2x2ZXIoKQpAQCAtMzI1LDEzICszMjUsNiBAQCBwdWJsaWM6CiAKICAgICB2
b2lkIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CiAKLXByaXZhdGU6Ci0gICAgLy8gVGhpcyBmdW5j
dGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRo
ZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKLSAgICB2b2lk
IGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqLCBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShS
ZW5kZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVt
ZW50Kik7Ci0KICAgICBzdHJ1Y3QgUnVsZVJhbmdlIHsKICAgICAgICAgUnVsZVJhbmdlKGludCYg
Zmlyc3RSdWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJbmRleCk6IGZpcnN0UnVsZUluZGV4KGZpcnN0
UnVsZUluZGV4KSwgbGFzdFJ1bGVJbmRleChsYXN0UnVsZUluZGV4KSB7IH0KICAgICAgICAgaW50
JiBmaXJzdFJ1bGVJbmRleDsKQEAgLTM3MywzMCArMzY2LDIxIEBAIHByaXZhdGU6CiAgICAgICAg
IFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0Y2hlZFJ1bGVzOwogICAgICAgICBNYXRjaFJhbmdl
cyByYW5nZXM7CiAgICAgICAgIGJvb2wgaXNDYWNoZWFibGU7CisKKyAgICAgICAgdm9pZCBhZGRN
YXRjaGVkUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHls
ZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0
Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CiAg
ICAgfTsKIAotICAgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0
JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiA9IDAsIHVu
c2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoQWxsLCBQcm9wZXJ0
eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOwotICAgIHZvaWQgYWRkRWxl
bWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQq
LCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7Citwcml2YXRlOgorICAgIC8vIFRoaXMgZnVuY3Rp
b24gZml4ZXMgdXAgdGhlIGRlZmF1bHQgZm9udCBzaXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUg
Y3VycmVudCBnZW5lcmljIGZvbnQgZmFtaWx5IGhhcyBjaGFuZ2VkLiAtZHdoCisgICAgdm9pZCBj
aGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKIAotICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhNYXRjaFJl
c3VsdCYsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxl
cyhNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVs
ZVNldCopOwotICAgIHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmLCBi
b29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMo
TWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9z
dFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0KLSAgICB2b2lk
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwot
ICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0
JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29u
c3QgVmVjdG9yPFJ1bGVEYXRhPiosIGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwor
ICAgIHZvaWQgYWRqdXN0UmVuZGVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJl
bmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCopOwogCiAgICAgYm9vbCBmYXN0UmVqZWN0
U2VsZWN0b3IoY29uc3QgUnVsZURhdGEmKSBjb25zdDsKLSAgICB2b2lkIHNvcnRNYXRjaGVkUnVs
ZXMoKTsKLSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhNYXRjaFJlc3VsdCYp
OwogCi0gICAgYm9vbCBydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5l
ck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5k
YXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSk7Ci0gICAgYm9vbCBj
aGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxl
bWVudCogcmVnaW9uRWxlbWVudCk7CiAgICAgdm9pZCBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNv
bnN0IE1hdGNoUmVzdWx0JiwgY29uc3QgRWxlbWVudCopOworCiAgICAgZW51bSBTdHlsZUFwcGxp
Y2F0aW9uUGFzcyB7CiAjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCiAgICAgICAgIFZhcmlhYmxl
RGVmaW5pdGlvbnMsCkBAIC00NDUsMTIgKzQyOSw5IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX3Bh
cmVudFN0eWxlKDApCiAgICAgICAgICwgbV9yb290RWxlbWVudFN0eWxlKDApCiAgICAgICAgICwg
bV9yZWdpb25Gb3JTdHlsaW5nKDApCi0gICAgICAgICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkK
LSAgICAgICAgLCBtX3BzZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETykKICAgICAgICAgLCBtX2Vs
ZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRlTGluaykKICAgICAgICAgLCBtX2Rpc3RyaWJ1dGVkVG9J
bnNlcnRpb25Qb2ludChmYWxzZSkKICAgICAgICAgLCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NS
dWxlcyhmYWxzZSkKLSAgICAgICAgLCBtX21vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdT
dHlsZSkKICAgICAgICAgLCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKQogICAg
ICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSkKICNpZiBFTkFC
TEUoQ1NTX1NIQURFUlMpCkBAIC00NjMsNyArNDQ0LDcgQEAgcHVibGljOgogCiAgICAgcHVibGlj
OgogICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICAgICAgdm9pZCBpbml0
Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3Qo
Tk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAg
dm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSA9IDAsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9IDApOwog
ICAgICAgICB2b2lkIGNsZWFyKCk7CiAKICAgICAgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29u
c3QgeyByZXR1cm4gbV9lbGVtZW50LT5kb2N1bWVudCgpOyB9CkBAIC00NzMsMjUgKzQ1NCwxNyBA
QCBwdWJsaWM6CiAgICAgICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c3R5bGUuZ2V0KCk7IH0KICAgICAgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gdGFrZVN0eWxl
KCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7IH0KIAotICAgICAgICBTdGF0aWNDU1NSdWxl
TGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
dGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxlTGlzdC5yZWxlYXNlKCk7IH0KLQogICAgICAg
ICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJl
bnROb2RlOyB9CiAgICAgICAgIHZvaWQgc2V0UGFyZW50U3R5bGUoUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsgfQogICAgICAgICBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudFN0eWxlOyB9CiAgICAg
ICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9yb290
RWxlbWVudFN0eWxlOyB9CiAKICAgICAgICAgY29uc3QgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JT
dHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdpb25Gb3JTdHlsaW5nOyB9Ci0gICAgICAgIHZv
aWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KSB7IG1fc2FtZU9yaWdp
bk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0gICAgICAgIGJvb2wgaXNTYW1lT3JpZ2luT25s
eSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgY29uc3QgUHNl
dWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QoKSBjb25zdCB7IHJldHVybiBtX3Bz
ZXVkb1N0eWxlUmVxdWVzdDsgfQogICAgICAgICBFSW5zaWRlTGluayBlbGVtZW50TGlua1N0YXRl
KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlua1N0YXRlOyB9CiAgICAgICAgIGJvb2wgZGlz
dHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29uc3QgeyByZXR1cm4gbV9kaXN0cmlidXRlZFRv
SW5zZXJ0aW9uUG9pbnQ7IH0KICAgICAgICAgdm9pZCBzZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNz
UnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzID0g
aXNBZmZlY3RlZDsgfQogICAgICAgICBib29sIGVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygp
IGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOyB9Ci0gICAgICAg
IHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2Rl
OyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4g
bV9tb2RlOyB9Ci0gICAgICAgIAorCiAgICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9
IGlzQXBwbHk7IH0KICAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBp
c0FwcGx5OyB9CiAgICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29u
c3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0KQEAgLTUyNCw5ICs0
OTcsOCBAQCBwdWJsaWM6CiAgICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUg
d3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGluZ01vZGUod3Jp
dGluZ01vZGUpOyB9CiAgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRh
dGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4dE9y
aWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KIAotICAgICAgICBWZWN0b3I8Y29uc3QgUnVs
ZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9Ci0g
ICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9tYXRj
aGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9Ci0gICAgICAgIAorICAgICAgICBib29sIHVzZVNWR1pv
b21SdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudCAmJiBtX2VsZW1lbnQtPmlzU1ZHRWxl
bWVudCgpOyB9CisKICAgICBwcml2YXRlOgogICAgICAgICAvLyBGSVhNRShidWcgMTA4NTYzKTog
dG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1iZXIKICAgICAgICAgLy8gdmFy
aWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFkZCBtZXRob2RzIHRvIGFjY2Vz
cwpAQCAtNTM3LDI0ICs1MDksMTYgQEAgcHVibGljOgogICAgICAgICBDb250YWluZXJOb2RlKiBt
X3BhcmVudE5vZGU7CiAgICAgICAgIFJlbmRlclN0eWxlKiBtX3BhcmVudFN0eWxlOwogICAgICAg
ICBSZW5kZXJTdHlsZSogbV9yb290RWxlbWVudFN0eWxlOwotICAgICAgICAKLSAgICAgICAgUmVu
ZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7Ci0gICAgICAgIGJvb2wgbV9zYW1lT3JpZ2lu
T25seTsKLSAgICAgICAgUHNldWRvU3R5bGVSZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0Owog
CisgICAgICAgIC8vIFJlcXVpcmVkIHRvIEFTU0VSVCBpbiBhcHBseVByb3BlcnRpZXMuCisgICAg
ICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgICAgICAKICAgICAgICAg
RUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRlOwogCiAgICAgICAgIGJvb2wgbV9kaXN0cmli
dXRlZFRvSW5zZXJ0aW9uUG9pbnQ7CiAKICAgICAgICAgYm9vbCBtX2VsZW1lbnRBZmZlY3RlZEJ5
Q2xhc3NSdWxlczsKIAotICAgICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbV9tb2RlOwotCi0g
ICAgICAgIC8vIEEgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUgc2V0IG9mIG1hdGNoZWQgcnVsZXMg
Zm9yIGFuIGVsZW1lbnQsCi0gICAgICAgIC8vIGFuZCBhIHRlbXBvcmFyeSBidWZmZXIgdXNlZCBm
b3IgbWVyZ2Ugc29ydGluZy4KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+IG1f
bWF0Y2hlZFJ1bGVzOwotICAgICAgICBSZWZQdHI8U3RhdGljQ1NTUnVsZUxpc3Q+IG1fcnVsZUxp
c3Q7Ci0KICAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsKICAgICAg
ICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7CiAKQEAgLTY5Miw2ICs2
NTYsMjEgQEAgaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGbwogICAgIHJl
dHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhpZFZhbHVlLmlt
cGwoKSk7CiB9CiAKK2lubGluZSBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2Vs
ZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQoreworICAgIGlm
ICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIocmVnaW9uRWxlbWVudC0+
ZG9jdW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpRdWVyeWluZ1J1bGVzKTsKKyAgICBmb3IgKGNv
bnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2VsZWN0b3I7IHM7IHMgPSBDU1NTZWxlY3Rvckxp
c3Q6Om5leHQocykpIHsKKyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5n
Q29udGV4dCBzZWxlY3RvckNoZWNraW5nQ29udGV4dChzLCByZWdpb25FbGVtZW50LCBTZWxlY3Rv
ckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERpc2FibGVkKTsKKyAgICAgICAgUHNldWRvSWQgaWdub3Jl
RHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOworICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLm1h
dGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0LCBpZ25vcmVEeW5hbWljUHNldWRvLCBET01TaWJs
aW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkgPT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNo
ZXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNw
cAkocmV2aXNpb24gMTQ1MjAwKQorKysgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rv
ckNTU0FnZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTU4LDExICs5NTgsMTEgQEAgUGFzc1Jl
ZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclBybwogICAgIHJldHVybiByZXN1bHQucmVs
ZWFzZSgpOwogfQogCi12b2lkIEluc3BlY3RvckNTU0FnZW50Ojp3aWxsTWF0Y2hSdWxlKFN0eWxl
UnVsZSogcnVsZSwgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlcikKK3ZvaWQgSW5zcGVjdG9y
Q1NTQWdlbnQ6OndpbGxNYXRjaFJ1bGUoU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbikKIHsKIC8vICAgIHByaW50ZigiSW5zcGVjdG9yQ1NT
QWdlbnQ6OndpbGxNYXRjaFJ1bGUgJXNcbiIsIHJ1bGUtPnNlbGVjdG9yTGlzdCgpLnNlbGVjdG9y
c1RleHQoKS51dGY4KCkuZGF0YSgpKTsKICAgICBpZiAobV9jdXJyZW50U2VsZWN0b3JQcm9maWxl
KQotICAgICAgICBtX2N1cnJlbnRTZWxlY3RvclByb2ZpbGUtPnN0YXJ0U2VsZWN0b3Ioc3R5bGVS
ZXNvbHZlci0+aW5zcGVjdG9yQ1NTT01XcmFwcGVycygpLmdldFdyYXBwZXJGb3JSdWxlSW5TaGVl
dHMocnVsZSwgc3R5bGVSZXNvbHZlci0+ZG9jdW1lbnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24o
KSkpOworICAgICAgICBtX2N1cnJlbnRTZWxlY3RvclByb2ZpbGUtPnN0YXJ0U2VsZWN0b3IoaW5z
cGVjdG9yQ1NTT01XcmFwcGVycy5nZXRXcmFwcGVyRm9yUnVsZUluU2hlZXRzKHJ1bGUsIHN0eWxl
U2hlZXRDb2xsZWN0aW9uKSk7CiB9CiAKIHZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OmRpZE1hdGNo
UnVsZShib29sIG1hdGNoZWQpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVj
dG9yQ1NTQWdlbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQ1NTQWdlbnQuaAkocmV2aXNpb24gMTQ1MjAwKQorKysgU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDcgKzQ3LDkg
QEAgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsKIGNsYXNzIENTU1N0eWxlUnVsZTsKIGNsYXNz
IENTU1N0eWxlU2hlZXQ7CiBjbGFzcyBEb2N1bWVudDsKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVl
dENvbGxlY3Rpb247CiBjbGFzcyBFbGVtZW50OworY2xhc3MgSW5zcGVjdG9yQ1NTT01XcmFwcGVy
czsKIGNsYXNzIEluc3BlY3RvckZyb250ZW5kOwogY2xhc3MgSW5zdHJ1bWVudGluZ0FnZW50czsK
IGNsYXNzIE5hbWVOb2RlTWFwOwpAQCAtMTI1LDcgKzEyNyw3IEBAIHB1YmxpYzoKICAgICB2aXJ0
dWFsIHZvaWQgc3RvcFNlbGVjdG9yUHJvZmlsZXIoRXJyb3JTdHJpbmcqLCBSZWZQdHI8VHlwZUJ1
aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9maWxlPiYpOwogCiAgICAgUGFzc1JlZlB0cjxUeXBlQnVp
bGRlcjo6Q1NTOjpTZWxlY3RvclByb2ZpbGU+IHN0b3BTZWxlY3RvclByb2ZpbGVySW1wbChFcnJv
clN0cmluZyosIGJvb2wgbmVlZFByb2ZpbGUpOwotICAgIHZvaWQgd2lsbE1hdGNoUnVsZShTdHls
ZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CisgICAgdm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVs
ZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9u
Kik7CiAgICAgdm9pZCBkaWRNYXRjaFJ1bGUoYm9vbCk7CiAgICAgdm9pZCB3aWxsUHJvY2Vzc1J1
bGUoU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAgIHZvaWQgZGlkUHJvY2Vzc1J1bGUo
KTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRp
b24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb24uY3BwCShyZXZpc2lvbiAxNDUyMDApCisrKyBTb3VyY2UvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NTkwLDExICs1OTAsMTEgQEAgdm9pZCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZFNjaGVk
dQogICAgICAgICByZXNvdXJjZUFnZW50LT5kaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbihk
b2N1bWVudCk7CiB9CiAKLUluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqIGlu
c3RydW1lbnRpbmdBZ2VudHMsIFN0eWxlUnVsZSogcnVsZSwgU3R5bGVSZXNvbHZlciogc3R5bGVS
ZXNvbHZlcikKK0luc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb246OndpbGxNYXRjaFJ1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqIGluc3RydW1l
bnRpbmdBZ2VudHMsIFN0eWxlUnVsZSogcnVsZSwgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyYgaW5z
cGVjdG9yQ1NTT01XcmFwcGVycywgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc2hlZXRD
b2xsZWN0aW9uKQogewogICAgIEluc3BlY3RvckNTU0FnZW50KiBjc3NBZ2VudCA9IGluc3RydW1l
bnRpbmdBZ2VudHMtPmluc3BlY3RvckNTU0FnZW50KCk7CiAgICAgaWYgKGNzc0FnZW50KSB7Ci0g
ICAgICAgIGNzc0FnZW50LT53aWxsTWF0Y2hSdWxlKHJ1bGUsIHN0eWxlUmVzb2x2ZXIpOworICAg
ICAgICBjc3NBZ2VudC0+d2lsbE1hdGNoUnVsZShydWxlLCBpbnNwZWN0b3JDU1NPTVdyYXBwZXJz
LCBzaGVldENvbGxlY3Rpb24pOwogICAgICAgICByZXR1cm4gSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llKGluc3RydW1lbnRpbmdBZ2VudHMsIDEpOwogICAgIH0KIApJbmRleDogU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaAko
cmV2aXNpb24gMTQ1MjAwKQorKysgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvcklu
c3RydW1lbnRhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02MSwxMCArNjEsMTIgQEAgY2xhc3Mg
RG9jdW1lbnQ7CiBjbGFzcyBFbGVtZW50OwogY2xhc3MgRXZlbnRDb250ZXh0OwogY2xhc3MgRG9j
dW1lbnRMb2FkZXI7CitjbGFzcyBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uOwogY2xhc3Mg
RGV2aWNlT3JpZW50YXRpb25EYXRhOwogY2xhc3MgR2VvbG9jYXRpb25Qb3NpdGlvbjsKIGNsYXNz
IEdyYXBoaWNzQ29udGV4dDsKIGNsYXNzIEluc3BlY3RvckNTU0FnZW50OworY2xhc3MgSW5zcGVj
dG9yQ1NTT01XcmFwcGVyczsKIGNsYXNzIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjsKIGNsYXNz
IEluc3BlY3RvclRpbWVsaW5lQWdlbnQ7CiBjbGFzcyBJbnN0cnVtZW50aW5nQWdlbnRzOwpAQCAt
MTc0LDcgKzE3Niw3IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llIHdpbGxSZWNhbGN1bGF0ZVN0eWxlKERvY3VtZW50Kik7CiAgICAgc3RhdGljIHZv
aWQgZGlkUmVjYWxjdWxhdGVTdHlsZShjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29r
aWUmKTsKICAgICBzdGF0aWMgdm9pZCBkaWRTY2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbihEb2N1
bWVudCopOwotICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1h
dGNoUnVsZShEb2N1bWVudCosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKKyAgICBzdGF0
aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxNYXRjaFJ1bGUoRG9jdW1lbnQq
LCBTdHlsZVJ1bGUqLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiwgRG9jdW1lbnRTdHlsZVNoZWV0
Q29sbGVjdGlvbiopOwogICAgIHN0YXRpYyB2b2lkIGRpZE1hdGNoUnVsZShjb25zdCBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb25Db29raWUmLCBib29sIG1hdGNoZWQpOwogICAgIHN0YXRpYyBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbFByb2Nlc3NSdWxlKERvY3VtZW50KiwgU3R5
bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAgIHN0YXRpYyB2b2lkIGRpZFByb2Nlc3NSdWxl
KGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSYpOwpAQCAtMzc1LDcgKzM3Nyw3
IEBAIHByaXZhdGU6CiAgICAgc3RhdGljIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3
aWxsUmVjYWxjdWxhdGVTdHlsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIEZyYW1lKik7CiAg
ICAgc3RhdGljIHZvaWQgZGlkUmVjYWxjdWxhdGVTdHlsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uQ29va2llJik7CiAgICAgc3RhdGljIHZvaWQgZGlkU2NoZWR1bGVTdHlsZVJl
Y2FsY3VsYXRpb25JbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqLCBEb2N1bWVudCopOwotICAgIHN0
YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZUltcGwoSW5z
dHJ1bWVudGluZ0FnZW50cyosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKKyAgICBzdGF0
aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxNYXRjaFJ1bGVJbXBsKEluc3Ry
dW1lbnRpbmdBZ2VudHMqLCBTdHlsZVJ1bGUqLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiwgRG9j
dW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiopOwogICAgIHN0YXRpYyB2b2lkIGRpZE1hdGNoUnVs
ZUltcGwoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJiwgYm9vbCBtYXRjaGVk
KTsKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxQcm9jZXNz
UnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIq
KTsKICAgICBzdGF0aWMgdm9pZCBkaWRQcm9jZXNzUnVsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uQ29va2llJik7CkBAIC0xMTc4LDE2ICsxMTgwLDE3IEBAIGlubGluZSB2b2lk
IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGkKICNlbmRpZgogfQogCi1pbmxpbmUgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1h
dGNoUnVsZShEb2N1bWVudCogZG9jdW1lbnQsIFN0eWxlUnVsZSogcnVsZSwgU3R5bGVSZXNvbHZl
ciogc3R5bGVSZXNvbHZlcikKK2lubGluZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUg
SW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsTWF0Y2hSdWxlKERvY3VtZW50KiBkb2N1bWVu
dCwgU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NP
TVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVj
dGlvbikKIHsKICNpZiBFTkFCTEUoSU5TUEVDVE9SKQogICAgIEZBU1RfUkVUVVJOX0lGX05PX0ZS
T05URU5EUyhJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUoKSk7CiAgICAgaWYgKEluc3Ry
dW1lbnRpbmdBZ2VudHMqIGluc3RydW1lbnRpbmdBZ2VudHMgPSBpbnN0cnVtZW50aW5nQWdlbnRz
Rm9yRG9jdW1lbnQoZG9jdW1lbnQpKQotICAgICAgICByZXR1cm4gd2lsbE1hdGNoUnVsZUltcGwo
aW5zdHJ1bWVudGluZ0FnZW50cywgcnVsZSwgc3R5bGVSZXNvbHZlcik7CisgICAgICAgIHJldHVy
biB3aWxsTWF0Y2hSdWxlSW1wbChpbnN0cnVtZW50aW5nQWdlbnRzLCBydWxlLCBpbnNwZWN0b3JD
U1NPTVdyYXBwZXJzLCBzdHlsZVNoZWV0Q29sbGVjdGlvbik7CiAjZWxzZQogICAgIFVOVVNFRF9Q
QVJBTShkb2N1bWVudCk7CiAgICAgVU5VU0VEX1BBUkFNKHJ1bGUpOwotICAgIFVOVVNFRF9QQVJB
TShzdHlsZVJlc29sdmVyKTsKKyAgICBVTlVTRURfUEFSQU0oaW5zcGVjdG9yQ1NTT01XcmFwcGVy
cyk7CisgICAgVU5VU0VEX1BBUkFNKHN0eWxlU2hlZXRDb2xsZWN0aW9uKTsKICNlbmRpZgogICAg
IHJldHVybiBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUoKTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>192400</attachid>
            <date>2013-03-10 21:07:37 -0700</date>
            <delta_ts>2013-03-11 02:52:51 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-109916-20130311130336.patch</filename>
            <type>text/plain</type>
            <size>1103364</size>
            <attacher name="Takashi Sakamoto">tasak</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NTMzOCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzMiBAQAorMjAxMy0wMy0xMCAgVGFrYXNo
aSBTYWthbW90byAgPHRhc2FrQGdvb2dsZS5jb20+CisKKyAgICAgICAgW1JlZmFjdG9yaW5nXSBJ
bXBsZW1lbnQgUnVsZUNvbGxlY3RvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA5OTE2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQW50dGkgS29pdmlz
dG8uCisKKyAgICAgICAgSW1wbGVtZW50ZWQgcnVsZSBjb2xsZWN0b3IgZm9yIGFuIGVsZW1lbnQg
YW5kIGNvbGxlY3RvciBmb3IgYSBwYWdlLgorICAgICAgICBOb3QgYWxsIG1lbWJlcnMgaW4gY2xh
c3MgU3RhdGUgYXJlIHJlcXVpcmVkIGVudGlyZSB3aGlsZSByZXNvbHZpbmcKKyAgICAgICAgYSBz
dHlsZS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIGJlY2F1c2UganVzdCByZWZhY3RvcmluZy4K
KworICAgICAgICAqIENNYWtlTGlzdHMudHh0OgorICAgICAgICAqIEdOVW1ha2VmaWxlLmxpc3Qu
YW06CisgICAgICAgICogVGFyZ2V0LnByaToKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAg
ICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGNzcy9D
U1NBbGxJbk9uZS5jcHA6CisgICAgICAgIEFkZGVkIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGFuZCBQ
YWdlUnVsZUNvbGxlY3Rvci4KKyAgICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1
ZXN0cyk6CisgICAgICAgIFNpbmNlIGJlaGF2aW9yQXRCb3VuZGFyeSBpcyBhIHN0YXRlIG93bmVk
IGJ5IEVsZW1lbnRSdWxlQ29sbGVjdG9yLAorICAgICAgICByZW1vdmVkIGZyb20gaGVyZS4KKyAg
ICAgICAgKiBjc3MvRG9jdW1lbnRSdWxlU2V0cy5oOgorICAgICAgICAoV2ViQ29yZTo6U2hhZG93
RGlzdHJpYnV0ZWRSdWxlczo6aXNFbXB0eSk6CisgICAgICAgIEFkZGVkIHRvIHF1aWNrbHkgY2hl
Y2sgd2hldGhlciB0aGVyZSBleGlzdCBhbnkgU2hhZG93RGlzdHJpYnV0ZWRSdWxlcworICAgICAg
ICBvciBub3QuCisgICAgICAgICogY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcDogQ29waWVk
IGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJl
c3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1
bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjphZGRNYXRj
aGVkUnVsZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6Y2xlYXJN
YXRjaGVkUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmVu
c3VyZVJ1bGVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9yOjph
ZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxl
Q29sbGVjdG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24pOgorICAgICAg
ICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6OnNvcnRBbmRUcmFuc2Zlck1hdGNoZWRS
dWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTY29w
ZWRBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
bWF0Y2hIb3N0UnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
Om1hdGNoU2hhZG93RGlzdHJpYnV0ZWRSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hVc2VyUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxl
bWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6cnVsZU1hdGNoZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVu
dFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxlcyk6CisgICAgICAg
IChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxSdWxlcyk6CisgICAgICAg
IE1vdmVkIHRoZXNlIG1ldGhvZHMgZnJvbSBTdHlsZVJlc29sdmVyIHRvIHRoaXMgY2xhc3MuCisg
ICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6aGFzQW55TWF0Y2hpbmdSdWxl
cyk6CisgICAgICAgIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBn
aXZlbiBlbGVtZW50IGNhbiBzaGFyZQorICAgICAgICBhIGNhY2hlLgorICAgICAgICAqIGNzcy9F
bGVtZW50UnVsZUNvbGxlY3Rvci5oOiBDb3BpZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5
bGVSZXNvbHZlci5oLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6RWxlbWVudFJ1bGVDb2xsZWN0b3IpOgorICAgICAgICBVc2Ugc3R5
bGVSZXNvbHZlciBpbnN0YW5jZSB0byBpbml0aWFsaXplIGl0cyBtZW1iZXIgdmFyaWFibGVzLCBp
LmUuCisgICAgICAgIFNlbGVjdG9yRmlsdGVyLCBSdWxlU2V0cywgSW5zcGVjdG9yQ1NTT01XcmFw
cGVycywgYW5kCisgICAgICAgIFN0eWxlU2NvcGVkUmVzb2x2ZXIuCisgICAgICAgIChFbGVtZW50
UnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6
c2V0TW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c2V0UHNl
dWRvU3R5bGVSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29sbGVjdG9y
OjpzZXRTYW1lT3JpZ2luT25seSk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50UnVsZUNvbGxl
Y3Rvcjo6c2V0UmVnaW9uRm9yU3R5bGluZyk6CisgICAgICAgIE1vZGUsIFNhbWVPcmlnaW5Pbmx5
LCBSZWdpb25Gb3JTdHlsaW5nIGFyZSBvbmx5IHVzZWQgd2hpbGUgY29sbGVjdGluZworICAgICAg
ICBtYXRjaGVkIHJ1bGVzLgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudFJ1bGVDb2xsZWN0b3I6
OnNldE1lZGl1bSk6CisgICAgICAgIE5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0IHN0eWxlc2hl
ZXQgc2hvdWxkIGJlIGxvb2tlZCB1cC4KKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnRSdWxlQ29s
bGVjdG9yOjpkb2N1bWVudCk6CisgICAgICAgICogY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcDog
Q29waWVkIGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3BwLgorICAgICAg
ICAoV2ViQ29yZTo6Y29tcGFyZVBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVs
ZUNvbGxlY3Rvcjo6aXNMZWZ0UGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxl
Y3Rvcjo6aXNGaXJzdFBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaEFs
bFBhZ2VSdWxlcyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tQYWdlU2VsZWN0b3JDb21wb25lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VSdWxlQ29sbGVjdG9yOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QpOgorICAgICAgICBNb3ZlZCBmcm9tIFN0eWxlUmVzb2x2ZXIuCisgICAgICAgICogY3Nz
L1BhZ2VSdWxlQ29sbGVjdG9yLmg6IENvcGllZCBmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHls
ZVJlc29sdmVyLmguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhZ2VS
dWxlQ29sbGVjdG9yOjpQYWdlUnVsZUNvbGxlY3Rvcik6CisgICAgICAgIChQYWdlUnVsZUNvbGxl
Y3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJlc3Vs
dCk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuY3BwOgorICAgICAgICAoV2ViQ29yZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5
bGVSZXNvbHZlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmlu
Z0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2
ZXI6OnN0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpz
dHlsZUZvcktleWZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnBzZXVk
b1N0eWxlRm9yRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJlc29sdmVyOjpzdHls
ZUZvclBhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6YXBwbHlN
YXRjaGVkUHJvcGVydGllcyk6CisgICAgICAgICogY3NzL1N0eWxlUmVzb2x2ZXIuaDoKKyAgICAg
ICAgKFdlYkNvcmU6Ok1hdGNoUmVxdWVzdDo6TWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgUmVtb3Zl
ZCBiZWhhdmlvckF0Qm91bmRhcnkuIEluc3RlYWQsIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGhhdmUg
dGhlCisgICAgICAgIHN0YXRlLgorICAgICAgICAoTWF0Y2hSZXF1ZXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlUmVzb2x2ZXI6OnNlbGVjdG9yRmlsdGVyKToKKyAgICAgICAgQWRkZWQgdG8g
b2J0YWluIFNlbGVjdG9yRmlsdGVyIGluIEVsZW1lbnRSdWxlQ29sbGVjdG9yJ3MgY29uc3RydWN0
b3IuCisgICAgICAgIChTdHlsZVJlc29sdmVyKToKKyAgICAgICAgKE1hdGNoUmVzdWx0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIFRv
IHBhc3MgQVNTRVJUIGluIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydGllcywgbmVlZCB0byBr
ZWVwCisgICAgICAgIG1fcmVnaW9uRm9yU3R5bGluZy4KKyAgICAgICAgKFN0YXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjpyZWdpb25Gb3JTdHlsaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OlN0eWxlUmVzb2x2ZXI6OlN0YXRlOjp1c2VTVkdab29tUnVsZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6U3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZCk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OmNoZWNrUmVnaW9uU2VsZWN0b3IpOgor
ICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JDU1NBZ2VudC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpJbnNwZWN0b3JDU1NBZ2VudDo6d2lsbE1hdGNoUnVsZSk6CisgICAgICAgIFJlbW92ZWQg
U3R5bGVSZXNvbHZlciBmcm9tIGl0cyBwYXJhbWV0ZXIgbGlzdC4gSW5zdGVhZCwgYWRkZWQKKyAg
ICAgICAgSW5zcGVjdG9yQ1NTT01XcmFwcGVycyBhbmQgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVj
dGlvbi4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaDoKKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoSW5zcGVjdG9yQ1NTQWdlbnQpOgorICAgICAgICAqIGluc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwOgorICAgICAgICAoV2ViQ29yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJ
bXBsKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uLmg6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKEluc3BlY3Rvckluc3RydW1lbnRhdGlvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUp
OgorCiAyMDEzLTAzLTEwICBHbGVubiBBZGFtcyAgPGdsZW5uQHNreW5hdi5jb20+CiAKICAgICAg
ICAgTGluZSBicmVha2luZyBvcHBvcnR1bml0aWVzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0IG5vZGUg
YXJlIG1pc3NlZApJbmRleDogU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQJKHJldmlzaW9uIDE0NTMzOCkKKysr
IFNvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xMDY4LDYg
KzEwNjgsNyBAQCBzZXQoV2ViQ29yZV9TT1VSQ0VTCiAgICAgY3NzL0NTU1ZhbHVlUG9vbC5jcHAK
ICAgICBjc3MvRE9NV2luZG93Q1NTLmNwcAogICAgIGNzcy9Eb2N1bWVudFJ1bGVTZXRzLmNwcAor
ICAgIGNzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKICAgICBjc3MvRm9udEZlYXR1cmVWYWx1
ZS5jcHAKICAgICBjc3MvRm9udFZhbHVlLmNwcAogICAgIGNzcy9JbnNwZWN0b3JDU1NPTVdyYXBw
ZXJzLmNwcApAQCAtMTA4MCw2ICsxMDgxLDcgQEAgc2V0KFdlYkNvcmVfU09VUkNFUwogICAgIGNz
cy9NZWRpYVF1ZXJ5TGlzdC5jcHAKICAgICBjc3MvTWVkaWFRdWVyeUxpc3RMaXN0ZW5lci5jcHAK
ICAgICBjc3MvTWVkaWFRdWVyeU1hdGNoZXIuY3BwCisgICAgY3NzL1BhZ2VSdWxlQ29sbGVjdG9y
LmNwcAogICAgIGNzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwCiAgICAgY3Nz
L1JHQkNvbG9yLmNwcAogICAgIGNzcy9SdWxlRmVhdHVyZS5oCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9HTlVtYWtlZmlsZS5saXN0LmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmxpc3QuYW0JKHJldmlzaW9uIDE0NTMzOCkKKysrIFNvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmxpc3QuYW0JKHdvcmtpbmcgY29weSkKQEAgLTI2NTUsNiArMjY1NSw4IEBAIHdlYmNv
cmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvY3NzL0Rhc2hib2FyZFJlZ2lvbi5oIFwK
IAlTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5jcHAgXAogCVNvdXJjZS9XZWJD
b3JlL2Nzcy9Eb2N1bWVudFJ1bGVTZXRzLmggXAorCVNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50
UnVsZUNvbGxlY3Rvci5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxl
Y3Rvci5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvRm9udEZlYXR1cmVWYWx1ZS5jcHAgXAogCVNv
dXJjZS9XZWJDb3JlL2Nzcy9Gb250RmVhdHVyZVZhbHVlLmggXAogCVNvdXJjZS9XZWJDb3JlL2Nz
cy9Gb250VmFsdWUuY3BwIFwKQEAgLTI2NzksNiArMjY4MSw4IEBAIHdlYmNvcmVfc291cmNlcyAr
PSBcCiAJU291cmNlL1dlYkNvcmUvY3NzL01lZGlhUXVlcnlMaXN0TGlzdGVuZXIuaCBcCiAJU291
cmNlL1dlYkNvcmUvY3NzL01lZGlhUXVlcnlNYXRjaGVyLmNwcCBcCiAJU291cmNlL1dlYkNvcmUv
Y3NzL01lZGlhUXVlcnlNYXRjaGVyLmggXAorCVNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNv
bGxlY3Rvci5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5oIFwK
IAlTb3VyY2UvV2ViQ29yZS9jc3MvUGFpci5oIFwKIAlTb3VyY2UvV2ViQ29yZS9jc3MvUHJvcGVy
dHlTZXRDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvY3NzL1Byb3Bl
cnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5oIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1Rhcmdl
dC5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQkocmV2aXNpb24g
MTQ1MzM4KQorKysgU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQkod29ya2luZyBjb3B5KQpAQCAt
MzA1LDYgKzMwNSw3IEBAIFNPVVJDRVMgKz0gXAogICAgIGNzcy9DU1NWYWx1ZVBvb2wuY3BwIFwK
ICAgICBjc3MvRE9NV2luZG93Q1NTLmNwcCBcCiAgICAgY3NzL0RvY3VtZW50UnVsZVNldHMuY3Bw
IFwKKyAgICBjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIFwKICAgICBjc3MvRm9udEZlYXR1
cmVWYWx1ZS5jcHAgXAogICAgIGNzcy9Gb250VmFsdWUuY3BwIFwKICAgICBjc3MvSW5zcGVjdG9y
Q1NTT01XcmFwcGVycy5jcHAgXApAQCAtMzE3LDYgKzMxOCw3IEBAIFNPVVJDRVMgKz0gXAogICAg
IGNzcy9NZWRpYVF1ZXJ5TGlzdC5jcHAgXAogICAgIGNzcy9NZWRpYVF1ZXJ5TGlzdExpc3RlbmVy
LmNwcCBcCiAgICAgY3NzL01lZGlhUXVlcnlNYXRjaGVyLmNwcCBcCisgICAgY3NzL1BhZ2VSdWxl
Q29sbGVjdG9yLmNwcCBcCiAgICAgY3NzL1Byb3BlcnR5U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5j
cHAgXAogICAgIGNzcy9SR0JDb2xvci5jcHAgXAogICAgIGNzcy9SdWxlRmVhdHVyZS5jcHAgXApJ
bmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gMTQ1MzM4KQorKysgU291cmNlL1dlYkNvcmUv
V2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0xNjQ4LDYgKzE2NDgsOCBAQAogICAgICAg
ICAgICAgJ2Nzcy9EYXNoYm9hcmRSZWdpb24uaCcsCiAgICAgICAgICAgICAnY3NzL0RvY3VtZW50
UnVsZVNldHMuY3BwJywKICAgICAgICAgICAgICdjc3MvRG9jdW1lbnRSdWxlU2V0cy5oJywKKyAg
ICAgICAgICAgICdjc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwJywKKyAgICAgICAgICAgICdj
c3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCcsCiAgICAgICAgICAgICAnY3NzL0ZvbnRGZWF0dXJl
VmFsdWUuY3BwJywKICAgICAgICAgICAgICdjc3MvRm9udEZlYXR1cmVWYWx1ZS5oJywKICAgICAg
ICAgICAgICdjc3MvRm9udFZhbHVlLmNwcCcsCkBAIC0xNjcxLDYgKzE2NzMsOCBAQAogICAgICAg
ICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TGlzdExpc3RlbmVyLmgnLAogICAgICAgICAgICAgJ2Nzcy9N
ZWRpYVF1ZXJ5TWF0Y2hlci5jcHAnLAogICAgICAgICAgICAgJ2Nzcy9NZWRpYVF1ZXJ5TWF0Y2hl
ci5oJywKKyAgICAgICAgICAgICdjc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwJywKKyAgICAgICAg
ICAgICdjc3MvUGFnZVJ1bGVDb2xsZWN0b3IuaCcsCiAgICAgICAgICAgICAnY3NzL1Byb3BlcnR5
U2V0Q1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAnLAogICAgICAgICAgICAgJ2Nzcy9Qcm9wZXJ0eVNl
dENTU1N0eWxlRGVjbGFyYXRpb24uaCcsCiAgICAgICAgICAgICAnY3NzL1JHQkNvbG9yLmNwcCcs
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCShyZXZpc2lvbiAxNDUzMzgpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTY1NTIsNiArNjU1MiwxMCBA
QAogCQlGQkQ2QUY4QjE1RUYyNUU1MDA4QjcxMTAgLyogQ1NTQmFzaWNTaGFwZXMuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODYxNUVGMjFE
NDAwOEI3MTEwIC8qIENTU0Jhc2ljU2hhcGVzLmNwcCAqLzsgfTsKIAkJRkJENkFGOEMxNUVGMjYw
NDAwOEI3MTEwIC8qIEJhc2ljU2hhcGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGQkQ2QUY4MzE1RUYyMUEzMDA4QjcxMTAgLyogQmFzaWNTaGFwZXMu
aCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlGQkQ2
QUY4RDE1RUYyNjBBMDA4QjcxMTAgLyogQmFzaWNTaGFwZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkJENkFGODIxNUVGMjFBMzAwOEI3MTEwIC8q
IEJhc2ljU2hhcGVzLmNwcCAqLzsgfTsKKwkJRkJEQjYxOUIxNkQ2MDMyQTAwQkIzMzk0IC8qIEVs
ZW1lbnRSdWxlQ29sbGVjdG9yLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEZCREI2MTlBMTZENjAzMkEwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxl
Y3Rvci5jcHAgKi87IH07CisJCUZCREI2MTlEMTZENjAzNDYwMEJCMzM5NCAvKiBQYWdlUnVsZUNv
bGxlY3Rvci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICovOyB9
OworCQlGQkRCNjE5RjE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MTlFMTZE
NjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oICovOyB9OworCQlGQkRCNjFB
MTE2RDYwMzdFMDBCQjMzOTQgLyogUGFnZVJ1bGVDb2xsZWN0b3IuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCREI2MUEwMTZENjAzN0UwMEJCMzM5NCAv
KiBQYWdlUnVsZUNvbGxlY3Rvci5oICovOyB9OwogCQlGQkY4OTA0NTE2OUU5RjFGMDA1MkQ4NkUg
LyogQ1NTR3JvdXBpbmdSdWxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEZCRjg5MDQ0MTY5RTlGMUYwMDUyRDg2RSAvKiBDU1NHcm91cGluZ1J1bGUu
Y3BwICovOyB9OwogCQlGQzU0RDA1NzE2QTc2NzMxMDA1NzVFNEQgLyogQ1NTU3VwcG9ydHNSdWxl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQzYzQkRC
MTE2N0FBQkFDMDBGOTM4MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmggKi87IH07CiAJCUZDNTREMDU4
MTZBNzY3NkUwMDU3NUU0RCAvKiBKU0NTU1N1cHBvcnRzUnVsZS5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkM4NDgwMkUxNjdBQjQ0NDAwOENEMTAwIC8q
IEpTQ1NTU3VwcG9ydHNSdWxlLmggKi87IH07CkBAIC0xNDMwNiw2ICsxNDMxMCwxMCBAQAogCQlG
QkQ2QUY4NTE1RUYyMUQ0MDA4QjcxMTAgLyogQmFzaWNTaGFwZUZ1bmN0aW9ucy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBCYXNpY1NoYXBlRnVuY3Rpb25zLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRDZBRjg2MTVFRjIxRDQwMDhCNzExMCAvKiBDU1NCYXNp
Y1NoYXBlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NCYXNp
Y1NoYXBlcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRDZBRjg3MTVFRjIx
RDQwMDhCNzExMCAvKiBDU1NCYXNpY1NoYXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBDU1NCYXNpY1NoYXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlG
QkRCNjE5QTE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQkRCNjE5QzE2RDYwMzQ2MDBCQjMzOTQg
LyogUGFnZVJ1bGVDb2xsZWN0b3IuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gUGFnZVJ1bGVDb2xsZWN0b3IuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQlGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRWxlbWVudFJ1bGVDb2xsZWN0b3IuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJEQjYxQTAxNkQ2MDM3RTAwQkIzMzk0IC8qIFBh
Z2VSdWxlQ29sbGVjdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBhZ2VS
dWxlQ29sbGVjdG9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZCRjg5MDQ0MTY5
RTlGMUYwMDUyRDg2RSAvKiBDU1NHcm91cGluZ1J1bGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gQ1NTR3JvdXBpbmdSdWxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJRkM2M0JEQjAxNjdBQUJBQzAwRjkzODBGIC8qIENTU1N1cHBvcnRzUnVsZS5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NTdXBwb3J0c1J1bGUu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQzYzQkRCMTE2N0FBQkFDMDBGOTM4
MEYgLyogQ1NTU3VwcG9ydHNSdWxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IENTU1N1cHBvcnRzUnVsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjIxMzYs
NiArMjIxNDQsOCBAQAogCQkJCUZDOUEwRjcxMTY0MDk0Q0YwMDNENkI4RCAvKiBET01XaW5kb3dD
U1MuY3BwICovLAogCQkJCUZDOUEwRjcyMTY0MDk0Q0YwMDNENkI4RCAvKiBET01XaW5kb3dDU1Mu
aCAqLywKIAkJCQlGQzlBMEY3MzE2NDA5NENGMDAzRDZCOEQgLyogRE9NV2luZG93Q1NTLmlkbCAq
LywKKwkJCQlGQkRCNjE5RTE2RDYwMzY1MDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3Iu
aCAqLywKKwkJCQlGQkRCNjE5QTE2RDYwMzJBMDBCQjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0
b3IuY3BwICovLAogCQkJCTRBNkU5RkMyMTNDMTdEMUQwMDQ2QTdGOCAvKiBGb250RmVhdHVyZVZh
bHVlLmggKi8sCiAJCQkJQTgwRTZDQzcwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1ZS5jcHAg
Ki8sCiAJCQkJQTgwRTZDQzMwQTE5ODlDQTAwN0ZCOEM1IC8qIEZvbnRWYWx1ZS5oICovLApAQCAt
MjIxNzEsNiArMjIxODEsOCBAQAogCQkJCUQzQTk0QTM1MTIyREFCQUMwMEEzN0JCQyAvKiBNZWRp
YVF1ZXJ5TGlzdExpc3RlbmVyLmlkbCAqLywKIAkJCQlEM0FBMTBGMTEyM0E5OEFBMDA5MjE1MkIg
LyogTWVkaWFRdWVyeU1hdGNoZXIuY3BwICovLAogCQkJCUQzQUExMEYyMTIzQTk4QUEwMDkyMTUy
QiAvKiBNZWRpYVF1ZXJ5TWF0Y2hlci5oICovLAorCQkJCUZCREI2MUEwMTZENjAzN0UwMEJCMzM5
NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5oICovLAorCQkJCUZCREI2MTlDMTZENjAzNDYwMEJCMzM5
NCAvKiBQYWdlUnVsZUNvbGxlY3Rvci5jcHAgKi8sCiAJCQkJQTgwRTZDRDEwQTE5ODlDQTAwN0ZC
OEM1IC8qIFBhaXIuaCAqLywKIAkJCQkzMTg5RTZEQjE2QjIxMDM1MDAzODZFQTMgLyogcGx1Z0lu
cy5jc3MgKi8sCiAJCQkJRTRCQkVEMEMxNEY0MDI1RDAwM0YwQjk4IC8qIFByb3BlcnR5U2V0Q1NT
U3R5bGVEZWNsYXJhdGlvbi5jcHAgKi8sCkBAIC0yNjcwMiw2ICsyNjcxNCw4IEBACiAJCQkJN0U2
NkUyMzQxNkQ2RUI2QzAwRjdFN0ZGIC8qIFdlYkdMQ29tcHJlc3NlZFRleHR1cmVBVEMuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTdFQTMwRjZBMTZERkZFNzUwMDI1N0QwQiAvKiBKU1dlYkdMQ29tcHJl
c3NlZFRleHR1cmVBVEMuaCBpbiBIZWFkZXJzICovLAogCQkJCTJEODI4N0Y3MTZFNEEwMzgwMDg2
QkQwMCAvKiBIaXRUZXN0TG9jYXRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCUZCREI2MTlGMTZE
NjAzNjUwMEJCMzM5NCAvKiBFbGVtZW50UnVsZUNvbGxlY3Rvci5oIGluIEhlYWRlcnMgKi8sCisJ
CQkJRkJEQjYxQTExNkQ2MDM3RTAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmggaW4gSGVh
ZGVycyAqLywKIAkJCQlBODk1NzBBMDE2RTlCRDU5MDAxODRFNTUgLyogSFRNTElkZW50aWZpZXIu
aCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nl
c3NpbmcgPSAwOwpAQCAtMjk5MDYsNiArMjk5MjAsOCBAQAogCQkJCTdFNjZFMjMzMTZENkVCNkMw
MEY3RTdGRiAvKiBXZWJHTENvbXByZXNzZWRUZXh0dXJlQVRDLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCTdFQTMwRjY5MTZERkZFNzUwMDI1N0QwQiAvKiBKU1dlYkdMQ29tcHJlc3NlZFRleHR1cmVB
VEMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMkQ4Mjg3RjYxNkU0QTAzODAwODZCRDAwIC8qIEhp
dFRlc3RMb2NhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlGQkRCNjE5QjE2RDYwMzJBMDBC
QjMzOTQgLyogRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRkJE
QjYxOUQxNkQ2MDM0NjAwQkIzMzk0IC8qIFBhZ2VSdWxlQ29sbGVjdG9yLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUE4OTU3MDlGMTZFOUJENTkwMDE4NEU1NSAvKiBIVE1MSWRlbnRpZmllci5jcHAg
aW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNz
aW5nID0gMDsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NBbGxJbk9uZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU0FsbEluT25lLmNwcAkocmV2aXNpb24gMTQ1
MzM4KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU0FsbEluT25lLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNzEsNyArNzEsOSBAQAogI2luY2x1ZGUgIkNTU1ZhbHVlUG9vbC5jcHAiCiAjaW5jbHVk
ZSAiRE9NV2luZG93Q1NTLmNwcCIKICNpbmNsdWRlICJEb2N1bWVudFJ1bGVTZXRzLmNwcCIKKyNp
bmNsdWRlICJFbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAiCiAjaW5jbHVkZSAiSW5zcGVjdG9yQ1NT
T01XcmFwcGVycy5jcHAiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xsZWN0b3IuY3BwIgogI2luY2x1
ZGUgIlJ1bGVGZWF0dXJlLmNwcCIKICNpbmNsdWRlICJSdWxlU2V0LmNwcCIKICNpbmNsdWRlICJT
ZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5jcHAiCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvRG9j
dW1lbnRSdWxlU2V0cy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0RvY3Vt
ZW50UnVsZVNldHMuY3BwCShyZXZpc2lvbiAxNDUzMzgpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3Mv
RG9jdW1lbnRSdWxlU2V0cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUzLDcgKzUzLDcgQEAgdm9p
ZCBTaGFkb3dEaXN0cmlidXRlZFJ1bGVzOjphZGRSdWxlKFN0eQogdm9pZCBTaGFkb3dEaXN0cmli
dXRlZFJ1bGVzOjpjb2xsZWN0TWF0Y2hSZXF1ZXN0cyhib29sIGluY2x1ZGVFbXB0eVJ1bGVzLCBW
ZWN0b3I8TWF0Y2hSZXF1ZXN0PiYgbWF0Y2hSZXF1ZXN0cykKIHsKICAgICBmb3IgKFNoYWRvd0Rp
c3RyaWJ1dGVkUnVsZVNldE1hcDo6aXRlcmF0b3IgaXQgPSBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVs
ZVNldE1hcC5iZWdpbigpOyBpdCAhPSBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5lbmQo
KTsgKytpdCkKLSAgICAgICAgbWF0Y2hSZXF1ZXN0cy5hcHBlbmQoTWF0Y2hSZXF1ZXN0KGl0LT52
YWx1ZS5nZXQoKSwgaW5jbHVkZUVtcHR5UnVsZXMsIGl0LT5rZXksIFNlbGVjdG9yQ2hlY2tlcjo6
Q3Jvc3Nlc0JvdW5kYXJ5KSk7CisgICAgICAgIG1hdGNoUmVxdWVzdHMuYXBwZW5kKE1hdGNoUmVx
dWVzdChpdC0+dmFsdWUuZ2V0KCksIGluY2x1ZGVFbXB0eVJ1bGVzLCBpdC0+a2V5KSk7CiB9CiAj
ZW5kaWYKIApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0RvY3VtZW50UnVsZVNldHMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oCShyZXZpc2lv
biAxNDUzMzgpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvRG9jdW1lbnRSdWxlU2V0cy5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGFkZFJ1bGUoU3R5
bGVSdWxlKiwgc2l6ZV90IHNlbGVjdG9ySW5kZXgsIENvbnRhaW5lck5vZGUqIHNjb3BlLCBBZGRS
dWxlRmxhZ3MpOwogICAgIHZvaWQgY29sbGVjdE1hdGNoUmVxdWVzdHMoYm9vbCBpbmNsdWRlRW1w
dHlSdWxlcywgVmVjdG9yPE1hdGNoUmVxdWVzdD4mKTsKICAgICB2b2lkIGNsZWFyKCkgeyBtX3No
YWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcC5jbGVhcigpOyB9CisgICAgYm9vbCBpc0VtcHR5KCkg
Y29uc3QgeyByZXR1cm4gbV9zaGFkb3dEaXN0cmlidXRlZFJ1bGVTZXRNYXAuaXNFbXB0eSgpOyB9
CiBwcml2YXRlOgogICAgIHR5cGVkZWYgSGFzaE1hcDxjb25zdCBDb250YWluZXJOb2RlKiwgT3du
UHRyPFJ1bGVTZXQ+ID4gU2hhZG93RGlzdHJpYnV0ZWRSdWxlU2V0TWFwOwogICAgIFNoYWRvd0Rp
c3RyaWJ1dGVkUnVsZVNldE1hcCBtX3NoYWRvd0Rpc3RyaWJ1dGVkUnVsZVNldE1hcDsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAkocmV2aXNpb24g
MTQ1MTgxKQkoZnJvbSBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5jcHA6MTQ1MTgx
KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDUxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFy
cyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqICAgICAgICAgICAoQykgMjAwNC0yMDA1IEFsbGFu
IFNhbmRmZWxkIEplbnNlbiAoa2RlQGNhcmV3b2xmLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAw
NiwgMjAwNyBOaWNob2xhcyBTaGFua3MgKHdlYmtpdEBuaWNrc2hhbmtzLmNvbSkKKyAqIENvcHly
aWdodCAoQykgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwg
MjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQWxleGV5IFByb3NrdXJ5YWtvdiA8YXBAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykg
MjAwNywgMjAwOCBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICogQ29weXJpZ2h0IChD
KSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRw
Oi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIENvZGUgQXVy
b3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJj
aCBJbiBNb3Rpb24gTGltaXRlZCAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCisKKyNpbmNsdWRlICJBdHRyaWJ1
dGUuaCIKKyNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5oIgorI2luY2x1ZGUgIkNTU0NhbGN1bGF0
aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NDdXJzb3JJbWFnZVZhbHVlLmgiCisjaW5jbHVkZSAi
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiQ1NTRm9udEZhY2VSdWxlLmgiCisj
aW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiQ1NTTGluZUJveENvbnRhaW5W
YWx1ZS5oIgorI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCisjaW5jbHVkZSAiQ1NTUGFyc2VyLmgi
CisjaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBwaW5ncy5oIgorI2luY2x1ZGUgIkNTU1By
b3BlcnR5TmFtZXMuaCIKKyNpbmNsdWRlICJDU1NSZWZsZWN0VmFsdWUuaCIKKyNpbmNsdWRlICJD
U1NTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgorI2luY2x1ZGUgIkNT
U1N0eWxlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgorI2luY2x1ZGUgIkNT
U1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUxpc3QuaCIKKyNpZiBF
TkFCTEUoQ1NTX1ZBUklBQkxFUykKKyNpbmNsdWRlICJDU1NWYXJpYWJsZVZhbHVlLmgiCisjZW5k
aWYKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUu
aCIKKyNpbmNsdWRlICJDb250ZW50RGF0YS5oIgorI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5o
IgorI2luY2x1ZGUgIkNvdW50ZXIuaCIKKyNpbmNsdWRlICJDb3VudGVyQ29udGVudC5oIgorI2lu
Y2x1ZGUgIkN1cnNvckxpc3QuaCIKKyNpbmNsdWRlICJEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0
aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5oIgorI2luY2x1ZGUgIkZvbnRGZWF0dXJl
VmFsdWUuaCIKKyNpbmNsdWRlICJGb250VmFsdWUuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVk
ZSAiSFRNTERvY3VtZW50LmgiCisjaW5jbHVkZSAiSFRNTElGcmFtZUVsZW1lbnQuaCIKKyNpbmNs
dWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVk
ZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MUHJvZ3Jlc3NFbGVtZW50Lmgi
CisjaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxUZXh0QXJlYUVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJJbnNlcnRpb25Qb2ludC5oIgorI2luY2x1ZGUgIkluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgIktleWZyYW1lTGlzdC5oIgorI2luY2x1ZGUg
IkxpbmtIYXNoLmgiCisjaW5jbHVkZSAiTG9jYWxlVG9TY3JpcHRNYXBwaW5nLmgiCisjaW5jbHVk
ZSAiTWF0aE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbi5o
IgorI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIk1lZGlh
TGlzdC5oIgorI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIKKyNpbmNsdWRlICJOb2Rl
UmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1
ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQYWlyLmgiCisjaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFu
c2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJRdW90ZXNEYXRhLmgiCisjaW5jbHVkZSAiUmVj
dC5oIgorI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJh
ci5oIgorI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhclRoZW1lLmgiCisjaW5jbHVkZSAiUmVuZGVy
U3R5bGVDb25zdGFudHMuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIlJl
bmRlclZpZXcuaCIKKyNpbmNsdWRlICJSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNs
dWRlICJSdWxlU2V0LmgiCisjaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRlbnNpb25zLmgiCisjaW5j
bHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50LmgiCisjaW5jbHVkZSAiU2NhbGVUcmFuc2Zvcm1PcGVy
YXRpb24uaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNlbGVjdG9y
Q2hlY2tlckZhc3RQYXRoLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJTaGFk
b3dEYXRhLmgiCisjaW5jbHVkZSAiU2hhZG93Um9vdC5oIgorI2luY2x1ZGUgIlNoYWRvd1ZhbHVl
LmgiCisjaW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMuaCIKKyNpbmNsdWRlICJT
a2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiU3R5bGVCdWlsZGVyLmgiCisjaW5j
bHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIlN0eWxlR2VuZXJhdGVkSW1hZ2Uu
aCIKKyNpbmNsdWRlICJTdHlsZVBlbmRpbmdJbWFnZS5oIgorI2luY2x1ZGUgIlN0eWxlUHJvcGVy
dHlTZXQuaCIKKyNpbmNsdWRlICJTdHlsZVByb3BlcnR5U2hvcnRoYW5kLmgiCisjaW5jbHVkZSAi
U3R5bGVSdWxlLmgiCisjaW5jbHVkZSAiU3R5bGVSdWxlSW1wb3J0LmgiCisjaW5jbHVkZSAiU3R5
bGVTaGVldENvbnRlbnRzLmgiCisjaW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIKKyNpbmNsdWRl
ICJUZXh0LmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJU
cmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNo
ZWV0cy5oIgorI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgorI2luY2x1ZGUgIlZp
c2l0ZWRMaW5rU3RhdGUuaCIKKyNpbmNsdWRlICJXZWJDb3JlTWVtb3J5SW5zdHJ1bWVudGF0aW9u
LmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVSdWxlLmgiCisjaW5jbHVkZSAiV2ViS2l0
Q1NTS2V5ZnJhbWVzUnVsZS5oIgorI2luY2x1ZGUgIldlYktpdENTU1JlZ2lvblJ1bGUuaCIKKyNp
bmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZS5oIgorI2luY2x1ZGUgIldlYktpdEZvbnRG
YW1pbHlOYW1lcy5oIgorI2luY2x1ZGUgIlhNTE5hbWVzLmgiCisjaW5jbHVkZSA8d3RmL01lbW9y
eUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVu
dGF0aW9uSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25WZWN0
b3IuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQorI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlv
bi5oIgorI2luY2x1ZGUgIldlYktpdENTU0ZpbHRlclZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVO
QUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKKyNpbmNsdWRlICJEYXNoYm9hcmRSZWdpb24uaCIKKyNl
bmRpZgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudC5oIgor
I2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiU1ZHRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJTVkdFbGVtZW50LmgiCisjaW5jbHVkZSAiU1ZHTmFtZXMuaCIK
KyNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1
bWVudFZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyNpbmNsdWRl
ICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlckNv
bnN0YW50cy5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlci5oIgorI2lu
Y2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlclBh
cmFtZXRlci5oIgorI2luY2x1ZGUgIkN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlci5oIgor
I2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgiCisjaW5jbHVkZSAiU3R5bGVDdXN0b21GaWx0
ZXJQcm9ncmFtLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5kaW5nU2hhZGVyLmgiCisjaW5jbHVkZSAi
U3R5bGVTaGFkZXIuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlLmgiCisj
aW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKENT
U19JTUFHRV9TRVQpCisjaW5jbHVkZSAiQ1NTSW1hZ2VTZXRWYWx1ZS5oIgorI2luY2x1ZGUgIlN0
eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQor
I2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3Rk
OworCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgU2VxdWVuY2VNZW1vcnlJ
bnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2ViQ29yZTo6UnVsZURhdGEqPiB7CisgICAgdGVt
cGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKEksIEksIE1l
bW9yeUNsYXNzSW5mbyYpIHsgfQorfTsKKworfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3Vz
aW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKKyNkZWZpbmUgSEFORExFX0lOSEVSSVQocHJvcCwg
UHJvcCkgXAoraWYgKGlzSW5oZXJpdCkgeyBcCisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1By
b3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCisgICAgcmV0dXJuOyBcCit9CisK
KyNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwgUHJvcCkgXAorSEFORExF
X0lOSEVSSVQocHJvcCwgUHJvcCkgXAoraWYgKGlzSW5pdGlhbCkgeyBcCisgICAgbV9zdGF0ZS5z
dHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1Byb3AoKSk7IFwKKyAgICBy
ZXR1cm47IFwKK30KKworUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRB
dmFpbGFibGU7CisKK3N0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0
aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0
PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKKyAgICBp
ZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCisgICAgICAgIGxlZnRUb1JpZ2h0RGVjbC0+
c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVlTHRyKTsKKyAgICByZXR1
cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOworfQorCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCog
cmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQ
dHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6
OmNyZWF0ZSgpKSk7CisgICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNFbXB0eSgpKQorICAgICAg
ICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NW
YWx1ZVJ0bCk7CisgICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQoKTsKK30KKworCitpbmxp
bmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjplbnN1cmVSdWxlTGlz
dCgpCit7CisgICAgaWYgKCFtX3J1bGVMaXN0KQorICAgICAgICBtX3J1bGVMaXN0ID0gU3RhdGlj
Q1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOworICAgIHJldHVybiBtX3J1bGVMaXN0LmdldCgpOworfQor
CitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVCb3JkZXJBbmRCYWNrZ3Jv
dW5kKCkKK3sKKyAgICBtX2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUtPmhhc0FwcGVhcmFuY2Uo
KTsKKyAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2UpIHsKKyAgICAgICAgbV9ib3JkZXJEYXRhID0g
bV9zdHlsZS0+Ym9yZGVyKCk7CisgICAgICAgIG1fYmFja2dyb3VuZERhdGEgPSAqbV9zdHlsZS0+
YmFja2dyb3VuZExheWVycygpOworICAgICAgICBtX2JhY2tncm91bmRDb2xvciA9IG1fc3R5bGUt
PmJhY2tncm91bmRDb2xvcigpOworICAgIH0KK30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZl
cjo6U3RhdGU6OmNsZWFyKCkKK3sKKyAgICBtX2VsZW1lbnQgPSAwOworICAgIG1fc3R5bGVkRWxl
bWVudCA9IDA7CisgICAgbV9wYXJlbnRTdHlsZSA9IDA7CisgICAgbV9wYXJlbnROb2RlID0gMDsK
KyAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOworICAgIG1fcnVsZUxpc3QgPSAwOworICAgIG1f
bWF0Y2hlZFJ1bGVzLmNsZWFyKCk7CisgICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFy
KCk7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIG1faGFzUGVuZGluZ1NoYWRlcnMgPSBm
YWxzZTsKKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyAg
ICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIoKTsKKyNlbmRpZgorfQorCitTdHlsZVJlc29s
dmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1bWVudCwgYm9vbCBtYXRjaEF1dGhvckFu
ZFVzZXJTdHlsZXMpCisgICAgOiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5j
ZUxhc3RTd2VlcCgwKQorICAgICwgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcih0
aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKQorICAgICwg
bV9kb2N1bWVudChkb2N1bWVudCkKKyAgICAsIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKG1h
dGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAsIG1fZm9udFNlbGVjdG9yKENTU0ZvbnRTZWxl
Y3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9O
KQorICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIoVmlld3BvcnRTdHlsZVJlc29sdmVyOjpj
cmVhdGUoZG9jdW1lbnQpKQorI2VuZGlmCisgICAgLCBtX3N0eWxlQnVpbGRlcihTdHlsZUJ1aWxk
ZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQorICAgICwgbV9zdHlsZU1hcCh0aGlzKQoreworICAg
IEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7CisKKyAgICBDU1NE
ZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0U3R5bGUocm9vdCk7CisKKyAgICAvLyBjb25z
dHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRlZmF1bHQgc3R5bGUuIHRoaXMgaXMgbmVlZGVk
CisgICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmllcyB0aGF0IGNvbnRhaW4gcmVsYXRpdmUg
Y29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQgKG1heC13aWR0aDogMTBlbSkiCisgICAgLy8g
VGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3RydWN0b3IsIGJlY2F1c2Ugd2hlbiBjb25zdHJ1
Y3RvciBpcyBydW4sCisgICAgLy8gZG9jdW1lbnQgZG9lc24ndCBoYXZlIGRvY3VtZW50RWxlbWVu
dAorICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0IGVsZW1lbnQgdGhhdCBnZXRzIHBhc3Nl
ZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKKyAgICAvLyBpcyBhbHdheXMgZnJvbSB0aGUgZG9j
dW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxlY3RvcgorICAgIEZyYW1lVmlldyogdmlldyA9
IGRvY3VtZW50LT52aWV3KCk7CisgICAgaWYgKHZpZXcpCisgICAgICAgIG1fbWVkaXVtID0gYWRv
cHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmlldy0+bWVkaWFUeXBlKCkpKTsKKyAgICBl
bHNlCisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Io
ImFsbCIpKTsKKworICAgIGlmIChyb290KQorICAgICAgICBtX3Jvb3REZWZhdWx0U3R5bGUgPSBz
dHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxsb3dTdHlsZVNoYXJpbmcsIE1hdGNoT25seVVz
ZXJBZ2VudFJ1bGVzKTsKKworICAgIGlmIChtX3Jvb3REZWZhdWx0U3R5bGUgJiYgdmlldykKKyAg
ICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcih2aWV3LT5t
ZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9yb290RGVmYXVsdFN0eWxlLmdldCgpKSk7CisK
KyAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5bGUoKTsKKworICAgIERvY3VtZW50U3R5bGVT
aGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uID0gZG9jdW1lbnQtPnN0eWxlU2hl
ZXRDb2xsZWN0aW9uKCk7CisgICAgbV9ydWxlU2V0cy5pbml0VXNlclN0eWxlKHN0eWxlU2hlZXRD
b2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsKKworI2lmIEVOQUJMRShTVkdfRk9OVFMpCisg
ICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCkpIHsKKyAgICAgICAgY29uc3QgSGFzaFNl
dDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9udEZhY2VFbGVtZW50cyA9IGRvY3VtZW50LT5z
dmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxlbWVudHMoKTsKKyAgICAgICAgSGFzaFNldDxT
VkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc3ZnRm9udEZhY2VFbGVt
ZW50cy5lbmQoKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpj
b25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNlRWxlbWVudHMuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KQorICAgICAgICAgICAgZm9udFNlbGVjdG9yKCktPmFkZEZvbnRGYWNlUnVsZSgoKml0
KS0+Zm9udEZhY2VSdWxlKCkpOworICAgIH0KKyNlbmRpZgorCisgICAgYXBwZW5kQXV0aG9yU3R5
bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rpb24tPmFjdGl2ZUF1dGhvclN0eWxlU2hlZXRz
KCkpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKHVu
c2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0eWxlU2hlZXQ+ID4mIHN0
eWxlU2hlZXRzKQoreworICAgIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoZmly
c3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5nZXQoKSwgbV9pbnNwZWN0b3JDU1NPTVdyYXBw
ZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgdGhpcyk7CisgICAgaWYgKGRvY3VtZW50
KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUoKSkKKyAgICAg
ICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2Vs
ZWN0b3IoKSk7CisKKyNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIHZpZXdw
b3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJl
c29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJlbnQpCit7CisgICAgY29uc3Qg
Q29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9IHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0
RWxlbWVudCgpOworCisgICAgLy8gV2UgYXJlIG5vdCBhbHdheXMgaW52b2tlZCBjb25zaXN0ZW50
bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0aW9uIGNhbiBjYXVzZSB1cyB0byBlbnRlcgor
ICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlkZGxlIG9mIHRyZWUgYnVpbGRpbmcuIFdlIG1h
eSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hlcmUgd2l0aGluIHRoZSB0cmVlLgorICAgIC8v
IFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2UsIG9yIGlmIHdlIHNlZSBhIG5ldyByb290IGVs
ZW1lbnQuCisgICAgLy8gT3RoZXJ3aXNlIGp1c3QgcHVzaCB0aGUgbmV3IHBhcmVudC4KKyAgICBp
ZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzRW1wdHko
KSkKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5zZXR1cFBhcmVudFN0YWNrKHBhcmVudCk7Cisg
ICAgZWxzZQorICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnB1c2hQYXJlbnQocGFyZW50KTsKKwor
ICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBTaGFkb3dSb290IG5vZGVzIGZvciB0aGUgc2Nv
cGUgc3RhY2suCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29s
dmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJlbnRPclNoYWRvd0hvc3ROb2RlKCkpOworfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQor
eworICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0IGludm9rZWQgZm9yIHNvbWUgcmFuZG9tIGVs
ZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVyaW5nIHN0eWxlIHJlc29sdmUuCisgICAgLy8g
UGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGluIHRoaXMgY2FzZS4KKyAgICBpZiAobV9zZWxl
Y3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChwYXJlbnQpKQorICAgICAgICBtX3Nl
bGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOworICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAg
ICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVudCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCogc2hhZG93Um9vdCkKK3sK
KyAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsKKyAgICBpZiAobV9zY29wZVJlc29sdmVy
KQorICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2goc2hhZG93Um9vdCwgc2hhZG93Um9vdC0+
aG9zdCgpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRTaGFkb3dSb290KGNv
bnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhv
c3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKKyAgICAgICAgbV9zY29wZVJlc29sdmVy
LT5wb3Aoc2hhZG93Um9vdCk7Cit9CisKKy8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNl
dHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0eWxlcwordm9pZCBTdHlsZVJlc29sdmVyOjph
ZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQorewor
ICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUoKSk7CisgICAgbV9rZXlmcmFtZXNSdWxlTWFw
LnNldChzLmltcGwoKSwgcnVsZSk7Cit9CisKK1N0eWxlUmVzb2x2ZXI6On5TdHlsZVJlc29sdmVy
KCkKK3sKKyAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xlYXJEb2N1bWVudCgpOworCisjaWYgRU5BQkxF
KENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci0+Y2xl
YXJEb2N1bWVudCgpOworI2VuZGlmCit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRj
aGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+KikKK3sKKyAgICAvLyBMb29r
IGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIGEg
c2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4g
YW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24gY2F1c2VzIGl0IHRvIGdlbmVyYXRlIGEgbmV3
IGlubGluZVN0eWxlKCkKKyAgICAvLyBvciBwcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpLCBw
b3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUgd2l0aCB0aGUgbGFzdCByZWYgb24gdGhlIG9s
ZCBvbmUuCisgICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4gdG9SZW1vdmU7CisgICAgTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYmVn
aW4oKTsKKyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBlbmQgPSBtX21hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7CisgICAgZm9yICg7IGl0ICE9IGVuZDsgKytpdCkgewor
ICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+JiBtYXRjaGVkUHJvcGVydGllcyA9IGl0
LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1hdGNo
ZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhhc09uZVJlZigpKSB7CisgICAgICAgICAgICAg
ICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
dG9SZW1vdmUuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5y
ZW1vdmUodG9SZW1vdmVbaV0pOworCisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRp
b25zU2luY2VMYXN0U3dlZXAgPSAwOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNo
ZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0
eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBl
LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoreworICAgIG1h
dGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpICsgMSk7CisgICAgTWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMg
PSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7CisgICAgbmV3UHJvcGVydGll
cy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7
CisgICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKKyAgICBu
ZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7CisgICAg
bWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKK30KKworaW5saW5lIHZvaWQg
U3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVz
dWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJs
ZSkKK3sKKyAgICBpZiAoIXByb3BlcnR5U2V0KQorICAgICAgICByZXR1cm47CisgICAgcmVzdWx0
LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7
CisgICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQorICAgICAgICBy
ZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1
bGU7CisgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7CisgICAg
aWYgKCFpc0NhY2hlYWJsZSkKKyAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Cit9
CisKK2NsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsKK3B1YmxpYzoKKyAgICBNYXRjaGluZ1VB
UnVsZXNTY29wZSgpOworICAgIH5NYXRjaGluZ1VBUnVsZXNTY29wZSgpOworCisgICAgc3RhdGlj
IGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYm9vbCBt
X21hdGNoaW5nVUFSdWxlczsKK307CisKK01hdGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VB
UnVsZXNTY29wZSgpCit7CisgICAgQVNTRVJUKCFtX21hdGNoaW5nVUFSdWxlcyk7CisgICAgbV9t
YXRjaGluZ1VBUnVsZXMgPSB0cnVlOworfQorCitNYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNo
aW5nVUFSdWxlc1Njb3BlKCkKK3sKKyAgICBtX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOworfQor
CitpbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQor
eworICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsKK30KKworYm9vbCBNYXRjaGluZ1VBUnVs
ZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKKwordm9pZCBTdHlsZVJlc29sdmVy
Ojpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwg
UnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgQVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0
KTsKKyAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkpOworCisgICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpOworICAgIGNv
bnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7
CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVk
b0lkKCk7CisgICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKHN0
eWxlZEVsZW1lbnQpOworICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkp
LCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgfQorCisjaWYgRU5BQkxFKFZJREVPX1RS
QUNLKQorICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSkKKyAgICAgICAgY29sbGVj
dE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisjZW5kaWYKKyAgICAvLyBDaGVjayB3aGV0
aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRy
ZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgorICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCisg
ICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1dGhvciBydWxlcworICAgIC8vIGMpIHRo
ZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0
cmVlIHNjb3BlCisgICAgVHJlZVNjb3BlKiB0cmVlU2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUo
KTsKKyAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCisg
ICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkKKyAgICAgICAgJiYgKCFt
YXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0
cmVlU2NvcGUpCisgICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0g
U2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcs
IGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKKyAgICAvLyB0aGVuIHNvcnQg
dGhlIGJ1ZmZlci4KKyAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSkKKyAgICAgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQt
PmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2Up
OworICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsK
KyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVz
KCkuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qo
bWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1l
cygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICB9CisKKyAgICBp
ZiAoZWxlbWVudC0+aXNMaW5rKCkpCisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlz
dChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOworICAgIGlmIChTZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1Bz
ZXVkb0NsYXNzKGVsZW1lbnQpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3Qo
bWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRj
aFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1h
dGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVS
YW5nZSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JS
ZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJh
bmdlKQoreworICAgIGlmICghbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIHVuc2lnbmVkIHNpemUgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdp
b25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHNpemU7ICsraSkgeworICAgICAgICBjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0
b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5h
dChpKS5zZWxlY3RvcjsKKyAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2Vs
ZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+
bm9kZSgpKSkpIHsKKyAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1
ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5n
ZXQoKTsKKyAgICAgICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7CisgICAgICAgICAgICBjb2xs
ZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5p
bmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKKyAgICAg
ICAgfQorICAgIH0KK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRj
aGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0
YXRlOworICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3Rh
dGUubWF0Y2hlZFJ1bGVzKCk7CisgICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKKworICAgIGlmIChzdGF0ZS5t
b2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7ICsraSkKKyAgICAgICAg
ICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tp
XS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8g
b3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgorICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBt
YXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYg
bWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKKyAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAgICBhZGRNYXRjaGVk
UHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCks
IG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUo
KSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7CisgICAgfQorfQor
Cit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyNpZiBFTkFCTEUoU1RZTEVfU0NP
UEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggc2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2
ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5j
b25zaXN0ZW50KS4KKyAgICBpZiAobV9zY29wZVJlc29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAm
JiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29uc2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50
KCkpKSB7CisgICAgICAgIGJvb2wgYXBwbHlBdXRob3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQo
KS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVzKCk7CisgICAgICAgIGJvb2wgZG9jdW1l
bnRTY29wZSA9IHRydWU7CisgICAgICAgIHVuc2lnbmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNv
bHZlci0+c3RhY2tTaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzY29w
ZVNpemU7ICsraSkgeworICAgICAgICAgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigp
OworICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgICAgICAgICBjb25zdCBTdHlsZVNjb3Bl
UmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1l
QXQoaSk7CisgICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJh
bWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgICAgIGlmIChkb2N1bWVudFNj
b3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykKKyAgICAgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQorICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
TWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1
bGVzLCBmcmFtZS5tX3Njb3BlKTsKKyAgICAgICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBy
ZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgICAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgICAgICAgICAgY29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgICAgICAg
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyNlbHNl
CisgICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0
eVJ1bGVzKTsKKyNlbmRpZgorfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNo
YXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkKK3sKKyNpZiBFTkFCTEUoU0hBRE9XX0RP
TSkKKyAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7CisjZWxz
ZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
Cit7CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgQVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7
CisKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgcmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwor
CisgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7CisgICAgbV9zY29wZVJlc29sdmVy
LT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKKyAgICBp
ZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICh1
bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgeworICAgICAgICBS
dWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChp
LTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwor
ICAgIH0KKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKyNlbHNlCisg
ICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7CisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1
bGVzKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMo
TWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sKKyAgICBtX3N0
YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9y
UnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworCisgICAgaWYgKCFt
X3N0YXRlLmVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWF0Y2ggZ2xvYmFs
IGF1dGhvciBydWxlcy4KKyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMu
YXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxlUmFu
Z2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRjaGlu
Z1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
c0ZvclJlZ2lvbihtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisjaWYgRU5BQkxFKFNIQURPV19E
T00pCisgICAgVmVjdG9yPE1hdGNoUmVxdWVzdD4gbWF0Y2hSZXF1ZXN0czsKKyAgICBtX3J1bGVT
ZXRzLnNoYWRvd0Rpc3RyaWJ1dGVkUnVsZXMoKS5jb2xsZWN0TWF0Y2hSZXF1ZXN0cyhpbmNsdWRl
RW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0cyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
YXRjaFJlcXVlc3RzLnNpemUoKTsgKytpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyht
YXRjaFJlcXVlc3RzW2ldLCBydWxlUmFuZ2UpOworI2VuZGlmCisKKyAgICBzb3J0QW5kVHJhbnNm
ZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKKworICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMocmVz
dWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hV
c2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKK3sK
KyAgICBpZiAoIW1fcnVsZVNldHMudXNlclN0eWxlKCkpCisgICAgICAgIHJldHVybjsKKyAgICAK
KyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7CisKKyAgICByZXN1bHQucmFuZ2Vz
Lmxhc3RVc2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAg
IE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaW5jbHVk
ZUVtcHR5UnVsZXMpOworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVz
ZXJSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1
bHQsIFJ1bGVTZXQqIHJ1bGVzKQoreworICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIo
KTsKKyAgICAKKyAgICByZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgPSByZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJh
bmdlcy5VQVJ1bGVSYW5nZSgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVz
dChydWxlcyksIHJ1bGVSYW5nZSk7CisKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMo
cmVzdWx0KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
ckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYg
bWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5nZSkKK3sKKyAgICBpZiAoIXJ1bGVzKQor
ICAgICAgICByZXR1cm47CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIC8vIElu
IHNvbWUgY2FzZXMgd2UgbWF5IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZvciByYW5kb20gZWxl
bWVudHMgaW4gdGhlIG1pZGRsZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29sdmUuCisgICAgLy8g
QW5jZXN0b3IgaWRlbnRpZmllciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNh
c2UgYW5kIHdlIGNhbid0IHVzZSB0aGUgZmFzdCBwYXRoLgorICAgIGJvb2wgY2FuVXNlRmFzdFJl
amVjdCA9IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQoc3RhdGUucGFy
ZW50Tm9kZSgpKSAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9y
Q2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnk7CisKKyAgICB1bnNpZ25lZCBzaXplID0gcnVs
ZXMtPnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Cisg
ICAgICAgIGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChpKTsKKyAgICAgICAg
aWYgKGNhblVzZUZhc3RSZWplY3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0
b3I8UnVsZURhdGE6Om1heGltdW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRT
ZWxlY3RvcklkZW50aWZpZXJIYXNoZXMoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAg
ICAgICBTdHlsZVJ1bGUqIHJ1bGUgPSBydWxlRGF0YS5ydWxlKCk7CisgICAgICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246
OndpbGxNYXRjaFJ1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7CisgICAgICAgIFBzZXVkb0lk
IGR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVE
YXRhLCBtYXRjaFJlcXVlc3Quc2NvcGUsIGR5bmFtaWNQc2V1ZG8sIG1hdGNoUmVxdWVzdC5iZWhh
dmlvckF0Qm91bmRhcnkpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJv
cGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2RlLgor
ICAgICAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnBy
b3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmICghcHJvcGVydGllcyB8fCAocHJvcGVydGllcy0+
aXNFbXB0eSgpICYmICFtYXRjaFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMpKSB7CisgICAgICAg
ICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBm
YWxzZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAvLyBGSVhNRTogRXhwb3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVs
ZXMgQVBJIHRvIHdlYiBpcyB0aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVkZWQuCisgICAgICAg
ICAgICBpZiAoc3RhdGUuaXNTYW1lT3JpZ2luT25seSgpICYmICFydWxlRGF0YS5oYXNEb2N1bWVu
dFNlY3VyaXR5T3JpZ2luKCkpIHsKKyAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50
YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIG1hdGNoaW5nIG5v
cm1hbCBydWxlcywgc2V0IGEgcHNldWRvIGJpdCBpZgorICAgICAgICAgICAgLy8gd2UgcmVhbGx5
IGp1c3QgbWF0Y2hlZCBhIHBzZXVkby1lbGVtZW50LgorICAgICAgICAgICAgaWYgKGR5bmFtaWNQ
c2V1ZG8gIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQg
PT0gTk9QU0VVRE8pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVj
dG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOworICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgaWYgKGR5bmFtaWNQc2V1ZG8gPCBGSVJTVF9JTlRFUk5BTF9QU0VVRE9JRCkKKyAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SGFzUHNldWRvU3R5bGUoZHluYW1pY1BzZXVk
byk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIg
Zmlyc3QvbGFzdCBydWxlIGluZGljZXMgaW4gdGhlIG1hdGNoZWQgcnVsZXMgYXJyYXkuCisgICAg
ICAgICAgICAgICAgKytydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKKyAgICAgICAgICAgICAgICBp
ZiAocnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICBy
dWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKKworICAg
ICAgICAgICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxl
cy4KKyAgICAgICAgICAgICAgICBtX3N0YXRlLmFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7Cisg
ICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29v
a2llLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShj
b29raWUsIGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUnVs
ZXMoY29uc3QgUnVsZURhdGEqIHIxLCBjb25zdCBSdWxlRGF0YSogcjIpCit7CisgICAgdW5zaWdu
ZWQgc3BlY2lmaWNpdHkxID0gcjEtPnNwZWNpZmljaXR5KCk7CisgICAgdW5zaWduZWQgc3BlY2lm
aWNpdHkyID0gcjItPnNwZWNpZmljaXR5KCk7CisgICAgcmV0dXJuIChzcGVjaWZpY2l0eTEgPT0g
c3BlY2lmaWNpdHkyKSA/IHIxLT5wb3NpdGlvbigpIDwgcjItPnBvc2l0aW9uKCkgOiBzcGVjaWZp
Y2l0eTEgPCBzcGVjaWZpY2l0eTI7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydE1hdGNo
ZWRSdWxlcygpCit7CisgICAgc3RkOjpzb3J0KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4o
KSwgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKK30KKwordm9p
ZCBTdHlsZVJlc29sdmVyOjptYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wg
aW5jbHVkZVNNSUxQcm9wZXJ0aWVzKQoreworICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQpOworCisg
ICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVsZXMuCisgICAgaWYgKG1fbWF0Y2hBdXRo
b3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaFVzZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsK
KworICAgIC8vIE5vdyBjaGVjayBhdXRob3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHBy
ZXNlbnRhdGlvbmFsIGF0dHJpYnV0ZXMgbWFwcGVkIGZyb20gSFRNTC4KKyAgICBpZiAobV9zdGF0
ZS5zdHlsZWRFbGVtZW50KCkpIHsKKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhy
ZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHls
ZSgpKTsKKworICAgICAgICAvLyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBtYXBwZWQgZGVjbGFy
YXRpb25zLgorICAgICAgICAvLyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0
aW9uYWwgbWFwcGVkIHJ1bGUgdGhhdCBtdXN0IGJlIGFwcGxpZWQKKyAgICAgICAgLy8gYWZ0ZXIg
YWxsIGF0dHJpYnV0ZXMsIHNpbmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2
YWx1ZXMgb2YgbXVsdGlwbGUgYXR0cmlidXRlcy4KKyAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJv
cGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2Vu
dGF0aW9uQXR0cmlidXRlU3R5bGUoKSk7CisKKyAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBdXRvOworICAg
ICAgICAgICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0
YXRlLnN0eWxlZEVsZW1lbnQoKSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRl
KGlzQXV0byk7CisgICAgICAgICAgICBpZiAoaXNBdXRvKQorICAgICAgICAgICAgICAgIGFkZE1h
dGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdo
dERlY2xhcmF0aW9uKCkgOiByaWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOworICAgICAgICB9Cisg
ICAgfQorICAgIAorICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzIG5leHQu
CisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAgICBtYXRjaEF1dGhv
clJ1bGVzKHJlc3VsdCwgZmFsc2UpOworCisgICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5
bGUgYXR0cmlidXRlLgorICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0
YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5
bGUoKSkgeworICAgICAgICAvLyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMg
dGhlcmUgaXMgbm8gQ1NTT00gd3JhcHBlci4KKyAgICAgICAgLy8gRklYTUU6IE1lZGlhIGNvbnRy
b2wgc2hhZG93IHRyZWVzIHNlZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcuCisgICAg
ICAgIGJvb2wgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aW5saW5lU3R5bGUoKS0+aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgp
LT5pc0luU2hhZG93VHJlZSgpOworICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCisgICAgICAg
IGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KS0+aW5saW5lU3R5bGUoKSwgaXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7CisgICAgfQorCisjaWYg
RU5BQkxFKFNWRykKKyAgICAvLyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5
bGUuCisgICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aXNTVkdFbGVtZW50KCkpCisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMo
cmVzdWx0LCBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkp
LT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8p
OworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKKyNlbmRp
ZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29u
c3QgU3BhY2VTcGxpdFN0cmluZyYgY2xhc3NOYW1lcykgY29uc3QKK3sKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobV9y
dWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzTmFtZXNbaV0u
aW1wbCgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0RWxlbWVudChF
bGVtZW50KiBlKQoreworICAgIG1fZWxlbWVudCA9IGU7CisgICAgbV9zdHlsZWRFbGVtZW50ID0g
ZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihl
KSA6IDA7CisgICAgbV9lbGVtZW50TGlua1N0YXRlID0gZSA/IGUtPmRvY3VtZW50KCktPnZpc2l0
ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUpIDogTm90SW5zaWRlTGluazsKK30K
KworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKK3sK
KyAgICBpZiAobV9zdGF0ZS5lbGVtZW50KCkgIT0gZSkgeworICAgICAgICBtX3N0YXRlLmluaXRF
bGVtZW50KGUpOworICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50
RWxlbWVudCgpKSB7CisgICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRP
bkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRX
cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0K
K30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29s
dmUoRG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJS
ZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7CisgICAgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBw
c2V1ZG9TdHlsZVJlcXVlc3Q7CisgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gcmVnaW9uRm9yU3R5
bGluZzsKKworICAgIGlmIChlKSB7CisgICAgICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRl
eHQoZSk7CisgICAgICAgIG1fcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRl
cmluZ0FuZFN0eWxlKCk7CisgICAgICAgIG1fcGFyZW50U3R5bGUgPSBjb250ZXh0LnJlc2V0U3R5
bGVJbmhlcml0YW5jZSgpID8gMCA6CisgICAgICAgICAgICBwYXJlbnRTdHlsZSA/IHBhcmVudFN0
eWxlIDoKKyAgICAgICAgICAgIG1fcGFyZW50Tm9kZSA/IG1fcGFyZW50Tm9kZS0+cmVuZGVyU3R5
bGUoKSA6IDA7CisgICAgICAgIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gY29udGV4
dC5pbnNlcnRpb25Qb2ludCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcGFyZW50Tm9kZSA9
IDA7CisgICAgICAgIG1fcGFyZW50U3R5bGUgPSBwYXJlbnRTdHlsZTsKKyAgICAgICAgbV9kaXN0
cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBOb2RlKiBkb2NF
bGVtZW50ID0gZSA/IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpIDogMDsKKyAgICBS
ZW5kZXJTdHlsZSogZG9jU3R5bGUgPSBkb2N1bWVudC0+cmVuZGVyU3R5bGUoKTsKKyAgICBtX3Jv
b3RFbGVtZW50U3R5bGUgPSBkb2NFbGVtZW50ICYmIGUgIT0gZG9jRWxlbWVudCA/IGRvY0VsZW1l
bnQtPnJlbmRlclN0eWxlKCkgOiBkb2NTdHlsZTsKKworICAgIG1fc3R5bGUgPSAwOworICAgIG1f
cGVuZGluZ0ltYWdlUHJvcGVydGllcy5jbGVhcigpOworICAgIG1fcnVsZUxpc3QgPSAwOworICAg
IG1fZm9udERpcnR5ID0gZmFsc2U7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVT
ZWFyY2hUaHJlc2hvbGQgPSAxMDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjU3R5bGVTZWFyY2hM
ZXZlbFRocmVzaG9sZCA9IDEwOworCitzdGF0aWMgaW5saW5lIGJvb2wgcGFyZW50RWxlbWVudFBy
ZXZlbnRzU2hhcmluZyhjb25zdCBFbGVtZW50KiBwYXJlbnRFbGVtZW50KQoreworICAgIGlmICgh
cGFyZW50RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBwYXJlbnRF
bGVtZW50LT5oYXNGbGFnc1NldER1cmluZ1N0eWxpbmdPZkNoaWxkcmVuKCk7Cit9CisKK05vZGUq
IFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25l
ZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3QKK3sKKyAgICBpZiAodmlzaXRlZE5vZGVDb3VudCA+
PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgKiBjU3R5bGVTZWFyY2hMZXZlbFRocmVzaG9sZCkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+aXNTdHlsZWRFbGVt
ZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwYXJlbnQtPmhhc1Njb3BlZEhUTUxT
dHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIFN0eWxlZEVsZW1lbnQqIHAgPSBz
dGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4ocGFyZW50KTsKKyAgICBpZiAocC0+aW5saW5lU3R5
bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAocC0+aXNT
VkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KHApLT5hbmltYXRlZFNNSUxT
dHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICBpZiAocC0+
aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhwLT5p
ZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
UmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gcC0+cmVuZGVyU3R5bGUoKTsKKyAgICB1bnNpZ25l
ZCBzdWJjb3VudCA9IDA7CisgICAgTm9kZSogdGhpc0NvdXNpbiA9IHA7CisgICAgTm9kZSogY3Vy
cmVudE5vZGUgPSBwLT5wcmV2aW91c1NpYmxpbmcoKTsKKworICAgIC8vIFJlc2VydmUgdGhlIHRy
aWVzIGZvciB0aGlzIGxldmVsLiBUaGlzIGVmZmVjdGl2ZWx5IG1ha2VzIHN1cmUgdGhhdCB0aGUg
YWxnb3JpdGhtCisgICAgLy8gd2lsbCBuZXZlciBnbyBkZWVwZXIgdGhhbiBjU3R5bGVTZWFyY2hM
ZXZlbFRocmVzaG9sZCBsZXZlbHMgaW50byByZWN1cnNpb24uCisgICAgdmlzaXRlZE5vZGVDb3Vu
dCArPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQ7CisgICAgd2hpbGUgKHRoaXNDb3VzaW4pIHsKKyAg
ICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7CisgICAgICAgICAgICArK3N1YmNvdW50OworICAg
ICAgICAgICAgaWYgKGN1cnJlbnROb2RlLT5yZW5kZXJTdHlsZSgpID09IHBhcmVudFN0eWxlICYm
IGN1cnJlbnROb2RlLT5sYXN0Q2hpbGQoKQorICAgICAgICAgICAgICAgICYmIGN1cnJlbnROb2Rl
LT5pc0VsZW1lbnROb2RlKCkgJiYgIXBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcodG9FbGVt
ZW50KGN1cnJlbnROb2RlKSkKKyNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKKyAgICAgICAgICAgICAg
ICAmJiAhdG9FbGVtZW50KGN1cnJlbnROb2RlKS0+c2hhZG93KCkKKyNlbmRpZgorICAgICAgICAg
ICAgICAgICkgeworICAgICAgICAgICAgICAgIC8vIEFkanVzdCBmb3IgdW51c2VkIHJlc2VydmVk
IHRyaWVzLgorICAgICAgICAgICAgICAgIHZpc2l0ZWROb2RlQ291bnQgLT0gY1N0eWxlU2VhcmNo
VGhyZXNob2xkIC0gc3ViY291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2Rl
LT5sYXN0Q2hpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWJjb3VudCA+
PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLT5wcmV2aW91c1NpYmxpbmcoKTsKKyAg
ICAgICAgfQorICAgICAgICBjdXJyZW50Tm9kZSA9IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNp
bi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKKyAgICAgICAgdGhpc0NvdXNp
biA9IGN1cnJlbnROb2RlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitib29sIFN0eWxl
UmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1
bGVTZXQpCit7CisgICAgaWYgKCFydWxlU2V0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworCisgICAgbV9zdGF0ZS5zZXRNb2RlKFNl
bGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsKKyAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAt
MSwgbGFzdFJ1bGVJbmRleCA9IC0xOworICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxl
SW5kZXgsIGxhc3RSdWxlSW5kZXgpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVx
dWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKKyAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JD
aGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7CisgICAgaWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCku
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9zdGF0ZS5tYXRjaGVkUnVs
ZXMoKS5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6
OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAor
eworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgSFRNTElucHV0RWxlbWVu
dCogdGhpc0lucHV0RWxlbWVudCA9IGVsZW1lbnQtPnRvSW5wdXRFbGVtZW50KCk7CisgICAgSFRN
TElucHV0RWxlbWVudCogb3RoZXJJbnB1dEVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50KCktPnRvSW5w
dXRFbGVtZW50KCk7CisKKyAgICBpZiAoIXRoaXNJbnB1dEVsZW1lbnQgfHwgIW90aGVySW5wdXRF
bGVtZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAodGhpc0lucHV0RWxlbWVu
dC0+ZWxlbWVudERhdGEoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZWxlbWVudERhdGEoKSkgewor
ICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZSh0eXBlQXR0cikg
IT0gb3RoZXJJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+ZmFzdEdl
dEF0dHJpYnV0ZShyZWFkb25seUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0
cmlidXRlKHJlYWRvbmx5QXR0cikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzQXV0b2ZpbGxlZCgpICE9IG90aGVySW5wdXRF
bGVtZW50LT5pc0F1dG9maWxsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0
aGlzSW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkgIT0gb3RoZXJJbnB1dEVsZW1l
bnQtPnNob3VsZEFwcGVhckNoZWNrZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
ICh0aGlzSW5wdXRFbGVtZW50LT5pc0luZGV0ZXJtaW5hdGUoKSAhPSBvdGhlcklucHV0RWxlbWVu
dC0+aXNJbmRldGVybWluYXRlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhp
c0lucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5pc1JlcXVp
cmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc0VuYWJs
ZWRGb3JtQ29udHJvbCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNFbmFibGVkRm9ybUNvbnRyb2wo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzRGVmYXVsdEJ1
dHRvbkZvckZvcm0oKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRGVmYXVsdEJ1dHRvbkZvckZvcm0o
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0YXRlLmRvY3VtZW50KCktPmNv
bnRhaW5zVmFsaWRpdHlTdHlsZVJ1bGVzKCkpIHsKKyAgICAgICAgYm9vbCB3aWxsVmFsaWRhdGUg
PSBlbGVtZW50LT53aWxsVmFsaWRhdGUoKTsKKworICAgICAgICBpZiAod2lsbFZhbGlkYXRlICE9
IHN0YXRlLmVsZW1lbnQoKS0+d2lsbFZhbGlkYXRlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAmJiAoZWxlbWVudC0+aXNWYWxpZEZvcm1D
b250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNWYWxpZEZvcm1Db250cm9sRWxl
bWVudCgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZWxlbWVu
dC0+aXNJblJhbmdlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0luUmFuZ2UoKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkg
IT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29s
IGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgLy8gRklY
TUU6IFRoaXMgbGluZSBpcyBzdXJwcmlzaW5nbHkgaG90LCB3ZSBtYXkgd2lzaCB0byBpbmxpbmUg
aGFzRGlyZWN0aW9uQXV0byBpbnRvIFN0eWxlUmVzb2x2ZXIuCisgICAgcmV0dXJuIGVsZW1lbnQt
PmlzSFRNTEVsZW1lbnQoKSAmJiB0b0hUTUxFbGVtZW50KGVsZW1lbnQpLT5oYXNEaXJlY3Rpb25B
dXRvKCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6c2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50
aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHlsZWRFbGVtZW50KiBzaGFyaW5nQ2FuZGlk
YXRlKSBjb25zdAoreworICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYg
KHN0YXRlLmVsZW1lbnQoKS0+ZWxlbWVudERhdGEoKSA9PSBzaGFyaW5nQ2FuZGlkYXRlLT5lbGVt
ZW50RGF0YSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoc3RhdGUuZWxlbWVudCgp
LT5mYXN0R2V0QXR0cmlidXRlKFhNTE5hbWVzOjpsYW5nQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0
ZS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0
cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZmFzdEdldEF0dHJpYnV0ZShsYW5nQXR0cikpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghc3RhdGUuZWxlbWVudEFmZmVjdGVkQnlDbGFz
c1J1bGVzKCkpIHsKKyAgICAgICAgaWYgKHNoYXJpbmdDYW5kaWRhdGUtPmhhc0NsYXNzKCkgJiYg
Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhzaGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVzKCkp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc2hhcmluZ0NhbmRp
ZGF0ZS0+aGFzQ2xhc3MoKSkgeworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIC8vIFNWRyBlbGVt
ZW50cyByZXF1aXJlIGEgKHNsb3chKSBnZXRBdHRyaWJ1dGUgY29tcGFyaXNpb24gYmVjYXVzZSAi
Y2xhc3MiIGlzIGFuIGFuaW1hdGFibGUgYXR0cmlidXRlIGZvciBTVkcuCisgICAgICAgIGlmIChz
dGF0ZS5lbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUu
ZWxlbWVudCgpLT5nZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5n
ZXRBdHRyaWJ1dGUoY2xhc3NBdHRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0gZWxzZSB7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCkt
PmNsYXNzTmFtZXMoKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5jbGFzc05hbWVzKCkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIH0KKyNlbmRp
ZgorICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpICE9IHNoYXJpbmdDYW5k
aWRhdGUtPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworI2lmIEVOQUJMRShQUk9HUkVTU19FTEVNRU5UKQorICAgIGlmIChzdGF0ZS5lbGVtZW50
KCktPmhhc1RhZ05hbWUocHJvZ3Jlc3NUYWcpKSB7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxI
VE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc3RhdGUuZWxlbWVudCgpKS0+aXNEZXRlcm1pbmF0ZSgpICE9
IHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihzaGFyaW5nQ2FuZGlkYXRlKS0+aXNE
ZXRlcm1pbmF0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2FuU2hhcmVTdHls
ZVdpdGhFbGVtZW50KFN0eWxlZEVsZW1lbnQqIGVsZW1lbnQpIGNvbnN0Cit7CisgICAgUmVuZGVy
U3R5bGUqIHN0eWxlID0gZWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKKyAgICBjb25zdCBTdGF0ZSYg
c3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYgKCFzdHlsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAoc3R5bGUtPmhhc1VuaXF1ZVBzZXVkb1N0eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAoZWxlbWVudC0+dGFnUU5hbWUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPnRhZ1FOYW1l
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+aW5saW5lU3R5bGUo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5uZWVkc1N0eWxlUmVj
YWxjKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChl
bGVtZW50LT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4oZWxlbWVu
dCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisjZW5kaWYKKyAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5p
c0xpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5ob3ZlcmVk
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5ob3ZlcmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICBpZiAoZWxlbWVudC0+YWN0aXZlKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5hY3RpdmUoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5mb2N1c2VkKCkgIT0gc3Rh
dGUuZWxlbWVudCgpLT5mb2N1c2VkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAo
ZWxlbWVudC0+c2hhZG93UHNldWRvSWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPnNoYWRvd1BzZXVk
b0lkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50
LT5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlm
ICghc2hhcmluZ0NhbmRpZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhl
bGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChlbGVtZW50LT5hZGRpdGlv
bmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCkt
PmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVz
KCkuaWRzSW5SdWxlcy5jb250YWlucyhlbGVtZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmlt
cGwoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+aGFzU2NvcGVk
SFRNTFN0eWxlQ2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6
IFdlIHNob3VsZCBzaGFyZSBzdHlsZSBmb3Igb3B0aW9uIGFuZCBvcHRncm91cCB3aGVuZXZlciBw
b3NzaWJsZS4KKyAgICAvLyBCZWZvcmUgZG9pbmcgc28sIHdlIG5lZWQgdG8gcmVzb2x2ZSBpc3N1
ZXMgaW4gSFRNTFNlbGVjdEVsZW1lbnQ6OnJlY2FsY0xpc3RJdGVtcworICAgIC8vIGFuZCBSZW5k
ZXJNZW51TGlzdDo6c2V0VGV4dC4gU2VlIGFsc28gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTg4NDA1CisgICAgaWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUob3B0aW9uVGFn
KSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGdyb3VwVGFnKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgYm9vbCBpc0NvbnRyb2wgPSBlbGVtZW50LT5pc0Zvcm1Db250cm9sRWxlbWVu
dCgpOworCisgICAgaWYgKGlzQ29udHJvbCAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRm9ybUNvbnRy
b2xFbGVtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpc0NvbnRyb2wg
JiYgIWNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKHN0eWxlLT50cmFuc2l0aW9ucygpIHx8IHN0eWxlLT5hbmltYXRpb25z
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICAvLyBUdXJuIG9mZiBzdHlsZSBzaGFyaW5nIGZvciBlbGVtZW50cyB0aGF0IGNh
biBnYWluIGxheWVycyBmb3IgcmVhc29ucyBvdXRzaWRlIG9mIHRoZSBzdHlsZSBzeXN0ZW0uCisg
ICAgLy8gU2VlIGNvbW1lbnRzIGluIFJlbmRlck9iamVjdDo6c2V0U3R5bGUoKS4KKyAgICBpZiAo
ZWxlbWVudC0+aGFzVGFnTmFtZShpZnJhbWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZnJh
bWVUYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpIHx8IGVsZW1lbnQtPmhhc1Rh
Z05hbWUob2JqZWN0VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGFwcGxldFRhZykgfHwgZWxl
bWVudC0+aGFzVGFnTmFtZShjYW52YXNUYWcpCisjaWYgRU5BQkxFKFBMVUdJTl9QUk9YWV9GT1Jf
VklERU8pCisgICAgICAgIC8vIFdpdGggcHJveHlpbmcsIHRoZSBtZWRpYSBlbGVtZW50cyBhcmUg
YmFja2VkIGJ5IGEgUmVuZGVyRW1iZWRkZWRPYmplY3QuCisgICAgICAgIHx8IGVsZW1lbnQtPmhh
c1RhZ05hbWUodmlkZW9UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05hbWUoYXVkaW9UYWcpCisjZW5k
aWYKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICAgIGlmIChl
bGVtZW50SGFzRGlyZWN0aW9uQXV0byhlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICYmIHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUoKSAh
PSBzdHlsZS0+aW5zaWRlTGluaygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBFTkFC
TEUoVklERU9fVFJBQ0spCisgICAgLy8gRGVueSBzaGFyaW5nIHN0eWxlcyBiZXR3ZWVuIFdlYlZU
VCBhbmQgbm9uLVdlYlZUVCBub2Rlcy4KKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50
KCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICYmIHN0YXRlLmVs
ZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkgJiYgdG9XZWJWVFRFbGVtZW50KGVsZW1lbnQpLT5p
c1Bhc3ROb2RlKCkgIT0gdG9XZWJWVFRFbGVtZW50KHN0YXRlLmVsZW1lbnQoKSktPmlzUGFzdE5v
ZGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyNpZiBFTkFCTEUoRlVMTFND
UkVFTl9BUEkpCisgICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+d2Via2l0
Q3VycmVudEZ1bGxTY3JlZW5FbGVtZW50KCkgfHwgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRv
Y3VtZW50KCktPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIFN0eWxlZEVs
ZW1lbnQqIFN0eWxlUmVzb2x2ZXI6OmZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKE5vZGUqIG5v
ZGUsIHVuc2lnbmVkJiBjb3VudCkgY29uc3QKK3sKKyAgICBmb3IgKDsgbm9kZTsgbm9kZSA9IG5v
ZGUtPnByZXZpb3VzU2libGluZygpKSB7CisgICAgICAgIGlmICghbm9kZS0+aXNTdHlsZWRFbGVt
ZW50KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNhblNoYXJlU3R5bGVX
aXRoRWxlbWVudChzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSkpKQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGlmIChjb3VudCsrID09IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3R5
bGVkRWxlbWVudCo+KG5vZGUpOworfQorCitSZW5kZXJTdHlsZSogU3R5bGVSZXNvbHZlcjo6bG9j
YXRlU2hhcmVkU3R5bGUoKQoreworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaWYg
KCFzdGF0ZS5zdHlsZWRFbGVtZW50KCkgfHwgIXN0YXRlLnBhcmVudFN0eWxlKCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGlubGluZSBzdHlsZSBpdCBp
cyBwcm9iYWJseSB1bmlxdWUuCisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5l
U3R5bGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVt
ZW50Kj4oc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVz
KCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgLy8gSWRzIHN0b3Agc3R5bGUgc2hh
cmluZyBpZiB0aGV5IHNob3cgdXAgaW4gdGhlIHN0eWxlc2hlZXRzLgorICAgIGlmIChzdGF0ZS5z
dHlsZWRFbGVtZW50KCktPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVs
ZXMuY29udGFpbnMoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pZEZvclN0eWxlUmVzb2x1dGlvbigp
LmltcGwoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwYXJlbnRFbGVtZW50UHJldmVu
dHNTaGFyaW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzU2NvcGVkSFRNTFN0eWxl
Q2hpbGQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0YXRlLmVsZW1lbnQoKSA9PSBz
dGF0ZS5kb2N1bWVudCgpLT5jc3NUYXJnZXQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYg
KGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRvKHN0YXRlLmVsZW1lbnQoKSkpCisgICAgICAgIHJldHVy
biAwOworCisgICAgLy8gQ2FjaGUgd2hldGhlciBzdGF0ZS5lbGVtZW50IGlzIGFmZmVjdGVkIGJ5
IGFueSBrbm93biBjbGFzcyBzZWxlY3RvcnMuCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkbid0
IGJlIGEgbWVtYmVyIHZhcmlhYmxlLiBUaGUgc3R5bGUgc2hhcmluZyBjb2RlIGNvdWxkIGJlIGZh
Y3RvcmVkIG91dCBvZiBTdHlsZVJlc29sdmVyLgorICAgIHN0YXRlLnNldEVsZW1lbnRBZmZlY3Rl
ZEJ5Q2xhc3NSdWxlcyhzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5oYXNDbGFz
cygpICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc3RhdGUuZWxlbWVudCgpLT5jbGFzc05h
bWVzKCkpKTsKKworICAgIC8vIENoZWNrIHByZXZpb3VzIHNpYmxpbmdzIGFuZCB0aGVpciBjb3Vz
aW5zLgorICAgIHVuc2lnbmVkIGNvdW50ID0gMDsKKyAgICB1bnNpZ25lZCB2aXNpdGVkTm9kZUNv
dW50ID0gMDsKKyAgICBTdHlsZWRFbGVtZW50KiBzaGFyZUVsZW1lbnQgPSAwOworICAgIE5vZGUq
IGNvdXNpbkxpc3QgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXZpb3VzU2libGluZygpOwor
ICAgIHdoaWxlIChjb3VzaW5MaXN0KSB7CisgICAgICAgIHNoYXJlRWxlbWVudCA9IGZpbmRTaWJs
aW5nRm9yU3R5bGVTaGFyaW5nKGNvdXNpbkxpc3QsIGNvdW50KTsKKyAgICAgICAgaWYgKHNoYXJl
RWxlbWVudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjb3VzaW5MaXN0ID0gbG9jYXRl
Q291c2luTGlzdChjb3VzaW5MaXN0LT5wYXJlbnRFbGVtZW50KCksIHZpc2l0ZWROb2RlQ291bnQp
OworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgZXhoYXVzdGVkIGFsbCBvdXIgYnVkZ2V0IG9y
IG91ciBjb3VzaW5zLgorICAgIGlmICghc2hhcmVFbGVtZW50KQorICAgICAgICByZXR1cm4gMDsK
KworICAgIC8vIENhbid0IHNoYXJlIGlmIHNpYmxpbmcgcnVsZXMgYXBwbHkuIFRoaXMgaXMgY2hl
Y2tlZCBhdCB0aGUgZW5kIGFzIGl0IHNob3VsZCByYXJlbHkgZmFpbC4KKyAgICBpZiAoc3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy5zaWJsaW5nKCkpKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICAvLyBDYW4ndCBzaGFyZSBpZiBhdHRyaWJ1dGUgcnVsZXMgYXBw
bHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNl
dHMudW5jb21tb25BdHRyaWJ1dGUoKSkpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIENhbid0
IHNoYXJlIGlmIEBob3N0IEAtcnVsZXMgYXBwbHkuCisgICAgaWYgKHN0eWxlU2hhcmluZ0NhbmRp
ZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gVHJhY2tp
bmcgY2hpbGQgaW5kZXggcmVxdWlyZXMgdW5pcXVlIHN0eWxlIGZvciBlYWNoIG5vZGUuIFRoaXMg
bWF5IGdldCBzZXQgYnkgdGhlIHNpYmxpbmcgcnVsZSBtYXRjaCBhYm92ZS4KKyAgICBpZiAocGFy
ZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQo
KSkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzaGFyZUVsZW1lbnQtPnJlbmRlclN0
eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0
JiByZXN1bHQpCit7CisgICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7CisKKyAgICAvLyBG
aXJzdCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChD
U1NEZWZhdWx0U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQorICAgICAgICBy
ZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICBSdWxlU2V0KiB1c2VyQWdlbnRTdHlsZVNo
ZWV0ID0gbV9tZWRpdW0tPm1lZGlhVHlwZU1hdGNoU3BlY2lmaWMoInByaW50IikKKyAgICAgICAg
PyBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlIDogQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzOjpkZWZhdWx0U3R5bGU7CisgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgdXNlckFn
ZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwgd2UgbWF0Y2ggcnVsZXMg
ZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYgKGRvY3VtZW50KCktPmlu
UXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5
bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSk7CisKKyAgICAvLyBJZiBkb2N1bWVudCB1c2Vz
IHZpZXcgc291cmNlIHN0eWxlcyAoaW4gdmlldyBzb3VyY2UgbW9kZSBvciBpbiB4bWwgdmlld2Vy
IG1vZGUpLCB0aGVuIHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHZpZXcgc291cmNlIHN0eWxlIHNo
ZWV0LgorICAgIGlmIChkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSkKKyAgICAgICAgbWF0Y2hV
QVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjp2aWV3U291cmNlU3R5bGUoKSk7
Cit9CisKK3N0YXRpYyB2b2lkIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFBhZ2luYXRpb246
Ok1vZGUgcGFnaW5hdGlvbk1vZGUsIFJlbmRlclN0eWxlKiBzdHlsZSkKK3sKKyAgICBpZiAocGFn
aW5hdGlvbk1vZGUgPT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpCisgICAgICAgIHJldHVybjsK
KyAgICAgICAgCisgICAgc3dpdGNoIChwYWdpbmF0aW9uTW9kZSkgeworICAgIGNhc2UgUGFnaW5h
dGlvbjo6TGVmdFRvUmlnaHRQYWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlz
KEhvcml6b250YWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxX
cml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0
eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6
IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0
eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01v
ZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9u
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpSaWdodFRvTGVmdFBhZ2lu
YXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMp
OworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNz
aW9uKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNz
aW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJv
Z3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFBhZ2luYXRpb246OlRvcFRvQm90dG9tUGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+
c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENvbHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlz
SG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJv
Z3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBSZXZlcnNlQ29s
dW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1u
UHJvZ3Jlc3Npb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OkJvdHRv
bVRvVG9wUGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhWZXJ0aWNhbENv
bHVtbkF4aXMpOworICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkp
CisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBl
ZEJsb2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VD
b2x1bW5Qcm9ncmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRD
b2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2ZXJz
ZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFBhZ2luYXRpb246OlVucGFnaW5hdGVkOgorICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBn
ZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIEZvbnRP
cmllbnRhdGlvbiYgZm9udE9yaWVudGF0aW9uLCBOb25DSktHbHlwaE9yaWVudGF0aW9uJiBnbHlw
aE9yaWVudGF0aW9uKQoreworICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUo
KSkgeworICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOworICAgICAgICBnbHlw
aE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0eWxlLT50ZXh0T3JpZW50YXRpb24o
KSkgeworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uVmVydGljYWxSaWdodDoKKyAgICAgICAgZm9u
dE9yaWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25D
SktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNh
c2UgVGV4dE9yaWVudGF0aW9uVXByaWdodDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gVmVy
dGljYWw7CisgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9u
VXByaWdodDsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdh
eXM6CisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSA9PSBMZWZ0VG9SaWdodFdyaXRp
bmdNb2RlKSB7CisgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbWFwIHRvIHNpZGV3
YXlzLWxlZnQsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorICAgICAgICAgICAgZm9udE9y
aWVudGF0aW9uID0gVmVydGljYWw7CisgICAgICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9u
Q0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAg
Z2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0Owor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5c1JpZ2h0Ogor
ICAgICAgICBmb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOworICAgICAgICBnbHlwaE9yaWVu
dGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJl
dHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhPcmllbnRhdGlv
biA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICByZXR1cm47
CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHls
ZUZvckRvY3VtZW50KERvY3VtZW50KiBkb2N1bWVudCwgQ1NTRm9udFNlbGVjdG9yKiBmb250U2Vs
ZWN0b3IpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQtPmZyYW1lKCk7CisKKyAgICAv
LyBIVE1MNSBzdGF0ZXMgdGhhdCBzZWFtbGVzcyBpZnJhbWVzIHNob3VsZCByZXBsYWNlIGRlZmF1
bHQgQ1NTIHZhbHVlcworICAgIC8vIHdpdGggdmFsdWVzIGluaGVyaXRlZCBmcm9tIHRoZSBjb250
YWluaW5nIGlmcmFtZSBlbGVtZW50LiBIb3dldmVyLAorICAgIC8vIHNvbWUgdmFsdWVzIChzdWNo
IGFzIHRoZSBjYXNlIG9mIGRlc2lnbk1vZGUgPSAib24iKSBzdGlsbCBuZWVkIHRvCisgICAgLy8g
YmUgc2V0IGJ5IHRoaXMgImRvY3VtZW50IHN0eWxlIi4KKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IGRvY3VtZW50U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7CisgICAgYm9vbCBzZWFtbGVz
c1dpdGhQYXJlbnQgPSBkb2N1bWVudC0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHlXaXRoUGFyZW50
KCk7CisgICAgaWYgKHNlYW1sZXNzV2l0aFBhcmVudCkgeworICAgICAgICBSZW5kZXJTdHlsZSog
aWZyYW1lU3R5bGUgPSBkb2N1bWVudC0+c2VhbWxlc3NQYXJlbnRJRnJhbWUoKS0+cmVuZGVyU3R5
bGUoKTsKKyAgICAgICAgaWYgKGlmcmFtZVN0eWxlKQorICAgICAgICAgICAgZG9jdW1lbnRTdHls
ZS0+aW5oZXJpdEZyb20oaWZyYW1lU3R5bGUpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBJdCdz
IG5vdCBjbGVhciB3aGljaCB2YWx1ZXMgYmVsb3cgd2Ugd2FudCB0byBvdmVycmlkZSBpbiB0aGUg
c2VhbWxlc3MgY2FzZSEKKyAgICBkb2N1bWVudFN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKKyAg
ICBpZiAoIXNlYW1sZXNzV2l0aFBhcmVudCkgeworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRS
VExPcmRlcmluZyhkb2N1bWVudC0+dmlzdWFsbHlPcmRlcmVkKCkgPyBWaXN1YWxPcmRlciA6IExv
Z2ljYWxPcmRlcik7CisgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFpvb20oZnJhbWUgJiYgIWRv
Y3VtZW50LT5wcmludGluZygpID8gZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCkgOiAxKTsKKyAgICAg
ICAgZG9jdW1lbnRTdHlsZS0+c2V0UGFnZVNjYWxlVHJhbnNmb3JtKGZyYW1lID8gZnJhbWUtPmZy
YW1lU2NhbGVGYWN0b3IoKSA6IDEpOworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRMb2NhbGUo
ZG9jdW1lbnQtPmNvbnRlbnRMYW5ndWFnZSgpKTsKKyAgICB9CisgICAgLy8gVGhpcyBvdmVycmlk
ZXMgYW55IC13ZWJraXQtdXNlci1tb2RpZnkgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBpZnJh
bWUuCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0VXNlck1vZGlmeShkb2N1bWVudC0+aW5EZXNpZ25N
b2RlKCkgPyBSRUFEX1dSSVRFIDogUkVBRF9PTkxZKTsKKworICAgIEVsZW1lbnQqIGRvY0VsZW1l
bnQgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCk7CisgICAgUmVuZGVyT2JqZWN0KiBkb2NF
bGVtZW50UmVuZGVyZXIgPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVyZXIoKSA6IDA7
CisgICAgaWYgKGRvY0VsZW1lbnRSZW5kZXJlcikgeworICAgICAgICAvLyBVc2UgdGhlIGRpcmVj
dGlvbiBhbmQgd3JpdGluZy1tb2RlIG9mIHRoZSBib2R5IHRvIHNldCB0aGUKKyAgICAgICAgLy8g
dmlld3BvcnQncyBkaXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSB1bmxlc3MgdGhlIHByb3BlcnR5
IGlzIHNldCBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KKyAgICAgICAgLy8gSWYgdGhlcmUgaXMg
bm8gYm9keSwgdGhlbiB1c2UgdGhlIGRvY3VtZW50IGVsZW1lbnQuCisgICAgICAgIFJlbmRlck9i
amVjdCogYm9keVJlbmRlcmVyID0gZG9jdW1lbnQtPmJvZHkoKSA/IGRvY3VtZW50LT5ib2R5KCkt
PnJlbmRlcmVyKCkgOiAwOworICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFkb2N1bWVudC0+
d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgZG9jdW1lbnRT
dHlsZS0+c2V0V3JpdGluZ01vZGUoYm9keVJlbmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9kZSgp
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0V3JpdGluZ01v
ZGUoZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKKyAgICAgICAg
aWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPmRpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVt
ZW50KCkpCisgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oYm9keVJlbmRl
cmVyLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRv
Y3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihkb2NFbGVtZW50UmVuZGVyZXItPnN0eWxlKCktPmRp
cmVjdGlvbigpKTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKSkgeworICAgICAgICAgICAgY29uc3QgUGFn
aW5hdGlvbiYgcGFnaW5hdGlvbiA9IGZyYW1lVmlldy0+cGFnaW5hdGlvbigpOworICAgICAgICAg
ICAgaWYgKHBhZ2luYXRpb24ubW9kZSAhPSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZCkgeworICAg
ICAgICAgICAgICAgIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKHBhZ2luYXRpb24ubW9kZSwg
ZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0
Q29sdW1uR2FwKHBhZ2luYXRpb24uZ2FwKTsKKyAgICAgICAgICAgICAgICBpZiAoUmVuZGVyVmll
dyogdmlldyA9IGRvY3VtZW50LT5yZW5kZXJWaWV3KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKHZpZXctPmhhc0NvbHVtbnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZXctPnVw
ZGF0ZUNvbHVtbkluZm9Gcm9tU3R5bGUoZG9jdW1lbnRTdHlsZS5nZXQoKSk7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2VhbWxl
c3MgaWZyYW1lcyB3YW50IHRvIGluaGVyaXQgdGhlaXIgZm9udCBmcm9tIHRoZWlyIHBhcmVudCBp
ZnJhbWUsIHNvIGVhcmx5IHJldHVybiBiZWZvcmUgc2V0dGluZyB0aGUgZm9udC4KKyAgICBpZiAo
c2VhbWxlc3NXaXRoUGFyZW50KQorICAgICAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNl
KCk7CisKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9TY3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihkb2N1
bWVudFN0eWxlLT5sb2NhbGUoKSkpOworICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1
bWVudC0+c2V0dGluZ3MoKSkgeworICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRl
ckZvbnQoZG9jdW1lbnQtPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3Rp
dHV0aW9uRW5hYmxlZCgpKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01v
ZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOworICAgICAgICBjb25zdCBBdG9taWNT
dHJpbmcmIHN0YW5kYXJkRm9udCA9IHNldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoZm9udERl
c2NyaXB0aW9uLnNjcmlwdCgpKTsKKyAgICAgICAgaWYgKCFzdGFuZGFyZEZvbnQuaXNFbXB0eSgp
KSB7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVz
Y3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5m
aXJzdEZhbWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnQpOworICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5KDApOworICAgICAgICB9CisgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAtIENTU1Zh
bHVlWHhTbWFsbCArIDEpOworICAgICAgICBpbnQgc2l6ZSA9IFN0eWxlUmVzb2x2ZXI6OmZvbnRT
aXplRm9yS2V5d29yZChkb2N1bWVudCwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKTsKKyAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7CisgICAgICAgIGJvb2wgdXNl
U1ZHWm9vbVJ1bGVzID0gZG9jdW1lbnQtPmlzU1ZHRG9jdW1lbnQoKTsKKyAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShTdHlsZVJlc29sdmVyOjpnZXRDb21wdXRlZFNpemVG
cm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udERlc2Ny
aXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcykpOworICAgIH0g
ZWxzZQorICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQt
PnByaW50aW5nKCkpOworCisgICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAg
ICBOb25DSktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247CisgICAgZ2V0Rm9udEFu
ZEdseXBoT3JpZW50YXRpb24oZG9jdW1lbnRTdHlsZS5nZXQoKSwgZm9udE9yaWVudGF0aW9uLCBn
bHlwaE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0T3JpZW50YXRpb24oZm9u
dE9yaWVudGF0aW9uKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhPcmllbnRh
dGlvbihnbHlwaE9yaWVudGF0aW9uKTsKKworICAgIGRvY3VtZW50U3R5bGUtPnNldEZvbnREZXNj
cmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIGRvY3VtZW50U3R5bGUtPmZvbnQoKS51cGRh
dGUoZm9udFNlbGVjdG9yKTsKKworICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsK
K30KKworc3RhdGljIGlubGluZSBib29sIGlzQXRTaGFkb3dCb3VuZGFyeShjb25zdCBFbGVtZW50
KiBlbGVtZW50KQoreworICAgIGlmICghZWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUgPSBlbGVtZW50LT5wYXJlbnROb2RlKCk7Cisg
ICAgcmV0dXJuIHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS0+aXNTaGFkb3dSb290KCk7Cit9CisK
K1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRWxlbWVudChF
bGVtZW50KiBlbGVtZW50LCBSZW5kZXJTdHlsZSogZGVmYXVsdFBhcmVudCwKKyAgICBTdHlsZVNo
YXJpbmdCZWhhdmlvciBzaGFyaW5nQmVoYXZpb3IsIFJ1bGVNYXRjaGluZ0JlaGF2aW9yIG1hdGNo
aW5nQmVoYXZpb3IsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKK3sKKyAgICAvLyBP
bmNlIGFuIGVsZW1lbnQgaGFzIGEgcmVuZGVyZXIsIHdlIGRvbid0IHRyeSB0byBkZXN0cm95IGl0
LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlbmRlcmVyCisgICAgLy8gd2lsbCB2YW5pc2ggaWYgYSBz
dHlsZSByZWNhbGMgaGFwcGVucyBkdXJpbmcgbG9hZGluZy4KKyAgICBpZiAoc2hhcmluZ0JlaGF2
aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFlbGVtZW50LT5kb2N1bWVudCgpLT5oYXZlU3R5
bGVzaGVldHNMb2FkZWQoKSAmJiAhZWxlbWVudC0+cmVuZGVyZXIoKSkgeworICAgICAgICBpZiAo
IXNfc3R5bGVOb3RZZXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHNfc3R5bGVOb3RZZXRBdmFp
bGFibGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCkubGVha1JlZigpOworICAgICAgICAgICAgc19z
dHlsZU5vdFlldEF2YWlsYWJsZS0+c2V0RGlzcGxheShOT05FKTsKKyAgICAgICAgICAgIHNfc3R5
bGVOb3RZZXRBdmFpbGFibGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOworICAgICAg
ICB9CisgICAgICAgIGVsZW1lbnQtPmRvY3VtZW50KCktPnNldEhhc05vZGVzV2l0aFBsYWNlaG9s
ZGVyU3R5bGUoKTsKKyAgICAgICAgcmV0dXJuIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisgICAg
fQorCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpbml0RWxlbWVudChlbGVtZW50
KTsKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGVsZW1lbnQsIGRl
ZmF1bHRQYXJlbnQsIE5PUFNFVURPLCByZWdpb25Gb3JTdHlsaW5nKTsKKyAgICBpZiAoc2hhcmlu
Z0JlaGF2aW9yID09IEFsbG93U3R5bGVTaGFyaW5nICYmICFzdGF0ZS5kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQoKSkgeworICAgICAgICBSZW5kZXJTdHlsZSogc2hhcmVkU3R5bGUgPSBsb2Nh
dGVTaGFyZWRTdHlsZSgpOworICAgICAgICBpZiAoc2hhcmVkU3R5bGUpCisgICAgICAgICAgICBy
ZXR1cm4gc2hhcmVkU3R5bGU7CisgICAgfQorCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBjbG9u
ZUZvclBhcmVudDsKKworICAgIGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpKSB7CisgICAgICAgIHN0
YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7CisgICAgICAgIHN0YXRlLnN0eWxl
KCktPmluaGVyaXRGcm9tKHN0YXRlLnBhcmVudFN0eWxlKCksIGlzQXRTaGFkb3dCb3VuZGFyeShl
bGVtZW50KSA/IFJlbmRlclN0eWxlOjpBdFNoYWRvd0JvdW5kYXJ5IDogUmVuZGVyU3R5bGU6Ok5v
dEF0U2hhZG93Qm91bmRhcnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRlLnNldFN0eWxl
KGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKSk7CisgICAgICAgIGNsb25lRm9yUGFyZW50ID0gUmVu
ZGVyU3R5bGU6OmNsb25lKHN0YXRlLnN0eWxlKCkpOworICAgICAgICBzdGF0ZS5zZXRQYXJlbnRT
dHlsZShjbG9uZUZvclBhcmVudC5nZXQoKSk7CisgICAgfQorICAgIC8vIGNvbnRlbnRlZGl0YWJs
ZSBhdHRyaWJ1dGUgKGltcGxlbWVudGVkIGJ5IC13ZWJraXQtdXNlci1tb2RpZnkpIHNob3VsZAor
ICAgIC8vIGJlIHByb3BhZ2F0ZWQgZnJvbSBzaGFkb3cgaG9zdCB0byBkaXN0cmlidXRlZCBub2Rl
LgorICAgIGlmIChzdGF0ZS5kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSkgeworICAgICAg
ICBpZiAoRWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+cGFyZW50RWxlbWVudCgpKSB7CisgICAg
ICAgICAgICBpZiAoUmVuZGVyU3R5bGUqIHN0eWxlT2ZTaGFkb3dIb3N0ID0gcGFyZW50LT5yZW5k
ZXJTdHlsZSgpKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZXJNb2RpZnko
c3R5bGVPZlNoYWRvd0hvc3QtPnVzZXJNb2RpZnkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpIHsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SXNM
aW5rKHRydWUpOworICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdGUgPSBzdGF0ZS5lbGVtZW50
TGlua1N0YXRlKCk7CisgICAgICAgIGlmIChsaW5rU3RhdGUgIT0gTm90SW5zaWRlTGluaykgewor
ICAgICAgICAgICAgYm9vbCBmb3JjZVZpc2l0ZWQgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246
OmZvcmNlUHNldWRvU3RhdGUoZWxlbWVudCwgQ1NTU2VsZWN0b3I6OlBzZXVkb1Zpc2l0ZWQpOwor
ICAgICAgICAgICAgaWYgKGZvcmNlVmlzaXRlZCkKKyAgICAgICAgICAgICAgICBsaW5rU3RhdGUg
PSBJbnNpZGVWaXNpdGVkTGluazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRJbnNpZGVMaW5rKGxpbmtTdGF0ZSk7CisgICAgfQorCisgICAgYm9vbCBuZWVkc0NvbGxlY3Rp
b24gPSBmYWxzZTsKKyAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmVuc3VyZURlZmF1bHRTdHls
ZVNoZWV0c0ZvckVsZW1lbnQoZWxlbWVudCwgbmVlZHNDb2xsZWN0aW9uKTsKKyAgICBpZiAobmVl
ZHNDb2xsZWN0aW9uKQorICAgICAgICBtX3J1bGVTZXRzLmNvbGxlY3RGZWF0dXJlcyhkb2N1bWVu
dCgpLT5pc1ZpZXdTb3VyY2UoKSwgbV9zY29wZVJlc29sdmVyLmdldCgpKTsKKworICAgIE1hdGNo
UmVzdWx0IG1hdGNoUmVzdWx0OworICAgIGlmIChtYXRjaGluZ0JlaGF2aW9yID09IE1hdGNoT25s
eVVzZXJBZ2VudFJ1bGVzKQorICAgICAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1bHQpOworICAg
IGVsc2UKKyAgICAgICAgbWF0Y2hBbGxSdWxlcyhtYXRjaFJlc3VsdCwgbWF0Y2hpbmdCZWhhdmlv
ciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01JTCk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9w
ZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50KTsKKworICAgIC8vIENsZWFuIHVwIG91ciBzdHls
ZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1
cHMpLgorICAgIGFkanVzdFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0
eWxlKCksIGVsZW1lbnQpOworCisgICAgc3RhdGUuY2xlYXIoKTsgLy8gQ2xlYXIgb3V0IGZvciB0
aGUgbmV4dCByZXNvbHZlLgorCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZl
cigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCisgICAgcmV0dXJuIHN0YXRlLnRh
a2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpz
dHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxlKiBlbGVtZW50U3R5bGUsIGNvbnN0IFN0
eWxlS2V5ZnJhbWUqIGtleWZyYW1lLCBLZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQorewor
ICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsKKyAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkK
KyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBrZXlmcmFtZS0+cHJvcGVydGll
cygpKTsKKworICAgIEFTU0VSVCghbV9zdGF0ZS5zdHlsZSgpKTsKKworICAgIFN0YXRlJiBzdGF0
ZSA9IG1fc3RhdGU7CisKKyAgICAvLyBDcmVhdGUgdGhlIHN0eWxlCisgICAgc3RhdGUuc2V0U3R5
bGUoUmVuZGVyU3R5bGU6OmNsb25lKGVsZW1lbnRTdHlsZSkpOworICAgIHN0YXRlLnNldExpbmVI
ZWlnaHRWYWx1ZSgwKTsKKworICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gYm90aGVyIHdpdGggIWlt
cG9ydGFudC4gU2luY2UgdGhlcmUgaXMgb25seSBldmVyIG9uZQorICAgIC8vIGRlY2wsIHRoZXJl
J3Mgbm90aGluZyB0byBvdmVycmlkZS4gU28ganVzdCBhZGQgdGhlIGZpcnN0IHByb3BlcnRpZXMu
CisgICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgaWYgKGtleWZyYW1lLT5wcm9w
ZXJ0aWVzKCkpCisgICAgICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJv
cGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQs
IGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8v
IExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZv
bnQtc2l6ZQorICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQ
cm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKTsK
KworICAgIC8vIE5vdyBkbyByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzLgorICAgIGlmIChrZXlmcmFt
ZS0+cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9y
aXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVz
LnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRp
cnRpZWQgYnkgb25lIG9mIHRoZSBub24tZXNzZW50aWFsIGZvbnQgcHJvcHMsCisgICAgLy8gZ28g
YWhlYWQgYW5kIHVwZGF0ZSBpdCBhIHNlY29uZCB0aW1lLgorICAgIHVwZGF0ZUZvbnQoKTsKKwor
ICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4K
KyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAgIAorICAgIC8vIEFkZCBhbGwgdGhlIGFu
aW1hdGluZyBwcm9wZXJ0aWVzIHRvIHRoZSBrZXlmcmFtZS4KKyAgICBpZiAoY29uc3QgU3R5bGVQ
cm9wZXJ0eVNldCogc3R5bGVEZWNsYXJhdGlvbiA9IGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpIHsK
KyAgICAgICAgdW5zaWduZWQgcHJvcGVydHlDb3VudCA9IHN0eWxlRGVjbGFyYXRpb24tPnByb3Bl
cnR5Q291bnQoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3BlcnR5Q291
bnQ7ICsraSkgeworICAgICAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IHN0eWxlRGVj
bGFyYXRpb24tPnByb3BlcnR5QXQoaSkuaWQoKTsKKyAgICAgICAgICAgIC8vIFRpbWluZy1mdW5j
dGlvbiB3aXRoaW4ga2V5ZnJhbWVzIGlzIHNwZWNpYWwsIGJlY2F1c2UgaXQgaXMgbm90IGFuaW1h
dGVkOyBpdCBqdXN0CisgICAgICAgICAgICAvLyBkZXNjcmliZXMgdGhlIHRpbWluZyBmdW5jdGlv
biBiZXR3ZWVuIHRoaXMga2V5ZnJhbWUgYW5kIHRoZSBuZXh0LgorICAgICAgICAgICAgaWYgKHBy
b3BlcnR5ICE9IENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uVGltaW5nRnVuY3Rpb24pCisgICAg
ICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5hZGRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7CisK
KyAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
a2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24oRWxlbWVudCogZSwgY29uc3QgUmVuZGVyU3R5bGUq
IGVsZW1lbnRTdHlsZSwgS2V5ZnJhbWVMaXN0JiBsaXN0KQoreworICAgIGxpc3QuY2xlYXIoKTsK
KworICAgIC8vIEdldCB0aGUga2V5ZnJhbWVzUnVsZSBmb3IgdGhpcyBuYW1lCisgICAgaWYgKCFl
IHx8IGxpc3QuYW5pbWF0aW9uTmFtZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9rZXlmcmFtZXNSdWxlTWFwLmNoZWNrQ29uc2lzdGVuY3koKTsKKworICAgIEtleWZyYW1l
c1J1bGVNYXA6Oml0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXNSdWxlTWFwLmZpbmQobGlzdC5hbmlt
YXRpb25OYW1lKCkuaW1wbCgpKTsKKyAgICBpZiAoaXQgPT0gbV9rZXlmcmFtZXNSdWxlTWFwLmVu
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBTdHlsZVJ1bGVLZXlmcmFtZXMqIGtl
eWZyYW1lc1J1bGUgPSBpdC0+dmFsdWUuZ2V0KCk7CisKKyAgICAvLyBDb25zdHJ1Y3QgYW5kIHBv
cHVsYXRlIHRoZSBzdHlsZSBmb3IgZWFjaCBrZXlmcmFtZQorICAgIGNvbnN0IFZlY3RvcjxSZWZQ
dHI8U3R5bGVLZXlmcmFtZT4gPiYga2V5ZnJhbWVzID0ga2V5ZnJhbWVzUnVsZS0+a2V5ZnJhbWVz
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGtleWZyYW1lcy5zaXplKCk7ICsraSkg
eworICAgICAgICAvLyBBcHBseSB0aGUgZGVjbGFyYXRpb24gdG8gdGhlIHN0eWxlLiBUaGlzIGlz
IGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBsb2dpYyBpbiBzdHlsZUZvckVsZW1lbnQKKyAg
ICAgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2
ZShkb2N1bWVudCgpLCBlKTsKKworICAgICAgICBjb25zdCBTdHlsZUtleWZyYW1lKiBrZXlmcmFt
ZSA9IGtleWZyYW1lc1tpXS5nZXQoKTsKKworICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1l
VmFsdWUoMCwgMCk7CisgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlm
cmFtZShlbGVtZW50U3R5bGUsIGtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisKKyAgICAgICAg
Ly8gQWRkIHRoaXMga2V5ZnJhbWUgc3R5bGUgdG8gYWxsIHRoZSBpbmRpY2F0ZWQga2V5IHRpbWVz
CisgICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5czsKKyAgICAgICAga2V5ZnJhbWUtPmdldEtleXMo
a2V5cyk7CisgICAgICAgIGZvciAoc2l6ZV90IGtleUluZGV4ID0gMDsga2V5SW5kZXggPCBrZXlz
LnNpemUoKTsgKytrZXlJbmRleCkgeworICAgICAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRLZXko
a2V5c1trZXlJbmRleF0pOworICAgICAgICAgICAgbGlzdC5pbnNlcnQoa2V5ZnJhbWVWYWx1ZSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgMCUga2V5ZnJhbWUgaXMgbWlzc2lu
ZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIga2V5
ZnJhbWUpCisgICAgaW50IGluaXRpYWxMaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgIGlmIChp
bml0aWFsTGlzdFNpemUgPiAwICYmIGxpc3RbMF0ua2V5KCkpIHsKKyAgICAgICAgc3RhdGljIFN0
eWxlS2V5ZnJhbWUqIHplcm9QZXJjZW50S2V5ZnJhbWU7CisgICAgICAgIGlmICghemVyb1BlcmNl
bnRLZXlmcmFtZSkgeworICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5
ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJh
bWUtPnNldEtleVRleHQoIjAlIik7CisgICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBr
ZXlmcmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxl
Rm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCB6ZXJvUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZh
bHVlKSk7CisgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAgIH0KKworICAg
IC8vIElmIHRoZSAxMDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkg
aWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1lKQorICAgIGlmIChpbml0aWFs
TGlzdFNpemUgPiAwICYmIChsaXN0W2xpc3Quc2l6ZSgpIC0gMV0ua2V5KCkgIT0gMSkpIHsKKyAg
ICAgICAgc3RhdGljIFN0eWxlS2V5ZnJhbWUqIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWU7CisgICAg
ICAgIGlmICghaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSkgeworICAgICAgICAgICAgaHVuZHJlZFBl
cmNlbnRLZXlmcmFtZSA9IFN0eWxlS2V5ZnJhbWU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAg
ICAgICAgIGh1bmRyZWRQZXJjZW50S2V5ZnJhbWUtPnNldEtleVRleHQoIjEwMCUiKTsKKyAgICAg
ICAgfQorICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMSwgMCk7CisgICAgICAg
IGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5bGUsIGh1
bmRyZWRQZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKKyAgICAgICAgbGlzdC5pbnNl
cnQoa2V5ZnJhbWVWYWx1ZSk7CisgICAgfQorfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBT
dHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZUZvckVsZW1lbnQoRWxlbWVudCogZSwgY29uc3QgUHNl
dWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSkKK3sKKyAgICBBU1NFUlQocGFyZW50U3R5bGUpOworICAgIGlmICghZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaW5pdEVsZW1l
bnQoZSk7CisKKyAgICBzdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIHBh
cmVudFN0eWxlLCBwc2V1ZG9TdHlsZVJlcXVlc3QpOworICAgIHN0YXRlLnNldFN0eWxlKFJlbmRl
clN0eWxlOjpjcmVhdGUoKSk7CisgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0
ZS5wYXJlbnRTdHlsZSgpKTsKKworICAgIC8vIFNpbmNlIHdlIGRvbid0IHVzZSBwc2V1ZG8tZWxl
bWVudHMgaW4gYW55IG9mIG91ciBxdWlyay9wcmludCB1c2VyIGFnZW50IHJ1bGVzLCBkb24ndCB3
YXN0ZSB0aW1lIHdhbGtpbmcKKyAgICAvLyB0aG9zZSBydWxlcy4KKworICAgIC8vIENoZWNrIFVB
LCB1c2VyIGFuZCBhdXRob3IgcnVsZXMuCisgICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7Cisg
ICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKKworICAgIGlmIChtX21hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcykgeworICAgICAgICBtYXRjaFVzZXJSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2Up
OworICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7CisgICAgfQor
CisgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBzdGF0ZS5zdHlsZSgpLT5zZXRTdHlsZVR5cGUocHNldWRvU3R5
bGVSZXF1ZXN0LnBzZXVkb0lkKTsKKworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hS
ZXN1bHQsIGUpOworCisgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkg
YW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCisgICAgYWRqdXN0UmVu
ZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpLCAwKTsKKworICAg
IC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAg
ICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5
bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCisgICAgcmV0dXJu
IHN0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJl
c29sdmVyOjpzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRleCkKK3sKKyAgICBtX3N0YXRlLmluaXRG
b3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkp
OyAvLyBtX3Jvb3RFbGVtZW50U3R5bGUgd2lsbCBiZSBzZXQgdG8gdGhlIGRvY3VtZW50IHN0eWxl
LgorCisgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIG1f
c3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwor
CisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7CisgICAgY29u
c3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBTdHJp
bmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CisgICAgCisgICAgTWF0Y2hSZXN1bHQgcmVz
dWx0OworICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpk
ZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VS
dWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFn
ZSk7CisgICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFsIGF1dGhvciBSdWxlU2V0IGZvciBA
cGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgorICAgIG1hdGNoUGFnZVJ1bGVzKHJl
c3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwor
ICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgIGJvb2wgaW5oZXJpdGVkT25s
eSA9IGZhbHNlOworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworI2VuZGlmCisgICAg
YXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZh
bHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25s
eSk7CisKKyAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0
ZSBpdCBub3cuCisgICAgdXBkYXRlRm9udCgpOworCisgICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0
IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplLgorICAgIGlmICht
X3N0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQorICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3Bl
cnR5TGluZUhlaWdodCwgbV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7CisKKyAgICBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwgMCwg
cmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOworCisg
ICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgor
ICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisKKyAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NT
dHlsZVJlc29sdmVyKCk7CisKKyAgICAvLyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KKyAgICByZXR1
cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5
bGVSZXNvbHZlcjo6ZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpCit7CisgICAgbV9zdGF0ZS5zZXRT
dHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIC8vIE1ha2Ugc3VyZSBvdXIgZm9udHMg
YXJlIGluaXRpYWxpemVkIGlmIHdlIGRvbid0IGluaGVyaXQgdGhlbSBmcm9tIG91ciBwYXJlbnQg
c3R5bGUuCisgICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKSkg
eworICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsKKyAgICAgICAgbV9zdGF0
ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3RvcigpKTsKKyAgICB9IGVsc2UKKyAg
ICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5mb250KCkudXBkYXRlKDApOworCisgICAgcmV0dXJuIG1f
c3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yVGV4dChUZXh0KiB0ZXh0Tm9kZSkKK3sKKyAgICBBU1NFUlQodGV4dE5v
ZGUpOworCisgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dCh0ZXh0Tm9kZSk7CisgICAg
Tm9kZSogcGFyZW50Tm9kZSA9IGNvbnRleHQucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxl
KCk7CisgICAgcmV0dXJuIGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRhbmNlKCkgfHwgIXBhcmVu
dE5vZGUgPworICAgICAgICBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkgOiBwYXJlbnROb2RlLT5y
ZW5kZXJTdHlsZSgpOworfQorCitzdGF0aWMgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRl
clN0eWxlKiBzdHlsZSkKK3sKKyAgICAvLyBJbnRyaW5zaWMgbWFyZ2luIHZhbHVlLgorICAgIGNv
bnN0IGludCBpbnRyaW5zaWNNYXJnaW4gPSAyICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKwor
ICAgIC8vIEZJWE1FOiBVc2luZyB3aWR0aC9oZWlnaHQgYWxvbmUgYW5kIG5vdCBhbHNvIGRlYWxp
bmcgd2l0aCBtaW4td2lkdGgvbWF4LXdpZHRoIGlzIGZsYXdlZC4KKyAgICAvLyBGSVhNRTogVXNp
bmcgInF1aXJrIiB0byBkZWNpZGUgdGhlIG1hcmdpbiB3YXNuJ3Qgc2V0IGlzIGtpbmQgb2YgbGFt
ZS4KKyAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkgeworICAgICAg
ICBpZiAoc3R5bGUtPm1hcmdpbkxlZnQoKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dE1hcmdpbkxlZnQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAgaWYg
KHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFy
Z2luUmlnaHQoTGVuZ3RoKGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICB9CisKKyAgICBp
ZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2lu
VG9wKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKGlu
dHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Cb3R0b20o
KS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpbkJvdHRvbShMZW5ndGgoaW50
cmluc2ljTWFyZ2luLCBGaXhlZCkpOworICAgIH0KK30KKworc3RhdGljIEVEaXNwbGF5IGVxdWl2
YWxlbnRCbG9ja0Rpc3BsYXkoRURpc3BsYXkgZGlzcGxheSwgYm9vbCBpc0Zsb2F0aW5nLCBib29s
IHN0cmljdFBhcnNpbmcpCit7CisgICAgc3dpdGNoIChkaXNwbGF5KSB7CisgICAgY2FzZSBCTE9D
SzoKKyAgICBjYXNlIFRBQkxFOgorICAgIGNhc2UgQk9YOgorICAgIGNhc2UgRkxFWDoKKyAgICBj
YXNlIEdSSUQ6CisgICAgICAgIHJldHVybiBkaXNwbGF5OworCisgICAgY2FzZSBMSVNUX0lURU06
CisgICAgICAgIC8vIEl0IGlzIGEgV2luSUUgYnVnIHRoYXQgZmxvYXRlZCBsaXN0IGl0ZW1zIGxv
c2UgdGhlaXIgYnVsbGV0cywgc28gd2UnbGwgZW11bGF0ZSB0aGUgcXVpcmssIGJ1dCBvbmx5IGlu
IHF1aXJrcyBtb2RlLgorICAgICAgICBpZiAoIXN0cmljdFBhcnNpbmcgJiYgaXNGbG9hdGluZykK
KyAgICAgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAg
Y2FzZSBJTkxJTkVfVEFCTEU6CisgICAgICAgIHJldHVybiBUQUJMRTsKKyAgICBjYXNlIElOTElO
RV9CT1g6CisgICAgICAgIHJldHVybiBCT1g7CisgICAgY2FzZSBJTkxJTkVfRkxFWDoKKyAgICAg
ICAgcmV0dXJuIEZMRVg7CisgICAgY2FzZSBJTkxJTkVfR1JJRDoKKyAgICAgICAgcmV0dXJuIEdS
SUQ7CisKKyAgICBjYXNlIElOTElORToKKyAgICBjYXNlIFJVTl9JTjoKKyAgICBjYXNlIENPTVBB
Q1Q6CisgICAgY2FzZSBJTkxJTkVfQkxPQ0s6CisgICAgY2FzZSBUQUJMRV9ST1dfR1JPVVA6Cisg
ICAgY2FzZSBUQUJMRV9IRUFERVJfR1JPVVA6CisgICAgY2FzZSBUQUJMRV9GT09URVJfR1JPVVA6
CisgICAgY2FzZSBUQUJMRV9ST1c6CisgICAgY2FzZSBUQUJMRV9DT0xVTU5fR1JPVVA6CisgICAg
Y2FzZSBUQUJMRV9DT0xVTU46CisgICAgY2FzZSBUQUJMRV9DRUxMOgorICAgIGNhc2UgVEFCTEVf
Q0FQVElPTjoKKyAgICAgICAgcmV0dXJuIEJMT0NLOworICAgIGNhc2UgTk9ORToKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBOT05FOworICAgIH0KKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gQkxPQ0s7Cit9CisKKy8vIENTUyByZXF1
aXJlcyB0ZXh0LWRlY29yYXRpb24gdG8gYmUgcmVzZXQgYXQgZWFjaCBET00gZWxlbWVudCBmb3Ig
dGFibGVzLCAKKy8vIGlubGluZSBibG9ja3MsIGlubGluZSB0YWJsZXMsIHJ1bi1pbnMsIHNoYWRv
dyBET00gY3Jvc3NpbmdzLCBmbG9hdGluZyBlbGVtZW50cywKKy8vIGFuZCBhYnNvbHV0ZSBvciBy
ZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZWxlbWVudHMuCitzdGF0aWMgYm9vbCBkb2VzTm90SW5oZXJp
dFRleHREZWNvcmF0aW9uKFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkKK3sKKyAgICBy
ZXR1cm4gc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElO
TElORV9UQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFJVTl9JTgorICAgICAgICB8fCBzdHls
ZS0+ZGlzcGxheSgpID09IElOTElORV9CTE9DSyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElO
RV9CT1ggfHwgaXNBdFNoYWRvd0JvdW5kYXJ5KGUpCisgICAgICAgIHx8IHN0eWxlLT5pc0Zsb2F0
aW5nKCkgfHwgc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0aW9uKCk7Cit9CisKK3N0YXRpYyBib29s
IGlzRGlzcGxheUZsZXhpYmxlQm94KEVEaXNwbGF5IGRpc3BsYXkpCit7CisgICAgcmV0dXJuIGRp
c3BsYXkgPT0gRkxFWCB8fCBkaXNwbGF5ID09IElOTElORV9GTEVYOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6OmFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5
bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50ICplKQoreworICAgIEFTU0VSVChwYXJlbnRTdHlsZSk7
CisKKyAgICAvLyBDYWNoZSBvdXIgb3JpZ2luYWwgZGlzcGxheS4KKyAgICBzdHlsZS0+c2V0T3Jp
Z2luYWxEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCkpOworCisgICAgaWYgKHN0eWxlLT5kaXNwbGF5
KCkgIT0gTk9ORSkgeworICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgPHRkPiB0aGF0IHNwZWNpZmll
cyBhIGZsb2F0IHByb3BlcnR5LCBpbiBxdWlya3MgbW9kZSB3ZSBqdXN0IGRyb3AgdGhlIGZsb2F0
CisgICAgICAgIC8vIHByb3BlcnR5LgorICAgICAgICAvLyBTaXRlcyBhbHNvIGNvbW1vbmx5IHVz
ZSBkaXNwbGF5OmlubGluZS9ibG9jayBvbiA8dGQ+cyBhbmQgPHRhYmxlPnMuIEluIHF1aXJrcyBt
b2RlIHdlIGZvcmNlCisgICAgICAgIC8vIHRoZXNlIHRhZ3MgdG8gcmV0YWluIHRoZWlyIGRpc3Bs
YXkgdHlwZXMuCisgICAgICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSAmJiBlKSB7
CisgICAgICAgICAgICBpZiAoZS0+aGFzVGFnTmFtZSh0ZFRhZykpIHsKKyAgICAgICAgICAgICAg
ICBzdHlsZS0+c2V0RGlzcGxheShUQUJMRV9DRUxMKTsKKyAgICAgICAgICAgICAgICBzdHlsZS0+
c2V0RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUtPmhhc1RhZ05h
bWUodGFibGVUYWcpKQorICAgICAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KHN0eWxlLT5p
c0Rpc3BsYXlJbmxpbmVUeXBlKCkgPyBJTkxJTkVfVEFCTEUgOiBUQUJMRSk7CisgICAgICAgIH0K
KworICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZSh0ZFRhZykgfHwgZS0+aGFzVGFnTmFt
ZSh0aFRhZykpKSB7CisgICAgICAgICAgICBpZiAoc3R5bGUtPndoaXRlU3BhY2UoKSA9PSBLSFRN
TF9OT1dSQVApIHsKKyAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIGFyZSByZWFs
bHkgbm93cmFwcGluZyBvciBpZiB3ZSBzaG91bGQganVzdAorICAgICAgICAgICAgICAgIC8vIHVz
ZSBub3JtYWwgaW5zdGVhZC4gSWYgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGlzIGZpeGVkLCB0aGVu
CisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIE5PV1JBUC4KKyAgICAg
ICAgICAgICAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNGaXhlZCgpKQorICAgICAgICAgICAgICAg
ICAgICBzdHlsZS0+c2V0V2hpdGVTcGFjZShOT1JNQUwpOworICAgICAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9XUkFQKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRhYmxlcyBuZXZlciBzdXBwb3J0IHRo
ZSAtd2Via2l0LSogdmFsdWVzIGZvciB0ZXh0LWFsaWduIGFuZCB3aWxsIHJlc2V0IGJhY2sgdG8g
dGhlIGRlZmF1bHQuCisgICAgICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUodGFibGVUYWcpICYm
IChzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0xFRlQgfHwgc3R5bGUtPnRleHRBbGlnbigp
ID09IFdFQktJVF9DRU5URVIgfHwgc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkp
CisgICAgICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKFRBU1RBUlQpOworCisgICAgICAgIC8v
IEZyYW1lcyBhbmQgZnJhbWVzZXRzIG5ldmVyIGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBv
c2l0aW9uOmFic29sdXRlLiBUaGlzIGlzIG5lY2Vzc2FyeSB0bworICAgICAgICAvLyBmaXggYSBj
cmFzaCB3aGVyZSBhIHNpdGUgdHJpZXMgdG8gcG9zaXRpb24gdGhlc2Ugb2JqZWN0cy4gVGhleSBh
bHNvIG5ldmVyIGhvbm9yIGRpc3BsYXkuCisgICAgICAgIGlmIChlICYmIChlLT5oYXNUYWdOYW1l
KGZyYW1lVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGZyYW1lc2V0VGFnKSkpIHsKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7CisgICAgICAgICAgICBzdHlsZS0+
c2V0RGlzcGxheShCTE9DSyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSdWJ5IHRleHQgZG9l
cyBub3Qgc3VwcG9ydCBmbG9hdCBvciBwb3NpdGlvbi4gVGhpcyBtaWdodCBjaGFuZ2Ugd2l0aCBl
dm9sdXRpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uCisgICAgICAgIGlmIChlICYmIGUtPmhhc1Rh
Z05hbWUocnRUYWcpKSB7CisgICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9z
aXRpb24pOworICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBiZSBvdmVycmlkaW5nIHN0YXJ0
Ly13ZWJraXQtYXV0byBsaWtlIHRoaXMuIERvIGl0IGluIGh0bWwuY3NzIGluc3RlYWQuCisgICAg
ICAgIC8vIFRhYmxlIGhlYWRlcnMgd2l0aCBhIHRleHQtYWxpZ24gb2YgLXdlYmtpdC1hdXRvIHdp
bGwgY2hhbmdlIHRoZSB0ZXh0LWFsaWduIHRvIGNlbnRlci4KKyAgICAgICAgaWYgKGUgJiYgZS0+
aGFzVGFnTmFtZSh0aFRhZykgJiYgc3R5bGUtPnRleHRBbGlnbigpID09IFRBU1RBUlQpCisgICAg
ICAgICAgICBzdHlsZS0+c2V0VGV4dEFsaWduKENFTlRFUik7CisKKyAgICAgICAgaWYgKGUgJiYg
ZS0+aGFzVGFnTmFtZShsZWdlbmRUYWcpKQorICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXko
QkxPQ0spOworCisgICAgICAgIC8vIEFic29sdXRlL2ZpeGVkIHBvc2l0aW9uZWQgZWxlbWVudHMs
IGZsb2F0aW5nIGVsZW1lbnRzIGFuZCB0aGUgZG9jdW1lbnQgZWxlbWVudCBuZWVkIGJsb2NrLWxp
a2Ugb3V0c2lkZSBkaXNwbGF5LgorICAgICAgICBpZiAoc3R5bGUtPmhhc091dE9mRmxvd1Bvc2l0
aW9uKCkgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCAoZSAmJiBlLT5kb2N1bWVudCgpLT5kb2N1
bWVudEVsZW1lbnQoKSA9PSBlKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2
YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUtPmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwg
IWRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKSk7CisKKyAgICAgICAgLy8gRklYTUU6IERvbid0
IHN1cHBvcnQgdGhpcyBtdXRhdGlvbiBmb3IgcHNldWRvIHN0eWxlcyBsaWtlIGZpcnN0LWxldHRl
ciBvciBmaXJzdC1saW5lLCBzaW5jZSBpdCdzIG5vdCBjb21wbGV0ZWx5CisgICAgICAgIC8vIGNs
ZWFyIGhvdyB0aGF0IHNob3VsZCB3b3JrLgorICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9
PSBJTkxJTkUgJiYgc3R5bGUtPnN0eWxlVHlwZSgpID09IE5PUFNFVURPICYmIHN0eWxlLT53cml0
aW5nTW9kZSgpICE9IHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5
bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKworICAgICAgICAvLyBBZnRlciBwZXJmb3Jt
aW5nIHRoZSBkaXNwbGF5IG11dGF0aW9uLCBjaGVjayB0YWJsZSByb3dzLiBXZSBkbyBub3QgaG9u
b3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246c3RpY2t5IG9uCisgICAgICAgIC8vIHRh
YmxlIHJvd3Mgb3IgY2VsbHMuIFRoaXMgaGFzIGJlZW4gZXN0YWJsaXNoZWQgZm9yIHBvc2l0aW9u
OnJlbGF0aXZlIGluIENTUzIuMSAoYW5kIGNhdXNlZCBhIGNyYXNoIGluIGNvbnRhaW5pbmdCbG9j
aygpCisgICAgICAgIC8vIG9uIHNvbWUgc2l0ZXMpLgorICAgICAgICBpZiAoKHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVf
Uk9XX0dST1VQCisgICAgICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0ZPT1RF
Ul9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPVykKKyAgICAgICAgICAgICYm
IHN0eWxlLT5oYXNJbkZsb3dQb3NpdGlvbigpKQorICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0
aW9uKFN0YXRpY1Bvc2l0aW9uKTsKKworICAgICAgICAvLyB3cml0aW5nLW1vZGUgZG9lcyBub3Qg
YXBwbHkgdG8gdGFibGUgcm93IGdyb3VwcywgdGFibGUgY29sdW1uIGdyb3VwcywgdGFibGUgcm93
cywgYW5kIHRhYmxlIGNvbHVtbnMuCisgICAgICAgIC8vIEZJWE1FOiBUYWJsZSBjZWxscyBzaG91
bGQgYmUgYWxsb3dlZCB0byBiZSBwZXJwZW5kaWN1bGFyIG9yIGZsaXBwZWQgd2l0aCByZXNwZWN0
IHRvIHRoZSB0YWJsZSwgdGhvdWdoLgorICAgICAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9DT0xVTU4gfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DT0xVTU5fR1JPVVAgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JPVVAKKyAgICAgICAgICAgIHx8IHN0
eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfSEVBREVSX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfUk9XIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQCisgICAg
ICAgICAgICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NFTEwpCisgICAgICAgICAgICBz
dHlsZS0+c2V0V3JpdGluZ01vZGUocGFyZW50U3R5bGUtPndyaXRpbmdNb2RlKCkpOworCisgICAg
ICAgIC8vIEZJWE1FOiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGJsb2NrLWZsb3cgb24gZmxleGli
bGUgYm94ZXMgeWV0LCBkaXNhbGxvdyBzZXR0aW5nCisgICAgICAgIC8vIG9mIGJsb2NrLWZsb3cg
dG8gYW55dGhpbmcgb3RoZXIgdGhhbiBUb3BUb0JvdHRvbVdyaXRpbmdNb2RlLgorICAgICAgICAv
LyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY0MTggLSBGbGV4aWJs
ZSBib3ggc3VwcG9ydC4KKyAgICAgICAgaWYgKHN0eWxlLT53cml0aW5nTW9kZSgpICE9IFRvcFRv
Qm90dG9tV3JpdGluZ01vZGUgJiYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gQk9YIHx8IHN0eWxlLT5k
aXNwbGF5KCkgPT0gSU5MSU5FX0JPWCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0V3JpdGluZ01v
ZGUoVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSk7CisKKyAgICAgICAgaWYgKGlzRGlzcGxheUZsZXhp
YmxlQm94KHBhcmVudFN0eWxlLT5kaXNwbGF5KCkpKSB7CisgICAgICAgICAgICBzdHlsZS0+c2V0
RmxvYXRpbmcoTm9GbG9hdCk7CisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFs
ZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFk
b2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworICAgICAgICB9CisKKyNpZiBFTkFCTEUoRElB
TE9HX0VMRU1FTlQpCisgICAgICAgIC8vIFBlciB0aGUgc3BlYywgcG9zaXRpb24gJ3N0YXRpYycg
YW5kICdyZWxhdGl2ZScgaW4gdGhlIHRvcCBsYXllciBjb21wdXRlIHRvICdhYnNvbHV0ZScuCisg
ICAgICAgIGlmIChlICYmIGUtPmlzSW5Ub3BMYXllcigpICYmIChzdHlsZS0+cG9zaXRpb24oKSA9
PSBTdGF0aWNQb3NpdGlvbiB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBSZWxhdGl2ZVBvc2l0aW9u
KSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKEFic29sdXRlUG9zaXRpb24pOwor
ICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAgICAgICB9CisjZW5kaWYK
KyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgb3VyIHotaW5kZXggdmFsdWUgaXMgb25seSBhcHBs
aWVkIGlmIHRoZSBvYmplY3QgaXMgcG9zaXRpb25lZC4KKyAgICBpZiAoc3R5bGUtPnBvc2l0aW9u
KCkgPT0gU3RhdGljUG9zaXRpb24gJiYgIWlzRGlzcGxheUZsZXhpYmxlQm94KHBhcmVudFN0eWxl
LT5kaXNwbGF5KCkpKQorICAgICAgICBzdHlsZS0+c2V0SGFzQXV0b1pJbmRleCgpOworCisgICAg
Ly8gQXV0byB6LWluZGV4IGJlY29tZXMgMCBmb3IgdGhlIHJvb3QgZWxlbWVudCBhbmQgdHJhbnNw
YXJlbnQgb2JqZWN0cy4gVGhpcyBwcmV2ZW50cworICAgIC8vIGNhc2VzIHdoZXJlIG9iamVjdHMg
dGhhdCBzaG91bGQgYmUgYmxlbmRlZCBhcyBhIHNpbmdsZSB1bml0IGVuZCB1cCB3aXRoIGEgbm9u
LXRyYW5zcGFyZW50CisgICAgLy8gb2JqZWN0IHdlZGdlZCBpbiBiZXR3ZWVuIHRoZW0uIEF1dG8g
ei1pbmRleCBhbHNvIGJlY29tZXMgMCBmb3Igb2JqZWN0cyB0aGF0IHNwZWNpZnkgdHJhbnNmb3Jt
cy9tYXNrcy9yZWZsZWN0aW9ucy4KKyAgICBpZiAoc3R5bGUtPmhhc0F1dG9aSW5kZXgoKSAmJiAo
KGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkKKyAgICAgICAgfHwg
c3R5bGUtPm9wYWNpdHkoKSA8IDEuMGYKKyAgICAgICAgfHwgc3R5bGUtPmhhc1RyYW5zZm9ybVJl
bGF0ZWRQcm9wZXJ0eSgpCisgICAgICAgIHx8IHN0eWxlLT5oYXNNYXNrKCkKKyAgICAgICAgfHwg
c3R5bGUtPmNsaXBQYXRoKCkKKyAgICAgICAgfHwgc3R5bGUtPmJveFJlZmxlY3QoKQorICAgICAg
ICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkKKyAgICAgICAgfHwgc3R5bGUtPmhhc0JsZW5kTW9kZSgp
CisgICAgICAgIHx8IHN0eWxlLT5wb3NpdGlvbigpID09IFN0aWNreVBvc2l0aW9uCisgICAgICAg
IHx8IChzdHlsZS0+cG9zaXRpb24oKSA9PSBGaXhlZFBvc2l0aW9uICYmIGUgJiYgZS0+ZG9jdW1l
bnQoKS0+cGFnZSgpICYmIGUtPmRvY3VtZW50KCktPnBhZ2UoKS0+c2V0dGluZ3MoKS0+Zml4ZWRQ
b3NpdGlvbkNyZWF0ZXNTdGFja2luZ0NvbnRleHQoKSkKKyNpZiBFTkFCTEUoQUNDRUxFUkFURURf
T1ZFUkZMT1dfU0NST0xMSU5HKQorICAgICAgICAvLyBUb3VjaCBvdmVyZmxvdyBzY3JvbGxpbmcg
Y3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHQuCisgICAgICAgIHx8ICgoc3R5bGUtPm92ZXJmbG93
WCgpICE9IE9ISURERU4gfHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pICYmIHN0eWxl
LT51c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nKCkpCisjZW5kaWYKKyNpZiBFTkFCTEUoRElBTE9H
X0VMRU1FTlQpCisgICAgICAgIHx8IChlICYmIGUtPmlzSW5Ub3BMYXllcigpKQorI2VuZGlmCisg
ICAgICAgICkpCisgICAgICAgIHN0eWxlLT5zZXRaSW5kZXgoMCk7CisKKyAgICAvLyBUZXh0YXJl
YSBjb25zaWRlcnMgb3ZlcmZsb3cgdmlzaWJsZSBhcyBhdXRvLgorICAgIGlmIChlICYmIGUtPmhh
c1RhZ05hbWUodGV4dGFyZWFUYWcpKSB7CisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goc3R5
bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+b3ZlcmZsb3dYKCkp
OworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklT
SUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WSgpKTsKKyAgICB9CisKKyAgICBpZiAoZG9l
c05vdEluaGVyaXRUZXh0RGVjb3JhdGlvbihzdHlsZSwgZSkpCisgICAgICAgIHN0eWxlLT5zZXRU
ZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4dERlY29yYXRpb24oKSk7CisgICAgZWxz
ZQorICAgICAgICBzdHlsZS0+YWRkVG9UZXh0RGVjb3JhdGlvbnNJbkVmZmVjdChzdHlsZS0+dGV4
dERlY29yYXRpb24oKSk7CisKKyAgICAvLyBJZiBlaXRoZXIgb3ZlcmZsb3cgdmFsdWUgaXMgbm90
IHZpc2libGUsIGNoYW5nZSB0byBhdXRvLgorICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0g
T01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9NQVJRVUVFKQorICAgICAgICBzdHls
ZS0+c2V0T3ZlcmZsb3dZKE9NQVJRVUVFKTsKKyAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZ
KCkgPT0gT01BUlFVRUUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9NQVJRVUVFKQorICAgICAg
ICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9NQVJRVUVFKTsKKyAgICBlbHNlIGlmIChzdHlsZS0+b3Zl
cmZsb3dYKCkgPT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFKSB7
CisgICAgICAgIC8vIEZJWE1FOiBPbmNlIHdlIGltcGxlbWVudCBwYWdpbmF0aW9uIGNvbnRyb2xz
LCBvdmVyZmxvdy14IHNob3VsZCBkZWZhdWx0IHRvIGhpZGRlbgorICAgICAgICAvLyBpZiBvdmVy
Zmxvdy15IGlzIHNldCB0byAtd2Via2l0LXBhZ2VkLXggb3IgLXdlYmtpdC1wYWdlLXkuIEZvciBu
b3csIHdlJ2xsIGxldCBpdAorICAgICAgICAvLyBkZWZhdWx0IHRvIGF1dG8gc28gd2UgY2FuIGF0
IGxlYXN0IHNjcm9sbCB0aHJvdWdoIHRoZSBwYWdlcy4KKyAgICAgICAgc3R5bGUtPnNldE92ZXJm
bG93WChPQVVUTyk7CisgICAgfSBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lC
TEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFKQorICAgICAgICBzdHlsZS0+c2V0
T3ZlcmZsb3dZKE9BVVRPKTsKKworICAgIC8vIENhbGwgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1v
ZGUoKSBpZiBhIHBhZ2luYXRpb24gbW9kZSBpcyBzZXQgZm9yIGFueSBub24tcm9vdCBlbGVtZW50
cy4gSWYgdGhlc2UKKyAgICAvLyBzdHlsZXMgYXJlIHNwZWNpZmllZCBvbiBhIHJvb3QgZWxlbWVu
dCwgdGhlbiB0aGV5IHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGluCisgICAgLy8gU3R5bGVSZXNvbHZl
cjo6c3R5bGVGb3JEb2N1bWVudCgpLgorICAgIGlmICgoc3R5bGUtPm92ZXJmbG93WSgpID09IE9Q
QUdFRFggfHwgc3R5bGUtPm92ZXJmbG93WSgpID09IE9QQUdFRFkpICYmICEoZSAmJiAoZS0+aGFz
VGFnTmFtZShodG1sVGFnKSB8fCBlLT5oYXNUYWdOYW1lKGJvZHlUYWcpKSkpCisgICAgICAgIHNl
dFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKFdlYkNvcmU6OnBhZ2luYXRpb25Nb2RlRm9yUmVuZGVy
U3R5bGUoc3R5bGUpLCBzdHlsZSk7CisKKyAgICAvLyBUYWJsZSByb3dzLCBzZWN0aW9ucyBhbmQg
dGhlIHRhYmxlIGl0c2VsZiB3aWxsIHN1cHBvcnQgb3ZlcmZsb3c6aGlkZGVuIGFuZCB3aWxsIGln
bm9yZSBzY3JvbGwvYXV0by4KKyAgICAvLyBGSVhNRTogRXZlbnR1YWxseSB0YWJsZSBzZWN0aW9u
cyB3aWxsIHN1cHBvcnQgYXV0byBhbmQgc2Nyb2xsLgorICAgIGlmIChzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFCisgICAgICAgIHx8
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfUk9XX0dST1VQIHx8IHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfUk9XKSB7CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lC
TEUgJiYgc3R5bGUtPm92ZXJmbG93WCgpICE9IE9ISURERU4pCisgICAgICAgICAgICBzdHlsZS0+
c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKKyAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSAh
PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOworICAgIH0KKworICAgIC8vIE1lbnVsaXN0
cyBzaG91bGQgaGF2ZSB2aXNpYmxlIG92ZXJmbG93CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNl
KCkgPT0gTWVudWxpc3RQYXJ0KSB7CisgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lC
TEUpOworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKyAgICB9CisKKyAg
ICAvLyBDdWxsIG91dCBhbnkgdXNlbGVzcyBsYXllcnMgYW5kIGFsc28gcmVwZWF0IHBhdHRlcm5z
IGludG8gYWRkaXRpb25hbCBsYXllcnMuCisgICAgc3R5bGUtPmFkanVzdEJhY2tncm91bmRMYXll
cnMoKTsKKyAgICBzdHlsZS0+YWRqdXN0TWFza0xheWVycygpOworCisgICAgLy8gRG8gdGhlIHNh
bWUgZm9yIGFuaW1hdGlvbnMgYW5kIHRyYW5zaXRpb25zLgorICAgIHN0eWxlLT5hZGp1c3RBbmlt
YXRpb25zKCk7CisgICAgc3R5bGUtPmFkanVzdFRyYW5zaXRpb25zKCk7CisKKyAgICAvLyBJbXBv
cnRhbnQ6IEludHJpbnNpYyBtYXJnaW5zIGdldCBhZGRlZCB0byBjb250cm9scyBiZWZvcmUgdGhl
IHRoZW1lIGhhcyBhZGp1c3RlZCB0aGUgc3R5bGUsIHNpbmNlIHRoZSB0aGVtZSB3aWxsCisgICAg
Ly8gYWx0ZXIgZm9udHMgYW5kIGhlaWdodHMvd2lkdGhzLgorICAgIGlmIChlICYmIGUtPmlzRm9y
bUNvbnRyb2xFbGVtZW50KCkgJiYgc3R5bGUtPmZvbnRTaXplKCkgPj0gMTEpIHsKKyAgICAgICAg
Ly8gRG9uJ3QgYXBwbHkgaW50cmluc2ljIG1hcmdpbnMgdG8gaW1hZ2UgYnV0dG9ucy4gVGhlIGRl
c2lnbmVyIGtub3dzIGhvdyBiaWcgdGhlIGltYWdlcyBhcmUsCisgICAgICAgIC8vIHNvIHdlIGhh
dmUgdG8gdHJlYXQgYWxsIGltYWdlIGJ1dHRvbnMgYXMgdGhvdWdoIHRoZXkgd2VyZSBleHBsaWNp
dGx5IHNpemVkLgorICAgICAgICBpZiAoIWUtPmhhc1RhZ05hbWUoaW5wdXRUYWcpIHx8ICFzdGF0
aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZSktPmlzSW1hZ2VCdXR0b24oKSkKKyAgICAgICAg
ICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOworICAgIH0KKworICAgIC8vIExldCB0aGUg
dGhlbWUgYWxzbyBoYXZlIGEgY3JhY2sgYXQgYWRqdXN0aW5nIHRoZSBzdHlsZS4KKyAgICBpZiAo
c3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVt
ZSgpLT5hZGp1c3RTdHlsZSh0aGlzLCBzdHlsZSwgZSwgbV9zdGF0ZS5oYXNVQUFwcGVhcmFuY2Uo
KSwgbV9zdGF0ZS5ib3JkZXJEYXRhKCksIG1fc3RhdGUuYmFja2dyb3VuZERhdGEoKSwgbV9zdGF0
ZS5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGZpcnN0LWxldHRlciBw
c2V1ZG8gc3R5bGUsIGRvIG5vdCBzaGFyZSB0aGlzIHN0eWxlLgorICAgIGlmIChzdHlsZS0+aGFz
UHNldWRvU3R5bGUoRklSU1RfTEVUVEVSKSkKKyAgICAgICAgc3R5bGUtPnNldFVuaXF1ZSgpOwor
CisgICAgLy8gRklYTUU6IHdoZW4gZHJvcHBpbmcgdGhlIC13ZWJraXQgcHJlZml4IG9uIHRyYW5z
Zm9ybS1zdHlsZSwgd2Ugc2hvdWxkIGFsc28gaGF2ZSBvcGFjaXR5IDwgMSBjYXVzZSBmbGF0dGVu
aW5nLgorICAgIGlmIChzdHlsZS0+cHJlc2VydmVzM0QoKSAmJiAoc3R5bGUtPm92ZXJmbG93WCgp
ICE9IE9WSVNJQkxFCisgICAgICAgIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRQor
ICAgICAgICB8fCBzdHlsZS0+aGFzRmlsdGVyKCkpKQorICAgICAgICBzdHlsZS0+c2V0VHJhbnNm
b3JtU3R5bGUzRChUcmFuc2Zvcm1TdHlsZTNERmxhdCk7CisKKyAgICAvLyBTZWFtbGVzcyBpZnJh
bWVzIGJlaGF2ZSBsaWtlIGJsb2Nrcy4gTWFwIHRoZWlyIGRpc3BsYXkgdG8gaW5saW5lLWJsb2Nr
IHdoZW4gbWFya2VkIGlubGluZS4KKyAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGlmcmFtZVRh
ZykgJiYgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkUgJiYgc3RhdGljX2Nhc3Q8SFRNTElGcmFt
ZUVsZW1lbnQqPihlKS0+c2hvdWxkRGlzcGxheVNlYW1sZXNzbHkoKSkKKyAgICAgICAgc3R5bGUt
PnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKGUg
JiYgZS0+aXNTVkdFbGVtZW50KCkpIHsKKyAgICAgICAgLy8gU3BlYzogaHR0cDovL3d3dy53My5v
cmcvVFIvU1ZHL21hc2tpbmcuaHRtbCNPdmVyZmxvd1Byb3BlcnR5CisgICAgICAgIGlmIChzdHls
ZS0+b3ZlcmZsb3dZKCkgPT0gT1NDUk9MTCkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxv
d1koT0hJRERFTik7CisgICAgICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPQVVU
TykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT1ZJU0lCTEUpOworCisgICAgICAg
IGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1NDUk9MTCkKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1goT0hJRERFTik7CisgICAgICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1go
KSA9PSBPQVVUTykKKyAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUpOwor
CisgICAgICAgIC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4gZWxlbWVudCBpbiBhbiBTVkcgZG9jdW1l
bnQgZnJhZ21lbnQgdHJlZSBob25vcnMgY3NzIHBvc2l0aW9uCisgICAgICAgIGlmICghKGUtPmhh
c1RhZ05hbWUoU1ZHTmFtZXM6OnN2Z1RhZykgJiYgZS0+cGFyZW50Tm9kZSgpICYmICFlLT5wYXJl
bnROb2RlKCktPmlzU1ZHRWxlbWVudCgpKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlv
bihSZW5kZXJTdHlsZTo6aW5pdGlhbFBvc2l0aW9uKCkpOworCisgICAgICAgIC8vIFJlbmRlclNW
R1Jvb3QgaGFuZGxlcyB6b29taW5nIGZvciB0aGUgd2hvbGUgU1ZHIHN1YnRyZWUsIHNvIGZvcmVp
Z25PYmplY3QgY29udGVudCBzaG91bGQKKyAgICAgICAgLy8gbm90IGJlIHNjYWxlZCBhZ2Fpbi4K
KyAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUoU1ZHTmFtZXM6OmZvcmVpZ25PYmplY3RUYWcpKQor
ICAgICAgICAgICAgc3R5bGUtPnNldEVmZmVjdGl2ZVpvb20oUmVuZGVyU3R5bGU6OmluaXRpYWxa
b29tKCkpOworICAgIH0KKyNlbmRpZgorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVn
aW9uU3R5bGUoRWxlbWVudCogcmVnaW9uRWxlbWVudCkKK3sKKyAgICAvLyBGSVhNRSAoQlVHIDcy
NDcyKTogV2UgZG9uJ3QgYWRkIEAtd2Via2l0LXJlZ2lvbiBydWxlcyBvZiBzY29wZWQgc3R5bGUg
c2hlZXRzIGZvciB0aGUgbW9tZW50LAorICAgIC8vIHNvIGFsbCByZWdpb24gcnVsZXMgYXJlIGds
b2JhbCBieSBkZWZhdWx0LiBWZXJpZnkgd2hldGhlciB0aGF0IGNhbiBzdGFuZCBvciBuZWVkcyBj
aGFuZ2luZy4KKworICAgIHVuc2lnbmVkIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMuYXV0aG9yU3R5
bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7CisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7CisgICAgICAgIEFTU0VSVChtX3J1bGVT
ZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVs
ZVNldC5nZXQoKSk7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKG1fcnVsZVNldHMu
YXV0aG9yU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3Rv
ciwgcmVnaW9uRWxlbWVudCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBpZiAobV9ydWxlU2V0cy51c2VyU3R5bGUoKSkgeworICAgICAgICBydWxlc1NpemUgPSBtX3J1
bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzU2l6ZTsgKytpKSB7CisgICAg
ICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNB
bmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjaGVja1Jl
Z2lvblNlbGVjdG9yKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5k
UnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQorICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
CitzdGF0aWMgdm9pZCBjaGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHls
ZSkKK3sKKyAgICBGb250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOworICAgIE5vbkNKS0ds
eXBoT3JpZW50YXRpb24gZ2x5cGhPcmllbnRhdGlvbjsKKyAgICBnZXRGb250QW5kR2x5cGhPcmll
bnRhdGlvbihzdHlsZSwgZm9udE9yaWVudGF0aW9uLCBnbHlwaE9yaWVudGF0aW9uKTsKKworICAg
IGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uID0gc3R5bGUtPmZvbnREZXNj
cmlwdGlvbigpOworICAgIGlmIChmb250RGVzY3JpcHRpb24ub3JpZW50YXRpb24oKSA9PSBmb250
T3JpZW50YXRpb24gJiYgZm9udERlc2NyaXB0aW9uLm5vbkNKS0dseXBoT3JpZW50YXRpb24oKSA9
PSBnbHlwaE9yaWVudGF0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBGb250RGVzY3JpcHRp
b24gbmV3Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgbmV3Rm9udERlc2Ny
aXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7CisgICAg
bmV3Rm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmllbnRhdGlvbik7CisgICAg
c3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6OnVwZGF0ZUZvbnQoKQoreworICAgIGlmICghbV9zdGF0ZS5mb250RGly
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbV9zdGF0
ZS5zdHlsZSgpOworICAgIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShzdHlsZSwgbV9zdGF0
ZS5wYXJlbnRTdHlsZSgpKTsKKyAgICBjaGVja0Zvclpvb21DaGFuZ2Uoc3R5bGUsIG1fc3RhdGUu
cGFyZW50U3R5bGUoKSk7CisgICAgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShzdHlsZSk7Cisg
ICAgc3R5bGUtPmZvbnQoKS51cGRhdGUobV9mb250U2VsZWN0b3IpOworICAgIG1fc3RhdGUuc2V0
Rm9udERpcnR5KGZhbHNlKTsKK30KKworUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNv
bHZlcjo6c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgdW5zaWduZWQgcnVsZXNUb0lu
Y2x1ZGUpCit7CisgICAgcmV0dXJuIHBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KGUsIE5PUFNF
VURPLCBydWxlc1RvSW5jbHVkZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxl
UmVzb2x2ZXI6OnBzZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIFBzZXVkb0lk
IHBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKK3sKKyAgICBpZiAoIWUgfHwgIWUt
PmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7
CisKKyAgICBpbml0RWxlbWVudChlKTsKKyAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUo
ZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOworCisgICAgTWF0Y2hSZXN1bHQgZHVtbXk7Cisg
ICAgaWYgKHJ1bGVzVG9JbmNsdWRlICYgVUFBbmRVc2VyQ1NTUnVsZXMpIHsKKyAgICAgICAgLy8g
Rmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KKyAgICAgICAg
bWF0Y2hVQVJ1bGVzKGR1bW15KTsKKworICAgICAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVl
dCBydWxlcy4KKyAgICAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQorICAgICAg
ICAgICAgbWF0Y2hVc2VyUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxl
cyk7CisgICAgfQorCisgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIChydWxl
c1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgeworICAgICAgICBtX3N0YXRlLnNldFNhbWVP
cmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdpbkNTU1J1bGVzKSk7CisKKyAg
ICAgICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMuCisgICAgICAgIG1hdGNo
QXV0aG9yUnVsZXMoZHVtbXksIHJ1bGVzVG9JbmNsdWRlICYgRW1wdHlDU1NSdWxlcyk7CisKKyAg
ICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2luT25seShmYWxzZSk7CisgICAgfQorCisgICAgbV9z
dGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOworCisgICAgcmV0
dXJuIG1fc3RhdGUudGFrZVJ1bGVMaXN0KCk7Cit9CisKK2lubGluZSBib29sIFN0eWxlUmVzb2x2
ZXI6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBydWxlRGF0YSwgY29uc3QgQ29udGFpbmVy
Tm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNldWRvLCBTZWxlY3RvckNoZWNrZXI6OkJl
aGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkpCit7CisgICAgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKKworICAgIGlmIChydWxlRGF0YS5oYXNGYXN0Q2hlY2thYmxlU2VsZWN0b3Io
KSkgeworICAgICAgICAvLyBXZSBrbm93IHRoaXMgc2VsZWN0b3IgZG9lcyBub3QgaW5jbHVkZSBh
bnkgcHNldWRvIGVsZW1lbnRzLgorICAgICAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0
KCkucHNldWRvSWQgIT0gTk9QU0VVRE8pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIC8vIFdlIGtub3cgYSBzdWZmaWNpZW50bHkgc2ltcGxlIHNpbmdsZSBwYXJ0IHNlbGVjdG9y
IG1hdGNoZXMgc2ltcGx5IGJlY2F1c2Ugd2UgZm91bmQgaXQgZnJvbSB0aGUgcnVsZSBoYXNoLgor
ICAgICAgICAvLyBUaGlzIGlzIGxpbWl0ZWQgdG8gSFRNTCBvbmx5IHNvIHdlIGRvbid0IG5lZWQg
dG8gY2hlY2sgdGhlIG5hbWVzcGFjZS4KKyAgICAgICAgaWYgKHJ1bGVEYXRhLmhhc1JpZ2h0bW9z
dFNlbGVjdG9yTWF0Y2hpbmdIVE1MQmFzZWRPblJ1bGVIYXNoKCkgJiYgc3RhdGUuZWxlbWVudCgp
LT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgICAgIGlmICghcnVsZURhdGEuaGFzTXVsdGlw
YXJ0U2VsZWN0b3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAocnVsZURhdGEuc2VsZWN0b3IoKS0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6
VGFnICYmICFTZWxlY3RvckNoZWNrZXI6OnRhZ01hdGNoZXMoc3RhdGUuZWxlbWVudCgpLCBydWxl
RGF0YS5zZWxlY3RvcigpLT50YWdRTmFtZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgU2VsZWN0b3JDaGVja2VyRmFzdFBhdGggc2VsZWN0b3JDaGVja2VyRmFzdFBhdGgo
cnVsZURhdGEuc2VsZWN0b3IoKSwgc3RhdGUuZWxlbWVudCgpKTsKKyAgICAgICAgaWYgKCFzZWxl
Y3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzUmlnaHRtb3N0QXR0cmlidXRlU2VsZWN0b3IoKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gc2VsZWN0b3JDaGVj
a2VyRmFzdFBhdGgubWF0Y2hlcygpOworICAgIH0KKworICAgIC8vIFNsb3cgcGF0aC4KKyAgICBT
ZWxlY3RvckNoZWNrZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIHN0YXRlLm1vZGUoKSk7
CisgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBjb250ZXh0KHJ1
bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpWaXNp
dGVkTWF0Y2hFbmFibGVkKTsKKyAgICBjb250ZXh0LmVsZW1lbnRTdHlsZSA9IHN0YXRlLnN0eWxl
KCk7CisgICAgY29udGV4dC5zY29wZSA9IHNjb3BlOworICAgIGNvbnRleHQucHNldWRvSWQgPSBz
dGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZDsKKyAgICBjb250ZXh0LnNjcm9sbGJh
ciA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhcjsKKyAgICBjb250ZXh0LnNj
cm9sbGJhclBhcnQgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXJQYXJ0Owor
ICAgIGNvbnRleHQuYmVoYXZpb3JBdEJvdW5kYXJ5ID0gYmVoYXZpb3JBdEJvdW5kYXJ5OworICAg
IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3RvckNoZWNrZXIubWF0Y2goY29u
dGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpOworICAg
IGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9J
ZCAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBk
eW5hbWljUHNldWRvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TZWxlY3Rvcihjb25zdCBDU1NTZWxl
Y3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgaWYg
KCFyZWdpb25TZWxlY3RvciB8fCAhcmVnaW9uRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX3N0
YXRlLm1vZGUoKSk7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogcyA9IHJlZ2lvblNlbGVj
dG9yOyBzOyBzID0gQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KHMpKSB7CisgICAgICAgIFNlbGVjdG9y
Q2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgc2VsZWN0b3JDaGVja2luZ0NvbnRleHQo
cywgcmVnaW9uRWxlbWVudCwgU2VsZWN0b3JDaGVja2VyOjpWaXNpdGVkTWF0Y2hEaXNhYmxlZCk7
CisgICAgICAgIFBzZXVkb0lkIGlnbm9yZUR5bmFtaWNQc2V1ZG8gPSBOT1BTRVVETzsKKyAgICAg
ICAgaWYgKHNlbGVjdG9yQ2hlY2tlci5tYXRjaChzZWxlY3RvckNoZWNraW5nQ29udGV4dCwgaWdu
b3JlRHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNhbFN0cmF0ZWd5KCkpID09IFNlbGVj
dG9yQ2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCisvLyB0aGlzIGlzIG1vc3RseSBib3Jpbmcgc3R1ZmYgb24gaG93IHRvIGFwcGx5IGEg
Y2VydGFpbiBydWxlIHRvIHRoZSByZW5kZXJzdHlsZS4uLgorCitMZW5ndGggU3R5bGVSZXNvbHZl
cjo6Y29udmVydFRvSW50TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlw
bGllcikKK3sKKyAgICByZXR1cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29u
dmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8
IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9uIHwgVmlld3BvcnRQZXJj
ZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlwbGllcikgOiBMZW5ndGgo
VW5kZWZpbmVkKTsKK30KKworTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNvbnZlcnRUb0Zsb2F0TGVu
Z3RoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxl
LCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllcikKK3sKKyAgICByZXR1
cm4gcHJpbWl0aXZlVmFsdWUgPyBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVk
RmxvYXRDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lv
biB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0
eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVmaW5lZCk7Cit9CisKK3Rl
bXBsYXRlIDxTdHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgordm9pZCBT
dHlsZVJlc29sdmVyOjphcHBseVByb3BlcnRpZXMoY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJv
cGVydGllcywgU3R5bGVSdWxlKiBydWxlLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRl
ZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGUpCit7Cisg
ICAgQVNTRVJUKChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgIT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdp
b24pIHx8IG1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKTsKKyAgICBJbnNwZWN0b3JJbnN0cnVt
ZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUHJv
Y2Vzc1J1bGUoZG9jdW1lbnQoKSwgcnVsZSwgdGhpcyk7CisKKyAgICB1bnNpZ25lZCBwcm9wZXJ0
eUNvdW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlDb3VudCgpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyArK2kpIHsKKyAgICAgICAgU3R5bGVQcm9wZXJ0eVNl
dDo6UHJvcGVydHlSZWZlcmVuY2UgY3VycmVudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5QXQoaSk7
CisgICAgICAgIGlmIChpc0ltcG9ydGFudCAhPSBjdXJyZW50LmlzSW1wb3J0YW50KCkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGluaGVyaXRlZE9ubHkgJiYgIWN1cnJlbnQu
aXNJbmhlcml0ZWQoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IHZhbHVlIGlz
IGV4cGxpY2l0bHkgaW5oZXJpdGVkLCB3ZSBuZWVkIHRvIGFwcGx5IGZ1cnRoZXIgbm9uLWluaGVy
aXRlZCBwcm9wZXJ0aWVzCisgICAgICAgICAgICAvLyBhcyB0aGV5IG1pZ2h0IG92ZXJyaWRlIHRo
ZSB2YWx1ZSBpbmhlcml0ZWQgaGVyZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvbid0IGFsbG93IGRl
Y2xhcmF0aW9ucyB3aXRoCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGluaGVyaXRlZCBwcm9w
ZXJ0aWVzIHRvIGJlIGNhY2hlZC4KKyAgICAgICAgICAgIEFTU0VSVCghY3VycmVudC52YWx1ZSgp
LT5pc0luaGVyaXRlZFZhbHVlKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0K
KyAgICAgICAgQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSA9IGN1cnJlbnQuaWQoKTsKKworICAgICAg
ICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uICYm
ICFTdHlsZVJlc29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgICAgIGlm
IChwcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RDdWUgJiYgIVN0eWxl
UmVzb2x2ZXI6OmlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworI2VuZGlmCisgICAgICAgIHN3aXRjaCAocGFzcykgeworI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQorICAgICAgICBjYXNlIFZhcmlhYmxlRGVmaW5pdGlvbnM6CisgICAgICAg
ICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9wZXJ0eVZhcmlhYmxlIDwgZmlyc3RDU1NQcm9wZXJ0
eSwgQ1NTX3ZhcmlhYmxlX2lzX2JlZm9yZV9maXJzdF9wcm9wZXJ0eSk7CisgICAgICAgICAgICBp
ZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKKyAgICAgICAgICAgICAgICBhcHBs
eVByb3BlcnR5KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworI2VuZGlmCisgICAgICAgIGNhc2UgSGlnaFByaW9yaXR5UHJvcGVydGllczoKKyAgICAg
ICAgICAgIENPTVBJTEVfQVNTRVJUKGZpcnN0Q1NTUHJvcGVydHkgPT0gQ1NTUHJvcGVydHlDb2xv
ciwgQ1NTX2NvbG9yX2lzX2ZpcnN0X3Byb3BlcnR5KTsKKyAgICAgICAgICAgIENPTVBJTEVfQVNT
RVJUKENTU1Byb3BlcnR5Wm9vbSA9PSBDU1NQcm9wZXJ0eUNvbG9yICsgMTcsIENTU196b29tX2lz
X2VuZF9vZl9maXJzdF9wcm9wX3JhbmdlKTsKKyAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENT
U1Byb3BlcnR5TGluZUhlaWdodCA9PSBDU1NQcm9wZXJ0eVpvb20gKyAxLCBDU1NfbGluZV9oZWln
aHRfaXNfYWZ0ZXJfem9vbSk7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgICAgICAg
ICBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZ2l2ZSBzcGVjaWFsIHByaW9yaXR5IHRv
IGZvbnQteHh4LCBjb2xvciBwcm9wZXJ0aWVzLCBldGMKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0
eSA8IENTU1Byb3BlcnR5TGluZUhlaWdodCkKKyAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5
KGN1cnJlbnQuaWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAgIC8vIHdlIGFwcGx5
IGxpbmUtaGVpZ2h0IGxhdGVyCisgICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IExvd1ByaW9yaXR5UHJvcGVydGllczoKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA+IENTU1By
b3BlcnR5TGluZUhlaWdodCkKKyAgICAgICAgICAgICAgICBhcHBseVByb3BlcnR5KGN1cnJlbnQu
aWQoKSwgY3VycmVudC52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb246OmRpZFByb2Nlc3NSdWxlKGNvb2tpZSk7Cit9CisKK3RlbXBsYXRlIDxT
dHlsZVJlc29sdmVyOjpTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgordm9pZCBTdHlsZVJlc29s
dmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3Vs
dCwgYm9vbCBpc0ltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBp
bmhlcml0ZWRPbmx5KQoreworICAgIGlmIChzdGFydEluZGV4ID09IC0xKQorICAgICAgICByZXR1
cm47CisKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGlmIChzdGF0ZS5zdHlsZSgp
LT5pbnNpZGVMaW5rKCkgIT0gTm90SW5zaWRlTGluaykgeworICAgICAgICBmb3IgKGludCBpID0g
c3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBNYXRj
aGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllc1tpXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBtYXRjaGVk
UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlOworICAgICAgICAgICAgLy8gRklYTUU6IEl0IHdvdWxk
IGJlIG5pY2VyIHRvIHBhc3MgdGhlc2UgYXMgYXJndW1lbnRzIGJ1dCB0aGF0IHJlcXVpcmVzIGNo
YW5nZXMgaW4gbWFueSBwbGFjZXMuCisgICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUobGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hMaW5r
KTsKKyAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUo
bGlua01hdGNoVHlwZSAmIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hWaXNpdGVkKTsKKworICAgICAg
ICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNoZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMu
Z2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tpXSwgaXNJbXBvcnRhbnQsIGluaGVyaXRl
ZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVsaXN0VHlwZT4obWF0Y2hlZFByb3BlcnRp
ZXMud2hpdGVsaXN0VHlwZSkpOworICAgICAgICB9CisgICAgICAgIHN0YXRlLnNldEFwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKTsKKyAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZShmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
Zm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgeworICAgICAgICBj
b25zdCBNYXRjaGVkUHJvcGVydGllcyYgbWF0Y2hlZFByb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5t
YXRjaGVkUHJvcGVydGllc1tpXTsKKyAgICAgICAgYXBwbHlQcm9wZXJ0aWVzPHBhc3M+KG1hdGNo
ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuZ2V0KCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlc1tp
XSwgaXNJbXBvcnRhbnQsIGluaGVyaXRlZE9ubHksIHN0YXRpY19jYXN0PFByb3BlcnR5V2hpdGVs
aXN0VHlwZT4obWF0Y2hlZFByb3BlcnRpZXMud2hpdGVsaXN0VHlwZSkpOworICAgIH0KK30KKwor
dW5zaWduZWQgU3R5bGVSZXNvbHZlcjo6Y29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChjb25z
dCBNYXRjaGVkUHJvcGVydGllcyogcHJvcGVydGllcywgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICAK
KyAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpoYXNoTWVtb3J5KHByb3BlcnRpZXMsIHNpemVvZihN
YXRjaGVkUHJvcGVydGllcykgKiBzaXplKTsKK30KKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0
eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJh
bmdlcyYgYikKK3sKKyAgICByZXR1cm4gYS5maXJzdFVBUnVsZSA9PSBiLmZpcnN0VUFSdWxlCisg
ICAgICAgICYmIGEubGFzdFVBUnVsZSA9PSBiLmxhc3RVQVJ1bGUKKyAgICAgICAgJiYgYS5maXJz
dEF1dGhvclJ1bGUgPT0gYi5maXJzdEF1dGhvclJ1bGUKKyAgICAgICAgJiYgYS5sYXN0QXV0aG9y
UnVsZSA9PSBiLmxhc3RBdXRob3JSdWxlCisgICAgICAgICYmIGEuZmlyc3RVc2VyUnVsZSA9PSBi
LmZpcnN0VXNlclJ1bGUKKyAgICAgICAgJiYgYS5sYXN0VXNlclJ1bGUgPT0gYi5sYXN0VXNlclJ1
bGU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdl
cyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGIpCit7CisgICAgcmV0dXJu
ICEoYSA9PSBiKTsKK30KKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGll
cyYgYikKK3sKKyAgICByZXR1cm4gYS5wcm9wZXJ0aWVzID09IGIucHJvcGVydGllcyAmJiBhLmxp
bmtNYXRjaFR5cGUgPT0gYi5saW5rTWF0Y2hUeXBlOworfQorCitib29sIG9wZXJhdG9yIT0oY29u
c3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQoreworICAgIHJldHVybiAhKGEgPT0gYik7Cit9CisK
K2NvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBTdHlsZVJl
c29sdmVyOjpmaW5kRnJvbU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUodW5zaWduZWQgaGFzaCwgY29u
c3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQoreworICAgIEFTU0VSVChoYXNoKTsKKworICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGll
c0NhY2hlLmZpbmQoaGFzaCk7CisgICAgaWYgKGl0ID09IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZS5lbmQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0
ZW0mIGNhY2hlSXRlbSA9IGl0LT52YWx1ZTsKKworICAgIHNpemVfdCBzaXplID0gbWF0Y2hSZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmIChzaXplICE9IGNhY2hlSXRlbS5t
YXRjaGVkUHJvcGVydGllcy5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIGlmIChtYXRjaFJlc3VsdC5tYXRj
aGVkUHJvcGVydGllc1tpXSAhPSBjYWNoZUl0ZW0ubWF0Y2hlZFByb3BlcnRpZXNbaV0pCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGNhY2hlSXRlbS5yYW5nZXMgIT0gbWF0
Y2hSZXN1bHQucmFuZ2VzKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gJmNhY2hlSXRl
bTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUo
Y29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUs
IHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKK3sKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3
ZWVuU3dlZXBzID0gMTAwOworICAgIGlmICgrK21fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0
aW9uc1NpbmNlTGFzdFN3ZWVwID49IG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0
d2VlblN3ZWVwcworICAgICAgICAmJiAhbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
ci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXRjaGVkRGVj
bGFyYXRpb25DYWNoZVN3ZWVwVGltZUluU2Vjb25kcyA9IDYwOworICAgICAgICBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLnN0YXJ0T25lU2hvdChtYXRjaGVkRGVjbGFyYXRpb25D
YWNoZVN3ZWVwVGltZUluU2Vjb25kcyk7CisgICAgfQorCisgICAgQVNTRVJUKGhhc2gpOworICAg
IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtIGNhY2hlSXRlbTsKKyAgICBjYWNoZUl0ZW0ubWF0
Y2hlZFByb3BlcnRpZXMuYXBwZW5kKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzKTsKKyAg
ICBjYWNoZUl0ZW0ucmFuZ2VzID0gbWF0Y2hSZXN1bHQucmFuZ2VzOworICAgIC8vIE5vdGUgdGhh
dCB3ZSBkb24ndCBjYWNoZSB0aGUgb3JpZ2luYWwgUmVuZGVyU3R5bGUgaW5zdGFuY2UuIEl0IG1h
eSBiZSBmdXJ0aGVyIG1vZGlmaWVkLgorICAgIC8vIFRoZSBSZW5kZXJTdHlsZSBpbiB0aGUgY2Fj
aGUgaXMgcmVhbGx5IGp1c3QgYSBob2xkZXIgZm9yIHRoZSBzdWJzdHJ1Y3R1cmVzIGFuZCBuZXZl
ciB1c2VkIGFzLWlzLgorICAgIGNhY2hlSXRlbS5yZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpj
bG9uZShzdHlsZSk7CisgICAgY2FjaGVJdGVtLnBhcmVudFJlbmRlclN0eWxlID0gUmVuZGVyU3R5
bGU6OmNsb25lKHBhcmVudFN0eWxlKTsKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuYWRk
KGhhc2gsIGNhY2hlSXRlbSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6aW52YWxpZGF0ZU1h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKQoreworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5j
bGVhcigpOworfQorCitzdGF0aWMgYm9vbCBpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3BlcnRpZXND
YWNoZShjb25zdCBFbGVtZW50KiBlbGVtZW50LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNv
bnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICAvLyBGSVhNRTogQ1NTUHJvcGVy
dHlXZWJraXRXcml0aW5nTW9kZSBtb2RpZmllcyBzdGF0ZSB3aGVuIGFwcGx5aW5nIHRvIGRvY3Vt
ZW50IGVsZW1lbnQuIFdlIGNhbid0IHNraXAgdGhlIGFwcGx5aW5nIGJ5IGNhY2hpbmcuCisgICAg
aWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgJiYg
ZWxlbWVudC0+ZG9jdW1lbnQoKS0+d3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT51bmlxdWUoKSB8fCAoc3R5bGUt
PnN0eWxlVHlwZSgpICE9IE5PUFNFVURPICYmIHBhcmVudFN0eWxlLT51bmlxdWUoKSkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPmhhc0FwcGVhcmFuY2UoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+em9vbSgpICE9IFJlbmRlclN0eWxlOjpp
bml0aWFsWm9vbSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT53cml0
aW5nTW9kZSgpICE9IFJlbmRlclN0eWxlOjppbml0aWFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIC8vIFRoZSBjYWNoZSBhc3N1bWVzIHN0YXRpYyBrbm93bGVkZ2Ug
YWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkLgorICAgIGlmIChwYXJlbnRTdHls
ZS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBjb25zdCBFbGVt
ZW50KiBlbGVtZW50KQoreworICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOworICAgIHVuc2lnbmVkIGNhY2hlSGFzaCA9IG1hdGNoUmVzdWx0LmlzQ2FjaGVh
YmxlID8gY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVzSGFzaChtYXRjaFJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5kYXRhKCksIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSkgOiAw
OworICAgIGJvb2wgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGNhY2hlSXRlbSA9IDA7CisgICAgaWYgKGNhY2hlSGFzaCAm
JiAoY2FjaGVJdGVtID0gZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNhY2hlSGFzaCwg
bWF0Y2hSZXN1bHQpKSkgeworICAgICAgICAvLyBXZSBjYW4gYnVpbGQgdXAgdGhlIHN0eWxlIGJ5
IGNvcHlpbmcgbm9uLWluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gYW4gZWFybGllciBzdHlsZSBv
YmplY3QgYnVpbHQgdXNpbmcgdGhlIHNhbWUgZXhhY3QKKyAgICAgICAgLy8gc3R5bGUgZGVjbGFy
YXRpb25zLiBXZSB0aGVuIG9ubHkgbmVlZCB0byBhcHBseSB0aGUgaW5oZXJpdGVkIHByb3BlcnRp
ZXMsIGlmIGFueSwgYXMgdGhlaXIgdmFsdWVzIGNhbiBkZXBlbmQgb24gdGhlIAorICAgICAgICAv
LyBlbGVtZW50IGNvbnRleHQuIFRoaXMgaXMgZmFzdCBhbmQgc2F2ZXMgbWVtb3J5IGJ5IHJldXNp
bmcgdGhlIHN0eWxlIGRhdGEgc3RydWN0dXJlcy4KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y29w
eU5vbkluaGVyaXRlZEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7CisgICAgICAg
IGlmIChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5pbmhlcml0ZWREYXRhU2hhcmVkKGNhY2hlSXRlbS0+
cGFyZW50UmVuZGVyU3R5bGUuZ2V0KCkpICYmICFpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVudCkp
IHsKKyAgICAgICAgICAgIEVJbnNpZGVMaW5rIGxpbmtTdGF0dXMgPSBzdGF0ZS5zdHlsZSgpLT5p
bnNpZGVMaW5rKCk7CisgICAgICAgICAgICAvLyBJZiB0aGUgY2FjaGUgaXRlbSBwYXJlbnQgc3R5
bGUgaGFzIGlkZW50aWNhbCBpbmhlcml0ZWQgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwYXJl
bnQgc3R5bGUgdGhlbiB0aGUKKyAgICAgICAgICAgIC8vIHJlc3VsdGluZyBzdHlsZSB3aWxsIGJl
IGlkZW50aWNhbCB0b28uIFdlIGNvcHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG92ZXIgZnJv
bSB0aGUgY2FjaGUgYW5kIGFyZSBkb25lLgorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5o
ZXJpdEZyb20oY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS5nZXQoKSk7CisKKyAgICAgICAgICAgIC8v
IFVuZm9ydHVuYXRlbHkgdGhlIGxpbmsgc3RhdHVzIGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmhlcml0
ZWQgcHJvcGVydHkuIFdlIG5lZWQgdG8gZXhwbGljaXRseSByZXN0b3JlIGl0LgorICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdHVzKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhcHBseUluaGVyaXRlZE9ubHkgPSB0cnVlOyAK
KyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICAvLyBGaXJzdCBhcHBseSBh
bGwgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgbWF5IGJlIHVzZWQgZHVyaW5nIGFwcGxp
Y2F0aW9uIG9mIGxhdGVyIHByb3BlcnRpZXMuCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxW
YXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAsIG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2Vz
Lmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFBy
b3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVz
dWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxl
LCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFi
bGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJz
dFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25s
eSk7CisjZW5kaWYKKworICAgIC8vIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgbWF0Y2hlZCBydWxl
cyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIuIFdhbGsgdGhlIHJ1bGVzIGFuZCBhcHBseQorICAg
IC8vIGhpZ2gtcHJpb3JpdHkgcHJvcGVydGllcyBmaXJzdCwgaS5lLiwgdGhvc2UgcHJvcGVydGll
cyB0aGF0IG90aGVyIHByb3BlcnRpZXMgZGVwZW5kIG9uLgorICAgIC8vIFRoZSBvcmRlciBpcyAo
MSkgaGlnaC1wcmlvcml0eSBub3QgaW1wb3J0YW50LCAoMikgaGlnaC1wcmlvcml0eSBpbXBvcnRh
bnQsICgzKSBub3JtYWwgbm90IGltcG9ydGFudAorICAgIC8vIGFuZCAoNCkgbm9ybWFsIGltcG9y
dGFudC4KKyAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIDAs
IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGFwcGx5SW5oZXJpdGVk
T25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVz
PihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwor
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hS
ZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3Vs
dC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUs
IG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RV
QVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7CisKKyAgICBpZiAoY2FjaGVJdGVtICYmIGNhY2hl
SXRlbS0+cmVuZGVyU3R5bGUtPmVmZmVjdGl2ZVpvb20oKSAhPSBzdGF0ZS5zdHlsZSgpLT5lZmZl
Y3RpdmVab29tKCkpIHsKKyAgICAgICAgc3RhdGUuc2V0Rm9udERpcnR5KHRydWUpOworICAgICAg
ICBhcHBseUluaGVyaXRlZE9ubHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiBvdXIgZm9u
dCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBpdCBub3cuCisgICAgdXBkYXRlRm9u
dCgpOworCisgICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdoZW4gd2UgYXJlIHN1cmUgd2UgZGVj
aWRlZCBvbiB0aGUgZm9udC1zaXplLgorICAgIGlmIChzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkK
KyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsIHN0YXRlLmxpbmVI
ZWlnaHRWYWx1ZSgpKTsKKworICAgIC8vIE1hbnkgcHJvcGVydGllcyBkZXBlbmQgb24gdGhlIGZv
bnQuIElmIGl0IGNoYW5nZXMgd2UganVzdCBhcHBseSBhbGwgcHJvcGVydGllcy4KKyAgICBpZiAo
Y2FjaGVJdGVtICYmIGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUtPmZvbnREZXNjcmlwdGlvbigpICE9
IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpKQorICAgICAgICBhcHBseUluaGVyaXRl
ZE9ubHkgPSBmYWxzZTsKKworICAgIC8vIE5vdyBkbyB0aGUgbm9ybWFsIHByaW9yaXR5IFVBIHBy
b3BlcnRpZXMuCisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRp
ZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBt
YXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICAK
KyAgICAvLyBDYWNoZSBvdXIgYm9yZGVyIGFuZCBiYWNrZ3JvdW5kIHNvIHRoYXQgd2UgY2FuIGV4
YW1pbmUgdGhlbSBsYXRlci4KKyAgICBzdGF0ZS5jYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsK
KyAgICAKKyAgICAvLyBOb3cgZG8gdGhlIGF1dGhvciBhbmQgdXNlciBub3JtYWwgcHJpb3JpdHkg
cHJvcGVydGllcyBhbmQgYWxsIHRoZSAhaW1wb3J0YW50IHByb3BlcnRpZXMuCisgICAgYXBwbHlN
YXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxz
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUgKyAxLCBtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwg
bWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxh
c3RBdXRob3JSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1
bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7CisgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlv
cml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmly
c3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9u
bHkpOworICAgCisgICAgLy8gU3RhcnQgbG9hZGluZyByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0
aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CisgICAgCisgICAgQVNTRVJU
KCFzdGF0ZS5mb250RGlydHkoKSk7CisgICAgCisgICAgaWYgKGNhY2hlSXRlbSB8fCAhY2FjaGVI
YXNoKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFpc0NhY2hlYWJsZUluTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZShzdGF0ZS5lbGVtZW50KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0
eWxlKCkpKQorICAgICAgICByZXR1cm47CisgICAgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hl
KHN0YXRlLnN0eWxlKCksIHN0YXRlLnBhcmVudFN0eWxlKCksIGNhY2hlSGFzaCwgbWF0Y2hSZXN1
bHQpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZVBhZ2VSdWxlcyhjb25zdCBTdHls
ZVJ1bGVQYWdlKiByMSwgY29uc3QgU3R5bGVSdWxlUGFnZSogcjIpCit7CisgICAgcmV0dXJuIHIx
LT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpIDwgcjItPnNlbGVjdG9yKCktPnNwZWNpZmljaXR5
KCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hQYWdlUnVsZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgUnVsZVNldCogcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFn
ZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBpZiAoIXJ1bGVzKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+IG1hdGNoZWRQYWdlUnVsZXM7Cisg
ICAgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KG1hdGNoZWRQYWdlUnVsZXMsIHJ1bGVzLT5wYWdlUnVs
ZXMoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKTsKKyAgICBpZiAobWF0Y2hl
ZFBhZ2VSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0ZDo6c3RhYmxl
X3NvcnQobWF0Y2hlZFBhZ2VSdWxlcy5iZWdpbigpLCBtYXRjaGVkUGFnZVJ1bGVzLmVuZCgpLCBj
b21wYXJlUGFnZVJ1bGVzKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVk
UGFnZVJ1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1
bHQsIG1hdGNoZWRQYWdlUnVsZXNbaV0tPnByb3BlcnRpZXMoKSk7Cit9CisKK3N0YXRpYyBib29s
IGNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3Is
IGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFt
ZSkKK3sKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBjb21wb25lbnQgPSBzZWxlY3Rvcjsg
Y29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRhZ0hpc3RvcnkoKSkgeworICAgICAg
ICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcpIHsKKyAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0gY29tcG9uZW50LT50YWdRTmFtZSgp
LmxvY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBzdGFyQXRvbSAmJiBs
b2NhbE5hbWUgIT0gcGFnZU5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisKKyAgICAgICAgQ1NTU2VsZWN0b3I6OlBzZXVkb1R5cGUgcHNldWRvVHlwZSA9IGNv
bXBvbmVudC0+cHNldWRvVHlwZSgpOworICAgICAgICBpZiAoKHBzZXVkb1R5cGUgPT0gQ1NTU2Vs
ZWN0b3I6OlBzZXVkb0xlZnRQYWdlICYmICFpc0xlZnRQYWdlKQorICAgICAgICAgICAgfHwgKHBz
ZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb1JpZ2h0UGFnZSAmJiBpc0xlZnRQYWdlKQor
ICAgICAgICAgICAgfHwgKHBzZXVkb1R5cGUgPT0gQ1NTU2VsZWN0b3I6OlBzZXVkb0ZpcnN0UGFn
ZSAmJiAhaXNGaXJzdFBhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6bWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNo
ZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0
UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKK3sKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3R5
bGVSdWxlUGFnZSogcnVsZSA9IHJ1bGVzW2ldOworCisgICAgICAgIGlmICghY2hlY2tQYWdlU2Vs
ZWN0b3JDb21wb25lbnRzKHJ1bGUtPnNlbGVjdG9yKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdl
LCBwYWdlTmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBJZiB0aGUg
cnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCisgICAgICAg
IGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7
CisgICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCisgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0
IG9mIG1hdGNoZWQgcnVsZXMuCisgICAgICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Cisg
ICAgfQorfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkg
Y29uc3QKK3sKKyAgICBib29sIGlzRmlyc3RQYWdlTGVmdCA9IGZhbHNlOworICAgIGlmICghbV9z
dGF0ZS5yb290RWxlbWVudFN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSkKKyAgICAg
ICAgaXNGaXJzdFBhZ2VMZWZ0ID0gdHJ1ZTsKKworICAgIHJldHVybiAocGFnZUluZGV4ICsgKGlz
Rmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6Omlz
Rmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEluIGNhc2Ug
b2YgZm9yY2VkIGxlZnQvcmlnaHQgcGFnZSwgcGFnZSBhdCBpbmRleCAxIChub3QgMCkgY2FuIGJl
IHRoZSBmaXJzdCBwYWdlLgorICAgIHJldHVybiAoIXBhZ2VJbmRleCk7Cit9CisKK1N0cmluZyBT
dHlsZVJlc29sdmVyOjpwYWdlTmFtZShpbnQgLyogcGFnZUluZGV4ICovKSBjb25zdAoreworICAg
IC8vIEZJWE1FOiBJbXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAg
ICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvU3R5
bGUoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUp
Cit7CisgICAgaW5pdEVsZW1lbnQoMCk7CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZl
KGRvY3VtZW50KCksIDAsIHN0eWxlKTsKKyAgICBtX3N0YXRlLnNldFN0eWxlKHN0eWxlKTsKKyAg
ICBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoaWQsIHZhbHVlKTsKK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCBpZCwg
Q1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0
eShpZCwgdmFsdWUpOworfQorCitpbmxpbmUgYm9vbCBpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0
eShDU1NQcm9wZXJ0eUlEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29s
b3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3I6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclRvcENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21D
b2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91
dGxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VGV4dFN0cm9rZUNvbG9yOgorI2lmIEVOQUJMRShTVkcpCisgICAgY2FzZSBDU1NQcm9wZXJ0eUZp
bGw6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVN0cm9rZToKKyNlbmRpZgorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKKy8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2NzczMtcmVnaW9ucy8jdGhl
LWF0LXJlZ2lvbi1zdHlsZS1ydWxlCisvLyBGSVhNRTogYWRkIGluY3JlbWVudGFsIHN1cHBvcnQg
Zm9yIG90aGVyIHJlZ2lvbiBzdHlsaW5nIHByb3BlcnRpZXMuCitpbmxpbmUgYm9vbCBTdHlsZVJl
c29sdmVyOjppc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkKQorewor
ICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xvcjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisj
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQoraW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aXNWYWxp
ZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRBdHRhY2htZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZFBvc2l0aW9uWToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kU2l6ZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXpl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZv
bnRWYXJpYW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlMaW5lSGVpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgorICAgIGNh
c2UgQ1NTUHJvcGVydHlPdXRsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU91dGxpbmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlWaXNpYmlsaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0RGVjb3JhdGlvbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dFNoYWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3R5bGU6CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKy8vIFNWRyBoYW5kbGVzIHpvb21pbmcgaW4gYSBkaWZm
ZXJlbnQgd2F5IGNvbXBhcmVkIHRvIENTUy4gVGhlIHdob2xlIGRvY3VtZW50IGlzIHNjYWxlZCBp
bnN0ZWFkCisvLyBvZiBlYWNoIGluZGl2aWR1YWwgbGVuZ3RoIHZhbHVlIGluIHRoZSByZW5kZXIg
c3R5bGUgLyB0cmVlLiBDU1NQcmltaXRpdmVWYWx1ZTo6Y29tcHV0ZUxlbmd0aCooKQorLy8gbXVs
dGlwbGllcyBlYWNoIHJlc29sdmVkIGxlbmd0aCB3aXRoIHRoZSB6b29tIG11bHRpcGxpZXIgLSBz
byBmb3IgU1ZHIHdlIG5lZWQgdG8gZGlzYWJsZSB0aGF0LgorLy8gVGhvdWdoIGFsbCBDU1MgdmFs
dWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gb3V0ZXJtb3N0IDxzdmc+IGVsZW1lbnRzICh3aWR0
aC9oZWlnaHQvYm9yZGVyL3BhZGRpbmcuLi4pCisvLyBuZWVkIHRvIHJlc3BlY3QgdGhlIHNjYWxp
bmcuIFJlbmRlckJveCAodGhlIHBhcmVudCBjbGFzcyBvZiBSZW5kZXJTVkdSb290KSBncmFicyB2
YWx1ZXMgbGlrZQorLy8gd2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5nLy4uLiBmcm9tIHRoZSBS
ZW5kZXJTdHlsZSAtPiBmb3IgU1ZHIHRoZXNlIHZhbHVlcyB3b3VsZCBuZXZlciBzY2FsZSwKKy8v
IGlmIHdlJ2QgcGFzcyBhIDEuMCB6b29tIGZhY3RvciBldmVyeWh3ZXJlLiBTbyB3ZSBvbmx5IHBh
c3MgYSB6b29tIGZhY3RvciBvZiAxLjAgZm9yIHNwZWNpZmljCisvLyBwcm9wZXJ0aWVzIHRoYXQg
YXJlIE5PVCBhbGxvd2VkIHRvIHNjYWxlIHdpdGhpbiBhIHpvb21lZCBTVkcgZG9jdW1lbnQgKGxl
dHRlci93b3JkLXNwYWNpbmcvZm9udC1zaXplKS4KK2Jvb2wgU3R5bGVSZXNvbHZlcjo6dXNlU1ZH
Wm9vbVJ1bGVzKCkKK3sKKyAgICByZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCkgJiYgbV9zdGF0ZS5l
bGVtZW50KCktPmlzU1ZHRWxlbWVudCgpOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJh
Y2tCcmVhZHRoKENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3QgU3R5bGVS
ZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBMZW5ndGgmIHdvcmtpbmdMZW5ndGgpCit7CisgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlV2Via2l0TWluQ29udGVudCkg
eworICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3RoKE1pbkNvbnRlbnQpOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkg
PT0gQ1NTVmFsdWVXZWJraXRNYXhDb250ZW50KSB7CisgICAgICAgIHdvcmtpbmdMZW5ndGggPSBM
ZW5ndGgoTWF4Q29udGVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHdv
cmtpbmdMZW5ndGggPSBwcmltaXRpdmVWYWx1ZS0+Y29udmVydFRvTGVuZ3RoPEZpeGVkSW50ZWdl
ckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFnZUNvbnZl
cnNpb24gfCBBdXRvQ29udmVyc2lvbj4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRT
dHlsZSgpLCBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpOworICAgIGlmICh3b3JraW5n
TGVuZ3RoLmlzVW5kZWZpbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChw
cmltaXRpdmVWYWx1ZS0+aXNMZW5ndGgoKSkKKyAgICAgICAgd29ya2luZ0xlbmd0aC5zZXRRdWly
ayhwcmltaXRpdmVWYWx1ZS0+aXNRdWlya1ZhbHVlKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja01pbk1heChDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgR3JpZFRy
YWNrU2l6ZSYgdHJhY2tTaXplKQoreworICAgIFBhaXIqIG1pbk1heFRyYWNrQnJlYWR0aCA9IHBy
aW1pdGl2ZVZhbHVlLT5nZXRQYWlyVmFsdWUoKTsKKyAgICBpZiAoIW1pbk1heFRyYWNrQnJlYWR0
aCkgeworICAgICAgICBMZW5ndGggd29ya2luZ0xlbmd0aDsKKyAgICAgICAgaWYgKCFjcmVhdGVH
cmlkVHJhY2tCcmVhZHRoKHByaW1pdGl2ZVZhbHVlLCBzdGF0ZSwgd29ya2luZ0xlbmd0aCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdHJhY2tTaXplLnNldExlbmd0aCh3
b3JraW5nTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgTGVuZ3Ro
IG1pblRyYWNrQnJlYWR0aDsKKyAgICBMZW5ndGggbWF4VHJhY2tCcmVhZHRoOworICAgIGlmICgh
Y3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFkdGgtPmZpcnN0KCksIHN0YXRl
LCBtaW5UcmFja0JyZWFkdGgpIHx8ICFjcmVhdGVHcmlkVHJhY2tCcmVhZHRoKG1pbk1heFRyYWNr
QnJlYWR0aC0+c2Vjb25kKCksIHN0YXRlLCBtYXhUcmFja0JyZWFkdGgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICB0cmFja1NpemUuc2V0TWluTWF4KG1pblRyYWNrQnJlYWR0aCwgbWF4
VHJhY2tCcmVhZHRoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRl
R3JpZFRyYWNrR3JvdXAoQ1NTVmFsdWUqIHZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0
ZSYgc3RhdGUsIFZlY3RvcjxHcmlkVHJhY2tTaXplPiYgdHJhY2tTaXplcykKK3sKKyAgICBpZiAo
IXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3Ig
KENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgp
KSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAgIGlm
ICghY3VyclZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgR3JpZFRyYWNrU2l6ZSB0cmFja1NpemU7CisgICAgICAgIGlmICghY3Jl
YXRlR3JpZFRyYWNrTWluTWF4KHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oY3VyclZh
bHVlKSwgc3RhdGUsIHRyYWNrU2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgdHJhY2tTaXplcy5hcHBlbmQodHJhY2tTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0xpc3QoQ1NTVmFsdWUqIHZhbHVl
LCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6
OlN0YXRlJiBzdGF0ZSkKK3sKKyAgICAvLyBIYW5kbGUgJ25vbmUnLgorICAgIGlmICh2YWx1ZS0+
aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRp
dmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAg
ICByZXR1cm4gcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lOworICAg
IH0KKworICAgIHJldHVybiBjcmVhdGVHcmlkVHJhY2tHcm91cCh2YWx1ZSwgc3RhdGUsIHRyYWNr
U2l6ZXMpOworfQorCisKK3N0YXRpYyBib29sIGNyZWF0ZUdyaWRQb3NpdGlvbihDU1NWYWx1ZSog
dmFsdWUsIEdyaWRQb3NpdGlvbiYgcG9zaXRpb24pCit7CisgICAgLy8gRm9yIG5vdywgd2Ugb25s
eSBhY2NlcHQ6IDxpbnRlZ2VyPiB8ICdhdXRvJworICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZl
VmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7
CisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElP
TihwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSk7CisgICAgcG9zaXRpb24uc2V0SW50ZWdlclBv
c2l0aW9uKHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorc3RhdGljIGJvb2wgaGFzVmFyaWFibGVS
ZWZlcmVuY2UoQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlmICh2YWx1ZS0+aXNQcmltaXRpdmVW
YWx1ZSgpKSB7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAgICByZXR1cm4gcHJp
bWl0aXZlVmFsdWUtPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7CisgICAgfQorCisgICAgaWYgKHZh
bHVlLT5pc0NhbGN1bGF0aW9uVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENT
U0NhbGNWYWx1ZSo+KHZhbHVlKS0+aGFzVmFyaWFibGVSZWZlcmVuY2UoKTsKKworICAgIGlmICh2
YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkgeworICAgICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxl
Y3RWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1JlZmxlY3RWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIGRpcmVjdGlvbiA9IHJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9uKCk7
CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBvZmZzZXQgPSByZWZsZWN0VmFsdWUtPm9mZnNl
dCgpOworICAgICAgICBDU1NWYWx1ZSogbWFzayA9IHJlZmxlY3RWYWx1ZS0+bWFzaygpOworICAg
ICAgICByZXR1cm4gKGRpcmVjdGlvbiAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShkaXJlY3Rpb24p
KSB8fCAob2Zmc2V0ICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKG9mZnNldCkpIHx8IChtYXNrICYm
IGhhc1ZhcmlhYmxlUmVmZXJlbmNlKG1hc2spKTsKKyAgICB9CisKKyAgICBmb3IgKENTU1ZhbHVl
TGlzdEl0ZXJhdG9yIGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAg
ICAgIGlmIChoYXNWYXJpYWJsZVJlZmVyZW5jZShpLnZhbHVlKCkpKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OnJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVl
LCBWZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNz
aW9ucykKK3sKKyAgICBzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiBleHByZXNzaW9u
KGlkLCB2YWx1ZS0+c2VyaWFsaXplUmVzb2x2aW5nVmFyaWFibGVzKCptX3N0YXRlLnN0eWxlKCkt
PnZhcmlhYmxlcygpKSk7CisKKyAgICBpZiAoa25vd25FeHByZXNzaW9ucy5jb250YWlucyhleHBy
ZXNzaW9uKSkKKyAgICAgICAgcmV0dXJuOyAvLyBjeWNsZSBkZXRlY3RlZC4KKworICAgIGtub3du
RXhwcmVzc2lvbnMuYXBwZW5kKGV4cHJlc3Npb24pOworCisgICAgLy8gRklYTUU6IEl0IHdvdWxk
IGJlIGZhc3RlciBub3QgdG8gcmUtcGFyc2UgZnJvbSBzdHJpbmdzLCBidXQgZm9yIG5vdyBDU1Mg
cHJvcGVydHkgdmFsaWRhdGlvbiBsaXZlcyBpbnNpZGUgdGhlIHBhcnNlciBzbyB3ZSBkbyBpdCB0
aGVyZS4KKyAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcmVzdWx0U2V0ID0gU3R5bGVQcm9w
ZXJ0eVNldDo6Y3JlYXRlKCk7CisgICAgaWYgKCFDU1NQYXJzZXI6OnBhcnNlVmFsdWUocmVzdWx0
U2V0LmdldCgpLCBpZCwgZXhwcmVzc2lvbi5zZWNvbmQsIGZhbHNlLCBkb2N1bWVudCgpKSkKKyAg
ICAgICAgcmV0dXJuOyAvLyBleHByZXNzaW9uIGZhaWxlZCB0byBwYXJzZS4KKworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCByZXN1bHRTZXQtPnByb3BlcnR5Q291bnQoKTsgaSsrKSB7Cisg
ICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIHByb3BlcnR5ID0gcmVz
dWx0U2V0LT5wcm9wZXJ0eUF0KGkpOworICAgICAgICBpZiAocHJvcGVydHkuaWQoKSAhPSBDU1NQ
cm9wZXJ0eVZhcmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHByb3BlcnR5LnZhbHVlKCkp
KQorICAgICAgICAgICAgcmVzb2x2ZVZhcmlhYmxlcyhwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0eS52
YWx1ZSgpLCBrbm93bkV4cHJlc3Npb25zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXBw
bHlQcm9wZXJ0eShwcm9wZXJ0eS5pZCgpLCBwcm9wZXJ0eS52YWx1ZSgpKTsKKyAgICB9Cit9Cisj
ZW5kaWYKKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5KENTU1Byb3BlcnR5SUQg
aWQsIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBp
ZiAoaWQgIT0gQ1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZSh2YWx1
ZSkpIHsKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4g
a25vd25FeHByZXNzaW9uczsKKyAgICAgICAgcmVzb2x2ZVZhcmlhYmxlcyhpZCwgdmFsdWUsIGtu
b3duRXhwcmVzc2lvbnMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICAv
LyBDU1MgdmFyaWFibGVzIGRvbid0IHJlc29sdmUgc2hvcnRoYW5kcyBhdCBwYXJzaW5nIHRpbWUs
IHNvIHRoaXMgc2hvdWxkIGJlICphZnRlciogaGFuZGxpbmcgdmFyaWFibGVzLgorICAgIEFTU0VS
VF9XSVRIX01FU1NBR0UoIWlzRXhwYW5kZWRTaG9ydGhhbmQoaWQpLCAiU2hvcnRoYW5kIHByb3Bl
cnR5IGlkID0gJWQgd2Fzbid0IGV4cGFuZGVkIGF0IHBhcnNpbmcgdGltZSIsIGlkKTsKKworICAg
IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgYm9vbCBpc0luaGVyaXQgPSBzdGF0ZS5wYXJl
bnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUoKTsKKyAgICBib29sIGlzSW5pdGlh
bCA9IHZhbHVlLT5pc0luaXRpYWxWYWx1ZSgpIHx8ICghc3RhdGUucGFyZW50Tm9kZSgpICYmIHZh
bHVlLT5pc0luaGVyaXRlZFZhbHVlKCkpOworCisgICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgIWlz
SW5pdGlhbCk7IC8vIGlzSW5oZXJpdCAtPiAhaXNJbml0aWFsICYmIGlzSW5pdGlhbCAtPiAhaXNJ
bmhlcml0CisgICAgQVNTRVJUKCFpc0luaGVyaXQgfHwgKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBz
dGF0ZS5wYXJlbnRTdHlsZSgpKSk7IC8vIGlzSW5oZXJpdCAtPiAoc3RhdGUucGFyZW50Tm9kZSgp
ICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpCisKKyAgICBpZiAoIXN0YXRlLmFwcGx5UHJvcGVydHlU
b1JlZ3VsYXJTdHlsZSgpICYmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHls
ZSgpIHx8ICFpc1ZhbGlkVmlzaXRlZExpbmtQcm9wZXJ0eShpZCkpKSB7CisgICAgICAgIC8vIExp
bWl0IHRoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gb25seSB0aGUgb25lcyBo
b25vcmVkIGJ5IDp2aXNpdGVkLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlz
SW5oZXJpdCAmJiAhc3RhdGUucGFyZW50U3R5bGUoKS0+aGFzRXhwbGljaXRseUluaGVyaXRlZFBy
b3BlcnRpZXMoKSAmJiAhQ1NTUHJvcGVydHk6OmlzSW5oZXJpdGVkUHJvcGVydHkoaWQpKQorICAg
ICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5zZXRIYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVy
dGllcygpOworCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgaWYgKGlkID09IENTU1By
b3BlcnR5VmFyaWFibGUpIHsKKyAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJ
T04odmFsdWUtPmlzVmFyaWFibGVWYWx1ZSgpKTsKKyAgICAgICAgQ1NTVmFyaWFibGVWYWx1ZSog
dmFyaWFibGUgPSBzdGF0aWNfY2FzdDxDU1NWYXJpYWJsZVZhbHVlKj4odmFsdWUpOworICAgICAg
ICBBU1NFUlQoIXZhcmlhYmxlLT5uYW1lKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgQVNTRVJUKCF2
YXJpYWJsZS0+dmFsdWUoKS5pc0VtcHR5KCkpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRW
YXJpYWJsZSh2YXJpYWJsZS0+bmFtZSgpLCB2YXJpYWJsZS0+dmFsdWUoKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIENoZWNrIGxvb2t1cCB0YWJsZSBmb3IgaW1w
bGVtZW50YXRpb25zIGFuZCB1c2Ugd2hlbiBhdmFpbGFibGUuCisgICAgY29uc3QgUHJvcGVydHlI
YW5kbGVyJiBoYW5kbGVyID0gbV9zdHlsZUJ1aWxkZXIucHJvcGVydHlIYW5kbGVyKGlkKTsKKyAg
ICBpZiAoaGFuZGxlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkKKyAgICAg
ICAgICAgIGhhbmRsZXIuYXBwbHlJbmhlcml0VmFsdWUoaWQsIHRoaXMpOworICAgICAgICBlbHNl
IGlmIChpc0luaXRpYWwpCisgICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5pdGlhbFZhbHVlKGlk
LCB0aGlzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGFuZGxlci5hcHBseVZhbHVlKGlk
LCB0aGlzLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSB2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpID8gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSkgOiAwOworCisgICAgZmxvYXQgem9v
bUZhY3RvciA9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIFdoYXQg
Zm9sbG93cyBpcyBhIGxpc3QgdGhhdCBtYXBzIHRoZSBDU1MgcHJvcGVydGllcyBpbnRvIHRoZWly
IGNvcnJlc3BvbmRpbmcgZnJvbnQtZW5kCisgICAgLy8gUmVuZGVyU3R5bGUgdmFsdWVzLgorICAg
IHN3aXRjaCAoaWQpIHsKKyAgICAvLyBsaXN0cworICAgIGNhc2UgQ1NTUHJvcGVydHlDb250ZW50
OgorICAgICAgICAvLyBsaXN0IG9mIHN0cmluZywgdXJpLCBjb3VudGVyLCBhdHRyLCBpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJbiBDU1MzLCBpdCB3aWxsIGJlIHBvc3NpYmxl
IHRvIGluaGVyaXQgY29udGVudC4gSW4gQ1NTMiBpdCBpcyBub3QuIFRoaXMKKyAgICAgICAgICAg
IC8vIG5vdGUgaXMgYSByZW1pbmRlciB0aGF0IGV2ZW50dWFsbHkgImluaGVyaXQiIG5lZWRzIHRv
IGJlIHN1cHBvcnRlZC4KKworICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPmNsZWFyQ29udGVudCgpOworICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxp
c3QoKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGJvb2wgZGlkU2V0
ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1
ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgICAgICAgICAgQ1NTVmFsdWUq
IGl0ZW0gPSBpLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzSW1hZ2VHZW5l
cmF0b3JWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0dyYWRpZW50
VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFs
dWUqPihpdGVtKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpLCBkaWRT
ZXQpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0
aWNfY2FzdDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAg
ICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQor
ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+aXNJbWFnZVNldFZhbHVlKCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChzZXRPclBlbmRpbmdG
cm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZhbHVl
Kj4oaXRlbSkpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwor
I2VuZGlmCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlz
SW1hZ2VWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENv
bnRlbnQoY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGlj
X2Nhc3Q8Q1NTSW1hZ2VWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAg
ICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVl
KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIGNvbnRlbnRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4oaXRlbSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5pc1N0cmlu
ZygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY29u
dGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgZGlkU2V0KTsKKyAgICAgICAgICAg
ICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRl
bnRWYWx1ZS0+aXNBdHRyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IENhbiBh
IG5hbWVzcGFjZSBiZSBzcGVjaWZpZWQgZm9yIGFuIGF0dHIoZm9vKT8KKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHN0YXRlLnN0eWxlKCktPnN0eWxlVHlwZSgpID09IE5PUFNFVURPKQorICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VW5pcXVlKCk7CisgICAgICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhcmVudFN0eWxl
KCktPnNldFVuaXF1ZSgpOworICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIGF0dHIo
bnVsbEF0b20sIGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIG51bGxBdG9t
KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiB2YWx1ZSA9IHN0YXRl
LmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGF0dHIpOworICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRDb250ZW50KHZhbHVlLmlzTnVsbCgpID8gZW1wdHlBdG9tIDogdmFsdWUu
aW1wbCgpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAg
ICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgZmFjdCB0aGF0IHRoZSBhdHRyaWJ1dGUg
dmFsdWUgYWZmZWN0cyB0aGUgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgbV9ydWxlU2V0cy5m
ZWF0dXJlcygpLmF0dHJzSW5SdWxlcy5hZGQoYXR0ci5sb2NhbE5hbWUoKS5pbXBsKCkpOworICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFZhbHVlLT5pc0NvdW50ZXIoKSkgeworICAg
ICAgICAgICAgICAgICAgICBDb3VudGVyKiBjb3VudGVyVmFsdWUgPSBjb250ZW50VmFsdWUtPmdl
dENvdW50ZXJWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBFTGlzdFN0eWxlVHlwZSBsaXN0
U3R5bGVUeXBlID0gTm9uZUxpc3RTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RT
dHlsZUlkZW50ID0gY291bnRlclZhbHVlLT5saXN0U3R5bGVJZGVudCgpOworICAgICAgICAgICAg
ICAgICAgICBpZiAobGlzdFN0eWxlSWRlbnQgIT0gQ1NTVmFsdWVOb25lKQorICAgICAgICAgICAg
ICAgICAgICAgICAgbGlzdFN0eWxlVHlwZSA9IHN0YXRpY19jYXN0PEVMaXN0U3R5bGVUeXBlPihs
aXN0U3R5bGVJZGVudCAtIENTU1ZhbHVlRGlzYyk7CisgICAgICAgICAgICAgICAgICAgIE93blB0
cjxDb3VudGVyQ29udGVudD4gY291bnRlciA9IGFkb3B0UHRyKG5ldyBDb3VudGVyQ29udGVudChj
b3VudGVyVmFsdWUtPmlkZW50aWZpZXIoKSwgbGlzdFN0eWxlVHlwZSwgY291bnRlclZhbHVlLT5z
ZXBhcmF0b3IoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250
ZW50KGNvdW50ZXIucmVsZWFzZSgpLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICBkaWRT
ZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAg
IHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICAgICAgICAg
IGNhc2UgQ1NTVmFsdWVPcGVuUXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRDb250ZW50KE9QRU5fUVVPVEUsIGRpZFNldCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVDbG9zZVF1b3RlOgorICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChDTE9TRV9RVU9URSwgZGlkU2V0
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vT3Bl
blF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVu
dChOT19PUEVOX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlkU2V0
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlTm9DbG9zZVF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChOT19DTE9TRV9RVU9URSwgZGlkU2V0KTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIG5vcm1hbCBhbmQgbm9uZSBkbyBub3QgaGF2ZSBhbnkgZWZmZWN0LgorICAgICAg
ICAgICAgICAgICAgICAgICAgeyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRpZFNldCkKKyAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlRdW90ZXM6CisgICAgICAgIGlmIChp
c0luaGVyaXQpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhzdGF0ZS5w
YXJlbnRTdHlsZSgpLT5xdW90ZXMoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0K
KyAgICAgICAgaWYgKGlzSW5pdGlhbCkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
UXVvdGVzKDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh2
YWx1ZS0+aXNWYWx1ZUxpc3QoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0g
c3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOworICAgICAgICAgICAgUmVmUHRyPFF1
b3Rlc0RhdGE+IHF1b3RlcyA9IFF1b3Rlc0RhdGE6OmNyZWF0ZSgpOworICAgICAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LT5sZW5ndGgoKTsgaSArPSAyKSB7CisgICAgICAgICAg
ICAgICAgQ1NTVmFsdWUqIGZpcnN0ID0gbGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsK
KyAgICAgICAgICAgICAgICAvLyBpdGVtKCkgcmV0dXJucyBudWxsIGlmIG91dCBvZiBib3VuZHMg
c28gdGhpcyBpcyBzYWZlLgorICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBzZWNvbmQgPSBsaXN0
LT5pdGVtKGkgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlY29uZCkKKyAgICAgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlf
SU1QTElDQVRJT04oZmlyc3QtPmlzUHJpbWl0aXZlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAg
QVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oc2Vjb25kLT5pc1ByaW1pdGl2ZVZhbHVl
KCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBzdGFydFF1b3RlID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPihmaXJzdCktPmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICAg
ICAgU3RyaW5nIGVuZFF1b3RlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihzZWNv
bmQpLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgIHF1b3Rlcy0+YWRkUGFpcihz
dGQ6Om1ha2VfcGFpcihzdGFydFF1b3RlLCBlbmRRdW90ZSkpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHF1b3Rlcyk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlKSB7CisgICAgICAg
ICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKQorICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhRdW90ZXNEYXRhOjpjcmVhdGUo
KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1NTUHJvcGVydHlGb250
RmFtaWx5OiB7CisgICAgICAgIC8vIGxpc3Qgb2Ygc3RyaW5ncyBhbmQgaWRzCisgICAgICAgIGlm
IChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBwYXJlbnRGb250RGVz
Y3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAg
ICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5m
b250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmlj
RmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkpOworICAgICAgICAg
ICAgZm9udERlc2NyaXB0aW9uLnNldEZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZmlyc3RG
YW1pbHkoKSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0SXNTcGVjaWZpZWRGb250
KHBhcmVudEZvbnREZXNjcmlwdGlvbi5pc1NwZWNpZmllZEZvbnQoKSk7CisgICAgICAgICAgICBz
ZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgIEZvbnRE
ZXNjcmlwdGlvbiBpbml0aWFsRGVzYyA9IEZvbnREZXNjcmlwdGlvbigpOworICAgICAgICAgICAg
Rm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNj
cmlwdGlvbigpOworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhZGp1c3QgdGhlIHNpemUgdG8g
YWNjb3VudCBmb3IgdGhlIGdlbmVyaWMgZmFtaWx5IGNoYW5nZSBmcm9tIG1vbm9zcGFjZQorICAg
ICAgICAgICAgLy8gdG8gbm9uLW1vbm9zcGFjZS4KKyAgICAgICAgICAgIGlmIChmb250RGVzY3Jp
cHRpb24ua2V5d29yZFNpemUoKSAmJiBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6
ZSgpKQorICAgICAgICAgICAgICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNp
emVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlwdGlv
bi5rZXl3b3JkU2l6ZSgpIC0gMSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KGluaXRpYWxEZXNjLmdlbmVyaWNGYW1pbHkoKSk7CisgICAgICAg
ICAgICBpZiAoIWluaXRpYWxEZXNjLmZpcnN0RmFtaWx5KCkuZmFtaWx5SXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkoaW5pdGlhbERlc2MuZmlyc3RG
YW1pbHkoKSk7CisgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9u
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUt
PmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIEZvbnREZXNjcmlw
dGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsK
KyAgICAgICAgRm9udEZhbWlseSYgZmlyc3RGYW1pbHkgPSBmb250RGVzY3JpcHRpb24uZmlyc3RG
YW1pbHkoKTsKKyAgICAgICAgRm9udEZhbWlseSogY3VyckZhbWlseSA9IDA7CisKKyAgICAgICAg
Ly8gQmVmb3JlIG1hcHBpbmcgaW4gYSBuZXcgZm9udC1mYW1pbHkgcHJvcGVydHksIHdlIHNob3Vs
ZCByZXNldCB0aGUgZ2VuZXJpYyBmYW1pbHkuCisgICAgICAgIGJvb2wgb2xkRmFtaWx5VXNlZEZp
eGVkRGVmYXVsdFNpemUgPSBmb250RGVzY3JpcHRpb24udXNlRml4ZWREZWZhdWx0U2l6ZSgpOwor
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246
Ok5vRmFtaWx5KTsKKworICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSB2YWx1
ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZSogaXRl
bSA9IGkudmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIGNvbnRlbnRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlbSk7
CisgICAgICAgICAgICBBdG9taWNTdHJpbmcgZmFjZTsKKyAgICAgICAgICAgIFNldHRpbmdzKiBz
ZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VmFs
dWUtPmlzU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgZmFjZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0
U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbmdzKSB7CisgICAgICAg
ICAgICAgICAgc3dpdGNoIChjb250ZW50VmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlV2Via2l0Qm9keToKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9
IHNldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNlcmlmOgorICAgICAgICAgICAgICAg
ICAgICBmYWNlID0gc2VyaWZGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHkpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2Fu
c1NlcmlmOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2Fuc1NlcmlmRmFtaWx5OworICAg
ICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVz
Y3JpcHRpb246OlNhbnNTZXJpZkZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVDdXJzaXZlOgorICAgICAgICAgICAgICAgICAg
ICBmYWNlID0gY3Vyc2l2ZUZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0
aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpDdXJzaXZlRmFtaWx5KTsKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZh
bnRhc3k6CisgICAgICAgICAgICAgICAgICAgIGZhY2UgPSBmYW50YXN5RmFtaWx5OworICAgICAg
ICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3Jp
cHRpb246OkZhbnRhc3lGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlTW9ub3NwYWNlOgorICAgICAgICAgICAgICAgICAgICBm
YWNlID0gbW9ub3NwYWNlRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSk7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVX
ZWJraXRQaWN0b2dyYXBoOgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gcGljdG9ncmFwaEZh
bWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1p
bHkoRm9udERlc2NyaXB0aW9uOjpQaWN0b2dyYXBoRmFtaWx5KTsKKyAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBpZiAoIWZhY2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjdXJyRmFtaWx5
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGxpbmcgaW4gdGhlIGZpcnN0IGZhbWlseS4K
KyAgICAgICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuc2V0RmFtaWx5KGZhY2UpOworICAgICAg
ICAgICAgICAgICAgICBmaXJzdEZhbWlseS5hcHBlbmRGYW1pbHkoMCk7IC8vIFJlbW92ZSBhbnkg
aW5oZXJpdGVkIGZhbWlseS1mYWxsYmFjayBsaXN0LgorICAgICAgICAgICAgICAgICAgICBjdXJy
RmFtaWx5ID0gJmZpcnN0RmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0SXNTcGVjaWZpZWRGb250KGZvbnREZXNjcmlwdGlvbi5nZW5lcmljRmFtaWx5KCkgPT0g
Rm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAgICAgUmVmUHRyPFNoYXJlZEZvbnRGYW1pbHk+IG5ld0ZhbWlseSA9IFNo
YXJlZEZvbnRGYW1pbHk6OmNyZWF0ZSgpOworICAgICAgICAgICAgICAgICAgICBuZXdGYW1pbHkt
PnNldEZhbWlseShmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyckZhbWlseS0+YXBwZW5k
RmFtaWx5KG5ld0ZhbWlseSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSBuZXdG
YW1pbHkuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCB1c2VGaXhlZERlZmF1bHRTaXplKCkgdW50aWwg
YWxsIG5ldyBmb250IGZhbWlsaWVzIGhhdmUgYmVlbiBhZGRlZAorICAgICAgICAvLyBJZiBjdXJy
RmFtaWx5IGlzIG5vbi16ZXJvIHRoZW4gd2Ugc2V0IGF0IGxlYXN0IG9uZSBmYW1pbHkgb24gdGhp
cyBkZXNjcmlwdGlvbi4KKyAgICAgICAgaWYgKGN1cnJGYW1pbHkpIHsKKyAgICAgICAgICAgIGlm
IChmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAmJiBmb250RGVzY3JpcHRpb24udXNlRml4
ZWREZWZhdWx0U2l6ZSgpICE9IG9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplKQorICAgICAg
ICAgICAgICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3b3Jk
KGRvY3VtZW50KCksIENTU1ZhbHVlWHhTbWFsbCArIGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6
ZSgpIC0gMSwgIW9sZEZhbWlseVVzZWRGaXhlZERlZmF1bHRTaXplKSk7CisKKyAgICAgICAgICAg
IHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgLy8gU2hvcnRoYW5kIHByb3BlcnRpZXMuCisgICAgY2FzZSBD
U1NQcm9wZXJ0eUZvbnQ6CisgICAgICAgIGlmIChpc0luaGVyaXQpIHsKKyAgICAgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5mb250
RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQo
c3RhdGUucGFyZW50U3R5bGUoKS0+c3BlY2lmaWVkTGluZUhlaWdodCgpKTsKKyAgICAgICAgICAg
IHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICAgICAgICAgIHNldEZvbnREZXNjcmlw
dGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICB9IGVsc2UgaWYgKGlzSW5pdGlhbCkgewor
ICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOworICAg
ICAgICAgICAgQVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1
dGlvbiwgdGhpcyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMg
aGF2ZSBzZXR0aW5ncworICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICBpbml0aWFsaXplRm9udFN0eWxlKHNldHRpbmdzKTsKKyAg
ICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Cisg
ICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisKKyAgICAgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb247CisgICAgICAgICAgICBSZW5kZXJUaGVtZTo6
ZGVmYXVsdFRoZW1lKCktPnN5c3RlbUZvbnQocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCksIGZv
bnREZXNjcmlwdGlvbik7CisKKyAgICAgICAgICAgIC8vIERvdWJsZS1jaGVjayBhbmQgc2VlIGlm
IHRoZSB0aGVtZSBkaWQgYW55dGhpbmcuIElmIG5vdCwgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRo
ZSBmb250LgorICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgp
KSB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZW5kZXJpbmcgbW9kZSBhbmQg
cHJpbnRlciBmb250IHNldHRpbmdzIGFyZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIFNldHRp
bmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICBBU1NF
UlQoc2V0dGluZ3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRv
Y3VtZW50IHNob3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdz
CisgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNl
dHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICAgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGlu
Z3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOworCisgICAgICAgICAgICAgICAg
Ly8gSGFuZGxlIHRoZSB6b29tIGZhY3Rvci4KKyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3Vt
ZW50KCksIHN0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBm
b250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpLCB1c2VTVkdab29tUnVsZXMoKSkpOworICAg
ICAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAg
ICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLT5pc0ZvbnRWYWx1ZSgpKSB7CisgICAg
ICAgICAgICBGb250VmFsdWUqIGZvbnQgPSBzdGF0aWNfY2FzdDxGb250VmFsdWUqPih2YWx1ZSk7
CisgICAgICAgICAgICBpZiAoIWZvbnQtPnN0eWxlIHx8ICFmb250LT52YXJpYW50IHx8ICFmb250
LT53ZWlnaHQKKyAgICAgICAgICAgICAgICB8fCAhZm9udC0+c2l6ZSB8fCAhZm9udC0+bGluZUhl
aWdodCB8fCAhZm9udC0+ZmFtaWx5KQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U3R5bGUsIGZvbnQtPnN0eWxlLmdldCgp
KTsKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250VmFyaWFudCwgZm9u
dC0+dmFyaWFudC5nZXQoKSk7CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5
Rm9udFdlaWdodCwgZm9udC0+d2VpZ2h0LmdldCgpKTsKKyAgICAgICAgICAgIC8vIFRoZSBwcmV2
aW91cyBwcm9wZXJ0aWVzIGNhbiBkaXJ0eSBvdXIgZm9udCBidXQgdGhleSBkb24ndCB0cnkgdG8g
cmVhZCB0aGUgZm9udCdzCisgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGJhY2ssIHdoaWNoIGlz
IHNhZmUuIEhvd2V2ZXIgaWYgZm9udC1zaXplIGlzIHVzaW5nIHRoZSAnZXgnIHVuaXQsIGl0IHdp
bGwKKyAgICAgICAgICAgIC8vIG5lZWQgcXVlcnkgdGhlIGRpcnRpZWQgZm9udCdzIHgtaGVpZ2h0
IHRvIGdldCB0aGUgY29tcHV0ZWQgc2l6ZS4gVG8gYmUgc2FmZSBpbiB0aGlzCisgICAgICAgICAg
ICAvLyBjYXNlLCBsZXQncyBqdXN0IHVwZGF0ZSB0aGUgZm9udCBub3cuCisgICAgICAgICAgICB1
cGRhdGVGb250KCk7CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFNp
emUsIGZvbnQtPnNpemUuZ2V0KCkpOworCisgICAgICAgICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoZm9udC0+bGluZUhlaWdodC5nZXQoKSk7CisKKyAgICAgICAgICAgIGFwcGx5UHJvcGVy
dHkoQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmb250LT5mYW1pbHkuZ2V0KCkpOworICAgICAgICB9
CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xv
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckxlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJhZGl1czoKKyAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclNwYWNp
bmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJUb3A6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlcldpZHRoOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5T3V0bGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3c6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRp
b246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckJlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyUmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5zOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRGbGV4OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4RmxvdzoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3Jp
ZFJvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQ29sbGFwc2U6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2s6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dEVtcGhhc2lzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRUcmFuc2Zvcm1PcmlnaW46CisjaWYgRU5BQkxFKENTU19FWENMVVNJT05TKQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRXcmFwOgorI2VuZGlmCisgICAgICAgIEFTU0VSVChpc0V4cGFuZGVk
U2hvcnRoYW5kKGlkKSk7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBi
cmVhazsKKworICAgIC8vIENTUzMgUHJvcGVydGllcworICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
U2hhZG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaGFkb3c6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJveFNoYWRvdzogeworICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAg
ICAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQorICAgICAgICAgICAgICAgIHJl
dHVybiBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHN0YXRlLnBhcmVudFN0eWxlKCktPnRl
eHRTaGFkb3coKSA/IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgp
LT50ZXh0U2hhZG93KCkpKSA6IG51bGxwdHIpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0
eWxlKCktPnNldEJveFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSA/IGFk
b3B0UHRyKG5ldyBTaGFkb3dEYXRhKCpzdGF0ZS5wYXJlbnRTdHlsZSgpLT5ib3hTaGFkb3coKSkp
IDogbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5pdGlhbCB8fCBwcmltaXRp
dmVWYWx1ZSkgLy8gaW5pdGlhbCB8IG5vbmUKKyAgICAgICAgICAgIHJldHVybiBpZCA9PSBDU1NQ
cm9wZXJ0eVRleHRTaGFkb3cgPyBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KG51bGxwdHIp
IDogc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KG51bGxwdHIpOworCisgICAgICAgIGlmICgh
dmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZm9y
IChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2Uo
KSkgeworICAgICAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAg
ICAgICAgIGlmICghY3VyclZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICBTaGFkb3dWYWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNo
YWRvd1ZhbHVlKj4oY3VyclZhbHVlKTsKKyAgICAgICAgICAgIGludCB4ID0gaXRlbS0+eC0+Y29t
cHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwg
em9vbUZhY3Rvcik7CisgICAgICAgICAgICBpbnQgeSA9IGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8
aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3Ip
OworICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0
ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9v
bUZhY3RvcikgOiAwOworICAgICAgICAgICAgaW50IHNwcmVhZCA9IGl0ZW0tPnNwcmVhZCA/IGl0
ZW0tPnNwcmVhZC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3RvcikgOiAwOworICAgICAgICAgICAgU2hhZG93U3R5bGUg
c2hhZG93U3R5bGUgPSBpdGVtLT5zdHlsZSAmJiBpdGVtLT5zdHlsZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZUluc2V0ID8gSW5zZXQgOiBOb3JtYWw7CisgICAgICAgICAgICBDb2xvciBjb2xvcjsK
KyAgICAgICAgICAgIGlmIChpdGVtLT5jb2xvcikKKyAgICAgICAgICAgICAgICBjb2xvciA9IGNv
bG9yRnJvbVByaW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgpKTsKKyAgICAgICAgICAgIGVs
c2UgaWYgKHN0YXRlLnN0eWxlKCkpCisgICAgICAgICAgICAgICAgY29sb3IgPSBzdGF0ZS5zdHls
ZSgpLT5jb2xvcigpOworCisgICAgICAgICAgICBPd25QdHI8U2hhZG93RGF0YT4gc2hhZG93RGF0
YSA9IGFkb3B0UHRyKG5ldyBTaGFkb3dEYXRhKEludFBvaW50KHgsIHkpLCBibHVyLCBzcHJlYWQs
IHNoYWRvd1N0eWxlLCBpZCA9PSBDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgY29sb3IuaXNW
YWxpZCgpID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQpKTsKKyAgICAgICAgICAgIGlmIChp
ZCA9PSBDU1NQcm9wZXJ0eVRleHRTaGFkb3cpCisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0VGV4dFNoYWRvdyhzaGFkb3dEYXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRk
IHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBlbnRyeQorICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhzaGFkb3dE
YXRhLnJlbGVhc2UoKSwgaS5pbmRleCgpKTsgLy8gYWRkIHRvIHRoZSBsaXN0IGlmIHRoaXMgaXMg
bm90IHRoZSBmaXJzdCBlbnRyeQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6IHsKKyAgICAgICAgSEFORExFX0lO
SEVSSVRfQU5EX0lOSVRJQUwoYm94UmVmbGVjdCwgQm94UmVmbGVjdCkKKyAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0
KFJlbmRlclN0eWxlOjppbml0aWFsQm94UmVmbGVjdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpCisgICAg
ICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7CisgICAgICAgIFJlZlB0cjxT
dHlsZVJlZmxlY3Rpb24+IHJlZmxlY3Rpb24gPSBTdHlsZVJlZmxlY3Rpb246OmNyZWF0ZSgpOwor
ICAgICAgICByZWZsZWN0aW9uLT5zZXREaXJlY3Rpb24oKnJlZmxlY3RWYWx1ZS0+ZGlyZWN0aW9u
KCkpOworICAgICAgICBpZiAocmVmbGVjdFZhbHVlLT5vZmZzZXQoKSkKKyAgICAgICAgICAgIHJl
ZmxlY3Rpb24tPnNldE9mZnNldChyZWZsZWN0VmFsdWUtPm9mZnNldCgpLT5jb252ZXJ0VG9MZW5n
dGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRl
ZENvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9v
bUZhY3RvcikpOworICAgICAgICBOaW5lUGllY2VJbWFnZSBtYXNrOworICAgICAgICBtYXNrLnNl
dE1hc2tEZWZhdWx0cygpOworICAgICAgICBtX3N0eWxlTWFwLm1hcE5pbmVQaWVjZUltYWdlKGlk
LCByZWZsZWN0VmFsdWUtPm1hc2soKSwgbWFzayk7CisgICAgICAgIHJlZmxlY3Rpb24tPnNldE1h
c2sobWFzayk7CisKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChyZWZsZWN0
aW9uLnJlbGVhc2UoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVNyYzogLy8gT25seSB1c2VkIGluIEBmb250LWZhY2UgcnVsZXMuCisgICAgICAgIHJldHVy
bjsKKyAgICBjYXNlIENTU1Byb3BlcnR5VW5pY29kZVJhbmdlOiAvLyBPbmx5IHVzZWQgaW4gQGZv
bnQtZmFjZSBydWxlcy4KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXJxdWVlUmVwZXRpdGlvbjogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElB
TChtYXJxdWVlTG9vcENvdW50LCBNYXJxdWVlTG9vcENvdW50KQorICAgICAgICBpZiAoIXByaW1p
dGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVJbmZpbml0ZSkKKyAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVMb29wQ291bnQoLTEpOyAvLyAtMSBtZWFucyByZXBlYXQgZm9yZXZl
ci4KKyAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpCisgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KHByaW1pdGl2ZVZhbHVlLT5n
ZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFycXVlZVNwZWVkOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklU
SUFMKG1hcnF1ZWVTcGVlZCwgTWFycXVlZVNwZWVkKQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZh
bHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoaW50IGlkZW50ID0gcHJpbWl0
aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAg
ICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTbG93OgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVTcGVlZCg1MDApOyAvLyA1MDAgbXNlYy4KKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb3JtYWw6CisgICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDg1KTsgLy8gODVtc2VjLiBUaGUgV2luSUUg
ZGVmYXVsdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVGYXN0OgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCgx
MCk7IC8vIDEwbXNlYy4gU3VwZXIgZmFzdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNUaW1lKCkpCisg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQocHJpbWl0aXZlVmFsdWUt
PmNvbXB1dGVUaW1lPGludCwgQ1NTUHJpbWl0aXZlVmFsdWU6Ok1pbGxpc2Vjb25kcz4oKSk7Cisg
ICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSAvLyBGb3Igc2Nyb2xs
YW1vdW50IHN1cHBvcnQuCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3Bl
ZWQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlSW5jcmVtZW50OiB7CisgICAgICAg
IEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVJbmNyZW1lbnQsIE1hcnF1ZWVJbmNy
ZW1lbnQpCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAg
c3dpdGNoIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZVNtYWxsOgorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJ
bmNyZW1lbnQoTGVuZ3RoKDEsIEZpeGVkKSk7IC8vIDFweC4KKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb3JtYWw6CisgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoNiwgRml4ZWQpKTsgLy8gNnB4
LiBUaGUgV2luSUUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgQ1NTVmFsdWVMYXJnZToKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRN
YXJxdWVlSW5jcmVtZW50KExlbmd0aCgzNiwgRml4ZWQpKTsgLy8gMzZweC4KKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IExlbmd0aCBtYXJxdWVlTGVuZ3RoID0gY29udmVydFRvSW50TGVuZ3RoKHByaW1pdGl2ZVZhbHVl
LCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOworICAgICAgICAgICAg
aWYgKCFtYXJxdWVlTGVuZ3RoLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChtYXJxdWVlTGVuZ3RoKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2NhbGU6
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobG9jYWxlLCBMb2NhbGUpOwor
ICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQorICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TG9jYWxlKG51bGxBdG9tKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TG9jYWxlKHByaW1pdGl2ZVZhbHVlLT5nZXRT
dHJpbmdWYWx1ZSgpKTsKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9
IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24oc3RhdGUuc3R5
bGUoKS0+bG9jYWxlKCkpKTsKKyAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgRU5BQkxFKERBU0hCT0FSRF9TVVBQ
T1JUKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXREYXNoYm9hcmRSZWdpb246CisgICAgewor
ICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChkYXNoYm9hcmRSZWdpb25zLCBEYXNo
Ym9hcmRSZWdpb25zKQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZU5vbmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lv
bnMoUmVuZGVyU3R5bGU6Om5vbmVEYXNoYm9hcmRSZWdpb25zKCkpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisKKyAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiByZWdpb24gPSBwcmlt
aXRpdmVWYWx1ZS0+Z2V0RGFzaGJvYXJkUmVnaW9uVmFsdWUoKTsKKyAgICAgICAgaWYgKCFyZWdp
b24pCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRGFzaGJvYXJkUmVnaW9uKiBmaXJz
dCA9IHJlZ2lvbjsKKyAgICAgICAgd2hpbGUgKHJlZ2lvbikgeworICAgICAgICAgICAgTGVuZ3Ro
IHRvcCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnRvcCgpLCBzdGF0ZS5zdHlsZSgpLCBz
dGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOworICAgICAgICAgICAgTGVuZ3RoIHJpZ2h0ID0gY29u
dmVydFRvSW50TGVuZ3RoKHJlZ2lvbi0+cmlnaHQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCBib3R0b20gPSBjb252ZXJ0VG9J
bnRMZW5ndGgocmVnaW9uLT5ib3R0b20oKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1l
bnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCBsZWZ0ID0gY29udmVydFRvSW50TGVuZ3Ro
KHJlZ2lvbi0+bGVmdCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkp
OworCisgICAgICAgICAgICBpZiAodG9wLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAg
dG9wID0gTGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAocmlnaHQuaXNVbmRlZmluZWQoKSkKKyAg
ICAgICAgICAgICAgICByaWdodCA9IExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGJvdHRvbS5p
c1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIGJvdHRvbSA9IExlbmd0aCgpOworICAgICAg
ICAgICAgaWYgKGxlZnQuaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBsZWZ0ID0gTGVu
Z3RoKCk7CisKKyAgICAgICAgICAgIGlmIChyZWdpb24tPm1faXNDaXJjbGUpCisgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFzaGJvYXJkUmVn
aW9uOjpDaXJjbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBy
ZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOworICAgICAgICAgICAgZWxzZSBpZiAocmVn
aW9uLT5tX2lzUmVjdGFuZ2xlKQorICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERh
c2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6UmVjdGFuZ2xlLCByZWdpb24tPm1f
bGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2Ug
OiB0cnVlKTsKKyAgICAgICAgICAgIHJlZ2lvbiA9IHJlZ2lvbi0+bV9uZXh0LmdldCgpOworICAg
ICAgICB9CisKKyAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVnaW9u
cyh0cnVlKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisjaWYgRU5BQkxFKERS
QUdHQUJMRV9SRUdJT04pCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFwcFJlZ2lvbjogewor
ICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlIHx8ICFwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQo
KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RHJhZ2dh
YmxlUmVnaW9uTW9kZShwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURyYWcg
PyBEcmFnZ2FibGVSZWdpb25EcmFnIDogRHJhZ2dhYmxlUmVnaW9uTm9EcmFnKTsKKyAgICAgICAg
c3RhdGUuZG9jdW1lbnQoKS0+c2V0SGFzQW5ub3RhdGVkUmVnaW9ucyh0cnVlKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ry
b2tlV2lkdGg6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dFN0cm9r
ZVdpZHRoLCBUZXh0U3Ryb2tlV2lkdGgpCisgICAgICAgIGZsb2F0IHdpZHRoID0gMDsKKyAgICAg
ICAgc3dpdGNoIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICBjYXNlIENT
U1ZhbHVlVGhpbjoKKyAgICAgICAgY2FzZSBDU1NWYWx1ZU1lZGl1bToKKyAgICAgICAgY2FzZSBD
U1NWYWx1ZVRoaWNrOiB7CisgICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gMS4wIC8gNDg7Cisg
ICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVNZWRp
dW0pCisgICAgICAgICAgICAgICAgcmVzdWx0ICo9IDM7CisgICAgICAgICAgICBlbHNlIGlmIChw
cmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVRoaWNrKQorICAgICAgICAgICAg
ICAgIHJlc3VsdCAqPSA1OworICAgICAgICAgICAgd2lkdGggPSBDU1NQcmltaXRpdmVWYWx1ZTo6
Y3JlYXRlKHJlc3VsdCwgQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19FTVMpLT5jb21wdXRlTGVuZ3Ro
PGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIHdpZHRoID0gcHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0
U3Ryb2tlV2lkdGgod2lkdGgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUcmFuc2Zvcm06IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwodHJhbnNmb3JtLCBUcmFuc2Zvcm0pOworICAgICAgICBUcmFuc2Zvcm1PcGVyYXRpb25z
IG9wZXJhdGlvbnM7CisgICAgICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFsdWUsIHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3BlcmF0aW9ucyk7CisgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldFRyYW5zZm9ybShvcGVyYXRpb25zKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmU6IHsKKyAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocGVyc3BlY3RpdmUsIFBlcnNwZWN0aXZl
KQorCisgICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkg
eworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUoMCk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCBwZXJzcGVjdGl2ZVZhbHVl
OworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgICAgICBw
ZXJzcGVjdGl2ZVZhbHVlID0gcHJpbWl0aXZlVmFsdWUtPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0
YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAg
ICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAv
LyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdHJlYXQgdmFsdWVsZXNzIG51bWJlcnMgYXMg
cHguCisgICAgICAgICAgICBwZXJzcGVjdGl2ZVZhbHVlID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNy
ZWF0ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSwgQ1NTUHJpbWl0aXZlVmFsdWU6
OkNTU19QWCktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGlmIChwZXJzcGVjdGl2ZVZhbHVlID49IDAuMGYpCisgICAgICAg
ICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZVZhbHVlKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogeworICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTCh0YXBIaWdobGlnaHRDb2xvciwgVGFwSGlnaGxpZ2h0Q29sb3IpOwor
ICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAg
ICAgQ29sb3IgY29sID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUocHJpbWl0aXZlVmFsdWUpOwor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUYXBIaWdobGlnaHRDb2xvcihjb2wpOworICAgICAg
ICByZXR1cm47CisgICAgfQorI2VuZGlmCisjaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJGTE9X
X1NDUk9MTElORykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodXNlVG91Y2hPdmVyZmxvd1Nj
cm9sbGluZywgVXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyk7CisgICAgICAgIGlmICghcHJpbWl0
aXZlVmFsdWUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZyhwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBD
U1NWYWx1ZVRvdWNoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlJbnZhbGlkOgorICAgICAgICByZXR1cm47CisgICAgLy8gRGlyZWN0aW9uYWwg
cHJvcGVydGllcyBhcmUgcmVzb2x2ZWQgYnkgcmVzb2x2ZURpcmVjdGlvbkF3YXJlUHJvcGVydHko
KSBiZWZvcmUgdGhlIHN3aXRjaC4KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5k
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZFN0eWxlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Qm9yZGVyU3RhcnRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
U3RhcnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnRXaWR0aDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlQ29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3JkZXJCZWZvcmVXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
QWZ0ZXJDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJTdHlsZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQWZ0ZXJXaWR0aDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFyZ2luRW5kOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJn
aW5TdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQmVmb3JlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFyZ2luQmVmb3JlQ29sbGFwc2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdp
blRvcENvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5BZnRlckNvbGxh
cHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Cb3R0b21Db2xsYXBzZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0VuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0UGFkZGluZ1N0YXJ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nQmVm
b3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nQWZ0ZXI6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdExvZ2ljYWxXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TG9naWNhbEhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbFdpZHRo
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsSGVpZ2h0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXhMb2dpY2FsV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1heExvZ2ljYWxIZWlnaHQ6CisgICAgeworICAgICAgICBDU1NQcm9wZXJ0eUlEIG5ld0lk
ID0gQ1NTUHJvcGVydHk6OnJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KGlkLCBzdGF0ZS5z
dHlsZSgpLT5kaXJlY3Rpb24oKSwgc3RhdGUuc3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7CisgICAg
ICAgIEFTU0VSVChuZXdJZCAhPSBpZCk7CisgICAgICAgIHJldHVybiBhcHBseVByb3BlcnR5KG5l
d0lkLCB2YWx1ZSk7CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U3RyZXRjaDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5UGFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJv
dWdoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4
dExpbmVUaHJvdWdoU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmU6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRPdmVybGluZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVN
b2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5VGV4dE92ZXJsaW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRl
cmxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dFVuZGVybGluZU1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRV
bmRlcmxpbmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZVdpZHRoOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250U2l6ZURlbHRhOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbnNJbkVmZmVjdDoKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gQ1NTIFRleHQgTGF5b3V0IE1vZHVsZSBMZXZlbCAzOiBWZXJ0aWNhbCB3cml0aW5nIHN1
cHBvcnQKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JpdGluZ01vZGU6IHsKKyAgICAgICAg
SEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwod3JpdGluZ01vZGUsIFdyaXRpbmdNb2RlKTsKKyAg
ICAgICAgCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHNldFdyaXRp
bmdNb2RlKCpwcmltaXRpdmVWYWx1ZSk7CisKKyAgICAgICAgLy8gRklYTUU6IEl0IGlzIG5vdCBv
ayB0byBtb2RpZnkgZG9jdW1lbnQgc3RhdGUgd2hpbGUgYXBwbHlpbmcgc3R5bGUuCisgICAgICAg
IGlmIChzdGF0ZS5lbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50
KCktPmRvY3VtZW50RWxlbWVudCgpKQorICAgICAgICAgICAgc3RhdGUuZG9jdW1lbnQoKS0+c2V0
V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudCh0cnVlKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0T3JpZW50YXRpb246IHsKKyAg
ICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwodGV4dE9yaWVudGF0aW9uLCBUZXh0T3Jp
ZW50YXRpb24pOworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHNl
dFRleHRPcmllbnRhdGlvbigqcHJpbWl0aXZlVmFsdWUpOworCisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJveENvbnRhaW46IHsKKyAgICAg
ICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobGluZUJveENvbnRhaW4sIExpbmVCb3hDb250
YWluKQorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRM
aW5lQm94Q29udGFpbihMaW5lQm94Q29udGFpbk5vbmUpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNDU1NMaW5lQm94Q29udGFpblZhbHVl
KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQ1NTTGluZUJveENvbnRhaW5WYWx1
ZSogbGluZUJveENvbnRhaW5WYWx1ZSA9IHN0YXRpY19jYXN0PENTU0xpbmVCb3hDb250YWluVmFs
dWUqPih2YWx1ZSk7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250YWluKGxp
bmVCb3hDb250YWluVmFsdWUtPnZhbHVlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gQ1NTIEZvbnRzIE1vZHVsZSBMZXZlbCAzCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEZvbnRGZWF0dXJlU2V0dGluZ3M6IHsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9ybWFsKSB7CisgICAgICAgICAg
ICBzZXRGb250RGVzY3JpcHRpb24oc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCkubWFr
ZU5vcm1hbEZlYXR1cmVTZXR0aW5ncygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorCisgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0
eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBz
dGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPih2YWx1ZSk7CisgICAgICAgIFJlZlB0cjxGb250RmVh
dHVyZVNldHRpbmdzPiBzZXR0aW5ncyA9IEZvbnRGZWF0dXJlU2V0dGluZ3M6OmNyZWF0ZSgpOwor
ICAgICAgICBpbnQgbGVuID0gbGlzdC0+bGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gbGlzdC0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAgICAgICAgICAgIGlmICghaXRlbS0+aXNGb250RmVh
dHVyZVZhbHVlKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBGb250
RmVhdHVyZVZhbHVlKiBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8Rm9udEZlYXR1cmVWYWx1ZSo+KGl0
ZW0pOworICAgICAgICAgICAgc2V0dGluZ3MtPmFwcGVuZChGb250RmVhdHVyZShmZWF0dXJlLT50
YWcoKSwgZmVhdHVyZS0+dmFsdWUoKSkpOworICAgICAgICB9CisgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRGZWF0dXJlU2V0dGluZ3Moc2V0dGluZ3MucmVsZWFzZSgpKTsKKyAgICAgICAgc2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZp
bHRlcjogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChmaWx0ZXIsIEZpbHRl
cik7CisgICAgICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICAgICAgaWYgKGNy
ZWF0ZUZpbHRlck9wZXJhdGlvbnModmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSwgb3BlcmF0aW9ucykpCisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRG
aWx0ZXIob3BlcmF0aW9ucyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZENvbHVtbnM6IHsKKyAgICAgICAgVmVjdG9yPEdyaWRU
cmFja1NpemU+IHRyYWNrU2l6ZXM7CisgICAgICAgIGlmICghY3JlYXRlR3JpZFRyYWNrTGlzdCh2
YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRHcmlkQ29sdW1ucyh0cmFja1NpemVzKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFJvd3M6IHsKKyAgICAgICAg
VmVjdG9yPEdyaWRUcmFja1NpemU+IHRyYWNrU2l6ZXM7CisgICAgICAgIGlmICghY3JlYXRlR3Jp
ZFRyYWNrTGlzdCh2YWx1ZSwgdHJhY2tTaXplcywgc3RhdGUpKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkUm93cyh0cmFja1NpemVzKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkU3RhcnQ6
IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIHN0YXJ0UG9zaXRpb247CisgICAgICAgIGlmICghY3Jl
YXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBzdGFydFBvc2l0aW9uKSkKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1TdGFydChzdGFydFBvc2l0aW9u
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3Jp
ZEVuZDogeworICAgICAgICBHcmlkUG9zaXRpb24gZW5kUG9zaXRpb247CisgICAgICAgIGlmICgh
Y3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBlbmRQb3NpdGlvbikpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtRW5kKGVuZFBvc2l0aW9uKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlk
QmVmb3JlOiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBiZWZvcmVQb3NpdGlvbjsKKyAgICAgICAg
aWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUsIGJlZm9yZVBvc2l0aW9uKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1CZWZvcmUoYmVm
b3JlUG9zaXRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRHcmlkQWZ0ZXI6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIGFmdGVyUG9zaXRpb247
CisgICAgICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBhZnRlclBvc2l0aW9uKSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZEl0ZW1B
ZnRlcihhZnRlclBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRo
ZXNlIHByb3BlcnRpZXMgYXJlIGFsaWFzZWQgYW5kIFN0eWxlQnVpbGRlciBhbHJlYWR5IGFwcGxp
ZWQgdGhlIHByb3BlcnR5IG9uIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLgorICAgIGNhc2UgQ1NTUHJv
cGVydHlUcmFuc2l0aW9uRGVsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25EdXJh
dGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblByb3BlcnR5OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlUcmFuc2l0aW9uVGltaW5nRnVuY3Rpb246CisgICAgICAgIHJldHVybjsKKyAg
ICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgU3R5bGVCdWlsZGVy
IGxvb2t1cCB0YWJsZS4KKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5QmFja2dyb3VuZFBvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBv
c2l0aW9uWToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUxlZnRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJC
b3R0b21TdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tV2lkdGg6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJJbWFnZU91dHNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VSZXBlYXQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlU2xpY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckltYWdlU291cmNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVdpZHRo
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlckxlZnRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRo
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJSaWdodFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyVG9wTGVmdFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9w
UmlnaHRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFN0eWxlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm90dG9t
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3hTaXppbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNh
cHRpb25TaWRlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlDbGVhcjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Q2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUNvdW50ZXJJbmNyZW1lbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvdW50ZXJSZXNldDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Q3Vyc29yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlEaXJlY3Rpb246
CisgICAgY2FzZSBDU1NQcm9wZXJ0eURpc3BsYXk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUVtcHR5
Q2VsbHM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZsb2F0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlG
b250U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlGb250VmFyaWFudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5SGVpZ2h0OgorI2lmIEVOQUJMRShDU1NfSU1BR0VfT1JJRU5UQVRJT04p
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUltYWdlT3JpZW50YXRpb246CisjZW5kaWYKKyAgICBjYXNl
IENTU1Byb3BlcnR5SW1hZ2VSZW5kZXJpbmc6CisjaWYgRU5BQkxFKENTU19JTUFHRV9SRVNPTFVU
SU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZVJlc29sdXRpb246CisjZW5kaWYKKyAgICBj
YXNlIENTU1Byb3BlcnR5TGVmdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGV0dGVyU3BhY2luZzoK
KyAgICBjYXNlIENTU1Byb3BlcnR5TGluZUhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TGlz
dFN0eWxlSW1hZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZVBvc2l0aW9uOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVUeXBlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJn
aW5Cb3R0b206CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkxlZnQ6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eU1hcmdpblJpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5Ub3A6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eU1heEhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWF4V2lkdGg6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1pbkhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWlu
V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU9ycGhhbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5T3V0bGluZU9mZnNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU92ZXJmbG93V3JhcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dYOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlPdmVyZmxvd1k6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0b206
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQ
YWRkaW5nUmlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdUb3A6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVBhZ2VCcmVha0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtC
ZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0luc2lkZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5UG9pbnRlckV2ZW50czoKKyAgICBjYXNlIENTU1Byb3BlcnR5UG9zaXRpb246Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVJlc2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5UmlnaHQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVNwZWFrOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlUYWJTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUYWJsZUxheW91
dDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEFsaWduOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0RGVjb3JhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dEluZGVudDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5VGV4dE92ZXJmbG93OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0UmVuZGVy
aW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VHJhbnNmb3JtOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlUb3A6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpOgorI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlWYXJpYWJsZToKKyNlbmRpZgorICAg
IGNhc2UgQ1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduOgorICAgIGNhc2UgQ1NTUHJvcGVydHlWaXNp
YmlsaXR5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25EZWxheToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBbmltYXRpb25EdXJhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QW5pbWF0aW9uRmlsbE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkl0
ZXJhdGlvbkNvdW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25OYW1lOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25QbGF5U3RhdGU6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBcHBlYXJhbmNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBc3BlY3RS
YXRpbzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QmFja2dyb3VuZENvbXBvc2l0ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QmFja2dyb3VuZE9yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZFNp
emU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckZpdDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJWZXJ0
aWNhbFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEFsaWduOgorI2lmIEVO
QUJMRShDU1NfQk9YX0RFQ09SQVRJT05fQlJFQUspCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJveERlY29yYXRpb25CcmVhazoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
b3hEaXJlY3Rpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEZsZXg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEJveEZsZXhHcm91cDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94TGluZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yZGluYWxHcm91cDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94T3JpZW50OgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRCb3hQYWNrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2xvckNvcnJlY3Rp
b246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkF4aXM6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dENvbHVtbkJyZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVh
a0luc2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQ291bnQ6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkdhcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Q29sdW1uUHJvZ3Jlc3Npb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVD
b2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVN0eWxlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdENvbHVtblNwYW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbldpZHRo
OgorI2lmIEVOQUJMRShDVVJTT1JfVklTSUJJTElUWSkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Q3Vyc29yVmlzaWJpbGl0eToKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bGlnbkNvbnRlbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduSXRlbXM6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduU2VsZjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0RmxleEJhc2lzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4RGlyZWN0aW9uOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4R3JvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0RmxleFNocmluazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleFdyYXA6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEp1c3RpZnlDb250ZW50OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRPcmRlcjoKKyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEZsb3dGcm9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbG93SW50
bzoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250S2VybmluZzoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNtb290aGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0Rm9udFZhcmlhbnRMaWdhdHVyZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEhp
Z2hsaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlQ2hhcmFjdGVyOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEFmdGVyOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1pdEJlZm9yZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0SHlwaGVuYXRlTGltaXRMaW5lczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
SHlwaGVuczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUFsaWduOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRMaW5lQnJlYWs6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExp
bmVDbGFtcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUdyaWQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdExpbmVTbmFwOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJx
dWVlRGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3R5bGU6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza0JveEltYWdlT3V0c2V0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrQm94SW1hZ2VSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFn
ZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTb3VyY2U6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVdpZHRoOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXNrQ2xpcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0Nv
bXBvc2l0ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0ltYWdlOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRNYXNrT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrUG9zaXRpb25YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb25ZOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza1JlcGVhdFk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tTaXpl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXROYnNwTW9kZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBl
cnNwZWN0aXZlT3JpZ2luWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVP
cmlnaW5ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQcmludENvbG9yQWRqdXN0OgorI2lm
IEVOQUJMRShDU1NfUkVHSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJl
YWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UmVnaW9uQnJlYWtCZWZvcmU6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrSW5zaWRlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRSZWdpb25PdmVyZmxvdzoKKyNlbmRpZgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRSdGxPcmRlcmluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UnVieVBvc2l0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0Q29tYmluZToKKyNpZiBFTkFCTEUo
Q1NTM19URVhUKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvbkxpbmU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRBbGlnbkxhc3Q6CisjZW5kaWYgLy8gQ1NTM19URVhUCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBoYXNpc0NvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNQb3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VGV4dEVtcGhhc2lzU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRG
aWxsQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTZWN1cml0eToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5YOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2Zvcm1PcmlnaW5ZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5a
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1TdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRUcmFuc2l0aW9uRHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRp
b25Qcm9wZXJ0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvblRpbWluZ0Z1
bmN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyRHJhZzoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VXNlck1vZGlmeToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNl
clNlbGVjdDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q2xpcFBhdGg6CisjaWYgRU5BQkxF
KENTU19FWENMVVNJT05TKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwRmxvdzoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVNYXJnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFNoYXBlUGFkZGluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcFRocm91
Z2g6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlSW5zaWRlOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRTaGFwZU91dHNpZGU6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2hpdGVTcGFjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2lkb3dzOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V29yZEJyZWFrOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXb3JkU3BhY2luZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5V29yZFdyYXA6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVpJbmRleDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Wm9vbToKKyNpZiBF
TkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhab29t
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5ab29tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcmll
bnRhdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VXNlclpvb206CisjZW5kaWYKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorI2lm
IEVOQUJMRShTVkcpCisgICAgICAgIC8vIFRyeSB0aGUgU1ZHIHByb3BlcnRpZXMKKyAgICAgICAg
YXBwbHlTVkdQcm9wZXJ0eShpZCwgdmFsdWUpOworI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAg
ICB9Cit9CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVJbWFn
ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NWYWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHZh
bHVlLT5pc0ltYWdlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGNhY2hlZE9yUGVuZGluZ0Zyb21W
YWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisKKyAg
ICBpZiAodmFsdWUtPmlzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7CisgICAgICAgIGlmICh2YWx1
ZS0+aXNHcmFkaWVudFZhbHVlKCkpCisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5k
aW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4odmFs
dWUpLT5ncmFkaWVudFdpdGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSk7CisgICAgICAgIHJl
dHVybiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENT
U0ltYWdlR2VuZXJhdG9yVmFsdWUqPih2YWx1ZSkpOworICAgIH0KKworI2lmIEVOQUJMRShDU1Nf
SU1BR0VfU0VUKQorICAgIGlmICh2YWx1ZS0+aXNJbWFnZVNldFZhbHVlKCkpCisgICAgICAgIHJl
dHVybiBzZXRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdl
U2V0VmFsdWUqPih2YWx1ZSkpOworI2VuZGlmCisKKyAgICBpZiAodmFsdWUtPmlzQ3Vyc29ySW1h
Z2VWYWx1ZSgpKQorICAgICAgICByZXR1cm4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKHByb3Bl
cnR5LCBzdGF0aWNfY2FzdDxDU1NDdXJzb3JJbWFnZVZhbHVlKj4odmFsdWUpKTsKKworICAgIHJl
dHVybiAwOworfQorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmNhY2hl
ZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVZhbHVl
KiB2YWx1ZSkKK3sKKyAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVk
T3JQZW5kaW5nSW1hZ2UoKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdl
KCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0
eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8
U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Z2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENT
U1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIHZhbHVlKQorewor
ICAgIGlmICh2YWx1ZS0+aXNQZW5kaW5nKCkpIHsKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1h
Z2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBTdHls
ZVBlbmRpbmdJbWFnZTo6Y3JlYXRlKHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIFN0eWxlR2Vu
ZXJhdGVkSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NF
VCkKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6c2V0T3JQZW5kaW5nRnJv
bVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlU2V0VmFsdWUqIHZhbHVlKQor
eworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJ
bWFnZVNldChkb2N1bWVudCgpKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0lt
YWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9w
ZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisjZW5kaWYKKwor
UGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjdXJzb3JPclBlbmRpbmdGcm9t
VmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogdmFsdWUp
Cit7CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGlu
Z0ltYWdlKGRvY3VtZW50KCkpOworICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1h
Z2UoKSkKKyAgICAgICAgbV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3Bl
cnR5LCB2YWx1ZSk7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjpjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgaWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgPT0g
cGFyZW50U3R5bGUtPmVmZmVjdGl2ZVpvb20oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29u
c3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7
CisgICAgRm9udERlc2NyaXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOworICAg
IHNldEZvbnRTaXplKG5ld0ZvbnREZXNjcmlwdGlvbiwgY2hpbGRGb250LnNwZWNpZmllZFNpemUo
KSk7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250RGVzY3JpcHRpb24pOwor
fQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5k
ZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKK3sKKyAgICBjb25zdCBG
b250RGVzY3JpcHRpb24mIGNoaWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKwor
ICAgIGlmIChjaGlsZEZvbnQuaXNBYnNvbHV0ZVNpemUoKSB8fCAhcGFyZW50U3R5bGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udCA9IHBh
cmVudFN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoY2hpbGRGb250LnVzZUZpeGVk
RGVmYXVsdFNpemUoKSA9PSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVsdFNpemUoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gRm9yIG5vdywgbHVtcCBhbGwgZmFtaWxpZXMgYnV0IG1vbm9z
cGFjZSB0b2dldGhlci4KKyAgICBpZiAoY2hpbGRGb250LmdlbmVyaWNGYW1pbHkoKSAhPSBGb250
RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseQorICAgICAgICAmJiBwYXJlbnRGb250LmdlbmVy
aWNGYW1pbHkoKSAhPSBGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gV2Uga25vdyB0aGUgcGFyZW50IGlzIG1vbm9zcGFjZSBvciB0aGUg
Y2hpbGQgaXMgbW9ub3NwYWNlLCBhbmQgdGhhdCBmb250CisgICAgLy8gc2l6ZSB3YXMgdW5zcGVj
aWZpZWQuIFdlIHdhbnQgdG8gc2NhbGUgb3VyIGZvbnQgc2l6ZSBhcyBhcHByb3ByaWF0ZS4KKyAg
ICAvLyBJZiB0aGUgZm9udCB1c2VzIGEga2V5d29yZCBzaXplLCB0aGVuIHdlIHJlZmV0Y2ggZnJv
bSB0aGUgdGFibGUgcmF0aGVyIHRoYW4KKyAgICAvLyBtdWx0aXBseWluZyBieSBvdXIgc2NhbGUg
ZmFjdG9yLgorICAgIGZsb2F0IHNpemU7CisgICAgaWYgKGNoaWxkRm9udC5rZXl3b3JkU2l6ZSgp
KQorICAgICAgICBzaXplID0gZm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50KCksIENTU1ZhbHVl
WHhTbWFsbCArIGNoaWxkRm9udC5rZXl3b3JkU2l6ZSgpIC0gMSwgY2hpbGRGb250LnVzZUZpeGVk
RGVmYXVsdFNpemUoKSk7CisgICAgZWxzZSB7CisgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9
IGRvY3VtZW50U2V0dGluZ3MoKTsKKyAgICAgICAgZmxvYXQgZml4ZWRTY2FsZUZhY3RvciA9IChz
ZXR0aW5ncyAmJiBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSAmJiBzZXR0aW5ncy0+
ZGVmYXVsdEZvbnRTaXplKCkpCisgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGZsb2F0PihzZXR0
aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSkgLyBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXpl
KCkKKyAgICAgICAgICAgIDogMTsKKyAgICAgICAgc2l6ZSA9IHBhcmVudEZvbnQudXNlRml4ZWRE
ZWZhdWx0U2l6ZSgpID8KKyAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgp
IC8gZml4ZWRTY2FsZUZhY3RvciA6CisgICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmll
ZFNpemUoKSAqIGZpeGVkU2NhbGVGYWN0b3I7CisgICAgfQorCisgICAgRm9udERlc2NyaXB0aW9u
IG5ld0ZvbnREZXNjcmlwdGlvbihjaGlsZEZvbnQpOworICAgIHNldEZvbnRTaXplKG5ld0ZvbnRE
ZXNjcmlwdGlvbiwgc2l6ZSk7CisgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihuZXdGb250
RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRpYWxpemVGb250U3R5
bGUoU2V0dGluZ3MqIHNldHRpbmdzKQoreworICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3Jp
cHRpb247CisgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpTdGFuZGFyZEZhbWlseSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01v
ZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdNb2RlKCkpOworICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRVc2VQcmludGVyRm9udChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2Ny
ZWVuRm9udFN1YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBz
dGFuZGFyZEZvbnRGYW1pbHkgPSBkb2N1bWVudFNldHRpbmdzKCktPnN0YW5kYXJkRm9udEZhbWls
eSgpOworICAgIGlmICghc3RhbmRhcmRGb250RmFtaWx5LmlzRW1wdHkoKSkgeworICAgICAgICBm
b250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250RmFtaWx5
KTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuYXBwZW5kRmFtaWx5KDAp
OworICAgIH0KKyAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRp
dW0gLSBDU1NWYWx1ZVh4U21hbGwgKyAxKTsKKyAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRp
b24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2Up
KTsKKyAgICBtX3N0YXRlLnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRp
YWxMaW5lSGVpZ2h0KCkpOworICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAg
IHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OnNldEZvbnRTaXplKEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9h
dCBzaXplKQoreworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOwor
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoZ2V0Q29tcHV0ZWRTaXplRnJvbVNw
ZWNpZmllZFNpemUoZG9jdW1lbnQoKSwgbV9zdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24u
aXNBYnNvbHV0ZVNpemUoKSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKK30KKworZmxvYXQg
U3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQq
IGRvY3VtZW50LCBSZW5kZXJTdHlsZSogc3R5bGUsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0
IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKQoreworICAgIGZsb2F0IHpvb21G
YWN0b3IgPSAxLjBmOworICAgIGlmICghdXNlU1ZHWm9vbVJ1bGVzKSB7CisgICAgICAgIHpvb21G
YWN0b3IgPSBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgICAgICBpZiAoRnJhbWUqIGZyYW1l
ID0gZG9jdW1lbnQtPmZyYW1lKCkpCisgICAgICAgICAgICB6b29tRmFjdG9yICo9IGZyYW1lLT50
ZXh0Wm9vbUZhY3RvcigpOworICAgIH0KKworICAgIHJldHVybiBTdHlsZVJlc29sdmVyOjpnZXRD
b21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCwgem9vbUZhY3RvciwgaXNBYnNv
bHV0ZVNpemUsIHNwZWNpZmllZFNpemUpOworfQorCitmbG9hdCBTdHlsZVJlc29sdmVyOjpnZXRD
b21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIGZsb2F0IHpv
b21GYWN0b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVTbWFy
dE1pbmltdW1Gb3JGb250U2l6ZSB1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSkKK3sKKyAgICAv
LyBUZXh0IHdpdGggYSAwcHggZm9udCBzaXplIHNob3VsZCBub3QgYmUgdmlzaWJsZSBhbmQgdGhl
cmVmb3JlIG5lZWRzIHRvIGJlCisgICAgLy8gZXhlbXB0IGZyb20gbWluaW11bSBmb250IHNpemUg
cnVsZXMuIEFjaWQzIHJlbGllcyBvbiB0aGlzIGZvciBwaXhlbC1wZXJmZWN0CisgICAgLy8gcmVu
ZGVyaW5nLiBUaGlzIGlzIGFsc28gY29tcGF0aWJsZSB3aXRoIG90aGVyIGJyb3dzZXJzIHRoYXQg
aGF2ZSBtaW5pbXVtCisgICAgLy8gZm9udCBzaXplIHNldHRpbmdzIChlLmcuIEZpcmVmb3gpLgor
ICAgIGlmIChmYWJzZihzcGVjaWZpZWRTaXplKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+
OjplcHNpbG9uKCkpCisgICAgICAgIHJldHVybiAwLjBmOworCisgICAgLy8gV2Ugc3VwcG9ydCB0
d28gdHlwZXMgb2YgbWluaW11bSBmb250IHNpemUuIFRoZSBmaXJzdCBpcyBhIGhhcmQgb3ZlcnJp
ZGUgdGhhdCBhcHBsaWVzIHRvCisgICAgLy8gYWxsIGZvbnRzLiBUaGlzIGlzICJtaW5TaXplLiIg
VGhlIHNlY29uZCB0eXBlIG9mIG1pbmltdW0gZm9udCBzaXplIGlzIGEgInNtYXJ0IG1pbmltdW0i
CisgICAgLy8gdGhhdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgV2ViIHBhZ2UgY2FuJ3Qga25v
dyB3aGF0IHNpemUgaXQgcmVhbGx5IGFza2VkIGZvciwgZS5nLiwKKyAgICAvLyB3aGVuIGl0IHVz
ZXMgbG9naWNhbCBzaXplcyBsaWtlICJzbWFsbCIgb3IgZXhwcmVzc2VzIHRoZSBmb250LXNpemUg
YXMgYSBwZXJjZW50YWdlIG9mCisgICAgLy8gdGhlIHVzZXIncyBkZWZhdWx0IGZvbnQgc2V0dGlu
Zy4KKworICAgIC8vIFdpdGggdGhlIHNtYXJ0IG1pbmltdW0sIHdlIG5ldmVyIHdhbnQgdG8gZ2V0
IHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBmb250IHNpemUgdG8ga2VlcCBmb250cyByZWFkYWJs
ZS4KKyAgICAvLyBIb3dldmVyIHdlIGFsd2F5cyBhbGxvdyB0aGUgcGFnZSB0byBzZXQgYW4gZXhw
bGljaXQgcGl4ZWwgc2l6ZSB0aGF0IGlzIHNtYWxsZXIsCisgICAgLy8gc2luY2Ugc2l0ZXMgd2ls
bCBtaXMtcmVuZGVyIG90aGVyd2lzZSAoZS5nLiwgaHR0cDovL3d3dy5nYW1lc3BvdC5jb20gd2l0
aCBhIDlweCBtaW5pbXVtKS4KKworICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5z
ZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgIHJldHVybiAxLjBmOworCisg
ICAgaW50IG1pblNpemUgPSBzZXR0aW5ncy0+bWluaW11bUZvbnRTaXplKCk7CisgICAgaW50IG1p
bkxvZ2ljYWxTaXplID0gc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKTsKKyAgICBm
bG9hdCB6b29tZWRTaXplID0gc3BlY2lmaWVkU2l6ZSAqIHpvb21GYWN0b3I7CisKKyAgICAvLyBB
cHBseSB0aGUgaGFyZCBtaW5pbXVtIGZpcnN0LiBXZSBvbmx5IGFwcGx5IHRoZSBoYXJkIG1pbmlt
dW0gaWYgYWZ0ZXIgem9vbWluZyB3ZSdyZSBzdGlsbCB0b28gc21hbGwuCisgICAgaWYgKHpvb21l
ZFNpemUgPCBtaW5TaXplKQorICAgICAgICB6b29tZWRTaXplID0gbWluU2l6ZTsKKworICAgIC8v
IE5vdyBhcHBseSB0aGUgInNtYXJ0IG1pbmltdW0uIiBUaGlzIG1pbmltdW0gaXMgYWxzbyBvbmx5
IGFwcGxpZWQgaWYgd2UncmUgc3RpbGwgdG9vIHNtYWxsCisgICAgLy8gYWZ0ZXIgem9vbWluZy4g
VGhlIGZvbnQgc2l6ZSBtdXN0IGVpdGhlciBiZSByZWxhdGl2ZSB0byB0aGUgdXNlciBkZWZhdWx0
IG9yIHRoZSBvcmlnaW5hbCBzaXplCisgICAgLy8gbXVzdCBoYXZlIGJlZW4gYWNjZXB0YWJsZS4g
SW4gb3RoZXIgd29yZHMsIHdlIG9ubHkgYXBwbHkgdGhlIHNtYXJ0IG1pbmltdW0gd2hlbmV2ZXIg
d2UncmUgcG9zaXRpdmUKKyAgICAvLyBkb2luZyBzbyB3b24ndCBkaXNydXB0IHRoZSBsYXlvdXQu
CisgICAgaWYgKHVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplICYmIHpvb21lZFNpemUgPCBtaW5M
b2dpY2FsU2l6ZSAmJiAoc3BlY2lmaWVkU2l6ZSA+PSBtaW5Mb2dpY2FsU2l6ZSB8fCAhaXNBYnNv
bHV0ZVNpemUpKQorICAgICAgICB6b29tZWRTaXplID0gbWluTG9naWNhbFNpemU7CisKKyAgICAv
LyBBbHNvIGNsYW1wIHRvIGEgcmVhc29uYWJsZSBtYXhpbXVtIHRvIHByZXZlbnQgaW5zYW5lIGZv
bnQgc2l6ZXMgZnJvbSBjYXVzaW5nIGNyYXNoZXMgb24gdmFyaW91cworICAgIC8vIHBsYXRmb3Jt
cyAoSSdtIGxvb2tpbmcgYXQgeW91LCBXaW5kb3dzLikKKyAgICByZXR1cm4gbWluKG1heGltdW1B
bGxvd2VkRm9udFNpemUsIHpvb21lZFNpemUpOworfQorCitjb25zdCBpbnQgZm9udFNpemVUYWJs
ZU1heCA9IDE2OworY29uc3QgaW50IGZvbnRTaXplVGFibGVNaW4gPSA5OworY29uc3QgaW50IHRv
dGFsS2V5d29yZHMgPSA4OworCisvLyBXaW5JRS9OYXY0IHRhYmxlIGZvciBmb250IHNpemVzLiBE
ZXNpZ25lZCB0byBtYXRjaCB0aGUgbGVnYWN5IGZvbnQgbWFwcGluZyBzeXN0ZW0gb2YgSFRNTC4K
K3N0YXRpYyBjb25zdCBpbnQgcXVpcmtzRm9udFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0g
Zm9udFNpemVUYWJsZU1pbiArIDFdW3RvdGFsS2V5d29yZHNdID0KK3sKKyAgICAgIHsgOSwgICAg
OSwgICAgIDksICAgICA5LCAgICAxMSwgICAgMTQsICAgIDE4LCAgICAyOCB9LAorICAgICAgeyA5
LCAgICA5LCAgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNSwgICAgMjAsICAgIDMxIH0sCisgICAg
ICB7IDksICAgIDksICAgICA5LCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzQgfSwK
KyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAz
NyB9LAorICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYs
ICAgIDQwIH0sIC8vIGZpeGVkIGZvbnQgZGVmYXVsdCAoMTMpCisgICAgICB7IDksICAgIDksICAg
IDExLCAgICAxNCwgICAgMTcsICAgIDIxLCAgICAyOCwgICAgNDIgfSwKKyAgICAgIHsgOSwgICAx
MCwgICAgMTIsICAgIDE1LCAgICAxNywgICAgMjMsICAgIDMwLCAgICA0NSB9LAorICAgICAgeyA5
LCAgIDEwLCAgICAxMywgICAgMTYsICAgIDE4LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJv
cG9ydGlvbmFsIGZvbnQgZGVmYXVsdCAoMTYpCit9OworLy8gSFRNTCAgICAgICAxICAgICAgMiAg
ICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYgICAgICA3CisvLyBDU1MgIHh4cyAgIHhzICAgICBz
ICAgICAgbSAgICAgIGwgICAgIHhsICAgICB4eGwKKy8vICAgICAgICAgICAgICAgICAgICAgICAg
ICB8CisvLyAgICAgICAgICAgICAgICAgICAgICB1c2VyIHByZWYKKworLy8gU3RyaWN0IG1vZGUg
dGFibGUgbWF0Y2hlcyBNYWNJRSBhbmQgTW96aWxsYSdzIHNldHRpbmdzIGV4YWN0bHkuCitzdGF0
aWMgY29uc3QgaW50IHN0cmljdEZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRT
aXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Cit7CisgICAgICB7IDksICAgIDksICAg
ICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjcgfSwKKyAgICAgIHsgOSwgICAg
OSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMCB9LAorICAgICAgeyA5
LCAgICA5LCAgICAxMCwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDMzIH0sCisgICAg
ICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzYgfSwK
KyAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICAz
OSB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQorICAgICAgeyA5LCAgIDEwLCAgICAxMiwg
ICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCisgICAgICB7IDksICAgMTAsICAg
IDEzLCAgICAxNSwgICAgMTgsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKKyAgICAgIHsgOSwgICAx
MCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRp
b25hbCBmb250IGRlZmF1bHQgKDE2KQorfTsKKy8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAz
ICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNworLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAg
IG0gICAgICBsICAgICB4bCAgICAgeHhsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgfAor
Ly8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCisKKy8vIEZvciB2YWx1ZXMgb3V0c2lk
ZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLCB3ZSB1c2UgVG9kZCBGYWhybmVyJ3Mgc3VnZ2VzdGVk
IHNjYWxlCisvLyBmYWN0b3JzIGZvciBlYWNoIGtleXdvcmQgdmFsdWUuCitzdGF0aWMgY29uc3Qg
ZmxvYXQgZm9udFNpemVGYWN0b3JzW3RvdGFsS2V5d29yZHNdID0geyAwLjYwZiwgMC43NWYsIDAu
ODlmLCAxLjBmLCAxLjJmLCAxLjVmLCAyLjBmLCAzLjBmIH07CisKK2Zsb2F0IFN0eWxlUmVzb2x2
ZXI6OmZvbnRTaXplRm9yS2V5d29yZChEb2N1bWVudCogZG9jdW1lbnQsIGludCBrZXl3b3JkLCBi
b29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpCit7CisgICAgU2V0dGluZ3MqIHNldHRpbmdz
ID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAgICAgICAgcmV0
dXJuIDEuMGY7CisKKyAgICBib29sIHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5RdWlya3NNb2Rl
KCk7CisgICAgaW50IG1lZGl1bVNpemUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplID8gc2V0
dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXpl
KCk7CisgICAgaWYgKG1lZGl1bVNpemUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBtZWRpdW1TaXpl
IDw9IGZvbnRTaXplVGFibGVNYXgpIHsKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgZW50cnkgaW4g
dGhlIHRhYmxlLgorICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6ZSAtIGZvbnRTaXplVGFibGVN
aW47CisgICAgICAgIGludCBjb2wgPSAoa2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbCk7CisgICAg
ICAgIHJldHVybiBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVtyb3ddW2NvbF0gOiBz
dHJpY3RGb250U2l6ZVRhYmxlW3Jvd11bY29sXTsKKyAgICB9CisKKyAgICAvLyBWYWx1ZSBpcyBv
dXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgdGFibGUuIEFwcGx5IHRoZSBzY2FsZSBmYWN0b3IgaW5z
dGVhZC4KKyAgICBmbG9hdCBtaW5Mb2dpY2FsU2l6ZSA9IG1heChzZXR0aW5ncy0+bWluaW11bUxv
Z2ljYWxGb250U2l6ZSgpLCAxKTsKKyAgICByZXR1cm4gbWF4KGZvbnRTaXplRmFjdG9yc1trZXl3
b3JkIC0gQ1NTVmFsdWVYeFNtYWxsXSptZWRpdW1TaXplLCBtaW5Mb2dpY2FsU2l6ZSk7Cit9CisK
K3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW50IGZpbmROZWFyZXN0TGVnYWN5Rm9udFNp
emUoaW50IHBpeGVsRm9udFNpemUsIGNvbnN0IFQqIHRhYmxlLCBpbnQgbXVsdGlwbGllcikKK3sK
KyAgICAvLyBJZ25vcmUgdGFibGVbMF0gYmVjYXVzZSB4eC1zbWFsbCBkb2VzIG5vdCBjb3JyZXNw
b25kIHRvIGFueSBsZWdhY3kgZm9udCBzaXplLgorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdG90
YWxLZXl3b3JkcyAtIDE7IGkrKykgeworICAgICAgICBpZiAocGl4ZWxGb250U2l6ZSAqIDIgPCAo
dGFibGVbaV0gKyB0YWJsZVtpICsgMV0pICogbXVsdGlwbGllcikKKyAgICAgICAgICAgIHJldHVy
biBpOworICAgIH0KKyAgICByZXR1cm4gdG90YWxLZXl3b3JkcyAtIDE7Cit9CisKK2ludCBTdHls
ZVJlc29sdmVyOjpsZWdhY3lGb250U2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIGludCBwaXhlbEZv
bnRTaXplLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpCit7CisgICAgU2V0dGluZ3Mq
IHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7CisgICAgaWYgKCFzZXR0aW5ncykKKyAg
ICAgICAgcmV0dXJuIDE7CisKKyAgICBib29sIHF1aXJrc01vZGUgPSBkb2N1bWVudC0+aW5RdWly
a3NNb2RlKCk7CisgICAgaW50IG1lZGl1bVNpemUgPSBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXpl
ID8gc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgOiBzZXR0aW5ncy0+ZGVmYXVsdEZv
bnRTaXplKCk7CisgICAgaWYgKG1lZGl1bVNpemUgPj0gZm9udFNpemVUYWJsZU1pbiAmJiBtZWRp
dW1TaXplIDw9IGZvbnRTaXplVGFibGVNYXgpIHsKKyAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNp
emUgLSBmb250U2l6ZVRhYmxlTWluOworICAgICAgICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lG
b250U2l6ZTxpbnQ+KHBpeGVsRm9udFNpemUsIHF1aXJrc01vZGUgPyBxdWlya3NGb250U2l6ZVRh
YmxlW3Jvd10gOiBzdHJpY3RGb250U2l6ZVRhYmxlW3Jvd10sIDEpOworICAgIH0KKworICAgIHJl
dHVybiBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplPGZsb2F0PihwaXhlbEZvbnRTaXplLCBmb250
U2l6ZUZhY3RvcnMsIG1lZGl1bVNpemUpOworfQorCitzdGF0aWMgQ29sb3IgY29sb3JGb3JDU1NW
YWx1ZShpbnQgY3NzVmFsdWVJZCkKK3sKKyAgICBzdHJ1Y3QgQ29sb3JWYWx1ZSB7CisgICAgICAg
IGludCBjc3NWYWx1ZUlkOworICAgICAgICBSR0JBMzIgY29sb3I7CisgICAgfTsKKworICAgIHN0
YXRpYyBjb25zdCBDb2xvclZhbHVlIGNvbG9yVmFsdWVzW10gPSB7CisgICAgICAgIHsgQ1NTVmFs
dWVBcXVhLCAweEZGMDBGRkZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVCbGFjaywgMHhGRjAwMDAw
MCB9LAorICAgICAgICB7IENTU1ZhbHVlQmx1ZSwgMHhGRjAwMDBGRiB9LAorICAgICAgICB7IENT
U1ZhbHVlRnVjaHNpYSwgMHhGRkZGMDBGRiB9LAorICAgICAgICB7IENTU1ZhbHVlR3JheSwgMHhG
RjgwODA4MCB9LAorICAgICAgICB7IENTU1ZhbHVlR3JlZW4sIDB4RkYwMDgwMDAgIH0sCisgICAg
ICAgIHsgQ1NTVmFsdWVHcmV5LCAweEZGODA4MDgwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVMaW1l
LCAweEZGMDBGRjAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVNYXJvb24sIDB4RkY4MDAwMDAgfSwK
KyAgICAgICAgeyBDU1NWYWx1ZU5hdnksIDB4RkYwMDAwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1
ZU9saXZlLCAweEZGODA4MDAwICB9LAorICAgICAgICB7IENTU1ZhbHVlT3JhbmdlLCAweEZGRkZB
NTAwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVQdXJwbGUsIDB4RkY4MDAwODAgfSwKKyAgICAgICAg
eyBDU1NWYWx1ZVJlZCwgMHhGRkZGMDAwMCB9LAorICAgICAgICB7IENTU1ZhbHVlU2lsdmVyLCAw
eEZGQzBDMEMwIH0sCisgICAgICAgIHsgQ1NTVmFsdWVUZWFsLCAweEZGMDA4MDgwICB9LAorICAg
ICAgICB7IENTU1ZhbHVlVHJhbnNwYXJlbnQsIDB4MDAwMDAwMDAgfSwKKyAgICAgICAgeyBDU1NW
YWx1ZVdoaXRlLCAweEZGRkZGRkZGIH0sCisgICAgICAgIHsgQ1NTVmFsdWVZZWxsb3csIDB4RkZG
RkZGMDAgfSwKKyAgICAgICAgeyAwLCAwIH0KKyAgICB9OworCisgICAgZm9yIChjb25zdCBDb2xv
clZhbHVlKiBjb2wgPSBjb2xvclZhbHVlczsgY29sLT5jc3NWYWx1ZUlkOyArK2NvbCkgeworICAg
ICAgICBpZiAoY29sLT5jc3NWYWx1ZUlkID09IGNzc1ZhbHVlSWQpCisgICAgICAgICAgICByZXR1
cm4gY29sLT5jb2xvcjsKKyAgICB9CisgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhl
bWUoKS0+c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7Cit9CisKK2Jvb2wgU3R5bGVSZXNvbHZlcjo6
Y29sb3JGcm9tUHJpbWl0aXZlVmFsdWVJc0Rlcml2ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVW
YWx1ZSogdmFsdWUpCit7CisgICAgaW50IGlkZW50ID0gdmFsdWUtPmdldElkZW50KCk7CisgICAg
c3dpdGNoIChpZGVudCkgeworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgorICAgIGNhc2Ug
Q1NTVmFsdWVXZWJraXRMaW5rOgorICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRBY3RpdmVsaW5rOgor
ICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29sb3I6CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK0NvbG9yIFN0eWxl
UmVzb2x2ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiB2YWx1
ZSwgYm9vbCBmb3JWaXNpdGVkTGluaykgY29uc3QKK3sKKyAgICBpZiAodmFsdWUtPmlzUkdCQ29s
b3IoKSkKKyAgICAgICAgcmV0dXJuIENvbG9yKHZhbHVlLT5nZXRSR0JBMzJWYWx1ZSgpKTsKKwor
ICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaW50IGlkZW50ID0gdmFsdWUt
PmdldElkZW50KCk7CisgICAgc3dpdGNoIChpZGVudCkgeworICAgIGNhc2UgMDoKKyAgICAgICAg
cmV0dXJuIENvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6CisgICAgICAgIHJl
dHVybiBzdGF0ZS5kb2N1bWVudCgpLT50ZXh0Q29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Vi
a2l0TGluazoKKyAgICAgICAgcmV0dXJuIChzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpICYmIGZv
clZpc2l0ZWRMaW5rKSA/IHN0YXRlLmRvY3VtZW50KCktPnZpc2l0ZWRMaW5rQ29sb3IoKSA6IHN0
YXRlLmRvY3VtZW50KCktPmxpbmtDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRBY3Rp
dmVsaW5rOgorICAgICAgICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+YWN0aXZlTGlua0NvbG9y
KCk7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEZvY3VzUmluZ0NvbG9yOgorICAgICAgICByZXR1
cm4gUmVuZGVyVGhlbWU6OmZvY3VzUmluZ0NvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1ZUN1cnJl
bnRjb2xvcjoKKyAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPmNvbG9yKCk7CisgICAgZGVm
YXVsdDoKKyAgICAgICAgcmV0dXJuIGNvbG9yRm9yQ1NTVmFsdWUoaWRlbnQpOworICAgIH0KK30K
Kwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1
bHQoY29uc3QgTWVkaWFRdWVyeUV4cCogZXhwciwgYm9vbCByZXN1bHQpCit7CisgICAgbV92aWV3
cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmFwcGVuZChhZG9wdFB0cihuZXcgTWVkaWFR
dWVyeVJlc3VsdCgqZXhwciwgcmVzdWx0KSkpOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmFm
ZmVjdGVkQnlWaWV3cG9ydENoYW5nZSgpIGNvbnN0Cit7CisgICAgdW5zaWduZWQgcyA9IG1fdmll
d3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHM7IGkrKykgeworICAgICAgICBpZiAobV9tZWRpdW0tPmV2YWwoJm1fdmll
d3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0c1tpXS0+bV9leHByZXNzaW9uKSAhPSBtX3Zp
ZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fcmVzdWx0KQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIFRy
YW5zZm9ybU9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2Zvcm1PcGVyYXRpb25UeXBlIHR5cGUpCit7
CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxF
OworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfWDsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246OlNDQUxFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpT
Q0FMRV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RUcmFuc2Zv
cm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFXzNEOworICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFOworICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFu
c2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV9YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246OlRSQU5TTEFURV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRy
YW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRS
QU5TTEFURV9aOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZTNE
VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVf
M0Q7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEU7CisgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1g7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6Uk9UQVRFX1k7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRy
YW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFX1o7Cisg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlM0RUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV8zRDsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNm
b3JtT3BlcmF0aW9uOjpTS0VXOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNr
ZXdYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1g7
CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWTsKKyAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246Ok1BVFJJWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpN
YXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFU
UklYXzNEOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlBlcnNwZWN0aXZlVHJh
bnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpQRVJTUEVDVElWRTsK
KyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtub3duVHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOworICAgIH0KKyAgICByZXR1cm4g
VHJhbnNmb3JtT3BlcmF0aW9uOjpOT05FOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNyZWF0
ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBzdHls
ZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0
aW9ucykKK3sKKyAgICBpZiAoIWluVmFsdWUgfHwgIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsK
KyAgICAgICAgb3V0T3BlcmF0aW9ucy5jbGVhcigpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgZmxvYXQgem9vbUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpv
b20oKSA6IDE7CisgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgIGZvciAo
Q1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2Uo
KSkgeworICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworCisgICAgICAg
IGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSogdHJhbnNmb3Jt
VmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSo+KGkudmFsdWUoKSk7
CisgICAgICAgIGlmICghdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpKQorICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsKKyAg
ICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKTsg
KytqKSB7CisgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKGopLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBoYXZlTm9u
UHJpbWl0aXZlVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCisgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RWYWx1
ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMCkpOworCisgICAgICAgIHN3aXRjaCAodHJhbnNmb3JtVmFsdWUt
Pm9wZXJhdGlvblR5cGUoKSkgeworICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAg
IGRvdWJsZSBzeCA9IDEuMDsKKyAgICAgICAgICAgIGRvdWJsZSBzeSA9IDEuMDsKKyAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgc3kg
PSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgc3ggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAg
ICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91Ymxl
VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAg
ICAgICBzeSA9IHN4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChTY2FsZVRyYW5zZm9ybU9wZXJhdGlv
bjo6Y3JlYXRlKHN4LCBzeSwgMS4wLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9y
bVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1P
cGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlM0RU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBzeCA9IDEuMDsKKyAgICAg
ICAgICAgIGRvdWJsZSBzeSA9IDEuMDsKKyAgICAgICAgICAgIGRvdWJsZSBzeiA9IDEuMDsKKyAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAg
ICAgc3ogPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZWxzZSBp
ZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHN5ID0gZmly
c3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgc3ogPSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmlt
aXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAg
ICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzeDsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShzeCwgc3ks
IHN6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25U
eXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246CisgICAg
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVy
YXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIExlbmd0aCB0eCA9IExlbmd0aCgwLCBG
aXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAg
ICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxl
LCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4ID0g
Y29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZh
Y3Rvcik7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBl
KCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRp
b24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+
IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRW
YWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBj
b252ZXJ0VG9GbG9hdExlbmd0aChzZWNvbmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZh
Y3Rvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZp
bmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBvcGVy
YXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpj
cmVhdGUodHgsIHR5LCBMZW5ndGgoMCwgRml4ZWQpLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBl
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVaVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZh
bHVlOjpUcmFuc2xhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgTGVuZ3Ro
IHR4ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIExlbmd0aCB0eSA9IExlbmd0aCgw
LCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHogPSBMZW5ndGgoMCwgRml4ZWQpOworICAg
ICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAg
ICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0
eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5v
cGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVlUcmFu
c2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0
aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgICAgIHR4ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlRyYW5zbGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0
aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB0eiA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHRoaXJkVmFs
dWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVy
dFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3Ip
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgp
IHx8IHR6LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoVHJhbnNsYXRlVHJhbnNm
b3JtT3BlcmF0aW9uOjpjcmVhdGUodHgsIHR5LCB0eiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlw
ZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRl
VHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmaXJzdFZh
bHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25z
KCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKDAsIDAsIDEsIGFuZ2xl
LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBl
KCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOgor
ICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNmb3JtT3Bl
cmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgeCA9IDA7CisgICAgICAgICAgICBkb3VibGUg
eSA9IDA7CisgICAgICAgICAgICBkb3VibGUgeiA9IDA7CisgICAgICAgICAgICBkb3VibGUgYW5n
bGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworCisgICAgICAgICAgICBpZiAodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICB4ID0gMTsKKyAgICAg
ICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAg
ICAgICAgeSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeiA9IDE7Cisg
ICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3Jt
T3BlcmF0aW9uOjpjcmVhdGUoeCwgeSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5
cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUt
Pmxlbmd0aCgpIDwgNCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKKyAg
ICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmb3VydGhWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MykpOworICAgICAgICAgICAgZG91YmxlIHggPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgZG91YmxlIHkgPSBzZWNvbmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsK
KyAgICAgICAgICAgIGRvdWJsZSB6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAg
ICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZvdXJ0aFZhbHVlLT5jb21wdXRlRGVncmVlcygpOwor
ICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9y
bU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25U
eXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3
VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBh
bmdsZVggPSAwOworICAgICAgICAgICAgZG91YmxlIGFuZ2xlWSA9IDA7CisgICAgICAgICAgICBk
b3VibGUgYW5nbGUgPSBmaXJzdFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIGFuZ2xlWSA9
IGFuZ2xlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYW5nbGVYID0gYW5n
bGU7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkg
PT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGVZID0gc2Vjb25k
VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlv
bnMoKS5hcHBlbmQoU2tld1RyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGFuZ2xlWCwgYW5nbGVZ
LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBl
KCkpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCA2KQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgZG91YmxlIGEgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgZG91YmxlIGIgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFs
dWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBjID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSktPmdldERvdWJs
ZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZCA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMykpLT5nZXRE
b3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGUgPSB6b29tRmFjdG9yICogc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjayg0KSktPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgZiA9IHpv
b21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXhUcmFuc2Zvcm1PcGVyYXRp
b246OmNyZWF0ZShhLCBiLCBjLCBkLCBlLCBmKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpNYXRyaXgzRFRyYW5z
Zm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgo
KSA8IDE2KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgVHJhbnNmb3JtYXRp
b25NYXRyaXggbWF0cml4KHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3Jt
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVW
YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikp
LT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91
bmRzQ2hlY2soMykpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNm
b3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNSkpLT5nZXREb3VibGVWYWx1ZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soNikpLT5nZXREb3Vi
bGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
NykpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soOCkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soOSkpLT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJh
bnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTApKS0+Z2V0RG91YmxlVmFsdWUo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDExKSktPmdl
dERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3Rv
ciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMTIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMykpLT5nZXREb3Vi
bGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
MTQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDE1KSktPmdldERvdWJsZVZhbHVlKCkpOworICAgICAgICAgICAgb3BlcmF0
aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKE1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVh
dGUobWF0cml4KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlvbjog
eworICAgICAgICAgICAgTGVuZ3RoIHAgPSBMZW5ndGgoMCwgRml4ZWQpOworICAgICAgICAgICAg
aWYgKGZpcnN0VmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgcCA9IGNvbnZlcnRU
b0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwor
ICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHF1aXJrIHRo
YXQgc2hvdWxkIGdvIGF3YXkgd2hlbiAzZCB0cmFuc2Zvcm1zIGFyZSBmaW5hbGl6ZWQuCisgICAg
ICAgICAgICAgICAgZG91YmxlIHZhbCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Cisg
ICAgICAgICAgICAgICAgcCA9IHZhbCA+PSAwID8gTGVuZ3RoKGNsYW1wVG9Qb3NpdGl2ZUludGVn
ZXIodmFsKSwgRml4ZWQpIDogTGVuZ3RoKFVuZGVmaW5lZCk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmIChwLmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUGVyc3Bl
Y3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShwKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpVbmtub3du
VHJhbnNmb3JtT3BlcmF0aW9uOgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dE9wZXJhdGlvbnMg
PSBvcGVyYXRpb25zOworICAgIHJldHVybiB0cnVlOworfQorCisjaWYgRU5BQkxFKENTU19GSUxU
RVJTKQorc3RhdGljIEZpbHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBmaWx0ZXJPcGVyYXRp
b25Gb3JUeXBlKFdlYktpdENTU0ZpbHRlclZhbHVlOjpGaWx0ZXJPcGVyYXRpb25UeXBlIHR5cGUp
Cit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9u
OjpSRUZFUkVOQ0U7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6R3JheXNjYWxlRmls
dGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpHUkFZU0NBTEU7
CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246Cisg
ICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlNFUElBOworICAgIGNhc2UgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU6OlNhdHVyYXRlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmls
dGVyT3BlcmF0aW9uOjpTQVRVUkFURTsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpI
dWVSb3RhdGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246
OkhVRV9ST1RBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0RmlsdGVy
T3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpJTlZFUlQ7CisgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6T3BhY2l0eUZpbHRlck9wZXJhdGlvbjoKKyAgICAg
ICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6T1BBQ0lUWTsKKyAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpCcmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmls
dGVyT3BlcmF0aW9uOjpCUklHSFRORVNTOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OkNvbnRyYXN0RmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9u
OjpDT05UUkFTVDsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVyT3Bl
cmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpCTFVSOworICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246CisgICAgICAg
IHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkRST1BfU0hBRE9XOworI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDdXN0b21GaWx0ZXJPcGVyYXRp
b246CisgICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTTsKKyNlbmRpZgorICAg
IGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlVua25vd25GaWx0ZXJPcGVyYXRpb246CisgICAg
ICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok5PTkU7CisgICAgfQorICAgIHJldHVybiBGaWx0
ZXJPcGVyYXRpb246Ok5PTkU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJM
RShTVkcpCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCkKK3sK
KyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGlmICghc3RhdGUuc3R5bGUoKS0+aGFz
RmlsdGVyKCkgfHwgc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9h
ZGVyID0gc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKyAgICBWZWN0
b3I8UmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gPiYgZmlsdGVyT3BlcmF0aW9ucyA9IHN0YXRlLnN0
eWxlKCktPm11dGFibGVGaWx0ZXIoKS5vcGVyYXRpb25zKCk7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGZpbHRlck9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVmUHRy
PEZpbHRlck9wZXJhdGlvbj4gZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5hdChp
KTsKKyAgICAgICAgaWYgKGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09IEZp
bHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VGaWx0ZXJP
cGVyYXRpb24qIHJlZmVyZW5jZUZpbHRlciA9IHN0YXRpY19jYXN0PFJlZmVyZW5jZUZpbHRlck9w
ZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbi5nZXQoKSk7CisKKyAgICAgICAgICAgIFdlYktpdENT
U1NWR0RvY3VtZW50VmFsdWUqIHZhbHVlID0gc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmdl
dChyZWZlcmVuY2VGaWx0ZXIpLmdldCgpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENhY2hlZFNWR0RvY3VtZW50KiBjYWNo
ZWREb2N1bWVudCA9IHZhbHVlLT5sb2FkKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICAgICAg
ICAgIGlmICghY2FjaGVkRG9jdW1lbnQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgICAgIC8vIFN0YXNoIHRoZSBDYWNoZWRTVkdEb2N1bWVudCBvbiB0aGUgcmVmZXJlbmNl
IGZpbHRlci4KKyAgICAgICAgICAgIHJlZmVyZW5jZUZpbHRlci0+c2V0Q2FjaGVkU1ZHRG9jdW1l
bnRSZWZlcmVuY2UoYWRvcHRQdHIobmV3IENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKGNhY2hl
ZERvY3VtZW50KSkpOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRlLnBlbmRpbmdTVkdEb2N1
bWVudHMoKS5jbGVhcigpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCitT
dHlsZVNoYWRlciogU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFkZXIoQ1NTVmFsdWUqIHZhbHVlKQor
eworICAgIGlmICh2YWx1ZS0+aXNXZWJLaXRDU1NTaGFkZXJWYWx1ZSgpKQorICAgICAgICByZXR1
cm4gY2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoc3RhdGljX2Nhc3Q8V2ViS2l0
Q1NTU2hhZGVyVmFsdWUqPih2YWx1ZSkpOworICAgIHJldHVybiAwOworfQorCitTdHlsZVNoYWRl
ciogU3R5bGVSZXNvbHZlcjo6Y2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2Vi
S2l0Q1NTU2hhZGVyVmFsdWUqIHZhbHVlKQoreworICAgIFN0eWxlU2hhZGVyKiBzaGFkZXIgPSB2
YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nU2hhZGVyKCk7CisgICAgaWYgKHNoYWRlciAmJiBzaGFkZXIt
PmlzUGVuZGluZ1NoYWRlcigpKQorICAgICAgICBtX3N0YXRlLnNldEhhc1BlbmRpbmdTaGFkZXJz
KHRydWUpOworICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9h
ZFBlbmRpbmdTaGFkZXJzKCkKK3sKKyAgICBpZiAoIW1fc3RhdGUuc3R5bGUoKS0+aGFzRmlsdGVy
KCkgfHwgIW1fc3RhdGUuaGFzUGVuZGluZ1NoYWRlcnMoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9hZGVyID0gbV9zdGF0ZS5k
b2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworCisgICAgVmVjdG9yPFJlZlB0cjxG
aWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBtX3N0YXRlLnN0eWxlKCktPm11
dGFibGVGaWx0ZXIoKS5vcGVyYXRpb25zKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGZpbHRlck9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVmUHRyPEZpbHRlck9w
ZXJhdGlvbj4gZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVyT3BlcmF0aW9ucy5hdChpKTsKKyAgICAg
ICAgaWYgKGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpID09IEZpbHRlck9wZXJh
dGlvbjo6Q1VTVE9NKSB7CisgICAgICAgICAgICBDdXN0b21GaWx0ZXJPcGVyYXRpb24qIGN1c3Rv
bUZpbHRlciA9IHN0YXRpY19jYXN0PEN1c3RvbUZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJh
dGlvbi5nZXQoKSk7CisgICAgICAgICAgICBBU1NFUlQoY3VzdG9tRmlsdGVyLT5wcm9ncmFtKCkp
OworICAgICAgICAgICAgU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtKiBwcm9ncmFtID0gc3RhdGlj
X2Nhc3Q8U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtKj4oY3VzdG9tRmlsdGVyLT5wcm9ncmFtKCkp
OworICAgICAgICAgICAgaWYgKHByb2dyYW0tPnZlcnRleFNoYWRlcigpICYmIHByb2dyYW0tPnZl
cnRleFNoYWRlcigpLT5pc1BlbmRpbmdTaGFkZXIoKSkgeworICAgICAgICAgICAgICAgIFdlYktp
dENTU1NoYWRlclZhbHVlKiBzaGFkZXJWYWx1ZSA9IHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ1No
YWRlcio+KHByb2dyYW0tPnZlcnRleFNoYWRlcigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKKyAgICAg
ICAgICAgICAgICBwcm9ncmFtLT5zZXRWZXJ0ZXhTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNo
YWRlcihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkgJiYgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIo
KS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBXZWJLaXRDU1NTaGFkZXJW
YWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIqPihwcm9n
cmFtLT5mcmFnbWVudFNoYWRlcigpKS0+Y3NzU2hhZGVyVmFsdWUoKTsKKyAgICAgICAgICAgICAg
ICBwcm9ncmFtLT5zZXRGcmFnbWVudFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVyKGNh
Y2hlZFJlc291cmNlTG9hZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cisg
ICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyhmYWxzZSk7Cit9CisKK3N0YXRpYyBib29s
IHNvcnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRvcihjb25zdCBSZWZQdHI8Q3VzdG9tRmlsdGVy
UGFyYW1ldGVyPiYgYSwgY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4mIGIpCit7
CisgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmVMZXNzVGhhbihhLT5uYW1lKCksIGItPm5hbWUo
KSk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBTdHlsZVJlc29sdmVy
OjpwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NT
VmFsdWVMaXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRyPEN1c3RvbUZpbHRlckFycmF5UGFyYW1l
dGVyPiBhcnJheVBhcmFtZXRlciA9IEN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyOjpjcmVhdGUo
bmFtZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbGVuZ3RoID0gdmFsdWVzLT5sZW5ndGgo
KTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVlcy0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhpKTsKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRp
dmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIENTU1ByaW1pdGl2ZVZh
bHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFs
dWUpOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQ
cmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJFUikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICBhcnJheVBhcmFtZXRlci0+YWRkVmFsdWUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVl
KCkpOworICAgIH0KKyAgICByZXR1cm4gYXJyYXlQYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQ
YXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0
b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3Qq
IHZhbHVlcykKK3sKKyAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyPiBudW1i
ZXJQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmFsdWVzLT5sZW5ndGgoKTsgKytpKSB7Cisg
ICAgICAgIENTU1ZhbHVlKiB2YWx1ZSA9IHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayhp
KTsKKyAgICAgICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAg
cmV0dXJuIDA7CisgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOworICAgICAgICBpZiAocHJpbWl0
aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJF
UikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBudW1iZXJQYXJhbWV0ZXItPmFkZFZh
bHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJu
IG51bWJlclBhcmFtZXRlci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVy
UGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFt
ZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQoreworICAgIFJl
ZlB0cjxDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI+IHRyYW5zZm9ybVBhcmFtZXRlciA9
IEN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOworICAgIFRyYW5z
Zm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25z
KHZhbHVlcywgbV9zdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgb3Bl
cmF0aW9ucyk7CisgICAgdHJhbnNmb3JtUGFyYW1ldGVyLT5zZXRPcGVyYXRpb25zKG9wZXJhdGlv
bnMpOworICAgIHJldHVybiB0cmFuc2Zvcm1QYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQYXNz
UmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21G
aWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZSogcGFyYW1ldGVyVmFs
dWUpCit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBvdGhlciBwYXJhbWV0ZXJzIHR5cGVzIHBh
cnNpbmcuCisgICAgLy8gYm9vbGVhbnM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03NjQzOAorICAgIC8vIHRleHR1cmVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzE0NDIKKyAgICAvLyBtYXQyLCBtYXQzLCBtYXQ0OiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzE0NDQKKyAgICAvLyBOdW1iZXIgcGFyYW1l
dGVycyBhcmUgd3JhcHBlZCBpbnNpZGUgYSBDU1NWYWx1ZUxpc3QgYW5kIGFsbAorICAgIC8vIHRo
ZSBvdGhlciBmdW5jdGlvbnMgdmFsdWVzIGluaGVyaXQgZnJvbSBDU1NWYWx1ZUxpc3QuCisgICAg
aWYgKCFwYXJhbWV0ZXJWYWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBDU1NWYWx1ZUxpc3QqIHZhbHVlcyA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHBh
cmFtZXRlclZhbHVlKTsKKyAgICBpZiAoIXZhbHVlcy0+bGVuZ3RoKCkpCisgICAgICAgIHJldHVy
biAwOworCisgICAgaWYgKHBhcmFtZXRlclZhbHVlLT5pc1dlYktpdENTU0FycmF5RnVuY3Rpb25W
YWx1ZSgpKQorICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihu
YW1lLCB2YWx1ZXMpOworCisgICAgLy8gSWYgdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBsaXN0IGlz
IGEgdHJhbnNmb3JtIGZ1bmN0aW9uLAorICAgIC8vIHRoZW4gd2UgY291bGQgc2FmZWx5IGFzc3Vt
ZSB0aGF0IGFsbCB0aGUgcmVtYWluaW5nIGl0ZW1zCisgICAgLy8gYXJlIHRyYW5zZm9ybXMuIHBh
cnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyIHdpbGwKKyAgICAvLyByZXR1cm4gMCBp
ZiB0aGF0IGFzc3VtcHRpb24gaXMgaW5jb3JyZWN0LgorICAgIGlmICh2YWx1ZXMtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soMCktPmlzV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKKyAgICAgICAg
cmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7
CisKKyAgICAvLyBXZSBjYW4gaGF2ZSBvbmx5IGFycmF5cyBvZiBib29sZWFucyBvciBudW1iZXJz
LCBzbyB1c2UgdGhlIGZpcnN0IHZhbHVlIHRvIGNob29zZSBiZXR3ZWVuIHRob3NlIHR3by4KKyAg
ICAvLyBXZSBuZWVkIHVwIHRvIDQgdmFsdWVzIChhbGwgYm9vbGVhbnMgb3IgYWxsIG51bWJlcnMp
LgorICAgIGlmICghdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1ByaW1pdGl2
ZVZhbHVlKCkgfHwgdmFsdWVzLT5sZW5ndGgoKSA+IDQpCisgICAgICAgIHJldHVybiAwOworICAg
IAorICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nh
c3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkp
OworICAgIGlmIChmaXJzdFByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJp
bWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisgICAgICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRl
ck51bWJlclBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOworCisgICAgLy8gRklYTUU6IEltcGxlbWVu
dCB0aGUgYm9vbGVhbiBhcnJheSBwYXJhbWV0ZXIgaGVyZS4KKyAgICAvLyBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzY0MzgKKworICAgIHJldHVybiAwOworfQorCiti
b29sIFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NWYWx1
ZSogcGFyYW1ldGVyc1ZhbHVlLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0JiBwYXJhbWV0ZXJM
aXN0KQoreworICAgIEhhc2hTZXQ8U3RyaW5nPiBrbm93blBhcmFtZXRlck5hbWVzOworICAgIENT
U1ZhbHVlTGlzdEl0ZXJhdG9yIHBhcmFtZXRlckl0ZXJhdG9yKHBhcmFtZXRlcnNWYWx1ZSk7Cisg
ICAgZm9yICg7IHBhcmFtZXRlckl0ZXJhdG9yLmhhc01vcmUoKTsgcGFyYW1ldGVySXRlcmF0b3Iu
YWR2YW5jZSgpKSB7CisgICAgICAgIGlmICghcGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKS0+aXNW
YWx1ZUxpc3QoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQ1NTVmFsdWVM
aXN0SXRlcmF0b3IgaXRlcmF0b3IocGFyYW1ldGVySXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAg
IGlmICghaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICBpZiAo
cHJpbWl0aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSAhPSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NT
X1NUUklORykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIFN0
cmluZyBuYW1lID0gcHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgIC8v
IERvIG5vdCBhbGxvdyBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzLgorICAgICAgICBpZiAoa25v
d25QYXJhbWV0ZXJOYW1lcy5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAga25vd25QYXJhbWV0ZXJOYW1lcy5hZGQobmFtZSk7CisgICAgICAgIAorICAg
ICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIWl0ZXJhdG9y
Lmhhc01vcmUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAg
IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcmFtZXRlciA9IHBhcnNlQ3VzdG9tRmls
dGVyUGFyYW1ldGVyKG5hbWUsIGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICBpZiAoIXBhcmFt
ZXRlcikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcGFyYW1ldGVyTGlzdC5h
cHBlbmQocGFyYW1ldGVyLnJlbGVhc2UoKSk7CisgICAgfQorICAgIAorICAgIC8vIE1ha2Ugc3Vy
ZSB3ZSBzb3J0IHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBwYXNzaW5nIHRoZW0gZG93biB0byB0aGUg
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uLgorICAgIHN0ZDo6c29ydChwYXJhbWV0ZXJMaXN0LmJlZ2lu
KCksIHBhcmFtZXRlckxpc3QuZW5kKCksIHNvcnRQYXJhbWV0ZXJzQnlOYW1lQ29tcGFyYXRvcik7
CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3Bl
cmF0aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRS
dWxlUmVmZXJlbmNlU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sK
KyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHN0eWxlIHJlc29sdXRpb24gZm9yIHRoZSBjdXN0b20g
ZmlsdGVyIGF0LXJ1bGUgcmVmZXJlbmNlIHN5bnRheC4KKyAgICBVTlVTRURfUEFSQU0oZmlsdGVy
VmFsdWUpOworICAgIHJldHVybiAwOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJh
dGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aElubGlu
ZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCit7CisgICAgQ1NTVmFs
dWUqIHNoYWRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDAp
OworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNoYWRlcnNWYWx1ZS0+aXNW
YWx1ZUxpc3QoKSk7CisgICAgQ1NTVmFsdWVMaXN0KiBzaGFkZXJzTGlzdCA9IHN0YXRpY19jYXN0
PENTU1ZhbHVlTGlzdCo+KHNoYWRlcnNWYWx1ZSk7CisKKyAgICB1bnNpZ25lZCBzaGFkZXJzTGlz
dExlbmd0aCA9IHNoYWRlcnNMaXN0LT5sZW5ndGgoKTsKKyAgICBBU1NFUlQoc2hhZGVyc0xpc3RM
ZW5ndGgpOworCisgICAgUmVmUHRyPFN0eWxlU2hhZGVyPiB2ZXJ0ZXhTaGFkZXIgPSBzdHlsZVNo
YWRlcihzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7CisgICAgUmVmUHRy
PFN0eWxlU2hhZGVyPiBmcmFnbWVudFNoYWRlcjsKKyAgICBDdXN0b21GaWx0ZXJQcm9ncmFtVHlw
ZSBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9CTEVORFNfRUxFTUVOVF9URVhUVVJFOworICAg
IEN1c3RvbUZpbHRlclByb2dyYW1NaXhTZXR0aW5ncyBtaXhTZXR0aW5nczsKKworICAgIGlmIChz
aGFkZXJzTGlzdExlbmd0aCA+IDEpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGZyYWdtZW50U2hhZGVy
T3JNaXhGdW5jdGlvbiA9IHNoYWRlcnNMaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpOwor
CisgICAgICAgIGlmIChmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24tPmlzV2ViS2l0Q1NTTWl4
RnVuY3Rpb25WYWx1ZSgpKSB7CisgICAgICAgICAgICBXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVl
KiBtaXhGdW5jdGlvbiA9IHN0YXRpY19jYXN0PFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUqPihm
cmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24pOworICAgICAgICAgICAgQ1NTVmFsdWVMaXN0SXRl
cmF0b3IgaXRlcmF0b3IobWl4RnVuY3Rpb24pOworCisgICAgICAgICAgICBBU1NFUlQobWl4RnVu
Y3Rpb24tPmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVTaGFk
ZXIoaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisK
KyAgICAgICAgICAgIEFTU0VSVChtaXhGdW5jdGlvbi0+bGVuZ3RoKCkgPD0gMyk7CisgICAgICAg
ICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTW9yZSgpKSB7CisgICAgICAgICAgICAgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ1NTUGFyc2VyOjpp
c0JsZW5kTW9kZShwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkpCisgICAgICAgICAgICAgICAg
ICAgIG1peFNldHRpbmdzLmJsZW5kTW9kZSA9ICpwcmltaXRpdmVWYWx1ZTsKKyAgICAgICAgICAg
ICAgICBlbHNlIGlmIChDU1NQYXJzZXI6OmlzQ29tcG9zaXRlT3BlcmF0b3IocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkpKQorICAgICAgICAgICAgICAgICAgICBtaXhTZXR0aW5ncy5jb21wb3Np
dGVPcGVyYXRvciA9ICpwcmltaXRpdmVWYWx1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAg
ICAgICAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgICAgIGl0
ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIHByb2dyYW1UeXBlID0gUFJPR1JBTV9UWVBFX05PX0VMRU1FTlRfVEVYVFVSRTsKKyAg
ICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gc3R5bGVTaGFkZXIoZnJhZ21lbnRTaGFkZXJPck1p
eEZ1bmN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBtZXNoUm93
cyA9IDE7CisgICAgdW5zaWduZWQgbWVzaENvbHVtbnMgPSAxOworICAgIEN1c3RvbUZpbHRlck1l
c2hUeXBlIG1lc2hUeXBlID0gTWVzaFR5cGVBdHRhY2hlZDsKKyAgICAKKyAgICBDU1NWYWx1ZSog
cGFyYW1ldGVyc1ZhbHVlID0gMDsKKyAgICAKKyAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID4gMSkgeworICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihmaWx0ZXJWYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUg
c2Vjb25kIHZhbHVlIG1pZ2h0IGJlIHRoZSBtZXNoIGJveCBvciB0aGUgbGlzdCBvZiBwYXJhbWV0
ZXJzOgorICAgICAgICAvLyBJZiBpdCBzdGFydHMgd2l0aCBhIG51bWJlciBvciBhbnkgb2YgdGhl
IG1lc2gtYm94IGlkZW50aWZpZXJzIGl0IGlzIAorICAgICAgICAvLyB0aGUgbWVzaC1ib3ggbGlz
dCwgaWYgbm90IGl0IG1lYW5zIGl0IGlzIHRoZSBwYXJhbWV0ZXJzIGxpc3QuCisKKyAgICAgICAg
aWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsK
KyAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBv
bmx5IG9uZSBpbnRlZ2VyIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBzZXQgYm90aAorICAg
ICAgICAgICAgICAgIC8vIHRoZSByb3dzIGFuZCB0aGUgY29sdW1ucy4KKyAgICAgICAgICAgICAg
ICBtZXNoQ29sdW1ucyA9IG1lc2hSb3dzID0gcHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCk7
CisgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBhbm90aGVyIG51bWJlciBmb3IgdGhlIHJv
d3MuCisgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUoKSAmJiBpdGVyYXRvci5p
c1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVy
YXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5p
c051bWJlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNoUm93cyA9IHByaW1pdGl2
ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iu
YWR2YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoaXRlcmF0b3IuaGFz
TW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZURldGFjaGVkKSB7CisgICAgICAgICAgICAgICAgbWVz
aFR5cGUgPSBNZXNoVHlwZURldGFjaGVkOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFu
Y2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFp
dGVyYXRvci5pbmRleCgpKSB7CisgICAgICAgICAgICAvLyBJZiBubyB2YWx1ZSB3YXMgY29uc3Vt
ZWQgZnJvbSB0aGUgbWVzaCB2YWx1ZSwgdGhlbiBpdCBpcyBqdXN0IGEgcGFyYW1ldGVyIGxpc3Qs
IG1lYW5pbmcgdGhhdCB3ZSBlbmQgdXAKKyAgICAgICAgICAgIC8vIGhhdmluZyBqdXN0IHR3byBD
U1NMaXN0VmFsdWVzOiBsaXN0IG9mIHNoYWRlcnMgYW5kIGxpc3Qgb2YgcGFyYW1ldGVycy4KKyAg
ICAgICAgICAgIEFTU0VSVChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMik7CisgICAgICAgICAg
ICBwYXJhbWV0ZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygx
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID4gMiAmJiAhcGFyYW1ldGVyc1ZhbHVlKQorICAgICAgICBwYXJhbWV0ZXJzVmFsdWUgPSBmaWx0
ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKTsKKyAgICAKKyAgICBDdXN0b21GaWx0
ZXJQYXJhbWV0ZXJMaXN0IHBhcmFtZXRlckxpc3Q7CisgICAgaWYgKHBhcmFtZXRlcnNWYWx1ZSAm
JiAhcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KHBhcmFtZXRlcnNWYWx1ZSwgcGFyYW1l
dGVyTGlzdCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIFJlZlB0cjxTdHlsZUN1c3Rv
bUZpbHRlclByb2dyYW0+IHByb2dyYW0gPSBTdHlsZUN1c3RvbUZpbHRlclByb2dyYW06OmNyZWF0
ZSh2ZXJ0ZXhTaGFkZXIucmVsZWFzZSgpLCBmcmFnbWVudFNoYWRlci5yZWxlYXNlKCksIHByb2dy
YW1UeXBlLCBtaXhTZXR0aW5ncywgbWVzaFR5cGUpOworICAgIHJldHVybiBDdXN0b21GaWx0ZXJP
cGVyYXRpb246OmNyZWF0ZShwcm9ncmFtLnJlbGVhc2UoKSwgcGFyYW1ldGVyTGlzdCwgbWVzaFJv
d3MsIG1lc2hDb2x1bW5zLCBtZXNoVHlwZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q3VzdG9tRmlsdGVy
T3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oV2Vi
S2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQoreworICAgIEFTU0VSVChmaWx0ZXJWYWx1
ZS0+bGVuZ3RoKCkpOworICAgIGJvb2wgaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPSBmaWx0ZXJW
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1ZSgpOworICAg
IHJldHVybiBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA/IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJh
dGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoZmlsdGVyVmFsdWUpIDogY3JlYXRlQ3VzdG9t
RmlsdGVyT3BlcmF0aW9uV2l0aElubGluZVN5bnRheChmaWx0ZXJWYWx1ZSk7Cit9CisKKyNlbmRp
ZgorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUZpbHRlck9wZXJhdGlvbnMoQ1NTVmFsdWUq
IGluVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmls
dGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucykKK3sKKyAgICBBU1NFUlQob3V0T3BlcmF0aW9u
cy5pc0VtcHR5KCkpOworICAgIAorICAgIGlmICghaW5WYWx1ZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIAorICAgIGlmIChpblZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAg
ICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPihpblZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJ
ZGVudCgpID09IENTU1ZhbHVlTm9uZSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICAKKyAgICBpZiAoIWluVmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVa
b29tKCkgOiAxOworICAgIEZpbHRlck9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICBmb3IgKENT
U1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkp
IHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKyAgICAgICAgaWYg
KCFjdXJyVmFsdWUtPmlzV2ViS2l0Q1NTRmlsdGVyVmFsdWUoKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSA9IHN0YXRp
Y19jYXN0PFdlYktpdENTU0ZpbHRlclZhbHVlKj4oaS52YWx1ZSgpKTsKKyAgICAgICAgRmlsdGVy
T3BlcmF0aW9uOjpPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBmaWx0ZXJPcGVyYXRpb25G
b3JUeXBlKGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBlKCkpOworCisjaWYgRU5BQkxFKENTU19T
SEFERVJTKQorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OlZB
TElEQVRFRF9DVVNUT00pIHsKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlZEN1c3RvbUZpbHRlck9w
ZXJhdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gZW5kIHVwIGluIHRoZSBSZW5kZXJTdHlsZS4KKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpD
VVNUT00pIHsKKyAgICAgICAgICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IG9wZXJh
dGlvbiA9IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihmaWx0ZXJWYWx1ZSk7CisgICAgICAg
ICAgICBpZiAoIW9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChvcGVy
YXRpb24pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAg
ICBpZiAob3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgeworI2lm
IEVOQUJMRShTVkcpCisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9IDEp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDU1NWYWx1ZSogYXJndW1l
bnQgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKKworICAgICAgICAg
ICAgaWYgKCFhcmd1bWVudC0+aXNXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKCkpCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFdlYktpdENTU1NWR0RvY3VtZW50VmFs
dWUqIHN2Z0RvY3VtZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NTVkdEb2N1bWVudFZh
bHVlKj4oYXJndW1lbnQpOworICAgICAgICAgICAgS1VSTCB1cmwgPSBtX3N0YXRlLmRvY3VtZW50
KCktPmNvbXBsZXRlVVJMKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpKTsKKworICAgICAgICAgICAg
UmVmUHRyPFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0aW9uID0gUmVmZXJlbmNlRmls
dGVyT3BlcmF0aW9uOjpjcmVhdGUoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIHVybC5mcmFnbWVu
dElkZW50aWZpZXIoKSwgb3BlcmF0aW9uVHlwZSk7CisgICAgICAgICAgICBpZiAoU1ZHVVJJUmVm
ZXJlbmNlOjppc0V4dGVybmFsVVJJUmVmZXJlbmNlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCBt
X3N0YXRlLmRvY3VtZW50KCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdmdEb2N1bWVudFZh
bHVlLT5sb2FkUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUucGVuZGlu
Z1NWR0RvY3VtZW50cygpLnNldChvcGVyYXRpb24uZ2V0KCksIHN2Z0RvY3VtZW50VmFsdWUpOwor
ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN2Z0RvY3VtZW50VmFsdWUtPmNhY2hlZFNWR0RvY3Vt
ZW50KCkpCisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi0+c2V0Q2FjaGVkU1ZHRG9jdW1l
bnRSZWZlcmVuY2UoYWRvcHRQdHIobmV3IENhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlKHN2Z0Rv
Y3VtZW50VmFsdWUtPmNhY2hlZFNWR0RvY3VtZW50KCkpKSk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9uKTsKKyNlbmRp
ZgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0
aGF0IGFsbCBwYXJhbWV0ZXJzIGFyZSBwcmltaXRpdmUgdmFsdWVzLCB3aXRoIHRoZQorICAgICAg
ICAvLyBleGNlcHRpb24gb2YgZHJvcCBzaGFkb3cgd2hpY2ggaGFzIGEgU2hhZG93VmFsdWUgcGFy
YW1ldGVyLgorICAgICAgICBpZiAob3BlcmF0aW9uVHlwZSAhPSBGaWx0ZXJPcGVyYXRpb246OkRS
T1BfU0hBRE9XKSB7CisgICAgICAgICAgICBib29sIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZh
bHNlOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZpbHRlclZhbHVlLT5s
ZW5ndGgoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAg
ICAgICAgIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
IChoYXZlTm9uUHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIH0KKworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RWYWx1ZSA9IGZpbHRlclZh
bHVlLT5sZW5ndGgoKSA/IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlsdGVyVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpIDogMDsKKyAgICAgICAgc3dpdGNoIChmaWx0
ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSB7CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OkdyYXlzY2FsZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NG
aWx0ZXJWYWx1ZTo6U2VwaWFGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU6OlNhdHVyYXRlRmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3Vi
bGUgYW1vdW50ID0gMTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0g
MSkgeworICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVyY2VudGFnZSgpKQorICAg
ICAgICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRl
ck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVl
Um90YXRlRmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSAwOwor
ICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKQorICAgICAgICAgICAg
ICAgIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKworICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVy
YXRpb246OmNyZWF0ZShhbmdsZSwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SW52ZXJ0Rmls
dGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpCcmlnaHRu
ZXNzRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpD
b250cmFzdEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6T3BhY2l0eUZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFtb3VudCA9
IChmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU0ZpbHRlclZhbHVlOjpC
cmlnaHRuZXNzRmlsdGVyT3BlcmF0aW9uKSA/IDAgOiAxOworICAgICAgICAgICAgaWYgKGZpbHRl
clZhbHVlLT5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYW1vdW50ID0gZmlyc3RW
YWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+
aXNQZXJjZW50YWdlKCkpCisgICAgICAgICAgICAgICAgICAgIGFtb3VudCAvPSAxMDA7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChC
YXNpY0NvbXBvbmVudFRyYW5zZmVyRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW1vdW50LCBvcGVy
YXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpCbHVyRmlsdGVyT3BlcmF0aW9uOiB7CisgICAgICAgICAg
ICBMZW5ndGggc3RkRGV2aWF0aW9uID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAgICAgIGlm
IChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPj0gMSkKKyAgICAgICAgICAgICAgICBzdGREZXZpYXRp
b24gPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6
b29tRmFjdG9yKTsKKyAgICAgICAgICAgIGlmIChzdGREZXZpYXRpb24uaXNVbmRlZmluZWQoKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChCbHVyRmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoc3RkRGV2aWF0
aW9uLCBvcGVyYXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9u
OiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpICE9IDEpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBDU1NWYWx1ZSogY3NzVmFsdWUg
PSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKKyAgICAgICAgICAgIGlm
ICghY3NzVmFsdWUtPmlzU2hhZG93VmFsdWUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dWYWx1
ZSo+KGNzc1ZhbHVlKTsKKyAgICAgICAgICAgIEludFBvaW50IGxvY2F0aW9uKGl0ZW0tPngtPmNv
bXB1dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnktPmNvbXB1dGVMZW5ndGg8aW50PihzdHlsZSwg
cm9vdFN0eWxlLCB6b29tRmFjdG9yKSk7CisgICAgICAgICAgICBpbnQgYmx1ciA9IGl0ZW0tPmJs
dXIgPyBpdGVtLT5ibHVyLT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3RvcikgOiAwOworICAgICAgICAgICAgQ29sb3IgY29sb3I7CisgICAgICAgICAgICBpZiAo
aXRlbS0+Y29sb3IpCisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZyb21QcmltaXRpdmVW
YWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0
aW9ucygpLmFwcGVuZChEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUobG9jYXRpb24s
IGJsdXIsIGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50LCBvcGVy
YXRpb25UeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dE9wZXJhdGlvbnMgPSBvcGVyYXRpb25z
OworICAgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKKworUGFzc1JlZlB0cjxTdHlsZUltYWdl
PiBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKiBwZW5k
aW5nSW1hZ2UpCit7CisgICAgQ2FjaGVkUmVzb3VyY2VMb2FkZXIqIGNhY2hlZFJlc291cmNlTG9h
ZGVyID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOworCisgICAg
aWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpKSB7CisgICAgICAgIENTU0ltYWdlVmFs
dWUqIGltYWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKTsKKyAgICAgICAg
cmV0dXJuIGltYWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAg
ICB9CisKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsK
KyAgICAgICAgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogaW1hZ2VHZW5lcmF0b3JWYWx1ZSA9IHBl
bmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpOworICAgICAgICBpbWFnZUdlbmVy
YXRvclZhbHVlLT5sb2FkU3ViaW1hZ2VzKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICAgICAg
cmV0dXJuIFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShpbWFnZUdlbmVyYXRvclZhbHVlKTsK
KyAgICB9CisKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NDdXJzb3JJbWFnZVZhbHVlKCkpIHsK
KyAgICAgICAgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZSogY3Vyc29ySW1hZ2VWYWx1ZSA9IHBlbmRpbmdJ
bWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpOworICAgICAgICByZXR1cm4gY3Vyc29ySW1hZ2VW
YWx1ZS0+Y2FjaGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0KKworI2lmIEVO
QUJMRShDU1NfSU1BR0VfU0VUKQorICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlU2V0VmFs
dWUoKSkgeworICAgICAgICBDU1NJbWFnZVNldFZhbHVlKiBpbWFnZVNldFZhbHVlID0gcGVuZGlu
Z0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCk7CisgICAgICAgIHJldHVybiBpbWFnZVNldFZhbHVl
LT5jYWNoZWRJbWFnZVNldChjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAgfQorI2VuZGlmCisK
KyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ0ltYWdl
cygpCit7CisgICAgaWYgKG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0
X2l0ZXJhdG9yOjpLZXlzIGVuZCA9IG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmVu
ZCgpLmtleXMoKTsKKyAgICBmb3IgKFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVy
YXRvcjo6S2V5cyBpdCA9IG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmJlZ2luKCku
a2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgQ1NTUHJvcGVydHlJRCBjdXJyZW50
UHJvcGVydHkgPSAqaXQ7CisKKyAgICAgICAgc3dpdGNoIChjdXJyZW50UHJvcGVydHkpIHsKKyAg
ICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZTogeworICAgICAgICAgICAgZm9y
IChGaWxsTGF5ZXIqIGJhY2tncm91bmRMYXllciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzQmFj
a2dyb3VuZExheWVycygpOyBiYWNrZ3JvdW5kTGF5ZXI7IGJhY2tncm91bmRMYXllciA9IGJhY2tn
cm91bmRMYXllci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRMYXll
ci0+aW1hZ2UoKSAmJiBiYWNrZ3JvdW5kTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkp
CisgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRp
bmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KGJhY2tncm91bmRMYXllci0+
aW1hZ2UoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlDb250ZW50OiB7CisgICAgICAgICAgICBmb3IgKENv
bnRlbnREYXRhKiBjb250ZW50RGF0YSA9IGNvbnN0X2Nhc3Q8Q29udGVudERhdGEqPihtX3N0YXRl
LnN0eWxlKCktPmNvbnRlbnREYXRhKCkpOyBjb250ZW50RGF0YTsgY29udGVudERhdGEgPSBjb250
ZW50RGF0YS0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREYXRhLT5pc0lt
YWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3R5bGVJbWFnZSogaW1hZ2UgPSBzdGF0aWNf
Y2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5pbWFnZSgpOworICAgICAgICAg
ICAgICAgICAgICBpZiAoaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJbWFnZSA9IGxvYWRQZW5kaW5nSW1h
Z2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihpbWFnZSkpOworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGxvYWRlZEltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0YXRpY19jYXN0PEltYWdlQ29udGVudERhdGEqPihjb250ZW50RGF0YSktPnNldEltYWdlKGxv
YWRlZEltYWdlLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5Q3Vyc29yOiB7CisgICAgICAgICAgICBpZiAoQ3Vyc29yTGlz
dCogY3Vyc29yTGlzdCA9IG1fc3RhdGUuc3R5bGUoKS0+Y3Vyc29ycygpKSB7CisgICAgICAgICAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjdXJzb3JMaXN0LT5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgICAgICAgICBDdXJzb3JEYXRhJiBjdXJyZW50Q3Vyc29yID0gY3Vyc29yTGlz
dC0+YXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTdHlsZUltYWdlKiBpbWFnZSA9IGN1
cnJlbnRDdXJzb3IuaW1hZ2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdl
LT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRD
dXJzb3Iuc2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJ
bWFnZSo+KGltYWdlKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZUltYWdlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0
ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxl
SW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxl
KCktPnNldExpc3RTdHlsZUltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQ
ZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdlKCkpKSk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
SW1hZ2VTb3VyY2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPmJvcmRlcklt
YWdlU291cmNlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNvdXJjZSgpLT5pc1Bl
bmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0Qm9yZGVy
SW1hZ2VTb3VyY2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFn
ZSo+KG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKSkpKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZs
ZWN0OiB7CisgICAgICAgICAgICBpZiAoU3R5bGVSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbV9z
dGF0ZS5zdHlsZSgpLT5ib3hSZWZsZWN0KCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBOaW5l
UGllY2VJbWFnZSYgbWFza0ltYWdlID0gcmVmbGVjdGlvbi0+bWFzaygpOworICAgICAgICAgICAg
ICAgIGlmIChtYXNrSW1hZ2UuaW1hZ2UoKSAmJiBtYXNrSW1hZ2UuaW1hZ2UoKS0+aXNQZW5kaW5n
SW1hZ2UoKSkgeworICAgICAgICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVk
SW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4o
bWFza0ltYWdlLmltYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmbGVjdGlvbi0+c2V0
TWFzayhOaW5lUGllY2VJbWFnZShsb2FkZWRJbWFnZS5yZWxlYXNlKCksIG1hc2tJbWFnZS5pbWFn
ZVNsaWNlcygpLCBtYXNrSW1hZ2UuZmlsbCgpLCBtYXNrSW1hZ2UuYm9yZGVyU2xpY2VzKCksIG1h
c2tJbWFnZS5vdXRzZXQoKSwgbWFza0ltYWdlLmhvcml6b250YWxSdWxlKCksIG1hc2tJbWFnZS52
ZXJ0aWNhbFJ1bGUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXNrQm94SW1hZ2VTb3VyY2U6IHsKKyAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPm1h
c2tCb3hJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNl
KCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5z
ZXRNYXNrQm94SW1hZ2VTb3VyY2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBl
bmRpbmdJbWFnZSo+KG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNlKCkpKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0ltYWdlOiB7CisgICAgICAgICAgICBmb3IgKEZpbGxMYXllciogbWFza0xheWVyID0g
bV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NNYXNrTGF5ZXJzKCk7IG1hc2tMYXllcjsgbWFza0xheWVy
ID0gbWFza0xheWVyLT5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFza0xheWVyLT5p
bWFnZSgpICYmIG1hc2tMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAg
ICAgICAgICAgICAgbWFza0xheWVyLT5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19j
YXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obWFza0xheWVyLT5pbWFnZSgpKSkpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CisgICAgfQorCisgICAg
bV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjpsb2FkUGVuZGluZ1Jlc291cmNlcygpCit7CisgICAgLy8gU3RhcnQgbG9hZGlu
ZyBpbWFnZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nSW1hZ2Vz
KCk7CisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisgICAgLy8gU3RhcnQgbG9hZGluZyB0aGUg
c2hhZGVycyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdTaGFkZXJz
KCk7CisjZW5kaWYKKyAgICAKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcp
CisgICAgLy8gU3RhcnQgbG9hZGluZyB0aGUgU1ZHIERvY3VtZW50cyByZWZlcmVuY2VkIGJ5IHRo
aXMgc3R5bGUuCisgICAgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKKyNlbmRpZgorfQorCitp
bmxpbmUgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6Ok1hdGNoZWRQcm9wZXJ0aWVz
KCkKKyAgICA6IHBvc3NpYmx5UGFkZGVkTWVtYmVyKDApCit7Cit9CisKK2lubGluZSBTdHlsZVJl
c29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6fk1hdGNoZWRQcm9wZXJ0aWVzKCkKK3sKK30KKwor
dm9pZCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllczo6cmVwb3J0TWVtb3J5VXNhZ2Uo
TWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlD
bGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6
OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIocHJvcGVydGllcywgInByb3BlcnRpZXMiKTsKK30K
Kwordm9pZCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbTo6cmVwb3J0
TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKK3sK
KyAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3Jl
TWVtb3J5VHlwZXM6OkNTUyk7CisgICAgaW5mby5hZGRNZW1iZXIobWF0Y2hlZFByb3BlcnRpZXMs
ICJtYXRjaGVkUHJvcGVydGllcyIpOworICAgIGluZm8uYWRkTWVtYmVyKHJhbmdlcywgInJhbmdl
cyIpOworICAgIGluZm8uYWRkTWVtYmVyKHJlbmRlclN0eWxlLCAicmVuZGVyU3R5bGUiKTsKKyAg
ICBpbmZvLmFkZE1lbWJlcihwYXJlbnRSZW5kZXJTdHlsZSwgInBhcmVudFJlbmRlclN0eWxlIik7
Cit9CisKK3ZvaWQgTWVkaWFRdWVyeVJlc3VsdDo6cmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2Jq
ZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKK3sKKyAgICBNZW1vcnlDbGFzc0luZm8g
aW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3JlTWVtb3J5VHlwZXM6OkNTUyk7Cisg
ICAgaW5mby5hZGRNZW1iZXIobV9leHByZXNzaW9uLCAiZXhwcmVzc2lvbiIpOworfQorCit2b2lk
IFN0eWxlUmVzb2x2ZXI6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9y
eU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2Jq
ZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVt
YmVyKG1fcnVsZVNldHMsICJydWxlU2V0cyIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fa2V5ZnJh
bWVzUnVsZU1hcCwgImtleWZyYW1lc1J1bGVNYXAiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGUsICJtYXRjaGVkUHJvcGVydGllc0NhY2hlIik7CisgICAgaW5m
by5hZGRNZW1iZXIobV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciwgIm1hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyIik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX21lZGl1
bSwgIm1lZGl1bSIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fcm9vdERlZmF1bHRTdHlsZSwgInJv
b3REZWZhdWx0U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2RvY3VtZW50LCAiZG9jdW1l
bnQiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fZm9udFNlbGVjdG9yLCAiZm9udFNlbGVjdG9y
Iik7CisgICAgaW5mby5hZGRNZW1iZXIobV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1
bHRzLCAidmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cyIpOworICAgIGluZm8uaWdu
b3JlTWVtYmVyKG1fc3R5bGVCdWlsZGVyKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2luc3BlY3Rv
ckNTU09NV3JhcHBlcnMpOworICAgIGluZm8uYWRkTWVtYmVyKG1fc2NvcGVSZXNvbHZlciwgInNj
b3BlUmVzb2x2ZXIiKTsKKworICAgIGluZm8uYWRkTWVtYmVyKG1fc3RhdGUsICJzdGF0ZSIpOwor
CisgICAgLy8gRklYTUU6IG1vdmUgdGhpcyB0byBhIHBsYWNlIHdoZXJlIGl0IHdvdWxkIGJlIGNh
bGxlZCBvbmx5IG9uY2U/CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRz
OjpkZWZhdWx0U3R5bGUsICJkZWZhdWx0U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NE
ZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRRdWlya3NTdHlsZSwgImRlZmF1bHRRdWlya3NTdHls
ZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFBy
aW50U3R5bGUsImRlZmF1bHRQcmludFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0Vmlld1NvdXJjZVN0eWxlLCAiZGVmYXVsdFZpZXdTb3Vy
Y2VTdHlsZSIpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAJKHJldmlzaW9uIDE0NTE4MSkKKysr
IFNvdXJjZS9XZWJDb3JlL2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTI3LDE4OSArMjcsMjYgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAiU3R5bGVSZXNvbHZlci5oIgorI2luY2x1ZGUgIkVsZW1lbnRSdWxlQ29sbGVjdG9yLmgi
CiAKLSNpbmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5oIgot
I2luY2x1ZGUgIkNTU0NhbGN1bGF0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NDdXJzb3JJbWFn
ZVZhbHVlLmgiCiAjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAi
Q1NTRm9udEZhY2VSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCi0jaW5jbHVk
ZSAiQ1NTTGluZUJveENvbnRhaW5WYWx1ZS5oIgotI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCi0j
aW5jbHVkZSAiQ1NTUGFyc2VyLmgiCi0jaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBwaW5n
cy5oIgotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJDU1NSZWZsZWN0
VmFsdWUuaCIKKyNpbmNsdWRlICJDU1NSdWxlLmgiCisjaW5jbHVkZSAiQ1NTUnVsZUxpc3QuaCIK
ICNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgogI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5oIgot
I2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgotI2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5oIgot
I2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NWYWx1ZUxp
c3QuaCIKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSNpbmNsdWRlICJDU1NWYXJpYWJsZVZh
bHVlLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkNhbGN1
bGF0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDb250ZW50RGF0YS5oIgotI2luY2x1ZGUgIkNvbnRl
eHRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIkNvdW50ZXIuaCIKLSNpbmNsdWRlICJDb3VudGVyQ29u
dGVudC5oIgotI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudFN0eWxl
U2hlZXRDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5oIgotI2luY2x1ZGUg
IkZvbnRGZWF0dXJlVmFsdWUuaCIKLSNpbmNsdWRlICJGb250VmFsdWUuaCIKLSNpbmNsdWRlICJG
cmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3
LmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElGcmFtZUVsZW1l
bnQuaCIKLSNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVz
LmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MUHJvZ3Jl
c3NFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUgIkhU
TUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRlICJJbnNlcnRpb25Qb2ludC5oIgotI2luY2x1
ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIktleWZyYW1lTGlzdC5o
IgotI2luY2x1ZGUgIkxpbmtIYXNoLmgiCi0jaW5jbHVkZSAiTG9jYWxlVG9TY3JpcHRNYXBwaW5n
LmgiCi0jaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKLSNpbmNsdWRlICJNYXRyaXgzRFRyYW5zZm9y
bU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oIgotI2lu
Y2x1ZGUgIk1lZGlhTGlzdC5oIgotI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIKLSNp
bmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKLSNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29udGV4
dC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQYWlyLmgiCi0jaW5jbHVkZSAiUGVy
c3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJRdW90ZXNEYXRhLmgiCi0j
aW5jbHVkZSAiUmVjdC5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRl
ICJIVE1MRWxlbWVudC5oIgogI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgotI2luY2x1ZGUgIlJl
bmRlclNjcm9sbGJhci5oIgotI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhclRoZW1lLmgiCi0jaW5j
bHVkZSAiUmVuZGVyU3R5bGVDb25zdGFudHMuaCIKLSNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgot
I2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNpbmNsdWRlICJSb3RhdGVUcmFuc2Zvcm1PcGVyYXRp
b24uaCIKLSNpbmNsdWRlICJSdWxlU2V0LmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRlbnNp
b25zLmgiCi0jaW5jbHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50LmgiCi0jaW5jbHVkZSAiU2NhbGVU
cmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1
ZGUgIlNWR0VsZW1lbnQuaCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5oIgot
I2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAiU2hhZG93RGF0YS5oIgotI2luY2x1ZGUg
IlNoYWRvd1Jvb3QuaCIKLSNpbmNsdWRlICJTaGFkb3dWYWx1ZS5oIgogI2luY2x1ZGUgIlNpYmxp
bmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCi0jaW5jbHVkZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlv
bi5oIgotI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1h
Z2UuaCIKLSNpbmNsdWRlICJTdHlsZUdlbmVyYXRlZEltYWdlLmgiCi0jaW5jbHVkZSAiU3R5bGVQ
ZW5kaW5nSW1hZ2UuaCIKICNpbmNsdWRlICJTdHlsZVByb3BlcnR5U2V0LmgiCi0jaW5jbHVkZSAi
U3R5bGVQcm9wZXJ0eVNob3J0aGFuZC5oIgotI2luY2x1ZGUgIlN0eWxlUnVsZS5oIgotI2luY2x1
ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgotI2luY2x1ZGUgIlN0eWxlU2hlZXRDb250ZW50cy5oIgot
I2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0LmgiCi0jaW5jbHVkZSAiVGV4dC5oIgotI2luY2x1ZGUg
IlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCi0jaW5jbHVkZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3Bl
cmF0aW9uLmgiCi0jaW5jbHVkZSAiVXNlckFnZW50U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJW
aWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJWaXNpdGVkTGlua1N0YXRlLmgiCi0j
aW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3RydW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIldlYktp
dENTU0tleWZyYW1lUnVsZS5oIgotI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lc1J1bGUuaCIK
LSNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25SdWxlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWUuaCIKLSNpbmNsdWRlICJXZWJLaXRGb250RmFtaWx5TmFtZXMuaCIKLSNpbmNs
dWRlICJYTUxOYW1lcy5oIgotI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0cnVtZW50YXRpb25IYXNo
TWFwLmg+Ci0jaW5jbHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hTZXQuaD4KLSNp
bmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9uVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLQotI2lmIEVOQUJMRShD
U1NfRklMVEVSUykKLSNpbmNsdWRlICJGaWx0ZXJPcGVyYXRpb24uaCIKLSNpbmNsdWRlICJXZWJL
aXRDU1NGaWx0ZXJWYWx1ZS5oIgotI2VuZGlmCi0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBP
UlQpCi0jaW5jbHVkZSAiRGFzaGJvYXJkUmVnaW9uLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShT
VkcpCi0jaW5jbHVkZSAiQ2FjaGVkU1ZHRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJDYWNoZWRTVkdE
b2N1bWVudFJlZmVyZW5jZS5oIgotI2luY2x1ZGUgIlNWR0RvY3VtZW50LmgiCi0jaW5jbHVkZSAi
U1ZHRWxlbWVudC5oIgotI2luY2x1ZGUgIlNWR05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZHVVJJUmVm
ZXJlbmNlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgotI2VuZGlm
Ci0KLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0jaW5jbHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQ
YXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJDb25zdGFudHMuaCIKLSNpbmNsdWRl
ICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJP
cGVyYXRpb24uaCIKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJQYXJhbWV0ZXIuaCIKLSNpbmNsdWRl
ICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIuaCIKLSNpbmNsdWRlICJTdHlsZUNhY2hl
ZFNoYWRlci5oIgotI2luY2x1ZGUgIlN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbS5oIgotI2luY2x1
ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgotI2luY2x1ZGUgIlN0eWxlU2hhZGVyLmgiCi0jaW5j
bHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1No
YWRlclZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQotI2luY2x1
ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKLSNpbmNsdWRlICJTdHlsZUNhY2hlZEltYWdlU2V0Lmgi
Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSNpbmNsdWRlICJXZWJWVFRFbGVt
ZW50LmgiCi0jZW5kaWYKKyNpbmNsdWRlICJTdHlsZWRFbGVtZW50LmgiCiAKLXVzaW5nIG5hbWVz
cGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSBXVEYgewotCi10ZW1wbGF0ZTw+IHN0cnVjdCBTZXF1ZW5j
ZU1lbW9yeUluc3RydW1lbnRhdGlvblRyYWl0czxjb25zdCBXZWJDb3JlOjpSdWxlRGF0YSo+IHsK
LSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgST4gc3RhdGljIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2Uo
SSwgSSwgTWVtb3J5Q2xhc3NJbmZvJikgeyB9Ci19OwotCi19CisjaW5jbHVkZSA8d3RmL1RlbXBv
cmFyeUNoYW5nZS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBI
VE1MTmFtZXM7Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlz
SW5oZXJpdCkgeyBcCi0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJl
bnRTdHlsZSgpLT5wcm9wKCkpOyBcCi0gICAgcmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwgUHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwg
UHJvcCkgXAotaWYgKGlzSW5pdGlhbCkgeyBcCi0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1By
b3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1Byb3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQot
UmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KIHN0
YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkKIHsKICAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHRE
ZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3JlYXRlKCkpKTsKQEAgLTIyNiwyMDUgKzYzLDQ5IEBA
IHN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiByaWdodFRvTGVmdERlY2wKICAgICByZXR1cm4gcmln
aHRUb0xlZnREZWNsLmdldCgpOwogfQogCi0KLWlubGluZSBTdGF0aWNDU1NSdWxlTGlzdCogU3R5
bGVSZXNvbHZlcjo6U3RhdGU6OmVuc3VyZVJ1bGVMaXN0KCkKLXsKLSAgICBpZiAoIW1fcnVsZUxp
c3QpCi0gICAgICAgIG1fcnVsZUxpc3QgPSBTdGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7Ci0g
ICAgcmV0dXJuIG1fcnVsZUxpc3QuZ2V0KCk7Ci19Ci0KLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2
ZXI6OlN0YXRlOjpjYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKQotewotICAgIG1faGFzVUFBcHBl
YXJhbmNlID0gbV9zdHlsZS0+aGFzQXBwZWFyYW5jZSgpOwotICAgIGlmIChtX2hhc1VBQXBwZWFy
YW5jZSkgewotICAgICAgICBtX2JvcmRlckRhdGEgPSBtX3N0eWxlLT5ib3JkZXIoKTsKLSAgICAg
ICAgbV9iYWNrZ3JvdW5kRGF0YSA9ICptX3N0eWxlLT5iYWNrZ3JvdW5kTGF5ZXJzKCk7Ci0gICAg
ICAgIG1fYmFja2dyb3VuZENvbG9yID0gbV9zdHlsZS0+YmFja2dyb3VuZENvbG9yKCk7Ci0gICAg
fQotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2xlYXIoKQotewotICAg
IG1fZWxlbWVudCA9IDA7Ci0gICAgbV9zdHlsZWRFbGVtZW50ID0gMDsKLSAgICBtX3BhcmVudFN0
eWxlID0gMDsKLSAgICBtX3BhcmVudE5vZGUgPSAwOwotICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9
IDA7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0gICAgbV9tYXRjaGVkUnVsZXMuY2xlYXIoKTsKLSAg
ICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKLSNpZiBFTkFCTEUoQ1NTX1NIQURF
UlMpCi0gICAgbV9oYXNQZW5kaW5nU2hhZGVycyA9IGZhbHNlOwotI2VuZGlmCi0jaWYgRU5BQkxF
KENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgIG1fcGVuZGluZ1NWR0RvY3VtZW50cy5j
bGVhcigpOwotI2VuZGlmCi19Ci0KLVN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1l
bnQqIGRvY3VtZW50LCBib29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICA6IG1fbWF0
Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwKDApCi0gICAgLCBtX21h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2Vl
cE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUpCi0gICAgLCBtX2RvY3VtZW50KGRvY3VtZW50KQotICAg
ICwgbV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMobWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQot
ICAgICwgbV9mb250U2VsZWN0b3IoQ1NTRm9udFNlbGVjdG9yOjpjcmVhdGUoZG9jdW1lbnQpKQot
I2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAgLCBtX3ZpZXdwb3J0U3R5bGVS
ZXNvbHZlcihWaWV3cG9ydFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZShkb2N1bWVudCkpCi0jZW5kaWYK
LSAgICAsIG1fc3R5bGVCdWlsZGVyKFN0eWxlQnVpbGRlcjo6c2hhcmVkU3R5bGVCdWlsZGVyKCkp
Ci0gICAgLCBtX3N0eWxlTWFwKHRoaXMpCi17Ci0gICAgRWxlbWVudCogcm9vdCA9IGRvY3VtZW50
LT5kb2N1bWVudEVsZW1lbnQoKTsKLQotICAgIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6aW5pdERl
ZmF1bHRTdHlsZShyb290KTsKLQotICAgIC8vIGNvbnN0cnVjdCBkb2N1bWVudCByb290IGVsZW1l
bnQgZGVmYXVsdCBzdHlsZS4gdGhpcyBpcyBuZWVkZWQKLSAgICAvLyB0byBldmFsdWF0ZSBtZWRp
YSBxdWVyaWVzIHRoYXQgY29udGFpbiByZWxhdGl2ZSBjb25zdHJhaW50cywgbGlrZSAic2NyZWVu
IGFuZCAobWF4LXdpZHRoOiAxMGVtKSIKLSAgICAvLyBUaGlzIGlzIGhlcmUgaW5zdGVhZCBvZiBj
b25zdHJ1Y3RvciwgYmVjYXVzZSB3aGVuIGNvbnN0cnVjdG9yIGlzIHJ1biwKLSAgICAvLyBkb2N1
bWVudCBkb2Vzbid0IGhhdmUgZG9jdW1lbnRFbGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1
bWVzIHRoYXQgZWxlbWVudCB0aGF0IGdldHMgcGFzc2VkIHRvIHN0eWxlRm9yRWxlbWVudCAtY2Fs
bAotICAgIC8vIGlzIGFsd2F5cyBmcm9tIHRoZSBkb2N1bWVudCB0aGF0IG93bnMgdGhlIHN0eWxl
IHNlbGVjdG9yCi0gICAgRnJhbWVWaWV3KiB2aWV3ID0gZG9jdW1lbnQtPnZpZXcoKTsKLSAgICBp
ZiAodmlldykKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1
YXRvcih2aWV3LT5tZWRpYVR5cGUoKSkpOwotICAgIGVsc2UKLSAgICAgICAgbV9tZWRpdW0gPSBh
ZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2YWx1YXRvcigiYWxsIikpOwotCi0gICAgaWYgKHJvb3Qp
Ci0gICAgICAgIG1fcm9vdERlZmF1bHRTdHlsZSA9IHN0eWxlRm9yRWxlbWVudChyb290LCAwLCBE
aXNhbGxvd1N0eWxlU2hhcmluZywgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpOwotCi0gICAgaWYg
KG1fcm9vdERlZmF1bHRTdHlsZSAmJiB2aWV3KQotICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRy
KG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZpZXctPm1lZGlhVHlwZSgpLCB2aWV3LT5mcmFtZSgp
LCBtX3Jvb3REZWZhdWx0U3R5bGUuZ2V0KCkpKTsKLQotICAgIG1fcnVsZVNldHMucmVzZXRBdXRo
b3JTdHlsZSgpOwotCi0gICAgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiogc3R5bGVTaGVl
dENvbGxlY3Rpb24gPSBkb2N1bWVudC0+c3R5bGVTaGVldENvbGxlY3Rpb24oKTsKLSAgICBtX3J1
bGVTZXRzLmluaXRVc2VyU3R5bGUoc3R5bGVTaGVldENvbGxlY3Rpb24sICptX21lZGl1bSwgKnRo
aXMpOwotCi0jaWYgRU5BQkxFKFNWR19GT05UUykKLSAgICBpZiAoZG9jdW1lbnQtPnN2Z0V4dGVu
c2lvbnMoKSkgewotICAgICAgICBjb25zdCBIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+JiBz
dmdGb250RmFjZUVsZW1lbnRzID0gZG9jdW1lbnQtPnN2Z0V4dGVuc2lvbnMoKS0+c3ZnRm9udEZh
Y2VFbGVtZW50cygpOwotICAgICAgICBIYXNoU2V0PFNWR0ZvbnRGYWNlRWxlbWVudCo+Ojpjb25z
dF9pdGVyYXRvciBlbmQgPSBzdmdGb250RmFjZUVsZW1lbnRzLmVuZCgpOwotICAgICAgICBmb3Ig
KEhhc2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3ZnRm9u
dEZhY2VFbGVtZW50cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICAgICBmb250
U2VsZWN0b3IoKS0+YWRkRm9udEZhY2VSdWxlKCgqaXQpLT5mb250RmFjZVJ1bGUoKSk7Ci0gICAg
fQotI2VuZGlmCi0KLSAgICBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cygwLCBzdHlsZVNoZWV0Q29s
bGVjdGlvbi0+YWN0aXZlQXV0aG9yU3R5bGVTaGVldHMoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6YXBwZW5kQXV0aG9yU3R5bGVTaGVldHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZl
Y3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4gPiYgc3R5bGVTaGVldHMpCi17Ci0gICAgbV9ydWxl
U2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0cyhmaXJzdE5ldywgc3R5bGVTaGVldHMsIG1fbWVk
aXVtLmdldCgpLCBtX2luc3BlY3RvckNTU09NV3JhcHBlcnMsIGRvY3VtZW50KCktPmlzVmlld1Nv
dXJjZSgpLCB0aGlzKTsKLSAgICBpZiAoZG9jdW1lbnQoKS0+cmVuZGVyZXIoKSAmJiBkb2N1bWVu
dCgpLT5yZW5kZXJlcigpLT5zdHlsZSgpKQotICAgICAgICBkb2N1bWVudCgpLT5yZW5kZXJlcigp
LT5zdHlsZSgpLT5mb250KCkudXBkYXRlKGZvbnRTZWxlY3RvcigpKTsKLQotI2lmIEVOQUJMRShD
U1NfREVWSUNFX0FEQVBUQVRJT04pCi0gICAgdmlld3BvcnRTdHlsZVJlc29sdmVyKCktPnJlc29s
dmUoKTsKLSNlbmRpZgotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnB1c2hQYXJlbnRFbGVtZW50
KEVsZW1lbnQqIHBhcmVudCkKLXsKLSAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRzUGFy
ZW50ID0gcGFyZW50LT5wYXJlbnRPclNoYWRvd0hvc3RFbGVtZW50KCk7Ci0KLSAgICAvLyBXZSBh
cmUgbm90IGFsd2F5cyBpbnZva2VkIGNvbnNpc3RlbnRseS4gRm9yIGV4YW1wbGUsIHNjcmlwdCBl
eGVjdXRpb24gY2FuIGNhdXNlIHVzIHRvIGVudGVyCi0gICAgLy8gc3R5bGUgcmVjYWxjIGluIHRo
ZSBtaWRkbGUgb2YgdHJlZSBidWlsZGluZy4gV2UgbWF5IGFsc28gYmUgaW52b2tlZCBmcm9tIHNv
bWV3aGVyZSB3aXRoaW4gdGhlIHRyZWUuCi0gICAgLy8gUmVzZXQgdGhlIHN0YWNrIGluIHRoaXMg
Y2FzZSwgb3IgaWYgd2Ugc2VlIGEgbmV3IHJvb3QgZWxlbWVudC4KLSAgICAvLyBPdGhlcndpc2Ug
anVzdCBwdXNoIHRoZSBuZXcgcGFyZW50LgotICAgIGlmICghcGFyZW50c1BhcmVudCB8fCBtX3Nl
bGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNFbXB0eSgpKQotICAgICAgICBtX3NlbGVjdG9yRmls
dGVyLnNldHVwUGFyZW50U3RhY2socGFyZW50KTsKLSAgICBlbHNlCi0gICAgICAgIG1fc2VsZWN0
b3JGaWx0ZXIucHVzaFBhcmVudChwYXJlbnQpOwotCi0gICAgLy8gTm90ZTogV2UgbXVzdG4ndCBz
a2lwIFNoYWRvd1Jvb3Qgbm9kZXMgZm9yIHRoZSBzY29wZSBzdGFjay4KLSAgICBpZiAobV9zY29w
ZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2gocGFyZW50LCBwYXJlbnQt
PnBhcmVudE9yU2hhZG93SG9zdE5vZGUoKSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cG9w
UGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJlbnQpCi17Ci0gICAgLy8gTm90ZSB0aGF0IHdlIG1h
eSBnZXQgaW52b2tlZCBmb3Igc29tZSByYW5kb20gZWxlbWVudHMgaW4gc29tZSB3YWNreSBjYXNl
cyBkdXJpbmcgc3R5bGUgcmVzb2x2ZS4KLSAgICAvLyBQYXVzZSBtYWludGFpbmluZyB0aGUgc3Rh
Y2sgaW4gdGhpcyBjYXNlLgotICAgIGlmIChtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXND
b25zaXN0ZW50KHBhcmVudCkpCi0gICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIucG9wUGFyZW50KCk7
Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wb3Ao
cGFyZW50KTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50U2hhZG93Um9vdChj
b25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290KQorU3R5bGVSZXNvbHZlcjo6TWF0Y2hSZXN1bHQm
IEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaGVkUmVzdWx0KCkKIHsKLSAgICBBU1NFUlQoc2hh
ZG93Um9vdC0+aG9zdCgpKTsKLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Nj
b3BlUmVzb2x2ZXItPnB1c2goc2hhZG93Um9vdCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKKyAgICBB
U1NFUlQobV9tb2RlID09IFNlbGVjdG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOworICAgIHJl
dHVybiBtX3Jlc3VsdDsKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRTaGFkb3dS
b290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0
PiBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hlZFJ1bGVMaXN0KCkKIHsKLSAgICBBU1NFUlQo
c2hhZG93Um9vdC0+aG9zdCgpKTsKLSAgICBpZiAobV9zY29wZVJlc29sdmVyKQotICAgICAgICBt
X3Njb3BlUmVzb2x2ZXItPnBvcChzaGFkb3dSb290KTsKKyAgICBBU1NFUlQobV9tb2RlID09IFNl
bGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5y
ZWxlYXNlKCk7CiB9CiAKLS8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHN0eWxlIHNldHRpbmcgZnVu
Y3Rpb24gZm9yIGtleWZyYW1lIHN0eWxlcwotdm9pZCBTdHlsZVJlc29sdmVyOjphZGRLZXlmcmFt
ZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJhbWVzPiBydWxlKQoraW5saW5lIHZvaWQg
RWxlbWVudFJ1bGVDb2xsZWN0b3I6OmFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1bGVEYXRhKiBydWxl
KQogewotICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUoKSk7Ci0gICAgbV9rZXlmcmFtZXNS
dWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7CisgICAgaWYgKCFtX21hdGNoZWRSdWxlcykKKyAg
ICAgICAgbV9tYXRjaGVkUnVsZXMgPSBhZG9wdFB0cihuZXcgVmVjdG9yPGNvbnN0IFJ1bGVEYXRh
KiwgMzI+KTsKKyAgICBtX21hdGNoZWRSdWxlcy0+YXBwZW5kKHJ1bGUpOwogfQogCi1TdHlsZVJl
c29sdmVyOjp+U3R5bGVSZXNvbHZlcigpCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rv
cjo6Y2xlYXJNYXRjaGVkUnVsZXMoKQogewotICAgIG1fZm9udFNlbGVjdG9yLT5jbGVhckRvY3Vt
ZW50KCk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQotICAgIG1fdmlld3Bv
cnRTdHlsZVJlc29sdmVyLT5jbGVhckRvY3VtZW50KCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5bGVSZXNvbHZl
cj4qKQotewotICAgIC8vIExvb2sgZm9yIGNhY2hlIGVudHJpZXMgY29udGFpbmluZyBhIHN0eWxl
IGRlY2xhcmF0aW9uIHdpdGggYSBzaW5nbGUgcmVmIGFuZCByZW1vdmUgdGhlbS4KLSAgICAvLyBU
aGlzIG1heSBoYXBwZW4gd2hlbiBhbiBlbGVtZW50IGF0dHJpYnV0ZSBtdXRhdGlvbiBjYXVzZXMg
aXQgdG8gZ2VuZXJhdGUgYSBuZXcgaW5saW5lU3R5bGUoKQotICAgIC8vIG9yIHByZXNlbnRhdGlv
bkF0dHJpYnV0ZVN0eWxlKCksIHBvdGVudGlhbGx5IGxlYXZpbmcgdGhpcyBjYWNoZSB3aXRoIHRo
ZSBsYXN0IHJlZiBvbiB0aGUgb2xkIG9uZS4KLSAgICBWZWN0b3I8dW5zaWduZWQsIDE2PiB0b1Jl
bW92ZTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZS5iZWdpbigpOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0
ZXJhdG9yIGVuZCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5lbmQoKTsKLSAgICBmb3IgKDsg
aXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcz4mIG1h
dGNoZWRQcm9wZXJ0aWVzID0gaXQtPnZhbHVlLm1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgICAgICBpZiAobWF0Y2hlZFByb3BlcnRpZXNbaV0ucHJvcGVydGllcy0+aGFzT25lUmVm
KCkpIHsKLSAgICAgICAgICAgICAgICB0b1JlbW92ZS5hcHBlbmQoaXQtPmtleSk7Ci0gICAgICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7ICsraSkKLSAgICAgICAgbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlLnJlbW92ZSh0b1JlbW92ZVtpXSk7Ci0KLSAgICBtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCA9IDA7CisgICAgaWYgKCFtX21h
dGNoZWRSdWxlcykKKyAgICAgICAgcmV0dXJuOworICAgIG1fbWF0Y2hlZFJ1bGVzLT5jbGVhcigp
OwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVz
dWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5
bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5
cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQoraW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBFbGVt
ZW50UnVsZUNvbGxlY3Rvcjo6ZW5zdXJlUnVsZUxpc3QoKQogewotICAgIG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
ICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVz
ID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJv
cGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVz
LndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQu
bWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKKyAgICBpZiAoIW1fcnVsZUxpc3QpCisgICAgICAg
IG1fcnVsZUxpc3QgPSBTdGF0aWNDU1NSdWxlTGlzdDo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIG1f
cnVsZUxpc3QuZ2V0KCk7CiB9CiAKLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1l
bnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0
eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXNDYWNoZWFibGUpCitpbmxpbmUgdm9pZCBFbGVtZW50
UnVsZUNvbGxlY3Rvcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhjb25zdCBTdHlsZVByb3Bl
cnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKIHsKICAgICBpZiAoIXByb3Bl
cnR5U2V0KQogICAgICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVs
ZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5n
ZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0
aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFBy
b3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7CisgICAgbV9yZXN1bHQucmFuZ2VzLmxhc3RB
dXRob3JSdWxlID0gbV9yZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOworICAgIGlmICht
X3Jlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQorICAgICAgICBtX3Jlc3VsdC5y
YW5nZXMuZmlyc3RBdXRob3JSdWxlID0gbV9yZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlOwor
ICAgIG1fcmVzdWx0LmFkZE1hdGNoZWRQcm9wZXJ0aWVzKHByb3BlcnR5U2V0KTsKICAgICBpZiAo
IWlzQ2FjaGVhYmxlKQotICAgICAgICByZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKKyAgICAg
ICAgbV9yZXN1bHQuaXNDYWNoZWFibGUgPSBmYWxzZTsKIH0KIAogY2xhc3MgTWF0Y2hpbmdVQVJ1
bGVzU2NvcGUgewpAQCAtNDU2LDEyICsxMzcsMTIgQEAgaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1
bGVzU2NvcGU6OmlzTWF0YwogCiBib29sIE1hdGNoaW5nVUFSdWxlc1Njb3BlOjptX21hdGNoaW5n
VUFSdWxlcyA9IGZhbHNlOwogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1
bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1bGVSYW5n
ZSkKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OmNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0
IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmIHJ1
bGVSYW5nZSkKIHsKICAgICBBU1NFUlQobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQpOwogICAgIEFTU0VS
VChtX3N0YXRlLmVsZW1lbnQoKSk7CiAKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAg
IGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CiAgICAgRWxlbWVu
dCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKTsKICAgICBjb25zdCBTdHlsZWRFbGVtZW50KiBz
dHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpOwogICAgIGNvbnN0IEF0b21pY1N0
cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5zaGFkb3dQc2V1ZG9JZCgpOwpAQCAtNDgyLDcgKzE2
Myw3IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICBpZiAo
IU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCiAgICAgICAgICYmICF0
cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkKICAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Qu
c2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0g
ICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVj
a2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKKyAgICAgICAgJiYgbV9iZWhhdmlvckF0Qm91bmRh
cnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKICAgICAgICAgcmV0
dXJuOwogCiAgICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNz
LCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKQEAgLTUwMiwxNSAr
MTgzLDE1IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnVuaXZlcnNh
bFJ1bGVzKCksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKIH0KIAotdm9pZCBTdHlsZVJlc29s
dmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1h
dGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVj
dG9yOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmIG1h
dGNoUmVxdWVzdCwgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlJiBydWxlUmFuZ2UpCiB7Ci0gICAg
aWYgKCFtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSkKKyAgICBpZiAoIW1fcmVnaW9uRm9yU3R5
bGluZykKICAgICAgICAgcmV0dXJuOwogCiAgICAgdW5zaWduZWQgc2l6ZSA9IG1hdGNoUmVxdWVz
dC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLnNpemUoKTsKICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICAgIGNvbnN0IENTU1NlbGVj
dG9yKiByZWdpb25TZWxlY3RvciA9IG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVj
dG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25T
ZWxlY3RvcihyZWdpb25TZWxlY3Rvciwgc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG1fc3RhdGUucmVn
aW9uRm9yU3R5bGluZygpLT5ub2RlKCkpKSkgeworICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxl
Y3RvcihyZWdpb25TZWxlY3Rvciwgc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG1fcmVnaW9uRm9yU3R5
bGluZy0+bm9kZSgpKSkpIHsKICAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0
Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVs
ZVNldC5nZXQoKTsKICAgICAgICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7CiAgICAgICAgICAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVx
dWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsK
QEAgLTUxOCwxOCArMTk5LDE5IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5n
UnVsZXMKICAgICB9CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0
Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
Ojpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKQogewotICAgIFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0gICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSBz
dGF0ZS5tYXRjaGVkUnVsZXMoKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKKyAg
ICBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworCisgICAgaWYg
KCFtX21hdGNoZWRSdWxlcyB8fCBtX21hdGNoZWRSdWxlcy0+aXNFbXB0eSgpKQogICAgICAgICBy
ZXR1cm47CiAKICAgICBzb3J0TWF0Y2hlZFJ1bGVzKCk7CiAKLSAgICBpZiAoc3RhdGUubW9kZSgp
ID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgVmVjdG9yPGNvbnN0
IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMgPSAqbV9tYXRjaGVkUnVsZXM7CisgICAgaWYg
KG1fbW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgewogICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgKytpKQotICAgICAg
ICAgICAgc3RhdGUuZW5zdXJlUnVsZUxpc3QoKS0+cnVsZXMoKS5hcHBlbmQobWF0Y2hlZFJ1bGVz
W2ldLT5ydWxlKCktPmNyZWF0ZUNTU09NV3JhcHBlcigpKTsKKyAgICAgICAgICAgIGVuc3VyZVJ1
bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVD
U1NPTVdyYXBwZXIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTUzNywxMSArMjE5
LDExIEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVyTWF0Y2gKICAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAg
IGlmIChzdGF0ZS5zdHlsZSgpICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0
dHJpYnV0ZVNlbGVjdG9yKCkpCiAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUo
KTsKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0t
PnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1
bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxp
c3RUeXBlKCkpOworICAgICAgICBtX3Jlc3VsdC5hZGRNYXRjaGVkUHJvcGVydGllcyhtYXRjaGVk
UnVsZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGllcygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwg
bWF0Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hUeXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVy
dHlXaGl0ZWxpc3RUeXBlKCkpOwogICAgIH0KIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRj
aFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVz
KGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCiB7CiAjaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkgfHwg
RU5BQkxFKFNIQURPV19ET00pCiAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCkBAIC01NTMsOCAr
MjM1LDggQEAgdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bAogICAgICAg
ICBib29sIGRvY3VtZW50U2NvcGUgPSB0cnVlOwogICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUg
PSBtX3Njb3BlUmVzb2x2ZXItPnN0YWNrU2l6ZSgpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgc2NvcGVTaXplOyArK2kpIHsKLSAgICAgICAgICAgIG1fc3RhdGUubWF0Y2hlZFJ1
bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUg
PSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgIGNsZWFy
TWF0Y2hlZFJ1bGVzKCk7CisgICAgICAgICAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1
bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwogCiAgICAgICAgICAg
ICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJl
c29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7CiAgICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9j
dW1lbnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKQEAgLTU2Nywz
NiArMjQ5LDI2IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hTY29wZWRBdXRob3JSdWwKICAg
ICAgICAgICAgIH0KIAogICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFt
ZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAg
ICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgp
OworICAgICAgICAgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVz
dWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKICAgICAgICAgICAgIGNvbGxlY3RNYXRjaGlu
Z1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKICAgICAgICAgICAgIGNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICAgICAgICAg
IHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAgICAgICAgICAgc29ydEFu
ZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtYXRjaEhv
c3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBtYXRjaEhvc3RSdWxlcyhp
bmNsdWRlRW1wdHlSdWxlcyk7CiAjZWxzZQotICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwogICAg
IFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlSdWxlcyk7CiAjZW5kaWYKIH0KIAotaW5saW5lIGJv
b2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygp
Ci17Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlciAm
JiBtX3Njb3BlUmVzb2x2ZXItPnN0eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMo
bV9zdGF0ZS5lbGVtZW50KCkpOwotI2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0
LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0
Y2hIb3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKIHsKICNpZiBFTkFCTEUoU0hBRE9X
X0RPTSkKICAgICBBU1NFUlQobV9zY29wZVJlc29sdmVyKTsKIAotICAgIG1fc3RhdGUubWF0Y2hl
ZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMo
KTsKKyAgICBtX3Jlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxOwogCiAgICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVs
ZXM7CiAgICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQo
KSwgbWF0Y2hlZFJ1bGVzKTsKQEAgLTYwNCw4OCArMjc2LDE1NiBAQCB2b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoCiAgICAgICAgIHJldHVybjsKIAogICAgIGZvciAodW5z
aWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgUnVs
ZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7CisgICAg
ICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMu
YXV0aG9yUnVsZVJhbmdlKCk7CiAgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVx
dWVzdChtYXRjaGVkUnVsZXMuYXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxl
bWVudCgpKSwgcnVsZVJhbmdlKTsKICAgICB9Ci0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKHJlc3VsdCk7CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CiAjZWxzZQot
ICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOwogICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1wdHlS
dWxlcyk7CiAjZW5kaWYKIH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEF1dGhvclJ1bGVz
KE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCisjaWYgRU5BQkxF
KFNIQURPV19ET00pCitpbmxpbmUgdm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hTaGFk
b3dEaXN0cmlidXRlZFJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMsIFN0eWxlUmVzb2x2ZXI6
OlJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIGlmIChtX3J1bGVTZXRzLnNoYWRvd0Rpc3Ry
aWJ1dGVkUnVsZXMoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFRlbXBvcmFy
eUNoYW5nZTxib29sPiBjYW5Vc2VGYXN0UmVqZWN0KG1fY2FuVXNlRmFzdFJlamVjdCwgZmFsc2Up
OworICAgIFRlbXBvcmFyeUNoYW5nZTxTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFy
eT4gYmVoYXZpb3JBdEJvdW5kYXJ5KG1fYmVoYXZpb3JBdEJvdW5kYXJ5LCBTZWxlY3RvckNoZWNr
ZXI6OkNyb3NzZXNCb3VuZGFyeSk7CisKKyAgICBWZWN0b3I8TWF0Y2hSZXF1ZXN0PiBtYXRjaFJl
cXVlc3RzOworICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0ZWRSdWxlcygpLmNvbGxlY3RN
YXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJlcXVlc3RzKTsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdHNbaV0sIHJ1bGVSYW5nZSk7Cit9CisjZW5k
aWYKKwordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6bWF0Y2hBdXRob3JSdWxlcyhib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKQogewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsK
LSAgICByZXN1bHQucmFuZ2VzLmxhc3RBdXRob3JSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0
aWVzLnNpemUoKSAtIDE7CisgICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKKyAgICBtX3Jlc3VsdC5y
YW5nZXMubGFzdEF1dGhvclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxOwogCiAgICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkKICAgICAgICAgcmV0dXJuOwogCiAg
ICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KICAgICBNYXRjaFJlcXVlc3QgbWF0Y2hS
ZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwor
ICAgIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSBydWxlUmFuZ2UgPSBtX3Jlc3VsdC5yYW5nZXMu
YXV0aG9yUnVsZVJhbmdlKCk7CiAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOwogICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKICNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBWZWN0b3I8TWF0
Y2hSZXF1ZXN0PiBtYXRjaFJlcXVlc3RzOwotICAgIG1fcnVsZVNldHMuc2hhZG93RGlzdHJpYnV0
ZWRSdWxlcygpLmNvbGxlY3RNYXRjaFJlcXVlc3RzKGluY2x1ZGVFbXB0eVJ1bGVzLCBtYXRjaFJl
cXVlc3RzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoUmVxdWVzdHMuc2l6ZSgp
OyArK2kpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdHNbaV0sIHJ1
bGVSYW5nZSk7CisgICAgbWF0Y2hTaGFkb3dEaXN0cmlidXRlZFJ1bGVzKGluY2x1ZGVFbXB0eVJ1
bGVzLCBydWxlUmFuZ2UpOwogI2VuZGlmCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVz
KCk7CiAKLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLQotICAgIG1h
dGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgbWF0
Y2hTY29wZWRBdXRob3JSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcyk7CiB9CiAKLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVXNlclJ1bGVzKGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMpCiB7CiAgICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgp
KQogICAgICAgICByZXR1cm47CiAgICAgCi0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVh
cigpOworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CiAKLSAgICByZXN1bHQucmFuZ2VzLmxhc3RV
c2VyUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOworICAgIG1fcmVz
dWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSBtX3Jlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXpl
KCkgLSAxOwogICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5
bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1
bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2Ug
cnVsZVJhbmdlID0gbV9yZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKICAgICBjb2xsZWN0
TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CiAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwogCi0gICAgc29ydEFu
ZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hl
ZFJ1bGVzKCk7Cit9CisKK3ZvaWQgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Om1hdGNoVUFSdWxlcygp
Cit7CisgICAgTWF0Y2hpbmdVQVJ1bGVzU2NvcGUgc2NvcGU7CisKKyAgICAvLyBGaXJzdCB3ZSBt
YXRjaCBydWxlcyBmcm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChDU1NEZWZhdWx0
U3R5bGVTaGVldHM6OnNpbXBsZURlZmF1bHRTdHlsZVNoZWV0KQorICAgICAgICBtX3Jlc3VsdC5p
c0NhY2hlYWJsZSA9IGZhbHNlOworICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBt
X2lzUHJpbnRTdHlsZQorICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFBy
aW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZTsKKyAgICBtYXRj
aFVBUnVsZXModXNlckFnZW50U3R5bGVTaGVldCk7CisKKyAgICAvLyBJbiBxdWlya3MgbW9kZSwg
d2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgcXVpcmtzIHVzZXIgYWdlbnQgc2hlZXQuCisgICAgaWYg
KGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpKQorICAgICAgICBtYXRjaFVBUnVsZXMoQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9jdW1l
bnQgdXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1s
IHZpZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBz
dHlsZSBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAgICAg
IG1hdGNoVUFSdWxlcyhDU1NEZWZhdWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsK
IH0KIAotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgUnVsZVNldCogcnVsZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaFVBUnVs
ZXMoUnVsZVNldCogcnVsZXMpCiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigp
OworICAgIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CiAgICAgCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0
VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAgUnVsZVJh
bmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKKyAgICBtX3Jlc3Vs
dC5yYW5nZXMubGFzdFVBUnVsZSA9IG1fcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAt
IDE7CisgICAgU3R5bGVSZXNvbHZlcjo6UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IG1fcmVzdWx0LnJh
bmdlcy5VQVJ1bGVSYW5nZSgpOwogICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVz
dChydWxlcyksIHJ1bGVSYW5nZSk7CiAKLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMo
cmVzdWx0KTsKKyAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoKTsKK30KKworaW5saW5l
IGJvb2wgRWxlbWVudFJ1bGVDb2xsZWN0b3I6OnJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiBy
dWxlRGF0YSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiBkeW5hbWljUHNl
dWRvKQoreworICAgIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7
CisKKyAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsKKyAgICAg
ICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBzZXVkbyBl
bGVtZW50cy4KKyAgICAgICAgaWYgKG1fcHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkICE9IE5P
UFNFVURPKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBXZSBrbm93IGEg
c3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRjaGVzIHNpbXBseSBi
ZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KKyAgICAgICAgLy8gVGhpcyBp
cyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBuYW1l
c3BhY2UuCisgICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxlY3Rvck1hdGNoaW5n
SFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgp
KSB7CisgICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNlbGVjdG9yKCkpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bGVE
YXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAmJiAhU2VsZWN0b3JD
aGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEuc2VsZWN0b3IoKS0+
dGFnUU5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFNlbGVjdG9y
Q2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVEYXRhLnNlbGVjdG9y
KCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAgICAgIGlmICghc2VsZWN0b3JDaGVja2VyRmFzdFBh
dGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1hdGNo
ZXMoKTsKKyAgICB9CisKKyAgICAvLyBTbG93IHBhdGguCisgICAgU2VsZWN0b3JDaGVja2VyIHNl
bGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBtX21vZGUpOworICAgIFNlbGVjdG9yQ2hlY2tlcjo6
U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0
ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRW5hYmxlZCk7CisgICAg
Y29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOworICAgIGNvbnRleHQuc2NvcGUg
PSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVkb0lkID0gbV9wc2V1ZG9TdHlsZVJlcXVlc3QucHNl
dWRvSWQ7CisgICAgY29udGV4dC5zY3JvbGxiYXIgPSBtX3BzZXVkb1N0eWxlUmVxdWVzdC5zY3Jv
bGxiYXI7CisgICAgY29udGV4dC5zY3JvbGxiYXJQYXJ0ID0gbV9wc2V1ZG9TdHlsZVJlcXVlc3Qu
c2Nyb2xsYmFyUGFydDsKKyAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IG1fYmVoYXZp
b3JBdEJvdW5kYXJ5OworICAgIFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2ggbWF0Y2ggPSBzZWxlY3Rv
ckNoZWNrZXIubWF0Y2goY29udGV4dCwgZHluYW1pY1BzZXVkbywgRE9NU2libGluZ1RyYXZlcnNh
bFN0cmF0ZWd5KCkpOworICAgIGlmIChtYXRjaCAhPSBTZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9y
TWF0Y2hlcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChtX3BzZXVkb1N0eWxlUmVx
dWVzdC5wc2V1ZG9JZCAhPSBOT1BTRVVETyAmJiBtX3BzZXVkb1N0eWxlUmVxdWVzdC5wc2V1ZG9J
ZCAhPSBkeW5hbWljUHNldWRvKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRy
dWU7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0
KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNo
UmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9y
Ojpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiogcnVs
ZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBTdHlsZVJlc29sdmVyOjpSdWxl
UmFuZ2UmIHJ1bGVSYW5nZSkKIHsKICAgICBpZiAoIXJ1bGVzKQogICAgICAgICByZXR1cm47CiAK
LSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5
IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZvciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRs
ZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29sdmUuCi0gICAgLy8gQW5jZXN0b3IgaWRlbnRpZmll
ciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVz
ZSB0aGUgZmFzdCBwYXRoLgotICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JG
aWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRj
aFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENy
b3NzQm91bmRhcnk7CisgICAgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKIAogICAgIHVuc2lnbmVkIHNpemUgPSBydWxlcy0+c2l6ZSgpOwogICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKICAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1
bGVEYXRhID0gcnVsZXMtPmF0KGkpOwotICAgICAgICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBt
X3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50
aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygp
KSkKKyAgICAgICAgaWYgKG1fY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZh
c3RSZWplY3RTZWxlY3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURh
dGEuZGVzY2VuZGFudFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKICAgICAgICAgICAgIGNv
bnRpbnVlOwogCiAgICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKLSAg
ICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKKyAg
ICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvcklu
c3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCBtX2luc3BlY3Rv
ckNTU09NV3JhcHBlcnMsIGRvY3VtZW50KCktPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCkpOwogICAg
ICAgICBQc2V1ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlmIChydWxl
TWF0Y2hlcyhydWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRj
aFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5KSkgeworICAgICAgICBpZiAocnVsZU1hdGNoZXMo
cnVsZURhdGEsIG1hdGNoUmVxdWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbykpIHsKICAgICAgICAg
ICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9y
ZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUuCiAgICAgICAgICAgICBjb25zdCBTdHlsZVByb3Bl
cnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwogICAgICAgICAgICAgaWYg
KCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVzLT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5p
bmNsdWRlRW1wdHlSdWxlcykpIHsKQEAgLTY5MywxNCArNDMzLDE0IEBAIHZvaWQgU3R5bGVSZXNv
bHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5k
YXJkIGdldE1hdGNoZWRDU1NSdWxlcyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlz
IGlzIG5lZWRlZC4KLSAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYg
IXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4oKSkgeworICAgICAgICAgICAgaWYg
KG1fc2FtZU9yaWdpbk9ubHkgJiYgIXJ1bGVEYXRhLmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4o
KSkgewogICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hS
dWxlKGNvb2tpZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAg
ICAgfQogICAgICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcgbm9ybWFsIHJ1bGVzLCBzZXQg
YSBwc2V1ZG8gYml0IGlmCiAgICAgICAgICAgICAvLyB3ZSByZWFsbHkganVzdCBtYXRjaGVkIGEg
cHNldWRvLWVsZW1lbnQuCi0gICAgICAgICAgICBpZiAoZHluYW1pY1BzZXVkbyAhPSBOT1BTRVVE
TyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCA9PSBOT1BTRVVETykgewot
ICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xs
ZWN0aW5nUnVsZXMpIHsKKyAgICAgICAgICAgIGlmIChkeW5hbWljUHNldWRvICE9IE5PUFNFVURP
ICYmIG1fcHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkID09IE5PUFNFVURPKSB7CisgICAgICAg
ICAgICAgICAgaWYgKG1fbW9kZSA9PSBTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykg
ewogICAgICAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNo
UnVsZShjb29raWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAg
ICAgICAgICAgICAgfQpAQCAtNzEzLDcgKzQ1Myw3IEBAIHZvaWQgU3R5bGVSZXNvbHZlcjo6Y29s
bGVjdE1hdGNoaW5nUnVsZXMKICAgICAgICAgICAgICAgICAgICAgcnVsZVJhbmdlLmZpcnN0UnVs
ZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CiAKICAgICAgICAgICAgICAgICAvLyBB
ZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQgcnVsZXMuCi0gICAgICAgICAgICAg
ICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEpOworICAgICAgICAgICAgICAgIGFk
ZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7CiAgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCB0cnVlKTsKICAgICAgICAgICAgICAgICBj
b250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTcyOSw0NDU5ICs0NjksNjkgQEAgc3RhdGljIGlu
bGluZSBib29sIGNvbXBhcmVSdWxlcyhjb25zdCBSdQogICAgIHJldHVybiAoc3BlY2lmaWNpdHkx
ID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigpIDogc3Bl
Y2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRN
YXRjaGVkUnVsZXMoKQordm9pZCBFbGVtZW50UnVsZUNvbGxlY3Rvcjo6c29ydE1hdGNoZWRSdWxl
cygpCiB7Ci0gICAgc3RkOjpzb3J0KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9z
dGF0ZS5tYXRjaGVkUnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKKyAgICBBU1NFUlQobV9t
YXRjaGVkUnVsZXMpOworICAgIHN0ZDo6c29ydChtX21hdGNoZWRSdWxlcy0+YmVnaW4oKSwgbV9t
YXRjaGVkUnVsZXMtPmVuZCgpLCBjb21wYXJlUnVsZXMpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlU01JTFBy
b3BlcnRpZXMpCit2b2lkIEVsZW1lbnRSdWxlQ29sbGVjdG9yOjptYXRjaEFsbFJ1bGVzKGJvb2wg
bWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzLCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKIHsK
LSAgICBtYXRjaFVBUnVsZXMocmVzdWx0KTsKKyAgICBtYXRjaFVBUnVsZXMoKTsKIAogICAgIC8v
IE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5k
VXNlclN0eWxlcykKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMocmVzdWx0LCBmYWxzZSk7CisgICAg
aWYgKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMoZmFs
c2UpOwogCiAgICAgLy8gTm93IGNoZWNrIGF1dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdp
dGggcHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcyBtYXBwZWQgZnJvbSBIVE1MLgogICAgIGlmICht
X3N0YXRlLnN0eWxlZEVsZW1lbnQoKSkgewotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0
aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0
ZVN0eWxlKCkpOworICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKG1fc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKIAogICAgICAgICAv
LyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBtYXBwZWQgZGVjbGFyYXRpb25zLgogICAgICAgICAv
LyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUg
dGhhdCBtdXN0IGJlIGFwcGxpZWQKICAgICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNp
bmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUg
YXR0cmlidXRlcy4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSk7CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMobV9zdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKIAogICAg
ICAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewogICAg
ICAgICAgICAgYm9vbCBpc0F1dG87CiAgICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJl
Y3Rpb24gPSB0b0hUTUxFbGVtZW50KG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9u
YWxpdHlJZmhhc0RpckF1dG9BdHRyaWJ1dGUoaXNBdXRvKTsKICAgICAgICAgICAgIGlmIChpc0F1
dG8pCi0gICAgICAgICAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0ZXh0RGly
ZWN0aW9uID09IExUUiA/IGxlZnRUb1JpZ2h0RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9MZWZ0RGVj
bGFyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRp
ZXModGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiByaWdo
dFRvTGVmdERlY2xhcmF0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8vIENo
ZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzIG5leHQuCi0gICAgaWYgKG1fbWF0Y2hBdXRo
b3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFsc2Up
OworICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgICAgIG1hdGNoQXV0aG9y
UnVsZXMoZmFsc2UpOwogCiAgICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmli
dXRlLgotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgewor
ICAgIGlmIChtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkpIHsKICAgICAgICAg
Ly8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25nIGFzIHRoZXJlIGlzIG5vIENTU09N
IHdyYXBwZXIuCiAgICAgICAgIC8vIEZJWE1FOiBNZWRpYSBjb250cm9sIHNoYWRvdyB0cmVlcyBz
ZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgogICAgICAgICBib29sIGlzSW5saW5l
U3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCkt
PmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNJblNoYWRvd1RyZWUo
KTsKICAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5LgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQ
cm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxlKCks
IGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOworICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0
aWVzKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxl
Q2FjaGVhYmxlKTsKICAgICB9CiAKICNpZiBFTkFCTEUoU1ZHKQogICAgIC8vIE5vdyBjaGVjayBT
TUlMIGFuaW1hdGlvbiBvdmVycmlkZSBzdHlsZS4KLSAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0
aWVzICYmIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAg
YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQq
PihtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygp
LCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAqLyk7CisgICAgaWYgKGluY2x1ZGVTTUlMUHJvcGVydGll
cyAmJiBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkg
JiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQorICAgICAgICBhZGRF
bGVtZW50U3R5bGVQcm9wZXJ0aWVzKHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0
eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBp
c0NhY2hlYWJsZSAqLyk7CiAjZWxzZQogICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlU01JTFByb3Bl
cnRpZXMpOwogI2VuZGlmCiB9CiAKLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2xhc3NOYW1lc0FmZmVj
dGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0U3RyaW5nJiBjbGFzc05hbWVzKSBjb25zdAotewot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgIGlmIChtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMo
Y2xhc3NOYW1lc1tpXS5pbXBsKCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6
OmluaXRFbGVtZW50KEVsZW1lbnQqIGUpCi17Ci0gICAgbV9lbGVtZW50ID0gZTsKLSAgICBtX3N0
eWxlZEVsZW1lbnQgPSBlICYmIGUtPmlzU3R5bGVkRWxlbWVudCgpID8gc3RhdGljX2Nhc3Q8U3R5
bGVkRWxlbWVudCo+KGUpIDogMDsKLSAgICBtX2VsZW1lbnRMaW5rU3RhdGUgPSBlID8gZS0+ZG9j
dW1lbnQoKS0+dmlzaXRlZExpbmtTdGF0ZSgpLT5kZXRlcm1pbmVMaW5rU3RhdGUoZSkgOiBOb3RJ
bnNpZGVMaW5rOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjppbml0RWxlbWVudChF
bGVtZW50KiBlKQotewotICAgIGlmIChtX3N0YXRlLmVsZW1lbnQoKSAhPSBlKSB7Ci0gICAgICAg
IG1fc3RhdGUuaW5pdEVsZW1lbnQoZSk7Ci0gICAgICAgIGlmIChlICYmIGUgPT0gZS0+ZG9jdW1l
bnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGUtPmRvY3VtZW50KCktPnNl
dERpcmVjdGlvblNldE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKLSAgICAgICAgICAgIGUtPmRv
Y3VtZW50KCktPnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOwotICAg
ICAgICB9Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5p
dEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1lbnQsIEVsZW1lbnQqIGUsIFJlbmRlclN0
eWxlKiBwYXJlbnRTdHlsZSwgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJl
cXVlc3QsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKLXsKLSAgICBtX3BzZXVkb1N0
eWxlUmVxdWVzdCA9IHBzZXVkb1N0eWxlUmVxdWVzdDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcg
PSByZWdpb25Gb3JTdHlsaW5nOwotCi0gICAgaWYgKGUpIHsKLSAgICAgICAgTm9kZVJlbmRlcmlu
Z0NvbnRleHQgY29udGV4dChlKTsKLSAgICAgICAgbV9wYXJlbnROb2RlID0gY29udGV4dC5wYXJl
bnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IGNv
bnRleHQucmVzZXRTdHlsZUluaGVyaXRhbmNlKCkgPyAwIDoKLSAgICAgICAgICAgIHBhcmVudFN0
eWxlID8gcGFyZW50U3R5bGUgOgotICAgICAgICAgICAgbV9wYXJlbnROb2RlID8gbV9wYXJlbnRO
b2RlLT5yZW5kZXJTdHlsZSgpIDogMDsKLSAgICAgICAgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9u
UG9pbnQgPSBjb250ZXh0Lmluc2VydGlvblBvaW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
bV9wYXJlbnROb2RlID0gMDsKLSAgICAgICAgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOwot
ICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCA9IGZhbHNlOwotICAgIH0KLQot
ICAgIE5vZGUqIGRvY0VsZW1lbnQgPSBlID8gZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50
KCkgOiAwOwotICAgIFJlbmRlclN0eWxlKiBkb2NTdHlsZSA9IGRvY3VtZW50LT5yZW5kZXJTdHls
ZSgpOwotICAgIG1fcm9vdEVsZW1lbnRTdHlsZSA9IGRvY0VsZW1lbnQgJiYgZSAhPSBkb2NFbGVt
ZW50ID8gZG9jRWxlbWVudC0+cmVuZGVyU3R5bGUoKSA6IGRvY1N0eWxlOwotCi0gICAgbV9zdHls
ZSA9IDA7Ci0gICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0gICAgbV9ydWxl
TGlzdCA9IDA7Ci0gICAgbV9mb250RGlydHkgPSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHVu
c2lnbmVkIGNTdHlsZVNlYXJjaFRocmVzaG9sZCA9IDEwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkID0gMTA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBw
YXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKGNvbnN0IEVsZW1lbnQqIHBhcmVudEVsZW1lbnQp
Ci17Ci0gICAgaWYgKCFwYXJlbnRFbGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
cmV0dXJuIHBhcmVudEVsZW1lbnQtPmhhc0ZsYWdzU2V0RHVyaW5nU3R5bGluZ09mQ2hpbGRyZW4o
KTsKLX0KLQotTm9kZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBw
YXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBjb25zdAotewotICAgIGlmICh2aXNp
dGVkTm9kZUNvdW50ID49IGNTdHlsZVNlYXJjaFRocmVzaG9sZCAqIGNTdHlsZVNlYXJjaExldmVs
VGhyZXNob2xkKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50
LT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKHBhcmVudC0+
aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgU3R5bGVk
RWxlbWVudCogcCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1lbnQqPihwYXJlbnQpOwotICAgIGlm
IChwLT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQot
ICAgIGlmIChwLT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxTVkdFbGVtZW50Kj4ocCkt
PmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQotICAgICAgICByZXR1cm4gMDsKLSNlbmRp
ZgotICAgIGlmIChwLT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVz
LmNvbnRhaW5zKHAtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSBwLT5yZW5kZXJTdHlsZSgp
OwotICAgIHVuc2lnbmVkIHN1YmNvdW50ID0gMDsKLSAgICBOb2RlKiB0aGlzQ291c2luID0gcDsK
LSAgICBOb2RlKiBjdXJyZW50Tm9kZSA9IHAtPnByZXZpb3VzU2libGluZygpOwotCi0gICAgLy8g
UmVzZXJ2ZSB0aGUgdHJpZXMgZm9yIHRoaXMgbGV2ZWwuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMg
c3VyZSB0aGF0IHRoZSBhbGdvcml0aG0KLSAgICAvLyB3aWxsIG5ldmVyIGdvIGRlZXBlciB0aGFu
IGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkIGxldmVscyBpbnRvIHJlY3Vyc2lvbi4KLSAgICB2
aXNpdGVkTm9kZUNvdW50ICs9IGNTdHlsZVNlYXJjaFRocmVzaG9sZDsKLSAgICB3aGlsZSAodGhp
c0NvdXNpbikgewotICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKLSAgICAgICAgICAgICsr
c3ViY291bnQ7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUtPnJlbmRlclN0eWxlKCkgPT0g
cGFyZW50U3R5bGUgJiYgY3VycmVudE5vZGUtPmxhc3RDaGlsZCgpCi0gICAgICAgICAgICAgICAg
JiYgY3VycmVudE5vZGUtPmlzRWxlbWVudE5vZGUoKSAmJiAhcGFyZW50RWxlbWVudFByZXZlbnRz
U2hhcmluZyh0b0VsZW1lbnQoY3VycmVudE5vZGUpKQotI2lmIEVOQUJMRShTSEFET1dfRE9NKQot
ICAgICAgICAgICAgICAgICYmICF0b0VsZW1lbnQoY3VycmVudE5vZGUpLT5zaGFkb3coKQotI2Vu
ZGlmCi0gICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB1
bnVzZWQgcmVzZXJ2ZWQgdHJpZXMuCi0gICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVDb3VudCAt
PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgLSBzdWJjb3VudDsKLSAgICAgICAgICAgICAgICByZXR1
cm4gY3VycmVudE5vZGUtPmxhc3RDaGlsZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
aWYgKHN1YmNvdW50ID49IGNTdHlsZVNlYXJjaFRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUtPnByZXZpb3Vz
U2libGluZygpOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnROb2RlID0gbG9jYXRlQ291c2lu
TGlzdCh0aGlzQ291c2luLT5wYXJlbnRFbGVtZW50KCksIHZpc2l0ZWROb2RlQ291bnQpOwotICAg
ICAgICB0aGlzQ291c2luID0gY3VycmVudE5vZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19
Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVT
ZXQoUnVsZVNldCogcnVsZVNldCkKK2Jvb2wgRWxlbWVudFJ1bGVDb2xsZWN0b3I6Omhhc0FueU1h
dGNoaW5nUnVsZXMoUnVsZVNldCogcnVsZVNldCkKIHsKLSAgICBpZiAoIXJ1bGVTZXQpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Cisg
ICAgY2xlYXJNYXRjaGVkUnVsZXMoKTsKIAotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNo
ZWNrZXI6OlNoYXJpbmdSdWxlcyk7CisgICAgbV9tb2RlID0gU2VsZWN0b3JDaGVja2VyOjpTaGFy
aW5nUnVsZXM7CiAgICAgaW50IGZpcnN0UnVsZUluZGV4ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAt
MTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlKGZpcnN0UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4
KTsKKyAgICBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UgcnVsZVJhbmdlKGZpcnN0UnVsZUluZGV4
LCBsYXN0UnVsZUluZGV4KTsKICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3Qo
cnVsZVNldCksIHJ1bGVSYW5nZSk7Ci0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tl
cjo6UmVzb2x2aW5nU3R5bGUpOwotICAgIGlmIChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmlzRW1w
dHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCku
Y2xlYXIoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5T
aGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAg
ICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRo
aXNJbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgpOwotICAgIEhUTUxJbnB1
dEVsZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpLT50b0lucHV0RWxl
bWVudCgpOwotCi0gICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFvdGhlcklucHV0RWxlbWVu
dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmVs
ZW1lbnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkpIHsKLSAgICAg
ICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpICE9IG90
aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRy
aWJ1dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0
ZShyZWFkb25seUF0dHIpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAg
IGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBvdGhlcklucHV0RWxlbWVu
dC0+aXNBdXRvZmlsbGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lu
cHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5z
aG91bGRBcHBlYXJDaGVja2VkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhp
c0lucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlz
SW5kZXRlcm1pbmF0ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1
dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNFbmFibGVkRm9y
bUNvbnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZvcm1Db250cm9sKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0RlZmF1bHRCdXR0b25G
b3JGb3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5kb2N1bWVudCgpLT5jb250YWlu
c1ZhbGlkaXR5U3R5bGVSdWxlcygpKSB7Ci0gICAgICAgIGJvb2wgd2lsbFZhbGlkYXRlID0gZWxl
bWVudC0+d2lsbFZhbGlkYXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAhPSBzdGF0
ZS5lbGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgIGlmICh3aWxsVmFsaWRhdGUgJiYgKGVsZW1lbnQtPmlzVmFsaWRGb3JtQ29udHJv
bEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzVmFsaWRGb3JtQ29udHJvbEVsZW1lbnQo
KSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQtPmlz
SW5SYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNJblJhbmdlKCkpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQtPmlzT3V0T2ZSYW5nZSgpICE9IHN0
YXRlLmVsZW1lbnQoKS0+aXNPdXRPZlJhbmdlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBlbGVt
ZW50SGFzRGlyZWN0aW9uQXV0byhFbGVtZW50KiBlbGVtZW50KQotewotICAgIC8vIEZJWE1FOiBU
aGlzIGxpbmUgaXMgc3VycHJpc2luZ2x5IGhvdCwgd2UgbWF5IHdpc2ggdG8gaW5saW5lIGhhc0Rp
cmVjdGlvbkF1dG8gaW50byBTdHlsZVJlc29sdmVyLgotICAgIHJldHVybiBlbGVtZW50LT5pc0hU
TUxFbGVtZW50KCkgJiYgdG9IVE1MRWxlbWVudChlbGVtZW50KS0+aGFzRGlyZWN0aW9uQXV0bygp
OwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxT
dHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCogc2hhcmluZ0NhbmRpZGF0ZSkg
Y29uc3QKLXsKLSAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmIChzdGF0
ZS5lbGVtZW50KCktPmVsZW1lbnREYXRhKCkgPT0gc2hhcmluZ0NhbmRpZGF0ZS0+ZWxlbWVudERh
dGEoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+ZmFz
dEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZh
c3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpICE9
IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIXN0YXRlLmVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxl
cygpKSB7Ci0gICAgICAgIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpICYmIGNsYXNz
TmFtZXNBZmZlY3RlZEJ5UnVsZXMoc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKHNoYXJpbmdDYW5kaWRhdGUt
Pmhhc0NsYXNzKCkpIHsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICAvLyBTVkcgZWxlbWVudHMg
cmVxdWlyZSBhIChzbG93ISkgZ2V0QXR0cmlidXRlIGNvbXBhcmlzaW9uIGJlY2F1c2UgImNsYXNz
IiBpcyBhbiBhbmltYXRhYmxlIGF0dHJpYnV0ZSBmb3IgU1ZHLgotICAgICAgICBpZiAoc3RhdGUu
ZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkgewotICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1l
bnQoKS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Z2V0QXR0
cmlidXRlKGNsYXNzQXR0cikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICB9IGVsc2UgewotI2VuZGlmCi0gICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5jbGFz
c05hbWVzKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSNpZiBFTkFCTEUoU1ZHKQotICAgICAgICB9Ci0jZW5kaWYKLSAg
ICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVs
ZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzaGFyaW5nQ2FuZGlkYXRl
LT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5o
YXNUYWdOYW1lKHByb2dyZXNzVGFnKSkgewotICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFBy
b2dyZXNzRWxlbWVudCo+KHN0YXRlLmVsZW1lbnQoKSktPmlzRGV0ZXJtaW5hdGUoKSAhPSBzdGF0
aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc2hhcmluZ0NhbmRpZGF0ZSktPmlzRGV0ZXJt
aW5hdGUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICAg
IHJldHVybiB0cnVlOwotfQogCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRo
RWxlbWVudChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAotewotICAgIFJlbmRlclN0eWxl
KiBzdHlsZSA9IGVsZW1lbnQtPnJlbmRlclN0eWxlKCk7Ci0gICAgY29uc3QgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLQotICAgIGlmICghc3R5bGUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICBpZiAoc3R5bGUtPnVuaXF1ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0
eWxlLT5oYXNVbmlxdWVQc2V1ZG9TdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKGVsZW1lbnQtPnRhZ1FOYW1lKCkgIT0gc3RhdGUuZWxlbWVudCgpLT50YWdRTmFtZSgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmlubGluZVN0eWxlKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+bmVlZHNTdHlsZVJlY2FsYygp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZWxlbWVu
dC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KGVsZW1lbnQpLT5h
bmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2Vu
ZGlmCi0gICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5r
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+aG92ZXJlZCgpICE9
IHN0YXRlLmVsZW1lbnQoKS0+aG92ZXJlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKGVsZW1lbnQtPmFjdGl2ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+YWN0aXZlKCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+Zm9jdXNlZCgpICE9IHN0YXRlLmVs
ZW1lbnQoKS0+Zm9jdXNlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1l
bnQtPnNoYWRvd1BzZXVkb0lkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5zaGFkb3dQc2V1ZG9JZCgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQgPT0gZWxlbWVudC0+ZG9j
dW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXNo
YXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoZWxlbWVu
dCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoZWxlbWVudC0+YWRkaXRpb25hbFBy
ZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRp
dGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlk
c0luUnVsZXMuY29udGFpbnMoZWxlbWVudC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmhhc1Njb3BlZEhUTUxT
dHlsZUNoaWxkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBXZSBz
aG91bGQgc2hhcmUgc3R5bGUgZm9yIG9wdGlvbiBhbmQgb3B0Z3JvdXAgd2hlbmV2ZXIgcG9zc2li
bGUuCi0gICAgLy8gQmVmb3JlIGRvaW5nIHNvLCB3ZSBuZWVkIHRvIHJlc29sdmUgaXNzdWVzIGlu
IEhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMKLSAgICAvLyBhbmQgUmVuZGVyTWVu
dUxpc3Q6OnNldFRleHQuIFNlZSBhbHNvIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD04ODQwNQotICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGlvblRhZykgfHwg
ZWxlbWVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGJvb2wgaXNDb250cm9sID0gZWxlbWVudC0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKTsK
LQotICAgIGlmIChpc0NvbnRyb2wgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0Zvcm1Db250cm9sRWxl
bWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaXNDb250cm9sICYmICFj
YW5TaGFyZVN0eWxlV2l0aENvbnRyb2woZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIGlmIChzdHlsZS0+dHJhbnNpdGlvbnMoKSB8fCBzdHlsZS0+YW5pbWF0aW9ucygpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
Ci0gICAgLy8gVHVybiBvZmYgc3R5bGUgc2hhcmluZyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2Fp
biBsYXllcnMgZm9yIHJlYXNvbnMgb3V0c2lkZSBvZiB0aGUgc3R5bGUgc3lzdGVtLgotICAgIC8v
IFNlZSBjb21tZW50cyBpbiBSZW5kZXJPYmplY3Q6OnNldFN0eWxlKCkuCi0gICAgaWYgKGVsZW1l
bnQtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGZyYW1lVGFn
KSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGVtYmVkVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1l
KG9iamVjdFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhcHBsZXRUYWcpIHx8IGVsZW1lbnQt
Pmhhc1RhZ05hbWUoY2FudmFzVGFnKQotI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlfRk9SX1ZJREVP
KQotICAgICAgICAvLyBXaXRoIHByb3h5aW5nLCB0aGUgbWVkaWEgZWxlbWVudHMgYXJlIGJhY2tl
ZCBieSBhIFJlbmRlckVtYmVkZGVkT2JqZWN0LgotICAgICAgICB8fCBlbGVtZW50LT5oYXNUYWdO
YW1lKHZpZGVvVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGF1ZGlvVGFnKQotI2VuZGlmCi0g
ICAgICAgICkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgICBpZiAoZWxlbWVu
dEhhc0RpcmVjdGlvbkF1dG8oZWxlbWVudCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IGlmIChlbGVtZW50LT5pc0xpbmsoKSAmJiBzdGF0ZS5lbGVtZW50TGlua1N0YXRlKCkgIT0gc3R5
bGUtPmluc2lkZUxpbmsoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFZJ
REVPX1RSQUNLKQotICAgIC8vIERlbnkgc2hhcmluZyBzdHlsZXMgYmV0d2VlbiBXZWJWVFQgYW5k
IG5vbi1XZWJWVFQgbm9kZXMuCi0gICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxlbWVudCgpICE9
IHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50
KCktPmlzV2ViVlRURWxlbWVudCgpICYmIHRvV2ViVlRURWxlbWVudChlbGVtZW50KS0+aXNQYXN0
Tm9kZSgpICE9IHRvV2ViVlRURWxlbWVudChzdGF0ZS5lbGVtZW50KCkpLT5pc1Bhc3ROb2RlKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgRU5BQkxFKEZVTExTQ1JFRU5f
QVBJKQotICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPndlYmtpdEN1cnJl
bnRGdWxsU2NyZWVuRWxlbWVudCgpIHx8IHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVu
dCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotI2VuZGlmCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWlubGluZSBTdHlsZWRFbGVtZW50
KiBTdHlsZVJlc29sdmVyOjpmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2RlKiBub2RlLCB1
bnNpZ25lZCYgY291bnQpIGNvbnN0Ci17Ci0gICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5w
cmV2aW91c1NpYmxpbmcoKSkgewotICAgICAgICBpZiAoIW5vZGUtPmlzU3R5bGVkRWxlbWVudCgp
KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChjYW5TaGFyZVN0eWxlV2l0aEVs
ZW1lbnQoc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpKSkKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBpZiAoY291bnQrKyA9PSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQpCi0gICAg
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0eWxlZEVs
ZW1lbnQqPihub2RlKTsKLX0KLQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6OmxvY2F0ZVNo
YXJlZFN0eWxlKCkKLXsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGlmICghc3Rh
dGUuc3R5bGVkRWxlbWVudCgpIHx8ICFzdGF0ZS5wYXJlbnRTdHlsZSgpKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBpbmxpbmUgc3R5bGUgaXQgaXMgcHJv
YmFibHkgdW5pcXVlLgotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGluZVN0eWxl
KCkpCi0gICAgICAgIHJldHVybiAwOwotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKHN0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+
KHN0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQot
ICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIC8vIElkcyBzdG9wIHN0eWxlIHNoYXJpbmcg
aWYgdGhleSBzaG93IHVwIGluIHRoZSBzdHlsZXNoZWV0cy4KLSAgICBpZiAoc3RhdGUuc3R5bGVk
RWxlbWVudCgpLT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNv
bnRhaW5zKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBs
KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAocGFyZW50RWxlbWVudFByZXZlbnRzU2hh
cmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCi0gICAgICAgIHJldHVybiAw
OwotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc1Njb3BlZEhUTUxTdHlsZUNoaWxk
KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUu
ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChlbGVt
ZW50SGFzRGlyZWN0aW9uQXV0byhzdGF0ZS5lbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIC8vIENhY2hlIHdoZXRoZXIgc3RhdGUuZWxlbWVudCBpcyBhZmZlY3RlZCBieSBhbnkg
a25vd24gY2xhc3Mgc2VsZWN0b3JzLgotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBiZSBh
IG1lbWJlciB2YXJpYWJsZS4gVGhlIHN0eWxlIHNoYXJpbmcgY29kZSBjb3VsZCBiZSBmYWN0b3Jl
ZCBvdXQgb2YgU3R5bGVSZXNvbHZlci4KLSAgICBzdGF0ZS5zZXRFbGVtZW50QWZmZWN0ZWRCeUNs
YXNzUnVsZXMoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aGFzQ2xhc3MoKSAm
JiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygp
KSk7Ci0KLSAgICAvLyBDaGVjayBwcmV2aW91cyBzaWJsaW5ncyBhbmQgdGhlaXIgY291c2lucy4K
LSAgICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gICAgdW5zaWduZWQgdmlzaXRlZE5vZGVDb3VudCA9
IDA7Ci0gICAgU3R5bGVkRWxlbWVudCogc2hhcmVFbGVtZW50ID0gMDsKLSAgICBOb2RlKiBjb3Vz
aW5MaXN0ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3
aGlsZSAoY291c2luTGlzdCkgewotICAgICAgICBzaGFyZUVsZW1lbnQgPSBmaW5kU2libGluZ0Zv
clN0eWxlU2hhcmluZyhjb3VzaW5MaXN0LCBjb3VudCk7Ci0gICAgICAgIGlmIChzaGFyZUVsZW1l
bnQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY291c2luTGlzdCA9IGxvY2F0ZUNvdXNp
bkxpc3QoY291c2luTGlzdC0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNvdW50KTsKLSAg
ICB9Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGV4aGF1c3RlZCBhbGwgb3VyIGJ1ZGdldCBvciBvdXIg
Y291c2lucy4KLSAgICBpZiAoIXNoYXJlRWxlbWVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICAvLyBDYW4ndCBzaGFyZSBpZiBzaWJsaW5nIHJ1bGVzIGFwcGx5LiBUaGlzIGlzIGNoZWNrZWQg
YXQgdGhlIGVuZCBhcyBpdCBzaG91bGQgcmFyZWx5IGZhaWwuCi0gICAgaWYgKHN0eWxlU2hhcmlu
Z0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMuc2libGluZygpKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgYXR0cmlidXRlIHJ1bGVzIGFwcGx5Lgot
ICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChtX3J1bGVTZXRzLnVu
Y29tbW9uQXR0cmlidXRlKCkpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAvLyBDYW4ndCBzaGFy
ZSBpZiBAaG9zdCBALXJ1bGVzIGFwcGx5LgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVN
YXRjaGVzSG9zdFJ1bGVzKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8vIFRyYWNraW5nIGNo
aWxkIGluZGV4IHJlcXVpcmVzIHVuaXF1ZSBzdHlsZSBmb3IgZWFjaCBub2RlLiBUaGlzIG1heSBn
ZXQgc2V0IGJ5IHRoZSBzaWJsaW5nIHJ1bGUgbWF0Y2ggYWJvdmUuCi0gICAgaWYgKHBhcmVudEVs
ZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCkpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc2hhcmVFbGVtZW50LT5yZW5kZXJTdHlsZSgp
OwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYgcmVz
dWx0KQotewotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNjb3BlOwotCi0gICAgLy8gRmlyc3Qg
d2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAoQ1NTRGVm
YXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVTaGVldCkKLSAgICAgICAgcmVzdWx0
LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci0gICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVTaGVldCA9
IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpCi0gICAgICAgID8gQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRTdHlsZVNo
ZWV0czo6ZGVmYXVsdFN0eWxlOwotICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIHVzZXJBZ2VudFN0
eWxlU2hlZXQpOwotCi0gICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVzIGZyb20g
dGhlIHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5pblF1aXJr
c01vZGUoKSkKLSAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0eWxlU2hl
ZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOwotCi0gICAgLy8gSWYgZG9jdW1lbnQgdXNlcyB2aWV3
IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdlciBtb2Rl
KSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBzaGVldC4K
LSAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCi0gICAgICAgIG1hdGNoVUFSdWxl
cyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkpOwotfQot
Ci1zdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0aW9uOjpNb2Rl
IHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgaWYgKHBhZ2luYXRp
b25Nb2RlID09IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKQotICAgICAgICByZXR1cm47Ci0gICAg
ICAgIAotICAgIHN3aXRjaCAocGFnaW5hdGlvbk1vZGUpIHsKLSAgICBjYXNlIFBhZ2luYXRpb246
OkxlZnRUb1JpZ2h0UGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+c2V0Q29sdW1uQXhpcyhIb3Jp
em9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+
aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZl
cnNlQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+
c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRpbmdNb2RlKCkg
PyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0g
ICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6UmlnaHRUb0xlZnRQYWdpbmF0ZWQ6
Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5BeGlzKTsKLSAg
ICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAg
c3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihz
dHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENvbHVtblByb2dyZXNz
aW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2Fz
ZSBQYWdpbmF0aW9uOjpUb3BUb0JvdHRvbVBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENv
bHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6
b250YWxXcml0aW5nTW9kZSgpKQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNz
aW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblBy
b2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHRE
aXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dy
ZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpCb3R0b21Ub1Rv
cFBhZ2luYXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5B
eGlzKTsKLSAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAg
ICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9j
a3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZlcnNlQ29sdW1u
UHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1u
UHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJldmVyc2VDb2x1
bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZDoKLSAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZ2V0Rm9u
dEFuZEdseXBoT3JpZW50YXRpb24oY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBGb250T3JpZW50
YXRpb24mIGZvbnRPcmllbnRhdGlvbiwgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiYgZ2x5cGhPcmll
bnRhdGlvbikKLXsKLSAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpIHsK
LSAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhPcmll
bnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChzdHlsZS0+dGV4dE9yaWVudGF0aW9uKCkpIHsK
LSAgICBjYXNlIFRleHRPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ6Ci0gICAgICAgIGZvbnRPcmll
bnRhdGlvbiA9IFZlcnRpY2FsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5
cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRl
eHRPcmllbnRhdGlvblVwcmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2Fs
OwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRhdGlvblVwcmln
aHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzOgot
ICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgPT0gTGVmdFRvUmlnaHRXcml0aW5nTW9k
ZSkgewotICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG1hcCB0byBzaWRld2F5cy1s
ZWZ0LCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIHlldC4KLSAgICAgICAgICAgIGZvbnRPcmllbnRh
dGlvbiA9IFZlcnRpY2FsOwotICAgICAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0ds
eXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICB9Ci0gICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBo
T3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAg
ICAgcmV0dXJuOwotICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXNSaWdodDoKLSAgICAg
ICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlv
biA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47
Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGZv
bnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBO
b25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JE
b2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQsIENTU0ZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9y
KQotewotICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOwotCi0gICAgLy8gSFRN
TDUgc3RhdGVzIHRoYXQgc2VhbWxlc3MgaWZyYW1lcyBzaG91bGQgcmVwbGFjZSBkZWZhdWx0IENT
UyB2YWx1ZXMKLSAgICAvLyB3aXRoIHZhbHVlcyBpbmhlcml0ZWQgZnJvbSB0aGUgY29udGFpbmlu
ZyBpZnJhbWUgZWxlbWVudC4gSG93ZXZlciwKLSAgICAvLyBzb21lIHZhbHVlcyAoc3VjaCBhcyB0
aGUgY2FzZSBvZiBkZXNpZ25Nb2RlID0gIm9uIikgc3RpbGwgbmVlZCB0bwotICAgIC8vIGJlIHNl
dCBieSB0aGlzICJkb2N1bWVudCBzdHlsZSIuCi0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBkb2N1
bWVudFN0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOwotICAgIGJvb2wgc2VhbWxlc3NXaXRo
UGFyZW50ID0gZG9jdW1lbnQtPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBhcmVudCgpOwot
ICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpIHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIGlmcmFt
ZVN0eWxlID0gZG9jdW1lbnQtPnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPnJlbmRlclN0eWxlKCk7
Ci0gICAgICAgIGlmIChpZnJhbWVTdHlsZSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPmlu
aGVyaXRGcm9tKGlmcmFtZVN0eWxlKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogSXQncyBub3Qg
Y2xlYXIgd2hpY2ggdmFsdWVzIGJlbG93IHdlIHdhbnQgdG8gb3ZlcnJpZGUgaW4gdGhlIHNlYW1s
ZXNzIGNhc2UhCi0gICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgaWYg
KCFzZWFtbGVzc1dpdGhQYXJlbnQpIHsKLSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0UlRMT3Jk
ZXJpbmcoZG9jdW1lbnQtPnZpc3VhbGx5T3JkZXJlZCgpID8gVmlzdWFsT3JkZXIgOiBMb2dpY2Fs
T3JkZXIpOwotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRab29tKGZyYW1lICYmICFkb2N1bWVu
dC0+cHJpbnRpbmcoKSA/IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpIDogMSk7Ci0gICAgICAgIGRv
Y3VtZW50U3R5bGUtPnNldFBhZ2VTY2FsZVRyYW5zZm9ybShmcmFtZSA/IGZyYW1lLT5mcmFtZVNj
YWxlRmFjdG9yKCkgOiAxKTsKLSAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0TG9jYWxlKGRvY3Vt
ZW50LT5jb250ZW50TGFuZ3VhZ2UoKSk7Ci0gICAgfQotICAgIC8vIFRoaXMgb3ZlcnJpZGVzIGFu
eSAtd2Via2l0LXVzZXItbW9kaWZ5IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgaWZyYW1lLgot
ICAgIGRvY3VtZW50U3R5bGUtPnNldFVzZXJNb2RpZnkoZG9jdW1lbnQtPmluRGVzaWduTW9kZSgp
ID8gUkVBRF9XUklURSA6IFJFQURfT05MWSk7Ci0KLSAgICBFbGVtZW50KiBkb2NFbGVtZW50ID0g
ZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOwotICAgIFJlbmRlck9iamVjdCogZG9jRWxlbWVu
dFJlbmRlcmVyID0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlcmVyKCkgOiAwOwotICAg
IGlmIChkb2NFbGVtZW50UmVuZGVyZXIpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkaXJlY3Rpb24g
YW5kIHdyaXRpbmctbW9kZSBvZiB0aGUgYm9keSB0byBzZXQgdGhlCi0gICAgICAgIC8vIHZpZXdw
b3J0J3MgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgdW5sZXNzIHRoZSBwcm9wZXJ0eSBpcyBz
ZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJv
ZHksIHRoZW4gdXNlIHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAgICBSZW5kZXJPYmplY3Qq
IGJvZHlSZW5kZXJlciA9IGRvY3VtZW50LT5ib2R5KCkgPyBkb2N1bWVudC0+Ym9keSgpLT5yZW5k
ZXJlcigpIDogMDsKLSAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1lbnQtPndyaXRp
bmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUt
PnNldFdyaXRpbmdNb2RlKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGRv
Y0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7Ci0gICAgICAgIGlmIChi
b2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT5kaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxlbWVudCgp
KQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGJvZHlSZW5kZXJlci0+
c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkb2N1bWVu
dFN0eWxlLT5zZXREaXJlY3Rpb24oZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgpLT5kaXJlY3Rp
b24oKSk7Ci0gICAgfQotCi0gICAgaWYgKGZyYW1lKSB7Ci0gICAgICAgIGlmIChGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCkpIHsKLSAgICAgICAgICAgIGNvbnN0IFBhZ2luYXRp
b24mIHBhZ2luYXRpb24gPSBmcmFtZVZpZXctPnBhZ2luYXRpb24oKTsKLSAgICAgICAgICAgIGlm
IChwYWdpbmF0aW9uLm1vZGUgIT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpIHsKLSAgICAgICAg
ICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShwYWdpbmF0aW9uLm1vZGUsIGRvY3Vt
ZW50U3R5bGUuZ2V0KCkpOwotICAgICAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldENvbHVt
bkdhcChwYWdpbmF0aW9uLmdhcCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJlbmRlclZpZXcqIHZp
ZXcgPSBkb2N1bWVudC0+cmVuZGVyVmlldygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2
aWV3LT5oYXNDb2x1bW5zKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LT51cGRhdGVD
b2x1bW5JbmZvRnJvbVN0eWxlKGRvY3VtZW50U3R5bGUuZ2V0KCkpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNlYW1sZXNzIGlm
cmFtZXMgd2FudCB0byBpbmhlcml0IHRoZWlyIGZvbnQgZnJvbSB0aGVpciBwYXJlbnQgaWZyYW1l
LCBzbyBlYXJseSByZXR1cm4gYmVmb3JlIHNldHRpbmcgdGhlIGZvbnQuCi0gICAgaWYgKHNlYW1s
ZXNzV2l0aFBhcmVudCkKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwot
Ci0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBmb250RGVzY3JpcHRp
b24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24oZG9jdW1lbnRT
dHlsZS0+bG9jYWxlKCkpKTsKLSAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQt
PnNldHRpbmdzKCkpIHsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250
KGRvY3VtZW50LT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1dGlv
bkVuYWJsZWQoKSk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNl
dHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBzdGFuZGFyZEZvbnQgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KGZvbnREZXNjcmlw
dGlvbi5zY3JpcHQoKSk7Ci0gICAgICAgIGlmICghc3RhbmRhcmRGb250LmlzRW1wdHkoKSkgewot
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpTdGFuZGFyZEZhbWlseSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RG
YW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250KTsKLSAgICAgICAgICAgIGZvbnREZXNjcmlw
dGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKLSAgICAgICAgfQotICAgICAgICBm
b250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRpdW0gLSBDU1NWYWx1ZVh4
U21hbGwgKyAxKTsKLSAgICAgICAgaW50IHNpemUgPSBTdHlsZVJlc29sdmVyOjpmb250U2l6ZUZv
cktleXdvcmQoZG9jdW1lbnQsIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSk7Ci0gICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOwotICAgICAgICBib29sIHVzZVNWR1pv
b21SdWxlcyA9IGRvY3VtZW50LT5pc1NWR0RvY3VtZW50KCk7Ci0gICAgICAgIGZvbnREZXNjcmlw
dGlvbi5zZXRDb21wdXRlZFNpemUoU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRTaXplRnJvbVNw
ZWNpZmllZFNpemUoZG9jdW1lbnQsIGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnREZXNjcmlwdGlv
bi5pc0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMpKTsKLSAgICB9IGVsc2UK
LSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50LT5wcmlu
dGluZygpKTsKLQotICAgIEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247Ci0gICAgTm9u
Q0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRHbHlw
aE9yaWVudGF0aW9uKGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhP
cmllbnRhdGlvbik7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9uKGZvbnRPcmll
bnRhdGlvbik7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3JpZW50YXRpb24o
Z2x5cGhPcmllbnRhdGlvbik7Ci0KLSAgICBkb2N1bWVudFN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24oZm9udERlc2NyaXB0aW9uKTsKLSAgICBkb2N1bWVudFN0eWxlLT5mb250KCkudXBkYXRlKGZv
bnRTZWxlY3Rvcik7Ci0KLSAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNlKCk7Ci19Ci0K
LXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U2hhZG93Qm91bmRhcnkoY29uc3QgRWxlbWVudCogZWxl
bWVudCkKLXsKLSAgICBpZiAoIWVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBD
b250YWluZXJOb2RlKiBwYXJlbnROb2RlID0gZWxlbWVudC0+cGFyZW50Tm9kZSgpOwotICAgIHJl
dHVybiBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUtPmlzU2hhZG93Um9vdCgpOwotfQotCi1QYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1lbnQoRWxlbWVu
dCogZWxlbWVudCwgUmVuZGVyU3R5bGUqIGRlZmF1bHRQYXJlbnQsCi0gICAgU3R5bGVTaGFyaW5n
QmVoYXZpb3Igc2hhcmluZ0JlaGF2aW9yLCBSdWxlTWF0Y2hpbmdCZWhhdmlvciBtYXRjaGluZ0Jl
aGF2aW9yLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCi17Ci0gICAgLy8gT25jZSBh
biBlbGVtZW50IGhhcyBhIHJlbmRlcmVyLCB3ZSBkb24ndCB0cnkgdG8gZGVzdHJveSBpdCwgc2lu
Y2Ugb3RoZXJ3aXNlIHRoZSByZW5kZXJlcgotICAgIC8vIHdpbGwgdmFuaXNoIGlmIGEgc3R5bGUg
cmVjYWxjIGhhcHBlbnMgZHVyaW5nIGxvYWRpbmcuCi0gICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9
PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxlc2hl
ZXRzTG9hZGVkKCkgJiYgIWVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgaWYgKCFzX3N0
eWxlTm90WWV0QXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxl
ID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKLSAgICAgICAgICAgIHNfc3R5bGVO
b3RZZXRBdmFpbGFibGUtPnNldERpc3BsYXkoTk9ORSk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90
WWV0QXZhaWxhYmxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKLSAgICAgICAgfQot
ICAgICAgICBlbGVtZW50LT5kb2N1bWVudCgpLT5zZXRIYXNOb2Rlc1dpdGhQbGFjZWhvbGRlclN0
eWxlKCk7Ci0gICAgICAgIHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOwotICAgIH0KLQot
ICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgaW5pdEVsZW1lbnQoZWxlbWVudCk7Ci0g
ICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlbGVtZW50LCBkZWZhdWx0
UGFyZW50LCBOT1BTRVVETywgcmVnaW9uRm9yU3R5bGluZyk7Ci0gICAgaWYgKHNoYXJpbmdCZWhh
dmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlv
blBvaW50KCkpIHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0gbG9jYXRlU2hh
cmVkU3R5bGUoKTsKLSAgICAgICAgaWYgKHNoYXJlZFN0eWxlKQotICAgICAgICAgICAgcmV0dXJu
IHNoYXJlZFN0eWxlOwotICAgIH0KLQotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gY2xvbmVGb3JQ
YXJlbnQ7Ci0KLSAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUoKSkgewotICAgICAgICBzdGF0ZS5z
ZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5p
bmhlcml0RnJvbShzdGF0ZS5wYXJlbnRTdHlsZSgpLCBpc0F0U2hhZG93Qm91bmRhcnkoZWxlbWVu
dCkgPyBSZW5kZXJTdHlsZTo6QXRTaGFkb3dCb3VuZGFyeSA6IFJlbmRlclN0eWxlOjpOb3RBdFNo
YWRvd0JvdW5kYXJ5KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0ZS5zZXRTdHlsZShkZWZh
dWx0U3R5bGVGb3JFbGVtZW50KCkpOwotICAgICAgICBjbG9uZUZvclBhcmVudCA9IFJlbmRlclN0
eWxlOjpjbG9uZShzdGF0ZS5zdHlsZSgpKTsKLSAgICAgICAgc3RhdGUuc2V0UGFyZW50U3R5bGUo
Y2xvbmVGb3JQYXJlbnQuZ2V0KCkpOwotICAgIH0KLSAgICAvLyBjb250ZW50ZWRpdGFibGUgYXR0
cmlidXRlIChpbXBsZW1lbnRlZCBieSAtd2Via2l0LXVzZXItbW9kaWZ5KSBzaG91bGQKLSAgICAv
LyBiZSBwcm9wYWdhdGVkIGZyb20gc2hhZG93IGhvc3QgdG8gZGlzdHJpYnV0ZWQgbm9kZS4KLSAg
ICBpZiAoc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKLSAgICAgICAgaWYg
KEVsZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQoKSkgewotICAgICAgICAg
ICAgaWYgKFJlbmRlclN0eWxlKiBzdHlsZU9mU2hhZG93SG9zdCA9IHBhcmVudC0+cmVuZGVyU3R5
bGUoKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VyTW9kaWZ5KHN0eWxl
T2ZTaGFkb3dIb3N0LT51c2VyTW9kaWZ5KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYg
KGVsZW1lbnQtPmlzTGluaygpKSB7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldElzTGluayh0
cnVlKTsKLSAgICAgICAgRUluc2lkZUxpbmsgbGlua1N0YXRlID0gc3RhdGUuZWxlbWVudExpbmtT
dGF0ZSgpOwotICAgICAgICBpZiAobGlua1N0YXRlICE9IE5vdEluc2lkZUxpbmspIHsKLSAgICAg
ICAgICAgIGJvb2wgZm9yY2VWaXNpdGVkID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpmb3Jj
ZVBzZXVkb1N0YXRlKGVsZW1lbnQsIENTU1NlbGVjdG9yOjpQc2V1ZG9WaXNpdGVkKTsKLSAgICAg
ICAgICAgIGlmIChmb3JjZVZpc2l0ZWQpCi0gICAgICAgICAgICAgICAgbGlua1N0YXRlID0gSW5z
aWRlVmlzaXRlZExpbms7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0SW5z
aWRlTGluayhsaW5rU3RhdGUpOwotICAgIH0KLQotICAgIGJvb2wgbmVlZHNDb2xsZWN0aW9uID0g
ZmFsc2U7Ci0gICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjplbnN1cmVEZWZhdWx0U3R5bGVTaGVl
dHNGb3JFbGVtZW50KGVsZW1lbnQsIG5lZWRzQ29sbGVjdGlvbik7Ci0gICAgaWYgKG5lZWRzQ29s
bGVjdGlvbikKLSAgICAgICAgbV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+
aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZlci5nZXQoKSk7Ci0KLSAgICBNYXRjaFJlc3Vs
dCBtYXRjaFJlc3VsdDsKLSAgICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9PSBNYXRjaE9ubHlVc2Vy
QWdlbnRSdWxlcykKLSAgICAgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsKLSAgICBlbHNl
Ci0gICAgICAgIG1hdGNoQWxsUnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5nQmVoYXZpb3IgIT0g
TWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOwotCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGll
cyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7Ci0KLSAgICAvLyBDbGVhbiB1cCBvdXIgc3R5bGUgb2Jq
ZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIgZml4dXBzKS4K
LSAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgp
LCBlbGVtZW50KTsKLQotICAgIHN0YXRlLmNsZWFyKCk7IC8vIENsZWFyIG91dCBmb3IgdGhlIG5l
eHQgcmVzb2x2ZS4KLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsK
LQotICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBzdGF0ZS50YWtlU3R5
bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVG
b3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBjb25zdCBTdHlsZUtl
eWZyYW1lKiBrZXlmcmFtZSwgS2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVWYWx1ZSkKLXsKLSAgICBN
YXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAg
ICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSk7
Ci0KLSAgICBBU1NFUlQoIW1fc3RhdGUuc3R5bGUoKSk7Ci0KLSAgICBTdGF0ZSYgc3RhdGUgPSBt
X3N0YXRlOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBzdHlsZQotICAgIHN0YXRlLnNldFN0eWxlKFJl
bmRlclN0eWxlOjpjbG9uZShlbGVtZW50U3R5bGUpKTsKLSAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0
VmFsdWUoMCk7Ci0KLSAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGJvdGhlciB3aXRoICFpbXBvcnRh
bnQuIFNpbmNlIHRoZXJlIGlzIG9ubHkgZXZlciBvbmUKLSAgICAvLyBkZWNsLCB0aGVyZSdzIG5v
dGhpbmcgdG8gb3ZlcnJpZGUuIFNvIGp1c3QgYWRkIHRoZSBmaXJzdCBwcm9wZXJ0aWVzLgotICAg
IGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGll
cygpKQotICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRp
ZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAx
LCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBh
aGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5l
LWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNp
emUKLSAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAgICAgIGFwcGx5UHJvcGVy
dHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSk7Ci0KLSAg
ICAvLyBOb3cgZG8gcmVzdCBvZiB0aGUgcHJvcGVydGllcy4KLSAgICBpZiAoa2V5ZnJhbWUtPnBy
b3BlcnRpZXMoKSkKLSAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVBy
b3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXpl
KCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVk
IGJ5IG9uZSBvZiB0aGUgbm9uLWVzc2VudGlhbCBmb250IHByb3BzLAotICAgIC8vIGdvIGFoZWFk
IGFuZCB1cGRhdGUgaXQgYSBzZWNvbmQgdGltZS4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAv
LyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAg
bG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKLSAgICAKLSAgICAvLyBBZGQgYWxsIHRoZSBhbmltYXRp
bmcgcHJvcGVydGllcyB0byB0aGUga2V5ZnJhbWUuCi0gICAgaWYgKGNvbnN0IFN0eWxlUHJvcGVy
dHlTZXQqIHN0eWxlRGVjbGFyYXRpb24gPSBrZXlmcmFtZS0+cHJvcGVydGllcygpKSB7Ci0gICAg
ICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBzdHlsZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUNv
dW50KCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0eUNvdW50OyAr
K2kpIHsKLSAgICAgICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBzdHlsZURlY2xhcmF0
aW9uLT5wcm9wZXJ0eUF0KGkpLmlkKCk7Ci0gICAgICAgICAgICAvLyBUaW1pbmctZnVuY3Rpb24g
d2l0aGluIGtleWZyYW1lcyBpcyBzcGVjaWFsLCBiZWNhdXNlIGl0IGlzIG5vdCBhbmltYXRlZDsg
aXQganVzdAotICAgICAgICAgICAgLy8gZGVzY3JpYmVzIHRoZSB0aW1pbmcgZnVuY3Rpb24gYmV0
d2VlbiB0aGlzIGtleWZyYW1lIGFuZCB0aGUgbmV4dC4KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0
eSAhPSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uKQotICAgICAgICAg
ICAgICAgIGtleWZyYW1lVmFsdWUuYWRkUHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigpOwotCi0gICAg
cmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmtleWZy
YW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqIGUsIGNvbnN0IFJlbmRlclN0eWxlKiBlbGVt
ZW50U3R5bGUsIEtleWZyYW1lTGlzdCYgbGlzdCkKLXsKLSAgICBsaXN0LmNsZWFyKCk7Ci0KLSAg
ICAvLyBHZXQgdGhlIGtleWZyYW1lc1J1bGUgZm9yIHRoaXMgbmFtZQotICAgIGlmICghZSB8fCBs
aXN0LmFuaW1hdGlvbk5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1f
a2V5ZnJhbWVzUnVsZU1hcC5jaGVja0NvbnNpc3RlbmN5KCk7Ci0KLSAgICBLZXlmcmFtZXNSdWxl
TWFwOjppdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzUnVsZU1hcC5maW5kKGxpc3QuYW5pbWF0aW9u
TmFtZSgpLmltcGwoKSk7Ci0gICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVzUnVsZU1hcC5lbmQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgU3R5bGVSdWxlS2V5ZnJhbWVzKiBrZXlmcmFt
ZXNSdWxlID0gaXQtPnZhbHVlLmdldCgpOwotCi0gICAgLy8gQ29uc3RydWN0IGFuZCBwb3B1bGF0
ZSB0aGUgc3R5bGUgZm9yIGVhY2gga2V5ZnJhbWUKLSAgICBjb25zdCBWZWN0b3I8UmVmUHRyPFN0
eWxlS2V5ZnJhbWU+ID4mIGtleWZyYW1lcyA9IGtleWZyYW1lc1J1bGUtPmtleWZyYW1lcygpOwot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrZXlmcmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgLy8gQXBwbHkgdGhlIGRlY2xhcmF0aW9uIHRvIHRoZSBzdHlsZS4gVGhpcyBpcyBhIHNp
bXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgbG9naWMgaW4gc3R5bGVGb3JFbGVtZW50Ci0gICAgICAg
IGluaXRFbGVtZW50KGUpOwotICAgICAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9j
dW1lbnQoKSwgZSk7Ci0KLSAgICAgICAgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUgPSBr
ZXlmcmFtZXNbaV0uZ2V0KCk7Ci0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVl
KDAsIDApOwotICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUo
ZWxlbWVudFN0eWxlLCBrZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOwotCi0gICAgICAgIC8vIEFk
ZCB0aGlzIGtleWZyYW1lIHN0eWxlIHRvIGFsbCB0aGUgaW5kaWNhdGVkIGtleSB0aW1lcwotICAg
ICAgICBWZWN0b3I8ZmxvYXQ+IGtleXM7Ci0gICAgICAgIGtleWZyYW1lLT5nZXRLZXlzKGtleXMp
OwotICAgICAgICBmb3IgKHNpemVfdCBrZXlJbmRleCA9IDA7IGtleUluZGV4IDwga2V5cy5zaXpl
KCk7ICsra2V5SW5kZXgpIHsKLSAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0S2V5KGtleXNb
a2V5SW5kZXhdKTsKLSAgICAgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFsdWUpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIDAlIGtleWZyYW1lIGlzIG1pc3NpbmcsIGNy
ZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVyIGtleWZyYW1l
KQotICAgIGludCBpbml0aWFsTGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICBpZiAoaW5pdGlh
bExpc3RTaXplID4gMCAmJiBsaXN0WzBdLmtleSgpKSB7Ci0gICAgICAgIHN0YXRpYyBTdHlsZUtl
eWZyYW1lKiB6ZXJvUGVyY2VudEtleWZyYW1lOwotICAgICAgICBpZiAoIXplcm9QZXJjZW50S2V5
ZnJhbWUpIHsKLSAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1l
OjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAgICB6ZXJvUGVyY2VudEtleWZyYW1lLT5z
ZXRLZXlUZXh0KCIwJSIpOwotICAgICAgICB9Ci0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJh
bWVWYWx1ZSgwLCAwKTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktl
eWZyYW1lKGVsZW1lbnRTdHlsZSwgemVyb1BlcmNlbnRLZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkp
OwotICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBJ
ZiB0aGUgMTAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5IGlmIHRo
ZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKLSAgICBpZiAoaW5pdGlhbExpc3RT
aXplID4gMCAmJiAobGlzdFtsaXN0LnNpemUoKSAtIDFdLmtleSgpICE9IDEpKSB7Ci0gICAgICAg
IHN0YXRpYyBTdHlsZUtleWZyYW1lKiBodW5kcmVkUGVyY2VudEtleWZyYW1lOwotICAgICAgICBp
ZiAoIWh1bmRyZWRQZXJjZW50S2V5ZnJhbWUpIHsKLSAgICAgICAgICAgIGh1bmRyZWRQZXJjZW50
S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAg
ICBodW5kcmVkUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIxMDAlIik7Ci0gICAgICAgIH0K
LSAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDEsIDApOwotICAgICAgICBrZXlm
cmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBodW5kcmVk
UGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7Ci0gICAgICAgIGxpc3QuaW5zZXJ0KGtl
eWZyYW1lVmFsdWUpOwotICAgIH0KLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVS
ZXNvbHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGUsIGNvbnN0IFBzZXVkb1N0
eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUp
Ci17Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKLSAgICBpZiAoIWUpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIGluaXRFbGVtZW50KGUp
OwotCi0gICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRT
dHlsZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHls
ZTo6Y3JlYXRlKCkpOwotICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucGFy
ZW50U3R5bGUoKSk7Ci0KLSAgICAvLyBTaW5jZSB3ZSBkb24ndCB1c2UgcHNldWRvLWVsZW1lbnRz
IGluIGFueSBvZiBvdXIgcXVpcmsvcHJpbnQgdXNlciBhZ2VudCBydWxlcywgZG9uJ3Qgd2FzdGUg
dGltZSB3YWxraW5nCi0gICAgLy8gdGhvc2UgcnVsZXMuCi0KLSAgICAvLyBDaGVjayBVQSwgdXNl
ciBhbmQgYXV0aG9yIHJ1bGVzLgotICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OwotICAgIG1h
dGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJT
dHlsZXMpIHsKLSAgICAgICAgbWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAg
ICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOwotICAgIH0KLQotICAg
IGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVkb1N0eWxlUmVx
dWVzdC5wc2V1ZG9JZCk7Ci0KLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0
LCBlKTsKLQotICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNwbGF5IGFuZCB0
ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgotICAgIGFkanVzdFJlbmRlclN0
eWxlKHN0YXRlLnN0eWxlKCksIG1fc3RhdGUucGFyZW50U3R5bGUoKSwgMCk7Ci0KLSAgICAvLyBT
dGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9h
ZFBlbmRpbmdSZXNvdXJjZXMoKTsKLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVz
b2x2ZXIoKTsKLQotICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBzdGF0
ZS50YWtlU3R5bGUoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZl
cjo6c3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCi17Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5
bGVSZXNvbHZlKGRvY3VtZW50KCksIGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKTsgLy8g
bV9yb290RWxlbWVudFN0eWxlIHdpbGwgYmUgc2V0IHRvIHRoZSBkb2N1bWVudCBzdHlsZS4KLQot
ICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICBtX3N0YXRl
LnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLQotICAg
IGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IGJv
b2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgU3RyaW5nIHBh
Z2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOwotICAgIAotICAgIE1hdGNoUmVzdWx0IHJlc3VsdDsK
LSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVs
dFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbWF0Y2hQYWdlUnVsZXMo
cmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3QsIHBhZ2UpOwot
ICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBmb3IgQHBhZ2Ug
cnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQs
IG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICBt
X3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBib29sIGluaGVyaXRlZE9ubHkgPSBm
YWxzZTsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLSNlbmRpZgotICAgIGFwcGx5
TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0LCBmYWxzZSwg
MCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwot
Ci0gICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQg
bm93LgotICAgIHVwZGF0ZUZvbnQoKTsKLQotICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVu
IHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4KLSAgICBpZiAobV9zdGF0
ZS5saW5lSGVpZ2h0VmFsdWUoKSkKLSAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUxp
bmVIZWlnaHQsIG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8v
IFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBs
b2FkUGVuZGluZ1Jlc291cmNlcygpOwotCi0gICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVS
ZXNvbHZlcigpOwotCi0gICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCi0gICAgcmV0dXJuIG1f
c3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVz
b2x2ZXI6OmRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKQotewotICAgIG1fc3RhdGUuc2V0U3R5bGUo
UmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAgICAvLyBNYWtlIHN1cmUgb3VyIGZvbnRzIGFyZSBp
bml0aWFsaXplZCBpZiB3ZSBkb24ndCBpbmhlcml0IHRoZW0gZnJvbSBvdXIgcGFyZW50IHN0eWxl
LgotICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCkpIHsKLSAg
ICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7Ci0gICAgICAgIG1fc3RhdGUuc3R5
bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAg
IG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZSgwKTsKLQotICAgIHJldHVybiBtX3N0YXRl
LnRha2VTdHlsZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpzdHlsZUZvclRleHQoVGV4dCogdGV4dE5vZGUpCi17Ci0gICAgQVNTRVJUKHRleHROb2RlKTsK
LQotICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQodGV4dE5vZGUpOwotICAgIE5vZGUq
IHBhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJpbmdBbmRTdHlsZSgpOwot
ICAgIHJldHVybiBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpIHx8ICFwYXJlbnROb2Rl
ID8KLSAgICAgICAgZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpIDogcGFyZW50Tm9kZS0+cmVuZGVy
U3R5bGUoKTsKLX0KLQotc3RhdGljIHZvaWQgYWRkSW50cmluc2ljTWFyZ2lucyhSZW5kZXJTdHls
ZSogc3R5bGUpCi17Ci0gICAgLy8gSW50cmluc2ljIG1hcmdpbiB2YWx1ZS4KLSAgICBjb25zdCBp
bnQgaW50cmluc2ljTWFyZ2luID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICAv
LyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdp
dGggbWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCi0gICAgLy8gRklYTUU6IFVzaW5nICJx
dWlyayIgdG8gZGVjaWRlIHRoZSBtYXJnaW4gd2Fzbid0IHNldCBpcyBraW5kIG9mIGxhbWUuCi0g
ICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpIHsKLSAgICAgICAgaWYg
KHN0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJn
aW5MZWZ0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgICAgIGlmIChzdHls
ZS0+bWFyZ2luUmlnaHQoKS5xdWlyaygpKQotICAgICAgICAgICAgc3R5bGUtPnNldE1hcmdpblJp
Z2h0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgfQotCi0gICAgaWYgKHN0
eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgewotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblRvcCgp
LnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0aChpbnRyaW5z
aWNNYXJnaW4sIEZpeGVkKSk7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luQm90dG9tKCkucXVp
cmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKGludHJpbnNp
Y01hcmdpbiwgRml4ZWQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBFRGlzcGxheSBlcXVpdmFsZW50
QmxvY2tEaXNwbGF5KEVEaXNwbGF5IGRpc3BsYXksIGJvb2wgaXNGbG9hdGluZywgYm9vbCBzdHJp
Y3RQYXJzaW5nKQotewotICAgIHN3aXRjaCAoZGlzcGxheSkgewotICAgIGNhc2UgQkxPQ0s6Ci0g
ICAgY2FzZSBUQUJMRToKLSAgICBjYXNlIEJPWDoKLSAgICBjYXNlIEZMRVg6Ci0gICAgY2FzZSBH
UklEOgotICAgICAgICByZXR1cm4gZGlzcGxheTsKLQotICAgIGNhc2UgTElTVF9JVEVNOgotICAg
ICAgICAvLyBJdCBpcyBhIFdpbklFIGJ1ZyB0aGF0IGZsb2F0ZWQgbGlzdCBpdGVtcyBsb3NlIHRo
ZWlyIGJ1bGxldHMsIHNvIHdlJ2xsIGVtdWxhdGUgdGhlIHF1aXJrLCBidXQgb25seSBpbiBxdWly
a3MgbW9kZS4KLSAgICAgICAgaWYgKCFzdHJpY3RQYXJzaW5nICYmIGlzRmxvYXRpbmcpCi0gICAg
ICAgICAgICByZXR1cm4gQkxPQ0s7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5OwotICAgIGNhc2Ug
SU5MSU5FX1RBQkxFOgotICAgICAgICByZXR1cm4gVEFCTEU7Ci0gICAgY2FzZSBJTkxJTkVfQk9Y
OgotICAgICAgICByZXR1cm4gQk9YOwotICAgIGNhc2UgSU5MSU5FX0ZMRVg6Ci0gICAgICAgIHJl
dHVybiBGTEVYOwotICAgIGNhc2UgSU5MSU5FX0dSSUQ6Ci0gICAgICAgIHJldHVybiBHUklEOwot
Ci0gICAgY2FzZSBJTkxJTkU6Ci0gICAgY2FzZSBSVU5fSU46Ci0gICAgY2FzZSBDT01QQUNUOgot
ICAgIGNhc2UgSU5MSU5FX0JMT0NLOgotICAgIGNhc2UgVEFCTEVfUk9XX0dST1VQOgotICAgIGNh
c2UgVEFCTEVfSEVBREVSX0dST1VQOgotICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dST1VQOgotICAg
IGNhc2UgVEFCTEVfUk9XOgotICAgIGNhc2UgVEFCTEVfQ09MVU1OX0dST1VQOgotICAgIGNhc2Ug
VEFCTEVfQ09MVU1OOgotICAgIGNhc2UgVEFCTEVfQ0VMTDoKLSAgICBjYXNlIFRBQkxFX0NBUFRJ
T046Ci0gICAgICAgIHJldHVybiBCTE9DSzsKLSAgICBjYXNlIE5PTkU6Ci0gICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gTk9ORTsKLSAgICB9Ci0gICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIEJMT0NLOwotfQotCi0vLyBDU1MgcmVxdWlyZXMg
dGV4dC1kZWNvcmF0aW9uIHRvIGJlIHJlc2V0IGF0IGVhY2ggRE9NIGVsZW1lbnQgZm9yIHRhYmxl
cywgCi0vLyBpbmxpbmUgYmxvY2tzLCBpbmxpbmUgdGFibGVzLCBydW4taW5zLCBzaGFkb3cgRE9N
IGNyb3NzaW5ncywgZmxvYXRpbmcgZWxlbWVudHMsCi0vLyBhbmQgYWJzb2x1dGUgb3IgcmVsYXRp
dmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLgotc3RhdGljIGJvb2wgZG9lc05vdEluaGVyaXRUZXh0
RGVjb3JhdGlvbihSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpCi17Ci0gICAgcmV0dXJu
IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVf
VEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBSVU5fSU4KLSAgICAgICAgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9Y
IHx8IGlzQXRTaGFkb3dCb3VuZGFyeShlKQotICAgICAgICB8fCBzdHlsZS0+aXNGbG9hdGluZygp
IHx8IHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpOwotfQotCi1zdGF0aWMgYm9vbCBpc0Rp
c3BsYXlGbGV4aWJsZUJveChFRGlzcGxheSBkaXNwbGF5KQotewotICAgIHJldHVybiBkaXNwbGF5
ID09IEZMRVggfHwgZGlzcGxheSA9PSBJTkxJTkVfRkxFWDsKLX0KLQotdm9pZCBTdHlsZVJlc29s
dmVyOjphZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSwgRWxlbWVudCAqZSkKLXsKLSAgICBBU1NFUlQocGFyZW50U3R5bGUpOwotCi0g
ICAgLy8gQ2FjaGUgb3VyIG9yaWdpbmFsIGRpc3BsYXkuCi0gICAgc3R5bGUtPnNldE9yaWdpbmFs
RGlzcGxheShzdHlsZS0+ZGlzcGxheSgpKTsKLQotICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpICE9
IE5PTkUpIHsKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIDx0ZD4gdGhhdCBzcGVjaWZpZXMgYSBm
bG9hdCBwcm9wZXJ0eSwgaW4gcXVpcmtzIG1vZGUgd2UganVzdCBkcm9wIHRoZSBmbG9hdAotICAg
ICAgICAvLyBwcm9wZXJ0eS4KLSAgICAgICAgLy8gU2l0ZXMgYWxzbyBjb21tb25seSB1c2UgZGlz
cGxheTppbmxpbmUvYmxvY2sgb24gPHRkPnMgYW5kIDx0YWJsZT5zLiBJbiBxdWlya3MgbW9kZSB3
ZSBmb3JjZQotICAgICAgICAvLyB0aGVzZSB0YWdzIHRvIHJldGFpbiB0aGVpciBkaXNwbGF5IHR5
cGVzLgotICAgICAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkgJiYgZSkgewotICAg
ICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUodGRUYWcpKSB7Ci0gICAgICAgICAgICAgICAgc3R5
bGUtPnNldERpc3BsYXkoVEFCTEVfQ0VMTCk7Ci0gICAgICAgICAgICAgICAgc3R5bGUtPnNldEZs
b2F0aW5nKE5vRmxvYXQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlLT5oYXNUYWdOYW1lKHRh
YmxlVGFnKSkKLSAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShzdHlsZS0+aXNEaXNw
bGF5SW5saW5lVHlwZSgpID8gSU5MSU5FX1RBQkxFIDogVEFCTEUpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8IGUtPmhhc1RhZ05hbWUodGhU
YWcpKSkgewotICAgICAgICAgICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gS0hUTUxfTk9X
UkFQKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBhcmUgcmVhbGx5IG5v
d3JhcHBpbmcgb3IgaWYgd2Ugc2hvdWxkIGp1c3QKLSAgICAgICAgICAgICAgICAvLyB1c2Ugbm9y
bWFsIGluc3RlYWQuIElmIHRoZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBmaXhlZCwgdGhlbgotICAg
ICAgICAgICAgICAgIC8vIHdlIGRvbid0IGFjdHVhbGx5IHVzZSBOT1dSQVAuCi0gICAgICAgICAg
ICAgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzRml4ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAg
c3R5bGUtPnNldFdoaXRlU3BhY2UoTk9STUFMKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JBUCk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUYWJsZXMgbmV2ZXIgc3VwcG9ydCB0aGUgLXdl
YmtpdC0qIHZhbHVlcyBmb3IgdGV4dC1hbGlnbiBhbmQgd2lsbCByZXNldCBiYWNrIHRvIHRoZSBk
ZWZhdWx0LgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRhYmxlVGFnKSAmJiAoc3R5
bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9MRUZUIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBX
RUJLSVRfQ0VOVEVSIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKQotICAg
ICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihUQVNUQVJUKTsKLQotICAgICAgICAvLyBGcmFt
ZXMgYW5kIGZyYW1lc2V0cyBuZXZlciBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBvciBwb3NpdGlv
bjphYnNvbHV0ZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8KLSAgICAgICAgLy8gZml4IGEgY3Jhc2gg
d2hlcmUgYSBzaXRlIHRyaWVzIHRvIHBvc2l0aW9uIHRoZXNlIG9iamVjdHMuIFRoZXkgYWxzbyBu
ZXZlciBob25vciBkaXNwbGF5LgotICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFnTmFtZShmcmFt
ZVRhZykgfHwgZS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpKSB7Ci0gICAgICAgICAgICBzdHls
ZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOwotICAgICAgICAgICAgc3R5bGUtPnNldERp
c3BsYXkoQkxPQ0spOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVieSB0ZXh0IGRvZXMgbm90
IHN1cHBvcnQgZmxvYXQgb3IgcG9zaXRpb24uIFRoaXMgbWlnaHQgY2hhbmdlIHdpdGggZXZvbHV0
aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1l
KHJ0VGFnKSkgewotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRpY1Bvc2l0aW9u
KTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAgICAgICAgfQot
Ci0gICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgb3ZlcnJpZGluZyBzdGFydC8td2Vi
a2l0LWF1dG8gbGlrZSB0aGlzLiBEbyBpdCBpbiBodG1sLmNzcyBpbnN0ZWFkLgotICAgICAgICAv
LyBUYWJsZSBoZWFkZXJzIHdpdGggYSB0ZXh0LWFsaWduIG9mIC13ZWJraXQtYXV0byB3aWxsIGNo
YW5nZSB0aGUgdGV4dC1hbGlnbiB0byBjZW50ZXIuCi0gICAgICAgIGlmIChlICYmIGUtPmhhc1Rh
Z05hbWUodGhUYWcpICYmIHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBUQVNUQVJUKQotICAgICAgICAg
ICAgc3R5bGUtPnNldFRleHRBbGlnbihDRU5URVIpOwotCi0gICAgICAgIGlmIChlICYmIGUtPmhh
c1RhZ05hbWUobGVnZW5kVGFnKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NL
KTsKLQotICAgICAgICAvLyBBYnNvbHV0ZS9maXhlZCBwb3NpdGlvbmVkIGVsZW1lbnRzLCBmbG9h
dGluZyBlbGVtZW50cyBhbmQgdGhlIGRvY3VtZW50IGVsZW1lbnQgbmVlZCBibG9jay1saWtlIG91
dHNpZGUgZGlzcGxheS4KLSAgICAgICAgaWYgKHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigp
IHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgKGUgJiYgZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRF
bGVtZW50KCkgPT0gZSkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShlcXVpdmFsZW50
QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5nKCksICFkb2N1
bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOwotCi0gICAgICAgIC8vIEZJWE1FOiBEb24ndCBzdXBw
b3J0IHRoaXMgbXV0YXRpb24gZm9yIHBzZXVkbyBzdHlsZXMgbGlrZSBmaXJzdC1sZXR0ZXIgb3Ig
Zmlyc3QtbGluZSwgc2luY2UgaXQncyBub3QgY29tcGxldGVseQotICAgICAgICAvLyBjbGVhciBo
b3cgdGhhdCBzaG91bGQgd29yay4KLSAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5M
SU5FICYmIHN0eWxlLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiBzdHlsZS0+d3JpdGluZ01v
ZGUoKSAhPSBwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5z
ZXREaXNwbGF5KElOTElORV9CTE9DSyk7Ci0KLSAgICAgICAgLy8gQWZ0ZXIgcGVyZm9ybWluZyB0
aGUgZGlzcGxheSBtdXRhdGlvbiwgY2hlY2sgdGFibGUgcm93cy4gV2UgZG8gbm90IGhvbm9yIHBv
c2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOnN0aWNreSBvbgotICAgICAgICAvLyB0YWJsZSBy
b3dzIG9yIGNlbGxzLiBUaGlzIGhhcyBiZWVuIGVzdGFibGlzaGVkIGZvciBwb3NpdGlvbjpyZWxh
dGl2ZSBpbiBDU1MyLjEgKGFuZCBjYXVzZWQgYSBjcmFzaCBpbiBjb250YWluaW5nQmxvY2soKQot
ICAgICAgICAvLyBvbiBzb21lIHNpdGVzKS4KLSAgICAgICAgaWYgKChzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19H
Uk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9GT09URVJfR1JP
VVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpCi0gICAgICAgICAgICAmJiBzdHls
ZS0+aGFzSW5GbG93UG9zaXRpb24oKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihT
dGF0aWNQb3NpdGlvbik7Ci0KLSAgICAgICAgLy8gd3JpdGluZy1tb2RlIGRvZXMgbm90IGFwcGx5
IHRvIHRhYmxlIHJvdyBncm91cHMsIHRhYmxlIGNvbHVtbiBncm91cHMsIHRhYmxlIHJvd3MsIGFu
ZCB0YWJsZSBjb2x1bW5zLgotICAgICAgICAvLyBGSVhNRTogVGFibGUgY2VsbHMgc2hvdWxkIGJl
IGFsbG93ZWQgdG8gYmUgcGVycGVuZGljdWxhciBvciBmbGlwcGVkIHdpdGggcmVzcGVjdCB0byB0
aGUgdGFibGUsIHRob3VnaC4KLSAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVf
Q09MVU1OIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQIHx8IHN0eWxl
LT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQCi0gICAgICAgICAgICB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPVyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAotICAgICAgICAg
ICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DRUxMKQotICAgICAgICAgICAgc3R5bGUt
PnNldFdyaXRpbmdNb2RlKHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgpKTsKLQotICAgICAgICAv
LyBGSVhNRTogU2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBibG9jay1mbG93IG9uIGZsZXhpYmxlIGJv
eGVzIHlldCwgZGlzYWxsb3cgc2V0dGluZwotICAgICAgICAvLyBvZiBibG9jay1mbG93IHRvIGFu
eXRoaW5nIG90aGVyIHRoYW4gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZS4KLSAgICAgICAgLy8gaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2NDE4IC0gRmxleGlibGUgYm94
IHN1cHBvcnQuCi0gICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBUb3BUb0JvdHRv
bVdyaXRpbmdNb2RlICYmIChzdHlsZS0+ZGlzcGxheSgpID09IEJPWCB8fCBzdHlsZS0+ZGlzcGxh
eSgpID09IElOTElORV9CT1gpKQotICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKFRv
cFRvQm90dG9tV3JpdGluZ01vZGUpOwotCi0gICAgICAgIGlmIChpc0Rpc3BsYXlGbGV4aWJsZUJv
eChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNldEZsb2F0
aW5nKE5vRmxvYXQpOwotICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJs
b2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1l
bnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKLSAgICAgICAgfQotCi0jaWYgRU5BQkxFKERJQUxPR19F
TEVNRU5UKQotICAgICAgICAvLyBQZXIgdGhlIHNwZWMsIHBvc2l0aW9uICdzdGF0aWMnIGFuZCAn
cmVsYXRpdmUnIGluIHRoZSB0b3AgbGF5ZXIgY29tcHV0ZSB0byAnYWJzb2x1dGUnLgotICAgICAg
ICBpZiAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSAmJiAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gU3Rh
dGljUG9zaXRpb24gfHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gUmVsYXRpdmVQb3NpdGlvbikpIHsK
LSAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihBYnNvbHV0ZVBvc2l0aW9uKTsKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAg
fQotCi0gICAgLy8gTWFrZSBzdXJlIG91ciB6LWluZGV4IHZhbHVlIGlzIG9ubHkgYXBwbGllZCBp
ZiB0aGUgb2JqZWN0IGlzIHBvc2l0aW9uZWQuCi0gICAgaWYgKHN0eWxlLT5wb3NpdGlvbigpID09
IFN0YXRpY1Bvc2l0aW9uICYmICFpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlz
cGxheSgpKSkKLSAgICAgICAgc3R5bGUtPnNldEhhc0F1dG9aSW5kZXgoKTsKLQotICAgIC8vIEF1
dG8gei1pbmRleCBiZWNvbWVzIDAgZm9yIHRoZSByb290IGVsZW1lbnQgYW5kIHRyYW5zcGFyZW50
IG9iamVjdHMuIFRoaXMgcHJldmVudHMKLSAgICAvLyBjYXNlcyB3aGVyZSBvYmplY3RzIHRoYXQg
c2hvdWxkIGJlIGJsZW5kZWQgYXMgYSBzaW5nbGUgdW5pdCBlbmQgdXAgd2l0aCBhIG5vbi10cmFu
c3BhcmVudAotICAgIC8vIG9iamVjdCB3ZWRnZWQgaW4gYmV0d2VlbiB0aGVtLiBBdXRvIHotaW5k
ZXggYWxzbyBiZWNvbWVzIDAgZm9yIG9iamVjdHMgdGhhdCBzcGVjaWZ5IHRyYW5zZm9ybXMvbWFz
a3MvcmVmbGVjdGlvbnMuCi0gICAgaWYgKHN0eWxlLT5oYXNBdXRvWkluZGV4KCkgJiYgKChlICYm
IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpCi0gICAgICAgIHx8IHN0eWxl
LT5vcGFjaXR5KCkgPCAxLjBmCi0gICAgICAgIHx8IHN0eWxlLT5oYXNUcmFuc2Zvcm1SZWxhdGVk
UHJvcGVydHkoKQotICAgICAgICB8fCBzdHlsZS0+aGFzTWFzaygpCi0gICAgICAgIHx8IHN0eWxl
LT5jbGlwUGF0aCgpCi0gICAgICAgIHx8IHN0eWxlLT5ib3hSZWZsZWN0KCkKLSAgICAgICAgfHwg
c3R5bGUtPmhhc0ZpbHRlcigpCi0gICAgICAgIHx8IHN0eWxlLT5oYXNCbGVuZE1vZGUoKQotICAg
ICAgICB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGlja3lQb3NpdGlvbgotICAgICAgICB8fCAo
c3R5bGUtPnBvc2l0aW9uKCkgPT0gRml4ZWRQb3NpdGlvbiAmJiBlICYmIGUtPmRvY3VtZW50KCkt
PnBhZ2UoKSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCktPnNldHRpbmdzKCktPmZpeGVkUG9zaXRp
b25DcmVhdGVzU3RhY2tpbmdDb250ZXh0KCkpCi0jaWYgRU5BQkxFKEFDQ0VMRVJBVEVEX09WRVJG
TE9XX1NDUk9MTElORykKLSAgICAgICAgLy8gVG91Y2ggb3ZlcmZsb3cgc2Nyb2xsaW5nIGNyZWF0
ZXMgYSBzdGFja2luZyBjb250ZXh0LgotICAgICAgICB8fCAoKHN0eWxlLT5vdmVyZmxvd1goKSAh
PSBPSElEREVOIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVOKSAmJiBzdHlsZS0+dXNl
VG91Y2hPdmVyZmxvd1Njcm9sbGluZygpKQotI2VuZGlmCi0jaWYgRU5BQkxFKERJQUxPR19FTEVN
RU5UKQotICAgICAgICB8fCAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSkKLSNlbmRpZgotICAgICAg
ICApKQotICAgICAgICBzdHlsZS0+c2V0WkluZGV4KDApOwotCi0gICAgLy8gVGV4dGFyZWEgY29u
c2lkZXJzIG92ZXJmbG93IHZpc2libGUgYXMgYXV0by4KLSAgICBpZiAoZSAmJiBlLT5oYXNUYWdO
YW1lKHRleHRhcmVhVGFnKSkgewotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKHN0eWxlLT5v
dmVyZmxvd1goKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93WCgpKTsKLSAg
ICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1ZJU0lCTEUg
PyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1koKSk7Ci0gICAgfQotCi0gICAgaWYgKGRvZXNOb3RJ
bmhlcml0VGV4dERlY29yYXRpb24oc3R5bGUsIGUpKQotICAgICAgICBzdHlsZS0+c2V0VGV4dERl
Y29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOwotICAgIGVsc2UKLSAg
ICAgICAgc3R5bGUtPmFkZFRvVGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNv
cmF0aW9uKCkpOwotCi0gICAgLy8gSWYgZWl0aGVyIG92ZXJmbG93IHZhbHVlIGlzIG5vdCB2aXNp
YmxlLCBjaGFuZ2UgdG8gYXV0by4KLSAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9NQVJR
VUVFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPTUFSUVVFRSkKLSAgICAgICAgc3R5bGUtPnNl
dE92ZXJmbG93WShPTUFSUVVFRSk7Ci0gICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09
IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPTUFSUVVFRSkKLSAgICAgICAgc3R5
bGUtPnNldE92ZXJmbG93WChPTUFSUVVFRSk7Ci0gICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93
WCgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJMRSkgewotICAg
ICAgICAvLyBGSVhNRTogT25jZSB3ZSBpbXBsZW1lbnQgcGFnaW5hdGlvbiBjb250cm9scywgb3Zl
cmZsb3cteCBzaG91bGQgZGVmYXVsdCB0byBoaWRkZW4KLSAgICAgICAgLy8gaWYgb3ZlcmZsb3ct
eSBpcyBzZXQgdG8gLXdlYmtpdC1wYWdlZC14IG9yIC13ZWJraXQtcGFnZS15LiBGb3Igbm93LCB3
ZSdsbCBsZXQgaXQKLSAgICAgICAgLy8gZGVmYXVsdCB0byBhdXRvIHNvIHdlIGNhbiBhdCBsZWFz
dCBzY3JvbGwgdGhyb3VnaCB0aGUgcGFnZXMuCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1go
T0FVVE8pOwotICAgIH0gZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFICYm
IHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSkKLSAgICAgICAgc3R5bGUtPnNldE92ZXJm
bG93WShPQVVUTyk7Ci0KLSAgICAvLyBDYWxsIHNldFN0eWxlc0ZvclBhZ2luYXRpb25Nb2RlKCkg
aWYgYSBwYWdpbmF0aW9uIG1vZGUgaXMgc2V0IGZvciBhbnkgbm9uLXJvb3QgZWxlbWVudHMuIElm
IHRoZXNlCi0gICAgLy8gc3R5bGVzIGFyZSBzcGVjaWZpZWQgb24gYSByb290IGVsZW1lbnQsIHRo
ZW4gdGhleSB3aWxsIGJlIGluY29ycG9yYXRlZCBpbgotICAgIC8vIFN0eWxlUmVzb2x2ZXI6OnN0
eWxlRm9yRG9jdW1lbnQoKS4KLSAgICBpZiAoKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURY
IHx8IHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURZKSAmJiAhKGUgJiYgKGUtPmhhc1RhZ05h
bWUoaHRtbFRhZykgfHwgZS0+aGFzVGFnTmFtZShib2R5VGFnKSkpKQotICAgICAgICBzZXRTdHls
ZXNGb3JQYWdpbmF0aW9uTW9kZShXZWJDb3JlOjpwYWdpbmF0aW9uTW9kZUZvclJlbmRlclN0eWxl
KHN0eWxlKSwgc3R5bGUpOwotCi0gICAgLy8gVGFibGUgcm93cywgc2VjdGlvbnMgYW5kIHRoZSB0
YWJsZSBpdHNlbGYgd2lsbCBzdXBwb3J0IG92ZXJmbG93OmhpZGRlbiBhbmQgd2lsbCBpZ25vcmUg
c2Nyb2xsL2F1dG8uCi0gICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgdGFibGUgc2VjdGlvbnMgd2ls
bCBzdXBwb3J0IGF1dG8gYW5kIHNjcm9sbC4KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRQotICAgICAgICB8fCBzdHls
ZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPVykgewotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9WSVNJQkxFICYm
IHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNldE92
ZXJmbG93WChPVklTSUJMRSk7Ci0gICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJ
U0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pCi0gICAgICAgICAgICBzdHls
ZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKLSAgICB9Ci0KLSAgICAvLyBNZW51bGlzdHMgc2hv
dWxkIGhhdmUgdmlzaWJsZSBvdmVyZmxvdwotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09
IE1lbnVsaXN0UGFydCkgewotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsK
LSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8g
Q3VsbCBvdXQgYW55IHVzZWxlc3MgbGF5ZXJzIGFuZCBhbHNvIHJlcGVhdCBwYXR0ZXJucyBpbnRv
IGFkZGl0aW9uYWwgbGF5ZXJzLgotICAgIHN0eWxlLT5hZGp1c3RCYWNrZ3JvdW5kTGF5ZXJzKCk7
Ci0gICAgc3R5bGUtPmFkanVzdE1hc2tMYXllcnMoKTsKLQotICAgIC8vIERvIHRoZSBzYW1lIGZv
ciBhbmltYXRpb25zIGFuZCB0cmFuc2l0aW9ucy4KLSAgICBzdHlsZS0+YWRqdXN0QW5pbWF0aW9u
cygpOwotICAgIHN0eWxlLT5hZGp1c3RUcmFuc2l0aW9ucygpOwotCi0gICAgLy8gSW1wb3J0YW50
OiBJbnRyaW5zaWMgbWFyZ2lucyBnZXQgYWRkZWQgdG8gY29udHJvbHMgYmVmb3JlIHRoZSB0aGVt
ZSBoYXMgYWRqdXN0ZWQgdGhlIHN0eWxlLCBzaW5jZSB0aGUgdGhlbWUgd2lsbAotICAgIC8vIGFs
dGVyIGZvbnRzIGFuZCBoZWlnaHRzL3dpZHRocy4KLSAgICBpZiAoZSAmJiBlLT5pc0Zvcm1Db250
cm9sRWxlbWVudCgpICYmIHN0eWxlLT5mb250U2l6ZSgpID49IDExKSB7Ci0gICAgICAgIC8vIERv
bid0IGFwcGx5IGludHJpbnNpYyBtYXJnaW5zIHRvIGltYWdlIGJ1dHRvbnMuIFRoZSBkZXNpZ25l
ciBrbm93cyBob3cgYmlnIHRoZSBpbWFnZXMgYXJlLAotICAgICAgICAvLyBzbyB3ZSBoYXZlIHRv
IHRyZWF0IGFsbCBpbWFnZSBidXR0b25zIGFzIHRob3VnaCB0aGV5IHdlcmUgZXhwbGljaXRseSBz
aXplZC4KLSAgICAgICAgaWYgKCFlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSB8fCAhc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudCo+KGUpLT5pc0ltYWdlQnV0dG9uKCkpCi0gICAgICAgICAgICBh
ZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKLSAgICB9Ci0KLSAgICAvLyBMZXQgdGhlIHRoZW1l
IGFsc28gaGF2ZSBhIGNyYWNrIGF0IGFkanVzdGluZyB0aGUgc3R5bGUuCi0gICAgaWYgKHN0eWxl
LT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+
YWRqdXN0U3R5bGUodGhpcywgc3R5bGUsIGUsIG1fc3RhdGUuaGFzVUFBcHBlYXJhbmNlKCksIG1f
c3RhdGUuYm9yZGVyRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmREYXRhKCksIG1fc3RhdGUuYmFj
a2dyb3VuZENvbG9yKCkpOwotCi0gICAgLy8gSWYgd2UgaGF2ZSBmaXJzdC1sZXR0ZXIgcHNldWRv
IHN0eWxlLCBkbyBub3Qgc2hhcmUgdGhpcyBzdHlsZS4KLSAgICBpZiAoc3R5bGUtPmhhc1BzZXVk
b1N0eWxlKEZJUlNUX0xFVFRFUikpCi0gICAgICAgIHN0eWxlLT5zZXRVbmlxdWUoKTsKLQotICAg
IC8vIEZJWE1FOiB3aGVuIGRyb3BwaW5nIHRoZSAtd2Via2l0IHByZWZpeCBvbiB0cmFuc2Zvcm0t
c3R5bGUsIHdlIHNob3VsZCBhbHNvIGhhdmUgb3BhY2l0eSA8IDEgY2F1c2UgZmxhdHRlbmluZy4K
LSAgICBpZiAoc3R5bGUtPnByZXNlcnZlczNEKCkgJiYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBP
VklTSUJMRQotICAgICAgICB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUKLSAgICAg
ICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpKSkKLSAgICAgICAgc3R5bGUtPnNldFRyYW5zZm9ybVN0
eWxlM0QoVHJhbnNmb3JtU3R5bGUzREZsYXQpOwotCi0gICAgLy8gU2VhbWxlc3MgaWZyYW1lcyBi
ZWhhdmUgbGlrZSBibG9ja3MuIE1hcCB0aGVpciBkaXNwbGF5IHRvIGlubGluZS1ibG9jayB3aGVu
IG1hcmtlZCBpbmxpbmUuCi0gICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShpZnJhbWVUYWcpICYm
IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0YXRpY19jYXN0PEhUTUxJRnJhbWVFbGVt
ZW50Kj4oZSktPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5KCkpCi0gICAgICAgIHN0eWxlLT5zZXRE
aXNwbGF5KElOTElORV9CTE9DSyk7Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChlICYmIGUt
PmlzU1ZHRWxlbWVudCgpKSB7Ci0gICAgICAgIC8vIFNwZWM6IGh0dHA6Ly93d3cudzMub3JnL1RS
L1NWRy9tYXNraW5nLmh0bWwjT3ZlcmZsb3dQcm9wZXJ0eQotICAgICAgICBpZiAoc3R5bGUtPm92
ZXJmbG93WSgpID09IE9TQ1JPTEwpCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9I
SURERU4pOwotICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT0FVVE8pCi0g
ICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKLQotICAgICAgICBpZiAo
c3R5bGUtPm92ZXJmbG93WCgpID09IE9TQ1JPTEwpCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3Zl
cmZsb3dYKE9ISURERU4pOwotICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0g
T0FVVE8pCi0gICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxFKTsKLQotICAg
ICAgICAvLyBPbmx5IHRoZSByb290IDxzdmc+IGVsZW1lbnQgaW4gYW4gU1ZHIGRvY3VtZW50IGZy
YWdtZW50IHRyZWUgaG9ub3JzIGNzcyBwb3NpdGlvbgotICAgICAgICBpZiAoIShlLT5oYXNUYWdO
YW1lKFNWR05hbWVzOjpzdmdUYWcpICYmIGUtPnBhcmVudE5vZGUoKSAmJiAhZS0+cGFyZW50Tm9k
ZSgpLT5pc1NWR0VsZW1lbnQoKSkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oUmVu
ZGVyU3R5bGU6OmluaXRpYWxQb3NpdGlvbigpKTsKLQotICAgICAgICAvLyBSZW5kZXJTVkdSb290
IGhhbmRsZXMgem9vbWluZyBmb3IgdGhlIHdob2xlIFNWRyBzdWJ0cmVlLCBzbyBmb3JlaWduT2Jq
ZWN0IGNvbnRlbnQgc2hvdWxkCi0gICAgICAgIC8vIG5vdCBiZSBzY2FsZWQgYWdhaW4uCi0gICAg
ICAgIGlmIChlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpmb3JlaWduT2JqZWN0VGFnKSkKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRFZmZlY3RpdmVab29tKFJlbmRlclN0eWxlOjppbml0aWFsWm9vbSgp
KTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVja1JlZ2lvblN0
eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCi17Ci0gICAgLy8gRklYTUUgKEJVRyA3MjQ3Mik6
IFdlIGRvbid0IGFkZCBALXdlYmtpdC1yZWdpb24gcnVsZXMgb2Ygc2NvcGVkIHN0eWxlIHNoZWV0
cyBmb3IgdGhlIG1vbWVudCwKLSAgICAvLyBzbyBhbGwgcmVnaW9uIHJ1bGVzIGFyZSBnbG9iYWwg
YnkgZGVmYXVsdC4gVmVyaWZ5IHdoZXRoZXIgdGhhdCBjYW4gc3RhbmQgb3IgbmVlZHMgY2hhbmdp
bmcuCi0KLSAgICB1bnNpZ25lZCBydWxlc1NpemUgPSBtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCkt
Pm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgewotICAgICAgICBBU1NFUlQobV9ydWxlU2V0cy5h
dXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVTZXQu
Z2V0KCkpOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLmF1dGhv
clN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2VsZWN0b3IsIHJl
Z2lvbkVsZW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYg
KG1fcnVsZVNldHMudXNlclN0eWxlKCkpIHsKLSAgICAgICAgcnVsZXNTaXplID0gbV9ydWxlU2V0
cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgewotICAgICAgICAg
ICAgQVNTRVJUKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVs
ZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tSZWdpb25T
ZWxlY3RvcihtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVT
ZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3Rh
dGljIHZvaWQgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUpCi17
Ci0gICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKLSAgICBOb25DSktHbHlwaE9y
aWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247Ci0gICAgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRp
b24oc3R5bGUsIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7Ci0KLSAgICBjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiA9IHN0eWxlLT5mb250RGVzY3JpcHRp
b24oKTsKLSAgICBpZiAoZm9udERlc2NyaXB0aW9uLm9yaWVudGF0aW9uKCkgPT0gZm9udE9yaWVu
dGF0aW9uICYmIGZvbnREZXNjcmlwdGlvbi5ub25DSktHbHlwaE9yaWVudGF0aW9uKCkgPT0gZ2x5
cGhPcmllbnRhdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRm9udERlc2NyaXB0aW9uIG5l
d0ZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgIG5ld0ZvbnREZXNjcmlwdGlv
bi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOwotICAgIG5ld0Zv
bnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOwotICAgIHN0eWxl
LT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjp1cGRhdGVGb250KCkKLXsKLSAgICBpZiAoIW1fc3RhdGUuZm9udERpcnR5KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1fc3RhdGUuc3R5
bGUoKTsKLSAgICBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2Uoc3R5bGUsIG1fc3RhdGUucGFy
ZW50U3R5bGUoKSk7Ci0gICAgY2hlY2tGb3Jab29tQ2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVu
dFN0eWxlKCkpOwotICAgIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2Uoc3R5bGUpOwotICAgIHN0
eWxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKLSAgICBtX3N0YXRlLnNldEZvbnRE
aXJ0eShmYWxzZSk7Ci19Ci0KLVBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVzb2x2ZXI6
OnN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRl
KQotewotICAgIHJldHVybiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChlLCBOT1BTRVVETywg
cnVsZXNUb0luY2x1ZGUpOwotfQotCi1QYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29s
dmVyOjpwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCBQc2V1ZG9JZCBwc2V1
ZG9JZCwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCi17Ci0gICAgaWYgKCFlIHx8ICFlLT5kb2N1
bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpOwotCi0g
ICAgaW5pdEVsZW1lbnQoZSk7Ci0gICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3Vt
ZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKLQotICAgIE1hdGNoUmVzdWx0IGR1bW15OwotICAgIGlm
IChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVzKSB7Ci0gICAgICAgIC8vIEZpcnN0
IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgICAgIG1hdGNo
VUFSdWxlcyhkdW1teSk7Ci0KLSAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIgc2hlZXQgcnVs
ZXMuCi0gICAgICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAgICAgICAg
IG1hdGNoVXNlclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwot
ICAgIH0KLQotICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAocnVsZXNUb0lu
Y2x1ZGUgJiBBdXRob3JDU1NSdWxlcykpIHsKLSAgICAgICAgbV9zdGF0ZS5zZXRTYW1lT3JpZ2lu
T25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOwotCi0gICAgICAg
IC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgotICAgICAgICBtYXRjaEF1dGhv
clJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgICAg
IG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOwotICAgIH0KLQotICAgIG1fc3RhdGUu
c2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLQotICAgIHJldHVybiBt
X3N0YXRlLnRha2VSdWxlTGlzdCgpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpy
dWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUq
IHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlv
ckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0KLSAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsK
LSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBz
ZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBz
ZXVkb0lkICE9IE5PUFNFVURPKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAv
LyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRj
aGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KLSAgICAg
ICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNo
ZWNrIHRoZSBuYW1lc3BhY2UuCi0gICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxl
Y3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNI
VE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNl
bGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAm
JiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEu
c2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVE
YXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICghc2VsZWN0b3JD
aGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZh
c3RQYXRoLm1hdGNoZXMoKTsKLSAgICB9Ci0KLSAgICAvLyBTbG93IHBhdGguCi0gICAgU2VsZWN0
b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwotICAg
IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0
YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1h
dGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwot
ICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKLSAgICBjb250ZXh0LnBzZXVkb0lkID0gc3RhdGUu
cHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7Ci0gICAgY29udGV4dC5zY3JvbGxiYXIgPSBz
dGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXI7Ci0gICAgY29udGV4dC5zY3JvbGxi
YXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBj
b250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxl
Y3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQs
IGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKLSAgICBpZiAo
bWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0g
Tk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHluYW1p
Y1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3Iq
IHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQotewotICAgIGlmICghcmVn
aW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5t
b2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3Rvcjsg
czsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkgewotICAgICAgICBTZWxlY3RvckNoZWNr
ZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJl
Z2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwotICAg
ICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlm
IChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5
bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNo
ZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotLy8gdGhpcyBpcyBtb3N0bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBhcHBseSBhIGNlcnRh
aW4gcnVsZSB0byB0aGUgcmVuZGVyc3R5bGUuLi4KLQotTGVuZ3RoIFN0eWxlUmVzb2x2ZXI6OmNv
bnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRl
clN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIp
Ci17Ci0gICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRU
b0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxj
dWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0UGVyY2VudGFn
ZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVuZ3RoKFVuZGVm
aW5lZCk7Ci19Ci0KLUxlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9GbG9hdExlbmd0aChD
U1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCi17Ci0gICAgcmV0dXJuIHBy
aW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEZsb2F0
Q29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24gfCBG
cmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHlsZSwg
cm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOwotfQotCi10ZW1wbGF0
ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6YXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRp
ZXMsIFN0eWxlUnVsZSogcnVsZSwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5
LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQotewotICAgIEFT
U0VSVCgocHJvcGVydHlXaGl0ZWxpc3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0UmVnaW9uKSB8
fCBtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSk7Ci0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbFByb2Nlc3NS
dWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOwotCi0gICAgdW5zaWduZWQgcHJvcGVydHlDb3Vu
dCA9IHByb3BlcnRpZXMtPnByb3BlcnR5Q291bnQoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7Ci0gICAgICAgIFN0eWxlUHJvcGVydHlTZXQ6OlBy
b3BlcnR5UmVmZXJlbmNlIGN1cnJlbnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUF0KGkpOwotICAg
ICAgICBpZiAoaXNJbXBvcnRhbnQgIT0gY3VycmVudC5pc0ltcG9ydGFudCgpKQotICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIGlmIChpbmhlcml0ZWRPbmx5ICYmICFjdXJyZW50LmlzSW5o
ZXJpdGVkKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBleHBs
aWNpdGx5IGluaGVyaXRlZCwgd2UgbmVlZCB0byBhcHBseSBmdXJ0aGVyIG5vbi1pbmhlcml0ZWQg
cHJvcGVydGllcwotICAgICAgICAgICAgLy8gYXMgdGhleSBtaWdodCBvdmVycmlkZSB0aGUgdmFs
dWUgaW5oZXJpdGVkIGhlcmUuIEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBhbGxvdyBkZWNsYXJh
dGlvbnMgd2l0aAotICAgICAgICAgICAgLy8gZXhwbGljaXRseSBpbmhlcml0ZWQgcHJvcGVydGll
cyB0byBiZSBjYWNoZWQuCi0gICAgICAgICAgICBBU1NFUlQoIWN1cnJlbnQudmFsdWUoKS0+aXNJ
bmhlcml0ZWRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAg
ICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBjdXJyZW50LmlkKCk7Ci0KLSAgICAgICAgaWYg
KHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbiAmJiAhU3R5
bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkocHJvcGVydHkpKQotICAgICAg
ICAgICAgY29udGludWU7Ci0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgICAgICBpZiAocHJv
cGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0Q3VlICYmICFTdHlsZVJlc29s
dmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCi0gICAgICAgICAgICBjb250
aW51ZTsKLSNlbmRpZgotICAgICAgICBzd2l0Y2ggKHBhc3MpIHsKLSNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKLSAgICAgICAgY2FzZSBWYXJpYWJsZURlZmluaXRpb25zOgotICAgICAgICAgICAg
Q09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlWYXJpYWJsZSA8IGZpcnN0Q1NTUHJvcGVydHksIENT
U192YXJpYWJsZV9pc19iZWZvcmVfZmlyc3RfcHJvcGVydHkpOwotICAgICAgICAgICAgaWYgKHBy
b3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCi0gICAgICAgICAgICAgICAgYXBwbHlQcm9w
ZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAgICAgICBicmVhazsK
LSNlbmRpZgotICAgICAgICBjYXNlIEhpZ2hQcmlvcml0eVByb3BlcnRpZXM6Ci0gICAgICAgICAg
ICBDT01QSUxFX0FTU0VSVChmaXJzdENTU1Byb3BlcnR5ID09IENTU1Byb3BlcnR5Q29sb3IsIENT
U19jb2xvcl9pc19maXJzdF9wcm9wZXJ0eSk7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChD
U1NQcm9wZXJ0eVpvb20gPT0gQ1NTUHJvcGVydHlDb2xvciArIDE3LCBDU1Nfem9vbV9pc19lbmRf
b2ZfZmlyc3RfcHJvcF9yYW5nZSk7Ci0gICAgICAgICAgICBDT01QSUxFX0FTU0VSVChDU1NQcm9w
ZXJ0eUxpbmVIZWlnaHQgPT0gQ1NTUHJvcGVydHlab29tICsgMSwgQ1NTX2xpbmVfaGVpZ2h0X2lz
X2FmdGVyX3pvb20pOwotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgICAgICAgICAgaWYg
KHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8vIGdpdmUgc3BlY2lhbCBwcmlvcml0eSB0byBmb250
LXh4eCwgY29sb3IgcHJvcGVydGllcywgZXRjCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgPCBD
U1NQcm9wZXJ0eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJy
ZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAgICAgICAvLyB3ZSBhcHBseSBsaW5l
LWhlaWdodCBsYXRlcgotICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0gQ1NTUHJvcGVy
dHlMaW5lSGVpZ2h0KQotICAgICAgICAgICAgICAgIG1fc3RhdGUuc2V0TGluZUhlaWdodFZhbHVl
KGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMb3dQ
cmlvcml0eVByb3BlcnRpZXM6Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgPiBDU1NQcm9wZXJ0
eUxpbmVIZWlnaHQpCi0gICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCks
IGN1cnJlbnQudmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjpkaWRQcm9jZXNzUnVsZShjb29raWUpOwotfQotCi10ZW1wbGF0ZSA8U3R5bGVS
ZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KLXZvaWQgU3R5bGVSZXNvbHZlcjo6
YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGJv
b2wgaXNJbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJp
dGVkT25seSkKLXsKLSAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuc3R5bGUoKS0+aW5z
aWRlTGluaygpICE9IE5vdEluc2lkZUxpbmspIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0
SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgewotICAgICAgICAgICAgY29uc3QgTWF0Y2hlZFBy
b3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXNbaV07Ci0gICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gbWF0Y2hlZFByb3Bl
cnRpZXMubGlua01hdGNoVHlwZTsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBu
aWNlciB0byBwYXNzIHRoZXNlIGFzIGFyZ3VtZW50cyBidXQgdGhhdCByZXF1aXJlcyBjaGFuZ2Vz
IGluIG1hbnkgcGxhY2VzLgotICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoTGluayk7Ci0g
ICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGxpbmtN
YXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoVmlzaXRlZCk7Ci0KLSAgICAgICAgICAg
IGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgp
LCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5
LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndo
aXRlbGlzdFR5cGUpKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5
VG9SZWd1bGFyU3R5bGUodHJ1ZSk7Ci0gICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1Zp
c2l0ZWRMaW5rU3R5bGUoZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAo
aW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKLSAgICAgICAgY29uc3Qg
TWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXNbaV07Ci0gICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJv
cGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlz
SW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5
cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKLSAgICB9Ci19Ci0KLXVuc2ln
bmVkIFN0eWxlUmVzb2x2ZXI6OmNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0
Y2hlZFByb3BlcnRpZXMqIHByb3BlcnRpZXMsIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgCi0gICAg
cmV0dXJuIFN0cmluZ0hhc2hlcjo6aGFzaE1lbW9yeShwcm9wZXJ0aWVzLCBzaXplb2YoTWF0Y2hl
ZFByb3BlcnRpZXMpICogc2l6ZSk7Ci19Ci0KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJl
c29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMm
IGIpCi17Ci0gICAgcmV0dXJuIGEuZmlyc3RVQVJ1bGUgPT0gYi5maXJzdFVBUnVsZQotICAgICAg
ICAmJiBhLmxhc3RVQVJ1bGUgPT0gYi5sYXN0VUFSdWxlCi0gICAgICAgICYmIGEuZmlyc3RBdXRo
b3JSdWxlID09IGIuZmlyc3RBdXRob3JSdWxlCi0gICAgICAgICYmIGEubGFzdEF1dGhvclJ1bGUg
PT0gYi5sYXN0QXV0aG9yUnVsZQotICAgICAgICAmJiBhLmZpcnN0VXNlclJ1bGUgPT0gYi5maXJz
dFVzZXJSdWxlCi0gICAgICAgICYmIGEubGFzdFVzZXJSdWxlID09IGIubGFzdFVzZXJSdWxlOwot
fQotCi1ib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5nZXMmIGEs
IGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQotewotICAgIHJldHVybiAhKGEg
PT0gYik7Ci19Ci0KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVk
UHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGIp
Ci17Ci0gICAgcmV0dXJuIGEucHJvcGVydGllcyA9PSBiLnByb3BlcnRpZXMgJiYgYS5saW5rTWF0
Y2hUeXBlID09IGIubGlua01hdGNoVHlwZTsKLX0KLQotYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0
eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJlc29sdmVyOjpN
YXRjaGVkUHJvcGVydGllcyYgYikKLXsKLSAgICByZXR1cm4gIShhID09IGIpOwotfQotCi1jb25z
dCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogU3R5bGVSZXNvbHZl
cjo6ZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1h
dGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKLXsKLSAgICBBU1NFUlQoaGFzaCk7Ci0KLSAgICBNYXRj
aGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZS5maW5kKGhhc2gpOwotICAgIGlmIChpdCA9PSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5k
KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtJiBj
YWNoZUl0ZW0gPSBpdC0+dmFsdWU7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1hdGNoUmVzdWx0Lm1h
dGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKLSAgICBpZiAoc2l6ZSAhPSBjYWNoZUl0ZW0ubWF0Y2hl
ZFByb3BlcnRpZXMuc2l6ZSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXNbaV0gIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzW2ldKQotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjYWNoZUl0ZW0ucmFuZ2VzICE9IG1hdGNoUmVz
dWx0LnJhbmdlcykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuICZjYWNoZUl0ZW07Ci19
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0
IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNp
Z25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCi17Ci0gICAgc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25zQmV0d2VlblN3
ZWVwcyA9IDEwMDsKLSAgICBpZiAoKyttX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNT
aW5jZUxhc3RTd2VlcCA+PSBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5T
d2VlcHMKLSAgICAgICAgJiYgIW1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIuaXNB
Y3RpdmUoKSkgewotICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hlZERlY2xhcmF0
aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMgPSA2MDsKLSAgICAgICAgbV9tYXRjaGVkUHJvcGVy
dGllc0NhY2hlU3dlZXBUaW1lci5zdGFydE9uZVNob3QobWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVT
d2VlcFRpbWVJblNlY29uZHMpOwotICAgIH0KLQotICAgIEFTU0VSVChoYXNoKTsKLSAgICBNYXRj
aGVkUHJvcGVydGllc0NhY2hlSXRlbSBjYWNoZUl0ZW07Ci0gICAgY2FjaGVJdGVtLm1hdGNoZWRQ
cm9wZXJ0aWVzLmFwcGVuZChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcyk7Ci0gICAgY2Fj
aGVJdGVtLnJhbmdlcyA9IG1hdGNoUmVzdWx0LnJhbmdlczsKLSAgICAvLyBOb3RlIHRoYXQgd2Ug
ZG9uJ3QgY2FjaGUgdGhlIG9yaWdpbmFsIFJlbmRlclN0eWxlIGluc3RhbmNlLiBJdCBtYXkgYmUg
ZnVydGhlciBtb2RpZmllZC4KLSAgICAvLyBUaGUgUmVuZGVyU3R5bGUgaW4gdGhlIGNhY2hlIGlz
IHJlYWxseSBqdXN0IGEgaG9sZGVyIGZvciB0aGUgc3Vic3RydWN0dXJlcyBhbmQgbmV2ZXIgdXNl
ZCBhcy1pcy4KLSAgICBjYWNoZUl0ZW0ucmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUo
c3R5bGUpOwotICAgIGNhY2hlSXRlbS5wYXJlbnRSZW5kZXJTdHlsZSA9IFJlbmRlclN0eWxlOjpj
bG9uZShwYXJlbnRTdHlsZSk7Ci0gICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmFkZChoYXNo
LCBjYWNoZUl0ZW0pOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmludmFsaWRhdGVNYXRjaGVk
UHJvcGVydGllc0NhY2hlKCkKLXsKLSAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuY2xlYXIo
KTsKLX0KLQotc3RhdGljIGJvb2wgaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUo
Y29uc3QgRWxlbWVudCogZWxlbWVudCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBS
ZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgLy8gRklYTUU6IENTU1Byb3BlcnR5V2Vi
a2l0V3JpdGluZ01vZGUgbW9kaWZpZXMgc3RhdGUgd2hlbiBhcHBseWluZyB0byBkb2N1bWVudCBl
bGVtZW50LiBXZSBjYW4ndCBza2lwIHRoZSBhcHBseWluZyBieSBjYWNoaW5nLgotICAgIGlmIChl
bGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpICYmIGVsZW1l
bnQtPmRvY3VtZW50KCktPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+dW5pcXVlKCkgfHwgKHN0eWxlLT5zdHls
ZVR5cGUoKSAhPSBOT1BTRVVETyAmJiBwYXJlbnRTdHlsZS0+dW5pcXVlKCkpKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPnpvb20oKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlh
bFpvb20oKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+d3JpdGluZ01v
ZGUoKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAvLyBUaGUgY2FjaGUgYXNzdW1lcyBzdGF0aWMga25vd2xlZGdlIGFib3V0
IHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZC4KLSAgICBpZiAocGFyZW50U3R5bGUtPmhh
c0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgRWxlbWVudCog
ZWxlbWVudCkKLXsKLSAgICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgU3RhdGUmIHN0YXRlID0gbV9z
dGF0ZTsKLSAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBtYXRjaFJlc3VsdC5pc0NhY2hlYWJsZSA/
IGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2gobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuZGF0YSgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkpIDogMDsKLSAg
ICBib29sIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOwotICAgIGNvbnN0IE1hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGVJdGVtKiBjYWNoZUl0ZW0gPSAwOwotICAgIGlmIChjYWNoZUhhc2ggJiYgKGNh
Y2hlSXRlbSA9IGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjYWNoZUhhc2gsIG1hdGNo
UmVzdWx0KSkpIHsKLSAgICAgICAgLy8gV2UgY2FuIGJ1aWxkIHVwIHRoZSBzdHlsZSBieSBjb3B5
aW5nIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tIGFuIGVhcmxpZXIgc3R5bGUgb2JqZWN0
IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGV4YWN0Ci0gICAgICAgIC8vIHN0eWxlIGRlY2xhcmF0aW9u
cy4gV2UgdGhlbiBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBp
ZiBhbnksIGFzIHRoZWlyIHZhbHVlcyBjYW4gZGVwZW5kIG9uIHRoZSAKLSAgICAgICAgLy8gZWxl
bWVudCBjb250ZXh0LiBUaGlzIGlzIGZhc3QgYW5kIHNhdmVzIG1lbW9yeSBieSByZXVzaW5nIHRo
ZSBzdHlsZSBkYXRhIHN0cnVjdHVyZXMuCi0gICAgICAgIHN0YXRlLnN0eWxlKCktPmNvcHlOb25J
bmhlcml0ZWRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOwotICAgICAgICBpZiAo
c3RhdGUucGFyZW50U3R5bGUoKS0+aW5oZXJpdGVkRGF0YVNoYXJlZChjYWNoZUl0ZW0tPnBhcmVu
dFJlbmRlclN0eWxlLmdldCgpKSAmJiAhaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpKSB7Ci0g
ICAgICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdHVzID0gc3RhdGUuc3R5bGUoKS0+aW5zaWRl
TGluaygpOwotICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGl0ZW0gcGFyZW50IHN0eWxlIGhh
cyBpZGVudGljYWwgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgcGFyZW50IHN0
eWxlIHRoZW4gdGhlCi0gICAgICAgICAgICAvLyByZXN1bHRpbmcgc3R5bGUgd2lsbCBiZSBpZGVu
dGljYWwgdG9vLiBXZSBjb3B5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcyBvdmVyIGZyb20gdGhl
IGNhY2hlIGFuZCBhcmUgZG9uZS4KLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRG
cm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOwotCi0gICAgICAgICAgICAvLyBVbmZv
cnR1bmF0ZWx5IHRoZSBsaW5rIHN0YXR1cyBpcyB0cmVhdGVkIGxpa2UgYW4gaW5oZXJpdGVkIHBy
b3BlcnR5LiBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVzdG9yZSBpdC4KLSAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXR1cyk7Ci0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gdHJ1ZTsgCi0gICAg
fQotCi0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgLy8gRmlyc3QgYXBwbHkgYWxsIHZh
cmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5IG1heSBiZSB1c2VkIGR1cmluZyBhcHBsaWNhdGlv
biBvZiBsYXRlciBwcm9wZXJ0aWVzLgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFi
bGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIHRydWUsIG1h
dGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0
aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5y
YW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBw
bHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVm
aW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1
bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwot
I2VuZGlmCi0KLSAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgb2YgdGhlIG1hdGNoZWQgcnVsZXMgaW4g
dGhlIGFwcHJvcHJpYXRlIG9yZGVyLiBXYWxrIHRoZSBydWxlcyBhbmQgYXBwbHkKLSAgICAvLyBo
aWdoLXByaW9yaXR5IHByb3BlcnRpZXMgZmlyc3QsIGkuZS4sIHRob3NlIHByb3BlcnRpZXMgdGhh
dCBvdGhlciBwcm9wZXJ0aWVzIGRlcGVuZCBvbi4KLSAgICAvLyBUaGUgb3JkZXIgaXMgKDEpIGhp
Z2gtcHJpb3JpdHkgbm90IGltcG9ydGFudCwgKDIpIGhpZ2gtcHJpb3JpdHkgaW1wb3J0YW50LCAo
Mykgbm9ybWFsIG5vdCBpbXBvcnRhbnQKLSAgICAvLyBhbmQgKDQpIG5vcm1hbCBpbXBvcnRhbnQu
Ci0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotICAgIGFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRj
aFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkp
OwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0
Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNo
UmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBh
cHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0
LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFu
Z2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRj
aFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxl
LCBhcHBseUluaGVyaXRlZE9ubHkpOwotCi0gICAgaWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0t
PnJlbmRlclN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZl
Wm9vbSgpKSB7Ci0gICAgICAgIHN0YXRlLnNldEZvbnREaXJ0eSh0cnVlKTsKLSAgICAgICAgYXBw
bHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gSWYgb3VyIGZvbnQgZ290
IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgotICAgIHVwZGF0ZUZvbnQoKTsK
LQotICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQg
b24gdGhlIGZvbnQtc2l6ZS4KLSAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCi0gICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0
VmFsdWUoKSk7Ci0KLSAgICAvLyBNYW55IHByb3BlcnRpZXMgZGVwZW5kIG9uIHRoZSBmb250LiBJ
ZiBpdCBjaGFuZ2VzIHdlIGp1c3QgYXBwbHkgYWxsIHByb3BlcnRpZXMuCi0gICAgaWYgKGNhY2hl
SXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5mb250RGVzY3JpcHRpb24oKSAhPSBzdGF0
ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKSkKLSAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5
ID0gZmFsc2U7Ci0KLSAgICAvLyBOb3cgZG8gdGhlIG5vcm1hbCBwcmlvcml0eSBVQSBwcm9wZXJ0
aWVzLgotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPiht
YXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgCi0gICAg
Ly8gQ2FjaGUgb3VyIGJvcmRlciBhbmQgYmFja2dyb3VuZCBzbyB0aGF0IHdlIGNhbiBleGFtaW5l
IHRoZW0gbGF0ZXIuCi0gICAgc3RhdGUuY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7Ci0gICAg
Ci0gICAgLy8gTm93IGRvIHRoZSBhdXRob3IgYW5kIHVzZXIgbm9ybWFsIHByaW9yaXR5IHByb3Bl
cnRpZXMgYW5kIGFsbCB0aGUgIWltcG9ydGFudCBwcm9wZXJ0aWVzLgotICAgIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIG1h
dGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlICsgMSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3Bl
cnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNo
UmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0
aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
PExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJSdWxlLCBhcHBs
eUluaGVyaXRlZE9ubHkpOwotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQ
cm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFS
dWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsK
LSAgIAotICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBz
dHlsZS4KLSAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOwotICAgIAotICAgIEFTU0VSVCghc3Rh
dGUuZm9udERpcnR5KCkpOwotICAgIAotICAgIGlmIChjYWNoZUl0ZW0gfHwgIWNhY2hlSGFzaCkK
LSAgICAgICAgcmV0dXJuOwotICAgIGlmICghaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUoc3RhdGUuZWxlbWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgp
KSkKLSAgICAgICAgcmV0dXJuOwotICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0
ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsK
LX0KLQotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxl
UGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2Vs
ZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwot
fQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1
bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNv
bnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1h
dGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCks
IGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdl
UnVsZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0
KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFy
ZVBhZ2VSdWxlcyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VS
dWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBt
YXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVj
a1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29s
IGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17
Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBv
bmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYg
KGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBj
b25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2Nh
bE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxO
YW1lICE9IHBhZ2VOYW1lKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
fQotCi0gICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25l
bnQtPnBzZXVkb1R5cGUoKTsKLSAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9y
OjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9U
eXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAg
ICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYg
IWlzRmlyc3RQYWdlKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVs
ZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2Us
IGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVs
ZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKLQotICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9y
Q29tcG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFn
ZU5hbWUpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUg
aGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAg
ICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBt
YXRjaGVkIHJ1bGVzLgotICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0K
LX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0
Ci17Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUu
cm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlz
Rmlyc3RQYWdlTGVmdCA9IHRydWU7Ci0KLSAgICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0
UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0
UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZv
cmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUg
Zmlyc3QgcGFnZS4KLSAgICByZXR1cm4gKCFwYWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVS
ZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBG
SVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0
dXJuICIiOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENT
U1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQotewot
ICAgIGluaXRFbGVtZW50KDApOwotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1
bWVudCgpLCAwLCBzdHlsZSk7Ci0gICAgbV9zdGF0ZS5zZXRTdHlsZShzdHlsZSk7Ci0gICAgYXBw
bHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKGlkLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1Zh
bHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoaWQs
IHZhbHVlKTsKLX0KLQotaW5saW5lIGJvb2wgaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoQ1NT
UHJvcGVydHlJRCBpZCkKLXsKLSAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJUb3BDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tQ29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5l
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRT
dHJva2VDb2xvcjoKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGNhc2UgQ1NTUHJvcGVydHlGaWxsOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlTdHJva2U6Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi0vLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MzLXJlZ2lvbnMvI3RoZS1hdC1y
ZWdpb24tc3R5bGUtcnVsZQotLy8gRklYTUU6IGFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBv
dGhlciByZWdpb24gc3R5bGluZyBwcm9wZXJ0aWVzLgotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZl
cjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKLXsKLSAgICBz
d2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5Q29sb3I6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmIEVO
QUJMRShWSURFT19UUkFDSykKLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRDdWVT
dHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kQXR0YWNobWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENsaXA6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZEltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3JpZ2luOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJhY2tncm91bmRQb3NpdGlvblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3Np
dGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kUmVwZWF0WToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlGb250RmFtaWx5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250U2l6ZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlGb250VmFy
aWFudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5TGluZUhlaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3V0bGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRs
aW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5VmlzaWJpbGl0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVTcGFjZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRl
eHRTaGFkb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotI2VuZGlmCi0vLyBTVkcgaGFuZGxlcyB6b29taW5nIGluIGEgZGlmZmVyZW50
IHdheSBjb21wYXJlZCB0byBDU1MuIFRoZSB3aG9sZSBkb2N1bWVudCBpcyBzY2FsZWQgaW5zdGVh
ZAotLy8gb2YgZWFjaCBpbmRpdmlkdWFsIGxlbmd0aCB2YWx1ZSBpbiB0aGUgcmVuZGVyIHN0eWxl
IC8gdHJlZS4gQ1NTUHJpbWl0aXZlVmFsdWU6OmNvbXB1dGVMZW5ndGgqKCkKLS8vIG11bHRpcGxp
ZXMgZWFjaCByZXNvbHZlZCBsZW5ndGggd2l0aCB0aGUgem9vbSBtdWx0aXBsaWVyIC0gc28gZm9y
IFNWRyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhhdC4KLS8vIFRob3VnaCBhbGwgQ1NTIHZhbHVlcyB0
aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG91dGVybW9zdCA8c3ZnPiBlbGVtZW50cyAod2lkdGgvaGVp
Z2h0L2JvcmRlci9wYWRkaW5nLi4uKQotLy8gbmVlZCB0byByZXNwZWN0IHRoZSBzY2FsaW5nLiBS
ZW5kZXJCb3ggKHRoZSBwYXJlbnQgY2xhc3Mgb2YgUmVuZGVyU1ZHUm9vdCkgZ3JhYnMgdmFsdWVz
IGxpa2UKLS8vIHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy8uLi4gZnJvbSB0aGUgUmVuZGVy
U3R5bGUgLT4gZm9yIFNWRyB0aGVzZSB2YWx1ZXMgd291bGQgbmV2ZXIgc2NhbGUsCi0vLyBpZiB3
ZSdkIHBhc3MgYSAxLjAgem9vbSBmYWN0b3IgZXZlcnlod2VyZS4gU28gd2Ugb25seSBwYXNzIGEg
em9vbSBmYWN0b3Igb2YgMS4wIGZvciBzcGVjaWZpYwotLy8gcHJvcGVydGllcyB0aGF0IGFyZSBO
T1QgYWxsb3dlZCB0byBzY2FsZSB3aXRoaW4gYSB6b29tZWQgU1ZHIGRvY3VtZW50IChsZXR0ZXIv
d29yZC1zcGFjaW5nL2ZvbnQtc2l6ZSkuCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnVzZVNWR1pvb21S
dWxlcygpCi17Ci0gICAgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpICYmIG1fc3RhdGUuZWxlbWVu
dCgpLT5pc1NWR0VsZW1lbnQoKTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRlR3JpZFRyYWNrQnJl
YWR0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2
ZXI6OlN0YXRlJiBzdGF0ZSwgTGVuZ3RoJiB3b3JraW5nTGVuZ3RoKQotewotICAgIGlmIChwcmlt
aXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1pbkNvbnRlbnQpIHsKLSAg
ICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNaW5Db250ZW50KTsKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENT
U1ZhbHVlV2Via2l0TWF4Q29udGVudCkgewotICAgICAgICB3b3JraW5nTGVuZ3RoID0gTGVuZ3Ro
KE1heENvbnRlbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB3b3JraW5n
TGVuZ3RoID0gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252
ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9u
IHwgQXV0b0NvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KSwgc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKLSAgICBpZiAod29ya2luZ0xlbmd0
aC5pc1VuZGVmaW5lZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocHJpbWl0
aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCi0gICAgICAgIHdvcmtpbmdMZW5ndGguc2V0UXVpcmsocHJp
bWl0aXZlVmFsdWUtPmlzUXVpcmtWYWx1ZSgpKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1z
dGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tNaW5NYXgoQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1p
dGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIEdyaWRUcmFja1Np
emUmIHRyYWNrU2l6ZSkKLXsKLSAgICBQYWlyKiBtaW5NYXhUcmFja0JyZWFkdGggPSBwcmltaXRp
dmVWYWx1ZS0+Z2V0UGFpclZhbHVlKCk7Ci0gICAgaWYgKCFtaW5NYXhUcmFja0JyZWFkdGgpIHsK
LSAgICAgICAgTGVuZ3RoIHdvcmtpbmdMZW5ndGg7Ci0gICAgICAgIGlmICghY3JlYXRlR3JpZFRy
YWNrQnJlYWR0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUsIHdvcmtpbmdMZW5ndGgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHRyYWNrU2l6ZS5zZXRMZW5ndGgod29ya2lu
Z0xlbmd0aCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIExlbmd0aCBtaW5U
cmFja0JyZWFkdGg7Ci0gICAgTGVuZ3RoIG1heFRyYWNrQnJlYWR0aDsKLSAgICBpZiAoIWNyZWF0
ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5maXJzdCgpLCBzdGF0ZSwgbWlu
VHJhY2tCcmVhZHRoKSB8fCAhY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhUcmFja0JyZWFk
dGgtPnNlY29uZCgpLCBzdGF0ZSwgbWF4VHJhY2tCcmVhZHRoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgdHJhY2tTaXplLnNldE1pbk1heChtaW5UcmFja0JyZWFkdGgsIG1heFRyYWNr
QnJlYWR0aCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRU
cmFja0dyb3VwKENTU1ZhbHVlKiB2YWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0
YXRlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMpCi17Ci0gICAgaWYgKCF2YWx1
ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewot
ICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOwotICAgICAgICBpZiAoIWN1
cnJWYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgICAgIEdyaWRUcmFja1NpemUgdHJhY2tTaXplOwotICAgICAgICBpZiAoIWNyZWF0ZUdy
aWRUcmFja01pbk1heChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGN1cnJWYWx1ZSks
IHN0YXRlLCB0cmFja1NpemUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAg
IHRyYWNrU2l6ZXMuYXBwZW5kKHRyYWNrU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwot
fQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tMaXN0KENTU1ZhbHVlKiB2YWx1ZSwgVmVj
dG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0
ZSYgc3RhdGUpCi17Ci0gICAgLy8gSGFuZGxlICdub25lJy4KLSAgICBpZiAodmFsdWUtPmlzUHJp
bWl0aXZlVmFsdWUoKSkgewotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgcmV0
dXJuIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gY3JlYXRlR3JpZFRyYWNrR3JvdXAodmFsdWUsIHN0YXRlLCB0cmFja1NpemVz
KTsKLX0KLQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkUG9zaXRpb24oQ1NTVmFsdWUqIHZhbHVl
LCBHcmlkUG9zaXRpb24mIHBvc2l0aW9uKQotewotICAgIC8vIEZvciBub3csIHdlIG9ubHkgYWNj
ZXB0OiA8aW50ZWdlcj4gfCAnYXV0bycKLSAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVl
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmlt
aXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpOwotICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04ocHJp
bWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpOwotICAgIHBvc2l0aW9uLnNldEludGVnZXJQb3NpdGlv
bihwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLXN0YXRpYyBib29sIGhhc1ZhcmlhYmxlUmVmZXJl
bmNlKENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUo
KSkgewotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHByaW1pdGl2
ZVZhbHVlLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOwotICAgIH0KLQotICAgIGlmICh2YWx1ZS0+
aXNDYWxjdWxhdGlvblZhbHVlKCkpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDU1NDYWxj
VmFsdWUqPih2YWx1ZSktPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7Ci0KLSAgICBpZiAodmFsdWUt
PmlzUmVmbGVjdFZhbHVlKCkpIHsKLSAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiByZWZsZWN0VmFs
dWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBkaXJlY3Rpb24gPSByZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpOwotICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogb2Zmc2V0ID0gcmVmbGVjdFZhbHVlLT5vZmZzZXQoKTsK
LSAgICAgICAgQ1NTVmFsdWUqIG1hc2sgPSByZWZsZWN0VmFsdWUtPm1hc2soKTsKLSAgICAgICAg
cmV0dXJuIChkaXJlY3Rpb24gJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UoZGlyZWN0aW9uKSkgfHwg
KG9mZnNldCAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShvZmZzZXQpKSB8fCAobWFzayAmJiBoYXNW
YXJpYWJsZVJlZmVyZW5jZShtYXNrKSk7Ci0gICAgfQotCi0gICAgZm9yIChDU1NWYWx1ZUxpc3RJ
dGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICBp
ZiAoaGFzVmFyaWFibGVSZWZlcmVuY2UoaS52YWx1ZSgpKSkKLSAgICAgICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
OjpyZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgVmVj
dG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMp
Ci17Ci0gICAgc3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gZXhwcmVzc2lvbihpZCwg
dmFsdWUtPnNlcmlhbGl6ZVJlc29sdmluZ1ZhcmlhYmxlcygqbV9zdGF0ZS5zdHlsZSgpLT52YXJp
YWJsZXMoKSkpOwotCi0gICAgaWYgKGtub3duRXhwcmVzc2lvbnMuY29udGFpbnMoZXhwcmVzc2lv
bikpCi0gICAgICAgIHJldHVybjsgLy8gY3ljbGUgZGV0ZWN0ZWQuCi0KLSAgICBrbm93bkV4cHJl
c3Npb25zLmFwcGVuZChleHByZXNzaW9uKTsKLQotICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBm
YXN0ZXIgbm90IHRvIHJlLXBhcnNlIGZyb20gc3RyaW5ncywgYnV0IGZvciBub3cgQ1NTIHByb3Bl
cnR5IHZhbGlkYXRpb24gbGl2ZXMgaW5zaWRlIHRoZSBwYXJzZXIgc28gd2UgZG8gaXQgdGhlcmUu
Ci0gICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHJlc3VsdFNldCA9IFN0eWxlUHJvcGVydHlT
ZXQ6OmNyZWF0ZSgpOwotICAgIGlmICghQ1NTUGFyc2VyOjpwYXJzZVZhbHVlKHJlc3VsdFNldC5n
ZXQoKSwgaWQsIGV4cHJlc3Npb24uc2Vjb25kLCBmYWxzZSwgZG9jdW1lbnQoKSkpCi0gICAgICAg
IHJldHVybjsgLy8gZXhwcmVzc2lvbiBmYWlsZWQgdG8gcGFyc2UuCi0KLSAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcmVzdWx0U2V0LT5wcm9wZXJ0eUNvdW50KCk7IGkrKykgewotICAgICAg
ICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVyZW5jZSBwcm9wZXJ0eSA9IHJlc3VsdFNl
dC0+cHJvcGVydHlBdChpKTsKLSAgICAgICAgaWYgKHByb3BlcnR5LmlkKCkgIT0gQ1NTUHJvcGVy
dHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShwcm9wZXJ0eS52YWx1ZSgpKSkKLSAg
ICAgICAgICAgIHJlc29sdmVWYXJpYWJsZXMocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUo
KSwga25vd25FeHByZXNzaW9ucyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFwcGx5UHJv
cGVydHkocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSk7Ci0gICAgfQotfQotI2VuZGlm
Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEIGlkLCBD
U1NWYWx1ZSogdmFsdWUpCi17Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgaWYgKGlk
ICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UodmFsdWUpKSB7
Ci0gICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+IGtub3du
RXhwcmVzc2lvbnM7Ci0gICAgICAgIHJlc29sdmVWYXJpYWJsZXMoaWQsIHZhbHVlLCBrbm93bkV4
cHJlc3Npb25zKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gQ1NT
IHZhcmlhYmxlcyBkb24ndCByZXNvbHZlIHNob3J0aGFuZHMgYXQgcGFyc2luZyB0aW1lLCBzbyB0
aGlzIHNob3VsZCBiZSAqYWZ0ZXIqIGhhbmRsaW5nIHZhcmlhYmxlcy4KLSAgICBBU1NFUlRfV0lU
SF9NRVNTQUdFKCFpc0V4cGFuZGVkU2hvcnRoYW5kKGlkKSwgIlNob3J0aGFuZCBwcm9wZXJ0eSBp
ZCA9ICVkIHdhc24ndCBleHBhbmRlZCBhdCBwYXJzaW5nIHRpbWUiLCBpZCk7Ci0KLSAgICBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGJvb2wgaXNJbmhlcml0ID0gc3RhdGUucGFyZW50Tm9k
ZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCk7Ci0gICAgYm9vbCBpc0luaXRpYWwgPSB2
YWx1ZS0+aXNJbml0aWFsVmFsdWUoKSB8fCAoIXN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1ZS0+
aXNJbmhlcml0ZWRWYWx1ZSgpKTsKLQotICAgIEFTU0VSVCghaXNJbmhlcml0IHx8ICFpc0luaXRp
YWwpOyAvLyBpc0luaGVyaXQgLT4gIWlzSW5pdGlhbCAmJiBpc0luaXRpYWwgLT4gIWlzSW5oZXJp
dAotICAgIEFTU0VSVCghaXNJbmhlcml0IHx8IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUu
cGFyZW50U3R5bGUoKSkpOyAvLyBpc0luaGVyaXQgLT4gKHN0YXRlLnBhcmVudE5vZGUoKSAmJiBz
dGF0ZS5wYXJlbnRTdHlsZSgpKQotCi0gICAgaWYgKCFzdGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1
bGFyU3R5bGUoKSAmJiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSB8
fCAhaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoaWQpKSkgewotICAgICAgICAvLyBMaW1pdCB0
aGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG9ubHkgdGhlIG9uZXMgaG9ub3Jl
ZCBieSA6dmlzaXRlZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpc0luaGVy
aXQgJiYgIXN0YXRlLnBhcmVudFN0eWxlKCktPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0
aWVzKCkgJiYgIUNTU1Byb3BlcnR5Ojppc0luaGVyaXRlZFByb3BlcnR5KGlkKSkKLSAgICAgICAg
c3RhdGUucGFyZW50U3R5bGUoKS0+c2V0SGFzRXhwbGljaXRseUluaGVyaXRlZFByb3BlcnRpZXMo
KTsKLQotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGlmIChpZCA9PSBDU1NQcm9wZXJ0
eVZhcmlhYmxlKSB7Ci0gICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHZh
bHVlLT5pc1ZhcmlhYmxlVmFsdWUoKSk7Ci0gICAgICAgIENTU1ZhcmlhYmxlVmFsdWUqIHZhcmlh
YmxlID0gc3RhdGljX2Nhc3Q8Q1NTVmFyaWFibGVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgQVNT
RVJUKCF2YXJpYWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7Ci0gICAgICAgIEFTU0VSVCghdmFyaWFi
bGUtPnZhbHVlKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VmFyaWFi
bGUodmFyaWFibGUtPm5hbWUoKSwgdmFyaWFibGUtPnZhbHVlKCkpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBDaGVjayBsb29rdXAgdGFibGUgZm9yIGltcGxlbWVu
dGF0aW9ucyBhbmQgdXNlIHdoZW4gYXZhaWxhYmxlLgotICAgIGNvbnN0IFByb3BlcnR5SGFuZGxl
ciYgaGFuZGxlciA9IG1fc3R5bGVCdWlsZGVyLnByb3BlcnR5SGFuZGxlcihpZCk7Ci0gICAgaWYg
KGhhbmRsZXIuaXNWYWxpZCgpKSB7Ci0gICAgICAgIGlmIChpc0luaGVyaXQpCi0gICAgICAgICAg
ICBoYW5kbGVyLmFwcGx5SW5oZXJpdFZhbHVlKGlkLCB0aGlzKTsKLSAgICAgICAgZWxzZSBpZiAo
aXNJbml0aWFsKQotICAgICAgICAgICAgaGFuZGxlci5hcHBseUluaXRpYWxWYWx1ZShpZCwgdGhp
cyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlWYWx1ZShpZCwgdGhp
cywgdmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIHByaW1pdGl2ZVZhbHVlID0gdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSA/IHN0YXRpY19j
YXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpIDogMDsKLQotICAgIGZsb2F0IHpvb21GYWN0
b3IgPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7Ci0KLSAgICAvLyBXaGF0IGZvbGxv
d3MgaXMgYSBsaXN0IHRoYXQgbWFwcyB0aGUgQ1NTIHByb3BlcnRpZXMgaW50byB0aGVpciBjb3Jy
ZXNwb25kaW5nIGZyb250LWVuZAotICAgIC8vIFJlbmRlclN0eWxlIHZhbHVlcy4KLSAgICBzd2l0
Y2ggKGlkKSB7Ci0gICAgLy8gbGlzdHMKLSAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDoKLSAg
ICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQotICAgICAgICB7
Ci0gICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBp
bmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlzCi0gICAgICAgICAgICAvLyBu
b3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVkcyB0byBiZSBz
dXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgICAg
ICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBib29sIGRpZFNldCA9IGZh
bHNlOwotICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGku
aGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVt
ID0gaS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdlR2VuZXJhdG9y
VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFkaWVudFZhbHVl
KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KFN0
eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVudFZhbHVlKj4o
aXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwgZGlkU2V0KTsK
LSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoc3RhdGljX2Nh
c3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAg
ICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICAg
ICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5kaW5nRnJvbVZh
bHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KGl0
ZW0pKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSNlbmRp
ZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdl
VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50
KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0YXRpY19jYXN0
PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRp
ZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVWYWx1ZSgpKQot
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KGl0ZW0pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkg
ewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KGNvbnRlbnRW
YWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VmFs
dWUtPmlzQXR0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBDYW4gYSBuYW1l
c3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKLSAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICAgICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRTdHlsZSgpLT5z
ZXRVbmlxdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBhdHRyKG51bGxB
dG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxsQXRvbSk7Ci0g
ICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBzdGF0ZS5lbGVt
ZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZhbHVlLmltcGwo
KSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAg
ICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmlidXRlIHZhbHVl
IGFmZmVjdHMgdGhlIHN0eWxlCi0gICAgICAgICAgICAgICAgICAgIG1fcnVsZVNldHMuZmVhdHVy
ZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsKLSAgICAgICAg
ICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVlLT5nZXRDb3Vu
dGVyVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUgbGlzdFN0eWxl
VHlwZSA9IE5vbmVMaXN0U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXN0U3R5bGVJ
ZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsKLSAgICAgICAgICAgICAgICAg
ICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlwZT4obGlzdFN0
eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOwotICAgICAgICAgICAgICAgICAgICBPd25QdHI8Q291
bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRlbnQoY291bnRl
clZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1ZS0+c2VwYXJh
dG9yKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChj
b3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzd2l0
Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNl
IENTU1ZhbHVlT3BlblF1b3RlOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAg
ICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb09wZW5RdW90
ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9f
T1BFTl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRy
dWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KLSAgICAgICAgICAg
ICAgICAgICAgICAgIHsgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFkaWRTZXQpCi0gICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgotICAgICAgICBpZiAoaXNJbmhl
cml0KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3RhdGUucGFyZW50
U3R5bGUoKS0+cXVvdGVzKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAg
ICAgIGlmIChpc0luaXRpYWwpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3Rl
cygwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUt
PmlzVmFsdWVMaXN0KCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRp
Y19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKLSAgICAgICAgICAgIFJlZlB0cjxRdW90ZXNE
YXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKLSAgICAgICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikgewotICAgICAgICAgICAgICAg
IENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAg
ICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91bmRzIHNvIHRo
aXMgaXMgc2FmZS4KLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0gbGlzdC0+aXRl
bShpICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQpCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJ
Q0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIEFTU0VS
VF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVWYWx1ZSgpKTsK
LSAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFN0
cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oc2Vjb25kKS0+
Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBhaXIoc3RkOjpt
YWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgewotICAgICAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkKLSAgICAgICAg
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3JlYXRlKCkpOwot
ICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZhbWls
eTogewotICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlkcwotICAgICAgICBpZiAoaXNJ
bmhlcml0KSB7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9udERlc2NyaXB0
aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWls
eShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKLSAgICAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5
KCkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChwYXJl
bnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOwotICAgICAgICAgICAgc2V0Rm9u
dERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICBGb250RGVzY3Jp
cHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIEZvbnRE
ZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRp
b24oKTsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXplIHRvIGFjY291
bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UKLSAgICAgICAg
ICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCi0gICAgICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9u
LmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKSkK
LSAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9y
S2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5
d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOwotICAgICAgICAgICAg
aWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkKLSAgICAgICAg
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZpcnN0RmFtaWx5
KCkpOwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1Zh
bHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBGb250RGVzY3JpcHRpb24g
Zm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
ICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5
KCk7Ci0gICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAwOwotCi0gICAgICAgIC8vIEJl
Zm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBzaG91bGQgcmVz
ZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgotICAgICAgICBib29sIG9sZEZhbWlseVVzZWRGaXhlZERl
ZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUoKTsKLSAgICAg
ICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpOb0Zh
bWlseSk7Ci0KLSAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGku
aGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBp
LnZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBj
b250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZW0pOwotICAg
ICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7Ci0gICAgICAgICAgICBTZXR0aW5ncyogc2V0dGlu
Z3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFZhbHVlLT5p
c1N0cmluZygpKQotICAgICAgICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUtPmdldFN0cmlu
Z1ZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncykgewotICAgICAgICAgICAg
ICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICAgICAg
Y2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXR0
aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKLSAgICAgICAgICAgICAgICAgICAg
ZmFjZSA9IHNlcmlmRmFtaWx5OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVNhbnNTZXJp
ZjoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsKLSAgICAgICAg
ICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpTYW5zU2VyaWZGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKLSAgICAgICAgICAgICAgICAgICAgZmFj
ZSA9IGN1cnNpdmVGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5z
ZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVGYW50YXN5
OgotICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKLSAgICAgICAgICAg
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9u
OjpGYW50YXN5RmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9
IG1vbm9zcGFjZUZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpOwotICAgICAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlV2Via2l0
UGljdG9ncmFwaDoKLSAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3JhcGhGYW1pbHk7
Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYg
KCFmYWNlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmICghY3VyckZhbWlseSkgewot
ICAgICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1pbHkuCi0gICAg
ICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKLSAgICAgICAgICAg
ICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUgYW55IGluaGVy
aXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgY3VyckZhbWls
eSA9ICZmaXJzdEZhbWlseTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dElzU3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpID09IEZvbnRE
ZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkgPSBTaGFyZWRG
b250RmFtaWx5OjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RmFtaWx5LT5zZXRG
YW1pbHkoZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFwcGVuZEZhbWls
eShuZXdGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0gbmV3RmFtaWx5
LmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVudGlsIGFsbCBu
ZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKLSAgICAgICAgLy8gSWYgY3VyckZhbWls
eSBpcyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9uIHRoaXMgZGVz
Y3JpcHRpb24uCi0gICAgICAgIGlmIChjdXJyRmFtaWx5KSB7Ci0gICAgICAgICAgICBpZiAoZm9u
dERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVm
YXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKLSAgICAgICAgICAg
ICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5d29yZChkb2N1
bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29yZFNpemUoKSAt
IDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOwotCi0gICAgICAgICAgICBzZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIC8vIFNob3J0aGFuZCBwcm9wZXJ0aWVzLgotICAgIGNhc2UgQ1NTUHJv
cGVydHlGb250OgotICAgICAgICBpZiAoaXNJbmhlcml0KSB7Ci0gICAgICAgICAgICBGb250RGVz
Y3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2Ny
aXB0aW9uKCk7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KHN0YXRl
LnBhcmVudFN0eWxlKCktPnNwZWNpZmllZExpbmVIZWlnaHQoKSk7Ci0gICAgICAgICAgICBzdGF0
ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24o
Zm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBlbHNlIGlmIChpc0luaXRpYWwpIHsKLSAgICAg
ICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsKLSAgICAgICAg
ICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24s
IHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUg
c2V0dGluZ3MKLSAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgcmV0
dXJuOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7Ci0gICAgICAg
IH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUpIHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOwotICAgICAg
ICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotCi0gICAgICAgICAgICBGb250RGVz
Y3JpcHRpb24gZm9udERlc2NyaXB0aW9uOwotICAgICAgICAgICAgUmVuZGVyVGhlbWU6OmRlZmF1
bHRUaGVtZSgpLT5zeXN0ZW1Gb250KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpLCBmb250RGVz
Y3JpcHRpb24pOwotCi0gICAgICAgICAgICAvLyBEb3VibGUtY2hlY2sgYW5kIHNlZSBpZiB0aGUg
dGhlbWUgZGlkIGFueXRoaW5nLiBJZiBub3QsIGRvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgZm9u
dC4KLSAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSkgewot
ICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHByaW50
ZXIgZm9udCBzZXR0aW5ncyBhcmUgdXBkYXRlZC4KLSAgICAgICAgICAgICAgICBTZXR0aW5ncyog
c2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHNl
dHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhpcyBkb2N1bWVu
dCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0aW5ncwotICAg
ICAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5n
cy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7Ci0gICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9u
LnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5z
Y3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEhh
bmRsZSB0aGUgem9vbSBmYWN0b3IuCi0gICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCgp
LCBzdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUoKSwgZm9udERl
c2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsKLSAgICAgICAg
ICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+aXNGb250VmFsdWUoKSkgewotICAgICAgICAg
ICAgRm9udFZhbHVlKiBmb250ID0gc3RhdGljX2Nhc3Q8Rm9udFZhbHVlKj4odmFsdWUpOwotICAg
ICAgICAgICAgaWYgKCFmb250LT5zdHlsZSB8fCAhZm9udC0+dmFyaWFudCB8fCAhZm9udC0+d2Vp
Z2h0Ci0gICAgICAgICAgICAgICAgfHwgIWZvbnQtPnNpemUgfHwgIWZvbnQtPmxpbmVIZWlnaHQg
fHwgIWZvbnQtPmZhbWlseSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBh
cHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFN0eWxlLCBmb250LT5zdHlsZS5nZXQoKSk7Ci0g
ICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFZhcmlhbnQsIGZvbnQtPnZh
cmlhbnQuZ2V0KCkpOwotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRX
ZWlnaHQsIGZvbnQtPndlaWdodC5nZXQoKSk7Ci0gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMg
cHJvcGVydGllcyBjYW4gZGlydHkgb3VyIGZvbnQgYnV0IHRoZXkgZG9uJ3QgdHJ5IHRvIHJlYWQg
dGhlIGZvbnQncwotICAgICAgICAgICAgLy8gcHJvcGVydGllcyBiYWNrLCB3aGljaCBpcyBzYWZl
LiBIb3dldmVyIGlmIGZvbnQtc2l6ZSBpcyB1c2luZyB0aGUgJ2V4JyB1bml0LCBpdCB3aWxsCi0g
ICAgICAgICAgICAvLyBuZWVkIHF1ZXJ5IHRoZSBkaXJ0aWVkIGZvbnQncyB4LWhlaWdodCB0byBn
ZXQgdGhlIGNvbXB1dGVkIHNpemUuIFRvIGJlIHNhZmUgaW4gdGhpcwotICAgICAgICAgICAgLy8g
Y2FzZSwgbGV0J3MganVzdCB1cGRhdGUgdGhlIGZvbnQgbm93LgotICAgICAgICAgICAgdXBkYXRl
Rm9udCgpOwotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRTaXplLCBm
b250LT5zaXplLmdldCgpKTsKLQotICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVl
KGZvbnQtPmxpbmVIZWlnaHQuZ2V0KCkpOwotCi0gICAgICAgICAgICBhcHBseVByb3BlcnR5KENT
U1Byb3BlcnR5Rm9udEZhbWlseSwgZm9udC0+ZmFtaWx5LmdldCgpKTsKLSAgICAgICAgfQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXI6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlckJvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQ29sb3I6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJMZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJvcmRlclJpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTcGFjaW5nOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyVG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJXaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5TGlzdFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eU91dGxpbmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlQYWRkaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckFmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZv
cmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyU3RhcnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
clJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxl
eDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEZsb3c6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEdyaWRDb2x1bW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3c6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkNvbGxhcHNlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJxdWVlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBo
YXNpczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJh
bnNmb3JtT3JpZ2luOgotI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0V3JhcDoKLSNlbmRpZgotICAgICAgICBBU1NFUlQoaXNFeHBhbmRlZFNob3J0
aGFuZChpZCkpOwotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgYnJlYWs7
Ci0KLSAgICAvLyBDU1MzIFByb3BlcnRpZXMKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFNoYWRv
dzoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2hhZG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3hTaGFkb3c6IHsKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAgICAgICAg
aWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdykKLSAgICAgICAgICAgICAgICByZXR1cm4g
c3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgpLT50ZXh0U2hh
ZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4
dFNoYWRvdygpKSkgOiBudWxscHRyKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgp
LT5zZXRCb3hTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkgPyBhZG9wdFB0
cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkpKSA6IG51
bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0luaXRpYWwgfHwgcHJpbWl0aXZlVmFs
dWUpIC8vIGluaXRpYWwgfCBub25lCi0gICAgICAgICAgICByZXR1cm4gaWQgPT0gQ1NTUHJvcGVy
dHlUZXh0U2hhZG93ID8gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhudWxscHRyKSA6IHN0
YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhudWxscHRyKTsKLQotICAgICAgICBpZiAoIXZhbHVl
LT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGZvciAoQ1NT
VmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsK
LSAgICAgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgICAg
ICBpZiAoIWN1cnJWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2FzdDxTaGFkb3dW
YWx1ZSo+KGN1cnJWYWx1ZSk7Ci0gICAgICAgICAgICBpbnQgeCA9IGl0ZW0tPngtPmNvbXB1dGVM
ZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21G
YWN0b3IpOwotICAgICAgICAgICAgaW50IHkgPSBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4o
c3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAg
ICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1dGVMZW5n
dGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpIDogMDsKLSAgICAgICAgICAgIGludCBzcHJlYWQgPSBpdGVtLT5zcHJlYWQgPyBpdGVtLT5z
cHJlYWQtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVu
dFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKLSAgICAgICAgICAgIFNoYWRvd1N0eWxlIHNoYWRv
d1N0eWxlID0gaXRlbS0+c3R5bGUgJiYgaXRlbS0+c3R5bGUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVJbnNldCA/IEluc2V0IDogTm9ybWFsOwotICAgICAgICAgICAgQ29sb3IgY29sb3I7Ci0gICAg
ICAgICAgICBpZiAoaXRlbS0+Y29sb3IpCi0gICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckZy
b21QcmltaXRpdmVWYWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7Ci0gICAgICAgICAgICBlbHNlIGlm
IChzdGF0ZS5zdHlsZSgpKQotICAgICAgICAgICAgICAgIGNvbG9yID0gc3RhdGUuc3R5bGUoKS0+
Y29sb3IoKTsKLQotICAgICAgICAgICAgT3duUHRyPFNoYWRvd0RhdGE+IHNoYWRvd0RhdGEgPSBh
ZG9wdFB0cihuZXcgU2hhZG93RGF0YShJbnRQb2ludCh4LCB5KSwgYmx1ciwgc3ByZWFkLCBzaGFk
b3dTdHlsZSwgaWQgPT0gQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csIGNvbG9yLmlzVmFsaWQo
KSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50KSk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0g
Q1NTUHJvcGVydHlUZXh0U2hhZG93KQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dFRleHRTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0
aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc2hhZG93RGF0YS5y
ZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0
aGUgZmlyc3QgZW50cnkKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZsZWN0OiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklU
X0FORF9JTklUSUFMKGJveFJlZmxlY3QsIEJveFJlZmxlY3QpCi0gICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVmbGVjdChSZW5k
ZXJTdHlsZTo6aW5pdGlhbEJveFJlZmxlY3QoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoIXZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKQotICAgICAgICAg
ICAgcmV0dXJuOwotCi0gICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOwotICAgICAgICBSZWZQdHI8U3R5bGVS
ZWZsZWN0aW9uPiByZWZsZWN0aW9uID0gU3R5bGVSZWZsZWN0aW9uOjpjcmVhdGUoKTsKLSAgICAg
ICAgcmVmbGVjdGlvbi0+c2V0RGlyZWN0aW9uKCpyZWZsZWN0VmFsdWUtPmRpcmVjdGlvbigpKTsK
LSAgICAgICAgaWYgKHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCkpCi0gICAgICAgICAgICByZWZsZWN0
aW9uLT5zZXRPZmZzZXQocmVmbGVjdFZhbHVlLT5vZmZzZXQoKS0+Y29udmVydFRvTGVuZ3RoPEZp
eGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252
ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0
b3IpKTsKLSAgICAgICAgTmluZVBpZWNlSW1hZ2UgbWFzazsKLSAgICAgICAgbWFzay5zZXRNYXNr
RGVmYXVsdHMoKTsKLSAgICAgICAgbV9zdHlsZU1hcC5tYXBOaW5lUGllY2VJbWFnZShpZCwgcmVm
bGVjdFZhbHVlLT5tYXNrKCksIG1hc2spOwotICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNrKG1h
c2spOwotCi0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QocmVmbGVjdGlvbi5y
ZWxlYXNlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlT
cmM6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgotICAgICAgICByZXR1cm47Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVSYW5nZTogLy8gT25seSB1c2VkIGluIEBmb250LWZh
Y2UgcnVsZXMuCi0gICAgICAgIHJldHVybjsKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFy
cXVlZVJlcGV0aXRpb246IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFy
cXVlZUxvb3BDb3VudCwgTWFycXVlZUxvb3BDb3VudCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVW
YWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlSW5maW5pdGUpCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRNYXJxdWVlTG9vcENvdW50KC0xKTsgLy8gLTEgbWVhbnMgcmVwZWF0IGZvcmV2ZXIuCi0g
ICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKQotICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudChwcmltaXRpdmVWYWx1ZS0+Z2V0SW50
VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hcnF1ZWVTcGVlZDogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCht
YXJxdWVlU3BlZWQsIE1hcnF1ZWVTcGVlZCkKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKGludCBpZGVudCA9IHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGlkZW50KSB7Ci0gICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlU2xvdzoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRNYXJxdWVlU3BlZWQoNTAwKTsgLy8gNTAwIG1zZWMuCi0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgotICAgICAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg4NSk7IC8vIDg1bXNlYy4gVGhlIFdpbklFIGRlZmF1
bHQuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFz
dDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoMTApOyAv
LyAxMG1zZWMuIFN1cGVyIGZhc3QuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzVGltZSgpKQotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5jb21w
dXRlVGltZTxpbnQsIENTU1ByaW1pdGl2ZVZhbHVlOjpNaWxsaXNlY29uZHM+KCkpOwotICAgICAg
ICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgLy8gRm9yIHNjcm9sbGFtb3Vu
dCBzdXBwb3J0LgotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHBy
aW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZUluY3JlbWVudDogewotICAgICAgICBIQU5E
TEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlSW5jcmVtZW50LCBNYXJxdWVlSW5jcmVtZW50
KQotICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgICAgIHN3aXRj
aCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVTbWFsbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5jcmVt
ZW50KExlbmd0aCgxLCBGaXhlZCkpOyAvLyAxcHguCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgotICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDYsIEZpeGVkKSk7IC8vIDZweC4gVGhl
IFdpbklFIGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNl
IENTU1ZhbHVlTGFyZ2U6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVl
ZUluY3JlbWVudChMZW5ndGgoMzYsIEZpeGVkKSk7IC8vIDM2cHguCi0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMZW5n
dGggbWFycXVlZUxlbmd0aCA9IGNvbnZlcnRUb0ludExlbmd0aChwcmltaXRpdmVWYWx1ZSwgc3Rh
dGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLSAgICAgICAgICAgIGlmICgh
bWFycXVlZUxlbmd0aC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVJbmNyZW1lbnQobWFycXVlZUxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9jYWxlOiB7Ci0g
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxvY2FsZSwgTG9jYWxlKTsKLSAgICAg
ICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKLSAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShudWxsQXRvbSk7Ci0gICAgICAgIGVsc2UKLSAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShwcmltaXRpdmVWYWx1ZS0+Z2V0U3RyaW5n
VmFsdWUoKSk7Ci0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0
ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKHN0YXRlLnN0eWxlKCkt
PmxvY2FsZSgpKSk7Ci0gICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24p
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RGFzaGJvYXJkUmVnaW9uOgotICAgIHsKLSAgICAg
ICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZGFzaGJvYXJkUmVnaW9ucywgRGFzaGJvYXJk
UmVnaW9ucykKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVO
b25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRSZWdpb25zKFJl
bmRlclN0eWxlOjpub25lRGFzaGJvYXJkUmVnaW9ucygpKTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotCi0gICAgICAgIERhc2hib2FyZFJlZ2lvbiogcmVnaW9uID0gcHJpbWl0aXZl
VmFsdWUtPmdldERhc2hib2FyZFJlZ2lvblZhbHVlKCk7Ci0gICAgICAgIGlmICghcmVnaW9uKQot
ICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIERhc2hib2FyZFJlZ2lvbiogZmlyc3QgPSBy
ZWdpb247Ci0gICAgICAgIHdoaWxlIChyZWdpb24pIHsKLSAgICAgICAgICAgIExlbmd0aCB0b3Ag
PSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT50b3AoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cm9vdEVsZW1lbnRTdHlsZSgpKTsKLSAgICAgICAgICAgIExlbmd0aCByaWdodCA9IGNvbnZlcnRU
b0ludExlbmd0aChyZWdpb24tPnJpZ2h0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBMZW5ndGggYm90dG9tID0gY29udmVydFRvSW50TGVu
Z3RoKHJlZ2lvbi0+Ym90dG9tKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5
bGUoKSk7Ci0gICAgICAgICAgICBMZW5ndGggbGVmdCA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdp
b24tPmxlZnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKLQot
ICAgICAgICAgICAgaWYgKHRvcC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHRvcCA9
IExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKHJpZ2h0LmlzVW5kZWZpbmVkKCkpCi0gICAgICAg
ICAgICAgICAgcmlnaHQgPSBMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChib3R0b20uaXNVbmRl
ZmluZWQoKSkKLSAgICAgICAgICAgICAgICBib3R0b20gPSBMZW5ndGgoKTsKLSAgICAgICAgICAg
IGlmIChsZWZ0LmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgICAgICAgbGVmdCA9IExlbmd0aCgp
OwotCi0gICAgICAgICAgICBpZiAocmVnaW9uLT5tX2lzQ2lyY2xlKQotICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2FyZFJlZ2lvbjo6
Q2lyY2xlLCByZWdpb24tPm1fbGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgcmVnaW9u
ID09IGZpcnN0ID8gZmFsc2UgOiB0cnVlKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2lvbi0+
bV9pc1JlY3RhbmdsZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9h
cmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OlJlY3RhbmdsZSwgcmVnaW9uLT5tX2xhYmVs
LCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNlIDogdHJ1
ZSk7Ci0gICAgICAgICAgICByZWdpb24gPSByZWdpb24tPm1fbmV4dC5nZXQoKTsKLSAgICAgICAg
fQotCi0gICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1
ZSk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotI2lmIEVOQUJMRShEUkFHR0FC
TEVfUkVHSU9OKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBSZWdpb246IHsKLSAgICAg
ICAgaWYgKCFwcmltaXRpdmVWYWx1ZSB8fCAhcHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpCi0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERyYWdnYWJsZVJl
Z2lvbk1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEcmFnID8gRHJh
Z2dhYmxlUmVnaW9uRHJhZyA6IERyYWdnYWJsZVJlZ2lvbk5vRHJhZyk7Ci0gICAgICAgIHN0YXRl
LmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZVdp
ZHRoOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRTdHJva2VXaWR0
aCwgVGV4dFN0cm9rZVdpZHRoKQotICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Ci0gICAgICAgIHN3
aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKLSAgICAgICAgY2FzZSBDU1NWYWx1
ZVRoaW46Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVNZWRpdW06Ci0gICAgICAgIGNhc2UgQ1NTVmFs
dWVUaGljazogewotICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDEuMCAvIDQ4OwotICAgICAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTWVkaXVtKQot
ICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAzOwotICAgICAgICAgICAgZWxzZSBpZiAocHJpbWl0
aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUaGljaykKLSAgICAgICAgICAgICAgICBy
ZXN1bHQgKj0gNTsKLSAgICAgICAgICAgIHdpZHRoID0gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0
ZShyZXN1bHQsIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfRU1TKS0+Y29tcHV0ZUxlbmd0aDxmbG9h
dD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICB3aWR0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFN0cm9r
ZVdpZHRoKHdpZHRoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VHJhbnNmb3JtOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFM
KHRyYW5zZm9ybSwgVHJhbnNmb3JtKTsKLSAgICAgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVy
YXRpb25zOwotICAgICAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwotICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRUcmFuc2Zvcm0ob3BlcmF0aW9ucyk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlOiB7Ci0gICAgICAg
IEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHBlcnNwZWN0aXZlLCBQZXJzcGVjdGl2ZSkKLQot
ICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAg
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpIHsKLSAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKDApOwotICAgICAgICAgICAg
cmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVWYWx1ZTsKLSAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAgICAgcGVyc3Bl
Y3RpdmVWYWx1ZSA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5z
dHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICBl
bHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgewotICAgICAgICAgICAgLy8gRm9y
IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRyZWF0IHZhbHVlbGVzcyBudW1iZXJzIGFzIHB4Lgot
ICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUo
cHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCksIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1Nf
UFgpLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVu
dFN0eWxlKCksIHpvb21GYWN0b3IpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICBpZiAocGVyc3BlY3RpdmVWYWx1ZSA+PSAwLjBmKQotICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVWYWx1ZSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRf
QU5EX0lOSVRJQUwodGFwSGlnaGxpZ2h0Q29sb3IsIFRhcEhpZ2hsaWdodENvbG9yKTsKLSAgICAg
ICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIENv
bG9yIGNvbCA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKHByaW1pdGl2ZVZhbHVlKTsKLSAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0VGFwSGlnaGxpZ2h0Q29sb3IoY29sKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSNlbmRpZgotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JP
TExJTkcpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiB7Ci0g
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxp
bmcsIFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcpOwotICAgICAgICBpZiAoIXByaW1pdGl2ZVZh
bHVlKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVzZVRv
dWNoT3ZlcmZsb3dTY3JvbGxpbmcocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFs
dWVUb3VjaCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBjYXNlIENTU1By
b3BlcnR5SW52YWxpZDoKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIERpcmVjdGlvbmFsIHByb3Bl
cnRpZXMgYXJlIHJlc29sdmVkIGJ5IHJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3BlcnR5KCkgYmVm
b3JlIHRoZSBzd2l0Y2guCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZENvbG9y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRTdHlsZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJvcmRlclN0YXJ0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0
U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0V2lkdGg6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJCZWZvcmVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyQmVmb3JlV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVy
Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyU3R5bGU6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcmdpbkVuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luU3Rh
cnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
cmdpbkJlZm9yZUNvbGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5Ub3BD
b2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJDb2xsYXBzZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdFbmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFBhZGRpbmdTdGFydDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0JlZm9yZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0FmdGVyOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRMb2dpY2FsV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvZ2lj
YWxIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxXaWR0aDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbEhlaWdodDoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXhMb2dpY2FsSGVpZ2h0OgotICAgIHsKLSAgICAgICAgQ1NTUHJvcGVydHlJRCBuZXdJZCA9IENT
U1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3RhdGUuc3R5bGUo
KS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBB
U1NFUlQobmV3SWQgIT0gaWQpOwotICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0eShuZXdJZCwg
dmFsdWUpOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBhZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5l
VGhyb3VnaFN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hXaWR0aDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lOgotICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0T3ZlcmxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lTW9kZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRPdmVybGluZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5l
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJs
aW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0aDoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNpemVEZWx0YToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3Q6Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8v
IENTUyBUZXh0IExheW91dCBNb2R1bGUgTGV2ZWwgMzogVmVydGljYWwgd3JpdGluZyBzdXBwb3J0
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdNb2RlOiB7Ci0gICAgICAgIEhBTkRM
RV9JTkhFUklUX0FORF9JTklUSUFMKHdyaXRpbmdNb2RlLCBXcml0aW5nTW9kZSk7Ci0gICAgICAg
IAotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBzZXRXcml0aW5nTW9k
ZSgqcHJpbWl0aXZlVmFsdWUpOwotCi0gICAgICAgIC8vIEZJWE1FOiBJdCBpcyBub3Qgb2sgdG8g
bW9kaWZ5IGRvY3VtZW50IHN0YXRlIHdoaWxlIGFwcGx5aW5nIHN0eWxlLgotICAgICAgICBpZiAo
c3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1bWVudCgpLT5k
b2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldFdyaXRp
bmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dE9yaWVudGF0aW9uOiB7Ci0gICAgICAg
IEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRPcmllbnRhdGlvbiwgVGV4dE9yaWVudGF0
aW9uKTsKLQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICBzZXRUZXh0
T3JpZW50YXRpb24oKnByaW1pdGl2ZVZhbHVlKTsKLQotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVCb3hDb250YWluOiB7Ci0gICAgICAgIEhB
TkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxpbmVCb3hDb250YWluLCBMaW5lQm94Q29udGFpbikK
LSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
ID09IENTU1ZhbHVlTm9uZSkgewotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUJv
eENvbnRhaW4oTGluZUJveENvbnRhaW5Ob25lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmICghdmFsdWUtPmlzQ1NTTGluZUJveENvbnRhaW5WYWx1ZSgpKQot
ICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENTU0xpbmVCb3hDb250YWluVmFsdWUqIGxp
bmVCb3hDb250YWluVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NMaW5lQm94Q29udGFpblZhbHVlKj4o
dmFsdWUpOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFpbihsaW5lQm94
Q29udGFpblZhbHVlLT52YWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8v
IENTUyBGb250cyBNb2R1bGUgTGV2ZWwgMwotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250
RmVhdHVyZVNldHRpbmdzOiB7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAmJiBwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vcm1hbCkgewotICAgICAgICAgICAgc2V0
Rm9udERlc2NyaXB0aW9uKHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpLm1ha2VOb3Jt
YWxGZWF0dXJlU2V0dGluZ3MoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgcmV0dXJuOwot
Ci0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgp
LT5mb250RGVzY3JpcHRpb24oKTsKLSAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0ID0gc3RhdGlj
X2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOwotICAgICAgICBSZWZQdHI8Rm9udEZlYXR1cmVT
ZXR0aW5ncz4gc2V0dGluZ3MgPSBGb250RmVhdHVyZVNldHRpbmdzOjpjcmVhdGUoKTsKLSAgICAg
ICAgaW50IGxlbiA9IGxpc3QtPmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8
IGxlbjsgKytpKSB7Ci0gICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGxpc3QtPml0ZW1XaXRo
b3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgICAgICBpZiAoIWl0ZW0tPmlzRm9udEZlYXR1cmVW
YWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgRm9udEZlYXR1
cmVWYWx1ZSogZmVhdHVyZSA9IHN0YXRpY19jYXN0PEZvbnRGZWF0dXJlVmFsdWUqPihpdGVtKTsK
LSAgICAgICAgICAgIHNldHRpbmdzLT5hcHBlbmQoRm9udEZlYXR1cmUoZmVhdHVyZS0+dGFnKCks
IGZlYXR1cmUtPnZhbHVlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBmb250RGVzY3JpcHRpb24u
c2V0RmVhdHVyZVNldHRpbmdzKHNldHRpbmdzLnJlbGVhc2UoKSk7Ci0gICAgICAgIHNldEZvbnRE
ZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0j
aWYgRU5BQkxFKENTU19GSUxURVJTKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGaWx0ZXI6
IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZmlsdGVyLCBGaWx0ZXIpOwot
ICAgICAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgICAgIGlmIChjcmVhdGVG
aWx0ZXJPcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0
eWxlKCksIG9wZXJhdGlvbnMpKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RmlsdGVy
KG9wZXJhdGlvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW5zOiB7Ci0gICAgICAgIFZlY3RvcjxHcmlkVHJhY2tT
aXplPiB0cmFja1NpemVzOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xpc3QodmFsdWUs
IHRyYWNrU2l6ZXMsIHN0YXRlKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0R3JpZENvbHVtbnModHJhY2tTaXplcyk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3dzOiB7Ci0gICAgICAgIFZlY3Rv
cjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFj
a0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZFJvd3ModHJhY2tTaXplcyk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFN0YXJ0OiB7Ci0g
ICAgICAgIEdyaWRQb3NpdGlvbiBzdGFydFBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdy
aWRQb3NpdGlvbih2YWx1ZSwgc3RhcnRQb3NpdGlvbikpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtU3RhcnQoc3RhcnRQb3NpdGlvbik7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRFbmQ6
IHsKLSAgICAgICAgR3JpZFBvc2l0aW9uIGVuZFBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRQb3NpdGlvbih2YWx1ZSwgZW5kUG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUVuZChlbmRQb3NpdGlvbik7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZEJlZm9y
ZTogewotICAgICAgICBHcmlkUG9zaXRpb24gYmVmb3JlUG9zaXRpb247Ci0gICAgICAgIGlmICgh
Y3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3JlKGJlZm9yZVBv
c2l0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0R3JpZEFmdGVyOiB7Ci0gICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0aW9uOwotICAg
ICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlvbikpCi0gICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQWZ0ZXIo
YWZ0ZXJQb3NpdGlvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGVzZSBw
cm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBhcHBsaWVkIHRo
ZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQgdmVyc2lvbi4KLSAgICBjYXNlIENTU1Byb3BlcnR5
VHJhbnNpdGlvbkRlbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9uRHVyYXRpb246
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKLSAgICBjYXNlIENTU1By
b3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgotICAgICAgICByZXR1cm47Ci0gICAgLy8g
VGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVpbGRlciBsb29r
dXAgdGFibGUuCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2htZW50OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFj
a2dyb3VuZENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJh
Y2tncm91bmRQb3NpdGlvblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlv
blk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJCb3R0b21SaWdodFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9t
U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1h
Z2VPdXRzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlUmVwZWF0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNsaWNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3Jk
ZXJJbWFnZVNvdXJjZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VXaWR0aDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
b3JkZXJMZWZ0U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRXaWR0aDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVyUmlnaHRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRXaWR0aDoK
LSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlclRvcExlZnRSYWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcFJpZ2h0
UmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BTdHlsZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvdHRvbToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDYXB0aW9u
U2lkZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Q2xlYXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNs
aXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3Vu
dGVySW5jcmVtZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eUN1cnNvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0aW9uOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlFbXB0eUNlbGxz
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9hdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNp
emU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUhlaWdodDoKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFUSU9OKQotICAg
IGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVudGF0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUltYWdlUmVuZGVyaW5nOgotI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVTT0xVVElPTikK
LSAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZXNvbHV0aW9uOgotI2VuZGlmCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eUxlZnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmc6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHls
ZUltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVQb3NpdGlvbjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5TGlzdFN0eWxlVHlwZToKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luQm90
dG9tOgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5MZWZ0OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlNYXJnaW5SaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luVG9wOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXhIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1heFdpZHRoOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlNaW5IZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1pbldpZHRo
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPcnBo
YW5zOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eU91dGxpbmVPZmZzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVTdHlsZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVy
Zmxvd1dyYXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93WDoKLSAgICBjYXNlIENTU1By
b3BlcnR5T3ZlcmZsb3dZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nQm90dG9tOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGlu
Z1JpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nVG9wOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlQYWdlQnJlYWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrQmVmb3Jl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVBvaW50ZXJFdmVudHM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBvc2l0aW9uOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlSZXNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVJpZ2h0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlTcGVhazoKLSAgICBjYXNl
IENTU1Byb3BlcnR5VGFiU2l6ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGFibGVMYXlvdXQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRBbGlnbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERl
Y29yYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRJbmRlbnQ6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRPdmVyZmxvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFJlbmRlcmluZzoK
LSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFRyYW5zZm9ybToKLSAgICBjYXNlIENTU1Byb3BlcnR5
VG9wOgotICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlQmlkaToKLSNpZiBFTkFCTEUoQ1NTX1ZB
UklBQkxFUykKLSAgICBjYXNlIENTU1Byb3BlcnR5VmFyaWFibGU6Ci0jZW5kaWYKLSAgICBjYXNl
IENTU1Byb3BlcnR5VmVydGljYWxBbGlnbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0
eToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGVsYXk6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0QW5pbWF0aW9uRHVyYXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1h
dGlvbkZpbGxNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25JdGVyYXRp
b25Db3VudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uTmFtZToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uUGxheVN0YXRlOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0QXBwZWFyYW5jZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXNwZWN0UmF0aW86
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJhY2tncm91bmRDb21wb3NpdGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tn
cm91bmRPcmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91bmRTaXplOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJGaXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRCb3JkZXJJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVmVydGljYWxT
cGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hBbGlnbjoKLSNpZiBFTkFCTEUo
Q1NTX0JPWF9ERUNPUkFUSU9OX0JSRUFLKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hE
ZWNvcmF0aW9uQnJlYWs6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGly
ZWN0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRCb3hGbGV4R3JvdXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
eExpbmVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmRpbmFsR3JvdXA6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yaWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94UGFjazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sb3JDb3JyZWN0aW9uOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5BeGlzOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRDb2x1bW5CcmVha0FmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1
bW5CcmVha0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtJbnNp
ZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5HYXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVt
blByb2dyZXNzaW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVTdHlsZToKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRDb2x1bW5TcGFuOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aDoKLSNp
ZiBFTkFCTEUoQ1VSU09SX1ZJU0lCSUxJVFkpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEN1
cnNvclZpc2liaWxpdHk6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QWxpZ25D
b250ZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnbkl0ZW1zOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRBbGlnblNlbGY6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZs
ZXhCYXNpczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleERpcmVjdGlvbjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEdyb3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEZsZXhTaHJpbms6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhXcmFwOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRKdXN0aWZ5Q29udGVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0T3JkZXI6Ci0jaWYgRU5BQkxFKENTU19SRUdJT05TKQotICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRGbG93RnJvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxvd0ludG86Ci0j
ZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEtlcm5pbmc6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZvbnRTbW9vdGhpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEZvbnRWYXJpYW50TGlnYXR1cmVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIaWdobGln
aHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUNoYXJhY3RlcjoKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRBZnRlcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEh5cGhlbmF0ZUxpbWl0TGluZXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhl
bnM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVBbGlnbjoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TGluZUJyZWFrOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lQ2xh
bXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVHcmlkOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRMaW5lU25hcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZURp
cmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVN0eWxlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tCb3hJbWFnZU91dHNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0Jv
eEltYWdlUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VTbGlj
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VXaWR0aDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza0NsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tDb21wb3Np
dGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZToKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0TWFza09yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bv
c2l0aW9uWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9uWToKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdFg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tSZXBlYXRZOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrU2l6ZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TmJzcE1vZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFBlcnNwZWN0aXZlT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVj
dGl2ZU9yaWdpblg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2lu
WToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UHJpbnRDb2xvckFkanVzdDoKLSNpZiBFTkFC
TEUoQ1NTX1JFR0lPTlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQWZ0
ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQmVmb3JlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0luc2lkZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0UmVnaW9uT3ZlcmZsb3c6Ci0jZW5kaWYKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0UnRsT3JkZXJpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ1YnlQb3NpdGlvbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dENvbWJpbmU6Ci0jaWYgRU5BQkxFKENTUzNf
VEVYVCkKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25MaW5lOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvblN0eWxlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRUZXh0QWxpZ25MYXN0OgotI2VuZGlmIC8vIENTUzNfVEVYVAotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0VGV4dEVtcGhhc2lzUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRleHRFbXBoYXNpc1N0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENv
bG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U2VjdXJpdHk6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VHJhbnNmb3JtT3JpZ2luWDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3Jt
T3JpZ2luWToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJh
bnNpdGlvbkR1cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uUHJv
cGVydHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1pbmdGdW5jdGlv
bjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlckRyYWc6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFVzZXJNb2RpZnk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJTZWxl
Y3Q6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENsaXBQYXRoOgotI2lmIEVOQUJMRShDU1Nf
RVhDTFVTSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRTaGFwZVBhZGRpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBUaHJvdWdoOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0U2hhcGVPdXRzaWRlOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRl
U3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V29yZFNwYWNpbmc6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlaSW5kZXg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Ci0jaWYgRU5BQkxF
KENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4Wm9vbToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JpZW50YXRp
b246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgotI2VuZGlmCi0gICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSNpZiBFTkFC
TEUoU1ZHKQotICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCi0gICAgICAgIGFwcGx5
U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKLSNlbmRpZgotICAgICAgICByZXR1cm47Ci0gICAgfQot
fQotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlSW1hZ2UoQ1NT
UHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQotewotICAgIGlmICh2YWx1ZS0+
aXNJbWFnZVZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUo
cHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwotCi0gICAgaWYg
KHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICBpZiAodmFsdWUtPmlz
R3JhZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGluZ0Zy
b21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KHZhbHVlKS0+
Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpOwotICAgICAgICByZXR1cm4g
Z2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFn
ZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX0lNQUdF
X1NFVCkKLSAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQotICAgICAgICByZXR1cm4g
c2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVNldFZh
bHVlKj4odmFsdWUpKTsKLSNlbmRpZgotCi0gICAgaWYgKHZhbHVlLT5pc0N1cnNvckltYWdlVmFs
dWUoKSkKLSAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwg
c3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7Ci0KLSAgICByZXR1cm4g
MDsKLX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpjYWNoZWRPclBl
bmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VWYWx1ZSogdmFs
dWUpCi17Ci0gICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVu
ZGluZ0ltYWdlKCk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQot
ICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZh
bHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFN0eWxl
SW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9w
ZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBp
ZiAodmFsdWUtPmlzUGVuZGluZygpKSB7Ci0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJv
cGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOwotICAgICAgICByZXR1cm4gU3R5bGVQZW5k
aW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiBTdHlsZUdlbmVyYXRl
ZEltYWdlOjpjcmVhdGUodmFsdWUpOwotfQotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi1Q
YXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGluZ0Zyb21WYWx1
ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1ZSkKLXsKLSAg
ICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2VT
ZXQoZG9jdW1lbnQoKSk7Ci0gICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgp
KQotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHks
IHZhbHVlKTsKLSAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotI2VuZGlmCi0KLVBhc3NS
ZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVl
KENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZhbHVlKQotewot
ICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFn
ZShkb2N1bWVudCgpKTsKLSAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkp
Ci0gICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwg
dmFsdWUpOwotICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlKQotewotICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpID09IHBhcmVu
dFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IEZv
bnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwotICAg
IEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBzZXRG
b250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkpOwot
ICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKLX0KLQot
dm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5
bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCi17Ci0gICAgY29uc3QgRm9udERl
c2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0KLSAgICBp
ZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwgIXBhcmVudFN0eWxlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnQgPSBwYXJlbnRT
dHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGNoaWxkRm9udC51c2VGaXhlZERlZmF1
bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIC8vIEZvciBub3csIGx1bXAgYWxsIGZhbWlsaWVzIGJ1dCBtb25vc3BhY2Ug
dG9nZXRoZXIuCi0gICAgaWYgKGNoaWxkRm9udC5nZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2Ny
aXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKLSAgICAgICAgJiYgcGFyZW50Rm9udC5nZW5lcmljRmFt
aWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBpcyBtb25vc3BhY2Ugb3IgdGhlIGNoaWxk
IGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAotICAgIC8vIHNpemUgd2FzIHVuc3BlY2lmaWVk
LiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUgYXMgYXBwcm9wcmlhdGUuCi0gICAgLy8g
SWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSByZWZldGNoIGZyb20gdGhl
IHRhYmxlIHJhdGhlciB0aGFuCi0gICAgLy8gbXVsdGlwbHlpbmcgYnkgb3VyIHNjYWxlIGZhY3Rv
ci4KLSAgICBmbG9hdCBzaXplOwotICAgIGlmIChjaGlsZEZvbnQua2V5d29yZFNpemUoKSkKLSAg
ICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21h
bGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEsIGNoaWxkRm9udC51c2VGaXhlZERlZmF1
bHRTaXplKCkpOwotICAgIGVsc2UgewotICAgICAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1
bWVudFNldHRpbmdzKCk7Ci0gICAgICAgIGZsb2F0IGZpeGVkU2NhbGVGYWN0b3IgPSAoc2V0dGlu
Z3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYgc2V0dGluZ3MtPmRlZmF1
bHRGb250U2l6ZSgpKQotICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxmbG9hdD4oc2V0dGluZ3Mt
PmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpCi0g
ICAgICAgICAgICA6IDE7Ci0gICAgICAgIHNpemUgPSBwYXJlbnRGb250LnVzZUZpeGVkRGVmYXVs
dFNpemUoKSA/Ci0gICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNpemUoKSAvIGZp
eGVkU2NhbGVGYWN0b3IgOgotICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXpl
KCkgKiBmaXhlZFNjYWxlRmFjdG9yOwotICAgIH0KLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdG
b250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKLSAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3Jp
cHRpb24sIHNpemUpOwotICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2Ny
aXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjppbml0aWFsaXplRm9udFN0eWxlKFNl
dHRpbmdzKiBzZXR0aW5ncykKLXsKLSAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9u
OwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6
U3RhbmRhcmRGYW1pbHkpOwotICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJpbmdNb2RlKHNl
dHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0VXNl
UHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZv
bnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRh
cmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygpLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsK
LSAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9udERl
c2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udEZhbWlseSk7Ci0g
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKLSAg
ICB9Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0g
Q1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAgc2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBm
b250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRpdW0sIGZhbHNlKSk7Ci0g
ICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGlu
ZUhlaWdodCgpKTsKLSAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBzZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVy
OjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgZmxvYXQgc2l6
ZSkKLXsKLSAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXplKTsKLSAgICBm
b250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZp
ZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0aW9uLmlzQWJz
b2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcygpKSk7Ci19Ci0KLWZsb2F0IFN0eWxl
UmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiBkb2N1
bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVj
aWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykKLXsKLSAgICBmbG9hdCB6b29tRmFjdG9y
ID0gMS4wZjsKLSAgICBpZiAoIXVzZVNWR1pvb21SdWxlcykgewotICAgICAgICB6b29tRmFjdG9y
ID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKLSAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRv
Y3VtZW50LT5mcmFtZSgpKQotICAgICAgICAgICAgem9vbUZhY3RvciAqPSBmcmFtZS0+dGV4dFpv
b21GYWN0b3IoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0
ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0b3IsIGlzQWJzb2x1dGVT
aXplLCBzcGVjaWZpZWRTaXplKTsKLX0KLQotZmxvYXQgU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0
ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBmbG9hdCB6b29tRmFj
dG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBFU21hcnRNaW5p
bXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUpCi17Ci0gICAgLy8gVGV4
dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90IGJlIHZpc2libGUgYW5kIHRoZXJlZm9y
ZSBuZWVkcyB0byBiZQotICAgIC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0gZm9udCBzaXplIHJ1bGVz
LiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAotICAgIC8vIHJlbmRlcmlu
Zy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBvdGhlciBicm93c2VycyB0aGF0IGhhdmUg
bWluaW11bQotICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBGaXJlZm94KS4KLSAgICBp
ZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBz
aWxvbigpKQotICAgICAgICByZXR1cm4gMC4wZjsKLQotICAgIC8vIFdlIHN1cHBvcnQgdHdvIHR5
cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmlyc3QgaXMgYSBoYXJkIG92ZXJyaWRlIHRo
YXQgYXBwbGllcyB0bwotICAgIC8vIGFsbCBmb250cy4gVGhpcyBpcyAibWluU2l6ZS4iIFRoZSBz
ZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFydCBtaW5pbXVtIgotICAg
IC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdlIGNhbid0IGtub3cgd2hh
dCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4sCi0gICAgLy8gd2hlbiBpdCB1c2VzIGxv
Z2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJlc3NlcyB0aGUgZm9udC1zaXplIGFzIGEg
cGVyY2VudGFnZSBvZgotICAgIC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBmb250IHNldHRpbmcuCi0K
LSAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3YW50IHRvIGdldCBzbWFs
bGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIGtlZXAgZm9udHMgcmVhZGFibGUuCi0g
ICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8gc2V0IGFuIGV4cGxpY2l0
IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAotICAgIC8vIHNpbmNlIHNpdGVzIHdpbGwgbWlz
LXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNwb3QuY29tIHdpdGggYSA5
cHggbWluaW11bSkuCi0KLSAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGlu
Z3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICByZXR1cm4gMS4wZjsKLQotICAgIGlu
dCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOwotICAgIGludCBtaW5Mb2dp
Y2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7Ci0gICAgZmxvYXQg
em9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29tRmFjdG9yOwotCi0gICAgLy8gQXBwbHkg
dGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBhcHBseSB0aGUgaGFyZCBtaW5pbXVtIGlm
IGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNtYWxsLgotICAgIGlmICh6b29tZWRTaXpl
IDwgbWluU2l6ZSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pblNpemU7Ci0KLSAgICAvLyBOb3cg
YXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlzIGFsc28gb25seSBhcHBs
aWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAotICAgIC8vIGFmdGVyIHpvb21pbmcuIFRoZSBm
b250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIgZGVmYXVsdCBvciB0
aGUgb3JpZ2luYWwgc2l6ZQotICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGFibGUuIEluIG90
aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVtIHdoZW5ldmVyIHdlJ3Jl
IHBvc2l0aXZlCi0gICAgLy8gZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0aGUgbGF5b3V0LgotICAg
IGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAmJiB6b29tZWRTaXplIDwgbWluTG9naWNh
bFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9naWNhbFNpemUgfHwgIWlzQWJzb2x1dGVT
aXplKSkKLSAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXplOwotCi0gICAgLy8gQWxz
byBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0byBwcmV2ZW50IGluc2FuZSBmb250IHNp
emVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlvdXMKLSAgICAvLyBwbGF0Zm9ybXMgKEkn
bSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCi0gICAgcmV0dXJuIG1pbihtYXhpbXVtQWxsb3dl
ZEZvbnRTaXplLCB6b29tZWRTaXplKTsKLX0KLQotY29uc3QgaW50IGZvbnRTaXplVGFibGVNYXgg
PSAxNjsKLWNvbnN0IGludCBmb250U2l6ZVRhYmxlTWluID0gOTsKLWNvbnN0IGludCB0b3RhbEtl
eXdvcmRzID0gODsKLQotLy8gV2luSUUvTmF2NCB0YWJsZSBmb3IgZm9udCBzaXplcy4gRGVzaWdu
ZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBpbmcgc3lzdGVtIG9mIEhUTUwuCi1zdGF0
aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1heCAtIGZvbnRT
aXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Ci17Ci0gICAgICB7IDksICAgIDksICAg
ICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjggfSwKLSAgICAgIHsgOSwgICAg
OSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMSB9LAotICAgICAgeyA5
LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDM0IH0sCi0gICAg
ICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwgICAgMzcgfSwK
LSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNiwgICAgMjAsICAgIDI2LCAgICA0
MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQotICAgICAgeyA5LCAgICA5LCAgICAxMSwg
ICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCi0gICAgICB7IDksICAgMTAsICAg
IDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKLSAgICAgIHsgOSwgICAx
MCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8vIHByb3BvcnRp
b25hbCBmb250IGRlZmF1bHQgKDE2KQotfTsKLS8vIEhUTUwgICAgICAgMSAgICAgIDIgICAgICAz
ICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNwotLy8gQ1NTICB4eHMgICB4cyAgICAgcyAgICAg
IG0gICAgICBsICAgICB4bCAgICAgeHhsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgfAot
Ly8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCi0KLS8vIFN0cmljdCBtb2RlIHRhYmxl
IG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0aW5ncyBleGFjdGx5Lgotc3RhdGljIGNv
bnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6ZVRh
YmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQotewotICAgICAgeyA5LCAgICA5LCAgICAgOSwg
ICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3IH0sCi0gICAgICB7IDksICAgIDksICAg
ICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzAgfSwKLSAgICAgIHsgOSwgICAg
OSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzMyB9LAotICAgICAgeyA5
LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM2IH0sCi0gICAg
ICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAgMzkgfSwg
Ly8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKLSAgICAgIHsgOSwgICAxMCwgICAgMTIsICAgIDE0
LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAxMywg
ICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCi0gICAgICB7IDksICAgMTAsICAg
IDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9uYWwg
Zm9udCBkZWZhdWx0ICgxNikKLX07Ci0vLyBIVE1MICAgICAgIDEgICAgICAyICAgICAgMyAgICAg
IDQgICAgICA1ICAgICAgNiAgICAgIDcKLS8vIENTUyAgeHhzICAgeHMgICAgIHMgICAgICBtICAg
ICAgbCAgICAgeGwgICAgIHh4bAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAg
ICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgotCi0vLyBGb3IgdmFsdWVzIG91dHNpZGUgdGhl
IHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQgRmFocm5lcidzIHN1Z2dlc3RlZCBzY2Fs
ZQotLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZhbHVlLgotc3RhdGljIGNvbnN0IGZsb2F0
IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9IHsgMC42MGYsIDAuNzVmLCAwLjg5Ziwg
MS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9OwotCi1mbG9hdCBTdHlsZVJlc29sdmVyOjpm
b250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQga2V5d29yZCwgYm9vbCBz
aG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRv
Y3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAgIHJldHVybiAx
LjBmOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9kZSgpOwot
ICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNldHRpbmdz
LT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOwot
ICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6ZSA8PSBm
b250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIC8vIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSB0
YWJsZS4KLSAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRhYmxlTWluOwot
ICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGwpOwotICAgICAgICBy
ZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XVtjb2xdIDogc3RyaWN0
Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07Ci0gICAgfQotCi0gICAgLy8gVmFsdWUgaXMgb3V0c2lk
ZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0aGUgc2NhbGUgZmFjdG9yIGluc3RlYWQu
Ci0gICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgoc2V0dGluZ3MtPm1pbmltdW1Mb2dpY2Fs
Rm9udFNpemUoKSwgMSk7Ci0gICAgcmV0dXJuIG1heChmb250U2l6ZUZhY3RvcnNba2V5d29yZCAt
IENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWluTG9naWNhbFNpemUpOwotfQotCi10ZW1w
bGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGludCBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplKGlu
dCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwgaW50IG11bHRpcGxpZXIpCi17Ci0gICAg
Ly8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21hbGwgZG9lcyBub3QgY29ycmVzcG9uZCB0
byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IHRvdGFsS2V5
d29yZHMgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKHBpeGVsRm9udFNpemUgKiAyIDwgKHRhYmxl
W2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIpCi0gICAgICAgICAgICByZXR1cm4gaTsK
LSAgICB9Ci0gICAgcmV0dXJuIHRvdGFsS2V5d29yZHMgLSAxOwotfQotCi1pbnQgU3R5bGVSZXNv
bHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQgcGl4ZWxGb250U2l6
ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQotewotICAgIFNldHRpbmdzKiBzZXR0
aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGluZ3MpCi0gICAgICAg
IHJldHVybiAxOwotCi0gICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtzTW9k
ZSgpOwotICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/IHNl
dHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6
ZSgpOwotICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVtU2l6
ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7Ci0gICAgICAgIGludCByb3cgPSBtZWRpdW1TaXplIC0g
Zm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5Rm9udFNp
emU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNpemVUYWJsZVty
b3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4g
ZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4ocGl4ZWxGb250U2l6ZSwgZm9udFNpemVG
YWN0b3JzLCBtZWRpdW1TaXplKTsKLX0KLQotc3RhdGljIENvbG9yIGNvbG9yRm9yQ1NTVmFsdWUo
aW50IGNzc1ZhbHVlSWQpCi17Ci0gICAgc3RydWN0IENvbG9yVmFsdWUgewotICAgICAgICBpbnQg
Y3NzVmFsdWVJZDsKLSAgICAgICAgUkdCQTMyIGNvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMg
Y29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0gewotICAgICAgICB7IENTU1ZhbHVlQXF1
YSwgMHhGRjAwRkZGRiB9LAotICAgICAgICB7IENTU1ZhbHVlQmxhY2ssIDB4RkYwMDAwMDAgfSwK
LSAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAwRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1
ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyYXksIDB4RkY4MDgw
ODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAwICB9LAotICAgICAgICB7
IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAotICAgICAgICB7IENTU1ZhbHVlTGltZSwgMHhG
RjAwRkYwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTWFyb29uLCAweEZGODAwMDAwIH0sCi0gICAg
ICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVPbGl2
ZSwgMHhGRjgwODAwMCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZU9yYW5nZSwgMHhGRkZGQTUwMCB9
LAotICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZGODAwMDgwIH0sCi0gICAgICAgIHsgQ1NT
VmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZVNpbHZlciwgMHhGRkMw
QzBDMCB9LAotICAgICAgICB7IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4MCAgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVX
aGl0ZSwgMHhGRkZGRkZGRiB9LAotICAgICAgICB7IENTU1ZhbHVlWWVsbG93LCAweEZGRkZGRjAw
IH0sCi0gICAgICAgIHsgMCwgMCB9Ci0gICAgfTsKLQotICAgIGZvciAoY29uc3QgQ29sb3JWYWx1
ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytjb2wpIHsKLSAgICAgICAg
aWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlkKQotICAgICAgICAgICAgcmV0dXJuIGNv
bC0+Y29sb3I7Ci0gICAgfQotICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCkt
PnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNvbG9y
RnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUq
IHZhbHVlKQotewotICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwotICAgIHN3aXRj
aCAoaWRlbnQpIHsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKLSAgICBjYXNlIENTU1Zh
bHVlV2Via2l0TGluazoKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGluazoKLSAgICBj
YXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZh
dWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1Db2xvciBTdHlsZVJlc29s
dmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSogdmFsdWUsIGJv
b2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Ci17Ci0gICAgaWYgKHZhbHVlLT5pc1JHQkNvbG9yKCkp
Ci0gICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7Ci0KLSAgICBj
b25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJ
ZGVudCgpOwotICAgIHN3aXRjaCAoaWRlbnQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVy
biBDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgotICAgICAgICByZXR1cm4g
c3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExp
bms6Ci0gICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSAmJiBmb3JWaXNp
dGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNpdGVkTGlua0NvbG9yKCkgOiBzdGF0ZS5k
b2N1bWVudCgpLT5saW5rQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGlu
azoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPmFjdGl2ZUxpbmtDb2xvcigpOwot
ICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcjoKLSAgICAgICAgcmV0dXJuIFJl
bmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVDdXJyZW50Y29s
b3I6Ci0gICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOwotICAgIGRlZmF1bHQ6
Ci0gICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVlKGlkZW50KTsKLSAgICB9Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0KGNv
bnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVzdWx0KQotewotICAgIG1fdmlld3BvcnRE
ZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlS
ZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjphZmZlY3Rl
ZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAotewotICAgIHVuc2lnbmVkIHMgPSBtX3ZpZXdwb3J0
RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBzOyBpKyspIHsKLSAgICAgICAgaWYgKG1fbWVkaXVtLT5ldmFsKCZtX3ZpZXdwb3J0
RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lvbikgIT0gbV92aWV3cG9y
dERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkKLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBUcmFuc2Zv
cm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZShXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSB0eXBlKQotewotICAg
IHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxl
VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRTsKLSAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpTQ0FMRV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNj
YWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVf
WjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8zRDsKLSAgICBjYXNlIFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9u
OjpUUkFOU0xBVEVfWTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xB
VEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGUzRFRyYW5z
Zm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFXzNEOwot
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlJPVEFURV9YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJP
VEFURV9ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zv
cm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9aOwotICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfM0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6U0tFVzsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WFRy
YW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tFV19YOwotICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiBy
ZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3Bl
cmF0aW9uOjpNQVRSSVg7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4
M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok1BVFJJWF8z
RDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2ZVRyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVSU1BFQ1RJVkU7Ci0gICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9wZXJhdGlvbjog
cmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIFRyYW5z
Zm9ybU9wZXJhdGlvbjo6Tk9ORTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVUcmFu
c2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJl
bmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMp
Ci17Ci0gICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7Ci0gICAg
ICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3RpdmVab29tKCkg
OiAxOwotICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICBmb3IgKENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsK
LSAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLQotICAgICAgICBpZiAo
IWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0KLSAgICAgICAgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqIHRyYW5zZm9ybVZhbHVl
ID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihpLnZhbHVlKCkpOwotICAg
ICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSkKLSAgICAgICAgICAgIGNvbnRpbnVl
OwotCi0gICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAg
IGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCk7ICsraikg
ewotICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
ayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaGF2ZU5vblByaW1p
dGl2ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgfQotICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDApKTsKLQotICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybVZhbHVlLT5vcGVy
YXRpb25UeXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3Vi
bGUgc3ggPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN5ID0gZmly
c3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAg
ICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAg
c3kgPSBzeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246OmNy
ZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0
aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJhbnNm
b3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Ci0gICAgICAgICAg
ICBkb3VibGUgc3kgPSAxLjA7Ci0gICAgICAgICAgICBkb3VibGUgc3ogPSAxLjA7Ci0gICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHN6
ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzeSA9IGZpcnN0VmFs
dWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAg
ICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCBzeiwg
Z2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgp
KSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOgotICAgICAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9u
OgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNm
b3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4ZWQp
OwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5
ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9v
bUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZl
cnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3Ip
OwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5ID0gY29udmVy
dFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3Ip
OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1VuZGVmaW5lZCgp
KQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9u
cy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRl
KHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRy
YW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCB0eCA9
IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5ndGgoMCwgRml4
ZWQpOwotICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwg
em9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3Jt
T3BlcmF0aW9uKQotICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmly
c3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNl
IHsKLSAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUs
IHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmICh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpU
cmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aCh0aGlyZFZhbHVlLCBz
dHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zs
b2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSB8fCB0
ei5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9w
ZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJh
bnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5z
Zm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+
Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFw
cGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCAxLCBhbmdsZSwgZ2V0
VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9ybU9wZXJhdGlv
bjogewotICAgICAgICAgICAgZG91YmxlIHggPSAwOwotICAgICAgICAgICAgZG91YmxlIHkgPSAw
OwotICAgICAgICAgICAgZG91YmxlIHogPSAwOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0g
Zmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLQotICAgICAgICAgICAgaWYgKHRyYW5zZm9y
bVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0
ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAg
ICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQotICAgICAgICAgICAgICAg
IHkgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHogPSAxOwotICAgICAg
ICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5zZm9ybU9wZXJh
dGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRy
YW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgfQotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGUzRFRy
YW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5n
dGgoKSA8IDQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKLSAgICAgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAgICAg
ICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKTsK
LSAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAg
ICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAg
ICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAg
ICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAg
ICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVy
YXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5z
Zm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tl
d1hUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW5nbGVY
ID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkgPSAwOwotICAgICAgICAgICAgZG91Ymxl
IGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKLSAgICAgICAgICAgIGlmICh0
cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBhbmdsZVkgPSBhbmds
ZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGFuZ2xlWCA9IGFuZ2xlOwot
ICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uKSB7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlWSA9IHNlY29uZFZhbHVl
LT5jb21wdXRlRGVncmVlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCku
YXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhbmdsZVgsIGFuZ2xlWSwgZ2V0
VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAg
ICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVlKCk7
Ci0gICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXREb3VibGVWYWx1
ZSgpOwotICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91Ymxl
VmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBlID0gem9vbUZhY3RvciAqIHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGYgPSB6b29tRmFj
dG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBv
cGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOjpj
cmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RUcmFuc2Zvcm1P
cGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCAx
NikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91YmxlVmFsdWUo
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0
RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDYpKS0+Z2V0RG91YmxlVmFs
dWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDcpKS0+
Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9y
bVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEwKSktPmdldERvdWJsZVZhbHVlKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMSkpLT5nZXREb3Vi
bGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21GYWN0b3IgKiBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
dHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMpKS0+Z2V0RG91YmxlVmFs
dWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDE0KSkt
PmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKG1h
dHJpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAg
ICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIGlmIChm
aXJzdFZhbHVlLT5pc0xlbmd0aCgpKQotICAgICAgICAgICAgICAgIHAgPSBjb252ZXJ0VG9GbG9h
dExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdWlyayB0aGF0IHNo
b3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBhcmUgZmluYWxpemVkLgotICAgICAgICAg
ICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAg
ICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChjbGFtcFRvUG9zaXRpdmVJbnRlZ2VyKHZh
bCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFBlcnNwZWN0aXZl
VHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5z
Zm9ybU9wZXJhdGlvbjoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3Bl
cmF0aW9uczsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykK
LXN0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZmlsdGVyT3BlcmF0aW9uRm9y
VHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9uVHlwZSB0eXBlKQotewot
ICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlJlZmVy
ZW5jZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6UkVG
RVJFTkNFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2FsZUZpbHRlck9w
ZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOwotICAg
IGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAgICAg
ICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRl
clZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6U0FUVVJBVEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6SHVlUm90
YXRlRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpIVUVf
Uk9UQVRFOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9wZXJh
dGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOwotICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJl
dHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6QlJJR0hUTkVTUzsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpDb250
cmFzdEZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Q09O
VFJBU1Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlv
bjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QkxVUjsKLSAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1
cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMp
Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmlsdGVyT3BlcmF0aW9uOgot
ICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT007Ci0jZW5kaWYKLSAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBy
ZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOwotICAgIH0KLSAgICByZXR1cm4gRmlsdGVyT3Bl
cmF0aW9uOjpOT05FOwotfQotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZH
KQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygpCi17Ci0gICAg
U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlKCktPmhhc0ZpbHRl
cigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9
IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7Ci0gICAgVmVjdG9yPFJl
ZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBzdGF0ZS5zdHlsZSgp
LT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0
ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0g
ICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJP
cGVyYXRpb246OlJFRkVSRU5DRSkgewotICAgICAgICAgICAgUmVmZXJlbmNlRmlsdGVyT3BlcmF0
aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRp
b24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NTVkdE
b2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5nZXQocmVm
ZXJlbmNlRmlsdGVyKS5nZXQoKTsKLSAgICAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBDYWNoZWRTVkdEb2N1bWVudCogY2FjaGVkRG9j
dW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgICAgICBp
ZiAoIWNhY2hlZERvY3VtZW50KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAg
ICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhlIHJlZmVyZW5jZSBmaWx0
ZXIuCi0gICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXItPnNldENhY2hlZFNWR0RvY3VtZW50UmVm
ZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShjYWNoZWREb2N1
bWVudCkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRz
KCkuY2xlYXIoKTsKLX0KLSNlbmRpZgotCi0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotU3R5bGVT
aGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAg
ICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIGNh
Y2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKHN0YXRpY19jYXN0PFdlYktpdENTU1No
YWRlclZhbHVlKj4odmFsdWUpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotU3R5bGVTaGFkZXIqIFN0
eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENT
U1NoYWRlclZhbHVlKiB2YWx1ZSkKLXsKLSAgICBTdHlsZVNoYWRlciogc2hhZGVyID0gdmFsdWUt
PmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOwotICAgIGlmIChzaGFkZXIgJiYgc2hhZGVyLT5pc1Bl
bmRpbmdTaGFkZXIoKSkKLSAgICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hhZGVycyh0cnVl
KTsKLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5k
aW5nU2hhZGVycygpCi17Ci0gICAgaWYgKCFtX3N0YXRlLnN0eWxlKCktPmhhc0ZpbHRlcigpIHx8
ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIENh
Y2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1l
bnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVy
T3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5zdHlsZSgpLT5tdXRhYmxl
RmlsdGVyKCkub3BlcmF0aW9ucygpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0
ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFJlZlB0cjxGaWx0ZXJPcGVyYXRp
b24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Ci0gICAgICAgIGlm
IChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJPcGVyYXRpb246
OkNVU1RPTSkgewotICAgICAgICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKiBjdXN0b21GaWx0
ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24u
Z2V0KCkpOwotICAgICAgICAgICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAg
ICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3JhbSA9IHN0YXRpY19jYXN0
PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+cHJvZ3JhbSgpKTsKLSAg
ICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBwcm9ncmFtLT52ZXJ0ZXhT
aGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICBXZWJLaXRDU1NT
aGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdTaGFkZXIq
Pihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAg
ICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIo
Y2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChw
cm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCktPmlz
UGVuZGluZ1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUq
IHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+
ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJv
Z3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRlcihjYWNoZWRS
ZXNvdXJjZUxvYWRlcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1f
c3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpOwotfQotCi1zdGF0aWMgYm9vbCBzb3J0
UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBiKQotewotICAg
IHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4oYS0+bmFtZSgpLCBiLT5uYW1lKCkpOwot
fQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFy
c2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVl
TGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcj4g
YXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUp
OwotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlcy0+bGVuZ3RoKCk7IGkg
PCBsZW5ndGg7ICsraSkgewotICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0gICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFs
dWUoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsK
LSAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0
aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgYXJy
YXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVWYWx1ZSgpKTsK
LSAgICB9Ci0gICAgcmV0dXJuIGFycmF5UGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1Jl
ZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmls
dGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0KiB2YWx1
ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcj4gbnVtYmVyUGFy
YW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0gICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7ICsraSkgewotICAgICAg
ICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7Ci0g
ICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVy
biAwOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNf
Y2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgaWYgKHByaW1pdGl2ZVZh
bHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCi0g
ICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbnVtYmVyUGFyYW1ldGVyLT5hZGRWYWx1ZShw
cmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBudW1i
ZXJQYXJhbWV0ZXIucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIo
Y29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKLXsKLSAgICBSZWZQdHI8
Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1QYXJhbWV0ZXIgPSBDdXN0
b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKLSAgICBUcmFuc2Zvcm1P
cGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1
ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlv
bnMpOwotICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0T3BlcmF0aW9ucyhvcGVyYXRpb25zKTsK
LSAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0
cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVy
UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBhcmFtZXRlclZhbHVlKQot
ewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVycyB0eXBlcyBwYXJzaW5n
LgotICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NzY0MzgKLSAgICAvLyB0ZXh0dXJlczogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTcxNDQyCi0gICAgLy8gbWF0MiwgbWF0MywgbWF0NDogaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0Ci0gICAgLy8gTnVtYmVyIHBhcmFtZXRlcnMg
YXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwKLSAgICAvLyB0aGUgb3Ro
ZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20gQ1NTVmFsdWVMaXN0LgotICAgIGlmICgh
cGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAg
Q1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3QqPihwYXJhbWV0
ZXJWYWx1ZSk7Ci0gICAgaWYgKCF2YWx1ZXMtPmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gMDsK
LQotICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJheUZ1bmN0aW9uVmFsdWUo
KSkKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIobmFtZSwg
dmFsdWVzKTsKLQotICAgIC8vIElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbGlzdCBpcyBhIHRy
YW5zZm9ybSBmdW5jdGlvbiwKLSAgICAvLyB0aGVuIHdlIGNvdWxkIHNhZmVseSBhc3N1bWUgdGhh
dCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcwotICAgIC8vIGFyZSB0cmFuc2Zvcm1zLiBwYXJzZUN1
c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxsCi0gICAgLy8gcmV0dXJuIDAgaWYgdGhh
dCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KLSAgICBpZiAodmFsdWVzLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCi0gICAgICAgIHJldHVy
biBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihuYW1lLCB2YWx1ZXMpOwotCi0g
ICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2YgYm9vbGVhbnMgb3IgbnVtYmVycywgc28g
dXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9zZSB0d28uCi0gICAgLy8g
V2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFsbCBudW1iZXJzKS4KLSAg
ICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmltaXRpdmVWYWx1
ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAg
ICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLSAg
ICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2
ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0ZXJOdW1i
ZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhl
IGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYm9vbCBT
dHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NTVmFsdWUqIHBh
cmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYgcGFyYW1ldGVyTGlzdCkK
LXsKLSAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJhbWV0ZXJOYW1lczsKLSAgICBDU1NWYWx1
ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJzVmFsdWUpOwotICAgIGZv
ciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7IHBhcmFtZXRlckl0ZXJhdG9yLmFkdmFu
Y2UoKSkgewotICAgICAgICBpZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCktPmlzVmFsdWVM
aXN0KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIENTU1ZhbHVlTGlzdEl0
ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICBpZiAo
IWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKHByaW1p
dGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19TVFJJ
TkcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcg
bmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAgICAvLyBEbyBu
b3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KLSAgICAgICAgaWYgKGtub3duUGFy
YW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5hbWUpOwotICAgICAgICAKLSAgICAgICAg
aXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNN
b3JlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBSZWZQ
dHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJzZUN1c3RvbUZpbHRlclBh
cmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCFwYXJhbWV0ZXIp
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHBhcmFtZXRlckxpc3QuYXBwZW5k
KHBhcmFtZXRlci5yZWxlYXNlKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBNYWtlIHN1cmUgd2Ug
c29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIGRvd24gdG8gdGhlIEN1c3Rv
bUZpbHRlck9wZXJhdGlvbi4KLSAgICBzdGQ6OnNvcnQocGFyYW1ldGVyTGlzdC5iZWdpbigpLCBw
YXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IpOwotICAg
IAotICAgIHJldHVybiB0cnVlOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlv
bj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJl
ZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUpCi17Ci0gICAg
Ly8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0aW9uIGZvciB0aGUgY3VzdG9tIGZpbHRl
ciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCi0gICAgVU5VU0VEX1BBUkFNKGZpbHRlclZhbHVl
KTsKLSAgICByZXR1cm4gMDsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+
IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50
YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQotewotICAgIENTU1ZhbHVlKiBz
aGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKTsKLSAg
ICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzaGFkZXJzVmFsdWUtPmlzVmFsdWVM
aXN0KCkpOwotICAgIENTU1ZhbHVlTGlzdCogc2hhZGVyc0xpc3QgPSBzdGF0aWNfY2FzdDxDU1NW
YWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOwotCi0gICAgdW5zaWduZWQgc2hhZGVyc0xpc3RMZW5n
dGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7Ci0gICAgQVNTRVJUKHNoYWRlcnNMaXN0TGVuZ3Ro
KTsKLQotICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVydGV4U2hhZGVyID0gc3R5bGVTaGFkZXIo
c2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOwotICAgIFJlZlB0cjxTdHls
ZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7Ci0gICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbVR5cGUgcHJv
Z3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVYVFVSRTsKLSAgICBDdXN0
b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0dGluZ3M7Ci0KLSAgICBpZiAoc2hhZGVy
c0xpc3RMZW5ndGggPiAxKSB7Ci0gICAgICAgIENTU1ZhbHVlKiBmcmFnbWVudFNoYWRlck9yTWl4
RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKTsKLQotICAg
ICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uLT5pc1dlYktpdENTU01peEZ1bmN0
aW9uVmFsdWUoKSkgewotICAgICAgICAgICAgV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSogbWl4
RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKj4oZnJhZ21l
bnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKLSAgICAgICAgICAgIENTU1ZhbHVlTGlzdEl0ZXJhdG9y
IGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKLQotICAgICAgICAgICAgQVNTRVJUKG1peEZ1bmN0aW9u
LT5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGl0
ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotCi0gICAg
ICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMpOwotICAgICAgICAgICAg
d2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgewotICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
aXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKENTU1BhcnNlcjo6aXNCbGVu
ZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQotICAgICAgICAgICAgICAgICAgICBt
aXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAgICAg
ZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9wZXJhdG9yKHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuY29tcG9zaXRlT3Bl
cmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgICAgICBpdGVyYXRv
ci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAg
ICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19FTEVNRU5UX1RFWFRVUkU7Ci0gICAgICAg
ICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyT3JNaXhGdW5j
dGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgdW5zaWduZWQgbWVzaFJvd3MgPSAx
OwotICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsKLSAgICBDdXN0b21GaWx0ZXJNZXNoVHlw
ZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7Ci0gICAgCi0gICAgQ1NTVmFsdWUqIHBhcmFt
ZXRlcnNWYWx1ZSA9IDA7Ci0gICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDEp
IHsKLSAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IoZmlsdGVyVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHNlY29u
ZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qgb2YgcGFyYW1ldGVyczoK
LSAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgb3IgYW55IG9mIHRoZSBtZXNo
LWJveCBpZGVudGlmaWVycyBpdCBpcyAKLSAgICAgICAgLy8gdGhlIG1lc2gtYm94IGxpc3QsIGlm
IG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVycyBsaXN0LgotCi0gICAgICAgIGlmIChp
dGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgb25seSBv
bmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0IGJvdGgKLSAgICAgICAg
ICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMuCi0gICAgICAgICAgICAgICAgbWVz
aENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpOwotICAg
ICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhlciBudW1iZXIgZm9yIHRoZSByb3dzLgot
ICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmlt
aXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBw
cmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4oaXRlcmF0b3Iu
dmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1i
ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVzaFJvd3MgPSBwcmltaXRpdmVWYWx1
ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFu
Y2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc01vcmUo
KSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdl
dElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgewotICAgICAgICAgICAgICAgIG1lc2hUeXBl
ID0gTWVzaFR5cGVEZXRhY2hlZDsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXRlcmF0
b3IuaW5kZXgoKSkgewotICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUgd2FzIGNvbnN1bWVkIGZy
b20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVzdCBhIHBhcmFtZXRlciBsaXN0LCBtZWFu
aW5nIHRoYXQgd2UgZW5kIHVwCi0gICAgICAgICAgICAvLyBoYXZpbmcganVzdCB0d28gQ1NTTGlz
dFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFtZXRlcnMuCi0gICAgICAg
ICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDIpOwotICAgICAgICAgICAgcGFy
YW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA+IDIg
JiYgIXBhcmFtZXRlcnNWYWx1ZSkKLSAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7Ci0gICAgCi0gICAgQ3VzdG9tRmlsdGVyUGFy
YW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OwotICAgIGlmIChwYXJhbWV0ZXJzVmFsdWUgJiYgIXBh
cnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFsdWUsIHBhcmFtZXRlckxp
c3QpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBSZWZQdHI8U3R5bGVDdXN0b21GaWx0
ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtOjpjcmVhdGUodmVy
dGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFkZXIucmVsZWFzZSgpLCBwcm9ncmFtVHlw
ZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKLSAgICByZXR1cm4gQ3VzdG9tRmlsdGVyT3BlcmF0
aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBhcmFtZXRlckxpc3QsIG1lc2hSb3dzLCBt
ZXNoQ29sdW1ucywgbWVzaFR5cGUpOwotfQotCi1QYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJh
dGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKFdlYktpdENT
U0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxl
bmd0aCgpKTsKLSAgICBib29sIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID0gZmlsdGVyVmFsdWUt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKTsKLSAgICByZXR1
cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25X
aXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZhbHVlKSA6IGNyZWF0ZUN1c3RvbUZpbHRl
ck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVyVmFsdWUpOwotfQotCi0jZW5kaWYKLQot
Ym9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZh
bHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRlck9w
ZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCi17Ci0gICAgQVNTRVJUKG91dE9wZXJhdGlvbnMuaXNF
bXB0eSgpKTsKLSAgICAKLSAgICBpZiAoIWluVmFsdWUpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAKLSAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oaW5WYWx1ZSk7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQo
KSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAg
Ci0gICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgp
IDogMTsKLSAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgZm9yIChDU1NWYWx1
ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0g
ICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0gICAgICAgIGlmICghY3Vy
clZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUgPSBzdGF0aWNfY2Fz
dDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUoKSk7Ci0gICAgICAgIEZpbHRlck9wZXJh
dGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gZmlsdGVyT3BlcmF0aW9uRm9yVHlw
ZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsKLQotI2lmIEVOQUJMRShDU1NfU0hBREVS
UykKLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpWQUxJREFU
RURfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0b21GaWx0ZXJPcGVyYXRp
b24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVyU3R5bGUuCi0gICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6Q1VTVE9N
KSB7Ci0gICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBvcGVyYXRpb24g
PSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUpOwotICAgICAgICAgICAg
aWYgKCFvcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAg
ICAgCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQob3BlcmF0aW9u
KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYg
KG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsKLSNpZiBFTkFC
TEUoU1ZHKQotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQ1NTVmFsdWUqIGFyZ3VtZW50ID0g
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0KLSAgICAgICAgICAgIGlm
ICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgpKQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlKiBz
dmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSo+
KGFyZ3VtZW50KTsKLSAgICAgICAgICAgIEtVUkwgdXJsID0gbV9zdGF0ZS5kb2N1bWVudCgpLT5j
b21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwoKSk7Ci0KLSAgICAgICAgICAgIFJlZlB0
cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IFJlZmVyZW5jZUZpbHRlck9w
ZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1cmwuZnJhZ21lbnRJZGVu
dGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOwotICAgICAgICAgICAgaWYgKFNWR1VSSVJlZmVyZW5j
ZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT51cmwoKSwgbV9zdGF0
ZS5kb2N1bWVudCgpKSkgewotICAgICAgICAgICAgICAgIGlmICghc3ZnRG9jdW1lbnRWYWx1ZS0+
bG9hZFJlcXVlc3RlZCgpKQotICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnBlbmRpbmdTVkdE
b2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBzdmdEb2N1bWVudFZhbHVlKTsKLSAgICAg
ICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgp
KQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24tPnNldENhY2hlZFNWR0RvY3VtZW50UmVm
ZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShzdmdEb2N1bWVu
dFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7Ci0jZW5kaWYKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBh
bGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0aGUKLSAgICAgICAgLy8g
ZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhhcyBhIFNoYWRvd1ZhbHVlIHBhcmFtZXRl
ci4KLSAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NI
QURPVykgewotICAgICAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSBmYWxzZTsK
LSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBmaWx0ZXJWYWx1ZS0+bGVuZ3Ro
KCk7ICsraikgewotICAgICAgICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAg
ICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGF2
ZU5vblByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9
Ci0KLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBmaWx0ZXJWYWx1ZS0+
bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpbHRlclZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7Ci0gICAgICAgIHN3aXRjaCAoZmlsdGVyVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSkgewotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVl
OjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRl
clZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFt
b3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEpIHsK
LSAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwot
ICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAgICAg
ICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVy
YXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0
ZUZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gMDsKLSAgICAg
ICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkKLSAgICAgICAgICAgICAgICBh
bmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0KLSAgICAgICAgICAgIG9wZXJh
dGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9u
OjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZpbHRlck9w
ZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0Zp
bHRlck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJh
c3RGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9w
YWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAoZmls
dGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0
bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1
ZS0+bGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGFtb3VudCA9IGZpcnN0VmFsdWUt
PmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUtPmlzUGVy
Y2VudGFnZSgpKQotICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOwotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmFzaWND
b21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwgb3BlcmF0aW9u
VHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjogewotICAgICAgICAgICAgTGVu
Z3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAoZmls
dGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCi0gICAgICAgICAgICAgICAgc3RkRGV2aWF0aW9uID0g
Y29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZh
Y3Rvcik7Ci0gICAgICAgICAgICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5kZWZpbmVkKCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJh
dGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN0ZERldmlhdGlvbiwg
b3BlcmF0aW9uVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjogewot
ICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgQ1NTVmFsdWUqIGNzc1ZhbHVlID0gZmls
dGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0gICAgICAgICAgICBpZiAoIWNz
c1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAg
ICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihj
c3NWYWx1ZSk7Ci0gICAgICAgICAgICBJbnRQb2ludCBsb2NhdGlvbihpdGVtLT54LT5jb21wdXRl
TGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvciksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RT
dHlsZSwgem9vbUZhY3RvcikpOwotICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVtLT5ibHVyID8g
aXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0
b3IpIDogMDsKLSAgICAgICAgICAgIENvbG9yIGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0ZW0t
PmNvbG9yKQotICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUo
aXRlbS0+Y29sb3IuZ2V0KCkpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMo
KS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGxvY2F0aW9uLCBibHVy
LCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCwgb3BlcmF0aW9u
VHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJL
aXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmCi0KLVBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5
bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSogcGVuZGluZ0lt
YWdlKQotewotICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9
IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKLQotICAgIGlmIChw
ZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgewotICAgICAgICBDU1NJbWFnZVZhbHVlKiBp
bWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7Ci0gICAgICAgIHJldHVy
biBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgfQot
Ci0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgpKSB7Ci0gICAg
ICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdlR2VuZXJhdG9yVmFsdWUgPSBwZW5kaW5n
SW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsKLSAgICAgICAgaW1hZ2VHZW5lcmF0b3JW
YWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgICAgIHJldHVy
biBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0b3JWYWx1ZSk7Ci0gICAg
fQotCi0gICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgpKSB7Ci0gICAg
ICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvckltYWdlVmFsdWUgPSBwZW5kaW5nSW1hZ2Ut
PmNzc0N1cnNvckltYWdlVmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGN1cnNvckltYWdlVmFsdWUt
PmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0KLSNpZiBFTkFCTEUo
Q1NTX0lNQUdFX1NFVCkKLSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNldFZhbHVlKCkp
IHsKLSAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1ZSA9IHBlbmRpbmdJbWFn
ZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gaW1hZ2VTZXRWYWx1ZS0+Y2Fj
aGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIH0KLSNlbmRpZgotCi0gICAg
cmV0dXJuIDA7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZXMoKQot
ewotICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpjb25zdF9pdGVy
YXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5lbmQoKS5r
ZXlzKCk7Ci0gICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6
OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5iZWdpbigpLmtleXMo
KTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIENTU1Byb3BlcnR5SUQgY3VycmVudFByb3Bl
cnR5ID0gKml0OwotCi0gICAgICAgIHN3aXRjaCAoY3VycmVudFByb3BlcnR5KSB7Ci0gICAgICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6IHsKLSAgICAgICAgICAgIGZvciAoRmls
bExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vzc0JhY2tncm91
bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5ZXIgPSBiYWNrZ3JvdW5k
TGF5ZXItPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kTGF5ZXItPmlt
YWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAg
ICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXItPnNldEltYWdlKGxvYWRQZW5kaW5nSW1h
Z2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3JvdW5kTGF5ZXItPmltYWdl
KCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogewotICAgICAgICAgICAgZm9yIChDb250ZW50
RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENvbnRlbnREYXRhKj4obV9zdGF0ZS5zdHls
ZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7IGNvbnRlbnREYXRhID0gY29udGVudERh
dGEtPm5leHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50RGF0YS0+aXNJbWFnZSgp
KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0eWxlSW1hZ2UqIGltYWdlID0gc3RhdGljX2Nhc3Q8
SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsKLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGluZ0ltYWdlKHN0
YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGlmIChsb2FkZWRJbWFnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5zZXRJbWFnZShsb2FkZWRJ
bWFnZS5yZWxlYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogewotICAgICAgICAgICAgaWYgKEN1cnNvckxpc3QqIGN1
cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNvcnMoKSkgewotICAgICAgICAgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgpOyArK2kpIHsKLSAgICAg
ICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVudEN1cnNvciA9IGN1cnNvckxpc3QtPmF0
KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoU3R5bGVJbWFnZSogaW1hZ2UgPSBjdXJyZW50
Q3Vyc29yLmltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+aXNQ
ZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q3Vyc29y
LnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2Uq
PihpbWFnZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2Ug
Q1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogewotICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5
bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUltYWdl
KCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5z
ZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGlu
Z0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpKSkpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdl
U291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5ib3JkZXJJbWFnZVNv
dXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5n
SW1hZ2UoKSkKLSAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldEJvcmRlckltYWdl
U291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPiht
X3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkpKSk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94UmVmbGVjdDog
ewotICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1fc3RhdGUu
c3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgTmluZVBpZWNl
SW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1hc2soKTsKLSAgICAgICAgICAgICAgICBp
ZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdlLmltYWdlKCktPmlzUGVuZGluZ0ltYWdl
KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxvYWRlZEltYWdl
ID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tJ
bWFnZS5pbWFnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPnNldE1hc2so
TmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNrSW1hZ2UuaW1hZ2VTbGlj
ZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdlLmJvcmRlclNsaWNlcygpLCBtYXNrSW1h
Z2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFsUnVsZSgpLCBtYXNrSW1hZ2UudmVydGlj
YWxSdWxlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0Jv
eEltYWdlU291cmNlOiB7Ci0gICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94
SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpLT5p
c1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TWFz
a0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5n
SW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpKSkpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tJbWFnZTogewotICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIG1hc2tMYXllciA9IG1fc3Rh
dGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBtYXNrTGF5ZXI7IG1hc2tMYXllciA9IG1h
c2tMYXllci0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hc2tMYXllci0+aW1hZ2Uo
KSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAgICAgICAg
ICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxT
dHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1fc3Rh
dGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQotewotICAgIC8vIFN0YXJ0IGxvYWRpbmcgaW1h
Z2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ0ltYWdlcygpOwot
Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIHNoYWRl
cnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nU2hhZGVycygpOwot
I2VuZGlmCi0gICAgCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAg
IC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVudHMgcmVmZXJlbmNlZCBieSB0aGlzIHN0
eWxlLgotICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7Ci0jZW5kaWYKLX0KLQotaW5saW5l
IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVkUHJvcGVydGllcygpCi0g
ICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQotewotfQotCi1pbmxpbmUgU3R5bGVSZXNvbHZl
cjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJvcGVydGllcygpCi17Ci19Ci0KLXZvaWQg
U3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9y
eU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJ
bmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1Mp
OwotICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0aWVzIik7Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW06OnJlcG9ydE1lbW9y
eVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAg
TWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9y
eVR5cGVzOjpDU1MpOwotICAgIGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQcm9wZXJ0aWVzLCAibWF0
Y2hlZFByb3BlcnRpZXMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihyYW5nZXMsICJyYW5nZXMiKTsK
LSAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwgInJlbmRlclN0eWxlIik7Ci0gICAgaW5m
by5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5kZXJTdHlsZSIpOwotfQot
Ci12b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdElu
Zm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Ci17Ci0gICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8o
bWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1MpOwotICAgIGlu
Zm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJlc3Npb24iKTsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmpl
Y3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdElu
Zm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlciht
X3J1bGVTZXRzLCAicnVsZVNldHMiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2tleWZyYW1lc1J1
bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9tYXRjaGVk
UHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIpOwotICAgIGluZm8uYWRk
TWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIsICJtYXRjaGVkUHJvcGVy
dGllc0NhY2hlU3dlZXBUaW1lciIpOwotCi0gICAgaW5mby5hZGRNZW1iZXIobV9tZWRpdW0sICJt
ZWRpdW0iKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0U3R5bGUsICJyb290RGVm
YXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVudCwgImRvY3VtZW50Iik7
Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxlY3RvciwgImZvbnRTZWxlY3RvciIpOwot
ICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cywg
InZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMiKTsKLSAgICBpbmZvLmlnbm9yZU1l
bWJlcihtX3N0eWxlQnVpbGRlcik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9pbnNwZWN0b3JDU1NP
TVdyYXBwZXJzKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX3Njb3BlUmVzb2x2ZXIsICJzY29wZVJl
c29sdmVyIik7Ci0KLSAgICBpbmZvLmFkZE1lbWJlcihtX3N0YXRlLCAic3RhdGUiKTsKLQotICAg
IC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3b3VsZCBiZSBjYWxsZWQg
b25seSBvbmNlPwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVm
YXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1iZXIoQ1NTRGVmYXVs
dFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0UXVpcmtzU3R5bGUiKTsK
LSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0
eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1bHRWaWV3U291cmNlU3R5
bGUiKTsKKyAgICByZXR1cm4gbV9tYXRjaGVkUnVsZXMgJiYgIW1fbWF0Y2hlZFJ1bGVzLT5pc0Vt
cHR5KCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2Nzcy9FbGVtZW50UnVsZUNvbGxlY3Rvci5oCShyZXZpc2lvbiAxNDUxODEpCShmcm9tIFNvdXJj
ZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmg6MTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUv
Y3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykK
KyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAw
OSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVm
IFN0eWxlUmVzb2x2ZXJfaAorI2RlZmluZSBTdHlsZVJlc29sdmVyX2gKKworI2luY2x1ZGUgIkNT
U1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NTVG9TdHlsZU1hcC5oIgorI2luY2x1ZGUgIkNTU1Zh
bHVlTGlzdC5oIgorI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJJbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzLmgiCisjaW5jbHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRlICJN
ZWRpYVF1ZXJ5RXhwLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJSdWxl
RmVhdHVyZS5oIgorI2luY2x1ZGUgIlJ1bGVTZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxl
ZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKKyNpbmNsdWRlICJTZWxlY3Rv
ckNoZWNrZXIuaCIKKyNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlN0eWxl
SW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUgIlN0eWxlU2NvcGVSZXNvbHZlci5oIgorI2luY2x1
ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5oIgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYg
RU5BQkxFKFNWRykKKyNpbmNsdWRlICJXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisjZW5k
aWYKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+Cisj
aW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5n
SGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0gRVNtYXJ0TWluaW11bUZvckZv
bnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVt
Rm9yRm9udEZpemUgfTsKKworY2xhc3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKK2NsYXNzIENTU0Zv
bnRTZWxlY3RvcjsKK2NsYXNzIENTU0ZvbnRGYWNlOworY2xhc3MgQ1NTRm9udEZhY2VSdWxlOwor
Y2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZTsKK2NsYXNzIENTU0ltYWdlU2V0VmFsdWU7Citj
bGFzcyBDU1NJbWFnZVZhbHVlOworY2xhc3MgQ1NTUGFnZVJ1bGU7CitjbGFzcyBDU1NQcmltaXRp
dmVWYWx1ZTsKK2NsYXNzIENTU1Byb3BlcnR5OworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFzcyBD
U1NTZWxlY3RvcjsKK2NsYXNzIENTU1N0eWxlU2hlZXQ7CitjbGFzcyBDU1NWYWx1ZTsKK2NsYXNz
IENvbnRhaW5lck5vZGU7CitjbGFzcyBDdXN0b21GaWx0ZXJPcGVyYXRpb247CitjbGFzcyBDdXN0
b21GaWx0ZXJQYXJhbWV0ZXI7CitjbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OworY2xh
c3MgRG9jdW1lbnQ7CitjbGFzcyBFbGVtZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZVZp
ZXc7CitjbGFzcyBLVVJMOworY2xhc3MgS2V5ZnJhbWVMaXN0OworY2xhc3MgS2V5ZnJhbWVWYWx1
ZTsKK2NsYXNzIE1lZGlhUXVlcnlFdmFsdWF0b3I7CitjbGFzcyBOb2RlOworY2xhc3MgUmVuZGVy
UmVnaW9uOworY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOworY2xhc3MgUnVsZURhdGE7CitjbGFzcyBS
dWxlU2V0OworY2xhc3MgU2V0dGluZ3M7CitjbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKK2NsYXNz
IFN0eWxlQnVpbGRlcjsKK2NsYXNzIFN0eWxlU2NvcGVSZXNvbHZlcjsKK2NsYXNzIFN0eWxlSW1h
Z2U7CitjbGFzcyBTdHlsZUtleWZyYW1lOworY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7CitjbGFz
cyBTdHlsZVByb3BlcnR5U2V0OworY2xhc3MgU3R5bGVSdWxlOworI2lmIEVOQUJMRShTSEFET1df
RE9NKQorY2xhc3MgU3R5bGVSdWxlSG9zdDsKKyNlbmRpZgorY2xhc3MgU3R5bGVSdWxlS2V5ZnJh
bWVzOworY2xhc3MgU3R5bGVSdWxlUGFnZTsKK2NsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKK2NsYXNz
IFN0eWxlU2hhZGVyOworY2xhc3MgU3R5bGVTaGVldDsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0Owor
Y2xhc3MgU3R5bGVkRWxlbWVudDsKK2NsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKK2NsYXNz
IFdlYktpdENTU0ZpbHRlclZhbHVlOworY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7CitjbGFz
cyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlOworCitjbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0IHsK
KyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0VfRkFT
VF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1
ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkKKyAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhwcikK
KyAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQpCisgICAgeworICAgIH0KKyAgICB2b2lkIHJlcG9y
dE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKworICAgIE1lZGlhUXVlcnlF
eHAgbV9leHByZXNzaW9uOworICAgIGJvb2wgbV9yZXN1bHQ7Cit9OworCitlbnVtIFN0eWxlU2hh
cmluZ0JlaGF2aW9yIHsKKyAgICBBbGxvd1N0eWxlU2hhcmluZywKKyAgICBEaXNhbGxvd1N0eWxl
U2hhcmluZywKK307CisKKy8vIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4gbWVk
aWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUgdW5pdHMKKy8vIGFyZSBpbnRlcnByZXRlZCBhY2Nv
cmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBvbmx5
CisvLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0eWxlc2hlZXQgcnVsZXMuCisKK2VudW0gUnVsZU1h
dGNoaW5nQmVoYXZpb3IgeworICAgIE1hdGNoQWxsUnVsZXMsCisgICAgTWF0Y2hBbGxSdWxlc0V4
Y2x1ZGluZ1NNSUwsCisgICAgTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMsCit9OworCitjbGFzcyBQ
c2V1ZG9TdHlsZVJlcXVlc3QgeworcHVibGljOgorICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1
ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxiYXJQ
YXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQpCisgICAgICAgIDogcHNldWRvSWQocHNldWRvSWQp
CisgICAgICAgICwgc2Nyb2xsYmFyUGFydChzY3JvbGxiYXJQYXJ0KQorICAgICAgICAsIHNjcm9s
bGJhcihzY3JvbGxiYXIpCisgICAgeworICAgIH0KKworICAgIFBzZXVkb0lkIHBzZXVkb0lkOwor
ICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFyUGFydDsKKyAgICBSZW5kZXJTY3JvbGxiYXIqIHNj
cm9sbGJhcjsKK307CisKK2NsYXNzIE1hdGNoUmVxdWVzdCB7CitwdWJsaWM6CisgICAgTWF0Y2hS
ZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwg
Y29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9y
QXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RD
cm9zc0JvdW5kYXJ5KQorICAgICAgICA6IHJ1bGVTZXQocnVsZVNldCkKKyAgICAgICAgLCBpbmNs
dWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlSdWxlcykKKyAgICAgICAgLCBzY29wZShzY29wZSkK
KyAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0KKyAg
ICBjb25zdCBSdWxlU2V0KiBydWxlU2V0OworICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXM7CisgICAgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGU7CisgICAgY29uc3QgU2VsZWN0b3JD
aGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OworfTsKKworLy8g
VGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBiYXNl
ZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVzaGVldHMuCitjbGFzcyBTdHlsZVJlc29sdmVyIHsK
KyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFTVF9B
TExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3R5bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wgbWF0
Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKKyAgICB+U3R5bGVSZXNvbHZlcigpOworCisgICAgLy8g
VXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2FsayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9yIHRv
IG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5kYW50IHNlbGVjdG9yIGxvb2t1cHMuCisgICAgdm9p
ZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50Kik7CisgICAgdm9pZCBwb3BQYXJlbnRFbGVtZW50
KEVsZW1lbnQqKTsKKyAgICB2b2lkIHB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jv
b3QqKTsKKyAgICB2b2lkIHBvcFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOwor
I2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxlSG9z
dCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWluZXJO
b2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJlc29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUsIGhh
c0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNjb3BlKTsgfQorI2VuZGlmCisKKyAgICBQYXNzUmVm
UHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmluZ0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJpbmcs
CisgICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVyUmVn
aW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7CisKKyAgICB2b2lkIGtleWZyYW1lU3R5bGVzRm9y
QW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBSZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYpOwor
CisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1l
bnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUp
OworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdlSW5k
ZXgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1lbnQo
KTsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOworCisg
ICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9jdW1l
bnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBj
b25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxlKCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcGFyZW50
U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBhcmVudFN0eWxlKCk7IH0KKyAgICBSZW5k
ZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9vdEVs
ZW1lbnRTdHlsZSgpOyB9CisgICAgRWxlbWVudCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3RhdGUu
ZWxlbWVudCgpOyB9CisgICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1bWVu
dDsgfQorICAgIFN0eWxlU2NvcGVSZXNvbHZlciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsgcmV0
dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsgfQorICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Tm9kZSgpOyB9CisKKyAgICAvLyBGSVhNRTogSXQg
Y291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9ydWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0
cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3RvciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KKyAgICAv
LyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCisgICAgdm9p
ZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9y
PFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBydWxl
U2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKyAgICBjb25zdCBEb2N1bWVudFJ1bGVTZXRz
JiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKworI2lmIEVOQUJMRShT
VFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFET1dfRE9NKQorICAgIFN0eWxlU2NvcGVSZXNvbHZl
ciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCisgICAgeworI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQp
CisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZl
YXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkgfHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5
bGVTY29wZWRFbmFibGVkKCkpOworI2Vsc2UKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVk
RmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAg
QVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7CisjZW5k
aWYKKyAgICAgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgICAgICBtX3Njb3BlUmVz
b2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVTY29wZVJlc29sdmVyKCkpOworICAgICAgICByZXR1
cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOworICAgIH0KKyNlbmRpZgorCitwcml2YXRlOgorICAg
IHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCopOworICAgIFJlbmRlclN0eWxlKiBsb2NhdGVTaGFy
ZWRTdHlsZSgpOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQo
UnVsZVNldCopOworICAgIGJvb2wgc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxl
cygpOworICAgIE5vZGUqIGxvY2F0ZUNvdXNpbkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25l
ZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7CisgICAgU3R5bGVkRWxlbWVudCogZmluZFNpYmxp
bmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVuc2lnbmVkJiBjb3VudCkgY29uc3Q7CisgICAgYm9v
bCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAg
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHls
ZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBLZXlmcmFtZVZhbHVlJik7CisKK3B1YmxpYzoKKyAg
ICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhhdCBt
YXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgKG9yIGEgcHNldWRvLWVsZW1lbnQpLgorICAgIGVu
dW0gQ1NTUnVsZUZpbHRlciB7CisgICAgICAgIFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8IDEs
CisgICAgICAgIEF1dGhvckNTU1J1bGVzICAgICAgPSAxIDw8IDIsCisgICAgICAgIEVtcHR5Q1NT
UnVsZXMgICAgICAgPSAxIDw8IDMsCisgICAgICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAxIDw8
IDQsCisgICAgICAgIEFsbEJ1dEVtcHR5Q1NTUnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8IEF1
dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5DU1NSdWxlcywKKyAgICAgICAgQWxsQ1NTUnVsZXMg
ICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMgfCBFbXB0eUNTU1J1bGVzLAorICAgIH07Cisg
ICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gc3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCos
IHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7CisgICAgUGFz
c1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCos
IFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMp
OworCisgICAgLy8gR2l2ZW4gYSBDU1Mga2V5d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxsIHRv
IC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICAgIC8vIHRo
ZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZhdWx0
IChtZWRpdW0pLgorICAgIHN0YXRpYyBmbG9hdCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQq
LCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKKworICAgIC8v
IEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVsLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGxl
Z2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFuZCA3LgorICAgIHN0YXRpYyBpbnQgbGVnYWN5Rm9u
dFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERl
ZmF1bHRTaXplKTsKKworcHVibGljOgorICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NT
UHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5kZXJTdHlsZSopOworCisgICAgdm9pZCBhcHBseVBy
b3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKworICAgIHZv
aWQgdXBkYXRlRm9udCgpOworICAgIHZvaWQgaW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5ncyop
OworCisgICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERv
Y3VtZW50KiwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3Bl
Y2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVtRm9y
Rm9udEZpemUpOworCisgICAgdm9pZCBzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mLCBmbG9h
dCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJv
bVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBSZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0ZVNp
emUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKTsKKworcHVibGlj
OgorICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVzKCk7CisKKyAgICBzdGF0aWMgYm9vbCBjb2xvckZy
b21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVlKik7
CisgICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqLCBi
b29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2UpIGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxlY3Rv
ckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0b3JG
b3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIGhhc1NlbGVjdG9y
Rm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OworCisgICAgQ1NTRm9udFNl
bGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5nZXQo
KTsgfQorI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgVmlld3BvcnRTdHls
ZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0U3R5
bGVSZXNvbHZlci5nZXQoKTsgfQorI2VuZGlmCisKKyAgICB2b2lkIGFkZFZpZXdwb3J0RGVwZW5k
ZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQpOwor
ICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJldHVy
biAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQorICAg
IGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZEtl
eWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+KTsKKworICAgIGJvb2wg
Y2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKworICAgIGJvb2wgdXNl
c1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCkuc2li
bGluZ1J1bGVzLmlzRW1wdHkoKTsgfQorICAgIGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkgY29u
c3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsgfQor
ICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVsZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRz
LmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVyUnVsZXM7IH0KKworICAgIHN0YXRpYyBib29sIGNy
ZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBp
blN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRP
cGVyYXRpb25zKTsKKyAgICAKKyAgICB2b2lkIGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0Nh
Y2hlKCk7CisKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCisgICAgYm9vbCBjcmVhdGVGaWx0ZXJP
cGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVy
U3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7CisjaWYg
RU5BQkxFKENTU19TSEFERVJTKQorICAgIFN0eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NWYWx1
ZSopOworICAgIFN0eWxlU2hhZGVyKiBjYWNoZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1
ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOworICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQYXJh
bWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYpOworICAgIFBh
c3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRl
cihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21G
aWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3Ry
aW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBu
YW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRl
cj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1l
LCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4g
Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9u
PiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KFdlYktpdENTU0Zp
bHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0
ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIHZvaWQg
bG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5kaWYKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZvaWQg
bG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsKKyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShDU1Nf
RklMVEVSUykKKworICAgIHZvaWQgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworcHJpdmF0ZToK
KyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpZiBp
dCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQgZ2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hhbmdl
ZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0eWxl
KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNoYW5n
ZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7CisKKyAgICB2b2lkIGFk
anVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSog
cGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKKworICAgIHN0cnVjdCBSdWxlUmFuZ2UgeworICAgICAg
ICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJbmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmly
c3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgpLCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgp
IHsgfQorICAgICAgICBpbnQmIGZpcnN0UnVsZUluZGV4OworICAgICAgICBpbnQmIGxhc3RSdWxl
SW5kZXg7CisgICAgfTsKKworICAgIHN0cnVjdCBNYXRjaFJhbmdlcyB7CisgICAgICAgIE1hdGNo
UmFuZ2VzKCkgOiBmaXJzdFVBUnVsZSgtMSksIGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1
bGUoLTEpLCBsYXN0QXV0aG9yUnVsZSgtMSksIGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1
bGUoLTEpIHsgfQorICAgICAgICBpbnQgZmlyc3RVQVJ1bGU7CisgICAgICAgIGludCBsYXN0VUFS
dWxlOworICAgICAgICBpbnQgZmlyc3RBdXRob3JSdWxlOworICAgICAgICBpbnQgbGFzdEF1dGhv
clJ1bGU7CisgICAgICAgIGludCBmaXJzdFVzZXJSdWxlOworICAgICAgICBpbnQgbGFzdFVzZXJS
dWxlOworICAgICAgICBSdWxlUmFuZ2UgVUFSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2Uo
Zmlyc3RVQVJ1bGUsIGxhc3RVQVJ1bGUpOyB9CisgICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxl
UmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVs
ZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIHVzZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFu
Z2UoZmlyc3RVc2VyUnVsZSwgbGFzdFVzZXJSdWxlKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3Qg
TWF0Y2hlZFByb3BlcnRpZXMgeworICAgICAgICBNYXRjaGVkUHJvcGVydGllcygpOworICAgICAg
ICB+TWF0Y2hlZFByb3BlcnRpZXMoKTsKKyAgICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShN
ZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7CisgICAgICAgIAorICAgICAgICBSZWZQdHI8U3R5bGVQ
cm9wZXJ0eVNldD4gcHJvcGVydGllczsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgc3Ry
dWN0IHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKKyAgICAg
ICAgICAgICAgICB1bnNpZ25lZCB3aGl0ZWxpc3RUeXBlIDogMjsKKyAgICAgICAgICAgIH07Cisg
ICAgICAgICAgICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlh
bGl6ZWQgc2luY2Ugd2UgY29tcHV0ZSB0aGUgaGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9i
amVjdC4KKyAgICAgICAgICAgIHZvaWQqIHBvc3NpYmx5UGFkZGVkTWVtYmVyOworICAgICAgICB9
OworICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0Y2hSZXN1bHQgeworICAgICAgICBNYXRjaFJlc3Vs
dCgpIDogaXNDYWNoZWFibGUodHJ1ZSkgeyB9CisgICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVy
dGllcywgNjQ+IG1hdGNoZWRQcm9wZXJ0aWVzOworICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwg
NjQ+IG1hdGNoZWRSdWxlczsKKyAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBi
b29sIGlzQ2FjaGVhYmxlOworICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJv
cGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMs
IFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2Vy
OjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25l
KTsKKyAgICB2b2lkIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOworCisgICAgdm9p
ZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMp
OworICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0Jik7CisgICAgdm9pZCBtYXRjaFVB
UnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVz
KE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFVz
ZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQg
bWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMpOworICAgIHZvaWQgbWF0Y2hIb3N0UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVF
bXB0eVJ1bGVzKTsKKworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hS
ZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJl
Z2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RN
YXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBWZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hS
ZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisKKyAgICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25z
dCBSdWxlRGF0YSYpIGNvbnN0OworICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZv
aWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0Jik7CisKKyAgICBib29s
IHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUs
IFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3Rv
ckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KTsKKyAgICBib29sIGNoZWNrUmVnaW9uU2Vs
ZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25F
bGVtZW50KTsKKyAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1
bHQmLCBjb25zdCBFbGVtZW50Kik7CisgICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7Cisj
aWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCisj
ZW5kaWYKKyAgICAgICAgSGlnaFByaW9yaXR5UHJvcGVydGllcywKKyAgICAgICAgTG93UHJpb3Jp
dHlQcm9wZXJ0aWVzCisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3Mg
cGFzcz4KKyAgICB2b2lkIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQm
LCBib29sIGltcG9ydGFudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhl
cml0ZWRPbmx5KTsKKyAgICB0ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAg
ICB2b2lkIGFwcGx5UHJvcGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVz
LCBTdHlsZVJ1bGUqLCBib29sIGlzSW1wb3J0YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3Bl
cnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CisjaWYgRU5BQkxFKENT
U19WQVJJQUJMRVMpCisgICAgdm9pZCByZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENT
U1ZhbHVlKiwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3du
RXhwcmVzc2lvbnMpOworI2VuZGlmCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxl
UHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIHN0
YXRpYyBib29sIGlzVmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQpOworI2VuZGlm
CisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlz
TGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAg
IHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNo
ZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7CisgICAgU2V0dGluZ3Mq
IGRvY3VtZW50U2V0dGluZ3MoKSB7IHJldHVybiBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9CisK
KyAgICBib29sIGlzTGVmdFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBpc1Jp
Z2h0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5k
ZXgpOyB9CisgICAgYm9vbCBpc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBT
dHJpbmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRleCkgY29uc3Q7CisKKyAgICBEb2N1bWVudFJ1bGVT
ZXRzIG1fcnVsZVNldHM7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCos
IFJlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+ID4gS2V5ZnJhbWVzUnVsZU1hcDsKKyAgICBLZXlm
cmFtZXNSdWxlTWFwIG1fa2V5ZnJhbWVzUnVsZU1hcDsKKworcHVibGljOgorICAgIHR5cGVkZWYg
SGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBSZWZQdHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJv
cGVydHlNYXA7CisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgIHR5
cGVkZWYgSGFzaE1hcDxGaWx0ZXJPcGVyYXRpb24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1l
bnRWYWx1ZT4gPiBQZW5kaW5nU1ZHRG9jdW1lbnRNYXA7CisjZW5kaWYKKworICAgIGNsYXNzIFN0
YXRlIHsKKyAgICAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoU3RhdGUpOworICAgIHB1YmxpYzoK
KyAgICAgICAgU3RhdGUoKQorICAgICAgICA6IG1fZWxlbWVudCgwKQorICAgICAgICAsIG1fc3R5
bGVkRWxlbWVudCgwKQorICAgICAgICAsIG1fcGFyZW50Tm9kZSgwKQorICAgICAgICAsIG1fcGFy
ZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3Jvb3RFbGVtZW50U3R5bGUoMCkKKyAgICAgICAgLCBt
X3JlZ2lvbkZvclN0eWxpbmcoMCkKKyAgICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQor
ICAgICAgICAsIG1fcHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKQorICAgICAgICAsIG1fZWxl
bWVudExpbmtTdGF0ZShOb3RJbnNpZGVMaW5rKQorICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0lu
c2VydGlvblBvaW50KGZhbHNlKQorICAgICAgICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1
bGVzKGZhbHNlKQorICAgICAgICAsIG1fbW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0
eWxlKQorICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCisgICAg
ICAgICwgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZhbHNlKQorI2lmIEVOQUJM
RShDU1NfU0hBREVSUykKKyAgICAgICAgLCBtX2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQorI2Vu
ZGlmCisgICAgICAgICwgbV9saW5lSGVpZ2h0VmFsdWUoMCkKKyAgICAgICAgLCBtX2ZvbnREaXJ0
eShmYWxzZSkKKyAgICAgICAgLCBtX2hhc1VBQXBwZWFyYW5jZShmYWxzZSkKKyAgICAgICAgLCBt
X2JhY2tncm91bmREYXRhKEJhY2tncm91bmRGaWxsTGF5ZXIpIHsgfQorCisgICAgcHVibGljOgor
ICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICAgICAgdm9pZCBpbml0Rm9y
U3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9Q
U0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9p
ZCBjbGVhcigpOworCisgICAgICAgIERvY3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJu
IG1fZWxlbWVudC0+ZG9jdW1lbnQoKTsgfQorICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29u
c3QgeyByZXR1cm4gbV9lbGVtZW50OyB9CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVs
ZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlZEVsZW1lbnQ7IH0KKyAgICAgICAgdm9pZCBz
ZXRTdHlsZShQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7
IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5n
ZXQoKTsgfQorICAgICAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJl
dHVybiBtX3N0eWxlLnJlbGVhc2UoKTsgfQorCisgICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBl
bnN1cmVSdWxlTGlzdCgpOworICAgICAgICBQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVs
ZUxpc3QoKSB7IHJldHVybiBtX3J1bGVMaXN0LnJlbGVhc2UoKTsgfQorCisgICAgICAgIGNvbnN0
IENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7
IH0KKyAgICAgICAgdm9pZCBzZXRQYXJlbnRTdHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUp
IHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOyB9CisgICAgICAgIFJlbmRlclN0eWxlKiBw
YXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVu
ZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50
U3R5bGU7IH0KKworICAgICAgICBjb25zdCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmco
KSBjb25zdCB7IHJldHVybiBtX3JlZ2lvbkZvclN0eWxpbmc7IH0KKyAgICAgICAgdm9pZCBzZXRT
YW1lT3JpZ2luT25seShib29sIGlzU2FtZU9yaWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9
IGlzU2FtZU9yaWdpbk9ubHk7IH0KKyAgICAgICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29u
c3QgeyByZXR1cm4gbV9zYW1lT3JpZ2luT25seTsgfQorICAgICAgICBjb25zdCBQc2V1ZG9TdHls
ZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5
bGVSZXF1ZXN0OyB9CisgICAgICAgIEVJbnNpZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25z
dCB7IHJldHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KKyAgICAgICAgYm9vbCBkaXN0cmlidXRl
ZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRp
b25Qb2ludDsgfQorICAgICAgICB2b2lkIHNldEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhi
b29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVj
dGVkOyB9CisgICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3Qg
eyByZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXM7IH0KKyAgICAgICAgdm9pZCBz
ZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAg
ICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7
IH0KKyAgICAgICAgCisgICAgICAgIHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxl
KGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7
IH0KKyAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wg
aXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9
CisgICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1
cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0KKyAgICAgICAgYm9vbCBhcHBseVBy
b3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5
VG9WaXNpdGVkTGlua1N0eWxlOyB9CisgICAgICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBw
ZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkgeyByZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVz
OyB9CisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgICAgICBQZW5k
aW5nU1ZHRG9jdW1lbnRNYXAmIHBlbmRpbmdTVkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRp
bmdTVkdEb2N1bWVudHM7IH0KKyNlbmRpZgorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAg
ICAgdm9pZCBzZXRIYXNQZW5kaW5nU2hhZGVycyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1f
aGFzUGVuZGluZ1NoYWRlcnMgPSBoYXNQZW5kaW5nU2hhZGVyczsgfQorICAgICAgICBib29sIGhh
c1BlbmRpbmdTaGFkZXJzKCkgY29uc3QgeyByZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQor
I2VuZGlmCisKKyAgICAgICAgdm9pZCBzZXRMaW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVl
KSB7IG1fbGluZUhlaWdodFZhbHVlID0gdmFsdWU7IH0KKyAgICAgICAgQ1NTVmFsdWUqIGxpbmVI
ZWlnaHRWYWx1ZSgpIHsgcmV0dXJuIG1fbGluZUhlaWdodFZhbHVlOyB9CisgICAgICAgIHZvaWQg
c2V0Rm9udERpcnR5KGJvb2wgaXNEaXJ0eSkgeyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KKyAg
ICAgICAgYm9vbCBmb250RGlydHkoKSBjb25zdCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQorCisg
ICAgICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5kKCk7CisgICAgICAgIGJvb2wgaGFz
VUFBcHBlYXJhbmNlKCkgY29uc3QgeyByZXR1cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KKyAgICAg
ICAgQm9yZGVyRGF0YSBib3JkZXJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9
CisgICAgICAgIEZpbGxMYXllciBiYWNrZ3JvdW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFj
a2dyb3VuZERhdGE7IH0KKyAgICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyBy
ZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7IH0KKworICAgICAgICBjb25zdCBGb250RGVzY3JpcHRp
b24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigp
OyB9CisgICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9u
KCkgeyByZXR1cm4gbV9wYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAgICAg
dm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3Jp
cHRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnRE
ZXNjcmlwdGlvbik7IH0KKyAgICAgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGly
dHkgfD0gbV9zdHlsZS0+c2V0Wm9vbShmKTsgfQorICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpv
b20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYp
OyB9CisgICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUp
IHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9
CisgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3Jp
ZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRl
eHRPcmllbnRhdGlvbik7IH0KKworICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4m
IG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9CisgICAgICAgIHZvaWQg
YWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBw
ZW5kKHJ1bGUpOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIC8vIEZJWE1FKGJ1
ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgorICAg
ICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhv
ZHMgdG8gYWNjZXNzCisgICAgICAgIC8vIHRoZXNlIHZhcmlhYmxlcy4KKyAgICAgICAgRWxlbWVu
dCogbV9lbGVtZW50OworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fc3R5bGU7CisgICAg
ICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVkRWxlbWVudDsKKyAgICAgICAgQ29udGFpbmVyTm9k
ZSogbV9wYXJlbnROb2RlOworICAgICAgICBSZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsKKyAg
ICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHlsZTsKKyAgICAgICAgCisgICAgICAg
IFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOworICAgICAgICBib29sIG1fc2FtZU9y
aWdpbk9ubHk7CisgICAgICAgIFBzZXVkb1N0eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVz
dDsKKworICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRMaW5rU3RhdGU7CisKKyAgICAgICAg
Ym9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsKKworICAgICAgICBib29sIG1fZWxl
bWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOworCisgICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9k
ZSBtX21vZGU7CisKKyAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2Yg
bWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKKyAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5
IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgorICAgICAgICBWZWN0b3I8Y29uc3QgUnVs
ZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7CisgICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxl
TGlzdD4gbV9ydWxlTGlzdDsKKworICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxh
clN0eWxlOworICAgICAgICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsK
KworICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCBtX3BlbmRpbmdJbWFnZVByb3BlcnRp
ZXM7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgICAgICBib29sIG1faGFzUGVuZGluZ1No
YWRlcnM7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisg
ICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1hcCBtX3BlbmRpbmdTVkdEb2N1bWVudHM7CisjZW5k
aWYKKyAgICAgICAgQ1NTVmFsdWUqIG1fbGluZUhlaWdodFZhbHVlOworICAgICAgICBib29sIG1f
Zm9udERpcnR5OworCisgICAgICAgIGJvb2wgbV9oYXNVQUFwcGVhcmFuY2U7CisgICAgICAgIEJv
cmRlckRhdGEgbV9ib3JkZXJEYXRhOworICAgICAgICBGaWxsTGF5ZXIgbV9iYWNrZ3JvdW5kRGF0
YTsKKyAgICAgICAgQ29sb3IgbV9iYWNrZ3JvdW5kQ29sb3I7CisgICAgfTsKKworICAgIHN0YXRp
YyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRBdmFpbGFibGUoKSB7IHJldHVybiBzX3N0eWxlTm90
WWV0QXZhaWxhYmxlOyB9CisKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IHN0eWxlSW1hZ2Uo
Q1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGNh
Y2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZVZhbHVlKik7Cisg
ICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NT
UHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSopOworI2lmIEVOQUJMRShDU1NfSU1B
R0VfU0VUKQorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gc2V0T3JQZW5kaW5nRnJvbVZhbHVl
KENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0VmFsdWUqKTsKKyNlbmRpZgorICAgIFBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENT
U0N1cnNvckltYWdlVmFsdWUqKTsKKworICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUo
KTsgfQorICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsg
cmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZSgpOyB9CisKKyAg
ICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJl
bmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAx
KTsKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZh
bHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlw
bGllciA9IDEpOworCisgICAgQ1NTVG9TdHlsZU1hcCogc3R5bGVNYXAoKSB7IHJldHVybiAmbV9z
dHlsZU1hcDsgfQorICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3Jh
cHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3RvckNTU09NV3JhcHBlcnM7IH0KKyAgICBjb25zdCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUuZm9udERl
c2NyaXB0aW9uKCk7IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnREZXNj
cmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUucGFyZW50Rm9udERlc2NyaXB0aW9uKCk7IH0KKyAg
ICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNj
cmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9
CisgICAgdm9pZCBzZXRab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5zZXRab29tKGYpOyB9CisgICAg
dm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9zdGF0ZS5zZXRFZmZlY3RpdmVab29t
KGYpOyB9CisgICAgdm9pZCBzZXRXcml0aW5nTW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkg
eyBtX3N0YXRlLnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2RlKTsgfQorICAgIHZvaWQgc2V0VGV4
dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5z
ZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVudGF0aW9uKTsgfQorICAgIAorICAgIHZvaWQgcmVw
b3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OworICAgIAorcHJpdmF0ZToK
KyAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CisKKyAgICB2
b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOworCitwcml2YXRlOgorICAgIGJvb2wgY2Fu
U2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZvaWQg
YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOworCisjaWYgRU5BQkxFKFNW
RykKKyAgICB2b2lkIGFwcGx5U1ZHUHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsK
KyNlbmRpZgorCisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdlKFN0
eWxlUGVuZGluZ0ltYWdlKik7CisgICAgdm9pZCBsb2FkUGVuZGluZ0ltYWdlcygpOworCisgICAg
c3RhdGljIHVuc2lnbmVkIGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXMqLCB1bnNpZ25lZCBzaXplKTsKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRp
ZXNDYWNoZUl0ZW0geworICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qKSBjb25zdDsKKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVk
UHJvcGVydGllczsKKyAgICAgICAgTWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBSZWZQdHI8
UmVuZGVyU3R5bGU+IHJlbmRlclN0eWxlOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBh
cmVudFJlbmRlclN0eWxlOworICAgIH07CisgICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZUl0ZW0qIGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25z
dCBNYXRjaFJlc3VsdCYpOworICAgIHZvaWQgYWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNv
bnN0IFJlbmRlclN0eWxlKiwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25l
ZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOworCisgICAgLy8gRXZlcnkgTiBhZGRpdGlvbnMg
dG8gdGhlIG1hdGNoZWQgZGVjbGFyYXRpb24gY2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJlIGVu
dHJpZXMgaG9sZGluZworICAgIC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRlY2xh
cmF0aW9uIGFyZSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICB2b2lkIHN3ZWVwTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopOworCisgICAgYm9vbCBjbGFzc05hbWVz
QWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmKSBjb25zdDsKKyAgICBib29s
IHNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5
bGVkRWxlbWVudCopIGNvbnN0OworCisgICAgdW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGllc0Nh
Y2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXA7CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8dW5zaWdu
ZWQsIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hlOwor
ICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOworCisg
ICAgVGltZXI8U3R5bGVSZXNvbHZlcj4gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1l
cjsKKworICAgIE93blB0cjxNZWRpYVF1ZXJ5RXZhbHVhdG9yPiBtX21lZGl1bTsKKyAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IG1fcm9vdERlZmF1bHRTdHlsZTsKKworICAgIERvY3VtZW50KiBtX2Rv
Y3VtZW50OworICAgIFNlbGVjdG9yRmlsdGVyIG1fc2VsZWN0b3JGaWx0ZXI7CisKKyAgICBib29s
IG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzOworCisgICAgUmVmUHRyPENTU0ZvbnRTZWxlY3Rv
cj4gbV9mb250U2VsZWN0b3I7CisgICAgVmVjdG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+
IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0czsKKworI2lmIEVOQUJMRShDU1Nf
REVWSUNFX0FEQVBUQVRJT04pCisgICAgUmVmUHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4gbV92
aWV3cG9ydFN0eWxlUmVzb2x2ZXI7CisjZW5kaWYKKworICAgIGNvbnN0IFN0eWxlQnVpbGRlciYg
bV9zdHlsZUJ1aWxkZXI7CisKKyAgICBPd25QdHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3Bl
UmVzb2x2ZXI7CisgICAgQ1NTVG9TdHlsZU1hcCBtX3N0eWxlTWFwOworICAgIEluc3BlY3RvckNT
U09NV3JhcHBlcnMgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOworCisgICAgU3RhdGUgbV9zdGF0
ZTsKKworICAgIGZyaWVuZCBjbGFzcyBTdHlsZUJ1aWxkZXI7CisgICAgZnJpZW5kIGJvb2wgb3Bl
cmF0b3I9PShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVz
Jik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYs
IGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShj
b25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7CisgICAgZnJpZW5kIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Cit9Owor
CitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShjb25z
dCBBdG9taWNTdHJpbmcgJmF0dHJpYnV0ZU5hbWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFhdHRy
aWJ1dGVOYW1lLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5h
dHRyc0luUnVsZXMuY29udGFpbnMoYXR0cmlidXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxpbmUg
Ym9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmlu
ZyYgY2xhc3NWYWx1ZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0eSgp
KTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRh
aW5zKGNsYXNzVmFsdWUuaW1wbCgpKTsKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6
aGFzU2VsZWN0b3JGb3JJZChjb25zdCBBdG9taWNTdHJpbmcmIGlkVmFsdWUpIGNvbnN0Cit7Cisg
ICAgQVNTRVJUKCFpZFZhbHVlLmlzRW1wdHkoKSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVh
dHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKGlkVmFsdWUuaW1wbCgpKTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU3R5bGVSZXNvbHZlcl9oCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9jc3MvRWxlbWVudFJ1bGVDb2xsZWN0b3IuaAkocmV2aXNpb24gMTQ1MTgxKQor
KysgU291cmNlL1dlYkNvcmUvY3NzL0VsZW1lbnRSdWxlQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTE5LDY3OSArMTksMTA0IEBACiAgKgogICovCiAKLSNpZm5kZWYgU3R5bGVSZXNvbHZl
cl9oCi0jZGVmaW5lIFN0eWxlUmVzb2x2ZXJfaAorI2lmbmRlZiBFbGVtZW50UnVsZUNvbGxlY3Rv
cl9oCisjZGVmaW5lIEVsZW1lbnRSdWxlQ29sbGVjdG9yX2gKIAotI2luY2x1ZGUgIkNTU1J1bGVM
aXN0LmgiCi0jaW5jbHVkZSAiQ1NTVG9TdHlsZU1hcC5oIgotI2luY2x1ZGUgIkNTU1ZhbHVlTGlz
dC5oIgotI2luY2x1ZGUgIkRvY3VtZW50UnVsZVNldHMuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JD
U1NPTVdyYXBwZXJzLmgiCi0jaW5jbHVkZSAiTGlua0hhc2guaCIKLSNpbmNsdWRlICJNZWRpYVF1
ZXJ5RXhwLmgiCi0jaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKLSNpbmNsdWRlICJSdWxlRmVhdHVy
ZS5oIgotI2luY2x1ZGUgIlJ1bGVTZXQuaCIKLSNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1
cmVzLmgiCi0jaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZh
bHVhdG9yLmgiCiAjaW5jbHVkZSAiU2VsZWN0b3JDaGVja2VyLmgiCi0jaW5jbHVkZSAiU2VsZWN0
b3JGaWx0ZXIuaCIKLSNpbmNsdWRlICJTdHlsZUluaGVyaXRlZERhdGEuaCIKLSNpbmNsdWRlICJT
dHlsZVNjb3BlUmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIK
LSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCi0jaW5jbHVkZSAiV2ViS2l0
Q1NTU1ZHRG9jdW1lbnRWYWx1ZS5oIgotI2VuZGlmCi0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4K
LSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKICNp
bmNsdWRlIDx3dGYvUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotI2luY2x1ZGUg
PHd0Zi90ZXh0L0F0b21pY1N0cmluZ0hhc2guaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdI
YXNoLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotZW51bSBFU21hcnRNaW5pbXVtRm9yRm9u
dFNpemUgeyBEb05vdFVzZVNtYXJ0TWluaW11bUZvckZvbnRTaXplLCBVc2VTbWFydE1pbmltdW1G
b3JGb250Rml6ZSB9OwotCi1jbGFzcyBDU1NDdXJzb3JJbWFnZVZhbHVlOwotY2xhc3MgQ1NTRm9u
dFNlbGVjdG9yOwotY2xhc3MgQ1NTRm9udEZhY2U7Ci1jbGFzcyBDU1NGb250RmFjZVJ1bGU7Ci1j
bGFzcyBDU1NJbWFnZUdlbmVyYXRvclZhbHVlOwotY2xhc3MgQ1NTSW1hZ2VTZXRWYWx1ZTsKLWNs
YXNzIENTU0ltYWdlVmFsdWU7Ci1jbGFzcyBDU1NQYWdlUnVsZTsKLWNsYXNzIENTU1ByaW1pdGl2
ZVZhbHVlOwotY2xhc3MgQ1NTUHJvcGVydHk7CiBjbGFzcyBDU1NSdWxlTGlzdDsKLWNsYXNzIENT
U1NlbGVjdG9yOwotY2xhc3MgQ1NTU3R5bGVTaGVldDsKLWNsYXNzIENTU1ZhbHVlOwotY2xhc3Mg
Q29udGFpbmVyTm9kZTsKLWNsYXNzIEN1c3RvbUZpbHRlck9wZXJhdGlvbjsKLWNsYXNzIEN1c3Rv
bUZpbHRlclBhcmFtZXRlcjsKLWNsYXNzIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3Q7Ci1jbGFz
cyBEb2N1bWVudDsKLWNsYXNzIEVsZW1lbnQ7Ci1jbGFzcyBGcmFtZTsKLWNsYXNzIEZyYW1lVmll
dzsKLWNsYXNzIEtVUkw7Ci1jbGFzcyBLZXlmcmFtZUxpc3Q7Ci1jbGFzcyBLZXlmcmFtZVZhbHVl
OwotY2xhc3MgTWVkaWFRdWVyeUV2YWx1YXRvcjsKLWNsYXNzIE5vZGU7CitjbGFzcyBEb2N1bWVu
dFJ1bGVTZXRzOwogY2xhc3MgUmVuZGVyUmVnaW9uOwotY2xhc3MgUmVuZGVyU2Nyb2xsYmFyOwog
Y2xhc3MgUnVsZURhdGE7CiBjbGFzcyBSdWxlU2V0OwotY2xhc3MgU2V0dGluZ3M7Ci1jbGFzcyBT
dGF0aWNDU1NSdWxlTGlzdDsKLWNsYXNzIFN0eWxlQnVpbGRlcjsKK2NsYXNzIFNlbGVjdG9yRmls
dGVyOwogY2xhc3MgU3R5bGVTY29wZVJlc29sdmVyOwotY2xhc3MgU3R5bGVJbWFnZTsKLWNsYXNz
IFN0eWxlS2V5ZnJhbWU7Ci1jbGFzcyBTdHlsZVBlbmRpbmdJbWFnZTsKLWNsYXNzIFN0eWxlUHJv
cGVydHlTZXQ7Ci1jbGFzcyBTdHlsZVJ1bGU7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi1jbGFz
cyBTdHlsZVJ1bGVIb3N0OwotI2VuZGlmCi1jbGFzcyBTdHlsZVJ1bGVLZXlmcmFtZXM7Ci1jbGFz
cyBTdHlsZVJ1bGVQYWdlOwotY2xhc3MgU3R5bGVSdWxlUmVnaW9uOwotY2xhc3MgU3R5bGVTaGFk
ZXI7Ci1jbGFzcyBTdHlsZVNoZWV0OwotY2xhc3MgU3R5bGVTaGVldExpc3Q7Ci1jbGFzcyBTdHls
ZWRFbGVtZW50OwotY2xhc3MgVmlld3BvcnRTdHlsZVJlc29sdmVyOwotY2xhc3MgV2ViS2l0Q1NT
RmlsdGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRDU1NTaGFkZXJWYWx1ZTsKLWNsYXNzIFdlYktpdENT
U1NWR0RvY3VtZW50VmFsdWU7Ci0KLWNsYXNzIE1lZGlhUXVlcnlSZXN1bHQgewotICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKE1lZGlhUXVlcnlSZXN1bHQpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRF
RDsKLXB1YmxpYzoKLSAgICBNZWRpYVF1ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAmIGV4
cHIsIGJvb2wgcmVzdWx0KQotICAgICAgICA6IG1fZXhwcmVzc2lvbihleHByKQotICAgICAgICAs
IG1fcmVzdWx0KHJlc3VsdCkKLSAgICB7Ci0gICAgfQotICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNh
Z2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwotCi0gICAgTWVkaWFRdWVyeUV4cCBtX2V4cHJl
c3Npb247Ci0gICAgYm9vbCBtX3Jlc3VsdDsKLX07Ci0KLWVudW0gU3R5bGVTaGFyaW5nQmVoYXZp
b3IgewotICAgIEFsbG93U3R5bGVTaGFyaW5nLAotICAgIERpc2FsbG93U3R5bGVTaGFyaW5nLAot
fTsKLQotLy8gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMgaXMgdXNlZCBpbiBtZWRpYSBxdWVyaWVz
LCB3aGVyZSByZWxhdGl2ZSB1bml0cwotLy8gYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byB0
aGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50IHN0eWxlLCBhbmQgc3R5bGVkIG9ubHkKLS8vIGZyb20g
dGhlIFVzZXIgQWdlbnQgU3R5bGVzaGVldCBydWxlcy4KLQotZW51bSBSdWxlTWF0Y2hpbmdCZWhh
dmlvciB7Ci0gICAgTWF0Y2hBbGxSdWxlcywKLSAgICBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5nU01J
TCwKLSAgICBNYXRjaE9ubHlVc2VyQWdlbnRSdWxlcywKLX07Ci0KLWNsYXNzIFBzZXVkb1N0eWxl
UmVxdWVzdCB7Ci1wdWJsaWM6Ci0gICAgUHNldWRvU3R5bGVSZXF1ZXN0KFBzZXVkb0lkIHBzZXVk
b0lkLCBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhciA9IDAsIFNjcm9sbGJhclBhcnQgc2Nyb2xs
YmFyUGFydCA9IE5vUGFydCkKLSAgICAgICAgOiBwc2V1ZG9JZChwc2V1ZG9JZCkKLSAgICAgICAg
LCBzY3JvbGxiYXJQYXJ0KHNjcm9sbGJhclBhcnQpCi0gICAgICAgICwgc2Nyb2xsYmFyKHNjcm9s
bGJhcikKLSAgICB7Ci0gICAgfQotCi0gICAgUHNldWRvSWQgcHNldWRvSWQ7Ci0gICAgU2Nyb2xs
YmFyUGFydCBzY3JvbGxiYXJQYXJ0OwotICAgIFJlbmRlclNjcm9sbGJhciogc2Nyb2xsYmFyOwot
fTsKLQotY2xhc3MgTWF0Y2hSZXF1ZXN0IHsKLXB1YmxpYzoKLSAgICBNYXRjaFJlcXVlc3QoUnVs
ZVNldCogcnVsZVNldCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyA9IGZhbHNlLCBjb25zdCBDb250
YWluZXJOb2RlKiBzY29wZSA9IDAsIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5
IGJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRh
cnkpCi0gICAgICAgIDogcnVsZVNldChydWxlU2V0KQotICAgICAgICAsIGluY2x1ZGVFbXB0eVJ1
bGVzKGluY2x1ZGVFbXB0eVJ1bGVzKQotICAgICAgICAsIHNjb3BlKHNjb3BlKQotICAgICAgICAs
IGJlaGF2aW9yQXRCb3VuZGFyeShiZWhhdmlvckF0Qm91bmRhcnkpIHsgfQotICAgIGNvbnN0IFJ1
bGVTZXQqIHJ1bGVTZXQ7Ci0gICAgY29uc3QgYm9vbCBpbmNsdWRlRW1wdHlSdWxlczsKLSAgICBj
b25zdCBDb250YWluZXJOb2RlKiBzY29wZTsKLSAgICBjb25zdCBTZWxlY3RvckNoZWNrZXI6OkJl
aGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnk7Ci19OwotCi0vLyBUaGlzIGNsYXNz
IHNlbGVjdHMgYSBSZW5kZXJTdHlsZSBmb3IgYSBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGEgY29s
bGVjdGlvbiBvZiBzdHlsZXNoZWV0cy4KLWNsYXNzIFN0eWxlUmVzb2x2ZXIgewotICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKFN0eWxlUmVzb2x2ZXIpOyBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsK
LXB1YmxpYzoKLSAgICBTdHlsZVJlc29sdmVyKERvY3VtZW50KiwgYm9vbCBtYXRjaEF1dGhvckFu
ZFVzZXJTdHlsZXMpOwotICAgIH5TdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBVc2luZyB0aGVz
ZSBkdXJpbmcgdHJlZSB3YWxrIHdpbGwgYWxsb3cgc3R5bGUgc2VsZWN0b3IgdG8gb3B0aW1pemUg
Y2hpbGQgYW5kIGRlc2NlbmRhbnQgc2VsZWN0b3IgbG9va3Vwcy4KLSAgICB2b2lkIHB1c2hQYXJl
bnRFbGVtZW50KEVsZW1lbnQqKTsKLSAgICB2b2lkIHBvcFBhcmVudEVsZW1lbnQoRWxlbWVudCop
OwotICAgIHZvaWQgcHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOwotICAg
IHZvaWQgcG9wUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7Ci0jaWYgRU5BQkxF
KFNIQURPV19ET00pCi0gICAgdm9pZCBhZGRIb3N0UnVsZShTdHlsZVJ1bGVIb3N0KiBydWxlLCBi
b29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3Bl
KSB7IGVuc3VyZVNjb3BlUmVzb2x2ZXIoKS0+YWRkSG9zdFJ1bGUocnVsZSwgaGFzRG9jdW1lbnRT
ZWN1cml0eU9yaWdpbiwgc2NvcGUpOyB9Ci0jZW5kaWYKLQotICAgIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IHN0eWxlRm9yRWxlbWVudChFbGVtZW50KiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxl
ID0gMCwgU3R5bGVTaGFyaW5nQmVoYXZpb3IgPSBBbGxvd1N0eWxlU2hhcmluZywKLSAgICAgICAg
UnVsZU1hdGNoaW5nQmVoYXZpb3IgPSBNYXRjaEFsbFJ1bGVzLCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcgPSAwKTsKLQotICAgIHZvaWQga2V5ZnJhbWVTdHlsZXNGb3JBbmltYXRpb24o
RWxlbWVudCosIGNvbnN0IFJlbmRlclN0eWxlKiwgS2V5ZnJhbWVMaXN0Jik7Ci0KLSAgICBQYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBwc2V1ZG9TdHlsZUZvckVsZW1lbnQoRWxlbWVudCosIGNvbnN0
IFBzZXVkb1N0eWxlUmVxdWVzdCYsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0KLSAgICBQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvclBhZ2UoaW50IHBhZ2VJbmRleCk7Ci0gICAg
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpOwotICAgIFBh
c3NSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yVGV4dChUZXh0Kik7Ci0KLSAgICBzdGF0aWMg
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCosIENTU0Zv
bnRTZWxlY3RvciogPSAwKTsKLQotICAgIFJlbmRlclN0eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0
dXJuIG1fc3RhdGUuc3R5bGUoKTsgfQotICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50U3R5bGUoKTsgfQotICAgIFJlbmRlclN0eWxlKiBy
b290RWxlbWVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5yb290RWxlbWVudFN0eWxl
KCk7IH0KLSAgICBFbGVtZW50KiBlbGVtZW50KCkgeyByZXR1cm4gbV9zdGF0ZS5lbGVtZW50KCk7
IH0KLSAgICBEb2N1bWVudCogZG9jdW1lbnQoKSB7IHJldHVybiBtX2RvY3VtZW50OyB9Ci0gICAg
U3R5bGVTY29wZVJlc29sdmVyKiBzY29wZVJlc29sdmVyKCkgY29uc3QgeyByZXR1cm4gbV9zY29w
ZVJlc29sdmVyLmdldCgpOyB9Ci0gICAgYm9vbCBoYXNQYXJlbnROb2RlKCkgY29uc3QgeyByZXR1
cm4gbV9zdGF0ZS5wYXJlbnROb2RlKCk7IH0KLQotICAgIC8vIEZJWE1FOiBJdCBjb3VsZCBiZSBi
ZXR0ZXIgdG8gY2FsbCBtX3J1bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxlU2hlZXRzKCkgZGlyZWN0
bHkgYWZ0ZXIgd2UgZmFjdG9yIFN0eWxlUnNvbHZlciBmdXJ0aGVyLgotICAgIC8vIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDg4OTAKLSAgICB2b2lkIGFwcGVuZEF1
dGhvclN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENT
U1N0eWxlU2hlZXQ+ID4mKTsKLQotICAgIERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRzKCkgeyBy
ZXR1cm4gbV9ydWxlU2V0czsgfQotICAgIGNvbnN0IERvY3VtZW50UnVsZVNldHMmIHJ1bGVTZXRz
KCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0czsgfQotCi0jaWYgRU5BQkxFKFNUWUxFX1NDT1BF
RCkgfHwgRU5BQkxFKFNIQURPV19ET00pCi0gICAgU3R5bGVTY29wZVJlc29sdmVyKiBlbnN1cmVT
Y29wZVJlc29sdmVyKCkKLSAgICB7Ci0jaWYgRU5BQkxFKFNUWUxFX1NDT1BFRCkKLSNpZiBFTkFC
TEUoU0hBRE9XX0RPTSkKLSAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnNo
YWRvd0RPTUVuYWJsZWQoKSB8fCBSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVu
YWJsZWQoKSk7Ci0jZWxzZQotICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6
c3R5bGVTY29wZWRFbmFibGVkKCkpOwotI2VuZGlmCi0jZWxzZQotICAgICAgICBBU1NFUlQoUnVu
dGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93RE9NRW5hYmxlZCgpKTsKLSNlbmRpZgotICAgICAg
ICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAgICAgIG1fc2NvcGVSZXNvbHZlciA9IGFk
b3B0UHRyKG5ldyBTdHlsZVNjb3BlUmVzb2x2ZXIoKSk7Ci0gICAgICAgIHJldHVybiBtX3Njb3Bl
UmVzb2x2ZXIuZ2V0KCk7Ci0gICAgfQotI2VuZGlmCi0KLXByaXZhdGU6Ci0gICAgdm9pZCBpbml0
RWxlbWVudChFbGVtZW50Kik7Ci0gICAgUmVuZGVyU3R5bGUqIGxvY2F0ZVNoYXJlZFN0eWxlKCk7
Ci0gICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChSdWxlU2V0Kik7
Ci0gICAgYm9vbCBzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCk7Ci0gICAg
Tm9kZSogbG9jYXRlQ291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVk
Tm9kZUNvdW50KSBjb25zdDsKLSAgICBTdHlsZWRFbGVtZW50KiBmaW5kU2libGluZ0ZvclN0eWxl
U2hhcmluZyhOb2RlKiwgdW5zaWduZWQmIGNvdW50KSBjb25zdDsKLSAgICBib29sIGNhblNoYXJl
U3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAgICBQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiBzdHlsZUZvcktleWZyYW1lKGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3Qg
U3R5bGVLZXlmcmFtZSosIEtleWZyYW1lVmFsdWUmKTsKLQotcHVibGljOgotICAgIC8vIFRoZXNl
IG1ldGhvZHMgd2lsbCBnaXZlIGJhY2sgdGhlIHNldCBvZiBydWxlcyB0aGF0IG1hdGNoZWQgZm9y
IGEgZ2l2ZW4gZWxlbWVudCAob3IgYSBwc2V1ZG8tZWxlbWVudCkuCi0gICAgZW51bSBDU1NSdWxl
RmlsdGVyIHsKLSAgICAgICAgVUFBbmRVc2VyQ1NTUnVsZXMgICA9IDEgPDwgMSwKLSAgICAgICAg
QXV0aG9yQ1NTUnVsZXMgICAgICA9IDEgPDwgMiwKLSAgICAgICAgRW1wdHlDU1NSdWxlcyAgICAg
ICA9IDEgPDwgMywKLSAgICAgICAgQ3Jvc3NPcmlnaW5DU1NSdWxlcyA9IDEgPDwgNCwKLSAgICAg
ICAgQWxsQnV0RW1wdHlDU1NSdWxlcyA9IFVBQW5kVXNlckNTU1J1bGVzIHwgQXV0aG9yQ1NTUnVs
ZXMgfCBDcm9zc09yaWdpbkNTU1J1bGVzLAotICAgICAgICBBbGxDU1NSdWxlcyAgICAgICAgID0g
QWxsQnV0RW1wdHlDU1NSdWxlcyB8IEVtcHR5Q1NTUnVsZXMsCi0gICAgfTsKLSAgICBQYXNzUmVm
UHRyPENTU1J1bGVMaXN0PiBzdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiwgdW5zaWduZWQg
cnVsZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1bGVzKTsKLSAgICBQYXNzUmVmUHRyPENT
U1J1bGVMaXN0PiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiwgUHNldWRvSWQs
IHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0gQWxsQnV0RW1wdHlDU1NSdWxlcyk7Ci0KLSAgICAv
LyBHaXZlbiBhIENTUyBrZXl3b3JkIGluIHRoZSByYW5nZSAoeHgtc21hbGwgdG8gLXdlYmtpdC14
eHgtbGFyZ2UpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCi0gICAgLy8gdGhlIGNvcnJlY3Qg
Zm9udCBzaXplIHNjYWxlZCByZWxhdGl2ZSB0byB0aGUgdXNlcidzIGRlZmF1bHQgKG1lZGl1bSku
Ci0gICAgc3RhdGljIGZsb2F0IGZvbnRTaXplRm9yS2V5d29yZChEb2N1bWVudCosIGludCBrZXl3
b3JkLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUpOwotCi0gICAgLy8gR2l2ZW4gYSBm
b250IHNpemUgaW4gcGl4ZWwsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gbGVnYWN5IGZvbnQg
c2l6ZSBiZXR3ZWVuIDEgYW5kIDcuCi0gICAgc3RhdGljIGludCBsZWdhY3lGb250U2l6ZShEb2N1
bWVudCosIGludCBwaXhlbEZvbnRTaXplLCBib29sIHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUp
OwotCi1wdWJsaWM6Ci0gICAgdm9pZCBhcHBseVByb3BlcnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlE
LCBDU1NWYWx1ZSosIFJlbmRlclN0eWxlKik7Ci0KLSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb0N1
cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSopOwotCi0gICAgdm9pZCB1cGRhdGVG
b250KCk7Ci0gICAgdm9pZCBpbml0aWFsaXplRm9udFN0eWxlKFNldHRpbmdzKik7Ci0KLSAgICBz
dGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBm
bG9hdCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXpl
LCBFU21hcnRNaW5pbXVtRm9yRm9udFNpemUgPSBVc2VTbWFydE1pbmltdW1Gb3JGb250Rml6ZSk7
Ci0KLSAgICB2b2lkIHNldEZvbnRTaXplKEZvbnREZXNjcmlwdGlvbiYsIGZsb2F0IHNpemUpOwot
Ci1wcml2YXRlOgotICAgIHN0YXRpYyBmbG9hdCBnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVk
U2l6ZShEb2N1bWVudCosIFJlbmRlclN0eWxlKiwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQg
c3BlY2lmaWVkU2l6ZSwgYm9vbCB1c2VTVkdab29tUnVsZXMpOwotCi1wdWJsaWM6Ci0gICAgYm9v
bCB1c2VTVkdab29tUnVsZXMoKTsKLQotICAgIHN0YXRpYyBib29sIGNvbG9yRnJvbVByaW1pdGl2
ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0aXZlVmFsdWUqKTsKLSAgICBDb2xv
ciBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSosIGJvb2wgZm9yVmlz
aXRlZExpbmsgPSBmYWxzZSkgY29uc3Q7Ci0KLSAgICBib29sIGhhc1NlbGVjdG9yRm9ySWQoY29u
c3QgQXRvbWljU3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBoYXNTZWxlY3RvckZvckNsYXNzKGNv
bnN0IEF0b21pY1N0cmluZyYpIGNvbnN0OwotICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JBdHRyaWJ1
dGUoY29uc3QgQXRvbWljU3RyaW5nJikgY29uc3Q7Ci0KLSAgICBDU1NGb250U2VsZWN0b3IqIGZv
bnRTZWxlY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fZm9udFNlbGVjdG9yLmdldCgpOyB9Ci0jaWYg
RU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBWaWV3cG9ydFN0eWxlUmVzb2x2ZXIq
IHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpIHsgcmV0dXJuIG1fdmlld3BvcnRTdHlsZVJlc29sdmVy
LmdldCgpOyB9Ci0jZW5kaWYKLQotICAgIHZvaWQgYWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1
ZXJ5UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqLCBib29sIHJlc3VsdCk7Ci0gICAgYm9vbCBo
YXNWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcmllcygpIGNvbnN0IHsgcmV0dXJuICFtX3ZpZXdw
b3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuaXNFbXB0eSgpOyB9Ci0gICAgYm9vbCBhZmZl
Y3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdDsKLQotICAgIHZvaWQgYWRkS2V5ZnJhbWVTdHls
ZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4pOwotCi0gICAgYm9vbCBjaGVja1JlZ2lv
blN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwotCi0gICAgYm9vbCB1c2VzU2libGluZ1J1
bGVzKCkgY29uc3QgeyByZXR1cm4gIW1fcnVsZVNldHMuZmVhdHVyZXMoKS5zaWJsaW5nUnVsZXMu
aXNFbXB0eSgpOyB9Ci0gICAgYm9vbCB1c2VzRmlyc3RMaW5lUnVsZXMoKSBjb25zdCB7IHJldHVy
biBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0ZpcnN0TGluZVJ1bGVzOyB9Ci0gICAgYm9vbCB1
c2VzQmVmb3JlQWZ0ZXJSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS51c2VzQmVmb3JlQWZ0ZXJSdWxlczsgfQotCi0gICAgc3RhdGljIGJvb2wgY3JlYXRlVHJhbnNm
b3JtT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJl
bmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMp
OwotICAgIAotICAgIHZvaWQgaW52YWxpZGF0ZU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoKTsKLQot
I2lmIEVOQUJMRShDU1NfRklMVEVSUykKLSAgICBib29sIGNyZWF0ZUZpbHRlck9wZXJhdGlvbnMo
Q1NTVmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9v
dFN0eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKLSNpZiBFTkFCTEUoQ1NT
X1NIQURFUlMpCi0gICAgU3R5bGVTaGFkZXIqIHN0eWxlU2hhZGVyKENTU1ZhbHVlKik7Ci0gICAg
U3R5bGVTaGFkZXIqIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKFdlYktpdENT
U1NoYWRlclZhbHVlKik7Ci0gICAgYm9vbCBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3Qo
Q1NTVmFsdWUqLCBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0Jik7Ci0gICAgUGFzc1JlZlB0cjxD
dXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0
cmluZyYgbmFtZSwgQ1NTVmFsdWUqKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFt
ZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUs
IENTU1ZhbHVlTGlzdCopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBw
YXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1Zh
bHVlTGlzdCopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1
c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVl
TGlzdCopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0
b21GaWx0ZXJPcGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KFdlYktpdENTU0ZpbHRl
clZhbHVlKik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1
c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUq
KTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmls
dGVyT3BlcmF0aW9uKFdlYktpdENTU0ZpbHRlclZhbHVlKik7Ci0gICAgdm9pZCBsb2FkUGVuZGlu
Z1NoYWRlcnMoKTsKLSNlbmRpZgotI2lmIEVOQUJMRShTVkcpCi0gICAgdm9pZCBsb2FkUGVuZGlu
Z1NWR0RvY3VtZW50cygpOwotI2VuZGlmCi0jZW5kaWYgLy8gRU5BQkxFKENTU19GSUxURVJTKQot
Ci0gICAgdm9pZCBsb2FkUGVuZGluZ1Jlc291cmNlcygpOwotCi1wcml2YXRlOgotICAgIC8vIFRo
aXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRlZmF1bHQgZm9udCBzaXplIGlmIGl0IGRldGVjdHMg
dGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZvbnQgZmFtaWx5IGhhcyBjaGFuZ2VkLiAtZHdoCi0g
ICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpOwotICAgIHZvaWQgY2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0
eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLQotICAgIHZvaWQgYWRqdXN0UmVuZGVy
U3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHls
ZSwgRWxlbWVudCopOwotCi0gICAgc3RydWN0IFJ1bGVSYW5nZSB7Ci0gICAgICAgIFJ1bGVSYW5n
ZShpbnQmIGZpcnN0UnVsZUluZGV4LCBpbnQmIGxhc3RSdWxlSW5kZXgpOiBmaXJzdFJ1bGVJbmRl
eChmaXJzdFJ1bGVJbmRleCksIGxhc3RSdWxlSW5kZXgobGFzdFJ1bGVJbmRleCkgeyB9Ci0gICAg
ICAgIGludCYgZmlyc3RSdWxlSW5kZXg7Ci0gICAgICAgIGludCYgbGFzdFJ1bGVJbmRleDsKLSAg
ICB9OwotCi0gICAgc3RydWN0IE1hdGNoUmFuZ2VzIHsKLSAgICAgICAgTWF0Y2hSYW5nZXMoKSA6
IGZpcnN0VUFSdWxlKC0xKSwgbGFzdFVBUnVsZSgtMSksIGZpcnN0QXV0aG9yUnVsZSgtMSksIGxh
c3RBdXRob3JSdWxlKC0xKSwgZmlyc3RVc2VyUnVsZSgtMSksIGxhc3RVc2VyUnVsZSgtMSkgeyB9
Ci0gICAgICAgIGludCBmaXJzdFVBUnVsZTsKLSAgICAgICAgaW50IGxhc3RVQVJ1bGU7Ci0gICAg
ICAgIGludCBmaXJzdEF1dGhvclJ1bGU7Ci0gICAgICAgIGludCBsYXN0QXV0aG9yUnVsZTsKLSAg
ICAgICAgaW50IGZpcnN0VXNlclJ1bGU7Ci0gICAgICAgIGludCBsYXN0VXNlclJ1bGU7Ci0gICAg
ICAgIFJ1bGVSYW5nZSBVQVJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVBUnVs
ZSwgbGFzdFVBUnVsZSk7IH0KLSAgICAgICAgUnVsZVJhbmdlIGF1dGhvclJ1bGVSYW5nZSgpIHsg
cmV0dXJuIFJ1bGVSYW5nZShmaXJzdEF1dGhvclJ1bGUsIGxhc3RBdXRob3JSdWxlKTsgfQotICAg
ICAgICBSdWxlUmFuZ2UgdXNlclJ1bGVSYW5nZSgpIHsgcmV0dXJuIFJ1bGVSYW5nZShmaXJzdFVz
ZXJSdWxlLCBsYXN0VXNlclJ1bGUpOyB9Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNYXRjaGVkUHJv
cGVydGllcyB7Ci0gICAgICAgIE1hdGNoZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH5NYXRjaGVk
UHJvcGVydGllcygpOwotICAgICAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVj
dEluZm8qKSBjb25zdDsKLSAgICAgICAgCi0gICAgICAgIFJlZlB0cjxTdHlsZVByb3BlcnR5U2V0
PiBwcm9wZXJ0aWVzOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICBzdHJ1Y3QgewotICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgOiAyOwotICAgICAgICAgICAgICAg
IHVuc2lnbmVkIHdoaXRlbGlzdFR5cGUgOiAyOwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAg
IC8vIFVzZWQgdG8gbWFrZSBzdXJlIGFsbCBtZW1vcnkgaXMgemVyby1pbml0aWFsaXplZCBzaW5j
ZSB3ZSBjb21wdXRlIHRoZSBoYXNoIG92ZXIgdGhlIGJ5dGVzIG9mIHRoaXMgb2JqZWN0LgotICAg
ICAgICAgICAgdm9pZCogcG9zc2libHlQYWRkZWRNZW1iZXI7Ci0gICAgICAgIH07Ci0gICAgfTsK
LQotICAgIHN0cnVjdCBNYXRjaFJlc3VsdCB7Ci0gICAgICAgIE1hdGNoUmVzdWx0KCkgOiBpc0Nh
Y2hlYWJsZSh0cnVlKSB7IH0KLSAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzLCA2ND4g
bWF0Y2hlZFByb3BlcnRpZXM7Ci0gICAgICAgIFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0Y2hl
ZFJ1bGVzOwotICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7Ci0gICAgICAgIGJvb2wgaXNDYWNo
ZWFibGU7Ci0gICAgfTsKLQotICAgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1h
dGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxl
KiA9IDAsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoQWxs
LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRlbGlzdE5vbmUpOwotICAgIHZv
aWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0IFN0eWxlUHJv
cGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7Ci0KLSAgICB2b2lkIG1hdGNoQWxs
UnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVTTUlMUHJvcGVydGllcyk7Ci0gICAgdm9p
ZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRj
aFJlc3VsdCYsIFJ1bGVTZXQqKTsKLSAgICB2b2lkIG1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1
bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoVXNlclJ1bGVzKE1h
dGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAgdm9pZCBtYXRjaFNjb3Bl
ZEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0gICAg
dm9pZCBtYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
OwotCi0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmLCBS
dWxlUmFuZ2UmKTsKLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKGNvbnN0
IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBS
dWxlUmFuZ2UmKTsKLQotICAgIGJvb2wgZmFzdFJlamVjdFNlbGVjdG9yKGNvbnN0IFJ1bGVEYXRh
JikgY29uc3Q7Ci0gICAgdm9pZCBzb3J0TWF0Y2hlZFJ1bGVzKCk7Ci0gICAgdm9pZCBzb3J0QW5k
VHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmKTsKLQotICAgIGJvb2wgcnVsZU1hdGNo
ZXMoY29uc3QgUnVsZURhdGEmLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQm
LCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSA9IFNlbGVjdG9yQ2hlY2tlcjo6
RG9lc05vdENyb3NzQm91bmRhcnkpOwotICAgIGJvb2wgY2hlY2tSZWdpb25TZWxlY3Rvcihjb25z
dCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IsIEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpOwot
ICAgIHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGNvbnN0
IEVsZW1lbnQqKTsKLSAgICBlbnVtIFN0eWxlQXBwbGljYXRpb25QYXNzIHsKLSNpZiBFTkFCTEUo
Q1NTX1ZBUklBQkxFUykKLSAgICAgICAgVmFyaWFibGVEZWZpbml0aW9ucywKLSNlbmRpZgotICAg
ICAgICBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzLAotICAgICAgICBMb3dQcmlvcml0eVByb3BlcnRp
ZXMKLSAgICB9OwotICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotICAg
IHZvaWQgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYsIGJvb2wgaW1w
b3J0YW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9ubHkp
OwotICAgIHRlbXBsYXRlIDxTdHlsZUFwcGxpY2F0aW9uUGFzcyBwYXNzPgotICAgIHZvaWQgYXBw
bHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVs
ZSosIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0ZWxp
c3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxF
UykKLSAgICB2b2lkIHJlc29sdmVWYXJpYWJsZXMoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBW
ZWN0b3I8c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiYga25vd25FeHByZXNzaW9u
cyk7Ci0jZW5kaWYKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkUmVnaW9uU3R5bGVQcm9wZXJ0eShD
U1NQcm9wZXJ0eUlEKTsKLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgc3RhdGljIGJvb2wg
aXNWYWxpZEN1ZVN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7Ci0jZW5kaWYKLSAgICB2b2lk
IG1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCosIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSk7Ci0gICAgdm9pZCBtYXRj
aFBhZ2VSdWxlc0Zvckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBj
b25zdCBWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmly
c3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKLSAgICBTZXR0aW5ncyogZG9jdW1lbnRT
ZXR0aW5ncygpIHsgcmV0dXJuIG1fZG9jdW1lbnQtPnNldHRpbmdzKCk7IH0KLQotICAgIGJvb2wg
aXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdDsKLSAgICBib29sIGlzUmlnaHRQYWdlKGlu
dCBwYWdlSW5kZXgpIGNvbnN0IHsgcmV0dXJuICFpc0xlZnRQYWdlKHBhZ2VJbmRleCk7IH0KLSAg
ICBib29sIGlzRmlyc3RQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0OwotICAgIFN0cmluZyBwYWdl
TmFtZShpbnQgcGFnZUluZGV4KSBjb25zdDsKLQotICAgIERvY3VtZW50UnVsZVNldHMgbV9ydWxl
U2V0czsKLQotICAgIHR5cGVkZWYgSGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgUmVmUHRyPFN0
eWxlUnVsZUtleWZyYW1lcz4gPiBLZXlmcmFtZXNSdWxlTWFwOwotICAgIEtleWZyYW1lc1J1bGVN
YXAgbV9rZXlmcmFtZXNSdWxlTWFwOworY2xhc3MgU3RhdGljQ1NTUnVsZUxpc3Q7CiAKK2NsYXNz
IEVsZW1lbnRSdWxlQ29sbGVjdG9yIHsKIHB1YmxpYzoKLSAgICB0eXBlZGVmIEhhc2hNYXA8Q1NT
UHJvcGVydHlJRCwgUmVmUHRyPENTU1ZhbHVlPiA+IFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOwot
I2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICB0eXBlZGVmIEhhc2hN
YXA8RmlsdGVyT3BlcmF0aW9uKiwgUmVmUHRyPFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU+ID4g
UGVuZGluZ1NWR0RvY3VtZW50TWFwOwotI2VuZGlmCi0KLSAgICBjbGFzcyBTdGF0ZSB7Ci0gICAg
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFN0YXRlKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFN0
YXRlKCkKLSAgICAgICAgOiBtX2VsZW1lbnQoMCkKLSAgICAgICAgLCBtX3N0eWxlZEVsZW1lbnQo
MCkKLSAgICAgICAgLCBtX3BhcmVudE5vZGUoMCkKLSAgICAgICAgLCBtX3BhcmVudFN0eWxlKDAp
Ci0gICAgICAgICwgbV9yb290RWxlbWVudFN0eWxlKDApCisgICAgRWxlbWVudFJ1bGVDb2xsZWN0
b3IoU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlciwgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3Rh
dGUmIHN0YXRlKQorICAgICAgICA6IG1fc3RhdGUoc3RhdGUpCisgICAgICAgICwgbV9ydWxlU2V0
cyhzdHlsZVJlc29sdmVyLT5ydWxlU2V0cygpKQorICAgICAgICAsIG1fc2VsZWN0b3JGaWx0ZXIo
c3R5bGVSZXNvbHZlci0+c2VsZWN0b3JGaWx0ZXIoKSkKKyAgICAgICAgLCBtX2luc3BlY3RvckNT
U09NV3JhcHBlcnMoc3R5bGVSZXNvbHZlci0+aW5zcGVjdG9yQ1NTT01XcmFwcGVycygpKQorICAg
ICAgICAsIG1fc2NvcGVSZXNvbHZlcihzdHlsZVJlc29sdmVyLT5zY29wZVJlc29sdmVyKCkpCisg
ICAgICAgICwgbV9pc1ByaW50U3R5bGUoZmFsc2UpCiAgICAgICAgICwgbV9yZWdpb25Gb3JTdHls
aW5nKDApCi0gICAgICAgICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkKICAgICAgICAgLCBtX3Bz
ZXVkb1N0eWxlUmVxdWVzdChOT1BTRVVETykKLSAgICAgICAgLCBtX2VsZW1lbnRMaW5rU3RhdGUo
Tm90SW5zaWRlTGluaykKLSAgICAgICAgLCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludChm
YWxzZSkKLSAgICAgICAgLCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxzZSkKKyAg
ICAgICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQogICAgICAgICAsIG1fbW9kZShTZWxlY3Rv
ckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlKHRydWUpCi0gICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlKGZhbHNlKQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAgICAgICAgLCBtX2hhc1BlbmRp
bmdTaGFkZXJzKGZhbHNlKQotI2VuZGlmCi0gICAgICAgICwgbV9saW5lSGVpZ2h0VmFsdWUoMCkK
LSAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxzZSkKLSAgICAgICAgLCBtX2hhc1VBQXBwZWFyYW5j
ZShmYWxzZSkKLSAgICAgICAgLCBtX2JhY2tncm91bmREYXRhKEJhY2tncm91bmRGaWxsTGF5ZXIp
IHsgfQotCi0gICAgcHVibGljOgotICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVsZW1lbnQqKTsK
LSAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxlbWVudCosIFJl
bmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVxdWVzdCYgPSBQ
c2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxp
bmcgPSAwKTsKLSAgICAgICAgdm9pZCBjbGVhcigpOwotCi0gICAgICAgIERvY3VtZW50KiBkb2N1
bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC0+ZG9jdW1lbnQoKTsgfQotICAgICAgICBF
bGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9Ci0gICAgICAgIFN0
eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlZEVsZW1l
bnQ7IH0KLSAgICAgICAgdm9pZCBzZXRTdHlsZShQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHls
ZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KLSAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29u
c3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQotICAgICAgICBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVhc2UoKTsgfQotCi0gICAgICAg
IFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOwotICAgICAgICBQYXNzUmVmUHRy
PENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBtX3J1bGVMaXN0LnJlbGVhc2Uo
KTsgfQotCi0gICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUoKSBjb25zdCB7
IHJldHVybiBtX3BhcmVudE5vZGU7IH0KLSAgICAgICAgdm9pZCBzZXRQYXJlbnRTdHlsZShSZW5k
ZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0eWxlOyB9Ci0g
ICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFyZW50
U3R5bGU7IH0KLSAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5bGUoKSBjb25zdCB7
IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KLQotICAgICAgICBjb25zdCBSZW5kZXJSZWdp
b24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBtX3JlZ2lvbkZvclN0eWxpbmc7
IH0KLSAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGlzU2FtZU9yaWdpbk9ubHkp
IHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7IH0KLSAgICAgICAgYm9vbCBp
c1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1lT3JpZ2luT25seTsgfQotICAg
ICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCgpIGNvbnN0
IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9Ci0gICAgICAgIEVJbnNpZGVMaW5rIGVs
ZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5rU3RhdGU7IH0KLSAg
ICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7IHJldHVybiBt
X2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQotICAgICAgICB2b2lkIHNldEVsZW1lbnRB
ZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9Ci0gICAgICAgIGJvb2wgZWxlbWVudEFmZmVjdGVk
QnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVs
ZXM7IH0KLSAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2RlKSB7
IG1fbW9kZSA9IG1vZGU7IH0KLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2RlIG1vZGUoKSBj
b25zdCB7IHJldHVybiBtX21vZGU7IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgc2V0QXBwbHlQ
cm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1Jl
Z3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KLSAgICAgICAgdm9pZCBzZXRBcHBseVByb3BlcnR5VG9W
aXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRM
aW5rU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxh
clN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7IH0K
LSAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgY29uc3QgeyBy
ZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOyB9Ci0gICAgICAgIFBlbmRp
bmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkgeyByZXR1cm4gbV9w
ZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9Ci0jaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFC
TEUoU1ZHKQotICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAmIHBlbmRpbmdTVkdEb2N1bWVu
dHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdEb2N1bWVudHM7IH0KLSNlbmRpZgotI2lmIEVOQUJM
RShDU1NfU0hBREVSUykKLSAgICAgICAgdm9pZCBzZXRIYXNQZW5kaW5nU2hhZGVycyhib29sIGhh
c1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBoYXNQZW5kaW5nU2hhZGVy
czsgfQotICAgICAgICBib29sIGhhc1BlbmRpbmdTaGFkZXJzKCkgY29uc3QgeyByZXR1cm4gbV9o
YXNQZW5kaW5nU2hhZGVyczsgfQotI2VuZGlmCi0KLSAgICAgICAgdm9pZCBzZXRMaW5lSGVpZ2h0
VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1fbGluZUhlaWdodFZhbHVlID0gdmFsdWU7IH0KLSAg
ICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRWYWx1ZSgpIHsgcmV0dXJuIG1fbGluZUhlaWdodFZh
bHVlOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERpcnR5KGJvb2wgaXNEaXJ0eSkgeyBtX2ZvbnRE
aXJ0eSA9IGlzRGlydHk7IH0KLSAgICAgICAgYm9vbCBmb250RGlydHkoKSBjb25zdCB7IHJldHVy
biBtX2ZvbnREaXJ0eTsgfQotCi0gICAgICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5k
KCk7Ci0gICAgICAgIGJvb2wgaGFzVUFBcHBlYXJhbmNlKCkgY29uc3QgeyByZXR1cm4gbV9oYXNV
QUFwcGVhcmFuY2U7IH0KLSAgICAgICAgQm9yZGVyRGF0YSBib3JkZXJEYXRhKCkgY29uc3QgeyBy
ZXR1cm4gbV9ib3JkZXJEYXRhOyB9Ci0gICAgICAgIEZpbGxMYXllciBiYWNrZ3JvdW5kRGF0YSgp
IGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZERhdGE7IH0KLSAgICAgICAgQ29sb3IgYmFja2dy
b3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7IH0KLQotICAgICAg
ICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3R5
bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYg
cGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9wYXJlbnRTdHlsZS0+Zm9udERlc2Ny
aXB0aW9uKCk7IH0KLSAgICAgICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3QgRm9udERl
c2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KLSAgICAgICAgdm9pZCBzZXRab29t
KGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Wm9vbShmKTsgfQotICAgICAg
ICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8PSBtX3N0eWxl
LT5zZXRFZmZlY3RpdmVab29tKGYpOyB9Ci0gICAgICAgIHZvaWQgc2V0V3JpdGluZ01vZGUoV3Jp
dGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0V3JpdGlu
Z01vZGUod3JpdGluZ01vZGUpOyB9Ci0gICAgICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRl
eHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+
c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KLQotICAgICAgICBWZWN0b3I8
Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1fbWF0Y2hlZFJ1
bGVzOyB9Ci0gICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEqIHJ1bGUp
IHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9Ci0gICAgICAgIAotICAgIHByaXZhdGU6
Ci0gICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2llciB0byByZXZp
ZXcsIHRoZXNlIG1lbWJlcgotICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1YmxpYy4gSG93ZXZl
ciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCi0gICAgICAgIC8vIHRoZXNlIHZhcmlh
Ymxlcy4KLSAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OwotICAgICAgICBSZWZQdHI8UmVuZGVy
U3R5bGU+IG1fc3R5bGU7Ci0gICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVkRWxlbWVudDsK
LSAgICAgICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOwotICAgICAgICBSZW5kZXJTdHls
ZSogbV9wYXJlbnRTdHlsZTsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVsZW1lbnRTdHls
ZTsKLSAgICAgICAgCi0gICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JTdHlsaW5nOwot
ICAgICAgICBib29sIG1fc2FtZU9yaWdpbk9ubHk7Ci0gICAgICAgIFBzZXVkb1N0eWxlUmVxdWVz
dCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKLQotICAgICAgICBFSW5zaWRlTGluayBtX2VsZW1lbnRM
aW5rU3RhdGU7Ci0KLSAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsK
LQotICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOworICAgICAgICAs
IG1fY2FuVXNlRmFzdFJlamVjdChtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0
ZW50KHN0YXRlLnBhcmVudE5vZGUoKSkpCisgICAgICAgICwgbV9iZWhhdmlvckF0Qm91bmRhcnko
U2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkgeyB9CiAKLSAgICAgICAgU2Vs
ZWN0b3JDaGVja2VyOjpNb2RlIG1fbW9kZTsKKyAgICB2b2lkIG1hdGNoQWxsUnVsZXMoYm9vbCBt
YXRjaEF1dGhvckFuZFVzZXJTdHlsZXMsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKKyAg
ICB2b2lkIG1hdGNoVUFSdWxlcygpOworICAgIHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhib29sIGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICB2b2lkIG1hdGNoVXNlclJ1bGVzKGJvb2wgaW5jbHVkZUVt
cHR5UnVsZXMpOworCisgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtb2Rl
KSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICB2b2lkIHNldFBzZXVkb1N0eWxlUmVxdWVzdChjb25z
dCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHJlcXVlc3QpIHsgbV9wc2V1ZG9TdHlsZVJlcXVlc3QgPSBy
ZXF1ZXN0OyB9CisgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGYpIHsgbV9zYW1lT3Jp
Z2luT25seSA9IGY7IH0gCisgICAgdm9pZCBzZXRSZWdpb25Gb3JTdHlsaW5nKFJlbmRlclJlZ2lv
biogcmVnaW9uRm9yU3R5bGluZykgeyBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHls
aW5nOyB9CisgICAgdm9pZCBzZXRNZWRpdW0oY29uc3QgTWVkaWFRdWVyeUV2YWx1YXRvciogbWVk
aXVtKSB7IG1faXNQcmludFN0eWxlID0gbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJw
cmludCIpOyB9CiAKLSAgICAgICAgLy8gQSBidWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2Yg
bWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVudCwKLSAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5
IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0aW5nLgotICAgICAgICBWZWN0b3I8Y29uc3QgUnVs
ZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7Ci0gICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxl
TGlzdD4gbV9ydWxlTGlzdDsKKyAgICBib29sIGhhc0FueU1hdGNoaW5nUnVsZXMoUnVsZVNldCop
OwogCi0gICAgICAgIGJvb2wgbV9hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGU7Ci0gICAgICAg
IGJvb2wgbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOworICAgIFN0eWxlUmVzb2x2
ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVzdWx0KCk7CisgICAgUGFzc1JlZlB0cjxDU1NSdWxl
TGlzdD4gbWF0Y2hlZFJ1bGVMaXN0KCk7CiAKLSAgICAgICAgUGVuZGluZ0ltYWdlUHJvcGVydHlN
YXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAg
ICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFkZXJzOwotI2VuZGlmCi0jaWYgRU5BQkxFKENTU19G
SUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAgbV9w
ZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlmCi0gICAgICAgIENTU1ZhbHVlKiBtX2xpbmVIZWln
aHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2ZvbnREaXJ0eTsKLQotICAgICAgICBib29sIG1faGFz
VUFBcHBlYXJhbmNlOwotICAgICAgICBCb3JkZXJEYXRhIG1fYm9yZGVyRGF0YTsKLSAgICAgICAg
RmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7Ci0gICAgICAgIENvbG9yIG1fYmFja2dyb3VuZENv
bG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHN0eWxlTm90WWV0QXZhaWxh
YmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJsZTsgfQotCi0gICAgUGFzc1JlZlB0
cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0gICAg
UGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVy
dHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gZ2VuZXJh
dGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlR2VuZXJhdG9yVmFs
dWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1h
Z2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFnZVNldFZhbHVl
Kik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGN1cnNvck9yUGVuZGluZ0Zy
b21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NDdXJzb3JJbWFnZVZhbHVlKik7Ci0KLSAgICBib29s
IGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBw
bHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7IH0KLSAgICBib29sIGFwcGx5UHJvcGVydHlUb1Zp
c2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLmFwcGx5UHJvcGVydHlUb1Zp
c2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9JbnRMZW5n
dGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7Ci0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0VG9G
bG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUq
IHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsKLQotICAgIENTU1RvU3R5bGVNYXAq
IHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5bGVNYXA7IH0KLSAgICBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkgeyByZXR1cm4gbV9pbnNwZWN0b3JDU1NP
TVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24o
KSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgY29uc3QgRm9udERl
c2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLnBhcmVu
dEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29uc3Qg
Rm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9zdGF0ZS5zZXRGb250RGVzY3Jp
cHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQotICAgIHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1f
c3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9vbShmbG9hdCBmKSB7
IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgIHZvaWQgc2V0V3JpdGluZ01vZGUo
V3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9zdGF0ZS5zZXRXcml0aW5nTW9kZSh3cml0aW5n
TW9kZSk7IH0KLSAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4
dE9yaWVudGF0aW9uKSB7IG1fc3RhdGUuc2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlv
bik7IH0KLSAgICAKLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8q
KSBjb25zdDsKLSAgICAKIHByaXZhdGU6Ci0gICAgc3RhdGljIFJlbmRlclN0eWxlKiBzX3N0eWxl
Tm90WWV0QXZhaWxhYmxlOworICAgIERvY3VtZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fc3Rh
dGUuZG9jdW1lbnQoKTsgfQorICAgIHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiwgYm9vbCBpc0NhY2hlYWJsZSA9IHRydWUpOwogCi0gICAgdm9p
ZCBjYWNoZUJvcmRlckFuZEJhY2tncm91bmQoKTsKLQotcHJpdmF0ZToKLSAgICBib29sIGNhblNo
YXJlU3R5bGVXaXRoQ29udHJvbChTdHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB2b2lkIGFw
cGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKLQotI2lmIEVOQUJMRShTVkcp
Ci0gICAgdm9pZCBhcHBseVNWR1Byb3BlcnR5KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Cisg
ICAgdm9pZCBtYXRjaFVBUnVsZXMoUnVsZVNldCopOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQor
ICAgIHZvaWQgbWF0Y2hTaGFkb3dEaXN0cmlidXRlZFJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVs
ZXMsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYpOwogI2VuZGlmCisgICAgdm9pZCBtYXRjaFNj
b3BlZEF1dGhvclJ1bGVzKGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hI
b3N0UnVsZXMoYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7CiAKLSAgICBQYXNzUmVmUHRyPFN0eWxl
SW1hZ2U+IGxvYWRQZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqKTsKLSAgICB2b2lkIGxv
YWRQZW5kaW5nSW1hZ2VzKCk7Ci0KLSAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZU1hdGNoZWRQ
cm9wZXJ0aWVzSGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGllcyosIHVuc2lnbmVkIHNpemUpOwot
ICAgIHN0cnVjdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSB7Ci0gICAgICAgIHZvaWQgcmVw
b3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwotICAgICAgICBWZWN0b3I8
TWF0Y2hlZFByb3BlcnRpZXM+IG1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBNYXRjaFJhbmdl
cyByYW5nZXM7Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcmVuZGVyU3R5bGU7Ci0gICAg
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcGFyZW50UmVuZGVyU3R5bGU7Ci0gICAgfTsKLSAgICBj
b25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogZmluZEZyb21NYXRjaGVkUHJvcGVydGll
c0NhY2hlKHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBhZGRU
b01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7Ci0K
LSAgICAvLyBFdmVyeSBOIGFkZGl0aW9ucyB0byB0aGUgbWF0Y2hlZCBkZWNsYXJhdGlvbiBjYWNo
ZSB0cmlnZ2VyIGEgc3dlZXAgd2hlcmUgZW50cmllcyBob2xkaW5nCi0gICAgLy8gdGhlIGxhc3Qg
cmVmZXJlbmNlIHRvIGEgc3R5bGUgZGVjbGFyYXRpb24gYXJlIGdhcmJhZ2UgY29sbGVjdGVkLgot
ICAgIHZvaWQgc3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+
Kik7CisgICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmLCBT
dHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFN0eWxlUmVzb2x2ZXI6OlJ1bGVSYW5nZSYp
OworICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxl
RGF0YT4qLCBjb25zdCBNYXRjaFJlcXVlc3QmLCBTdHlsZVJlc29sdmVyOjpSdWxlUmFuZ2UmKTsK
KyAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRhJiwgY29uc3QgQ29udGFpbmVyTm9k
ZSogc2NvcGUsIFBzZXVkb0lkJik7CiAKLSAgICBib29sIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVs
ZXMoY29uc3QgU3BhY2VTcGxpdFN0cmluZyYpIGNvbnN0OwotICAgIGJvb2wgc2hhcmluZ0NhbmRp
ZGF0ZUhhc0lkZW50aWNhbFN0eWxlQWZmZWN0aW5nQXR0cmlidXRlcyhTdHlsZWRFbGVtZW50Kikg
Y29uc3Q7Ci0KLSAgICB1bnNpZ25lZCBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVBZGRpdGlvbnNT
aW5jZUxhc3RTd2VlcDsKLQotICAgIHR5cGVkZWYgSGFzaE1hcDx1bnNpZ25lZCwgTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZUl0ZW0+IE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU7Ci0gICAgTWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGU7Ci0KLSAgICBUaW1lcjxTdHls
ZVJlc29sdmVyPiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyOwotCi0gICAgT3du
UHRyPE1lZGlhUXVlcnlFdmFsdWF0b3I+IG1fbWVkaXVtOwotICAgIFJlZlB0cjxSZW5kZXJTdHls
ZT4gbV9yb290RGVmYXVsdFN0eWxlOwotCi0gICAgRG9jdW1lbnQqIG1fZG9jdW1lbnQ7Ci0gICAg
U2VsZWN0b3JGaWx0ZXIgbV9zZWxlY3RvckZpbHRlcjsKLQotICAgIGJvb2wgbV9tYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXM7Ci0KLSAgICBSZWZQdHI8Q1NTRm9udFNlbGVjdG9yPiBtX2ZvbnRTZWxl
Y3RvcjsKLSAgICBWZWN0b3I8T3duUHRyPE1lZGlhUXVlcnlSZXN1bHQ+ID4gbV92aWV3cG9ydERl
cGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzOwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRB
VElPTikKLSAgICBSZWZQdHI8Vmlld3BvcnRTdHlsZVJlc29sdmVyPiBtX3ZpZXdwb3J0U3R5bGVS
ZXNvbHZlcjsKLSNlbmRpZgorICAgIHZvaWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZvaWQg
c29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKCk7CiAKLSAgICBjb25zdCBTdHlsZUJ1aWxkZXIm
IG1fc3R5bGVCdWlsZGVyOworICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURhdGEq
KTsKKyAgICB2b2lkIGNsZWFyTWF0Y2hlZFJ1bGVzKCk7CiAKLSAgICBPd25QdHI8U3R5bGVTY29w
ZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7Ci0gICAgQ1NTVG9TdHlsZU1hcCBtX3N0eWxlTWFw
OwotICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMgbV9pbnNwZWN0b3JDU1NPTVdyYXBwZXJzOwot
Ci0gICAgU3RhdGUgbV9zdGF0ZTsKLQotICAgIGZyaWVuZCBjbGFzcyBTdHlsZUJ1aWxkZXI7Ci0g
ICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0
IE1hdGNoZWRQcm9wZXJ0aWVzJik7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBN
YXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7Ci0gICAgZnJpZW5k
IGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7
Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1h
dGNoUmFuZ2VzJik7CisgICAgU3RhdGljQ1NTUnVsZUxpc3QqIGVuc3VyZVJ1bGVMaXN0KCk7Cisg
ICAgICAgIAorcHJpdmF0ZToKKyAgICBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgbV9zdGF0
ZTsKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBtX3J1bGVTZXRzOworICAgIFNlbGVjdG9yRmlsdGVy
JiBtX3NlbGVjdG9yRmlsdGVyOworICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMmIG1faW5zcGVj
dG9yQ1NTT01XcmFwcGVyczsKKyAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIG1fc2NvcGVSZXNvbHZl
cjsKKworICAgIGJvb2wgbV9pc1ByaW50U3R5bGU7CisgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lv
bkZvclN0eWxpbmc7CisgICAgUHNldWRvU3R5bGVSZXF1ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0
OworICAgIGJvb2wgbV9zYW1lT3JpZ2luT25seTsKKyAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUg
bV9tb2RlOworICAgIGJvb2wgbV9jYW5Vc2VGYXN0UmVqZWN0OworICAgIFNlbGVjdG9yQ2hlY2tl
cjo6QmVoYXZpb3JBdEJvdW5kYXJ5IG1fYmVoYXZpb3JBdEJvdW5kYXJ5OworCisgICAgT3duUHRy
PFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiA+IG1fbWF0Y2hlZFJ1bGVzOworCisgICAgLy8g
T3V0cHV0LgorICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKyAgICBT
dHlsZVJlc29sdmVyOjpNYXRjaFJlc3VsdCBtX3Jlc3VsdDsKIH07CiAKLWlubGluZSBib29sIFN0
eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0cmluZyAm
YXR0cmlidXRlTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWF0dHJpYnV0ZU5hbWUuaXNFbXB0
eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmF0dHJzSW5SdWxlcy5jb250
YWlucyhhdHRyaWJ1dGVOYW1lLmltcGwoKSk7Ci19Ci0KLWlubGluZSBib29sIFN0eWxlUmVzb2x2
ZXI6Omhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3RyaW5nJiBjbGFzc1ZhbHVlKSBj
b25zdAotewotICAgIEFTU0VSVCghY2xhc3NWYWx1ZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBt
X3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nlc0luUnVsZXMuY29udGFpbnMoY2xhc3NWYWx1ZS5p
bXBsKCkpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxlY3RvckZvcklk
KGNvbnN0IEF0b21pY1N0cmluZyYgaWRWYWx1ZSkgY29uc3QKLXsKLSAgICBBU1NFUlQoIWlkVmFs
dWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVs
ZXMuY29udGFpbnMoaWRWYWx1ZS5pbXBsKCkpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CiAKLSNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKKyNlbmRpZiAvLyBFbGVtZW50UnVsZUNvbGxl
Y3Rvcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAJKHJl
dmlzaW9uIDE0NTE4MSkJKGZyb20gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuY3Bw
OjE0NTE4MSkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rvci5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1MTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5
IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIwMDQtMjAwNSBB
bGxhbiBTYW5kZmVsZCBKZW5zZW4gKGtkZUBjYXJld29sZi5jb20pCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcgTmljaG9sYXMgU2hhbmtzICh3ZWJraXRAbmlja3NoYW5rcy5jb20pCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIw
MTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFsZXhleSBQcm9za3VyeWFrb3YgPGFwQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMDcsIDIwMDggRXJpYyBTZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KKyAqIENvcHlyaWdo
dCAoQykgMjAwOCwgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAo
aHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICogQ29weXJpZ2h0IChjKSAyMDExLCBDb2Rl
IEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgorCisjaW5jbHVkZSAiQXR0
cmlidXRlLmgiCisjaW5jbHVkZSAiQ1NTQm9yZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJDU1NDYWxj
dWxhdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oIgorI2luY2x1
ZGUgIkNTU0RlZmF1bHRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIkNTU0ZvbnRGYWNlUnVsZS5o
IgorI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkNTU0xpbmVCb3hDb250
YWluVmFsdWUuaCIKKyNpbmNsdWRlICJDU1NQYWdlUnVsZS5oIgorI2luY2x1ZGUgIkNTU1BhcnNl
ci5oIgorI2luY2x1ZGUgIkNTU1ByaW1pdGl2ZVZhbHVlTWFwcGluZ3MuaCIKKyNpbmNsdWRlICJD
U1NQcm9wZXJ0eU5hbWVzLmgiCisjaW5jbHVkZSAiQ1NTUmVmbGVjdFZhbHVlLmgiCisjaW5jbHVk
ZSAiQ1NTU2VsZWN0b3IuaCIKKyNpbmNsdWRlICJDU1NTZWxlY3Rvckxpc3QuaCIKKyNpbmNsdWRl
ICJDU1NTdHlsZVJ1bGUuaCIKKyNpbmNsdWRlICJDU1NTdXBwb3J0c1J1bGUuaCIKKyNpbmNsdWRl
ICJDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVMaXN0LmgiCisj
aWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisjaW5jbHVkZSAiQ1NTVmFyaWFibGVWYWx1ZS5oIgor
I2VuZGlmCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJDYWxjdWxhdGlvblZh
bHVlLmgiCisjaW5jbHVkZSAiQ29udGVudERhdGEuaCIKKyNpbmNsdWRlICJDb250ZXh0RmVhdHVy
ZXMuaCIKKyNpbmNsdWRlICJDb3VudGVyLmgiCisjaW5jbHVkZSAiQ291bnRlckNvbnRlbnQuaCIK
KyNpbmNsdWRlICJDdXJzb3JMaXN0LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRTdHlsZVNoZWV0Q29s
bGVjdGlvbi5oIgorI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKKyNpbmNsdWRlICJGb250RmVh
dHVyZVZhbHVlLmgiCisjaW5jbHVkZSAiRm9udFZhbHVlLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIK
KyNpbmNsdWRlICJGcmFtZVNlbGVjdGlvbi5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2lu
Y2x1ZGUgIkhUTUxEb2N1bWVudC5oIgorI2luY2x1ZGUgIkhUTUxJRnJhbWVFbGVtZW50LmgiCisj
aW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2lu
Y2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFByb2dyZXNzRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkhUTUxTdHlsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MVGV4dEFy
ZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSW5zZXJ0aW9uUG9pbnQuaCIKKyNpbmNsdWRlICJJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJLZXlmcmFtZUxpc3QuaCIKKyNpbmNs
dWRlICJMaW5rSGFzaC5oIgorI2luY2x1ZGUgIkxvY2FsZVRvU2NyaXB0TWFwcGluZy5oIgorI2lu
Y2x1ZGUgIk1hdGhNTE5hbWVzLmgiCisjaW5jbHVkZSAiTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRp
b24uaCIKKyNpbmNsdWRlICJNYXRyaXhUcmFuc2Zvcm1PcGVyYXRpb24uaCIKKyNpbmNsdWRlICJN
ZWRpYUxpc3QuaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXZhbHVhdG9yLmgiCisjaW5jbHVkZSAi
Tm9kZVJlbmRlclN0eWxlLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlcmluZ0NvbnRleHQuaCIKKyNp
bmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGFpci5oIgorI2luY2x1ZGUgIlBlcnNwZWN0aXZl
VHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiUXVvdGVzRGF0YS5oIgorI2luY2x1ZGUg
IlJlY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJSZWdpb24uaCIKKyNpbmNsdWRlICJSZW5kZXJTY3Jv
bGxiYXIuaCIKKyNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXJUaGVtZS5oIgorI2luY2x1ZGUgIlJl
bmRlclN0eWxlQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRl
ICJSZW5kZXJWaWV3LmgiCisjaW5jbHVkZSAiUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisj
aW5jbHVkZSAiUnVsZVNldC5oIgorI2luY2x1ZGUgIlNWR0RvY3VtZW50RXh0ZW5zaW9ucy5oIgor
I2luY2x1ZGUgIlNWR0ZvbnRGYWNlRWxlbWVudC5oIgorI2luY2x1ZGUgIlNjYWxlVHJhbnNmb3Jt
T3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlICJTZWxl
Y3RvckNoZWNrZXJGYXN0UGF0aC5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAi
U2hhZG93RGF0YS5oIgorI2luY2x1ZGUgIlNoYWRvd1Jvb3QuaCIKKyNpbmNsdWRlICJTaGFkb3dW
YWx1ZS5oIgorI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVnaWVzLmgiCisjaW5jbHVk
ZSAiU2tld1RyYW5zZm9ybU9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIlN0eWxlQnVpbGRlci5oIgor
I2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZUdlbmVyYXRlZElt
YWdlLmgiCisjaW5jbHVkZSAiU3R5bGVQZW5kaW5nSW1hZ2UuaCIKKyNpbmNsdWRlICJTdHlsZVBy
b3BlcnR5U2V0LmgiCisjaW5jbHVkZSAiU3R5bGVQcm9wZXJ0eVNob3J0aGFuZC5oIgorI2luY2x1
ZGUgIlN0eWxlUnVsZS5oIgorI2luY2x1ZGUgIlN0eWxlUnVsZUltcG9ydC5oIgorI2luY2x1ZGUg
IlN0eWxlU2hlZXRDb250ZW50cy5oIgorI2luY2x1ZGUgIlN0eWxlU2hlZXRMaXN0LmgiCisjaW5j
bHVkZSAiVGV4dC5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVk
ZSAiVHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiVXNlckFnZW50U3R5
bGVTaGVldHMuaCIKKyNpbmNsdWRlICJWaWV3cG9ydFN0eWxlUmVzb2x2ZXIuaCIKKyNpbmNsdWRl
ICJWaXNpdGVkTGlua1N0YXRlLmgiCisjaW5jbHVkZSAiV2ViQ29yZU1lbW9yeUluc3RydW1lbnRh
dGlvbi5oIgorI2luY2x1ZGUgIldlYktpdENTU0tleWZyYW1lUnVsZS5oIgorI2luY2x1ZGUgIldl
YktpdENTU0tleWZyYW1lc1J1bGUuaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NSZWdpb25SdWxlLmgi
CisjaW5jbHVkZSAiV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUuaCIKKyNpbmNsdWRlICJXZWJLaXRG
b250RmFtaWx5TmFtZXMuaCIKKyNpbmNsdWRlICJYTUxOYW1lcy5oIgorI2luY2x1ZGUgPHd0Zi9N
ZW1vcnlJbnN0cnVtZW50YXRpb25IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL01lbW9yeUluc3Ry
dW1lbnRhdGlvbkhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvTWVtb3J5SW5zdHJ1bWVudGF0aW9u
VmVjdG9yLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KKworI2lmIEVOQUJMRShDU1NfRklMVEVSUykKKyNpbmNsdWRlICJGaWx0ZXJPcGVy
YXRpb24uaCIKKyNpbmNsdWRlICJXZWJLaXRDU1NGaWx0ZXJWYWx1ZS5oIgorI2VuZGlmCisKKyNp
ZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCisjaW5jbHVkZSAiRGFzaGJvYXJkUmVnaW9uLmgi
CisjZW5kaWYKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiQ2FjaGVkU1ZHRG9jdW1lbnQu
aCIKKyNpbmNsdWRlICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgorI2luY2x1ZGUgIlNW
R0RvY3VtZW50LmgiCisjaW5jbHVkZSAiU1ZHRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR05hbWVz
LmgiCisjaW5jbHVkZSAiU1ZHVVJJUmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTU1ZH
RG9jdW1lbnRWYWx1ZS5oIgorI2VuZGlmCisKKyNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCisjaW5j
bHVkZSAiQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0
ZXJDb25zdGFudHMuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXIuaCIK
KyNpbmNsdWRlICJDdXN0b21GaWx0ZXJPcGVyYXRpb24uaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0
ZXJQYXJhbWV0ZXIuaCIKKyNpbmNsdWRlICJDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIu
aCIKKyNpbmNsdWRlICJTdHlsZUNhY2hlZFNoYWRlci5oIgorI2luY2x1ZGUgIlN0eWxlQ3VzdG9t
RmlsdGVyUHJvZ3JhbS5oIgorI2luY2x1ZGUgIlN0eWxlUGVuZGluZ1NoYWRlci5oIgorI2luY2x1
ZGUgIlN0eWxlU2hhZGVyLmgiCisjaW5jbHVkZSAiV2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZS5o
IgorI2luY2x1ZGUgIldlYktpdENTU1NoYWRlclZhbHVlLmgiCisjZW5kaWYKKworI2lmIEVOQUJM
RShDU1NfSU1BR0VfU0VUKQorI2luY2x1ZGUgIkNTU0ltYWdlU2V0VmFsdWUuaCIKKyNpbmNsdWRl
ICJTdHlsZUNhY2hlZEltYWdlU2V0LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShWSURFT19UUkFD
SykKKyNpbmNsdWRlICJXZWJWVFRFbGVtZW50LmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNl
IHN0ZDsKKworbmFtZXNwYWNlIFdURiB7CisKK3RlbXBsYXRlPD4gc3RydWN0IFNlcXVlbmNlTWVt
b3J5SW5zdHJ1bWVudGF0aW9uVHJhaXRzPGNvbnN0IFdlYkNvcmU6OlJ1bGVEYXRhKj4geworICAg
IHRlbXBsYXRlIDx0eXBlbmFtZSBJPiBzdGF0aWMgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShJLCBJ
LCBNZW1vcnlDbGFzc0luZm8mKSB7IH0KK307CisKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCisjZGVmaW5lIEhBTkRMRV9JTkhFUklUKHBy
b3AsIFByb3ApIFwKK2lmIChpc0luaGVyaXQpIHsgXAorICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0
IyNQcm9wKG1fc3RhdGUucGFyZW50U3R5bGUoKS0+cHJvcCgpKTsgXAorICAgIHJldHVybjsgXAor
fQorCisjZGVmaW5lIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHByb3AsIFByb3ApIFwKK0hB
TkRMRV9JTkhFUklUKHByb3AsIFByb3ApIFwKK2lmIChpc0luaXRpYWwpIHsgXAorICAgIG1fc3Rh
dGUuc3R5bGUoKS0+c2V0IyNQcm9wKFJlbmRlclN0eWxlOjppbml0aWFsIyNQcm9wKCkpOyBcCisg
ICAgcmV0dXJuOyBcCit9CisKK1JlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpzX3N0eWxlTm90
WWV0QXZhaWxhYmxlOworCitzdGF0aWMgU3R5bGVQcm9wZXJ0eVNldCogbGVmdFRvUmlnaHREZWNs
YXJhdGlvbigpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0
eVNldD4sIGxlZnRUb1JpZ2h0RGVjbCwgKFN0eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Cisg
ICAgaWYgKGxlZnRUb1JpZ2h0RGVjbC0+aXNFbXB0eSgpKQorICAgICAgICBsZWZ0VG9SaWdodERl
Y2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5RGlyZWN0aW9uLCBDU1NWYWx1ZUx0cik7CisgICAg
cmV0dXJuIGxlZnRUb1JpZ2h0RGVjbC5nZXQoKTsKK30KKworc3RhdGljIFN0eWxlUHJvcGVydHlT
ZXQqIHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwo
UmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+LCByaWdodFRvTGVmdERlY2wsIChTdHlsZVByb3BlcnR5
U2V0OjpjcmVhdGUoKSkpOworICAgIGlmIChyaWdodFRvTGVmdERlY2wtPmlzRW1wdHkoKSkKKyAg
ICAgICAgcmlnaHRUb0xlZnREZWNsLT5zZXRQcm9wZXJ0eShDU1NQcm9wZXJ0eURpcmVjdGlvbiwg
Q1NTVmFsdWVSdGwpOworICAgIHJldHVybiByaWdodFRvTGVmdERlY2wuZ2V0KCk7Cit9CisKKwor
aW5saW5lIFN0YXRpY0NTU1J1bGVMaXN0KiBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6ZW5zdXJlUnVs
ZUxpc3QoKQoreworICAgIGlmICghbV9ydWxlTGlzdCkKKyAgICAgICAgbV9ydWxlTGlzdCA9IFN0
YXRpY0NTU1J1bGVMaXN0OjpjcmVhdGUoKTsKKyAgICByZXR1cm4gbV9ydWxlTGlzdC5nZXQoKTsK
K30KKworaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNhY2hlQm9yZGVyQW5kQmFj
a2dyb3VuZCgpCit7CisgICAgbV9oYXNVQUFwcGVhcmFuY2UgPSBtX3N0eWxlLT5oYXNBcHBlYXJh
bmNlKCk7CisgICAgaWYgKG1faGFzVUFBcHBlYXJhbmNlKSB7CisgICAgICAgIG1fYm9yZGVyRGF0
YSA9IG1fc3R5bGUtPmJvcmRlcigpOworICAgICAgICBtX2JhY2tncm91bmREYXRhID0gKm1fc3R5
bGUtPmJhY2tncm91bmRMYXllcnMoKTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3IgPSBtX3N0
eWxlLT5iYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVz
b2x2ZXI6OlN0YXRlOjpjbGVhcigpCit7CisgICAgbV9lbGVtZW50ID0gMDsKKyAgICBtX3N0eWxl
ZEVsZW1lbnQgPSAwOworICAgIG1fcGFyZW50U3R5bGUgPSAwOworICAgIG1fcGFyZW50Tm9kZSA9
IDA7CisgICAgbV9yZWdpb25Gb3JTdHlsaW5nID0gMDsKKyAgICBtX3J1bGVMaXN0ID0gMDsKKyAg
ICBtX21hdGNoZWRSdWxlcy5jbGVhcigpOworICAgIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllcy5j
bGVhcigpOworI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICBtX2hhc1BlbmRpbmdTaGFkZXJz
ID0gZmFsc2U7CisjZW5kaWYKKyNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcp
CisgICAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzLmNsZWFyKCk7CisjZW5kaWYKK30KKworU3R5bGVS
ZXNvbHZlcjo6U3R5bGVSZXNvbHZlcihEb2N1bWVudCogZG9jdW1lbnQsIGJvb2wgbWF0Y2hBdXRo
b3JBbmRVc2VyU3R5bGVzKQorICAgIDogbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25z
U2luY2VMYXN0U3dlZXAoMCkKKyAgICAsIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGlt
ZXIodGhpcywgJlN0eWxlUmVzb2x2ZXI6OnN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSkKKyAg
ICAsIG1fZG9jdW1lbnQoZG9jdW1lbnQpCisgICAgLCBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxl
cyhtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCisgICAgLCBtX2ZvbnRTZWxlY3RvcihDU1NGb250
U2VsZWN0b3I6OmNyZWF0ZShkb2N1bWVudCkpCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRB
VElPTikKKyAgICAsIG1fdmlld3BvcnRTdHlsZVJlc29sdmVyKFZpZXdwb3J0U3R5bGVSZXNvbHZl
cjo6Y3JlYXRlKGRvY3VtZW50KSkKKyNlbmRpZgorICAgICwgbV9zdHlsZUJ1aWxkZXIoU3R5bGVC
dWlsZGVyOjpzaGFyZWRTdHlsZUJ1aWxkZXIoKSkKKyAgICAsIG1fc3R5bGVNYXAodGhpcykKK3sK
KyAgICBFbGVtZW50KiByb290ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOworCisgICAg
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzOjppbml0RGVmYXVsdFN0eWxlKHJvb3QpOworCisgICAgLy8g
Y29uc3RydWN0IGRvY3VtZW50IHJvb3QgZWxlbWVudCBkZWZhdWx0IHN0eWxlLiB0aGlzIGlzIG5l
ZWRlZAorICAgIC8vIHRvIGV2YWx1YXRlIG1lZGlhIHF1ZXJpZXMgdGhhdCBjb250YWluIHJlbGF0
aXZlIGNvbnN0cmFpbnRzLCBsaWtlICJzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwZW0pIgorICAg
IC8vIFRoaXMgaXMgaGVyZSBpbnN0ZWFkIG9mIGNvbnN0cnVjdG9yLCBiZWNhdXNlIHdoZW4gY29u
c3RydWN0b3IgaXMgcnVuLAorICAgIC8vIGRvY3VtZW50IGRvZXNuJ3QgaGF2ZSBkb2N1bWVudEVs
ZW1lbnQKKyAgICAvLyBOT1RFOiB0aGlzIGFzc3VtZXMgdGhhdCBlbGVtZW50IHRoYXQgZ2V0cyBw
YXNzZWQgdG8gc3R5bGVGb3JFbGVtZW50IC1jYWxsCisgICAgLy8gaXMgYWx3YXlzIGZyb20gdGhl
IGRvY3VtZW50IHRoYXQgb3ducyB0aGUgc3R5bGUgc2VsZWN0b3IKKyAgICBGcmFtZVZpZXcqIHZp
ZXcgPSBkb2N1bWVudC0+dmlldygpOworICAgIGlmICh2aWV3KQorICAgICAgICBtX21lZGl1bSA9
IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVhdG9yKHZpZXctPm1lZGlhVHlwZSgpKSk7Cisg
ICAgZWxzZQorICAgICAgICBtX21lZGl1bSA9IGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5RXZhbHVh
dG9yKCJhbGwiKSk7CisKKyAgICBpZiAocm9vdCkKKyAgICAgICAgbV9yb290RGVmYXVsdFN0eWxl
ID0gc3R5bGVGb3JFbGVtZW50KHJvb3QsIDAsIERpc2FsbG93U3R5bGVTaGFyaW5nLCBNYXRjaE9u
bHlVc2VyQWdlbnRSdWxlcyk7CisKKyAgICBpZiAobV9yb290RGVmYXVsdFN0eWxlICYmIHZpZXcp
CisgICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmll
dy0+bWVkaWFUeXBlKCksIHZpZXctPmZyYW1lKCksIG1fcm9vdERlZmF1bHRTdHlsZS5nZXQoKSkp
OworCisgICAgbV9ydWxlU2V0cy5yZXNldEF1dGhvclN0eWxlKCk7CisKKyAgICBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbiA9IGRvY3VtZW50LT5zdHls
ZVNoZWV0Q29sbGVjdGlvbigpOworICAgIG1fcnVsZVNldHMuaW5pdFVzZXJTdHlsZShzdHlsZVNo
ZWV0Q29sbGVjdGlvbiwgKm1fbWVkaXVtLCAqdGhpcyk7CisKKyNpZiBFTkFCTEUoU1ZHX0ZPTlRT
KQorICAgIGlmIChkb2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygpKSB7CisgICAgICAgIGNvbnN0IEhh
c2hTZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj4mIHN2Z0ZvbnRGYWNlRWxlbWVudHMgPSBkb2N1bWVu
dC0+c3ZnRXh0ZW5zaW9ucygpLT5zdmdGb250RmFjZUVsZW1lbnRzKCk7CisgICAgICAgIEhhc2hT
ZXQ8U1ZHRm9udEZhY2VFbGVtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHN2Z0ZvbnRGYWNl
RWxlbWVudHMuZW5kKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQq
Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdmdGb250RmFjZUVsZW1lbnRzLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkKKyAgICAgICAgICAgIGZvbnRTZWxlY3RvcigpLT5hZGRGb250RmFjZVJ1bGUo
KCppdCktPmZvbnRGYWNlUnVsZSgpKTsKKyAgICB9CisjZW5kaWYKKworICAgIGFwcGVuZEF1dGhv
clN0eWxlU2hlZXRzKDAsIHN0eWxlU2hlZXRDb2xsZWN0aW9uLT5hY3RpdmVBdXRob3JTdHlsZVNo
ZWV0cygpKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBlbmRBdXRob3JTdHlsZVNoZWV0
cyh1bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+
JiBzdHlsZVNoZWV0cykKK3sKKyAgICBtX3J1bGVTZXRzLmFwcGVuZEF1dGhvclN0eWxlU2hlZXRz
KGZpcnN0TmV3LCBzdHlsZVNoZWV0cywgbV9tZWRpdW0uZ2V0KCksIG1faW5zcGVjdG9yQ1NTT01X
cmFwcGVycywgZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIHRoaXMpOworICAgIGlmIChkb2N1
bWVudCgpLT5yZW5kZXJlcigpICYmIGRvY3VtZW50KCktPnJlbmRlcmVyKCktPnN0eWxlKCkpCisg
ICAgICAgIGRvY3VtZW50KCktPnJlbmRlcmVyKCktPnN0eWxlKCktPmZvbnQoKS51cGRhdGUoZm9u
dFNlbGVjdG9yKCkpOworCisjaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICB2
aWV3cG9ydFN0eWxlUmVzb2x2ZXIoKS0+cmVzb2x2ZSgpOworI2VuZGlmCit9CisKK3ZvaWQgU3R5
bGVSZXNvbHZlcjo6cHVzaFBhcmVudEVsZW1lbnQoRWxlbWVudCogcGFyZW50KQoreworICAgIGNv
bnN0IENvbnRhaW5lck5vZGUqIHBhcmVudHNQYXJlbnQgPSBwYXJlbnQtPnBhcmVudE9yU2hhZG93
SG9zdEVsZW1lbnQoKTsKKworICAgIC8vIFdlIGFyZSBub3QgYWx3YXlzIGludm9rZWQgY29uc2lz
dGVudGx5LiBGb3IgZXhhbXBsZSwgc2NyaXB0IGV4ZWN1dGlvbiBjYW4gY2F1c2UgdXMgdG8gZW50
ZXIKKyAgICAvLyBzdHlsZSByZWNhbGMgaW4gdGhlIG1pZGRsZSBvZiB0cmVlIGJ1aWxkaW5nLiBX
ZSBtYXkgYWxzbyBiZSBpbnZva2VkIGZyb20gc29tZXdoZXJlIHdpdGhpbiB0aGUgdHJlZS4KKyAg
ICAvLyBSZXNldCB0aGUgc3RhY2sgaW4gdGhpcyBjYXNlLCBvciBpZiB3ZSBzZWUgYSBuZXcgcm9v
dCBlbGVtZW50LgorICAgIC8vIE90aGVyd2lzZSBqdXN0IHB1c2ggdGhlIG5ldyBwYXJlbnQuCisg
ICAgaWYgKCFwYXJlbnRzUGFyZW50IHx8IG1fc2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0Vt
cHR5KCkpCisgICAgICAgIG1fc2VsZWN0b3JGaWx0ZXIuc2V0dXBQYXJlbnRTdGFjayhwYXJlbnQp
OworICAgIGVsc2UKKyAgICAgICAgbV9zZWxlY3RvckZpbHRlci5wdXNoUGFyZW50KHBhcmVudCk7
CisKKyAgICAvLyBOb3RlOiBXZSBtdXN0bid0IHNraXAgU2hhZG93Um9vdCBub2RlcyBmb3IgdGhl
IHNjb3BlIHN0YWNrLgorICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVS
ZXNvbHZlci0+cHVzaChwYXJlbnQsIHBhcmVudC0+cGFyZW50T3JTaGFkb3dIb3N0Tm9kZSgpKTsK
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqIHBhcmVu
dCkKK3sKKyAgICAvLyBOb3RlIHRoYXQgd2UgbWF5IGdldCBpbnZva2VkIGZvciBzb21lIHJhbmRv
bSBlbGVtZW50cyBpbiBzb21lIHdhY2t5IGNhc2VzIGR1cmluZyBzdHlsZSByZXNvbHZlLgorICAg
IC8vIFBhdXNlIG1haW50YWluaW5nIHRoZSBzdGFjayBpbiB0aGlzIGNhc2UuCisgICAgaWYgKG1f
c2VsZWN0b3JGaWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQocGFyZW50KSkKKyAgICAgICAg
bV9zZWxlY3RvckZpbHRlci5wb3BQYXJlbnQoKTsKKyAgICBpZiAobV9zY29wZVJlc29sdmVyKQor
ICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnBvcChwYXJlbnQpOworfQorCit2b2lkIFN0eWxlUmVz
b2x2ZXI6OnB1c2hQYXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3Qp
Cit7CisgICAgQVNTRVJUKHNoYWRvd1Jvb3QtPmhvc3QoKSk7CisgICAgaWYgKG1fc2NvcGVSZXNv
bHZlcikKKyAgICAgICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHNoYWRvd1Jvb3QsIHNoYWRvd1Jv
b3QtPmhvc3QoKSk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6cG9wUGFyZW50U2hhZG93Um9v
dChjb25zdCBTaGFkb3dSb290KiBzaGFkb3dSb290KQoreworICAgIEFTU0VSVChzaGFkb3dSb290
LT5ob3N0KCkpOworICAgIGlmIChtX3Njb3BlUmVzb2x2ZXIpCisgICAgICAgIG1fc2NvcGVSZXNv
bHZlci0+cG9wKHNoYWRvd1Jvb3QpOworfQorCisvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCBzdHls
ZSBzZXR0aW5nIGZ1bmN0aW9uIGZvciBrZXlmcmFtZSBzdHlsZXMKK3ZvaWQgU3R5bGVSZXNvbHZl
cjo6YWRkS2V5ZnJhbWVTdHlsZShQYXNzUmVmUHRyPFN0eWxlUnVsZUtleWZyYW1lcz4gcnVsZSkK
K3sKKyAgICBBdG9taWNTdHJpbmcgcyhydWxlLT5uYW1lKCkpOworICAgIG1fa2V5ZnJhbWVzUnVs
ZU1hcC5zZXQocy5pbXBsKCksIHJ1bGUpOworfQorCitTdHlsZVJlc29sdmVyOjp+U3R5bGVSZXNv
bHZlcigpCit7CisgICAgbV9mb250U2VsZWN0b3ItPmNsZWFyRG9jdW1lbnQoKTsKKworI2lmIEVO
QUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIt
PmNsZWFyRG9jdW1lbnQoKTsKKyNlbmRpZgorfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVw
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29sdmVyPiopCit7CisgICAgLy8g
TG9vayBmb3IgY2FjaGUgZW50cmllcyBjb250YWluaW5nIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0
aCBhIHNpbmdsZSByZWYgYW5kIHJlbW92ZSB0aGVtLgorICAgIC8vIFRoaXMgbWF5IGhhcHBlbiB3
aGVuIGFuIGVsZW1lbnQgYXR0cmlidXRlIG11dGF0aW9uIGNhdXNlcyBpdCB0byBnZW5lcmF0ZSBh
IG5ldyBpbmxpbmVTdHlsZSgpCisgICAgLy8gb3IgcHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUo
KSwgcG90ZW50aWFsbHkgbGVhdmluZyB0aGlzIGNhY2hlIHdpdGggdGhlIGxhc3QgcmVmIG9uIHRo
ZSBvbGQgb25lLgorICAgIFZlY3Rvcjx1bnNpZ25lZCwgMTY+IHRvUmVtb3ZlOworICAgIE1hdGNo
ZWRQcm9wZXJ0aWVzQ2FjaGU6Oml0ZXJhdG9yIGl0ID0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hl
LmJlZ2luKCk7CisgICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgZW5kID0gbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpOworICAgIGZvciAoOyBpdCAhPSBlbmQ7ICsraXQp
IHsKKyAgICAgICAgVmVjdG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiYgbWF0Y2hlZFByb3BlcnRpZXMg
PSBpdC0+dmFsdWUubWF0Y2hlZFByb3BlcnRpZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgbWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICht
YXRjaGVkUHJvcGVydGllc1tpXS5wcm9wZXJ0aWVzLT5oYXNPbmVSZWYoKSkgeworICAgICAgICAg
ICAgICAgIHRvUmVtb3ZlLmFwcGVuZChpdC0+a2V5KTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHRvUmVtb3ZlLnNpemUoKTsgKytpKQorICAgICAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUucmVtb3ZlKHRvUmVtb3ZlW2ldKTsKKworICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFk
ZGl0aW9uc1NpbmNlTGFzdFN3ZWVwID0gMDsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphZGRN
YXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IFN0eWxlUHJv
cGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgdW5zaWduZWQgbGlua01hdGNo
VHlwZSwgUHJvcGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAg
ICBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5ncm93KG1hdGNoUmVzdWx0Lm1hdGNoZWRQ
cm9wZXJ0aWVzLnNpemUoKSArIDEpOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0
aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMubGFzdCgpOworICAgIG5ld1Byb3Bl
cnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8U3R5bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRp
ZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlua01hdGNoVHlwZSA9IGxpbmtNYXRjaFR5cGU7Cisg
ICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBlID0gcHJvcGVydHlXaGl0ZWxpc3RUeXBlOwor
ICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7Cit9CisKK2lubGluZSB2
b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQm
IHJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydHlTZXQsIGJvb2wgaXNDYWNo
ZWFibGUpCit7CisgICAgaWYgKCFwcm9wZXJ0eVNldCkKKyAgICAgICAgcmV0dXJuOworICAgIHJl
c3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6
ZSgpOworICAgIGlmIChyZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9PSAtMSkKKyAgICAg
ICAgcmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUgPSByZXN1bHQucmFuZ2VzLmxhc3RBdXRo
b3JSdWxlOworICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgcHJvcGVydHlTZXQpOwor
ICAgIGlmICghaXNDYWNoZWFibGUpCisgICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZhbHNl
OworfQorCitjbGFzcyBNYXRjaGluZ1VBUnVsZXNTY29wZSB7CitwdWJsaWM6CisgICAgTWF0Y2hp
bmdVQVJ1bGVzU2NvcGUoKTsKKyAgICB+TWF0Y2hpbmdVQVJ1bGVzU2NvcGUoKTsKKworICAgIHN0
YXRpYyBib29sIGlzTWF0Y2hpbmdVQVJ1bGVzKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJv
b2wgbV9tYXRjaGluZ1VBUnVsZXM7Cit9OworCitNYXRjaGluZ1VBUnVsZXNTY29wZTo6TWF0Y2hp
bmdVQVJ1bGVzU2NvcGUoKQoreworICAgIEFTU0VSVCghbV9tYXRjaGluZ1VBUnVsZXMpOworICAg
IG1fbWF0Y2hpbmdVQVJ1bGVzID0gdHJ1ZTsKK30KKworTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6On5N
YXRjaGluZ1VBUnVsZXNTY29wZSgpCit7CisgICAgbV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsK
K30KKworaW5saW5lIGJvb2wgTWF0Y2hpbmdVQVJ1bGVzU2NvcGU6OmlzTWF0Y2hpbmdVQVJ1bGVz
KCkKK3sKKyAgICByZXR1cm4gbV9tYXRjaGluZ1VBUnVsZXM7Cit9CisKK2Jvb2wgTWF0Y2hpbmdV
QVJ1bGVzU2NvcGU6Om1fbWF0Y2hpbmdVQVJ1bGVzID0gZmFsc2U7CisKK3ZvaWQgU3R5bGVSZXNv
bHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVl
c3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQoreworICAgIEFTU0VSVChtYXRjaFJlcXVlc3QucnVs
ZVNldCk7CisgICAgQVNTRVJUKG1fc3RhdGUuZWxlbWVudCgpKTsKKworICAgIFN0YXRlJiBzdGF0
ZSA9IG1fc3RhdGU7CisgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRlLmVsZW1lbnQoKTsKKyAg
ICBjb25zdCBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50ID0gc3RhdGUuc3R5bGVkRWxlbWVu
dCgpOworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgcHNldWRvSWQgPSBlbGVtZW50LT5zaGFkb3dQ
c2V1ZG9JZCgpOworICAgIGlmICghcHNldWRvSWQuaXNFbXB0eSgpKSB7CisgICAgICAgIEFTU0VS
VChzdHlsZWRFbGVtZW50KTsKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1h
dGNoUmVxdWVzdC5ydWxlU2V0LT5zaGFkb3dQc2V1ZG9FbGVtZW50UnVsZXMocHNldWRvSWQuaW1w
bCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIH0KKworI2lmIEVOQUJMRShWSURF
T19UUkFDSykKKyAgICBpZiAoZWxlbWVudC0+aXNXZWJWVFRFbGVtZW50KCkpCisgICAgICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+Y3VlUHNldWRv
UnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2VuZGlmCisgICAgLy8gQ2hlY2sg
d2hldGhlciBvdGhlciB0eXBlcyBvZiBydWxlcyBhcmUgYXBwbGljYWJsZSBpbiB0aGUgY3VycmVu
dCB0cmVlIHNjb3BlLiBDcml0ZXJpYSBmb3IgdGhpczoKKyAgICAvLyBhKSBpdCdzIGEgVUEgcnVs
ZQorICAgIC8vIGIpIHRoZSB0cmVlIHNjb3BlIGFsbG93cyBhdXRob3IgcnVsZXMKKyAgICAvLyBj
KSB0aGUgcnVsZXMgY29tZXMgZnJvbSBhIHNjb3BlZCBzdHlsZSBzaGVldCB3aXRoaW4gdGhlIHNh
bWUgdHJlZSBzY29wZQorICAgIFRyZWVTY29wZSogdHJlZVNjb3BlID0gZWxlbWVudC0+dHJlZVNj
b3BlKCk7CisgICAgaWYgKCFNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMo
KQorICAgICAgICAmJiAhdHJlZVNjb3BlLT5hcHBseUF1dGhvclN0eWxlcygpCisgICAgICAgICYm
ICghbWF0Y2hSZXF1ZXN0LnNjb3BlIHx8IG1hdGNoUmVxdWVzdC5zY29wZS0+dHJlZVNjb3BlKCkg
IT0gdHJlZVNjb3BlKQorICAgICAgICAmJiBtYXRjaFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5
ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENyb3NzQm91bmRhcnkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIFdlIG5lZWQgdG8gY29sbGVjdCB0aGUgcnVsZXMgZm9yIGlkLCBjbGFzcywg
dGFnLCBhbmQgZXZlcnl0aGluZyBlbHNlIGludG8gYSBidWZmZXIgYW5kCisgICAgLy8gdGhlbiBz
b3J0IHRoZSBidWZmZXIuCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkpCisgICAgICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+aWRSdWxlcyhlbGVt
ZW50LT5pZEZvclN0eWxlUmVzb2x1dGlvbigpLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJh
bmdlKTsKKyAgICBpZiAoc3R5bGVkRWxlbWVudCAmJiBzdHlsZWRFbGVtZW50LT5oYXNDbGFzcygp
KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3R5bGVkRWxlbWVudC0+Y2xhc3NO
YW1lcygpLnNpemUoKTsgKytpKQorICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jbGFzc1J1bGVzKHN0eWxlZEVsZW1lbnQtPmNsYXNz
TmFtZXMoKVtpXS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgfQorCisg
ICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKQorICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zv
ckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmxpbmtQc2V1ZG9DbGFzc1J1bGVzKCksIG1hdGNo
UmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICBpZiAoU2VsZWN0b3JDaGVja2VyOjptYXRjaGVzRm9j
dXNQc2V1ZG9DbGFzcyhlbGVtZW50KSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JM
aXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5mb2N1c1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hS
ZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRj
aFJlcXVlc3QucnVsZVNldC0+dGFnUnVsZXMoZWxlbWVudC0+bG9jYWxOYW1lKCkuaW1wbCgpKSwg
bWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlz
dChtYXRjaFJlcXVlc3QucnVsZVNldC0+dW5pdmVyc2FsUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBy
dWxlUmFuZ2UpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmNvbGxlY3RNYXRjaGluZ1J1bGVz
Rm9yUmVnaW9uKGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxlUmFuZ2UmIHJ1
bGVSYW5nZSkKK3sKKyAgICBpZiAoIW1fc3RhdGUucmVnaW9uRm9yU3R5bGluZygpKQorICAgICAg
ICByZXR1cm47CisKKyAgICB1bnNpZ25lZCBzaXplID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1f
cmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNl
bGVjdG9yID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNl
dHMuYXQoaSkuc2VsZWN0b3I7CisgICAgICAgIGlmIChjaGVja1JlZ2lvblNlbGVjdG9yKHJlZ2lv
blNlbGVjdG9yLCBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5n
KCktPm5vZGUoKSkpKSB7CisgICAgICAgICAgICBSdWxlU2V0KiByZWdpb25SdWxlcyA9IG1hdGNo
UmVxdWVzdC5ydWxlU2V0LT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVT
ZXQuZ2V0KCk7CisgICAgICAgICAgICBBU1NFUlQocmVnaW9uUnVsZXMpOworICAgICAgICAgICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJlZ2lvblJ1bGVzLCBtYXRjaFJlcXVl
c3QuaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdC5zY29wZSksIHJ1bGVSYW5nZSk7Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydEFuZFRyYW5zZmVy
TWF0Y2hlZFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQpCit7CisgICAgU3RhdGUmIHN0YXRlID0g
bV9zdGF0ZTsKKyAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcyA9
IHN0YXRlLm1hdGNoZWRSdWxlcygpOworICAgIGlmIChtYXRjaGVkUnVsZXMuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBzb3J0TWF0Y2hlZFJ1bGVzKCk7CisKKyAgICBpZiAoc3Rh
dGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKSB7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyArK2kpCisgICAg
ICAgICAgICBzdGF0ZS5lbnN1cmVSdWxlTGlzdCgpLT5ydWxlcygpLmFwcGVuZChtYXRjaGVkUnVs
ZXNbaV0tPnJ1bGUoKS0+Y3JlYXRlQ1NTT01XcmFwcGVyKCkpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgLy8gTm93IHRyYW5zZmVyIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBvdmVy
IHRvIG91ciBsaXN0IG9mIGRlY2xhcmF0aW9ucy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbWF0Y2hlZFJ1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgp
ICYmIG1hdGNoZWRSdWxlc1tpXS0+Y29udGFpbnNVbmNvbW1vbkF0dHJpYnV0ZVNlbGVjdG9yKCkp
CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAgYWRkTWF0
Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKS0+cHJvcGVydGll
cygpLCBtYXRjaGVkUnVsZXNbaV0tPnJ1bGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5saW5rTWF0Y2hU
eXBlKCksIG1hdGNoZWRSdWxlc1tpXS0+cHJvcGVydHlXaGl0ZWxpc3RUeXBlKCkpOworICAgIH0K
K30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFNjb3BlZEF1dGhvclJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisjaWYgRU5BQkxFKFNUWUxF
X1NDT1BFRCkgfHwgRU5BQkxFKFNIQURPV19ET00pCisgICAgaWYgKCFtX3Njb3BlUmVzb2x2ZXIp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIHNjb3BlZCBhdXRob3IgcnVsZXMgYnkg
dHJhdmVyc2luZyB0aGUgc2NvcGVkIGVsZW1lbnQgc3RhY2sgKHJlYnVpbGQgaXQgaWYgaXQgZ290
IGluY29uc2lzdGVudCkuCisgICAgaWYgKG1fc2NvcGVSZXNvbHZlci0+aGFzU2NvcGVkU3R5bGVz
KCkgJiYgbV9zY29wZVJlc29sdmVyLT5lbnN1cmVTdGFja0NvbnNpc3RlbmN5KG1fc3RhdGUuZWxl
bWVudCgpKSkgeworICAgICAgICBib29sIGFwcGx5QXV0aG9yU3R5bGVzID0gbV9zdGF0ZS5lbGVt
ZW50KCktPnRyZWVTY29wZSgpLT5hcHBseUF1dGhvclN0eWxlcygpOworICAgICAgICBib29sIGRv
Y3VtZW50U2NvcGUgPSB0cnVlOworICAgICAgICB1bnNpZ25lZCBzY29wZVNpemUgPSBtX3Njb3Bl
UmVzb2x2ZXItPnN0YWNrU2l6ZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
c2NvcGVTaXplOyArK2kpIHsKKyAgICAgICAgICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xl
YXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQu
bWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgICAgICAgICAgY29uc3QgU3R5bGVT
Y29wZVJlc29sdmVyOjpTdGFja0ZyYW1lJiBmcmFtZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tG
cmFtZUF0KGkpOworICAgICAgICAgICAgZG9jdW1lbnRTY29wZSA9IGRvY3VtZW50U2NvcGUgJiYg
IWZyYW1lLm1fc2NvcGUtPmlzSW5TaGFkb3dUcmVlKCk7CisgICAgICAgICAgICBpZiAoZG9jdW1l
bnRTY29wZSkgeworICAgICAgICAgICAgICAgIGlmICghYXBwbHlBdXRob3JTdHlsZXMpCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIW1fc2NvcGVSZXNvbHZlci0+bWF0Y2hlc1N0eWxlQm91bmRzKGZyYW1lKSkK
KyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIE1hdGNoUmVxdWVzdCBtYXRjaFJlcXVlc3QoZnJhbWUubV9ydWxlU2V0LCBpbmNsdWRlRW1w
dHlSdWxlcywgZnJhbWUubV9zY29wZSk7CisgICAgICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICAgICAgICAgIGNvbGxlY3RN
YXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICAgICAgICAgIGNvbGxl
Y3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKKyAgICAg
ICAgICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgbWF0Y2hIb3N0UnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlSdWxlcyk7Cisj
ZWxzZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOworICAgIFVOVVNFRF9QQVJBTShpbmNsdWRl
RW1wdHlSdWxlcyk7CisjZW5kaWYKK30KKworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6c3R5
bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpCit7CisjaWYgRU5BQkxFKFNIQURP
V19ET00pCisgICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlciAmJiBtX3Njb3BlUmVzb2x2ZXItPnN0
eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCkpOwor
I2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVy
OjptYXRjaEhvc3RSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBib29sIGluY2x1ZGVFbXB0eVJ1
bGVzKQoreworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAgIEFTU0VSVChtX3Njb3BlUmVzb2x2
ZXIpOworCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJlc3VsdC5y
YW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MTsKKworICAgIFZlY3RvcjxSdWxlU2V0Kj4gbWF0Y2hlZFJ1bGVzOworICAgIG1fc2NvcGVSZXNv
bHZlci0+bWF0Y2hIb3N0UnVsZXMobV9zdGF0ZS5lbGVtZW50KCksIG1hdGNoZWRSdWxlcyk7Cisg
ICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZv
ciAodW5zaWduZWQgaSA9IG1hdGNoZWRSdWxlcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKKyAgICAg
ICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuYXV0aG9yUnVsZVJhbmdlKCk7
CisgICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChtYXRjaGVkUnVsZXMu
YXQoaS0xKSwgaW5jbHVkZUVtcHR5UnVsZXMsIG1fc3RhdGUuZWxlbWVudCgpKSwgcnVsZVJhbmdl
KTsKKyAgICB9CisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisjZWxz
ZQorICAgIFVOVVNFRF9QQVJBTShyZXN1bHQpOworICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlRW1w
dHlSdWxlcyk7CisjZW5kaWYKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaEF1dGhvclJ1
bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCit7CisgICAg
bV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworICAgIHJlc3VsdC5yYW5nZXMubGFzdEF1
dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKKworICAgIGlm
ICghbV9zdGF0ZS5lbGVtZW50KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1hdGNoIGds
b2JhbCBhdXRob3IgcnVsZXMuCisgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChtX3J1bGVT
ZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFuZ2UgcnVs
ZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7CisgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOworI2lmIEVOQUJMRShTSEFE
T1dfRE9NKQorICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1hdGNoUmVxdWVzdHM7CisgICAgbV9y
dWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29sbGVjdE1hdGNoUmVxdWVzdHMoaW5j
bHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKKyAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKKyNlbmRpZgorCisgICAgc29ydEFuZFRy
YW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisKKyAgICBtYXRjaFNjb3BlZEF1dGhvclJ1bGVz
KHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMp
Cit7CisgICAgaWYgKCFtX3J1bGVTZXRzLnVzZXJTdHlsZSgpKQorICAgICAgICByZXR1cm47Cisg
ICAgCisgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOworCisgICAgcmVzdWx0LnJh
bmdlcy5sYXN0VXNlclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsK
KyAgICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGlu
Y2x1ZGVFbXB0eVJ1bGVzKTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdl
cy51c2VyUnVsZVJhbmdlKCk7CisgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0
LCBydWxlUmFuZ2UpOworICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVx
dWVzdCwgcnVsZVJhbmdlKTsKKworICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1
bHQpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYg
cmVzdWx0LCBSdWxlU2V0KiBydWxlcykKK3sKKyAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNs
ZWFyKCk7CisgICAgCisgICAgcmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNo
ZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7CisgICAgUnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3Vs
dC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJl
cXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOworCisgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKHJlc3VsdCk7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVs
ZXNGb3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVl
c3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit7CisgICAgaWYgKCFydWxl
cykKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICAv
LyBJbiBzb21lIGNhc2VzIHdlIG1heSBlbmQgdXAgbG9va2luZyB1cCBzdHlsZSBmb3IgcmFuZG9t
IGVsZW1lbnRzIGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnNpdmUgdHJlZSByZXNvbHZlLgorICAg
IC8vIEFuY2VzdG9yIGlkZW50aWZpZXIgZmlsdGVyIHdvbid0IGJlIHVwLXRvLWRhdGUgaW4gdGhh
dCBjYXNlIGFuZCB3ZSBjYW4ndCB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICBib29sIGNhblVzZUZh
c3RSZWplY3QgPSBtX3NlbGVjdG9yRmlsdGVyLnBhcmVudFN0YWNrSXNDb25zaXN0ZW50KHN0YXRl
LnBhcmVudE5vZGUoKSkgJiYgbWF0Y2hSZXF1ZXN0LmJlaGF2aW9yQXRCb3VuZGFyeSA9PSBTZWxl
Y3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5OworCisgICAgdW5zaWduZWQgc2l6ZSA9
IHJ1bGVzLT5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkg
eworICAgICAgICBjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEgPSBydWxlcy0+YXQoaSk7CisgICAg
ICAgIGlmIChjYW5Vc2VGYXN0UmVqZWN0ICYmIG1fc2VsZWN0b3JGaWx0ZXIuZmFzdFJlamVjdFNl
bGVjdG9yPFJ1bGVEYXRhOjptYXhpbXVtSWRlbnRpZmllckNvdW50PihydWxlRGF0YS5kZXNjZW5k
YW50U2VsZWN0b3JJZGVudGlmaWVySGFzaGVzKCkpKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgU3R5bGVSdWxlKiBydWxlID0gcnVsZURhdGEucnVsZSgpOworICAgICAgICBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgY29va2llID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uOjp3aWxsTWF0Y2hSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworICAgICAgICBQc2V1
ZG9JZCBkeW5hbWljUHNldWRvID0gTk9QU0VVRE87CisgICAgICAgIGlmIChydWxlTWF0Y2hlcyhy
dWxlRGF0YSwgbWF0Y2hSZXF1ZXN0LnNjb3BlLCBkeW5hbWljUHNldWRvLCBtYXRjaFJlcXVlc3Qu
YmVoYXZpb3JBdEJvdW5kYXJ5KSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5v
IHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0IGluIHRoZSBub24tZGVidWcgbW9k
ZS4KKyAgICAgICAgICAgIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxl
LT5wcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgKHByb3BlcnRp
ZXMtPmlzRW1wdHkoKSAmJiAhbWF0Y2hSZXF1ZXN0LmluY2x1ZGVFbXB0eVJ1bGVzKSkgeworICAg
ICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tp
ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgLy8gRklYTUU6IEV4cG9zaW5nIHRoZSBub24tc3RhbmRhcmQgZ2V0TWF0Y2hlZENT
U1J1bGVzIEFQSSB0byB3ZWIgaXMgdGhlIG9ubHkgcmVhc29uIHRoaXMgaXMgbmVlZGVkLgorICAg
ICAgICAgICAgaWYgKHN0YXRlLmlzU2FtZU9yaWdpbk9ubHkoKSAmJiAhcnVsZURhdGEuaGFzRG9j
dW1lbnRTZWN1cml0eU9yaWdpbigpKSB7CisgICAgICAgICAgICAgICAgSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7CisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBtYXRjaGlu
ZyBub3JtYWwgcnVsZXMsIHNldCBhIHBzZXVkbyBiaXQgaWYKKyAgICAgICAgICAgIC8vIHdlIHJl
YWxseSBqdXN0IG1hdGNoZWQgYSBwc2V1ZG8tZWxlbWVudC4KKyAgICAgICAgICAgIGlmIChkeW5h
bWljUHNldWRvICE9IE5PUFNFVURPICYmIHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVk
b0lkID09IE5PUFNFVURPKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLm1vZGUoKSA9PSBT
ZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcykgeworICAgICAgICAgICAgICAgICAgICBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGlmIChkeW5hbWljUHNldWRvIDwgRklSU1RfSU5URVJOQUxfUFNFVURPSUQpCisgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEhhc1BzZXVkb1N0eWxlKGR5bmFtaWNQ
c2V1ZG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUg
b3VyIGZpcnN0L2xhc3QgcnVsZSBpbmRpY2VzIGluIHRoZSBtYXRjaGVkIHJ1bGVzIGFycmF5Lgor
ICAgICAgICAgICAgICAgICsrcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisgICAgICAgICAgICAg
ICAgaWYgKHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICAg
ICAgcnVsZVJhbmdlLmZpcnN0UnVsZUluZGV4ID0gcnVsZVJhbmdlLmxhc3RSdWxlSW5kZXg7CisK
KyAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBydWxlIHRvIG91ciBsaXN0IG9mIG1hdGNoZWQg
cnVsZXMuCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5hZGRNYXRjaGVkUnVsZSgmcnVsZURhdGEp
OworICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1
bGUoY29va2llLCBmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFy
ZVJ1bGVzKGNvbnN0IFJ1bGVEYXRhKiByMSwgY29uc3QgUnVsZURhdGEqIHIyKQoreworICAgIHVu
c2lnbmVkIHNwZWNpZmljaXR5MSA9IHIxLT5zcGVjaWZpY2l0eSgpOworICAgIHVuc2lnbmVkIHNw
ZWNpZmljaXR5MiA9IHIyLT5zcGVjaWZpY2l0eSgpOworICAgIHJldHVybiAoc3BlY2lmaWNpdHkx
ID09IHNwZWNpZmljaXR5MikgPyByMS0+cG9zaXRpb24oKSA8IHIyLT5wb3NpdGlvbigpIDogc3Bl
Y2lmaWNpdHkxIDwgc3BlY2lmaWNpdHkyOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OnNvcnRN
YXRjaGVkUnVsZXMoKQoreworICAgIHN0ZDo6c29ydChtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmJl
Z2luKCksIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuZW5kKCksIGNvbXBhcmVSdWxlcyk7Cit9CisK
K3ZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBi
b29sIGluY2x1ZGVTTUlMUHJvcGVydGllcykKK3sKKyAgICBtYXRjaFVBUnVsZXMocmVzdWx0KTsK
KworICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgorICAgIGlmIChtX21hdGNo
QXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMocmVzdWx0LCBmYWxz
ZSk7CisKKyAgICAvLyBOb3cgY2hlY2sgYXV0aG9yIHJ1bGVzLCBiZWdpbm5pbmcgZmlyc3Qgd2l0
aCBwcmVzZW50YXRpb25hbCBhdHRyaWJ1dGVzIG1hcHBlZCBmcm9tIEhUTUwuCisgICAgaWYgKG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpKSB7CisgICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRp
ZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRl
U3R5bGUoKSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNrIGFkZGl0aW9uYWwgbWFwcGVkIGRl
Y2xhcmF0aW9ucy4KKyAgICAgICAgLy8gVGFibGVzIGFuZCB0YWJsZSBjZWxscyBzaGFyZSBhbiBh
ZGRpdGlvbmFsIG1hcHBlZCBydWxlIHRoYXQgbXVzdCBiZSBhcHBsaWVkCisgICAgICAgIC8vIGFm
dGVyIGFsbCBhdHRyaWJ1dGVzLCBzaW5jZSB0aGVpciBtYXBwZWQgc3R5bGUgZGVwZW5kcyBvbiB0
aGUgdmFsdWVzIG9mIG11bHRpcGxlIGF0dHJpYnV0ZXMuCisgICAgICAgIGFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25hbFBy
ZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkpOworCisgICAgICAgIGlmIChtX3N0YXRlLnN0eWxl
ZEVsZW1lbnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBib29sIGlzQXV0bzsK
KyAgICAgICAgICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbiA9IHRvSFRNTEVsZW1lbnQo
bV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5kaXJlY3Rpb25hbGl0eUlmaGFzRGlyQXV0b0F0dHJp
YnV0ZShpc0F1dG8pOworICAgICAgICAgICAgaWYgKGlzQXV0bykKKyAgICAgICAgICAgICAgICBh
ZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIHRleHREaXJlY3Rpb24gPT0gTFRSID8gbGVmdFRv
UmlnaHREZWNsYXJhdGlvbigpIDogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICAvLyBDaGVjayB0aGUgcnVsZXMgaW4gYXV0aG9yIHNoZWV0cyBu
ZXh0LgorICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAgICAgICAgbWF0Y2hB
dXRob3JSdWxlcyhyZXN1bHQsIGZhbHNlKTsKKworICAgIC8vIE5vdyBjaGVjayBvdXIgaW5saW5l
IHN0eWxlIGF0dHJpYnV0ZS4KKyAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYg
bV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlubGlu
ZVN0eWxlKCkpIHsKKyAgICAgICAgLy8gSW5saW5lIHN0eWxlIGlzIGltbXV0YWJsZSBhcyBsb25n
IGFzIHRoZXJlIGlzIG5vIENTU09NIHdyYXBwZXIuCisgICAgICAgIC8vIEZJWE1FOiBNZWRpYSBj
b250cm9sIHNoYWRvdyB0cmVlcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBjYWNoaW5nLgor
ICAgICAgICBib29sIGlzSW5saW5lU3R5bGVDYWNoZWFibGUgPSAhbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlubGluZVN0eWxlKCktPmlzTXV0YWJsZSgpICYmICFtX3N0YXRlLnN0eWxlZEVsZW1l
bnQoKS0+aXNJblNoYWRvd1RyZWUoKTsKKyAgICAgICAgLy8gRklYTUU6IENvbnN0aWZ5LgorICAg
ICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVt
ZW50KCktPmlubGluZVN0eWxlKCksIGlzSW5saW5lU3R5bGVDYWNoZWFibGUpOworICAgIH0KKwor
I2lmIEVOQUJMRShTVkcpCisgICAgLy8gTm93IGNoZWNrIFNNSUwgYW5pbWF0aW9uIG92ZXJyaWRl
IHN0eWxlLgorICAgIGlmIChpbmNsdWRlU01JTFByb3BlcnRpZXMgJiYgbV9tYXRjaEF1dGhvckFu
ZFVzZXJTdHlsZXMgJiYgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkgJiYgbV9zdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmlzU1ZHRWxlbWVudCgpKQorICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0
aWVzKHJlc3VsdCwgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpKS0+YW5pbWF0ZWRTTUlMU3R5bGVQcm9wZXJ0aWVzKCksIGZhbHNlIC8qIGlzQ2FjaGVhYmxl
ICovKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVTTUlMUHJvcGVydGllcyk7Cisj
ZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVz
KGNvbnN0IFNwYWNlU3BsaXRTdHJpbmcmIGNsYXNzTmFtZXMpIGNvbnN0Cit7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGNsYXNzTmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYg
KG1fcnVsZVNldHMuZmVhdHVyZXMoKS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFzc05hbWVz
W2ldLmltcGwoKSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJu
IGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEVsZW1l
bnQoRWxlbWVudCogZSkKK3sKKyAgICBtX2VsZW1lbnQgPSBlOworICAgIG1fc3R5bGVkRWxlbWVu
dCA9IGUgJiYgZS0+aXNTdHlsZWRFbGVtZW50KCkgPyBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50
Kj4oZSkgOiAwOworICAgIG1fZWxlbWVudExpbmtTdGF0ZSA9IGUgPyBlLT5kb2N1bWVudCgpLT52
aXNpdGVkTGlua1N0YXRlKCktPmRldGVybWluZUxpbmtTdGF0ZShlKSA6IE5vdEluc2lkZUxpbms7
Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KEVsZW1lbnQqIGUp
Cit7CisgICAgaWYgKG1fc3RhdGUuZWxlbWVudCgpICE9IGUpIHsKKyAgICAgICAgbV9zdGF0ZS5p
bml0RWxlbWVudChlKTsKKyAgICAgICAgaWYgKGUgJiYgZSA9PSBlLT5kb2N1bWVudCgpLT5kb2N1
bWVudEVsZW1lbnQoKSkgeworICAgICAgICAgICAgZS0+ZG9jdW1lbnQoKS0+c2V0RGlyZWN0aW9u
U2V0T25Eb2N1bWVudEVsZW1lbnQoZmFsc2UpOworICAgICAgICAgICAgZS0+ZG9jdW1lbnQoKS0+
c2V0V3JpdGluZ01vZGVTZXRPbkRvY3VtZW50RWxlbWVudChmYWxzZSk7CisgICAgICAgIH0KKyAg
ICB9Cit9CisKK2lubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVS
ZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwgRWxlbWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVu
ZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKQoreworICAgIG1fcHNldWRvU3R5bGVSZXF1ZXN0
ID0gcHNldWRvU3R5bGVSZXF1ZXN0OworICAgIG1fcmVnaW9uRm9yU3R5bGluZyA9IHJlZ2lvbkZv
clN0eWxpbmc7CisKKyAgICBpZiAoZSkgeworICAgICAgICBOb2RlUmVuZGVyaW5nQ29udGV4dCBj
b250ZXh0KGUpOworICAgICAgICBtX3BhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JS
ZW5kZXJpbmdBbmRTdHlsZSgpOworICAgICAgICBtX3BhcmVudFN0eWxlID0gY29udGV4dC5yZXNl
dFN0eWxlSW5oZXJpdGFuY2UoKSA/IDAgOgorICAgICAgICAgICAgcGFyZW50U3R5bGUgPyBwYXJl
bnRTdHlsZSA6CisgICAgICAgICAgICBtX3BhcmVudE5vZGUgPyBtX3BhcmVudE5vZGUtPnJlbmRl
clN0eWxlKCkgOiAwOworICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCA9IGNv
bnRleHQuaW5zZXJ0aW9uUG9pbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3BhcmVudE5v
ZGUgPSAwOworICAgICAgICBtX3BhcmVudFN0eWxlID0gcGFyZW50U3R5bGU7CisgICAgICAgIG1f
ZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50ID0gZmFsc2U7CisgICAgfQorCisgICAgTm9kZSog
ZG9jRWxlbWVudCA9IGUgPyBlLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA6IDA7Cisg
ICAgUmVuZGVyU3R5bGUqIGRvY1N0eWxlID0gZG9jdW1lbnQtPnJlbmRlclN0eWxlKCk7CisgICAg
bV9yb290RWxlbWVudFN0eWxlID0gZG9jRWxlbWVudCAmJiBlICE9IGRvY0VsZW1lbnQgPyBkb2NF
bGVtZW50LT5yZW5kZXJTdHlsZSgpIDogZG9jU3R5bGU7CisKKyAgICBtX3N0eWxlID0gMDsKKyAg
ICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKKyAgICBtX3J1bGVMaXN0ID0gMDsK
KyAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY1N0
eWxlU2VhcmNoVGhyZXNob2xkID0gMTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY1N0eWxlU2Vh
cmNoTGV2ZWxUaHJlc2hvbGQgPSAxMDsKKworc3RhdGljIGlubGluZSBib29sIHBhcmVudEVsZW1l
bnRQcmV2ZW50c1NoYXJpbmcoY29uc3QgRWxlbWVudCogcGFyZW50RWxlbWVudCkKK3sKKyAgICBp
ZiAoIXBhcmVudEVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcGFy
ZW50RWxlbWVudC0+aGFzRmxhZ3NTZXREdXJpbmdTdHlsaW5nT2ZDaGlsZHJlbigpOworfQorCitO
b2RlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVDb3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5z
aWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNvbnN0Cit7CisgICAgaWYgKHZpc2l0ZWROb2RlQ291
bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkICogY1N0eWxlU2VhcmNoTGV2ZWxUaHJlc2hvbGQp
CisgICAgICAgIHJldHVybiAwOworICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQtPmlzU3R5bGVk
RWxlbWVudCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGFyZW50LT5oYXNTY29wZWRI
VE1MU3R5bGVDaGlsZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBTdHlsZWRFbGVtZW50KiBw
ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KHBhcmVudCk7CisgICAgaWYgKHAtPmlubGlu
ZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworI2lmIEVOQUJMRShTVkcpCisgICAgaWYgKHAt
PmlzU1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihwKS0+YW5pbWF0ZWRT
TUlMU3R5bGVQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgaWYg
KHAtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMo
cC0+aWRGb3JTdHlsZVJlc29sdXRpb24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IHAtPnJlbmRlclN0eWxlKCk7CisgICAgdW5z
aWduZWQgc3ViY291bnQgPSAwOworICAgIE5vZGUqIHRoaXNDb3VzaW4gPSBwOworICAgIE5vZGUq
IGN1cnJlbnROb2RlID0gcC0+cHJldmlvdXNTaWJsaW5nKCk7CisKKyAgICAvLyBSZXNlcnZlIHRo
ZSB0cmllcyBmb3IgdGhpcyBsZXZlbC4gVGhpcyBlZmZlY3RpdmVseSBtYWtlcyBzdXJlIHRoYXQg
dGhlIGFsZ29yaXRobQorICAgIC8vIHdpbGwgbmV2ZXIgZ28gZGVlcGVyIHRoYW4gY1N0eWxlU2Vh
cmNoTGV2ZWxUaHJlc2hvbGQgbGV2ZWxzIGludG8gcmVjdXJzaW9uLgorICAgIHZpc2l0ZWROb2Rl
Q291bnQgKz0gY1N0eWxlU2VhcmNoVGhyZXNob2xkOworICAgIHdoaWxlICh0aGlzQ291c2luKSB7
CisgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkgeworICAgICAgICAgICAgKytzdWJjb3VudDsK
KyAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS0+cmVuZGVyU3R5bGUoKSA9PSBwYXJlbnRTdHls
ZSAmJiBjdXJyZW50Tm9kZS0+bGFzdENoaWxkKCkKKyAgICAgICAgICAgICAgICAmJiBjdXJyZW50
Tm9kZS0+aXNFbGVtZW50Tm9kZSgpICYmICFwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKHRv
RWxlbWVudChjdXJyZW50Tm9kZSkpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisgICAgICAgICAg
ICAgICAgJiYgIXRvRWxlbWVudChjdXJyZW50Tm9kZSktPnNoYWRvdygpCisjZW5kaWYKKyAgICAg
ICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHVudXNlZCByZXNl
cnZlZCB0cmllcy4KKyAgICAgICAgICAgICAgICB2aXNpdGVkTm9kZUNvdW50IC09IGNTdHlsZVNl
YXJjaFRocmVzaG9sZCAtIHN1YmNvdW50OworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50
Tm9kZS0+bGFzdENoaWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3ViY291
bnQgPj0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7
CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudE5vZGUgPSBsb2NhdGVDb3VzaW5MaXN0KHRoaXND
b3VzaW4tPnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7CisgICAgICAgIHRoaXND
b3VzaW4gPSBjdXJyZW50Tm9kZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBT
dHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChSdWxlU2V0
KiBydWxlU2V0KQoreworICAgIGlmICghcnVsZVNldCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKKworICAgIG1fc3RhdGUuc2V0TW9k
ZShTZWxlY3RvckNoZWNrZXI6OlNoYXJpbmdSdWxlcyk7CisgICAgaW50IGZpcnN0UnVsZUluZGV4
ID0gLTEsIGxhc3RSdWxlSW5kZXggPSAtMTsKKyAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlKGZpcnN0
UnVsZUluZGV4LCBsYXN0UnVsZUluZGV4KTsKKyAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRj
aFJlcXVlc3QocnVsZVNldCksIHJ1bGVSYW5nZSk7CisgICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVj
dG9yQ2hlY2tlcjo6UmVzb2x2aW5nU3R5bGUpOworICAgIGlmIChtX3N0YXRlLm1hdGNoZWRSdWxl
cygpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fc3RhdGUubWF0Y2hl
ZFJ1bGVzKCkuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTdHlsZVJlc29s
dmVyOjpjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVudCogZWxlbWVudCkgY29u
c3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIEhUTUxJbnB1dEVs
ZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgpOworICAg
IEhUTUxJbnB1dEVsZW1lbnQqIG90aGVySW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpLT50
b0lucHV0RWxlbWVudCgpOworCisgICAgaWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFvdGhlcklu
cHV0RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHRoaXNJbnB1dEVs
ZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkp
IHsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0
dHIpICE9IG90aGVySW5wdXRFbGVtZW50LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZh
c3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlBdHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdl
dEF0dHJpYnV0ZShyZWFkb25seUF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIGlmICh0aGlzSW5wdXRFbGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBvdGhlcklu
cHV0RWxlbWVudC0+aXNBdXRvZmlsbGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBp
ZiAodGhpc0lucHV0RWxlbWVudC0+c2hvdWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVySW5wdXRF
bGVtZW50LT5zaG91bGRBcHBlYXJDaGVja2VkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAodGhpc0lucHV0RWxlbWVudC0+aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJbnB1dEVs
ZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYg
KHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVxdWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNS
ZXF1aXJlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZWxlbWVudC0+aXNF
bmFibGVkRm9ybUNvbnRyb2woKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZvcm1Db250
cm9sKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc0RlZmF1
bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0b25Gb3JG
b3JtKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChzdGF0ZS5kb2N1bWVudCgp
LT5jb250YWluc1ZhbGlkaXR5U3R5bGVSdWxlcygpKSB7CisgICAgICAgIGJvb2wgd2lsbFZhbGlk
YXRlID0gZWxlbWVudC0+d2lsbFZhbGlkYXRlKCk7CisKKyAgICAgICAgaWYgKHdpbGxWYWxpZGF0
ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndpbGxWYWxpZGF0ZSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgIGlmICh3aWxsVmFsaWRhdGUgJiYgKGVsZW1lbnQtPmlzVmFsaWRG
b3JtQ29udHJvbEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzVmFsaWRGb3JtQ29udHJv
bEVsZW1lbnQoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGVs
ZW1lbnQtPmlzSW5SYW5nZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNJblJhbmdlKCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGVsZW1lbnQtPmlzT3V0T2ZSYW5n
ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNPdXRPZlJhbmdlKCkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUg
Ym9vbCBlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhFbGVtZW50KiBlbGVtZW50KQoreworICAgIC8v
IEZJWE1FOiBUaGlzIGxpbmUgaXMgc3VycHJpc2luZ2x5IGhvdCwgd2UgbWF5IHdpc2ggdG8gaW5s
aW5lIGhhc0RpcmVjdGlvbkF1dG8gaW50byBTdHlsZVJlc29sdmVyLgorICAgIHJldHVybiBlbGVt
ZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgdG9IVE1MRWxlbWVudChlbGVtZW50KS0+aGFzRGlyZWN0
aW9uQXV0bygpOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OnNoYXJpbmdDYW5kaWRhdGVIYXNJ
ZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCogc2hhcmluZ0Nh
bmRpZGF0ZSkgY29uc3QKK3sKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAg
IGlmIChzdGF0ZS5lbGVtZW50KCktPmVsZW1lbnREYXRhKCkgPT0gc2hhcmluZ0NhbmRpZGF0ZS0+
ZWxlbWVudERhdGEoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKHN0YXRlLmVsZW1l
bnQoKS0+ZmFzdEdldEF0dHJpYnV0ZShYTUxOYW1lczo6bGFuZ0F0dHIpICE9IHNoYXJpbmdDYW5k
aWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUoWE1MTmFtZXM6OmxhbmdBdHRyKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUobGFu
Z0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmZhc3RHZXRBdHRyaWJ1dGUobGFuZ0F0dHIpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIXN0YXRlLmVsZW1lbnRBZmZlY3RlZEJ5
Q2xhc3NSdWxlcygpKSB7CisgICAgICAgIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygp
ICYmIGNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1l
cygpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHNoYXJpbmdD
YW5kaWRhdGUtPmhhc0NsYXNzKCkpIHsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAvLyBTVkcg
ZWxlbWVudHMgcmVxdWlyZSBhIChzbG93ISkgZ2V0QXR0cmlidXRlIGNvbXBhcmlzaW9uIGJlY2F1
c2UgImNsYXNzIiBpcyBhbiBhbmltYXRhYmxlIGF0dHJpYnV0ZSBmb3IgU1ZHLgorICAgICAgICBp
ZiAoc3RhdGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKHN0
YXRlLmVsZW1lbnQoKS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikgIT0gc2hhcmluZ0NhbmRpZGF0
ZS0+Z2V0QXR0cmlidXRlKGNsYXNzQXR0cikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICBpZiAoc3RhdGUuZWxlbWVu
dCgpLT5jbGFzc05hbWVzKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+Y2xhc3NOYW1lcygpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICB9Cisj
ZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0YXRl
LnN0eWxlZEVsZW1lbnQoKS0+cHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSAhPSBzaGFyaW5n
Q2FuZGlkYXRlLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfRUxFTUVOVCkKKyAgICBpZiAoc3RhdGUuZWxl
bWVudCgpLT5oYXNUYWdOYW1lKHByb2dyZXNzVGFnKSkgeworICAgICAgICBpZiAoc3RhdGljX2Nh
c3Q8SFRNTFByb2dyZXNzRWxlbWVudCo+KHN0YXRlLmVsZW1lbnQoKSktPmlzRGV0ZXJtaW5hdGUo
KSAhPSBzdGF0aWNfY2FzdDxIVE1MUHJvZ3Jlc3NFbGVtZW50Kj4oc2hhcmluZ0NhbmRpZGF0ZSkt
PmlzRGV0ZXJtaW5hdGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5k
aWYKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJl
U3R5bGVXaXRoRWxlbWVudChTdHlsZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAoreworICAgIFJl
bmRlclN0eWxlKiBzdHlsZSA9IGVsZW1lbnQtPnJlbmRlclN0eWxlKCk7CisgICAgY29uc3QgU3Rh
dGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGlmICghc3R5bGUpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKHN0eWxlLT5oYXNVbmlxdWVQc2V1ZG9TdHlsZSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKGVsZW1lbnQtPnRhZ1FOYW1lKCkgIT0gc3RhdGUuZWxlbWVudCgpLT50YWdR
TmFtZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmlubGluZVN0
eWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+bmVlZHNTdHls
ZVJlY2FsYygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjaWYgRU5BQkxFKFNWRykKKyAgICBp
ZiAoZWxlbWVudC0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZHRWxlbWVudCo+KGVs
ZW1lbnQpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworI2VuZGlmCisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpICE9IHN0YXRlLmVsZW1lbnQo
KS0+aXNMaW5rKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+aG92
ZXJlZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aG92ZXJlZCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgaWYgKGVsZW1lbnQtPmFjdGl2ZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+YWN0aXZl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+Zm9jdXNlZCgpICE9
IHN0YXRlLmVsZW1lbnQoKS0+Zm9jdXNlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
aWYgKGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCkgIT0gc3RhdGUuZWxlbWVudCgpLT5zaGFkb3dQ
c2V1ZG9JZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQgPT0gZWxl
bWVudC0+ZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBpZiAoIXNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGljYWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0
ZXMoZWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZWxlbWVudC0+YWRk
aXRpb25hbFByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5bGUoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKGVsZW1lbnQtPmhhc0lEKCkgJiYgbV9ydWxlU2V0cy5mZWF0
dXJlcygpLmlkc0luUnVsZXMuY29udGFpbnMoZWxlbWVudC0+aWRGb3JTdHlsZVJlc29sdXRpb24o
KS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGVsZW1lbnQtPmhhc1Nj
b3BlZEhUTUxTdHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJ
WE1FOiBXZSBzaG91bGQgc2hhcmUgc3R5bGUgZm9yIG9wdGlvbiBhbmQgb3B0Z3JvdXAgd2hlbmV2
ZXIgcG9zc2libGUuCisgICAgLy8gQmVmb3JlIGRvaW5nIHNvLCB3ZSBuZWVkIHRvIHJlc29sdmUg
aXNzdWVzIGluIEhUTUxTZWxlY3RFbGVtZW50OjpyZWNhbGNMaXN0SXRlbXMKKyAgICAvLyBhbmQg
UmVuZGVyTWVudUxpc3Q6OnNldFRleHQuIFNlZSBhbHNvIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD04ODQwNQorICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKG9wdGlv
blRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvcHRncm91cFRhZykpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGJvb2wgaXNDb250cm9sID0gZWxlbWVudC0+aXNGb3JtQ29udHJvbEVs
ZW1lbnQoKTsKKworICAgIGlmIChpc0NvbnRyb2wgIT0gc3RhdGUuZWxlbWVudCgpLT5pc0Zvcm1D
b250cm9sRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXNDb250
cm9sICYmICFjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woZWxlbWVudCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChzdHlsZS0+dHJhbnNpdGlvbnMoKSB8fCBzdHlsZS0+YW5pbWF0
aW9ucygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCisgICAgLy8gVHVybiBvZmYgc3R5bGUgc2hhcmluZyBmb3IgZWxlbWVudHMgdGhh
dCBjYW4gZ2FpbiBsYXllcnMgZm9yIHJlYXNvbnMgb3V0c2lkZSBvZiB0aGUgc3R5bGUgc3lzdGVt
LgorICAgIC8vIFNlZSBjb21tZW50cyBpbiBSZW5kZXJPYmplY3Q6OnNldFN0eWxlKCkuCisgICAg
aWYgKGVsZW1lbnQtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1l
KGZyYW1lVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGVtYmVkVGFnKSB8fCBlbGVtZW50LT5o
YXNUYWdOYW1lKG9iamVjdFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShhcHBsZXRUYWcpIHx8
IGVsZW1lbnQtPmhhc1RhZ05hbWUoY2FudmFzVGFnKQorI2lmIEVOQUJMRShQTFVHSU5fUFJPWFlf
Rk9SX1ZJREVPKQorICAgICAgICAvLyBXaXRoIHByb3h5aW5nLCB0aGUgbWVkaWEgZWxlbWVudHMg
YXJlIGJhY2tlZCBieSBhIFJlbmRlckVtYmVkZGVkT2JqZWN0LgorICAgICAgICB8fCBlbGVtZW50
LT5oYXNUYWdOYW1lKHZpZGVvVGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGF1ZGlvVGFnKQor
I2VuZGlmCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisKKyAgICBp
ZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1dG8oZWxlbWVudCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChlbGVtZW50LT5pc0xpbmsoKSAmJiBzdGF0ZS5lbGVtZW50TGlua1N0YXRl
KCkgIT0gc3R5bGUtPmluc2lkZUxpbmsoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYg
RU5BQkxFKFZJREVPX1RSQUNLKQorICAgIC8vIERlbnkgc2hhcmluZyBzdHlsZXMgYmV0d2VlbiBX
ZWJWVFQgYW5kIG5vbi1XZWJWVFQgbm9kZXMuCisgICAgaWYgKGVsZW1lbnQtPmlzV2ViVlRURWxl
bWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNXZWJWVFRFbGVtZW50KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAmJiBzdGF0
ZS5lbGVtZW50KCktPmlzV2ViVlRURWxlbWVudCgpICYmIHRvV2ViVlRURWxlbWVudChlbGVtZW50
KS0+aXNQYXN0Tm9kZSgpICE9IHRvV2ViVlRURWxlbWVudChzdGF0ZS5lbGVtZW50KCkpLT5pc1Bh
c3ROb2RlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKEZV
TExTQ1JFRU5fQVBJKQorICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPndl
YmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpIHx8IHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0
ZS5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1lbnQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBTdHls
ZWRFbGVtZW50KiBTdHlsZVJlc29sdmVyOjpmaW5kU2libGluZ0ZvclN0eWxlU2hhcmluZyhOb2Rl
KiBub2RlLCB1bnNpZ25lZCYgY291bnQpIGNvbnN0Cit7CisgICAgZm9yICg7IG5vZGU7IG5vZGUg
PSBub2RlLT5wcmV2aW91c1NpYmxpbmcoKSkgeworICAgICAgICBpZiAoIW5vZGUtPmlzU3R5bGVk
RWxlbWVudCgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjYW5TaGFyZVN0
eWxlV2l0aEVsZW1lbnQoc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KG5vZGUpKSkKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBpZiAoY291bnQrKyA9PSBjU3R5bGVTZWFyY2hUaHJlc2hv
bGQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PFN0eWxlZEVsZW1lbnQqPihub2RlKTsKK30KKworUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6
OmxvY2F0ZVNoYXJlZFN0eWxlKCkKK3sKKyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAg
IGlmICghc3RhdGUuc3R5bGVkRWxlbWVudCgpIHx8ICFzdGF0ZS5wYXJlbnRTdHlsZSgpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBpbmxpbmUgc3R5bGUg
aXQgaXMgcHJvYmFibHkgdW5pcXVlLgorICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlu
bGluZVN0eWxlKCkpCisgICAgICAgIHJldHVybiAwOworI2lmIEVOQUJMRShTVkcpCisgICAgaWYg
KHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8U1ZH
RWxlbWVudCo+KHN0YXRlLnN0eWxlZEVsZW1lbnQoKSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVy
dGllcygpKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIC8vIElkcyBzdG9wIHN0eWxl
IHNoYXJpbmcgaWYgdGhleSBzaG93IHVwIGluIHRoZSBzdHlsZXNoZWV0cy4KKyAgICBpZiAoc3Rh
dGUuc3R5bGVkRWxlbWVudCgpLT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJ
blJ1bGVzLmNvbnRhaW5zKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aWRGb3JTdHlsZVJlc29sdXRp
b24oKS5pbXBsKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGFyZW50RWxlbWVudFBy
ZXZlbnRzU2hhcmluZyhzdGF0ZS5lbGVtZW50KCktPnBhcmVudEVsZW1lbnQoKSkpCisgICAgICAg
IHJldHVybiAwOworICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmhhc1Njb3BlZEhUTUxT
dHlsZUNoaWxkKCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzdGF0ZS5lbGVtZW50KCkg
PT0gc3RhdGUuZG9jdW1lbnQoKS0+Y3NzVGFyZ2V0KCkpCisgICAgICAgIHJldHVybiAwOworICAg
IGlmIChlbGVtZW50SGFzRGlyZWN0aW9uQXV0byhzdGF0ZS5lbGVtZW50KCkpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIC8vIENhY2hlIHdoZXRoZXIgc3RhdGUuZWxlbWVudCBpcyBhZmZlY3Rl
ZCBieSBhbnkga25vd24gY2xhc3Mgc2VsZWN0b3JzLgorICAgIC8vIEZJWE1FOiBUaGlzIHNob3Vs
ZG4ndCBiZSBhIG1lbWJlciB2YXJpYWJsZS4gVGhlIHN0eWxlIHNoYXJpbmcgY29kZSBjb3VsZCBi
ZSBmYWN0b3JlZCBvdXQgb2YgU3R5bGVSZXNvbHZlci4KKyAgICBzdGF0ZS5zZXRFbGVtZW50QWZm
ZWN0ZWRCeUNsYXNzUnVsZXMoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aGFz
Q2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKHN0YXRlLmVsZW1lbnQoKS0+Y2xh
c3NOYW1lcygpKSk7CisKKyAgICAvLyBDaGVjayBwcmV2aW91cyBzaWJsaW5ncyBhbmQgdGhlaXIg
Y291c2lucy4KKyAgICB1bnNpZ25lZCBjb3VudCA9IDA7CisgICAgdW5zaWduZWQgdmlzaXRlZE5v
ZGVDb3VudCA9IDA7CisgICAgU3R5bGVkRWxlbWVudCogc2hhcmVFbGVtZW50ID0gMDsKKyAgICBO
b2RlKiBjb3VzaW5MaXN0ID0gc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5wcmV2aW91c1NpYmxpbmco
KTsKKyAgICB3aGlsZSAoY291c2luTGlzdCkgeworICAgICAgICBzaGFyZUVsZW1lbnQgPSBmaW5k
U2libGluZ0ZvclN0eWxlU2hhcmluZyhjb3VzaW5MaXN0LCBjb3VudCk7CisgICAgICAgIGlmIChz
aGFyZUVsZW1lbnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY291c2luTGlzdCA9IGxv
Y2F0ZUNvdXNpbkxpc3QoY291c2luTGlzdC0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9kZUNv
dW50KTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGV4aGF1c3RlZCBhbGwgb3VyIGJ1ZGdl
dCBvciBvdXIgY291c2lucy4KKyAgICBpZiAoIXNoYXJlRWxlbWVudCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICAvLyBDYW4ndCBzaGFyZSBpZiBzaWJsaW5nIHJ1bGVzIGFwcGx5LiBUaGlzIGlz
IGNoZWNrZWQgYXQgdGhlIGVuZCBhcyBpdCBzaG91bGQgcmFyZWx5IGZhaWwuCisgICAgaWYgKHN0
eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KG1fcnVsZVNldHMuc2libGluZygpKSkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgYXR0cmlidXRlIHJ1bGVz
IGFwcGx5LgorICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzUnVsZVNldChtX3J1
bGVTZXRzLnVuY29tbW9uQXR0cmlidXRlKCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvLyBD
YW4ndCBzaGFyZSBpZiBAaG9zdCBALXJ1bGVzIGFwcGx5LgorICAgIGlmIChzdHlsZVNoYXJpbmdD
YW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIFRy
YWNraW5nIGNoaWxkIGluZGV4IHJlcXVpcmVzIHVuaXF1ZSBzdHlsZSBmb3IgZWFjaCBub2RlLiBU
aGlzIG1heSBnZXQgc2V0IGJ5IHRoZSBzaWJsaW5nIHJ1bGUgbWF0Y2ggYWJvdmUuCisgICAgaWYg
KHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVudCgpLT5wYXJlbnRFbGVt
ZW50KCkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2hhcmVFbGVtZW50LT5yZW5k
ZXJTdHlsZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJl
c3VsdCYgcmVzdWx0KQoreworICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNjb3BlOworCisgICAg
Ly8gRmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KKyAgICBp
ZiAoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVTaGVldCkKKyAgICAg
ICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7CisgICAgUnVsZVNldCogdXNlckFnZW50U3R5
bGVTaGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpCisgICAg
ICAgID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1
bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOworICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIHVz
ZXJBZ2VudFN0eWxlU2hlZXQpOworCisgICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1
bGVzIGZyb20gdGhlIHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0LgorICAgIGlmIChkb2N1bWVudCgp
LT5pblF1aXJrc01vZGUoKSkKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVs
dFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOworCisgICAgLy8gSWYgZG9jdW1lbnQg
dXNlcyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZp
ZXdlciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHls
ZSBzaGVldC4KKyAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCisgICAgICAgIG1h
dGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxl
KCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0
aW9uOjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgaWYg
KHBhZ2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKQorICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgIHN3aXRjaCAocGFnaW5hdGlvbk1vZGUpIHsKKyAgICBjYXNlIFBh
Z2luYXRpb246OkxlZnRUb1JpZ2h0UGFnaW5hdGVkOgorICAgICAgICBzdHlsZS0+c2V0Q29sdW1u
QXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7CisgICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lv
bihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Np
b24gOiBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJsb2Nrc1dyaXRp
bmdNb2RlKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9ncmVz
c2lvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGFnaW5hdGlvbjo6UmlnaHRUb0xlZnRQ
YWdpbmF0ZWQ6CisgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKEhvcml6b250YWxDb2x1bW5B
eGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAg
ICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBOb3JtYWxDb2x1bW5Qcm9n
cmVzc2lvbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9n
cmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IE5vcm1hbENvbHVt
blByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBQYWdpbmF0aW9uOjpUb3BUb0JvdHRvbVBhZ2luYXRlZDoKKyAgICAgICAgc3R5
bGUtPnNldENvbHVtbkF4aXMoVmVydGljYWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxl
LT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVt
blByb2dyZXNzaW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJz
ZUNvbHVtblByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNv
bHVtblByb2dyZXNzaW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpC
b3R0b21Ub1RvcFBhZ2luYXRlZDoKKyAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoVmVydGlj
YWxDb2x1bW5BeGlzKTsKKyAgICAgICAgaWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpKQorICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0Zs
aXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24gOiBSZXZl
cnNlQ29sdW1uUHJvZ3Jlc3Npb24pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHlsZS0+
c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IFJl
dmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1hbENvbHVtblByb2dyZXNzaW9uKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBQYWdpbmF0aW9uOjpVbnBhZ2luYXRlZDoKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZv
aWQgZ2V0Rm9udEFuZEdseXBoT3JpZW50YXRpb24oY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBG
b250T3JpZW50YXRpb24mIGZvbnRPcmllbnRhdGlvbiwgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiYg
Z2x5cGhPcmllbnRhdGlvbikKK3sKKyAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdN
b2RlKCkpIHsKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAg
Z2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0Owor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChzdHlsZS0+dGV4dE9yaWVudGF0
aW9uKCkpIHsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ6CisgICAgICAg
IGZvbnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0g
Tm9uQ0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAg
ICBjYXNlIFRleHRPcmllbnRhdGlvblVwcmlnaHQ6CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9
IFZlcnRpY2FsOworICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRh
dGlvblVwcmlnaHQ7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIFRleHRPcmllbnRhdGlvblNp
ZGV3YXlzOgorICAgICAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgPT0gTGVmdFRvUmlnaHRX
cml0aW5nTW9kZSkgeworICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG1hcCB0byBz
aWRld2F5cy1sZWZ0LCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIHlldC4KKyAgICAgICAgICAgIGZv
bnRPcmllbnRhdGlvbiA9IFZlcnRpY2FsOworICAgICAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9
IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAg
ICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdo
dDsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgVGV4dE9yaWVudGF0aW9uU2lkZXdheXNSaWdo
dDoKKyAgICAgICAgZm9udE9yaWVudGF0aW9uID0gSG9yaXpvbnRhbDsKKyAgICAgICAgZ2x5cGhP
cmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0OworICAgICAg
ICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIGZvbnRPcmllbnRhdGlvbiA9IEhvcml6b250YWw7CisgICAgICAgIGdseXBoT3JpZW50
YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6
c3R5bGVGb3JEb2N1bWVudChEb2N1bWVudCogZG9jdW1lbnQsIENTU0ZvbnRTZWxlY3RvciogZm9u
dFNlbGVjdG9yKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpOworCisg
ICAgLy8gSFRNTDUgc3RhdGVzIHRoYXQgc2VhbWxlc3MgaWZyYW1lcyBzaG91bGQgcmVwbGFjZSBk
ZWZhdWx0IENTUyB2YWx1ZXMKKyAgICAvLyB3aXRoIHZhbHVlcyBpbmhlcml0ZWQgZnJvbSB0aGUg
Y29udGFpbmluZyBpZnJhbWUgZWxlbWVudC4gSG93ZXZlciwKKyAgICAvLyBzb21lIHZhbHVlcyAo
c3VjaCBhcyB0aGUgY2FzZSBvZiBkZXNpZ25Nb2RlID0gIm9uIikgc3RpbGwgbmVlZCB0bworICAg
IC8vIGJlIHNldCBieSB0aGlzICJkb2N1bWVudCBzdHlsZSIuCisgICAgUmVmUHRyPFJlbmRlclN0
eWxlPiBkb2N1bWVudFN0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgIGJvb2wgc2Vh
bWxlc3NXaXRoUGFyZW50ID0gZG9jdW1lbnQtPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5V2l0aFBh
cmVudCgpOworICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpIHsKKyAgICAgICAgUmVuZGVyU3R5
bGUqIGlmcmFtZVN0eWxlID0gZG9jdW1lbnQtPnNlYW1sZXNzUGFyZW50SUZyYW1lKCktPnJlbmRl
clN0eWxlKCk7CisgICAgICAgIGlmIChpZnJhbWVTdHlsZSkKKyAgICAgICAgICAgIGRvY3VtZW50
U3R5bGUtPmluaGVyaXRGcm9tKGlmcmFtZVN0eWxlKTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTog
SXQncyBub3QgY2xlYXIgd2hpY2ggdmFsdWVzIGJlbG93IHdlIHdhbnQgdG8gb3ZlcnJpZGUgaW4g
dGhlIHNlYW1sZXNzIGNhc2UhCisgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7
CisgICAgaWYgKCFzZWFtbGVzc1dpdGhQYXJlbnQpIHsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+
c2V0UlRMT3JkZXJpbmcoZG9jdW1lbnQtPnZpc3VhbGx5T3JkZXJlZCgpID8gVmlzdWFsT3JkZXIg
OiBMb2dpY2FsT3JkZXIpOworICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRab29tKGZyYW1lICYm
ICFkb2N1bWVudC0+cHJpbnRpbmcoKSA/IGZyYW1lLT5wYWdlWm9vbUZhY3RvcigpIDogMSk7Cisg
ICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFBhZ2VTY2FsZVRyYW5zZm9ybShmcmFtZSA/IGZyYW1l
LT5mcmFtZVNjYWxlRmFjdG9yKCkgOiAxKTsKKyAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0TG9j
YWxlKGRvY3VtZW50LT5jb250ZW50TGFuZ3VhZ2UoKSk7CisgICAgfQorICAgIC8vIFRoaXMgb3Zl
cnJpZGVzIGFueSAtd2Via2l0LXVzZXItbW9kaWZ5IGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQg
aWZyYW1lLgorICAgIGRvY3VtZW50U3R5bGUtPnNldFVzZXJNb2RpZnkoZG9jdW1lbnQtPmluRGVz
aWduTW9kZSgpID8gUkVBRF9XUklURSA6IFJFQURfT05MWSk7CisKKyAgICBFbGVtZW50KiBkb2NF
bGVtZW50ID0gZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpOworICAgIFJlbmRlck9iamVjdCog
ZG9jRWxlbWVudFJlbmRlcmVyID0gZG9jRWxlbWVudCA/IGRvY0VsZW1lbnQtPnJlbmRlcmVyKCkg
OiAwOworICAgIGlmIChkb2NFbGVtZW50UmVuZGVyZXIpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBk
aXJlY3Rpb24gYW5kIHdyaXRpbmctbW9kZSBvZiB0aGUgYm9keSB0byBzZXQgdGhlCisgICAgICAg
IC8vIHZpZXdwb3J0J3MgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUgdW5sZXNzIHRoZSBwcm9w
ZXJ0eSBpcyBzZXQgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQuCisgICAgICAgIC8vIElmIHRoZXJl
IGlzIG5vIGJvZHksIHRoZW4gdXNlIHRoZSBkb2N1bWVudCBlbGVtZW50LgorICAgICAgICBSZW5k
ZXJPYmplY3QqIGJvZHlSZW5kZXJlciA9IGRvY3VtZW50LT5ib2R5KCkgPyBkb2N1bWVudC0+Ym9k
eSgpLT5yZW5kZXJlcigpIDogMDsKKyAgICAgICAgaWYgKGJvZHlSZW5kZXJlciAmJiAhZG9jdW1l
bnQtPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgICAgIGRvY3Vt
ZW50U3R5bGUtPnNldFdyaXRpbmdNb2RlKGJvZHlSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01v
ZGUoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFdyaXRp
bmdNb2RlKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+d3JpdGluZ01vZGUoKSk7CisgICAg
ICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT5kaXJlY3Rpb25TZXRPbkRvY3VtZW50
RWxlbWVudCgpKQorICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0aW9uKGJvZHlS
ZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBkb2N1bWVudFN0eWxlLT5zZXREaXJlY3Rpb24oZG9jRWxlbWVudFJlbmRlcmVyLT5zdHlsZSgp
LT5kaXJlY3Rpb24oKSk7CisgICAgfQorCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGlmIChG
cmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgICAgIGNvbnN0
IFBhZ2luYXRpb24mIHBhZ2luYXRpb24gPSBmcmFtZVZpZXctPnBhZ2luYXRpb24oKTsKKyAgICAg
ICAgICAgIGlmIChwYWdpbmF0aW9uLm1vZGUgIT0gUGFnaW5hdGlvbjo6VW5wYWdpbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShwYWdpbmF0aW9uLm1v
ZGUsIGRvY3VtZW50U3R5bGUuZ2V0KCkpOworICAgICAgICAgICAgICAgIGRvY3VtZW50U3R5bGUt
PnNldENvbHVtbkdhcChwYWdpbmF0aW9uLmdhcCk7CisgICAgICAgICAgICAgICAgaWYgKFJlbmRl
clZpZXcqIHZpZXcgPSBkb2N1bWVudC0+cmVuZGVyVmlldygpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICh2aWV3LT5oYXNDb2x1bW5zKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3
LT51cGRhdGVDb2x1bW5JbmZvRnJvbVN0eWxlKGRvY3VtZW50U3R5bGUuZ2V0KCkpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNl
YW1sZXNzIGlmcmFtZXMgd2FudCB0byBpbmhlcml0IHRoZWlyIGZvbnQgZnJvbSB0aGVpciBwYXJl
bnQgaWZyYW1lLCBzbyBlYXJseSByZXR1cm4gYmVmb3JlIHNldHRpbmcgdGhlIGZvbnQuCisgICAg
aWYgKHNlYW1sZXNzV2l0aFBhcmVudCkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVs
ZWFzZSgpOworCisgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKKyAgICBmb250
RGVzY3JpcHRpb24uc2V0U2NyaXB0KGxvY2FsZVRvU2NyaXB0Q29kZUZvckZvbnRTZWxlY3Rpb24o
ZG9jdW1lbnRTdHlsZS0+bG9jYWxlKCkpKTsKKyAgICBpZiAoU2V0dGluZ3MqIHNldHRpbmdzID0g
ZG9jdW1lbnQtPnNldHRpbmdzKCkpIHsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVBy
aW50ZXJGb250KGRvY3VtZW50LT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1
YnN0aXR1dGlvbkVuYWJsZWQoKSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJp
bmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICAgICAgY29uc3QgQXRv
bWljU3RyaW5nJiBzdGFuZGFyZEZvbnQgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KGZv
bnREZXNjcmlwdGlvbi5zY3JpcHQoKSk7CisgICAgICAgIGlmICghc3RhbmRhcmRGb250LmlzRW1w
dHkoKSkgeworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpTdGFuZGFyZEZhbWlseSk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uZmlyc3RGYW1pbHkoKS5zZXRGYW1pbHkoc3RhbmRhcmRGb250KTsKKyAgICAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWlseSgwKTsKKyAgICAgICAgfQor
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0S2V5d29yZFNpemUoQ1NTVmFsdWVNZWRpdW0gLSBD
U1NWYWx1ZVh4U21hbGwgKyAxKTsKKyAgICAgICAgaW50IHNpemUgPSBTdHlsZVJlc29sdmVyOjpm
b250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQsIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSk7CisgICAg
ICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKHNpemUpOworICAgICAgICBib29s
IHVzZVNWR1pvb21SdWxlcyA9IGRvY3VtZW50LT5pc1NWR0RvY3VtZW50KCk7CisgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoU3R5bGVSZXNvbHZlcjo6Z2V0Q29tcHV0ZWRT
aXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnRE
ZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBzaXplLCB1c2VTVkdab29tUnVsZXMpKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3Vt
ZW50LT5wcmludGluZygpKTsKKworICAgIEZvbnRPcmllbnRhdGlvbiBmb250T3JpZW50YXRpb247
CisgICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9yaWVudGF0aW9uOworICAgIGdldEZv
bnRBbmRHbHlwaE9yaWVudGF0aW9uKGRvY3VtZW50U3R5bGUuZ2V0KCksIGZvbnRPcmllbnRhdGlv
biwgZ2x5cGhPcmllbnRhdGlvbik7CisgICAgZm9udERlc2NyaXB0aW9uLnNldE9yaWVudGF0aW9u
KGZvbnRPcmllbnRhdGlvbik7CisgICAgZm9udERlc2NyaXB0aW9uLnNldE5vbkNKS0dseXBoT3Jp
ZW50YXRpb24oZ2x5cGhPcmllbnRhdGlvbik7CisKKyAgICBkb2N1bWVudFN0eWxlLT5zZXRGb250
RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICBkb2N1bWVudFN0eWxlLT5mb250KCku
dXBkYXRlKGZvbnRTZWxlY3Rvcik7CisKKyAgICByZXR1cm4gZG9jdW1lbnRTdHlsZS5yZWxlYXNl
KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F0U2hhZG93Qm91bmRhcnkoY29uc3QgRWxl
bWVudCogZWxlbWVudCkKK3sKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlID0gZWxlbWVudC0+cGFyZW50Tm9kZSgp
OworICAgIHJldHVybiBwYXJlbnROb2RlICYmIHBhcmVudE5vZGUtPmlzU2hhZG93Um9vdCgpOwor
fQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckVsZW1l
bnQoRWxlbWVudCogZWxlbWVudCwgUmVuZGVyU3R5bGUqIGRlZmF1bHRQYXJlbnQsCisgICAgU3R5
bGVTaGFyaW5nQmVoYXZpb3Igc2hhcmluZ0JlaGF2aW9yLCBSdWxlTWF0Y2hpbmdCZWhhdmlvciBt
YXRjaGluZ0JlaGF2aW9yLCBSZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcpCit7CisgICAg
Ly8gT25jZSBhbiBlbGVtZW50IGhhcyBhIHJlbmRlcmVyLCB3ZSBkb24ndCB0cnkgdG8gZGVzdHJv
eSBpdCwgc2luY2Ugb3RoZXJ3aXNlIHRoZSByZW5kZXJlcgorICAgIC8vIHdpbGwgdmFuaXNoIGlm
IGEgc3R5bGUgcmVjYWxjIGhhcHBlbnMgZHVyaW5nIGxvYWRpbmcuCisgICAgaWYgKHNoYXJpbmdC
ZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aGF2
ZVN0eWxlc2hlZXRzTG9hZGVkKCkgJiYgIWVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAg
aWYgKCFzX3N0eWxlTm90WWV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBzX3N0eWxlTm90WWV0
QXZhaWxhYmxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpLmxlYWtSZWYoKTsKKyAgICAgICAgICAg
IHNfc3R5bGVOb3RZZXRBdmFpbGFibGUtPnNldERpc3BsYXkoTk9ORSk7CisgICAgICAgICAgICBz
X3N0eWxlTm90WWV0QXZhaWxhYmxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKKyAg
ICAgICAgfQorICAgICAgICBlbGVtZW50LT5kb2N1bWVudCgpLT5zZXRIYXNOb2Rlc1dpdGhQbGFj
ZWhvbGRlclN0eWxlKCk7CisgICAgICAgIHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOwor
ICAgIH0KKworICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7CisgICAgaW5pdEVsZW1lbnQoZWxl
bWVudCk7CisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlbGVtZW50
LCBkZWZhdWx0UGFyZW50LCBOT1BTRVVETywgcmVnaW9uRm9yU3R5bGluZyk7CisgICAgaWYgKHNo
YXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUuZGlzdHJpYnV0ZWRU
b0luc2VydGlvblBvaW50KCkpIHsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHNoYXJlZFN0eWxlID0g
bG9jYXRlU2hhcmVkU3R5bGUoKTsKKyAgICAgICAgaWYgKHNoYXJlZFN0eWxlKQorICAgICAgICAg
ICAgcmV0dXJuIHNoYXJlZFN0eWxlOworICAgIH0KKworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4g
Y2xvbmVGb3JQYXJlbnQ7CisKKyAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUoKSkgeworICAgICAg
ICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5pbmhlcml0RnJvbShzdGF0ZS5wYXJlbnRTdHlsZSgpLCBpc0F0U2hhZG93Qm91bmRh
cnkoZWxlbWVudCkgPyBSZW5kZXJTdHlsZTo6QXRTaGFkb3dCb3VuZGFyeSA6IFJlbmRlclN0eWxl
OjpOb3RBdFNoYWRvd0JvdW5kYXJ5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZS5zZXRT
dHlsZShkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCkpOworICAgICAgICBjbG9uZUZvclBhcmVudCA9
IFJlbmRlclN0eWxlOjpjbG9uZShzdGF0ZS5zdHlsZSgpKTsKKyAgICAgICAgc3RhdGUuc2V0UGFy
ZW50U3R5bGUoY2xvbmVGb3JQYXJlbnQuZ2V0KCkpOworICAgIH0KKyAgICAvLyBjb250ZW50ZWRp
dGFibGUgYXR0cmlidXRlIChpbXBsZW1lbnRlZCBieSAtd2Via2l0LXVzZXItbW9kaWZ5KSBzaG91
bGQKKyAgICAvLyBiZSBwcm9wYWdhdGVkIGZyb20gc2hhZG93IGhvc3QgdG8gZGlzdHJpYnV0ZWQg
bm9kZS4KKyAgICBpZiAoc3RhdGUuZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKKyAg
ICAgICAgaWYgKEVsZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQoKSkgewor
ICAgICAgICAgICAgaWYgKFJlbmRlclN0eWxlKiBzdHlsZU9mU2hhZG93SG9zdCA9IHBhcmVudC0+
cmVuZGVyU3R5bGUoKSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VyTW9k
aWZ5KHN0eWxlT2ZTaGFkb3dIb3N0LT51c2VyTW9kaWZ5KCkpOworICAgICAgICB9CisgICAgfQor
CisgICAgaWYgKGVsZW1lbnQtPmlzTGluaygpKSB7CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dElzTGluayh0cnVlKTsKKyAgICAgICAgRUluc2lkZUxpbmsgbGlua1N0YXRlID0gc3RhdGUuZWxl
bWVudExpbmtTdGF0ZSgpOworICAgICAgICBpZiAobGlua1N0YXRlICE9IE5vdEluc2lkZUxpbmsp
IHsKKyAgICAgICAgICAgIGJvb2wgZm9yY2VWaXNpdGVkID0gSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uOjpmb3JjZVBzZXVkb1N0YXRlKGVsZW1lbnQsIENTU1NlbGVjdG9yOjpQc2V1ZG9WaXNpdGVk
KTsKKyAgICAgICAgICAgIGlmIChmb3JjZVZpc2l0ZWQpCisgICAgICAgICAgICAgICAgbGlua1N0
YXRlID0gSW5zaWRlVmlzaXRlZExpbms7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc3R5bGUo
KS0+c2V0SW5zaWRlTGluayhsaW5rU3RhdGUpOworICAgIH0KKworICAgIGJvb2wgbmVlZHNDb2xs
ZWN0aW9uID0gZmFsc2U7CisgICAgQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjplbnN1cmVEZWZhdWx0
U3R5bGVTaGVldHNGb3JFbGVtZW50KGVsZW1lbnQsIG5lZWRzQ29sbGVjdGlvbik7CisgICAgaWYg
KG5lZWRzQ29sbGVjdGlvbikKKyAgICAgICAgbV9ydWxlU2V0cy5jb2xsZWN0RmVhdHVyZXMoZG9j
dW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZlci5nZXQoKSk7CisKKyAgICBN
YXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAgICBpZiAobWF0Y2hpbmdCZWhhdmlvciA9PSBNYXRj
aE9ubHlVc2VyQWdlbnRSdWxlcykKKyAgICAgICAgbWF0Y2hVQVJ1bGVzKG1hdGNoUmVzdWx0KTsK
KyAgICBlbHNlCisgICAgICAgIG1hdGNoQWxsUnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5nQmVo
YXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwpOworCisgICAgYXBwbHlNYXRjaGVk
UHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZWxlbWVudCk7CisKKyAgICAvLyBDbGVhbiB1cCBvdXIg
c3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIg
Zml4dXBzKS4KKyAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJl
bnRTdHlsZSgpLCBlbGVtZW50KTsKKworICAgIHN0YXRlLmNsZWFyKCk7IC8vIENsZWFyIG91dCBm
b3IgdGhlIG5leHQgcmVzb2x2ZS4KKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVz
b2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgorICAgIHJldHVybiBzdGF0
ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZl
cjo6c3R5bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBjb25z
dCBTdHlsZUtleWZyYW1lKiBrZXlmcmFtZSwgS2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVWYWx1ZSkK
K3sKKyAgICBNYXRjaFJlc3VsdCByZXN1bHQ7CisgICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVz
KCkpCisgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwga2V5ZnJhbWUtPnByb3Bl
cnRpZXMoKSk7CisKKyAgICBBU1NFUlQoIW1fc3RhdGUuc3R5bGUoKSk7CisKKyAgICBTdGF0ZSYg
c3RhdGUgPSBtX3N0YXRlOworCisgICAgLy8gQ3JlYXRlIHRoZSBzdHlsZQorICAgIHN0YXRlLnNl
dFN0eWxlKFJlbmRlclN0eWxlOjpjbG9uZShlbGVtZW50U3R5bGUpKTsKKyAgICBzdGF0ZS5zZXRM
aW5lSGVpZ2h0VmFsdWUoMCk7CisKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGJvdGhlciB3aXRo
ICFpbXBvcnRhbnQuIFNpbmNlIHRoZXJlIGlzIG9ubHkgZXZlciBvbmUKKyAgICAvLyBkZWNsLCB0
aGVyZSdzIG5vdGhpbmcgdG8gb3ZlcnJpZGUuIFNvIGp1c3QgYWRkIHRoZSBmaXJzdCBwcm9wZXJ0
aWVzLgorICAgIGJvb2wgaW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIGlmIChrZXlmcmFtZS0+
cHJvcGVydGllcygpKQorICAgICAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0
eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0
aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KKyAgICB1cGRhdGVGb250KCk7CisKKyAg
ICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRo
ZSBmb250LXNpemUKKyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVlKCkpCisgICAgICAgIGFw
cGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5saW5lSGVpZ2h0VmFsdWUo
KSk7CisKKyAgICAvLyBOb3cgZG8gcmVzdCBvZiB0aGUgcHJvcGVydGllcy4KKyAgICBpZiAoa2V5
ZnJhbWUtPnByb3BlcnRpZXMoKSkKKyAgICAgICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQ
cmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVy
dGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKworICAgIC8vIElmIG91ciBmb250IGdv
dCBkaXJ0aWVkIGJ5IG9uZSBvZiB0aGUgbm9uLWVzc2VudGlhbCBmb250IHByb3BzLAorICAgIC8v
IGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgYSBzZWNvbmQgdGltZS4KKyAgICB1cGRhdGVGb250KCk7
CisKKyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5
bGUuCisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICAvLyBBZGQgYWxsIHRo
ZSBhbmltYXRpbmcgcHJvcGVydGllcyB0byB0aGUga2V5ZnJhbWUuCisgICAgaWYgKGNvbnN0IFN0
eWxlUHJvcGVydHlTZXQqIHN0eWxlRGVjbGFyYXRpb24gPSBrZXlmcmFtZS0+cHJvcGVydGllcygp
KSB7CisgICAgICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBzdHlsZURlY2xhcmF0aW9uLT5w
cm9wZXJ0eUNvdW50KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwcm9wZXJ0
eUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBzdHls
ZURlY2xhcmF0aW9uLT5wcm9wZXJ0eUF0KGkpLmlkKCk7CisgICAgICAgICAgICAvLyBUaW1pbmct
ZnVuY3Rpb24gd2l0aGluIGtleWZyYW1lcyBpcyBzcGVjaWFsLCBiZWNhdXNlIGl0IGlzIG5vdCBh
bmltYXRlZDsgaXQganVzdAorICAgICAgICAgICAgLy8gZGVzY3JpYmVzIHRoZSB0aW1pbmcgZnVu
Y3Rpb24gYmV0d2VlbiB0aGlzIGtleWZyYW1lIGFuZCB0aGUgbmV4dC4KKyAgICAgICAgICAgIGlm
IChwcm9wZXJ0eSAhPSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uKQor
ICAgICAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuYWRkUHJvcGVydHkocHJvcGVydHkpOworICAg
ICAgICB9CisgICAgfQorCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNjZXNzU3R5bGVSZXNvbHZlcigp
OworCisgICAgcmV0dXJuIHN0YXRlLnRha2VTdHlsZSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2
ZXI6OmtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqIGUsIGNvbnN0IFJlbmRlclN0
eWxlKiBlbGVtZW50U3R5bGUsIEtleWZyYW1lTGlzdCYgbGlzdCkKK3sKKyAgICBsaXN0LmNsZWFy
KCk7CisKKyAgICAvLyBHZXQgdGhlIGtleWZyYW1lc1J1bGUgZm9yIHRoaXMgbmFtZQorICAgIGlm
ICghZSB8fCBsaXN0LmFuaW1hdGlvbk5hbWUoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fa2V5ZnJhbWVzUnVsZU1hcC5jaGVja0NvbnNpc3RlbmN5KCk7CisKKyAgICBLZXlm
cmFtZXNSdWxlTWFwOjppdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzUnVsZU1hcC5maW5kKGxpc3Qu
YW5pbWF0aW9uTmFtZSgpLmltcGwoKSk7CisgICAgaWYgKGl0ID09IG1fa2V5ZnJhbWVzUnVsZU1h
cC5lbmQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgU3R5bGVSdWxlS2V5ZnJhbWVz
KiBrZXlmcmFtZXNSdWxlID0gaXQtPnZhbHVlLmdldCgpOworCisgICAgLy8gQ29uc3RydWN0IGFu
ZCBwb3B1bGF0ZSB0aGUgc3R5bGUgZm9yIGVhY2gga2V5ZnJhbWUKKyAgICBjb25zdCBWZWN0b3I8
UmVmUHRyPFN0eWxlS2V5ZnJhbWU+ID4mIGtleWZyYW1lcyA9IGtleWZyYW1lc1J1bGUtPmtleWZy
YW1lcygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBrZXlmcmFtZXMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgLy8gQXBwbHkgdGhlIGRlY2xhcmF0aW9uIHRvIHRoZSBzdHlsZS4gVGhp
cyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgbG9naWMgaW4gc3R5bGVGb3JFbGVtZW50
CisgICAgICAgIGluaXRFbGVtZW50KGUpOworICAgICAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJl
c29sdmUoZG9jdW1lbnQoKSwgZSk7CisKKyAgICAgICAgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5
ZnJhbWUgPSBrZXlmcmFtZXNbaV0uZ2V0KCk7CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlm
cmFtZVZhbHVlKDAsIDApOworICAgICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9y
S2V5ZnJhbWUoZWxlbWVudFN0eWxlLCBrZXlmcmFtZSwga2V5ZnJhbWVWYWx1ZSkpOworCisgICAg
ICAgIC8vIEFkZCB0aGlzIGtleWZyYW1lIHN0eWxlIHRvIGFsbCB0aGUgaW5kaWNhdGVkIGtleSB0
aW1lcworICAgICAgICBWZWN0b3I8ZmxvYXQ+IGtleXM7CisgICAgICAgIGtleWZyYW1lLT5nZXRL
ZXlzKGtleXMpOworICAgICAgICBmb3IgKHNpemVfdCBrZXlJbmRleCA9IDA7IGtleUluZGV4IDwg
a2V5cy5zaXplKCk7ICsra2V5SW5kZXgpIHsKKyAgICAgICAgICAgIGtleWZyYW1lVmFsdWUuc2V0
S2V5KGtleXNba2V5SW5kZXhdKTsKKyAgICAgICAgICAgIGxpc3QuaW5zZXJ0KGtleWZyYW1lVmFs
dWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIDAlIGtleWZyYW1lIGlzIG1p
c3NpbmcsIGNyZWF0ZSBpdCAoYnV0IG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG90aGVy
IGtleWZyYW1lKQorICAgIGludCBpbml0aWFsTGlzdFNpemUgPSBsaXN0LnNpemUoKTsKKyAgICBp
ZiAoaW5pdGlhbExpc3RTaXplID4gMCAmJiBsaXN0WzBdLmtleSgpKSB7CisgICAgICAgIHN0YXRp
YyBTdHlsZUtleWZyYW1lKiB6ZXJvUGVyY2VudEtleWZyYW1lOworICAgICAgICBpZiAoIXplcm9Q
ZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIHplcm9QZXJjZW50S2V5ZnJhbWUgPSBTdHls
ZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7CisgICAgICAgICAgICB6ZXJvUGVyY2VudEtl
eWZyYW1lLT5zZXRLZXlUZXh0KCIwJSIpOworICAgICAgICB9CisgICAgICAgIEtleWZyYW1lVmFs
dWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKKyAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShz
dHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgemVyb1BlcmNlbnRLZXlmcmFtZSwga2V5ZnJh
bWVWYWx1ZSkpOworICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKKyAgICB9CisK
KyAgICAvLyBJZiB0aGUgMTAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBv
bmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKKyAgICBpZiAoaW5p
dGlhbExpc3RTaXplID4gMCAmJiAobGlzdFtsaXN0LnNpemUoKSAtIDFdLmtleSgpICE9IDEpKSB7
CisgICAgICAgIHN0YXRpYyBTdHlsZUtleWZyYW1lKiBodW5kcmVkUGVyY2VudEtleWZyYW1lOwor
ICAgICAgICBpZiAoIWh1bmRyZWRQZXJjZW50S2V5ZnJhbWUpIHsKKyAgICAgICAgICAgIGh1bmRy
ZWRQZXJjZW50S2V5ZnJhbWUgPSBTdHlsZUtleWZyYW1lOjpjcmVhdGUoKS5sZWFrUmVmKCk7Cisg
ICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lLT5zZXRLZXlUZXh0KCIxMDAlIik7Cisg
ICAgICAgIH0KKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSBrZXlmcmFtZVZhbHVlKDEsIDApOworICAg
ICAgICBrZXlmcmFtZVZhbHVlLnNldFN0eWxlKHN0eWxlRm9yS2V5ZnJhbWUoZWxlbWVudFN0eWxl
LCBodW5kcmVkUGVyY2VudEtleWZyYW1lLCBrZXlmcmFtZVZhbHVlKSk7CisgICAgICAgIGxpc3Qu
aW5zZXJ0KGtleWZyYW1lVmFsdWUpOworICAgIH0KK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGUsIGNvbnN0
IFBzZXVkb1N0eWxlUmVxdWVzdCYgcHNldWRvU3R5bGVSZXF1ZXN0LCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUpCit7CisgICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKKyAgICBpZiAoIWUpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKworICAgIGluaXRF
bGVtZW50KGUpOworCisgICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBl
LCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBzdGF0ZS5zZXRTdHlsZShS
ZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOworICAgIHN0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1f
c3RhdGUucGFyZW50U3R5bGUoKSk7CisKKyAgICAvLyBTaW5jZSB3ZSBkb24ndCB1c2UgcHNldWRv
LWVsZW1lbnRzIGluIGFueSBvZiBvdXIgcXVpcmsvcHJpbnQgdXNlciBhZ2VudCBydWxlcywgZG9u
J3Qgd2FzdGUgdGltZSB3YWxraW5nCisgICAgLy8gdGhvc2UgcnVsZXMuCisKKyAgICAvLyBDaGVj
ayBVQSwgdXNlciBhbmQgYXV0aG9yIHJ1bGVzLgorICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0
OworICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7CisKKyAgICBpZiAobV9tYXRjaEF1dGhv
ckFuZFVzZXJTdHlsZXMpIHsKKyAgICAgICAgbWF0Y2hVc2VyUnVsZXMobWF0Y2hSZXN1bHQsIGZh
bHNlKTsKKyAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOworICAg
IH0KKworICAgIGlmIChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgc3RhdGUuc3R5bGUoKS0+c2V0U3R5bGVUeXBlKHBzZXVk
b1N0eWxlUmVxdWVzdC5wc2V1ZG9JZCk7CisKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1h
dGNoUmVzdWx0LCBlKTsKKworICAgIC8vIENsZWFuIHVwIG91ciBzdHlsZSBvYmplY3QncyBkaXNw
bGF5IGFuZCB0ZXh0IGRlY29yYXRpb25zIChhbW9uZyBvdGhlciBmaXh1cHMpLgorICAgIGFkanVz
dFJlbmRlclN0eWxlKHN0YXRlLnN0eWxlKCksIG1fc3RhdGUucGFyZW50U3R5bGUoKSwgMCk7CisK
KyAgICAvLyBTdGFydCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUu
CisgICAgbG9hZFBlbmRpbmdSZXNvdXJjZXMoKTsKKworICAgIGRvY3VtZW50KCktPmRpZEFjY2Vz
c1N0eWxlUmVzb2x2ZXIoKTsKKworICAgIC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgorICAgIHJl
dHVybiBzdGF0ZS50YWtlU3R5bGUoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5
bGVSZXNvbHZlcjo6c3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpCit7CisgICAgbV9zdGF0ZS5p
bml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVu
dCgpKTsgLy8gbV9yb290RWxlbWVudFN0eWxlIHdpbGwgYmUgc2V0IHRvIHRoZSBkb2N1bWVudCBz
dHlsZS4KKworICAgIG1fc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKKyAg
ICBtX3N0YXRlLnN0eWxlKCktPmluaGVyaXRGcm9tKG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgp
KTsKKworICAgIGNvbnN0IGJvb2wgaXNMZWZ0ID0gaXNMZWZ0UGFnZShwYWdlSW5kZXgpOworICAg
IGNvbnN0IGJvb2wgaXNGaXJzdCA9IGlzRmlyc3RQYWdlKHBhZ2VJbmRleCk7CisgICAgY29uc3Qg
U3RyaW5nIHBhZ2UgPSBwYWdlTmFtZShwYWdlSW5kZXgpOworICAgIAorICAgIE1hdGNoUmVzdWx0
IHJlc3VsdDsKKyAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0
czo6ZGVmYXVsdFByaW50U3R5bGUsIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7CisgICAgbWF0Y2hQ
YWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBpc0xlZnQsIGlzRmlyc3Qs
IHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBhdXRob3IgUnVsZVNldCBm
b3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KKyAgICBtYXRjaFBhZ2VSdWxl
cyhyZXN1bHQsIG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdl
KTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKKyAgICBib29sIGluaGVyaXRl
ZE9ubHkgPSBmYWxzZTsKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKKyAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKKyNlbmRpZgor
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4ocmVzdWx0
LCBmYWxzZSwgMCwgcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRl
ZE9ubHkpOworCisgICAgLy8gSWYgb3VyIGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1
cGRhdGUgaXQgbm93LgorICAgIHVwZGF0ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlz
IHNldCB3aGVuIHdlIGFyZSBzdXJlIHdlIGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4KKyAgICBp
ZiAobV9zdGF0ZS5saW5lSGVpZ2h0VmFsdWUoKSkKKyAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUxpbmVIZWlnaHQsIG1fc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOworCisgICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2Us
IDAsIHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsK
KworICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHls
ZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworCisgICAgZG9jdW1lbnQoKS0+ZGlkQWNj
ZXNzU3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gTm93IHJldHVybiB0aGUgc3R5bGUuCisgICAg
cmV0dXJuIG1fc3RhdGUudGFrZVN0eWxlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+
IFN0eWxlUmVzb2x2ZXI6OmRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKQoreworICAgIG1fc3RhdGUu
c2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKKyAgICAvLyBNYWtlIHN1cmUgb3VyIGZv
bnRzIGFyZSBpbml0aWFsaXplZCBpZiB3ZSBkb24ndCBpbmhlcml0IHRoZW0gZnJvbSBvdXIgcGFy
ZW50IHN0eWxlLgorICAgIGlmIChTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdz
KCkpIHsKKyAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7CisgICAgICAgIG1f
c3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IoKSk7CisgICAgfSBlbHNl
CisgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+Zm9udCgpLnVwZGF0ZSgwKTsKKworICAgIHJldHVy
biBtX3N0YXRlLnRha2VTdHlsZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHls
ZVJlc29sdmVyOjpzdHlsZUZvclRleHQoVGV4dCogdGV4dE5vZGUpCit7CisgICAgQVNTRVJUKHRl
eHROb2RlKTsKKworICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0IGNvbnRleHQodGV4dE5vZGUpOwor
ICAgIE5vZGUqIHBhcmVudE5vZGUgPSBjb250ZXh0LnBhcmVudE5vZGVGb3JSZW5kZXJpbmdBbmRT
dHlsZSgpOworICAgIHJldHVybiBjb250ZXh0LnJlc2V0U3R5bGVJbmhlcml0YW5jZSgpIHx8ICFw
YXJlbnROb2RlID8KKyAgICAgICAgZGVmYXVsdFN0eWxlRm9yRWxlbWVudCgpIDogcGFyZW50Tm9k
ZS0+cmVuZGVyU3R5bGUoKTsKK30KKworc3RhdGljIHZvaWQgYWRkSW50cmluc2ljTWFyZ2lucyhS
ZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgLy8gSW50cmluc2ljIG1hcmdpbiB2YWx1ZS4KKyAg
ICBjb25zdCBpbnQgaW50cmluc2ljTWFyZ2luID0gMiAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7
CisKKyAgICAvLyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBk
ZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCisgICAgLy8gRklYTUU6
IFVzaW5nICJxdWlyayIgdG8gZGVjaWRlIHRoZSBtYXJnaW4gd2Fzbid0IHNldCBpcyBraW5kIG9m
IGxhbWUuCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpIHsKKyAg
ICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxl
LT5zZXRNYXJnaW5MZWZ0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgICAg
IGlmIChzdHlsZS0+bWFyZ2luUmlnaHQoKS5xdWlyaygpKQorICAgICAgICAgICAgc3R5bGUtPnNl
dE1hcmdpblJpZ2h0KExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgfQorCisg
ICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgeworICAgICAgICBpZiAoc3R5bGUtPm1h
cmdpblRvcCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0
aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luQm90
dG9tKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3Ro
KGludHJpbnNpY01hcmdpbiwgRml4ZWQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBFRGlzcGxheSBl
cXVpdmFsZW50QmxvY2tEaXNwbGF5KEVEaXNwbGF5IGRpc3BsYXksIGJvb2wgaXNGbG9hdGluZywg
Ym9vbCBzdHJpY3RQYXJzaW5nKQoreworICAgIHN3aXRjaCAoZGlzcGxheSkgeworICAgIGNhc2Ug
QkxPQ0s6CisgICAgY2FzZSBUQUJMRToKKyAgICBjYXNlIEJPWDoKKyAgICBjYXNlIEZMRVg6Cisg
ICAgY2FzZSBHUklEOgorICAgICAgICByZXR1cm4gZGlzcGxheTsKKworICAgIGNhc2UgTElTVF9J
VEVNOgorICAgICAgICAvLyBJdCBpcyBhIFdpbklFIGJ1ZyB0aGF0IGZsb2F0ZWQgbGlzdCBpdGVt
cyBsb3NlIHRoZWlyIGJ1bGxldHMsIHNvIHdlJ2xsIGVtdWxhdGUgdGhlIHF1aXJrLCBidXQgb25s
eSBpbiBxdWlya3MgbW9kZS4KKyAgICAgICAgaWYgKCFzdHJpY3RQYXJzaW5nICYmIGlzRmxvYXRp
bmcpCisgICAgICAgICAgICByZXR1cm4gQkxPQ0s7CisgICAgICAgIHJldHVybiBkaXNwbGF5Owor
ICAgIGNhc2UgSU5MSU5FX1RBQkxFOgorICAgICAgICByZXR1cm4gVEFCTEU7CisgICAgY2FzZSBJ
TkxJTkVfQk9YOgorICAgICAgICByZXR1cm4gQk9YOworICAgIGNhc2UgSU5MSU5FX0ZMRVg6Cisg
ICAgICAgIHJldHVybiBGTEVYOworICAgIGNhc2UgSU5MSU5FX0dSSUQ6CisgICAgICAgIHJldHVy
biBHUklEOworCisgICAgY2FzZSBJTkxJTkU6CisgICAgY2FzZSBSVU5fSU46CisgICAgY2FzZSBD
T01QQUNUOgorICAgIGNhc2UgSU5MSU5FX0JMT0NLOgorICAgIGNhc2UgVEFCTEVfUk9XX0dST1VQ
OgorICAgIGNhc2UgVEFCTEVfSEVBREVSX0dST1VQOgorICAgIGNhc2UgVEFCTEVfRk9PVEVSX0dS
T1VQOgorICAgIGNhc2UgVEFCTEVfUk9XOgorICAgIGNhc2UgVEFCTEVfQ09MVU1OX0dST1VQOgor
ICAgIGNhc2UgVEFCTEVfQ09MVU1OOgorICAgIGNhc2UgVEFCTEVfQ0VMTDoKKyAgICBjYXNlIFRB
QkxFX0NBUFRJT046CisgICAgICAgIHJldHVybiBCTE9DSzsKKyAgICBjYXNlIE5PTkU6CisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gTk9ORTsKKyAgICB9Cisg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIEJMT0NLOworfQorCisvLyBDU1Mg
cmVxdWlyZXMgdGV4dC1kZWNvcmF0aW9uIHRvIGJlIHJlc2V0IGF0IGVhY2ggRE9NIGVsZW1lbnQg
Zm9yIHRhYmxlcywgCisvLyBpbmxpbmUgYmxvY2tzLCBpbmxpbmUgdGFibGVzLCBydW4taW5zLCBz
aGFkb3cgRE9NIGNyb3NzaW5ncywgZmxvYXRpbmcgZWxlbWVudHMsCisvLyBhbmQgYWJzb2x1dGUg
b3IgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGVsZW1lbnRzLgorc3RhdGljIGJvb2wgZG9lc05vdElu
aGVyaXRUZXh0RGVjb3JhdGlvbihSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpCit7Cisg
ICAgcmV0dXJuIHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9
PSBJTkxJTkVfVEFCTEUgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBSVU5fSU4KKyAgICAgICAgfHwg
c3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQkxPQ0sgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJ
TkxJTkVfQk9YIHx8IGlzQXRTaGFkb3dCb3VuZGFyeShlKQorICAgICAgICB8fCBzdHlsZS0+aXNG
bG9hdGluZygpIHx8IHN0eWxlLT5oYXNPdXRPZkZsb3dQb3NpdGlvbigpOworfQorCitzdGF0aWMg
Ym9vbCBpc0Rpc3BsYXlGbGV4aWJsZUJveChFRGlzcGxheSBkaXNwbGF5KQoreworICAgIHJldHVy
biBkaXNwbGF5ID09IEZMRVggfHwgZGlzcGxheSA9PSBJTkxJTkVfRkxFWDsKK30KKwordm9pZCBT
dHlsZVJlc29sdmVyOjphZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRl
clN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVudCAqZSkKK3sKKyAgICBBU1NFUlQocGFyZW50U3R5
bGUpOworCisgICAgLy8gQ2FjaGUgb3VyIG9yaWdpbmFsIGRpc3BsYXkuCisgICAgc3R5bGUtPnNl
dE9yaWdpbmFsRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpKTsKKworICAgIGlmIChzdHlsZS0+ZGlz
cGxheSgpICE9IE5PTkUpIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIDx0ZD4gdGhhdCBzcGVj
aWZpZXMgYSBmbG9hdCBwcm9wZXJ0eSwgaW4gcXVpcmtzIG1vZGUgd2UganVzdCBkcm9wIHRoZSBm
bG9hdAorICAgICAgICAvLyBwcm9wZXJ0eS4KKyAgICAgICAgLy8gU2l0ZXMgYWxzbyBjb21tb25s
eSB1c2UgZGlzcGxheTppbmxpbmUvYmxvY2sgb24gPHRkPnMgYW5kIDx0YWJsZT5zLiBJbiBxdWly
a3MgbW9kZSB3ZSBmb3JjZQorICAgICAgICAvLyB0aGVzZSB0YWdzIHRvIHJldGFpbiB0aGVpciBk
aXNwbGF5IHR5cGVzLgorICAgICAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkgJiYg
ZSkgeworICAgICAgICAgICAgaWYgKGUtPmhhc1RhZ05hbWUodGRUYWcpKSB7CisgICAgICAgICAg
ICAgICAgc3R5bGUtPnNldERpc3BsYXkoVEFCTEVfQ0VMTCk7CisgICAgICAgICAgICAgICAgc3R5
bGUtPnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlLT5oYXNU
YWdOYW1lKHRhYmxlVGFnKSkKKyAgICAgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShzdHls
ZS0+aXNEaXNwbGF5SW5saW5lVHlwZSgpID8gSU5MSU5FX1RBQkxFIDogVEFCTEUpOworICAgICAg
ICB9CisKKyAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUodGRUYWcpIHx8IGUtPmhhc1Rh
Z05hbWUodGhUYWcpKSkgeworICAgICAgICAgICAgaWYgKHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0g
S0hUTUxfTk9XUkFQKSB7CisgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBhcmUg
cmVhbGx5IG5vd3JhcHBpbmcgb3IgaWYgd2Ugc2hvdWxkIGp1c3QKKyAgICAgICAgICAgICAgICAv
LyB1c2Ugbm9ybWFsIGluc3RlYWQuIElmIHRoZSB3aWR0aCBvZiB0aGUgY2VsbCBpcyBmaXhlZCwg
dGhlbgorICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGFjdHVhbGx5IHVzZSBOT1dSQVAuCisg
ICAgICAgICAgICAgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzRml4ZWQoKSkKKyAgICAgICAgICAg
ICAgICAgICAgc3R5bGUtPnNldFdoaXRlU3BhY2UoTk9STUFMKTsKKyAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNwYWNlKE5PV1JBUCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUYWJsZXMgbmV2ZXIgc3VwcG9y
dCB0aGUgLXdlYmtpdC0qIHZhbHVlcyBmb3IgdGV4dC1hbGlnbiBhbmQgd2lsbCByZXNldCBiYWNr
IHRvIHRoZSBkZWZhdWx0LgorICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRhYmxlVGFn
KSAmJiAoc3R5bGUtPnRleHRBbGlnbigpID09IFdFQktJVF9MRUZUIHx8IHN0eWxlLT50ZXh0QWxp
Z24oKSA9PSBXRUJLSVRfQ0VOVEVSIHx8IHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklH
SFQpKQorICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihUQVNUQVJUKTsKKworICAgICAg
ICAvLyBGcmFtZXMgYW5kIGZyYW1lc2V0cyBuZXZlciBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBv
ciBwb3NpdGlvbjphYnNvbHV0ZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8KKyAgICAgICAgLy8gZml4
IGEgY3Jhc2ggd2hlcmUgYSBzaXRlIHRyaWVzIHRvIHBvc2l0aW9uIHRoZXNlIG9iamVjdHMuIFRo
ZXkgYWxzbyBuZXZlciBob25vciBkaXNwbGF5LgorICAgICAgICBpZiAoZSAmJiAoZS0+aGFzVGFn
TmFtZShmcmFtZVRhZykgfHwgZS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpKSB7CisgICAgICAg
ICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOworICAgICAgICAgICAgc3R5
bGUtPnNldERpc3BsYXkoQkxPQ0spOworICAgICAgICB9CisKKyAgICAgICAgLy8gUnVieSB0ZXh0
IGRvZXMgbm90IHN1cHBvcnQgZmxvYXQgb3IgcG9zaXRpb24uIFRoaXMgbWlnaHQgY2hhbmdlIHdp
dGggZXZvbHV0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAgICBpZiAoZSAmJiBlLT5o
YXNUYWdOYW1lKHJ0VGFnKSkgeworICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0YXRp
Y1Bvc2l0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgb3ZlcnJpZGluZyBz
dGFydC8td2Via2l0LWF1dG8gbGlrZSB0aGlzLiBEbyBpdCBpbiBodG1sLmNzcyBpbnN0ZWFkLgor
ICAgICAgICAvLyBUYWJsZSBoZWFkZXJzIHdpdGggYSB0ZXh0LWFsaWduIG9mIC13ZWJraXQtYXV0
byB3aWxsIGNoYW5nZSB0aGUgdGV4dC1hbGlnbiB0byBjZW50ZXIuCisgICAgICAgIGlmIChlICYm
IGUtPmhhc1RhZ05hbWUodGhUYWcpICYmIHN0eWxlLT50ZXh0QWxpZ24oKSA9PSBUQVNUQVJUKQor
ICAgICAgICAgICAgc3R5bGUtPnNldFRleHRBbGlnbihDRU5URVIpOworCisgICAgICAgIGlmIChl
ICYmIGUtPmhhc1RhZ05hbWUobGVnZW5kVGFnKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNw
bGF5KEJMT0NLKTsKKworICAgICAgICAvLyBBYnNvbHV0ZS9maXhlZCBwb3NpdGlvbmVkIGVsZW1l
bnRzLCBmbG9hdGluZyBlbGVtZW50cyBhbmQgdGhlIGRvY3VtZW50IGVsZW1lbnQgbmVlZCBibG9j
ay1saWtlIG91dHNpZGUgZGlzcGxheS4KKyAgICAgICAgaWYgKHN0eWxlLT5oYXNPdXRPZkZsb3dQ
b3NpdGlvbigpIHx8IHN0eWxlLT5pc0Zsb2F0aW5nKCkgfHwgKGUgJiYgZS0+ZG9jdW1lbnQoKS0+
ZG9jdW1lbnRFbGVtZW50KCkgPT0gZSkpCisgICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShl
cXVpdmFsZW50QmxvY2tEaXNwbGF5KHN0eWxlLT5kaXNwbGF5KCksIHN0eWxlLT5pc0Zsb2F0aW5n
KCksICFkb2N1bWVudCgpLT5pblF1aXJrc01vZGUoKSkpOworCisgICAgICAgIC8vIEZJWE1FOiBE
b24ndCBzdXBwb3J0IHRoaXMgbXV0YXRpb24gZm9yIHBzZXVkbyBzdHlsZXMgbGlrZSBmaXJzdC1s
ZXR0ZXIgb3IgZmlyc3QtbGluZSwgc2luY2UgaXQncyBub3QgY29tcGxldGVseQorICAgICAgICAv
LyBjbGVhciBob3cgdGhhdCBzaG91bGQgd29yay4KKyAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5
KCkgPT0gSU5MSU5FICYmIHN0eWxlLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETyAmJiBzdHlsZS0+
d3JpdGluZ01vZGUoKSAhPSBwYXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisKKyAgICAgICAgLy8gQWZ0ZXIgcGVy
Zm9ybWluZyB0aGUgZGlzcGxheSBtdXRhdGlvbiwgY2hlY2sgdGFibGUgcm93cy4gV2UgZG8gbm90
IGhvbm9yIHBvc2l0aW9uOnJlbGF0aXZlIG9yIHBvc2l0aW9uOnN0aWNreSBvbgorICAgICAgICAv
LyB0YWJsZSByb3dzIG9yIGNlbGxzLiBUaGlzIGhhcyBiZWVuIGVzdGFibGlzaGVkIGZvciBwb3Np
dGlvbjpyZWxhdGl2ZSBpbiBDU1MyLjEgKGFuZCBjYXVzZWQgYSBjcmFzaCBpbiBjb250YWluaW5n
QmxvY2soKQorICAgICAgICAvLyBvbiBzb21lIHNpdGVzKS4KKyAgICAgICAgaWYgKChzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX1JPV19HUk9VUAorICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9G
T09URVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpCisgICAgICAgICAg
ICAmJiBzdHlsZS0+aGFzSW5GbG93UG9zaXRpb24oKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQ
b3NpdGlvbihTdGF0aWNQb3NpdGlvbik7CisKKyAgICAgICAgLy8gd3JpdGluZy1tb2RlIGRvZXMg
bm90IGFwcGx5IHRvIHRhYmxlIHJvdyBncm91cHMsIHRhYmxlIGNvbHVtbiBncm91cHMsIHRhYmxl
IHJvd3MsIGFuZCB0YWJsZSBjb2x1bW5zLgorICAgICAgICAvLyBGSVhNRTogVGFibGUgY2VsbHMg
c2hvdWxkIGJlIGFsbG93ZWQgdG8gYmUgcGVycGVuZGljdWxhciBvciBmbGlwcGVkIHdpdGggcmVz
cGVjdCB0byB0aGUgdGFibGUsIHRob3VnaC4KKyAgICAgICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkg
PT0gVEFCTEVfQ09MVU1OIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfQ09MVU1OX0dST1VQ
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQCisgICAgICAgICAgICB8
fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0hFQURFUl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxh
eSgpID09IFRBQkxFX1JPVyB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUAor
ICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9DRUxMKQorICAgICAgICAg
ICAgc3R5bGUtPnNldFdyaXRpbmdNb2RlKHBhcmVudFN0eWxlLT53cml0aW5nTW9kZSgpKTsKKwor
ICAgICAgICAvLyBGSVhNRTogU2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBibG9jay1mbG93IG9uIGZs
ZXhpYmxlIGJveGVzIHlldCwgZGlzYWxsb3cgc2V0dGluZworICAgICAgICAvLyBvZiBibG9jay1m
bG93IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZS4KKyAgICAg
ICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ2NDE4IC0gRmxl
eGlibGUgYm94IHN1cHBvcnQuCisgICAgICAgIGlmIChzdHlsZS0+d3JpdGluZ01vZGUoKSAhPSBU
b3BUb0JvdHRvbVdyaXRpbmdNb2RlICYmIChzdHlsZS0+ZGlzcGxheSgpID09IEJPWCB8fCBzdHls
ZS0+ZGlzcGxheSgpID09IElOTElORV9CT1gpKQorICAgICAgICAgICAgc3R5bGUtPnNldFdyaXRp
bmdNb2RlKFRvcFRvQm90dG9tV3JpdGluZ01vZGUpOworCisgICAgICAgIGlmIChpc0Rpc3BsYXlG
bGV4aWJsZUJveChwYXJlbnRTdHlsZS0+ZGlzcGxheSgpKSkgeworICAgICAgICAgICAgc3R5bGUt
PnNldEZsb2F0aW5nKE5vRmxvYXQpOworICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1
aXZhbGVudEJsb2NrRGlzcGxheShzdHlsZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygp
LCAhZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpKTsKKyAgICAgICAgfQorCisjaWYgRU5BQkxF
KERJQUxPR19FTEVNRU5UKQorICAgICAgICAvLyBQZXIgdGhlIHNwZWMsIHBvc2l0aW9uICdzdGF0
aWMnIGFuZCAncmVsYXRpdmUnIGluIHRoZSB0b3AgbGF5ZXIgY29tcHV0ZSB0byAnYWJzb2x1dGUn
LgorICAgICAgICBpZiAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSAmJiAoc3R5bGUtPnBvc2l0aW9u
KCkgPT0gU3RhdGljUG9zaXRpb24gfHwgc3R5bGUtPnBvc2l0aW9uKCkgPT0gUmVsYXRpdmVQb3Np
dGlvbikpIHsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihBYnNvbHV0ZVBvc2l0aW9u
KTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKKyAgICAgICAgfQorI2Vu
ZGlmCisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIG91ciB6LWluZGV4IHZhbHVlIGlzIG9ubHkg
YXBwbGllZCBpZiB0aGUgb2JqZWN0IGlzIHBvc2l0aW9uZWQuCisgICAgaWYgKHN0eWxlLT5wb3Np
dGlvbigpID09IFN0YXRpY1Bvc2l0aW9uICYmICFpc0Rpc3BsYXlGbGV4aWJsZUJveChwYXJlbnRT
dHlsZS0+ZGlzcGxheSgpKSkKKyAgICAgICAgc3R5bGUtPnNldEhhc0F1dG9aSW5kZXgoKTsKKwor
ICAgIC8vIEF1dG8gei1pbmRleCBiZWNvbWVzIDAgZm9yIHRoZSByb290IGVsZW1lbnQgYW5kIHRy
YW5zcGFyZW50IG9iamVjdHMuIFRoaXMgcHJldmVudHMKKyAgICAvLyBjYXNlcyB3aGVyZSBvYmpl
Y3RzIHRoYXQgc2hvdWxkIGJlIGJsZW5kZWQgYXMgYSBzaW5nbGUgdW5pdCBlbmQgdXAgd2l0aCBh
IG5vbi10cmFuc3BhcmVudAorICAgIC8vIG9iamVjdCB3ZWRnZWQgaW4gYmV0d2VlbiB0aGVtLiBB
dXRvIHotaW5kZXggYWxzbyBiZWNvbWVzIDAgZm9yIG9iamVjdHMgdGhhdCBzcGVjaWZ5IHRyYW5z
Zm9ybXMvbWFza3MvcmVmbGVjdGlvbnMuCisgICAgaWYgKHN0eWxlLT5oYXNBdXRvWkluZGV4KCkg
JiYgKChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpCisgICAgICAg
IHx8IHN0eWxlLT5vcGFjaXR5KCkgPCAxLjBmCisgICAgICAgIHx8IHN0eWxlLT5oYXNUcmFuc2Zv
cm1SZWxhdGVkUHJvcGVydHkoKQorICAgICAgICB8fCBzdHlsZS0+aGFzTWFzaygpCisgICAgICAg
IHx8IHN0eWxlLT5jbGlwUGF0aCgpCisgICAgICAgIHx8IHN0eWxlLT5ib3hSZWZsZWN0KCkKKyAg
ICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpCisgICAgICAgIHx8IHN0eWxlLT5oYXNCbGVuZE1v
ZGUoKQorICAgICAgICB8fCBzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGlja3lQb3NpdGlvbgorICAg
ICAgICB8fCAoc3R5bGUtPnBvc2l0aW9uKCkgPT0gRml4ZWRQb3NpdGlvbiAmJiBlICYmIGUtPmRv
Y3VtZW50KCktPnBhZ2UoKSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCktPnNldHRpbmdzKCktPmZp
eGVkUG9zaXRpb25DcmVhdGVzU3RhY2tpbmdDb250ZXh0KCkpCisjaWYgRU5BQkxFKEFDQ0VMRVJB
VEVEX09WRVJGTE9XX1NDUk9MTElORykKKyAgICAgICAgLy8gVG91Y2ggb3ZlcmZsb3cgc2Nyb2xs
aW5nIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0LgorICAgICAgICB8fCAoKHN0eWxlLT5vdmVy
Zmxvd1goKSAhPSBPSElEREVOIHx8IHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPSElEREVOKSAmJiBz
dHlsZS0+dXNlVG91Y2hPdmVyZmxvd1Njcm9sbGluZygpKQorI2VuZGlmCisjaWYgRU5BQkxFKERJ
QUxPR19FTEVNRU5UKQorICAgICAgICB8fCAoZSAmJiBlLT5pc0luVG9wTGF5ZXIoKSkKKyNlbmRp
ZgorICAgICAgICApKQorICAgICAgICBzdHlsZS0+c2V0WkluZGV4KDApOworCisgICAgLy8gVGV4
dGFyZWEgY29uc2lkZXJzIG92ZXJmbG93IHZpc2libGUgYXMgYXV0by4KKyAgICBpZiAoZSAmJiBl
LT5oYXNUYWdOYW1lKHRleHRhcmVhVGFnKSkgeworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dY
KHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3R5bGUtPm92ZXJmbG93
WCgpKTsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShzdHlsZS0+b3ZlcmZsb3dZKCkgPT0g
T1ZJU0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1koKSk7CisgICAgfQorCisgICAgaWYg
KGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oc3R5bGUsIGUpKQorICAgICAgICBzdHlsZS0+
c2V0VGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUtPnRleHREZWNvcmF0aW9uKCkpOworICAg
IGVsc2UKKyAgICAgICAgc3R5bGUtPmFkZFRvVGV4dERlY29yYXRpb25zSW5FZmZlY3Qoc3R5bGUt
PnRleHREZWNvcmF0aW9uKCkpOworCisgICAgLy8gSWYgZWl0aGVyIG92ZXJmbG93IHZhbHVlIGlz
IG5vdCB2aXNpYmxlLCBjaGFuZ2UgdG8gYXV0by4KKyAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgp
ID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPTUFSUVVFRSkKKyAgICAgICAg
c3R5bGUtPnNldE92ZXJmbG93WShPTUFSUVVFRSk7CisgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJm
bG93WSgpID09IE9NQVJRVUVFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPTUFSUVVFRSkKKyAg
ICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPTUFSUVVFRSk7CisgICAgZWxzZSBpZiAoc3R5bGUt
Pm92ZXJmbG93WCgpID09IE9WSVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1koKSAhPSBPVklTSUJM
RSkgeworICAgICAgICAvLyBGSVhNRTogT25jZSB3ZSBpbXBsZW1lbnQgcGFnaW5hdGlvbiBjb250
cm9scywgb3ZlcmZsb3cteCBzaG91bGQgZGVmYXVsdCB0byBoaWRkZW4KKyAgICAgICAgLy8gaWYg
b3ZlcmZsb3cteSBpcyBzZXQgdG8gLXdlYmtpdC1wYWdlZC14IG9yIC13ZWJraXQtcGFnZS15LiBG
b3Igbm93LCB3ZSdsbCBsZXQgaXQKKyAgICAgICAgLy8gZGVmYXVsdCB0byBhdXRvIHNvIHdlIGNh
biBhdCBsZWFzdCBzY3JvbGwgdGhyb3VnaCB0aGUgcGFnZXMuCisgICAgICAgIHN0eWxlLT5zZXRP
dmVyZmxvd1goT0FVVE8pOworICAgIH0gZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9W
SVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSkKKyAgICAgICAgc3R5bGUt
PnNldE92ZXJmbG93WShPQVVUTyk7CisKKyAgICAvLyBDYWxsIHNldFN0eWxlc0ZvclBhZ2luYXRp
b25Nb2RlKCkgaWYgYSBwYWdpbmF0aW9uIG1vZGUgaXMgc2V0IGZvciBhbnkgbm9uLXJvb3QgZWxl
bWVudHMuIElmIHRoZXNlCisgICAgLy8gc3R5bGVzIGFyZSBzcGVjaWZpZWQgb24gYSByb290IGVs
ZW1lbnQsIHRoZW4gdGhleSB3aWxsIGJlIGluY29ycG9yYXRlZCBpbgorICAgIC8vIFN0eWxlUmVz
b2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoKS4KKyAgICBpZiAoKHN0eWxlLT5vdmVyZmxvd1koKSA9
PSBPUEFHRURYIHx8IHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPUEFHRURZKSAmJiAhKGUgJiYgKGUt
Pmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgZS0+aGFzVGFnTmFtZShib2R5VGFnKSkpKQorICAgICAg
ICBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShXZWJDb3JlOjpwYWdpbmF0aW9uTW9kZUZvclJl
bmRlclN0eWxlKHN0eWxlKSwgc3R5bGUpOworCisgICAgLy8gVGFibGUgcm93cywgc2VjdGlvbnMg
YW5kIHRoZSB0YWJsZSBpdHNlbGYgd2lsbCBzdXBwb3J0IG92ZXJmbG93OmhpZGRlbiBhbmQgd2ls
bCBpZ25vcmUgc2Nyb2xsL2F1dG8uCisgICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgdGFibGUgc2Vj
dGlvbnMgd2lsbCBzdXBwb3J0IGF1dG8gYW5kIHNjcm9sbC4KKyAgICBpZiAoc3R5bGUtPmRpc3Bs
YXkoKSA9PSBUQUJMRSB8fCBzdHlsZS0+ZGlzcGxheSgpID09IElOTElORV9UQUJMRQorICAgICAg
ICB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX1JPV19HUk9VUCB8fCBzdHlsZS0+ZGlzcGxh
eSgpID09IFRBQkxFX1JPVykgeworICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpICE9IE9W
SVNJQkxFICYmIHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPSElEREVOKQorICAgICAgICAgICAgc3R5
bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7CisgICAgICAgIGlmIChzdHlsZS0+b3ZlcmZsb3dZ
KCkgIT0gT1ZJU0lCTEUgJiYgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9ISURERU4pCisgICAgICAg
ICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKyAgICB9CisKKyAgICAvLyBNZW51
bGlzdHMgc2hvdWxkIGhhdmUgdmlzaWJsZSBvdmVyZmxvdworICAgIGlmIChzdHlsZS0+YXBwZWFy
YW5jZSgpID09IE1lbnVsaXN0UGFydCkgeworICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9W
SVNJQkxFKTsKKyAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPVklTSUJMRSk7CisgICAgfQor
CisgICAgLy8gQ3VsbCBvdXQgYW55IHVzZWxlc3MgbGF5ZXJzIGFuZCBhbHNvIHJlcGVhdCBwYXR0
ZXJucyBpbnRvIGFkZGl0aW9uYWwgbGF5ZXJzLgorICAgIHN0eWxlLT5hZGp1c3RCYWNrZ3JvdW5k
TGF5ZXJzKCk7CisgICAgc3R5bGUtPmFkanVzdE1hc2tMYXllcnMoKTsKKworICAgIC8vIERvIHRo
ZSBzYW1lIGZvciBhbmltYXRpb25zIGFuZCB0cmFuc2l0aW9ucy4KKyAgICBzdHlsZS0+YWRqdXN0
QW5pbWF0aW9ucygpOworICAgIHN0eWxlLT5hZGp1c3RUcmFuc2l0aW9ucygpOworCisgICAgLy8g
SW1wb3J0YW50OiBJbnRyaW5zaWMgbWFyZ2lucyBnZXQgYWRkZWQgdG8gY29udHJvbHMgYmVmb3Jl
IHRoZSB0aGVtZSBoYXMgYWRqdXN0ZWQgdGhlIHN0eWxlLCBzaW5jZSB0aGUgdGhlbWUgd2lsbAor
ICAgIC8vIGFsdGVyIGZvbnRzIGFuZCBoZWlnaHRzL3dpZHRocy4KKyAgICBpZiAoZSAmJiBlLT5p
c0Zvcm1Db250cm9sRWxlbWVudCgpICYmIHN0eWxlLT5mb250U2l6ZSgpID49IDExKSB7CisgICAg
ICAgIC8vIERvbid0IGFwcGx5IGludHJpbnNpYyBtYXJnaW5zIHRvIGltYWdlIGJ1dHRvbnMuIFRo
ZSBkZXNpZ25lciBrbm93cyBob3cgYmlnIHRoZSBpbWFnZXMgYXJlLAorICAgICAgICAvLyBzbyB3
ZSBoYXZlIHRvIHRyZWF0IGFsbCBpbWFnZSBidXR0b25zIGFzIHRob3VnaCB0aGV5IHdlcmUgZXhw
bGljaXRseSBzaXplZC4KKyAgICAgICAgaWYgKCFlLT5oYXNUYWdOYW1lKGlucHV0VGFnKSB8fCAh
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGUpLT5pc0ltYWdlQnV0dG9uKCkpCisgICAg
ICAgICAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKKyAgICB9CisKKyAgICAvLyBMZXQg
dGhlIHRoZW1lIGFsc28gaGF2ZSBhIGNyYWNrIGF0IGFkanVzdGluZyB0aGUgc3R5bGUuCisgICAg
aWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisgICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0
VGhlbWUoKS0+YWRqdXN0U3R5bGUodGhpcywgc3R5bGUsIGUsIG1fc3RhdGUuaGFzVUFBcHBlYXJh
bmNlKCksIG1fc3RhdGUuYm9yZGVyRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmREYXRhKCksIG1f
c3RhdGUuYmFja2dyb3VuZENvbG9yKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZSBmaXJzdC1sZXR0
ZXIgcHNldWRvIHN0eWxlLCBkbyBub3Qgc2hhcmUgdGhpcyBzdHlsZS4KKyAgICBpZiAoc3R5bGUt
Pmhhc1BzZXVkb1N0eWxlKEZJUlNUX0xFVFRFUikpCisgICAgICAgIHN0eWxlLT5zZXRVbmlxdWUo
KTsKKworICAgIC8vIEZJWE1FOiB3aGVuIGRyb3BwaW5nIHRoZSAtd2Via2l0IHByZWZpeCBvbiB0
cmFuc2Zvcm0tc3R5bGUsIHdlIHNob3VsZCBhbHNvIGhhdmUgb3BhY2l0eSA8IDEgY2F1c2UgZmxh
dHRlbmluZy4KKyAgICBpZiAoc3R5bGUtPnByZXNlcnZlczNEKCkgJiYgKHN0eWxlLT5vdmVyZmxv
d1goKSAhPSBPVklTSUJMRQorICAgICAgICB8fCBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lC
TEUKKyAgICAgICAgfHwgc3R5bGUtPmhhc0ZpbHRlcigpKSkKKyAgICAgICAgc3R5bGUtPnNldFRy
YW5zZm9ybVN0eWxlM0QoVHJhbnNmb3JtU3R5bGUzREZsYXQpOworCisgICAgLy8gU2VhbWxlc3Mg
aWZyYW1lcyBiZWhhdmUgbGlrZSBibG9ja3MuIE1hcCB0aGVpciBkaXNwbGF5IHRvIGlubGluZS1i
bG9jayB3aGVuIG1hcmtlZCBpbmxpbmUuCisgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShpZnJh
bWVUYWcpICYmIHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FICYmIHN0YXRpY19jYXN0PEhUTUxJ
RnJhbWVFbGVtZW50Kj4oZSktPnNob3VsZERpc3BsYXlTZWFtbGVzc2x5KCkpCisgICAgICAgIHN0
eWxlLT5zZXREaXNwbGF5KElOTElORV9CTE9DSyk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlm
IChlICYmIGUtPmlzU1ZHRWxlbWVudCgpKSB7CisgICAgICAgIC8vIFNwZWM6IGh0dHA6Ly93d3cu
dzMub3JnL1RSL1NWRy9tYXNraW5nLmh0bWwjT3ZlcmZsb3dQcm9wZXJ0eQorICAgICAgICBpZiAo
c3R5bGUtPm92ZXJmbG93WSgpID09IE9TQ1JPTEwpCisgICAgICAgICAgICBzdHlsZS0+c2V0T3Zl
cmZsb3dZKE9ISURERU4pOworICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0g
T0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dZKE9WSVNJQkxFKTsKKworICAg
ICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9TQ1JPTEwpCisgICAgICAgICAgICBzdHls
ZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOworICAgICAgICBlbHNlIGlmIChzdHlsZS0+b3ZlcmZs
b3dYKCkgPT0gT0FVVE8pCisgICAgICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9WSVNJQkxF
KTsKKworICAgICAgICAvLyBPbmx5IHRoZSByb290IDxzdmc+IGVsZW1lbnQgaW4gYW4gU1ZHIGRv
Y3VtZW50IGZyYWdtZW50IHRyZWUgaG9ub3JzIGNzcyBwb3NpdGlvbgorICAgICAgICBpZiAoIShl
LT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpICYmIGUtPnBhcmVudE5vZGUoKSAmJiAhZS0+
cGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQoKSkpCisgICAgICAgICAgICBzdHlsZS0+c2V0UG9z
aXRpb24oUmVuZGVyU3R5bGU6OmluaXRpYWxQb3NpdGlvbigpKTsKKworICAgICAgICAvLyBSZW5k
ZXJTVkdSb290IGhhbmRsZXMgem9vbWluZyBmb3IgdGhlIHdob2xlIFNWRyBzdWJ0cmVlLCBzbyBm
b3JlaWduT2JqZWN0IGNvbnRlbnQgc2hvdWxkCisgICAgICAgIC8vIG5vdCBiZSBzY2FsZWQgYWdh
aW4uCisgICAgICAgIGlmIChlLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpmb3JlaWduT2JqZWN0VGFn
KSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRFZmZlY3RpdmVab29tKFJlbmRlclN0eWxlOjppbml0
aWFsWm9vbSgpKTsKKyAgICB9CisjZW5kaWYKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpjaGVj
a1JlZ2lvblN0eWxlKEVsZW1lbnQqIHJlZ2lvbkVsZW1lbnQpCit7CisgICAgLy8gRklYTUUgKEJV
RyA3MjQ3Mik6IFdlIGRvbid0IGFkZCBALXdlYmtpdC1yZWdpb24gcnVsZXMgb2Ygc2NvcGVkIHN0
eWxlIHNoZWV0cyBmb3IgdGhlIG1vbWVudCwKKyAgICAvLyBzbyBhbGwgcmVnaW9uIHJ1bGVzIGFy
ZSBnbG9iYWwgYnkgZGVmYXVsdC4gVmVyaWZ5IHdoZXRoZXIgdGhhdCBjYW4gc3RhbmQgb3IgbmVl
ZHMgY2hhbmdpbmcuCisKKyAgICB1bnNpZ25lZCBydWxlc1NpemUgPSBtX3J1bGVTZXRzLmF1dGhv
clN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgeworICAgICAgICBBU1NFUlQobV9y
dWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkp
LnJ1bGVTZXQuZ2V0KCkpOworICAgICAgICBpZiAoY2hlY2tSZWdpb25TZWxlY3RvcihtX3J1bGVT
ZXRzLmF1dGhvclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkuc2Vs
ZWN0b3IsIHJlZ2lvbkVsZW1lbnQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgaWYgKG1fcnVsZVNldHMudXNlclN0eWxlKCkpIHsKKyAgICAgICAgcnVsZXNTaXplID0g
bV9ydWxlU2V0cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXpl
KCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBydWxlc1NpemU7ICsraSkgewor
ICAgICAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1fcmVnaW9uU2VsZWN0
b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY2hl
Y2tSZWdpb25TZWxlY3RvcihtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsK
K30KKworc3RhdGljIHZvaWQgY2hlY2tGb3JPcmllbnRhdGlvbkNoYW5nZShSZW5kZXJTdHlsZSog
c3R5bGUpCit7CisgICAgRm9udE9yaWVudGF0aW9uIGZvbnRPcmllbnRhdGlvbjsKKyAgICBOb25D
SktHbHlwaE9yaWVudGF0aW9uIGdseXBoT3JpZW50YXRpb247CisgICAgZ2V0Rm9udEFuZEdseXBo
T3JpZW50YXRpb24oc3R5bGUsIGZvbnRPcmllbnRhdGlvbiwgZ2x5cGhPcmllbnRhdGlvbik7CisK
KyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiA9IHN0eWxlLT5mb250
RGVzY3JpcHRpb24oKTsKKyAgICBpZiAoZm9udERlc2NyaXB0aW9uLm9yaWVudGF0aW9uKCkgPT0g
Zm9udE9yaWVudGF0aW9uICYmIGZvbnREZXNjcmlwdGlvbi5ub25DSktHbHlwaE9yaWVudGF0aW9u
KCkgPT0gZ2x5cGhPcmllbnRhdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgRm9udERlc2Ny
aXB0aW9uIG5ld0ZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgIG5ld0ZvbnRE
ZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24pOwor
ICAgIG5ld0ZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOwor
ICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9uKTsKK30KKwor
dm9pZCBTdHlsZVJlc29sdmVyOjp1cGRhdGVGb250KCkKK3sKKyAgICBpZiAoIW1fc3RhdGUuZm9u
dERpcnR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFJlbmRlclN0eWxlKiBzdHlsZSA9IG1f
c3RhdGUuc3R5bGUoKTsKKyAgICBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2Uoc3R5bGUsIG1f
c3RhdGUucGFyZW50U3R5bGUoKSk7CisgICAgY2hlY2tGb3Jab29tQ2hhbmdlKHN0eWxlLCBtX3N0
YXRlLnBhcmVudFN0eWxlKCkpOworICAgIGNoZWNrRm9yT3JpZW50YXRpb25DaGFuZ2Uoc3R5bGUp
OworICAgIHN0eWxlLT5mb250KCkudXBkYXRlKG1fZm9udFNlbGVjdG9yKTsKKyAgICBtX3N0YXRl
LnNldEZvbnREaXJ0eShmYWxzZSk7Cit9CisKK1Bhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxl
UmVzb2x2ZXI6OnN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqIGUsIHVuc2lnbmVkIHJ1bGVz
VG9JbmNsdWRlKQoreworICAgIHJldHVybiBwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChlLCBO
T1BTRVVETywgcnVsZXNUb0luY2x1ZGUpOworfQorCitQYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBT
dHlsZVJlc29sdmVyOjpwc2V1ZG9TdHlsZVJ1bGVzRm9yRWxlbWVudChFbGVtZW50KiBlLCBQc2V1
ZG9JZCBwc2V1ZG9JZCwgdW5zaWduZWQgcnVsZXNUb0luY2x1ZGUpCit7CisgICAgaWYgKCFlIHx8
ICFlLT5kb2N1bWVudCgpLT5oYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVs
ZXMpOworCisgICAgaW5pdEVsZW1lbnQoZSk7CisgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNv
bHZlKGRvY3VtZW50KCksIGUsIDAsIHBzZXVkb0lkKTsKKworICAgIE1hdGNoUmVzdWx0IGR1bW15
OworICAgIGlmIChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVzKSB7CisgICAgICAg
IC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCisgICAg
ICAgIG1hdGNoVUFSdWxlcyhkdW1teSk7CisKKyAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIg
c2hlZXQgcnVsZXMuCisgICAgICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKKyAg
ICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NT
UnVsZXMpOworICAgIH0KKworICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiAo
cnVsZXNUb0luY2x1ZGUgJiBBdXRob3JDU1NSdWxlcykpIHsKKyAgICAgICAgbV9zdGF0ZS5zZXRT
YW1lT3JpZ2luT25seSghKHJ1bGVzVG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOwor
CisgICAgICAgIC8vIENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgorICAgICAgICBt
YXRjaEF1dGhvclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwor
CisgICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoZmFsc2UpOworICAgIH0KKworICAg
IG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKKworICAg
IHJldHVybiBtX3N0YXRlLnRha2VSdWxlTGlzdCgpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJl
c29sdmVyOjpydWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRh
aW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2Vy
OjpCZWhhdmlvckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQoreworICAgIFN0YXRlJiBz
dGF0ZSA9IG1fc3RhdGU7CisKKyAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVj
dG9yKCkpIHsKKyAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1
ZGUgYW55IHBzZXVkbyBlbGVtZW50cy4KKyAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVx
dWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAvLyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxl
Y3RvciBtYXRjaGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFz
aC4KKyAgICAgICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBu
ZWVkIHRvIGNoZWNrIHRoZSBuYW1lc3BhY2UuCisgICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdo
dG1vc3RTZWxlY3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1l
bnQoKS0+aXNIVE1MRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011
bHRpcGFydFNlbGVjdG9yKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IH0KKyAgICAgICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0
b3I6OlRhZyAmJiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwg
cnVsZURhdGEuc2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQ
YXRoKHJ1bGVEYXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7CisgICAgICAgIGlmICgh
c2VsZWN0b3JDaGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9y
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdG9y
Q2hlY2tlckZhc3RQYXRoLm1hdGNoZXMoKTsKKyAgICB9CisKKyAgICAvLyBTbG93IHBhdGguCisg
ICAgU2VsZWN0b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2Rl
KCkpOworICAgIFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4
dChydWxlRGF0YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6
VmlzaXRlZE1hdGNoRW5hYmxlZCk7CisgICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5z
dHlsZSgpOworICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKKyAgICBjb250ZXh0LnBzZXVkb0lk
ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7CisgICAgY29udGV4dC5zY3Jv
bGxiYXIgPSBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXI7CisgICAgY29udGV4
dC5zY3JvbGxiYXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFy
dDsKKyAgICBjb250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsK
KyAgICBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNo
KGNvbnRleHQsIGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsK
KyAgICBpZiAobWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNl
dWRvSWQgIT0gTk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQg
IT0gZHluYW1pY1BzZXVkbykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVl
OworfQorCitib29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NT
U2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQoreworICAg
IGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwg
bV9zdGF0ZS5tb2RlKCkpOworICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25T
ZWxlY3RvcjsgczsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkgeworICAgICAgICBTZWxl
Y3RvckNoZWNrZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250
ZXh0KHMsIHJlZ2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJs
ZWQpOworICAgICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87Cisg
ICAgICAgIGlmIChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQs
IGlnbm9yZUR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBT
ZWxlY3RvckNoZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQorLy8gdGhpcyBpcyBtb3N0bHkgYm9yaW5nIHN0dWZmIG9uIGhvdyB0byBhcHBs
eSBhIGNlcnRhaW4gcnVsZSB0byB0aGUgcmVuZGVyc3R5bGUuLi4KKworTGVuZ3RoIFN0eWxlUmVz
b2x2ZXI6OmNvbnZlcnRUb0ludExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFs
dWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11
bHRpcGxpZXIpCit7CisgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUt
PmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNp
b24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbiB8IEZyYWN0aW9uQ29udmVyc2lvbiB8IFZpZXdwb3J0
UGVyY2VudGFnZUNvbnZlcnNpb24+KHN0eWxlLCByb290U3R5bGUsIG11bHRpcGxpZXIpIDogTGVu
Z3RoKFVuZGVmaW5lZCk7Cit9CisKK0xlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9GbG9h
dExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIFJlbmRlclN0eWxlKiBz
dHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIpCit7CisgICAg
cmV0dXJuIHByaW1pdGl2ZVZhbHVlID8gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxG
aXhlZEZsb2F0Q29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZl
cnNpb24gfCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9u
PihzdHlsZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOworfQor
Cit0ZW1wbGF0ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3Zv
aWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQq
IHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgYm9vbCBpc0ltcG9ydGFudCwgYm9vbCBpbmhl
cml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQor
eworICAgIEFTU0VSVCgocHJvcGVydHlXaGl0ZWxpc3RUeXBlICE9IFByb3BlcnR5V2hpdGVsaXN0
UmVnaW9uKSB8fCBtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKSk7CisgICAgSW5zcGVjdG9ySW5z
dHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6d2ls
bFByb2Nlc3NSdWxlKGRvY3VtZW50KCksIHJ1bGUsIHRoaXMpOworCisgICAgdW5zaWduZWQgcHJv
cGVydHlDb3VudCA9IHByb3BlcnRpZXMtPnByb3BlcnR5Q291bnQoKTsKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7CisgICAgICAgIFN0eWxlUHJvcGVy
dHlTZXQ6OlByb3BlcnR5UmVmZXJlbmNlIGN1cnJlbnQgPSBwcm9wZXJ0aWVzLT5wcm9wZXJ0eUF0
KGkpOworICAgICAgICBpZiAoaXNJbXBvcnRhbnQgIT0gY3VycmVudC5pc0ltcG9ydGFudCgpKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChpbmhlcml0ZWRPbmx5ICYmICFjdXJy
ZW50LmlzSW5oZXJpdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSB2YWx1
ZSBpcyBleHBsaWNpdGx5IGluaGVyaXRlZCwgd2UgbmVlZCB0byBhcHBseSBmdXJ0aGVyIG5vbi1p
bmhlcml0ZWQgcHJvcGVydGllcworICAgICAgICAgICAgLy8gYXMgdGhleSBtaWdodCBvdmVycmlk
ZSB0aGUgdmFsdWUgaW5oZXJpdGVkIGhlcmUuIEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBhbGxv
dyBkZWNsYXJhdGlvbnMgd2l0aAorICAgICAgICAgICAgLy8gZXhwbGljaXRseSBpbmhlcml0ZWQg
cHJvcGVydGllcyB0byBiZSBjYWNoZWQuCisgICAgICAgICAgICBBU1NFUlQoIWN1cnJlbnQudmFs
dWUoKS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICB9CisgICAgICAgIENTU1Byb3BlcnR5SUQgcHJvcGVydHkgPSBjdXJyZW50LmlkKCk7CisKKyAg
ICAgICAgaWYgKHByb3BlcnR5V2hpdGVsaXN0VHlwZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lv
biAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkocHJvcGVydHkp
KQorICAgICAgICAgICAgY29udGludWU7CisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgICAg
ICBpZiAocHJvcGVydHlXaGl0ZWxpc3RUeXBlID09IFByb3BlcnR5V2hpdGVsaXN0Q3VlICYmICFT
dHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShwcm9wZXJ0eSkpCisgICAgICAg
ICAgICBjb250aW51ZTsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKHBhc3MpIHsKKyNpZiBFTkFC
TEUoQ1NTX1ZBUklBQkxFUykKKyAgICAgICAgY2FzZSBWYXJpYWJsZURlZmluaXRpb25zOgorICAg
ICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlWYXJpYWJsZSA8IGZpcnN0Q1NTUHJv
cGVydHksIENTU192YXJpYWJsZV9pc19iZWZvcmVfZmlyc3RfcHJvcGVydHkpOworICAgICAgICAg
ICAgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAgICAg
YXBwbHlQcm9wZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAg
ICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIEhpZ2hQcmlvcml0eVByb3BlcnRpZXM6Cisg
ICAgICAgICAgICBDT01QSUxFX0FTU0VSVChmaXJzdENTU1Byb3BlcnR5ID09IENTU1Byb3BlcnR5
Q29sb3IsIENTU19jb2xvcl9pc19maXJzdF9wcm9wZXJ0eSk7CisgICAgICAgICAgICBDT01QSUxF
X0FTU0VSVChDU1NQcm9wZXJ0eVpvb20gPT0gQ1NTUHJvcGVydHlDb2xvciArIDE3LCBDU1Nfem9v
bV9pc19lbmRfb2ZfZmlyc3RfcHJvcF9yYW5nZSk7CisgICAgICAgICAgICBDT01QSUxFX0FTU0VS
VChDU1NQcm9wZXJ0eUxpbmVIZWlnaHQgPT0gQ1NTUHJvcGVydHlab29tICsgMSwgQ1NTX2xpbmVf
aGVpZ2h0X2lzX2FmdGVyX3pvb20pOworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgICAg
ICAgICAgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5VmFyaWFibGUpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGdpdmUgc3BlY2lhbCBwcmlvcml0
eSB0byBmb250LXh4eCwgY29sb3IgcHJvcGVydGllcywgZXRjCisgICAgICAgICAgICBpZiAocHJv
cGVydHkgPCBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9w
ZXJ0eShjdXJyZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICAvLyB3ZSBh
cHBseSBsaW5lLWhlaWdodCBsYXRlcgorICAgICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkgPT0g
Q1NTUHJvcGVydHlMaW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc2V0TGluZUhl
aWdodFZhbHVlKGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBMb3dQcmlvcml0eVByb3BlcnRpZXM6CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPiBD
U1NQcm9wZXJ0eUxpbmVIZWlnaHQpCisgICAgICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShjdXJy
ZW50LmlkKCksIGN1cnJlbnQudmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRQcm9jZXNzUnVsZShjb29raWUpOworfQorCit0ZW1wbGF0
ZSA8U3R5bGVSZXNvbHZlcjo6U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KK3ZvaWQgU3R5bGVS
ZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hS
ZXN1bHQsIGJvb2wgaXNJbXBvcnRhbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJv
b2wgaW5oZXJpdGVkT25seSkKK3sKKyAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAoc3RhdGUuc3R5
bGUoKS0+aW5zaWRlTGluaygpICE9IE5vdEluc2lkZUxpbmspIHsKKyAgICAgICAgZm9yIChpbnQg
aSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7ICsraSkgeworICAgICAgICAgICAgY29uc3Qg
TWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXNbaV07CisgICAgICAgICAgICB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlID0gbWF0
Y2hlZFByb3BlcnRpZXMubGlua01hdGNoVHlwZTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBJdCB3
b3VsZCBiZSBuaWNlciB0byBwYXNzIHRoZXNlIGFzIGFyZ3VtZW50cyBidXQgdGhhdCByZXF1aXJl
cyBjaGFuZ2VzIGluIG1hbnkgcGxhY2VzLgorICAgICAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNo
TGluayk7CisgICAgICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0
eWxlKGxpbmtNYXRjaFR5cGUgJiBTZWxlY3RvckNoZWNrZXI6Ok1hdGNoVmlzaXRlZCk7CisKKyAg
ICAgICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPihtYXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0
aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVsZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhl
cml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdoaXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9w
ZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS5zZXRBcHBs
eVByb3BlcnR5VG9SZWd1bGFyU3R5bGUodHJ1ZSk7CisgICAgICAgIHN0YXRlLnNldEFwcGx5UHJv
cGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyArK2kpIHsKKyAgICAg
ICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmIG1hdGNoZWRQcm9wZXJ0aWVzID0gbWF0Y2hSZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXNbaV07CisgICAgICAgIGFwcGx5UHJvcGVydGllczxwYXNzPiht
YXRjaGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmdldCgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUnVs
ZXNbaV0sIGlzSW1wb3J0YW50LCBpbmhlcml0ZWRPbmx5LCBzdGF0aWNfY2FzdDxQcm9wZXJ0eVdo
aXRlbGlzdFR5cGU+KG1hdGNoZWRQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUpKTsKKyAgICB9Cit9
CisKK3Vuc2lnbmVkIFN0eWxlUmVzb2x2ZXI6OmNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2go
Y29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqIHByb3BlcnRpZXMsIHVuc2lnbmVkIHNpemUpCit7Cisg
ICAgCisgICAgcmV0dXJuIFN0cmluZ0hhc2hlcjo6aGFzaE1lbW9yeShwcm9wZXJ0aWVzLCBzaXpl
b2YoTWF0Y2hlZFByb3BlcnRpZXMpICogc2l6ZSk7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25z
dCBTdHlsZVJlc29sdmVyOjpNYXRjaFJhbmdlcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0
Y2hSYW5nZXMmIGIpCit7CisgICAgcmV0dXJuIGEuZmlyc3RVQVJ1bGUgPT0gYi5maXJzdFVBUnVs
ZQorICAgICAgICAmJiBhLmxhc3RVQVJ1bGUgPT0gYi5sYXN0VUFSdWxlCisgICAgICAgICYmIGEu
Zmlyc3RBdXRob3JSdWxlID09IGIuZmlyc3RBdXRob3JSdWxlCisgICAgICAgICYmIGEubGFzdEF1
dGhvclJ1bGUgPT0gYi5sYXN0QXV0aG9yUnVsZQorICAgICAgICAmJiBhLmZpcnN0VXNlclJ1bGUg
PT0gYi5maXJzdFVzZXJSdWxlCisgICAgICAgICYmIGEubGFzdFVzZXJSdWxlID09IGIubGFzdFVz
ZXJSdWxlOworfQorCitib29sIG9wZXJhdG9yIT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hS
YW5nZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQoreworICAgIHJl
dHVybiAhKGEgPT0gYik7Cit9CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBTdHlsZVJlc29sdmVy
OjpNYXRjaGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3Bl
cnRpZXMmIGIpCit7CisgICAgcmV0dXJuIGEucHJvcGVydGllcyA9PSBiLnByb3BlcnRpZXMgJiYg
YS5saW5rTWF0Y2hUeXBlID09IGIubGlua01hdGNoVHlwZTsKK30KKworYm9vbCBvcGVyYXRvciE9
KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBhLCBjb25zdCBTdHlsZVJl
c29sdmVyOjpNYXRjaGVkUHJvcGVydGllcyYgYikKK3sKKyAgICByZXR1cm4gIShhID09IGIpOwor
fQorCitjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSogU3R5
bGVSZXNvbHZlcjo6ZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVuc2lnbmVkIGhhc2gs
IGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCkKK3sKKyAgICBBU1NFUlQoaGFzaCk7CisK
KyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRvciBpdCA9IG1fbWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZS5maW5kKGhhc2gpOworICAgIGlmIChpdCA9PSBtX21hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGUuZW5kKCkpCisgICAgICAgIHJldHVybiAwOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGVJdGVtJiBjYWNoZUl0ZW0gPSBpdC0+dmFsdWU7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1hdGNo
UmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBpZiAoc2l6ZSAhPSBjYWNoZUl0
ZW0ubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBpZiAobWF0Y2hSZXN1bHQu
bWF0Y2hlZFByb3BlcnRpZXNbaV0gIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzW2ldKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjYWNoZUl0ZW0ucmFuZ2VzICE9
IG1hdGNoUmVzdWx0LnJhbmdlcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuICZjYWNo
ZUl0ZW07Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVG9NYXRjaGVkUHJvcGVydGllc0Nh
Y2hlKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0
eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQpCit7Cisg
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlQWRkaXRpb25z
QmV0d2VlblN3ZWVwcyA9IDEwMDsKKyAgICBpZiAoKyttX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVB
ZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCA+PSBtYXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9u
c0JldHdlZW5Td2VlcHMKKyAgICAgICAgJiYgIW1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVw
VGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF0Y2hl
ZERlY2xhcmF0aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMgPSA2MDsKKyAgICAgICAgbV9tYXRj
aGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lci5zdGFydE9uZVNob3QobWF0Y2hlZERlY2xhcmF0
aW9uQ2FjaGVTd2VlcFRpbWVJblNlY29uZHMpOworICAgIH0KKworICAgIEFTU0VSVChoYXNoKTsK
KyAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSBjYWNoZUl0ZW07CisgICAgY2FjaGVJdGVt
Lm1hdGNoZWRQcm9wZXJ0aWVzLmFwcGVuZChtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcyk7
CisgICAgY2FjaGVJdGVtLnJhbmdlcyA9IG1hdGNoUmVzdWx0LnJhbmdlczsKKyAgICAvLyBOb3Rl
IHRoYXQgd2UgZG9uJ3QgY2FjaGUgdGhlIG9yaWdpbmFsIFJlbmRlclN0eWxlIGluc3RhbmNlLiBJ
dCBtYXkgYmUgZnVydGhlciBtb2RpZmllZC4KKyAgICAvLyBUaGUgUmVuZGVyU3R5bGUgaW4gdGhl
IGNhY2hlIGlzIHJlYWxseSBqdXN0IGEgaG9sZGVyIGZvciB0aGUgc3Vic3RydWN0dXJlcyBhbmQg
bmV2ZXIgdXNlZCBhcy1pcy4KKyAgICBjYWNoZUl0ZW0ucmVuZGVyU3R5bGUgPSBSZW5kZXJTdHls
ZTo6Y2xvbmUoc3R5bGUpOworICAgIGNhY2hlSXRlbS5wYXJlbnRSZW5kZXJTdHlsZSA9IFJlbmRl
clN0eWxlOjpjbG9uZShwYXJlbnRTdHlsZSk7CisgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hl
LmFkZChoYXNoLCBjYWNoZUl0ZW0pOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmludmFsaWRh
dGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCkKK3sKKyAgICBtX21hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGUuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgaXNDYWNoZWFibGVJbk1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUoY29uc3QgRWxlbWVudCogZWxlbWVudCwgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxl
LCBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgLy8gRklYTUU6IENTU1By
b3BlcnR5V2Via2l0V3JpdGluZ01vZGUgbW9kaWZpZXMgc3RhdGUgd2hlbiBhcHBseWluZyB0byBk
b2N1bWVudCBlbGVtZW50LiBXZSBjYW4ndCBza2lwIHRoZSBhcHBseWluZyBieSBjYWNoaW5nLgor
ICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgp
ICYmIGVsZW1lbnQtPmRvY3VtZW50KCktPndyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+dW5pcXVlKCkgfHwgKHN0
eWxlLT5zdHlsZVR5cGUoKSAhPSBOT1BTRVVETyAmJiBwYXJlbnRTdHlsZS0+dW5pcXVlKCkpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHN0eWxlLT5oYXNBcHBlYXJhbmNlKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3R5bGUtPnpvb20oKSAhPSBSZW5kZXJTdHls
ZTo6aW5pdGlhbFpvb20oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzdHlsZS0+
d3JpdGluZ01vZGUoKSAhPSBSZW5kZXJTdHlsZTo6aW5pdGlhbFdyaXRpbmdNb2RlKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBUaGUgY2FjaGUgYXNzdW1lcyBzdGF0aWMga25vd2xl
ZGdlIGFib3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZC4KKyAgICBpZiAocGFyZW50
U3R5bGUtPmhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjphcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3Qg
RWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgU3RhdGUmIHN0
YXRlID0gbV9zdGF0ZTsKKyAgICB1bnNpZ25lZCBjYWNoZUhhc2ggPSBtYXRjaFJlc3VsdC5pc0Nh
Y2hlYWJsZSA/IGNvbXB1dGVNYXRjaGVkUHJvcGVydGllc0hhc2gobWF0Y2hSZXN1bHQubWF0Y2hl
ZFByb3BlcnRpZXMuZGF0YSgpLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkp
IDogMDsKKyAgICBib29sIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOworICAgIGNvbnN0IE1h
dGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtKiBjYWNoZUl0ZW0gPSAwOworICAgIGlmIChjYWNoZUhh
c2ggJiYgKGNhY2hlSXRlbSA9IGZpbmRGcm9tTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjYWNoZUhh
c2gsIG1hdGNoUmVzdWx0KSkpIHsKKyAgICAgICAgLy8gV2UgY2FuIGJ1aWxkIHVwIHRoZSBzdHls
ZSBieSBjb3B5aW5nIG5vbi1pbmhlcml0ZWQgcHJvcGVydGllcyBmcm9tIGFuIGVhcmxpZXIgc3R5
bGUgb2JqZWN0IGJ1aWx0IHVzaW5nIHRoZSBzYW1lIGV4YWN0CisgICAgICAgIC8vIHN0eWxlIGRl
Y2xhcmF0aW9ucy4gV2UgdGhlbiBvbmx5IG5lZWQgdG8gYXBwbHkgdGhlIGluaGVyaXRlZCBwcm9w
ZXJ0aWVzLCBpZiBhbnksIGFzIHRoZWlyIHZhbHVlcyBjYW4gZGVwZW5kIG9uIHRoZSAKKyAgICAg
ICAgLy8gZWxlbWVudCBjb250ZXh0LiBUaGlzIGlzIGZhc3QgYW5kIHNhdmVzIG1lbW9yeSBieSBy
ZXVzaW5nIHRoZSBzdHlsZSBkYXRhIHN0cnVjdHVyZXMuCisgICAgICAgIHN0YXRlLnN0eWxlKCkt
PmNvcHlOb25Jbmhlcml0ZWRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworICAg
ICAgICBpZiAoc3RhdGUucGFyZW50U3R5bGUoKS0+aW5oZXJpdGVkRGF0YVNoYXJlZChjYWNoZUl0
ZW0tPnBhcmVudFJlbmRlclN0eWxlLmdldCgpKSAmJiAhaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1l
bnQpKSB7CisgICAgICAgICAgICBFSW5zaWRlTGluayBsaW5rU3RhdHVzID0gc3RhdGUuc3R5bGUo
KS0+aW5zaWRlTGluaygpOworICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGl0ZW0gcGFyZW50
IHN0eWxlIGhhcyBpZGVudGljYWwgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQg
cGFyZW50IHN0eWxlIHRoZW4gdGhlCisgICAgICAgICAgICAvLyByZXN1bHRpbmcgc3R5bGUgd2ls
bCBiZSBpZGVudGljYWwgdG9vLiBXZSBjb3B5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcyBvdmVy
IGZyb20gdGhlIGNhY2hlIGFuZCBhcmUgZG9uZS4KKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PmluaGVyaXRGcm9tKGNhY2hlSXRlbS0+cmVuZGVyU3R5bGUuZ2V0KCkpOworCisgICAgICAgICAg
ICAvLyBVbmZvcnR1bmF0ZWx5IHRoZSBsaW5rIHN0YXR1cyBpcyB0cmVhdGVkIGxpa2UgYW4gaW5o
ZXJpdGVkIHByb3BlcnR5LiBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVzdG9yZSBpdC4KKyAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXR1cyk7CisgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gdHJ1
ZTsgCisgICAgfQorCisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgLy8gRmlyc3QgYXBw
bHkgYWxsIHZhcmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5IG1heSBiZSB1c2VkIGR1cmluZyBh
cHBsaWNhdGlvbiBvZiBsYXRlciBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRp
ZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQsIGZhbHNlLCAwLCBtYXRjaFJlc3Vs
dC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAg
IGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4obWF0Y2hSZXN1bHQs
IHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJh
bmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRj
aFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2Vy
UnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZh
cmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMu
Zmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlLCBhcHBseUluaGVyaXRl
ZE9ubHkpOworI2VuZGlmCisKKyAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgb2YgdGhlIG1hdGNoZWQg
cnVsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIG9yZGVyLiBXYWxrIHRoZSBydWxlcyBhbmQgYXBwbHkK
KyAgICAvLyBoaWdoLXByaW9yaXR5IHByb3BlcnRpZXMgZmlyc3QsIGkuZS4sIHRob3NlIHByb3Bl
cnRpZXMgdGhhdCBvdGhlciBwcm9wZXJ0aWVzIGRlcGVuZCBvbi4KKyAgICAvLyBUaGUgb3JkZXIg
aXMgKDEpIGhpZ2gtcHJpb3JpdHkgbm90IGltcG9ydGFudCwgKDIpIGhpZ2gtcHJpb3JpdHkgaW1w
b3J0YW50LCAoMykgbm9ybWFsIG5vdCBpbXBvcnRhbnQKKyAgICAvLyBhbmQgKDQpIG5vcm1hbCBp
bXBvcnRhbnQuCisgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNl
LCAwLCBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxLCBhcHBseUluaGVy
aXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8SGlnaFByaW9yaXR5UHJvcGVy
dGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1
bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5
KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1h
dGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVsZSwgbWF0Y2hS
ZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0
cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5s
YXN0VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworCisgICAgaWYgKGNhY2hlSXRlbSAmJiBj
YWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gc3RhdGUuc3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpKSB7CisgICAgICAgIHN0YXRlLnNldEZvbnREaXJ0eSh0cnVlKTsKKyAg
ICAgICAgYXBwbHlJbmhlcml0ZWRPbmx5ID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgb3Vy
IGZvbnQgZ290IGRpcnRpZWQsIGdvIGFoZWFkIGFuZCB1cGRhdGUgaXQgbm93LgorICAgIHVwZGF0
ZUZvbnQoKTsKKworICAgIC8vIExpbmUtaGVpZ2h0IGlzIHNldCB3aGVuIHdlIGFyZSBzdXJlIHdl
IGRlY2lkZWQgb24gdGhlIGZvbnQtc2l6ZS4KKyAgICBpZiAoc3RhdGUubGluZUhlaWdodFZhbHVl
KCkpCisgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBzdGF0ZS5s
aW5lSGVpZ2h0VmFsdWUoKSk7CisKKyAgICAvLyBNYW55IHByb3BlcnRpZXMgZGVwZW5kIG9uIHRo
ZSBmb250LiBJZiBpdCBjaGFuZ2VzIHdlIGp1c3QgYXBwbHkgYWxsIHByb3BlcnRpZXMuCisgICAg
aWYgKGNhY2hlSXRlbSAmJiBjYWNoZUl0ZW0tPnJlbmRlclN0eWxlLT5mb250RGVzY3JpcHRpb24o
KSAhPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKSkKKyAgICAgICAgYXBwbHlJbmhl
cml0ZWRPbmx5ID0gZmFsc2U7CisKKyAgICAvLyBOb3cgZG8gdGhlIG5vcm1hbCBwcmlvcml0eSBV
QSBwcm9wZXJ0aWVzLgorICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9w
ZXJ0aWVzPihtYXRjaFJlc3VsdCwgZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Cisg
ICAgCisgICAgLy8gQ2FjaGUgb3VyIGJvcmRlciBhbmQgYmFja2dyb3VuZCBzbyB0aGF0IHdlIGNh
biBleGFtaW5lIHRoZW0gbGF0ZXIuCisgICAgc3RhdGUuY2FjaGVCb3JkZXJBbmRCYWNrZ3JvdW5k
KCk7CisgICAgCisgICAgLy8gTm93IGRvIHRoZSBhdXRob3IgYW5kIHVzZXIgbm9ybWFsIHByaW9y
aXR5IHByb3BlcnRpZXMgYW5kIGFsbCB0aGUgIWltcG9ydGFudCBwcm9wZXJ0aWVzLgorICAgIGFw
cGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwg
ZmFsc2UsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VUFSdWxlICsgMSwgbWF0Y2hSZXN1bHQubWF0
Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRy
dWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdEF1dGhvclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKKyAgICBhcHBseU1hdGNoZWRQ
cm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIHRydWUsIG1hdGNo
UmVzdWx0LnJhbmdlcy5maXJzdFVzZXJSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVzZXJS
dWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93
UHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2Vz
LmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0
ZWRPbmx5KTsKKyAgIAorICAgIC8vIFN0YXJ0IGxvYWRpbmcgcmVzb3VyY2VzIHJlZmVyZW5jZWQg
YnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ1Jlc291cmNlcygpOworICAgIAorICAgIEFT
U0VSVCghc3RhdGUuZm9udERpcnR5KCkpOworICAgIAorICAgIGlmIChjYWNoZUl0ZW0gfHwgIWNh
Y2hlSGFzaCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghaXNDYWNoZWFibGVJbk1hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGUoc3RhdGUuZWxlbWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJl
bnRTdHlsZSgpKSkKKyAgICAgICAgcmV0dXJuOworICAgIGFkZFRvTWF0Y2hlZFByb3BlcnRpZXND
YWNoZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHlsZSgpLCBjYWNoZUhhc2gsIG1hdGNo
UmVzdWx0KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVQYWdlUnVsZXMoY29uc3Qg
U3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIyKQoreworICAgIHJldHVy
biByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZp
Y2l0eSgpOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzKE1hdGNoUmVz
dWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJz
dFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7CisgICAgaWYgKCFydWxlcykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVz
OworICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFn
ZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1h
dGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzdGQ6OnN0
YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQo
KSwgY29tcGFyZVBhZ2VSdWxlcyk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0
Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMo
cmVzdWx0LCBtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0aWVzKCkpOworfQorCitzdGF0aWMg
Ym9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29uc3QgQ1NTU2VsZWN0b3IqIHNlbGVj
dG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFn
ZU5hbWUpCit7CisgICAgZm9yIChjb25zdCBDU1NTZWxlY3RvciogY29tcG9uZW50ID0gc2VsZWN0
b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50LT50YWdIaXN0b3J5KCkpIHsKKyAg
ICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NTZWxlY3Rvcjo6VGFnKSB7CisgICAg
ICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFtZSA9IGNvbXBvbmVudC0+dGFnUU5h
bWUoKS5sb2NhbE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gc3RhckF0b20g
JiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorCisgICAgICAgIENTU1NlbGVjdG9yOjpQc2V1ZG9UeXBlIHBzZXVkb1R5cGUg
PSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsKKyAgICAgICAgaWYgKChwc2V1ZG9UeXBlID09IENT
U1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0UGFnZSkKKyAgICAgICAgICAgIHx8
IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9SaWdodFBhZ2UgJiYgaXNMZWZ0UGFn
ZSkKKyAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9GaXJz
dFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0eWxl
UmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBt
YXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIHJ1bGVzLCBib29sIGlz
TGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCit7Cisg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNpemUoKTsgKytpKSB7CisgICAgICAg
IFN0eWxlUnVsZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKKworICAgICAgICBpZiAoIWNoZWNrUGFn
ZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3RvcigpLCBpc0xlZnRQYWdlLCBpc0ZpcnN0
UGFnZSwgcGFnZU5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYg
dGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHksIHRoZW4gaWdub3JlIGl0LgorICAg
ICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+cHJvcGVydGll
cygpOworICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJvcGVydGllcy0+aXNFbXB0eSgpKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIg
bGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUp
OworICAgIH0KK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjppc0xlZnRQYWdlKGludCBwYWdlSW5k
ZXgpIGNvbnN0Cit7CisgICAgYm9vbCBpc0ZpcnN0UGFnZUxlZnQgPSBmYWxzZTsKKyAgICBpZiAo
IW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisg
ICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7CisKKyAgICByZXR1cm4gKHBhZ2VJbmRleCAr
IChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKK30KKworYm9vbCBTdHlsZVJlc29sdmVy
Ojppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJbiBj
YXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXggMSAobm90IDApIGNh
biBiZSB0aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4gKCFwYWdlSW5kZXgpOworfQorCitTdHJp
bmcgU3R5bGVSZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBhZ2VJbmRleCAqLykgY29uc3QKK3sK
KyAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXggdG8gcGFnZSBuYW1lIG1hcHBpbmcu
CisgICAgcmV0dXJuICIiOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVydHlU
b1N0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2YWx1ZSwgUmVuZGVyU3R5bGUqIHN0
eWxlKQoreworICAgIGluaXRFbGVtZW50KDApOworICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVz
b2x2ZShkb2N1bWVudCgpLCAwLCBzdHlsZSk7CisgICAgbV9zdGF0ZS5zZXRTdHlsZShzdHlsZSk7
CisgICAgYXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKGlkLCB2YWx1ZSk7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKENTU1Byb3BlcnR5SUQg
aWQsIENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUpCisgICAgICAgIGFwcGx5UHJv
cGVydHkoaWQsIHZhbHVlKTsKK30KKworaW5saW5lIGJvb2wgaXNWYWxpZFZpc2l0ZWRMaW5rUHJv
cGVydHkoQ1NTUHJvcGVydHlJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVm
dENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdodENvbG9yOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90
dG9tQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlPdXRsaW5lQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xv
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzQ29sb3I6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRleHRTdHJva2VDb2xvcjoKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGNhc2UgQ1NTUHJvcGVy
dHlGaWxsOgorICAgIGNhc2UgQ1NTUHJvcGVydHlTdHJva2U6CisjZW5kaWYKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0
dXJuIGZhbHNlOworfQorCisvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MzLXJlZ2lvbnMv
I3RoZS1hdC1yZWdpb24tc3R5bGUtcnVsZQorLy8gRklYTUU6IGFkZCBpbmNyZW1lbnRhbCBzdXBw
b3J0IGZvciBvdGhlciByZWdpb24gc3R5bGluZyBwcm9wZXJ0aWVzLgoraW5saW5lIGJvb2wgU3R5
bGVSZXNvbHZlcjo6aXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCkK
K3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xv
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29sb3I6CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30K
KworI2lmIEVOQUJMRShWSURFT19UUkFDSykKK2lubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6Omlz
VmFsaWRDdWVTdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCit7CisgICAgc3dpdGNoIChp
ZCkgeworICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZENs
aXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZEltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kT3Jp
Z2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb246CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRQb3NpdGlvblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlCYWNrZ3JvdW5kUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFNpemU6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250Ogor
ICAgIGNhc2UgQ1NTUHJvcGVydHlGb250RmFtaWx5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlGb250
U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlGb250VmFyaWFudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFdlaWdodDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5TGluZUhlaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5T3BhY2l0eToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNv
bG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPdXRsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aDoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2hpdGVT
cGFjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVRleHRTaGFkb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclN0eWxlOgorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisvLyBTVkcgaGFuZGxlcyB6b29taW5nIGluIGEg
ZGlmZmVyZW50IHdheSBjb21wYXJlZCB0byBDU1MuIFRoZSB3aG9sZSBkb2N1bWVudCBpcyBzY2Fs
ZWQgaW5zdGVhZAorLy8gb2YgZWFjaCBpbmRpdmlkdWFsIGxlbmd0aCB2YWx1ZSBpbiB0aGUgcmVu
ZGVyIHN0eWxlIC8gdHJlZS4gQ1NTUHJpbWl0aXZlVmFsdWU6OmNvbXB1dGVMZW5ndGgqKCkKKy8v
IG11bHRpcGxpZXMgZWFjaCByZXNvbHZlZCBsZW5ndGggd2l0aCB0aGUgem9vbSBtdWx0aXBsaWVy
IC0gc28gZm9yIFNWRyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhhdC4KKy8vIFRob3VnaCBhbGwgQ1NT
IHZhbHVlcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG91dGVybW9zdCA8c3ZnPiBlbGVtZW50cyAo
d2lkdGgvaGVpZ2h0L2JvcmRlci9wYWRkaW5nLi4uKQorLy8gbmVlZCB0byByZXNwZWN0IHRoZSBz
Y2FsaW5nLiBSZW5kZXJCb3ggKHRoZSBwYXJlbnQgY2xhc3Mgb2YgUmVuZGVyU1ZHUm9vdCkgZ3Jh
YnMgdmFsdWVzIGxpa2UKKy8vIHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGluZy8uLi4gZnJvbSB0
aGUgUmVuZGVyU3R5bGUgLT4gZm9yIFNWRyB0aGVzZSB2YWx1ZXMgd291bGQgbmV2ZXIgc2NhbGUs
CisvLyBpZiB3ZSdkIHBhc3MgYSAxLjAgem9vbSBmYWN0b3IgZXZlcnlod2VyZS4gU28gd2Ugb25s
eSBwYXNzIGEgem9vbSBmYWN0b3Igb2YgMS4wIGZvciBzcGVjaWZpYworLy8gcHJvcGVydGllcyB0
aGF0IGFyZSBOT1QgYWxsb3dlZCB0byBzY2FsZSB3aXRoaW4gYSB6b29tZWQgU1ZHIGRvY3VtZW50
IChsZXR0ZXIvd29yZC1zcGFjaW5nL2ZvbnQtc2l6ZSkuCitib29sIFN0eWxlUmVzb2x2ZXI6OnVz
ZVNWR1pvb21SdWxlcygpCit7CisgICAgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpICYmIG1fc3Rh
dGUuZWxlbWVudCgpLT5pc1NWR0VsZW1lbnQoKTsKK30KKworc3RhdGljIGJvb2wgY3JlYXRlR3Jp
ZFRyYWNrQnJlYWR0aChDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUsIGNvbnN0IFN0
eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgTGVuZ3RoJiB3b3JraW5nTGVuZ3RoKQoreworICAg
IGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1pbkNvbnRl
bnQpIHsKKyAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNaW5Db250ZW50KTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpID09IENTU1ZhbHVlV2Via2l0TWF4Q29udGVudCkgeworICAgICAgICB3b3JraW5nTGVuZ3Ro
ID0gTGVuZ3RoKE1heENvbnRlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICB3b3JraW5nTGVuZ3RoID0gcHJpbWl0aXZlVmFsdWUtPmNvbnZlcnRUb0xlbmd0aDxGaXhlZElu
dGVnZXJDb252ZXJzaW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VD
b252ZXJzaW9uIHwgQXV0b0NvbnZlcnNpb24+KHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVt
ZW50U3R5bGUoKSwgc3RhdGUuc3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICBpZiAod29y
a2luZ0xlbmd0aC5pc1VuZGVmaW5lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
ZiAocHJpbWl0aXZlVmFsdWUtPmlzTGVuZ3RoKCkpCisgICAgICAgIHdvcmtpbmdMZW5ndGguc2V0
UXVpcmsocHJpbWl0aXZlVmFsdWUtPmlzUXVpcmtWYWx1ZSgpKTsKKworICAgIHJldHVybiB0cnVl
OworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tNaW5NYXgoQ1NTUHJpbWl0aXZlVmFs
dWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUsIEdy
aWRUcmFja1NpemUmIHRyYWNrU2l6ZSkKK3sKKyAgICBQYWlyKiBtaW5NYXhUcmFja0JyZWFkdGgg
PSBwcmltaXRpdmVWYWx1ZS0+Z2V0UGFpclZhbHVlKCk7CisgICAgaWYgKCFtaW5NYXhUcmFja0Jy
ZWFkdGgpIHsKKyAgICAgICAgTGVuZ3RoIHdvcmtpbmdMZW5ndGg7CisgICAgICAgIGlmICghY3Jl
YXRlR3JpZFRyYWNrQnJlYWR0aChwcmltaXRpdmVWYWx1ZSwgc3RhdGUsIHdvcmtpbmdMZW5ndGgp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHRyYWNrU2l6ZS5zZXRMZW5n
dGgod29ya2luZ0xlbmd0aCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIExl
bmd0aCBtaW5UcmFja0JyZWFkdGg7CisgICAgTGVuZ3RoIG1heFRyYWNrQnJlYWR0aDsKKyAgICBp
ZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5maXJzdCgpLCBz
dGF0ZSwgbWluVHJhY2tCcmVhZHRoKSB8fCAhY3JlYXRlR3JpZFRyYWNrQnJlYWR0aChtaW5NYXhU
cmFja0JyZWFkdGgtPnNlY29uZCgpLCBzdGF0ZSwgbWF4VHJhY2tCcmVhZHRoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgdHJhY2tTaXplLnNldE1pbk1heChtaW5UcmFja0JyZWFkdGgs
IG1heFRyYWNrQnJlYWR0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGNy
ZWF0ZUdyaWRUcmFja0dyb3VwKENTU1ZhbHVlKiB2YWx1ZSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6
U3RhdGUmIHN0YXRlLCBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4mIHRyYWNrU2l6ZXMpCit7CisgICAg
aWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Zm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFu
Y2UoKSkgeworICAgICAgICBDU1NWYWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOworICAgICAg
ICBpZiAoIWN1cnJWYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgICAgIEdyaWRUcmFja1NpemUgdHJhY2tTaXplOworICAgICAgICBpZiAo
IWNyZWF0ZUdyaWRUcmFja01pbk1heChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGN1
cnJWYWx1ZSksIHN0YXRlLCB0cmFja1NpemUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgIHRyYWNrU2l6ZXMuYXBwZW5kKHRyYWNrU2l6ZSk7CisgICAgfQorICAgIHJldHVy
biB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tMaXN0KENTU1ZhbHVlKiB2
YWx1ZSwgVmVjdG9yPEdyaWRUcmFja1NpemU+JiB0cmFja1NpemVzLCBjb25zdCBTdHlsZVJlc29s
dmVyOjpTdGF0ZSYgc3RhdGUpCit7CisgICAgLy8gSGFuZGxlICdub25lJy4KKyAgICBpZiAodmFs
dWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJp
bWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAg
ICAgICAgcmV0dXJuIHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZTsK
KyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlR3JpZFRyYWNrR3JvdXAodmFsdWUsIHN0YXRlLCB0
cmFja1NpemVzKTsKK30KKworCitzdGF0aWMgYm9vbCBjcmVhdGVHcmlkUG9zaXRpb24oQ1NTVmFs
dWUqIHZhbHVlLCBHcmlkUG9zaXRpb24mIHBvc2l0aW9uKQoreworICAgIC8vIEZvciBub3csIHdl
IG9ubHkgYWNjZXB0OiA8aW50ZWdlcj4gfCAnYXV0bycKKyAgICBpZiAoIXZhbHVlLT5pc1ByaW1p
dGl2ZVZhbHVlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENTU1ByaW1pdGl2ZVZh
bHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFs
dWUpOworICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8p
CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElD
QVRJT04ocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpOworICAgIHBvc2l0aW9uLnNldEludGVn
ZXJQb3NpdGlvbihwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKK3N0YXRpYyBib29sIGhhc1Zhcmlh
YmxlUmVmZXJlbmNlKENTU1ZhbHVlKiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzUHJpbWl0
aXZlVmFsdWUoKSkgeworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgcmV0dXJu
IHByaW1pdGl2ZVZhbHVlLT5oYXNWYXJpYWJsZVJlZmVyZW5jZSgpOworICAgIH0KKworICAgIGlm
ICh2YWx1ZS0+aXNDYWxjdWxhdGlvblZhbHVlKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxDU1NDYWxjVmFsdWUqPih2YWx1ZSktPmhhc1ZhcmlhYmxlUmVmZXJlbmNlKCk7CisKKyAgICBp
ZiAodmFsdWUtPmlzUmVmbGVjdFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTUmVmbGVjdFZhbHVlKiBy
ZWZsZWN0VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NSZWZsZWN0VmFsdWUqPih2YWx1ZSk7CisgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBkaXJlY3Rpb24gPSByZWZsZWN0VmFsdWUtPmRpcmVjdGlv
bigpOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogb2Zmc2V0ID0gcmVmbGVjdFZhbHVlLT5v
ZmZzZXQoKTsKKyAgICAgICAgQ1NTVmFsdWUqIG1hc2sgPSByZWZsZWN0VmFsdWUtPm1hc2soKTsK
KyAgICAgICAgcmV0dXJuIChkaXJlY3Rpb24gJiYgaGFzVmFyaWFibGVSZWZlcmVuY2UoZGlyZWN0
aW9uKSkgfHwgKG9mZnNldCAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShvZmZzZXQpKSB8fCAobWFz
ayAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShtYXNrKSk7CisgICAgfQorCisgICAgZm9yIChDU1NW
YWx1ZUxpc3RJdGVyYXRvciBpID0gdmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewor
ICAgICAgICBpZiAoaGFzVmFyaWFibGVSZWZlcmVuY2UoaS52YWx1ZSgpKSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjpyZXNvbHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2
YWx1ZSwgVmVjdG9yPHN0ZDo6cGFpcjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhw
cmVzc2lvbnMpCit7CisgICAgc3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gZXhwcmVz
c2lvbihpZCwgdmFsdWUtPnNlcmlhbGl6ZVJlc29sdmluZ1ZhcmlhYmxlcygqbV9zdGF0ZS5zdHls
ZSgpLT52YXJpYWJsZXMoKSkpOworCisgICAgaWYgKGtub3duRXhwcmVzc2lvbnMuY29udGFpbnMo
ZXhwcmVzc2lvbikpCisgICAgICAgIHJldHVybjsgLy8gY3ljbGUgZGV0ZWN0ZWQuCisKKyAgICBr
bm93bkV4cHJlc3Npb25zLmFwcGVuZChleHByZXNzaW9uKTsKKworICAgIC8vIEZJWE1FOiBJdCB3
b3VsZCBiZSBmYXN0ZXIgbm90IHRvIHJlLXBhcnNlIGZyb20gc3RyaW5ncywgYnV0IGZvciBub3cg
Q1NTIHByb3BlcnR5IHZhbGlkYXRpb24gbGl2ZXMgaW5zaWRlIHRoZSBwYXJzZXIgc28gd2UgZG8g
aXQgdGhlcmUuCisgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHJlc3VsdFNldCA9IFN0eWxl
UHJvcGVydHlTZXQ6OmNyZWF0ZSgpOworICAgIGlmICghQ1NTUGFyc2VyOjpwYXJzZVZhbHVlKHJl
c3VsdFNldC5nZXQoKSwgaWQsIGV4cHJlc3Npb24uc2Vjb25kLCBmYWxzZSwgZG9jdW1lbnQoKSkp
CisgICAgICAgIHJldHVybjsgLy8gZXhwcmVzc2lvbiBmYWlsZWQgdG8gcGFyc2UuCisKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVzdWx0U2V0LT5wcm9wZXJ0eUNvdW50KCk7IGkrKykg
eworICAgICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVyZW5jZSBwcm9wZXJ0eSA9
IHJlc3VsdFNldC0+cHJvcGVydHlBdChpKTsKKyAgICAgICAgaWYgKHByb3BlcnR5LmlkKCkgIT0g
Q1NTUHJvcGVydHlWYXJpYWJsZSAmJiBoYXNWYXJpYWJsZVJlZmVyZW5jZShwcm9wZXJ0eS52YWx1
ZSgpKSkKKyAgICAgICAgICAgIHJlc29sdmVWYXJpYWJsZXMocHJvcGVydHkuaWQoKSwgcHJvcGVy
dHkudmFsdWUoKSwga25vd25FeHByZXNzaW9ucyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGFwcGx5UHJvcGVydHkocHJvcGVydHkuaWQoKSwgcHJvcGVydHkudmFsdWUoKSk7CisgICAgfQor
fQorI2VuZGlmCisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0
eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCit7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisg
ICAgaWYgKGlkICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uo
dmFsdWUpKSB7CisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5n
PiA+IGtub3duRXhwcmVzc2lvbnM7CisgICAgICAgIHJlc29sdmVWYXJpYWJsZXMoaWQsIHZhbHVl
LCBrbm93bkV4cHJlc3Npb25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisg
ICAgLy8gQ1NTIHZhcmlhYmxlcyBkb24ndCByZXNvbHZlIHNob3J0aGFuZHMgYXQgcGFyc2luZyB0
aW1lLCBzbyB0aGlzIHNob3VsZCBiZSAqYWZ0ZXIqIGhhbmRsaW5nIHZhcmlhYmxlcy4KKyAgICBB
U1NFUlRfV0lUSF9NRVNTQUdFKCFpc0V4cGFuZGVkU2hvcnRoYW5kKGlkKSwgIlNob3J0aGFuZCBw
cm9wZXJ0eSBpZCA9ICVkIHdhc24ndCBleHBhbmRlZCBhdCBwYXJzaW5nIHRpbWUiLCBpZCk7CisK
KyAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGJvb2wgaXNJbmhlcml0ID0gc3RhdGUu
cGFyZW50Tm9kZSgpICYmIHZhbHVlLT5pc0luaGVyaXRlZFZhbHVlKCk7CisgICAgYm9vbCBpc0lu
aXRpYWwgPSB2YWx1ZS0+aXNJbml0aWFsVmFsdWUoKSB8fCAoIXN0YXRlLnBhcmVudE5vZGUoKSAm
JiB2YWx1ZS0+aXNJbmhlcml0ZWRWYWx1ZSgpKTsKKworICAgIEFTU0VSVCghaXNJbmhlcml0IHx8
ICFpc0luaXRpYWwpOyAvLyBpc0luaGVyaXQgLT4gIWlzSW5pdGlhbCAmJiBpc0luaXRpYWwgLT4g
IWlzSW5oZXJpdAorICAgIEFTU0VSVCghaXNJbmhlcml0IHx8IChzdGF0ZS5wYXJlbnROb2RlKCkg
JiYgc3RhdGUucGFyZW50U3R5bGUoKSkpOyAvLyBpc0luaGVyaXQgLT4gKHN0YXRlLnBhcmVudE5v
ZGUoKSAmJiBzdGF0ZS5wYXJlbnRTdHlsZSgpKQorCisgICAgaWYgKCFzdGF0ZS5hcHBseVByb3Bl
cnR5VG9SZWd1bGFyU3R5bGUoKSAmJiAoIXN0YXRlLmFwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5r
U3R5bGUoKSB8fCAhaXNWYWxpZFZpc2l0ZWRMaW5rUHJvcGVydHkoaWQpKSkgeworICAgICAgICAv
LyBMaW1pdCB0aGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIG9ubHkgdGhlIG9u
ZXMgaG9ub3JlZCBieSA6dmlzaXRlZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm
IChpc0luaGVyaXQgJiYgIXN0YXRlLnBhcmVudFN0eWxlKCktPmhhc0V4cGxpY2l0bHlJbmhlcml0
ZWRQcm9wZXJ0aWVzKCkgJiYgIUNTU1Byb3BlcnR5Ojppc0luaGVyaXRlZFByb3BlcnR5KGlkKSkK
KyAgICAgICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0SGFzRXhwbGljaXRseUluaGVyaXRlZFBy
b3BlcnRpZXMoKTsKKworI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQorICAgIGlmIChpZCA9PSBD
U1NQcm9wZXJ0eVZhcmlhYmxlKSB7CisgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJ
Q0FUSU9OKHZhbHVlLT5pc1ZhcmlhYmxlVmFsdWUoKSk7CisgICAgICAgIENTU1ZhcmlhYmxlVmFs
dWUqIHZhcmlhYmxlID0gc3RhdGljX2Nhc3Q8Q1NTVmFyaWFibGVWYWx1ZSo+KHZhbHVlKTsKKyAg
ICAgICAgQVNTRVJUKCF2YXJpYWJsZS0+bmFtZSgpLmlzRW1wdHkoKSk7CisgICAgICAgIEFTU0VS
VCghdmFyaWFibGUtPnZhbHVlKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0VmFyaWFibGUodmFyaWFibGUtPm5hbWUoKSwgdmFyaWFibGUtPnZhbHVlKCkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBDaGVjayBsb29rdXAgdGFibGUgZm9y
IGltcGxlbWVudGF0aW9ucyBhbmQgdXNlIHdoZW4gYXZhaWxhYmxlLgorICAgIGNvbnN0IFByb3Bl
cnR5SGFuZGxlciYgaGFuZGxlciA9IG1fc3R5bGVCdWlsZGVyLnByb3BlcnR5SGFuZGxlcihpZCk7
CisgICAgaWYgKGhhbmRsZXIuaXNWYWxpZCgpKSB7CisgICAgICAgIGlmIChpc0luaGVyaXQpCisg
ICAgICAgICAgICBoYW5kbGVyLmFwcGx5SW5oZXJpdFZhbHVlKGlkLCB0aGlzKTsKKyAgICAgICAg
ZWxzZSBpZiAoaXNJbml0aWFsKQorICAgICAgICAgICAgaGFuZGxlci5hcHBseUluaXRpYWxWYWx1
ZShpZCwgdGhpcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhhbmRsZXIuYXBwbHlWYWx1
ZShpZCwgdGhpcywgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1NTUHJp
bWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSA/
IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWUpIDogMDsKKworICAgIGZsb2F0
IHpvb21GYWN0b3IgPSBzdGF0ZS5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisKKyAgICAvLyBX
aGF0IGZvbGxvd3MgaXMgYSBsaXN0IHRoYXQgbWFwcyB0aGUgQ1NTIHByb3BlcnRpZXMgaW50byB0
aGVpciBjb3JyZXNwb25kaW5nIGZyb250LWVuZAorICAgIC8vIFJlbmRlclN0eWxlIHZhbHVlcy4K
KyAgICBzd2l0Y2ggKGlkKSB7CisgICAgLy8gbGlzdHMKKyAgICBjYXNlIENTU1Byb3BlcnR5Q29u
dGVudDoKKyAgICAgICAgLy8gbGlzdCBvZiBzdHJpbmcsIHVyaSwgY291bnRlciwgYXR0ciwgaQor
ICAgICAgICB7CisgICAgICAgICAgICAvLyBGSVhNRTogSW4gQ1NTMywgaXQgd2lsbCBiZSBwb3Nz
aWJsZSB0byBpbmhlcml0IGNvbnRlbnQuIEluIENTUzIgaXQgaXMgbm90LiBUaGlzCisgICAgICAg
ICAgICAvLyBub3RlIGlzIGEgcmVtaW5kZXIgdGhhdCBldmVudHVhbGx5ICJpbmhlcml0IiBuZWVk
cyB0byBiZSBzdXBwb3J0ZWQuCisKKyAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jbGVhckNvbnRlbnQoKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdmFsdWUtPmlzVmFs
dWVMaXN0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBib29sIGRp
ZFNldCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0g
dmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgICAgIENTU1Zh
bHVlKiBpdGVtID0gaS52YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtLT5pc0ltYWdl
R2VuZXJhdG9yVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNHcmFk
aWVudFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRD
b250ZW50KFN0eWxlR2VuZXJhdGVkSW1hZ2U6OmNyZWF0ZShzdGF0aWNfY2FzdDxDU1NHcmFkaWVu
dFZhbHVlKj4oaXRlbSktPmdyYWRpZW50V2l0aFN0eWxlc1Jlc29sdmVkKHRoaXMpLmdldCgpKSwg
ZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUo
c3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAg
ICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NF
VCkKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPmlzSW1hZ2VTZXRWYWx1ZSgpKSB7
CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoc2V0T3JQZW5k
aW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5Q29udGVudCwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRW
YWx1ZSo+KGl0ZW0pKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1
ZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpdGVt
LT5pc0ltYWdlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRDb250ZW50KGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNvbnRlbnQsIHN0
YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPihpdGVtKSksIGRpZFNldCk7CisgICAgICAgICAgICAg
ICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaXRlbS0+aXNQcmltaXRpdmVW
YWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KGl0ZW0pOworCisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNT
dHJpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50
KGNvbnRlbnRWYWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKS5pbXBsKCksIGRpZFNldCk7CisgICAgICAg
ICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChj
b250ZW50VmFsdWUtPmlzQXR0cigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBD
YW4gYSBuYW1lc3BhY2UgYmUgc3BlY2lmaWVkIGZvciBhbiBhdHRyKGZvbyk/CisgICAgICAgICAg
ICAgICAgICAgIGlmIChzdGF0ZS5zdHlsZSgpLT5zdHlsZVR5cGUoKSA9PSBOT1BTRVVETykKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOworICAgICAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRT
dHlsZSgpLT5zZXRVbmlxdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBh
dHRyKG51bGxBdG9tLCBjb250ZW50VmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkuaW1wbCgpLCBudWxs
QXRvbSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgdmFsdWUgPSBz
dGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudCh2YWx1ZS5pc051bGwoKSA/IGVtcHR5QXRvbSA6IHZh
bHVlLmltcGwoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGZhY3QgdGhhdCB0aGUgYXR0cmli
dXRlIHZhbHVlIGFmZmVjdHMgdGhlIHN0eWxlCisgICAgICAgICAgICAgICAgICAgIG1fcnVsZVNl
dHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuYWRkKGF0dHIubG9jYWxOYW1lKCkuaW1wbCgpKTsK
KyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRWYWx1ZS0+aXNDb3VudGVyKCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgQ291bnRlciogY291bnRlclZhbHVlID0gY29udGVudFZhbHVl
LT5nZXRDb3VudGVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgRUxpc3RTdHlsZVR5cGUg
bGlzdFN0eWxlVHlwZSA9IE5vbmVMaXN0U3R5bGU7CisgICAgICAgICAgICAgICAgICAgIGludCBs
aXN0U3R5bGVJZGVudCA9IGNvdW50ZXJWYWx1ZS0+bGlzdFN0eWxlSWRlbnQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGxpc3RTdHlsZUlkZW50ICE9IENTU1ZhbHVlTm9uZSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGxpc3RTdHlsZVR5cGUgPSBzdGF0aWNfY2FzdDxFTGlzdFN0eWxlVHlw
ZT4obGlzdFN0eWxlSWRlbnQgLSBDU1NWYWx1ZURpc2MpOworICAgICAgICAgICAgICAgICAgICBP
d25QdHI8Q291bnRlckNvbnRlbnQ+IGNvdW50ZXIgPSBhZG9wdFB0cihuZXcgQ291bnRlckNvbnRl
bnQoY291bnRlclZhbHVlLT5pZGVudGlmaWVyKCksIGxpc3RTdHlsZVR5cGUsIGNvdW50ZXJWYWx1
ZS0+c2VwYXJhdG9yKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
Q29udGVudChjb3VudGVyLnJlbGVhc2UoKSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAg
ZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
ICAgICBzd2l0Y2ggKGNvbnRlbnRWYWx1ZS0+Z2V0SWRlbnQoKSkgeworICAgICAgICAgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlT3BlblF1b3RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGUuc3R5bGUoKS0+c2V0Q29udGVudChPUEVOX1FVT1RFLCBkaWRTZXQpOworICAgICAgICAgICAg
ICAgICAgICAgICAgZGlkU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ2xvc2VRdW90ZToKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoQ0xPU0VfUVVPVEUsIGRp
ZFNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVO
b09wZW5RdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENv
bnRlbnQoTk9fT1BFTl9RVU9URSwgZGlkU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRp
ZFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZU5vQ2xvc2VRdW90ZToKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoTk9fQ0xPU0VfUVVPVEUsIGRpZFNldCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBub3JtYWwgYW5kIG5vbmUgZG8gbm90IGhhdmUgYW55IGVmZmVjdC4KKyAg
ICAgICAgICAgICAgICAgICAgICAgIHsgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkaWRTZXQpCisgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+Y2xlYXJDb250ZW50KCk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5UXVvdGVzOgorICAgICAgICBp
ZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoc3Rh
dGUucGFyZW50U3R5bGUoKS0+cXVvdGVzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFF1b3RlcygwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBp
ZiAodmFsdWUtPmlzVmFsdWVMaXN0KCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlTGlzdCogbGlz
dCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHZhbHVlKTsKKyAgICAgICAgICAgIFJlZlB0
cjxRdW90ZXNEYXRhPiBxdW90ZXMgPSBRdW90ZXNEYXRhOjpjcmVhdGUoKTsKKyAgICAgICAgICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC0+bGVuZ3RoKCk7IGkgKz0gMikgeworICAgICAg
ICAgICAgICAgIENTU1ZhbHVlKiBmaXJzdCA9IGxpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2so
aSk7CisgICAgICAgICAgICAgICAgLy8gaXRlbSgpIHJldHVybnMgbnVsbCBpZiBvdXQgb2YgYm91
bmRzIHNvIHRoaXMgaXMgc2FmZS4KKyAgICAgICAgICAgICAgICBDU1NWYWx1ZSogc2Vjb25kID0g
bGlzdC0+aXRlbShpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzZWNvbmQpCisgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX1NFQ1VS
SVRZX0lNUExJQ0FUSU9OKGZpcnN0LT5pc1ByaW1pdGl2ZVZhbHVlKCkpOworICAgICAgICAgICAg
ICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHNlY29uZC0+aXNQcmltaXRpdmVW
YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RhcnRRdW90ZSA9IHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4oZmlyc3QpLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAgICAg
ICAgICAgIFN0cmluZyBlbmRRdW90ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
c2Vjb25kKS0+Z2V0U3RyaW5nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBxdW90ZXMtPmFkZFBh
aXIoc3RkOjptYWtlX3BhaXIoc3RhcnRRdW90ZSwgZW5kUXVvdGUpKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFF1b3RlcyhxdW90ZXMpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSkgeworICAg
ICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkK
KyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoUXVvdGVzRGF0YTo6Y3Jl
YXRlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5
Rm9udEZhbWlseTogeworICAgICAgICAvLyBsaXN0IG9mIHN0cmluZ3MgYW5kIGlkcworICAgICAg
ICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAgICBGb250RGVzY3JpcHRpb24gcGFyZW50Rm9u
dERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Cisg
ICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUo
KS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2Vu
ZXJpY0ZhbWlseShwYXJlbnRGb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgpKTsKKyAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRGYW1pbHkocGFyZW50Rm9udERlc2NyaXB0aW9uLmZp
cnN0RmFtaWx5KCkpOworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzU3BlY2lmaWVk
Rm9udChwYXJlbnRGb250RGVzY3JpcHRpb24uaXNTcGVjaWZpZWRGb250KCkpOworICAgICAgICAg
ICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNJbml0aWFsKSB7CisgICAgICAgICAgICBG
b250RGVzY3JpcHRpb24gaW5pdGlhbERlc2MgPSBGb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAg
ICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0ZS5zdHlsZSgpLT5mb250
RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzaXpl
IHRvIGFjY291bnQgZm9yIHRoZSBnZW5lcmljIGZhbWlseSBjaGFuZ2UgZnJvbSBtb25vc3BhY2UK
KyAgICAgICAgICAgIC8vIHRvIG5vbi1tb25vc3BhY2UuCisgICAgICAgICAgICBpZiAoZm9udERl
c2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVs
dFNpemUoKSkKKyAgICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZv
bnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3Jp
cHRpb24ua2V5d29yZFNpemUoKSAtIDEsIGZhbHNlKSk7CisgICAgICAgICAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShpbml0aWFsRGVzYy5nZW5lcmljRmFtaWx5KCkpOworICAg
ICAgICAgICAgaWYgKCFpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpLmZhbWlseUlzRW1wdHkoKSkK
KyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0RmFtaWx5KGluaXRpYWxEZXNjLmZp
cnN0RmFtaWx5KCkpOworICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlw
dGlvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZh
bHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGb250RGVz
Y3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9u
KCk7CisgICAgICAgIEZvbnRGYW1pbHkmIGZpcnN0RmFtaWx5ID0gZm9udERlc2NyaXB0aW9uLmZp
cnN0RmFtaWx5KCk7CisgICAgICAgIEZvbnRGYW1pbHkqIGN1cnJGYW1pbHkgPSAwOworCisgICAg
ICAgIC8vIEJlZm9yZSBtYXBwaW5nIGluIGEgbmV3IGZvbnQtZmFtaWx5IHByb3BlcnR5LCB3ZSBz
aG91bGQgcmVzZXQgdGhlIGdlbmVyaWMgZmFtaWx5LgorICAgICAgICBib29sIG9sZEZhbWlseVVz
ZWRGaXhlZERlZmF1bHRTaXplID0gZm9udERlc2NyaXB0aW9uLnVzZUZpeGVkRGVmYXVsdFNpemUo
KTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpOb0ZhbWlseSk7CisKKyAgICAgICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0g
dmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgeworICAgICAgICAgICAgQ1NTVmFsdWUq
IGl0ZW0gPSBpLnZhbHVlKCk7CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFs
dWUoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBjb250ZW50VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0
ZW0pOworICAgICAgICAgICAgQXRvbWljU3RyaW5nIGZhY2U7CisgICAgICAgICAgICBTZXR0aW5n
cyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICBpZiAoY29udGVu
dFZhbHVlLT5pc1N0cmluZygpKQorICAgICAgICAgICAgICAgIGZhY2UgPSBjb250ZW50VmFsdWUt
PmdldFN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncykgeworICAg
ICAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAg
ICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEJvZHk6CisgICAgICAgICAgICAgICAgICAgIGZh
Y2UgPSBzZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTZXJpZjoKKyAgICAgICAgICAg
ICAgICAgICAgZmFjZSA9IHNlcmlmRmFtaWx5OworICAgICAgICAgICAgICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlNlcmlmRmFtaWx5KTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZVNhbnNTZXJpZjoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHNhbnNTZXJpZkZhbWlseTsK
KyAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9u
dERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlQ3Vyc2l2ZToKKyAgICAgICAgICAgICAg
ICAgICAgZmFjZSA9IGN1cnNpdmVGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Q3Vyc2l2ZUZhbWlseSk7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVGYW50YXN5OgorICAgICAgICAgICAgICAgICAgICBmYWNlID0gZmFudGFzeUZhbWlseTsKKyAg
ICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERl
c2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU1vbm9zcGFjZToKKyAgICAgICAgICAgICAgICAg
ICAgZmFjZSA9IG1vbm9zcGFjZUZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkp
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENTU1Zh
bHVlV2Via2l0UGljdG9ncmFwaDoKKyAgICAgICAgICAgICAgICAgICAgZmFjZSA9IHBpY3RvZ3Jh
cGhGYW1pbHk7CisgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmlj
RmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6UGljdG9ncmFwaEZhbWlseSk7CisgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKCFmYWNlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICghY3VyckZh
bWlseSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxsaW5nIGluIHRoZSBmaXJzdCBmYW1p
bHkuCisgICAgICAgICAgICAgICAgICAgIGZpcnN0RmFtaWx5LnNldEZhbWlseShmYWNlKTsKKyAg
ICAgICAgICAgICAgICAgICAgZmlyc3RGYW1pbHkuYXBwZW5kRmFtaWx5KDApOyAvLyBSZW1vdmUg
YW55IGluaGVyaXRlZCBmYW1pbHktZmFsbGJhY2sgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAg
Y3VyckZhbWlseSA9ICZmaXJzdEZhbWlseTsKKyAgICAgICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldElzU3BlY2lmaWVkRm9udChmb250RGVzY3JpcHRpb24uZ2VuZXJpY0ZhbWlseSgp
ID09IEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgICAgIFJlZlB0cjxTaGFyZWRGb250RmFtaWx5PiBuZXdGYW1pbHkg
PSBTaGFyZWRGb250RmFtaWx5OjpjcmVhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3RmFt
aWx5LT5zZXRGYW1pbHkoZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHktPmFw
cGVuZEZhbWlseShuZXdGYW1pbHkpOworICAgICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5ID0g
bmV3RmFtaWx5LmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorCisgICAgICAgIC8vIFdlIGNhbid0IGNhbGwgdXNlRml4ZWREZWZhdWx0U2l6ZSgpIHVu
dGlsIGFsbCBuZXcgZm9udCBmYW1pbGllcyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgICAgLy8gSWYg
Y3VyckZhbWlseSBpcyBub24temVybyB0aGVuIHdlIHNldCBhdCBsZWFzdCBvbmUgZmFtaWx5IG9u
IHRoaXMgZGVzY3JpcHRpb24uCisgICAgICAgIGlmIChjdXJyRmFtaWx5KSB7CisgICAgICAgICAg
ICBpZiAoZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgJiYgZm9udERlc2NyaXB0aW9uLnVz
ZUZpeGVkRGVmYXVsdFNpemUoKSAhPSBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkKKyAg
ICAgICAgICAgICAgICBzZXRGb250U2l6ZShmb250RGVzY3JpcHRpb24sIGZvbnRTaXplRm9yS2V5
d29yZChkb2N1bWVudCgpLCBDU1NWYWx1ZVh4U21hbGwgKyBmb250RGVzY3JpcHRpb24ua2V5d29y
ZFNpemUoKSAtIDEsICFvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSkpOworCisgICAgICAg
ICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFNob3J0aGFuZCBwcm9wZXJ0aWVzLgorICAgIGNh
c2UgQ1NTUHJvcGVydHlGb250OgorICAgICAgICBpZiAoaXNJbmhlcml0KSB7CisgICAgICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUucGFyZW50U3R5bGUoKS0+
Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVp
Z2h0KHN0YXRlLnBhcmVudFN0eWxlKCktPnNwZWNpZmllZExpbmVIZWlnaHQoKSk7CisgICAgICAg
ICAgICBzdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7CisgICAgICAgICAgICBzZXRGb250RGVz
Y3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0luaXRpYWwp
IHsKKyAgICAgICAgICAgIFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50U2V0dGluZ3MoKTsK
KyAgICAgICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElmIHdlJ3JlIGRvaW5nIHN0eWxlIHJl
c29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIGZyYW1lIGFuZCB0
aHVzIGhhdmUgc2V0dGluZ3MKKyAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgaW5pdGlhbGl6ZUZvbnRTdHlsZShzZXR0aW5ncyk7
CisgICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRl
LnN0eWxlKCktPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkp
OworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOworCisgICAgICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uOworICAgICAgICAgICAgUmVuZGVyVGhl
bWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1Gb250KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgp
LCBmb250RGVzY3JpcHRpb24pOworCisgICAgICAgICAgICAvLyBEb3VibGUtY2hlY2sgYW5kIHNl
ZSBpZiB0aGUgdGhlbWUgZGlkIGFueXRoaW5nLiBJZiBub3QsIGRvbid0IGJvdGhlciB1cGRhdGlu
ZyB0aGUgZm9udC4KKyAgICAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNp
emUoKSkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVuZGVyaW5nIG1vZGUg
YW5kIHByaW50ZXIgZm9udCBzZXR0aW5ncyBhcmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAg
QVNTRVJUKHNldHRpbmdzKTsgLy8gSWYgd2UncmUgZG9pbmcgc3R5bGUgcmVzb2x1dGlvbiwgdGhp
cyBkb2N1bWVudCBzaG91bGQgYWx3YXlzIGJlIGluIGEgZnJhbWUgYW5kIHRodXMgaGF2ZSBzZXR0
aW5ncworICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9k
ZShzZXR0aW5ncy0+Zm9udFJlbmRlcmluZ01vZGUoKSk7CisgICAgICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3VtZW50KCktPnByaW50aW5nKCkgfHwgIXNl
dHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5hYmxlZCgpKTsKKworICAgICAgICAgICAg
ICAgIC8vIEhhbmRsZSB0aGUgem9vbSBmYWN0b3IuCisgICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShk
b2N1bWVudCgpLCBzdGF0ZS5zdHlsZSgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUo
KSwgZm9udERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKSwgdXNlU1ZHWm9vbVJ1bGVzKCkpKTsK
KyAgICAgICAgICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS0+aXNGb250VmFsdWUoKSkgewor
ICAgICAgICAgICAgRm9udFZhbHVlKiBmb250ID0gc3RhdGljX2Nhc3Q8Rm9udFZhbHVlKj4odmFs
dWUpOworICAgICAgICAgICAgaWYgKCFmb250LT5zdHlsZSB8fCAhZm9udC0+dmFyaWFudCB8fCAh
Zm9udC0+d2VpZ2h0CisgICAgICAgICAgICAgICAgfHwgIWZvbnQtPnNpemUgfHwgIWZvbnQtPmxp
bmVIZWlnaHQgfHwgIWZvbnQtPmZhbWlseSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFN0eWxlLCBmb250LT5zdHlsZS5n
ZXQoKSk7CisgICAgICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5Rm9udFZhcmlhbnQs
IGZvbnQtPnZhcmlhbnQuZ2V0KCkpOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9w
ZXJ0eUZvbnRXZWlnaHQsIGZvbnQtPndlaWdodC5nZXQoKSk7CisgICAgICAgICAgICAvLyBUaGUg
cHJldmlvdXMgcHJvcGVydGllcyBjYW4gZGlydHkgb3VyIGZvbnQgYnV0IHRoZXkgZG9uJ3QgdHJ5
IHRvIHJlYWQgdGhlIGZvbnQncworICAgICAgICAgICAgLy8gcHJvcGVydGllcyBiYWNrLCB3aGlj
aCBpcyBzYWZlLiBIb3dldmVyIGlmIGZvbnQtc2l6ZSBpcyB1c2luZyB0aGUgJ2V4JyB1bml0LCBp
dCB3aWxsCisgICAgICAgICAgICAvLyBuZWVkIHF1ZXJ5IHRoZSBkaXJ0aWVkIGZvbnQncyB4LWhl
aWdodCB0byBnZXQgdGhlIGNvbXB1dGVkIHNpemUuIFRvIGJlIHNhZmUgaW4gdGhpcworICAgICAg
ICAgICAgLy8gY2FzZSwgbGV0J3MganVzdCB1cGRhdGUgdGhlIGZvbnQgbm93LgorICAgICAgICAg
ICAgdXBkYXRlRm9udCgpOworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZv
bnRTaXplLCBmb250LT5zaXplLmdldCgpKTsKKworICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhl
aWdodFZhbHVlKGZvbnQtPmxpbmVIZWlnaHQuZ2V0KCkpOworCisgICAgICAgICAgICBhcHBseVBy
b3BlcnR5KENTU1Byb3BlcnR5Rm9udEZhbWlseSwgZm9udC0+ZmFtaWx5LmdldCgpKTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZDoK
KyAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFBvc2l0aW9uOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCYWNrZ3JvdW5kUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXI6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJMZWZ0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSYWRpdXM6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJT
cGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKKyAgICBjYXNlIENTU1By
b3BlcnR5Qm9yZGVyVG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJXaWR0aDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW46Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFu
c2l0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb246CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJCZWZvcmU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckVuZDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJvcmRlclJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uczoKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0RmxleDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEZsb3c6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEdyaWRSb3c6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkNvbGxhcHNlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRNYXNrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUG9zaXRpb246CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFRleHRFbXBoYXNpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNmb3JtT3JpZ2luOgorI2lmIEVOQUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcDoKKyNlbmRpZgorICAgICAgICBBU1NFUlQoaXNFeHBh
bmRlZFNob3J0aGFuZChpZCkpOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgYnJlYWs7CisKKyAgICAvLyBDU1MzIFByb3BlcnRpZXMKKyAgICBjYXNlIENTU1Byb3BlcnR5
VGV4dFNoYWRvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2hhZG93OgorICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRCb3hTaGFkb3c6IHsKKyAgICAgICAgaWYgKGlzSW5oZXJpdCkgeworICAg
ICAgICAgICAgaWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdykKKyAgICAgICAgICAgICAg
ICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhzdGF0ZS5wYXJlbnRTdHlsZSgp
LT50ZXh0U2hhZG93KCkgPyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5
bGUoKS0+dGV4dFNoYWRvdygpKSkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0
ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93KCkg
PyBhZG9wdFB0cihuZXcgU2hhZG93RGF0YSgqc3RhdGUucGFyZW50U3R5bGUoKS0+Ym94U2hhZG93
KCkpKSA6IG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luaXRpYWwgfHwgcHJp
bWl0aXZlVmFsdWUpIC8vIGluaXRpYWwgfCBub25lCisgICAgICAgICAgICByZXR1cm4gaWQgPT0g
Q1NTUHJvcGVydHlUZXh0U2hhZG93ID8gc3RhdGUuc3R5bGUoKS0+c2V0VGV4dFNoYWRvdyhudWxs
cHRyKSA6IHN0YXRlLnN0eWxlKCktPnNldEJveFNoYWRvdyhudWxscHRyKTsKKworICAgICAgICBp
ZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZh
bmNlKCkpIHsKKyAgICAgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Cisg
ICAgICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNTaGFkb3dWYWx1ZSgpKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgU2hhZG93VmFsdWUqIGl0ZW0gPSBzdGF0aWNfY2Fz
dDxTaGFkb3dWYWx1ZSo+KGN1cnJWYWx1ZSk7CisgICAgICAgICAgICBpbnQgeCA9IGl0ZW0tPngt
PmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxl
KCksIHpvb21GYWN0b3IpOworICAgICAgICAgICAgaW50IHkgPSBpdGVtLT55LT5jb21wdXRlTGVu
Z3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFj
dG9yKTsKKyAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNv
bXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCks
IHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIGludCBzcHJlYWQgPSBpdGVtLT5zcHJlYWQg
PyBpdGVtLT5zcHJlYWQtPmNvbXB1dGVMZW5ndGg8aW50PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIFNoYWRvd1N0
eWxlIHNoYWRvd1N0eWxlID0gaXRlbS0+c3R5bGUgJiYgaXRlbS0+c3R5bGUtPmdldElkZW50KCkg
PT0gQ1NTVmFsdWVJbnNldCA/IEluc2V0IDogTm9ybWFsOworICAgICAgICAgICAgQ29sb3IgY29s
b3I7CisgICAgICAgICAgICBpZiAoaXRlbS0+Y29sb3IpCisgICAgICAgICAgICAgICAgY29sb3Ig
PSBjb2xvckZyb21QcmltaXRpdmVWYWx1ZShpdGVtLT5jb2xvci5nZXQoKSk7CisgICAgICAgICAg
ICBlbHNlIGlmIChzdGF0ZS5zdHlsZSgpKQorICAgICAgICAgICAgICAgIGNvbG9yID0gc3RhdGUu
c3R5bGUoKS0+Y29sb3IoKTsKKworICAgICAgICAgICAgT3duUHRyPFNoYWRvd0RhdGE+IHNoYWRv
d0RhdGEgPSBhZG9wdFB0cihuZXcgU2hhZG93RGF0YShJbnRQb2ludCh4LCB5KSwgYmx1ciwgc3By
ZWFkLCBzaGFkb3dTdHlsZSwgaWQgPT0gQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csIGNvbG9y
LmlzVmFsaWQoKSA/IGNvbG9yIDogQ29sb3I6OnRyYW5zcGFyZW50KSk7CisgICAgICAgICAgICBp
ZiAoaWQgPT0gQ1NTUHJvcGVydHlUZXh0U2hhZG93KQorICAgICAgICAgICAgICAgIHN0YXRlLnN0
eWxlKCktPnNldFRleHRTaGFkb3coc2hhZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8v
IGFkZCB0byB0aGUgbGlzdCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRCb3hTaGFkb3coc2hh
ZG93RGF0YS5yZWxlYXNlKCksIGkuaW5kZXgoKSk7IC8vIGFkZCB0byB0aGUgbGlzdCBpZiB0aGlz
IGlzIG5vdCB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAg
fQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hSZWZsZWN0OiB7CisgICAgICAgIEhBTkRM
RV9JTkhFUklUX0FORF9JTklUSUFMKGJveFJlZmxlY3QsIEJveFJlZmxlY3QpCisgICAgICAgIGlm
IChwcmltaXRpdmVWYWx1ZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Qm94UmVm
bGVjdChSZW5kZXJTdHlsZTo6aW5pdGlhbEJveFJlZmxlY3QoKSk7CisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgpKQor
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOworICAgICAgICBSZWZQ
dHI8U3R5bGVSZWZsZWN0aW9uPiByZWZsZWN0aW9uID0gU3R5bGVSZWZsZWN0aW9uOjpjcmVhdGUo
KTsKKyAgICAgICAgcmVmbGVjdGlvbi0+c2V0RGlyZWN0aW9uKCpyZWZsZWN0VmFsdWUtPmRpcmVj
dGlvbigpKTsKKyAgICAgICAgaWYgKHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCkpCisgICAgICAgICAg
ICByZWZsZWN0aW9uLT5zZXRPZmZzZXQocmVmbGVjdFZhbHVlLT5vZmZzZXQoKS0+Y29udmVydFRv
TGVuZ3RoPEZpeGVkSW50ZWdlckNvbnZlcnNpb24gfCBQZXJjZW50Q29udmVyc2lvbiB8IENhbGN1
bGF0ZWRDb252ZXJzaW9uPihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCks
IHpvb21GYWN0b3IpKTsKKyAgICAgICAgTmluZVBpZWNlSW1hZ2UgbWFzazsKKyAgICAgICAgbWFz
ay5zZXRNYXNrRGVmYXVsdHMoKTsKKyAgICAgICAgbV9zdHlsZU1hcC5tYXBOaW5lUGllY2VJbWFn
ZShpZCwgcmVmbGVjdFZhbHVlLT5tYXNrKCksIG1hc2spOworICAgICAgICByZWZsZWN0aW9uLT5z
ZXRNYXNrKG1hc2spOworCisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QocmVm
bGVjdGlvbi5yZWxlYXNlKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgQ1NT
UHJvcGVydHlTcmM6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgorICAgICAgICBy
ZXR1cm47CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVuaWNvZGVSYW5nZTogLy8gT25seSB1c2VkIGlu
IEBmb250LWZhY2UgcnVsZXMuCisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0TWFycXVlZVJlcGV0aXRpb246IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwobWFycXVlZUxvb3BDb3VudCwgTWFycXVlZUxvb3BDb3VudCkKKyAgICAgICAgaWYgKCFw
cmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5maW5pdGUpCisgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRNYXJxdWVlTG9vcENvdW50KC0xKTsgLy8gLTEgbWVhbnMgcmVwZWF0IGZv
cmV2ZXIuCisgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BDb3VudChwcmltaXRpdmVWYWx1
ZS0+Z2V0SW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hcnF1ZWVTcGVlZDogeworICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRf
SU5JVElBTChtYXJxdWVlU3BlZWQsIE1hcnF1ZWVTcGVlZCkKKyAgICAgICAgaWYgKCFwcmltaXRp
dmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGludCBpZGVudCA9IHBy
aW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGlkZW50KSB7
CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlU2xvdzoKKyAgICAgICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRNYXJxdWVlU3BlZWQoNTAwKTsgLy8gNTAwIG1zZWMuCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZCg4NSk7IC8vIDg1bXNlYy4gVGhlIFdp
bklFIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENT
U1ZhbHVlRmFzdDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlU3Bl
ZWQoMTApOyAvLyAxMG1zZWMuIFN1cGVyIGZhc3QuCisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlVmFsdWUtPmlzVGltZSgp
KQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKHByaW1pdGl2ZVZh
bHVlLT5jb21wdXRlVGltZTxpbnQsIENTU1ByaW1pdGl2ZVZhbHVlOjpNaWxsaXNlY29uZHM+KCkp
OworICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgLy8gRm9yIHNj
cm9sbGFtb3VudCBzdXBwb3J0LgorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVl
ZVNwZWVkKHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZUluY3JlbWVudDogeworICAg
ICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChtYXJxdWVlSW5jcmVtZW50LCBNYXJxdWVl
SW5jcmVtZW50KQorICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAg
ICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgICAgIGNh
c2UgQ1NTVmFsdWVTbWFsbDoKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlSW5jcmVtZW50KExlbmd0aCgxLCBGaXhlZCkpOyAvLyAxcHguCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9ybWFsOgorICAgICAgICAgICAgICAg
IHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3RoKDYsIEZpeGVkKSk7IC8v
IDZweC4gVGhlIFdpbklFIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIENTU1ZhbHVlTGFyZ2U6CisgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMzYsIEZpeGVkKSk7IC8vIDM2cHguCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICBMZW5ndGggbWFycXVlZUxlbmd0aCA9IGNvbnZlcnRUb0ludExlbmd0aChwcmltaXRpdmVW
YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAg
ICAgIGlmICghbWFycXVlZUxlbmd0aC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHN0
YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQobWFycXVlZUxlbmd0aCk7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9j
YWxlOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxvY2FsZSwgTG9jYWxl
KTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlQXV0bykKKyAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShudWxsQXRvbSk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExvY2FsZShwcmltaXRpdmVWYWx1ZS0+
Z2V0U3RyaW5nVmFsdWUoKSk7CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRp
b24gPSBzdGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldFNjcmlwdChsb2NhbGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKHN0YXRl
LnN0eWxlKCktPmxvY2FsZSgpKSk7CisgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmIEVOQUJMRShEQVNIQk9BUkRf
U1VQUE9SVCkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RGFzaGJvYXJkUmVnaW9uOgorICAg
IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZGFzaGJvYXJkUmVnaW9ucywg
RGFzaGJvYXJkUmVnaW9ucykKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0g
Q1NTVmFsdWVOb25lKSB7CisgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREYXNoYm9hcmRS
ZWdpb25zKFJlbmRlclN0eWxlOjpub25lRGFzaGJvYXJkUmVnaW9ucygpKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiogcmVnaW9uID0g
cHJpbWl0aXZlVmFsdWUtPmdldERhc2hib2FyZFJlZ2lvblZhbHVlKCk7CisgICAgICAgIGlmICgh
cmVnaW9uKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIERhc2hib2FyZFJlZ2lvbiog
Zmlyc3QgPSByZWdpb247CisgICAgICAgIHdoaWxlIChyZWdpb24pIHsKKyAgICAgICAgICAgIExl
bmd0aCB0b3AgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT50b3AoKSwgc3RhdGUuc3R5bGUo
KSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpKTsKKyAgICAgICAgICAgIExlbmd0aCByaWdodCA9
IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPnJpZ2h0KCksIHN0YXRlLnN0eWxlKCksIHN0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggYm90dG9tID0gY29udmVy
dFRvSW50TGVuZ3RoKHJlZ2lvbi0+Ym90dG9tKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RF
bGVtZW50U3R5bGUoKSk7CisgICAgICAgICAgICBMZW5ndGggbGVmdCA9IGNvbnZlcnRUb0ludExl
bmd0aChyZWdpb24tPmxlZnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHls
ZSgpKTsKKworICAgICAgICAgICAgaWYgKHRvcC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAg
ICAgIHRvcCA9IExlbmd0aCgpOworICAgICAgICAgICAgaWYgKHJpZ2h0LmlzVW5kZWZpbmVkKCkp
CisgICAgICAgICAgICAgICAgcmlnaHQgPSBMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChib3R0
b20uaXNVbmRlZmluZWQoKSkKKyAgICAgICAgICAgICAgICBib3R0b20gPSBMZW5ndGgoKTsKKyAg
ICAgICAgICAgIGlmIChsZWZ0LmlzVW5kZWZpbmVkKCkpCisgICAgICAgICAgICAgICAgbGVmdCA9
IExlbmd0aCgpOworCisgICAgICAgICAgICBpZiAocmVnaW9uLT5tX2lzQ2lyY2xlKQorICAgICAg
ICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERhc2hib2FyZFJlZ2lvbihTdHlsZURhc2hib2Fy
ZFJlZ2lvbjo6Q2lyY2xlLCByZWdpb24tPm1fbGFiZWwsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVm
dCwgcmVnaW9uID09IGZpcnN0ID8gZmFsc2UgOiB0cnVlKTsKKyAgICAgICAgICAgIGVsc2UgaWYg
KHJlZ2lvbi0+bV9pc1JlY3RhbmdsZSkKKyAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OlJlY3RhbmdsZSwgcmVnaW9u
LT5tX2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZh
bHNlIDogdHJ1ZSk7CisgICAgICAgICAgICByZWdpb24gPSByZWdpb24tPm1fbmV4dC5nZXQoKTsK
KyAgICAgICAgfQorCisgICAgICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJl
Z2lvbnModHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJM
RShEUkFHR0FCTEVfUkVHSU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBcHBSZWdpb246
IHsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSB8fCAhcHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldERy
YWdnYWJsZVJlZ2lvbk1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVE
cmFnID8gRHJhZ2dhYmxlUmVnaW9uRHJhZyA6IERyYWdnYWJsZVJlZ2lvbk5vRHJhZyk7CisgICAg
ICAgIHN0YXRlLmRvY3VtZW50KCktPnNldEhhc0Fubm90YXRlZFJlZ2lvbnModHJ1ZSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dFN0cm9rZVdpZHRoOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRT
dHJva2VXaWR0aCwgVGV4dFN0cm9rZVdpZHRoKQorICAgICAgICBmbG9hdCB3aWR0aCA9IDA7Cisg
ICAgICAgIHN3aXRjaCAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpIHsKKyAgICAgICAgY2Fz
ZSBDU1NWYWx1ZVRoaW46CisgICAgICAgIGNhc2UgQ1NTVmFsdWVNZWRpdW06CisgICAgICAgIGNh
c2UgQ1NTVmFsdWVUaGljazogeworICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDEuMCAvIDQ4
OworICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVl
TWVkaXVtKQorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAzOworICAgICAgICAgICAgZWxzZSBp
ZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVUaGljaykKKyAgICAgICAg
ICAgICAgICByZXN1bHQgKj0gNTsKKyAgICAgICAgICAgIHdpZHRoID0gQ1NTUHJpbWl0aXZlVmFs
dWU6OmNyZWF0ZShyZXN1bHQsIENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfRU1TKS0+Y29tcHV0ZUxl
bmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29t
RmFjdG9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6
CisgICAgICAgICAgICB3aWR0aCA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VGV4dFN0cm9rZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FO
RF9JTklUSUFMKHRyYW5zZm9ybSwgVHJhbnNmb3JtKTsKKyAgICAgICAgVHJhbnNmb3JtT3BlcmF0
aW9ucyBvcGVyYXRpb25zOworICAgICAgICBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKHZhbHVl
LCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpOwor
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUcmFuc2Zvcm0ob3BlcmF0aW9ucyk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHBlcnNwZWN0aXZlLCBQZXJzcGVj
dGl2ZSkKKworICAgICAgICBpZiAoIXByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5v
bmUpIHsKKyAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFBlcnNwZWN0aXZlKDApOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgcGVyc3BlY3RpdmVW
YWx1ZTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAg
ICAgcGVyc3BlY3RpdmVWYWx1ZSA9IHByaW1pdGl2ZVZhbHVlLT5jb21wdXRlTGVuZ3RoPGZsb2F0
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOwor
ICAgICAgICBlbHNlIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAg
ICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRyZWF0IHZhbHVlbGVzcyBudW1iZXJz
IGFzIHB4LgorICAgICAgICAgICAgcGVyc3BlY3RpdmVWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVl
OjpjcmVhdGUocHJpbWl0aXZlVmFsdWUtPmdldERvdWJsZVZhbHVlKCksIENTU1ByaW1pdGl2ZVZh
bHVlOjpDU1NfUFgpLT5jb21wdXRlTGVuZ3RoPGZsb2F0PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5y
b290RWxlbWVudFN0eWxlKCksIHpvb21GYWN0b3IpOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICBpZiAocGVyc3BlY3RpdmVWYWx1ZSA+PSAwLjBmKQorICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0UGVyc3BlY3RpdmUocGVyc3BlY3RpdmVWYWx1ZSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I6IHsKKyAgICAgICAgSEFORExF
X0lOSEVSSVRfQU5EX0lOSVRJQUwodGFwSGlnaGxpZ2h0Q29sb3IsIFRhcEhpZ2hsaWdodENvbG9y
KTsKKyAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgIENvbG9yIGNvbCA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKHByaW1pdGl2ZVZhbHVl
KTsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VGFwSGlnaGxpZ2h0Q29sb3IoY29sKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVS
RkxPV19TQ1JPTExJTkcpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE92ZXJmbG93U2Nyb2xs
aW5nOiB7CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHVzZVRvdWNoT3ZlcmZs
b3dTY3JvbGxpbmcsIFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcpOworICAgICAgICBpZiAoIXBy
aW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFVzZVRvdWNoT3ZlcmZsb3dTY3JvbGxpbmcocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkg
PT0gQ1NTVmFsdWVUb3VjaCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKyAgICBj
YXNlIENTU1Byb3BlcnR5SW52YWxpZDoKKyAgICAgICAgcmV0dXJuOworICAgIC8vIERpcmVjdGlv
bmFsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVkIGJ5IHJlc29sdmVEaXJlY3Rpb25Bd2FyZVByb3Bl
cnR5KCkgYmVmb3JlIHRoZSBzd2l0Y2guCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
ckVuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyRW5kV2lkdGg6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEJvcmRlclN0YXJ0Q29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclN0YXJ0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclN0YXJ0V2lk
dGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZUNvbG9yOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJCZWZvcmVTdHlsZToKKyAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyQmVmb3JlV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckFmdGVyQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyU3R5
bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckFmdGVyV2lkdGg6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkVuZDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFyZ2luU3RhcnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkJlZm9yZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hcmdpbkJlZm9yZUNvbGxhcHNlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRN
YXJnaW5Ub3BDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQWZ0ZXJD
b2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luQm90dG9tQ29sbGFwc2U6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdFbmQ6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFBhZGRpbmdTdGFydDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGlu
Z0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGFkZGluZ0FmdGVyOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdExvZ2ljYWxIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1pbkxvZ2ljYWxX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWluTG9naWNhbEhlaWdodDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbFdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlXZWJraXRNYXhMb2dpY2FsSGVpZ2h0OgorICAgIHsKKyAgICAgICAgQ1NTUHJvcGVydHlJRCBu
ZXdJZCA9IENTU1Byb3BlcnR5OjpyZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eShpZCwgc3Rh
dGUuc3R5bGUoKS0+ZGlyZWN0aW9uKCksIHN0YXRlLnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwor
ICAgICAgICBBU1NFUlQobmV3SWQgIT0gaWQpOworICAgICAgICByZXR1cm4gYXBwbHlQcm9wZXJ0
eShuZXdJZCwgdmFsdWUpOworICAgIH0KKyAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFN0cmV0Y2g6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5l
VGhyb3VnaDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRMaW5lVGhyb3VnaE1vZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHRMaW5lVGhyb3VnaFN0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91
Z2hXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlUZXh0T3ZlcmxpbmVDb2xvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJs
aW5lTW9kZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0
VW5kZXJsaW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lQ29sb3I6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlU
ZXh0VW5kZXJsaW5lU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRVbmRlcmxpbmVXaWR0
aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udFNpemVEZWx0YToKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25zSW5FZmZlY3Q6CisgICAgICAgIHJldHVybjsK
KworICAgIC8vIENTUyBUZXh0IExheW91dCBNb2R1bGUgTGV2ZWwgMzogVmVydGljYWwgd3JpdGlu
ZyBzdXBwb3J0CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdNb2RlOiB7CisgICAg
ICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHdyaXRpbmdNb2RlLCBXcml0aW5nTW9kZSk7
CisgICAgICAgIAorICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAgICBzZXRX
cml0aW5nTW9kZSgqcHJpbWl0aXZlVmFsdWUpOworCisgICAgICAgIC8vIEZJWE1FOiBJdCBpcyBu
b3Qgb2sgdG8gbW9kaWZ5IGRvY3VtZW50IHN0YXRlIHdoaWxlIGFwcGx5aW5nIHN0eWxlLgorICAg
ICAgICBpZiAoc3RhdGUuZWxlbWVudCgpICYmIHN0YXRlLmVsZW1lbnQoKSA9PSBzdGF0ZS5kb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSkKKyAgICAgICAgICAgIHN0YXRlLmRvY3VtZW50KCkt
PnNldFdyaXRpbmdNb2RlU2V0T25Eb2N1bWVudEVsZW1lbnQodHJ1ZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dE9yaWVudGF0aW9uOiB7
CisgICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRleHRPcmllbnRhdGlvbiwgVGV4
dE9yaWVudGF0aW9uKTsKKworICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpCisgICAgICAgICAg
ICBzZXRUZXh0T3JpZW50YXRpb24oKnByaW1pdGl2ZVZhbHVlKTsKKworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVCb3hDb250YWluOiB7Cisg
ICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKGxpbmVCb3hDb250YWluLCBMaW5lQm94
Q29udGFpbikKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlICYmIHByaW1pdGl2ZVZhbHVlLT5n
ZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgeworICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0TGluZUJveENvbnRhaW4oTGluZUJveENvbnRhaW5Ob25lKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsdWUtPmlzQ1NTTGluZUJveENvbnRhaW5W
YWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENTU0xpbmVCb3hDb250YWlu
VmFsdWUqIGxpbmVCb3hDb250YWluVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NMaW5lQm94Q29udGFp
blZhbHVlKj4odmFsdWUpOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lQm94Q29udGFp
bihsaW5lQm94Q29udGFpblZhbHVlLT52YWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIENTUyBGb250cyBNb2R1bGUgTGV2ZWwgMworICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRGb250RmVhdHVyZVNldHRpbmdzOiB7CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZSAm
JiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vcm1hbCkgeworICAgICAg
ICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigp
Lm1ha2VOb3JtYWxGZWF0dXJlU2V0dGluZ3MoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRpb24gPSBzdGF0
ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgQ1NTVmFsdWVMaXN0KiBsaXN0
ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4odmFsdWUpOworICAgICAgICBSZWZQdHI8Rm9u
dEZlYXR1cmVTZXR0aW5ncz4gc2V0dGluZ3MgPSBGb250RmVhdHVyZVNldHRpbmdzOjpjcmVhdGUo
KTsKKyAgICAgICAgaW50IGxlbiA9IGxpc3QtPmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGxpc3Qt
Pml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgICAgICBpZiAoIWl0ZW0tPmlzRm9u
dEZlYXR1cmVWYWx1ZSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
Rm9udEZlYXR1cmVWYWx1ZSogZmVhdHVyZSA9IHN0YXRpY19jYXN0PEZvbnRGZWF0dXJlVmFsdWUq
PihpdGVtKTsKKyAgICAgICAgICAgIHNldHRpbmdzLT5hcHBlbmQoRm9udEZlYXR1cmUoZmVhdHVy
ZS0+dGFnKCksIGZlYXR1cmUtPnZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmb250RGVz
Y3JpcHRpb24uc2V0RmVhdHVyZVNldHRpbmdzKHNldHRpbmdzLnJlbGVhc2UoKSk7CisgICAgICAg
IHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKQorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRGaWx0ZXI6IHsKKyAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwoZmlsdGVyLCBG
aWx0ZXIpOworICAgICAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgICAgIGlm
IChjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKHZhbHVlLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290
RWxlbWVudFN0eWxlKCksIG9wZXJhdGlvbnMpKQorICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
c2V0RmlsdGVyKG9wZXJhdGlvbnMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRDb2x1bW5zOiB7CisgICAgICAgIFZlY3RvcjxH
cmlkVHJhY2tTaXplPiB0cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0xp
c3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZENvbHVtbnModHJhY2tTaXplcyk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRSb3dzOiB7CisgICAg
ICAgIFZlY3RvcjxHcmlkVHJhY2tTaXplPiB0cmFja1NpemVzOworICAgICAgICBpZiAoIWNyZWF0
ZUdyaWRUcmFja0xpc3QodmFsdWUsIHRyYWNrU2l6ZXMsIHN0YXRlKSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0R3JpZFJvd3ModHJhY2tTaXplcyk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0R3JpZFN0
YXJ0OiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBzdGFydFBvc2l0aW9uOworICAgICAgICBpZiAo
IWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgc3RhcnRQb3NpdGlvbikpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtU3RhcnQoc3RhcnRQb3Np
dGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEdyaWRFbmQ6IHsKKyAgICAgICAgR3JpZFBvc2l0aW9uIGVuZFBvc2l0aW9uOworICAgICAgICBp
ZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgZW5kUG9zaXRpb24pKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUVuZChlbmRQb3NpdGlv
bik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
R3JpZEJlZm9yZTogeworICAgICAgICBHcmlkUG9zaXRpb24gYmVmb3JlUG9zaXRpb247CisgICAg
ICAgIGlmICghY3JlYXRlR3JpZFBvc2l0aW9uKHZhbHVlLCBiZWZvcmVQb3NpdGlvbikpCisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJdGVtQmVmb3Jl
KGJlZm9yZVBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0R3JpZEFmdGVyOiB7CisgICAgICAgIEdyaWRQb3NpdGlvbiBhZnRlclBvc2l0
aW9uOworICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlvbih2YWx1ZSwgYWZ0ZXJQb3NpdGlv
bikpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRJ
dGVtQWZ0ZXIoYWZ0ZXJQb3NpdGlvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbGlhc2VkIGFuZCBTdHlsZUJ1aWxkZXIgYWxyZWFkeSBh
cHBsaWVkIHRoZSBwcm9wZXJ0eSBvbiB0aGUgcHJlZml4ZWQgdmVyc2lvbi4KKyAgICBjYXNlIENT
U1Byb3BlcnR5VHJhbnNpdGlvbkRlbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlUcmFuc2l0aW9u
RHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25Qcm9wZXJ0eToKKyAgICBj
YXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOgorICAgICAgICByZXR1cm47
CisgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIFN0eWxlQnVp
bGRlciBsb29rdXAgdGFibGUuCisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRBdHRhY2ht
ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ2xpcDoKKyAgICBjYXNlIENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1h
Z2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUJhY2tncm91bmRQb3NpdGlvblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91
bmRQb3NpdGlvblk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRSZXBlYXRYOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WToKKyAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21MZWZ0UmFkaXVzOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJCb3R0b21SaWdodFJhZGl1czoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVyQm90dG9tU3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJDb2xsYXBzZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
Qm9yZGVySW1hZ2VPdXRzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlUmVwZWF0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNsaWNlOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlCb3JkZXJJbWFnZVNvdXJjZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yOgorICAgIGNhc2UgQ1NT
UHJvcGVydHlCb3JkZXJMZWZ0U3R5bGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRX
aWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvcjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5Qm9yZGVyUmlnaHRTdHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyUmln
aHRXaWR0aDoKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3I6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eUJvcmRlclRvcExlZnRSYWRpdXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRl
clRvcFJpZ2h0UmFkaXVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUJv
dHRvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5Qm94U2l6aW5nOgorICAgIGNhc2UgQ1NTUHJvcGVy
dHlDYXB0aW9uU2lkZToKKyAgICBjYXNlIENTU1Byb3BlcnR5Q2xlYXI6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eUNsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUNvbG9yOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlDb3VudGVySW5jcmVtZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlDb3VudGVyUmVzZXQ6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5RGlyZWN0
aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlEaXNwbGF5OgorICAgIGNhc2UgQ1NTUHJvcGVydHlF
bXB0eUNlbGxzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlGbG9hdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5Rm9udFNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHlsZToKKyAgICBjYXNlIENT
U1Byb3BlcnR5Rm9udFZhcmlhbnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUhlaWdodDoKKyNpZiBFTkFCTEUoQ1NTX0lNQUdFX09SSUVOVEFU
SU9OKQorICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZU9yaWVudGF0aW9uOgorI2VuZGlmCisgICAg
Y2FzZSBDU1NQcm9wZXJ0eUltYWdlUmVuZGVyaW5nOgorI2lmIEVOQUJMRShDU1NfSU1BR0VfUkVT
T0xVVElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5SW1hZ2VSZXNvbHV0aW9uOgorI2VuZGlmCisg
ICAgY2FzZSBDU1NQcm9wZXJ0eUxlZnQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxldHRlclNwYWNp
bmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eUxpc3RTdHlsZUltYWdlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVQb3NpdGlvbjoK
KyAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0eWxlVHlwZToKKyAgICBjYXNlIENTU1Byb3BlcnR5
TWFyZ2luQm90dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNYXJnaW5MZWZ0OgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlNYXJnaW5SaWdodDoKKyAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luVG9wOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhIZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU1heFdp
ZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5IZWlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eU1pbldpZHRoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPcGFjaXR5OgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPcnBoYW5zOgorICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lQ29sb3I6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eU91dGxpbmVPZmZzZXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVT
dHlsZToKKyAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlPdmVyZmxvd1dyYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93WDoKKyAgICBj
YXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nQm90
dG9tOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nTGVmdDoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5UGFkZGluZ1JpZ2h0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWRkaW5nVG9wOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtBZnRlcjoKKyAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJy
ZWFrQmVmb3JlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdlQnJlYWtJbnNpZGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVBvaW50ZXJFdmVudHM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVBvc2l0aW9u
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlSZXNpemU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVJpZ2h0
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlTcGVhazoK
KyAgICBjYXNlIENTU1Byb3BlcnR5VGFiU2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5VGFibGVM
YXlvdXQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRBbGlnbjoKKyAgICBjYXNlIENTU1Byb3Bl
cnR5VGV4dERlY29yYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRJbmRlbnQ6CisgICAg
Y2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVyZmxvdzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFJl
bmRlcmluZzoKKyAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFRyYW5zZm9ybToKKyAgICBjYXNlIENT
U1Byb3BlcnR5VG9wOgorICAgIGNhc2UgQ1NTUHJvcGVydHlVbmljb2RlQmlkaToKKyNpZiBFTkFC
TEUoQ1NTX1ZBUklBQkxFUykKKyAgICBjYXNlIENTU1Byb3BlcnR5VmFyaWFibGU6CisjZW5kaWYK
KyAgICBjYXNlIENTU1Byb3BlcnR5VmVydGljYWxBbGlnbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5
VmlzaWJpbGl0eToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRGVsYXk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRpcmVjdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uRHVyYXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvbkZpbGxNb2RlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRp
b25JdGVyYXRpb25Db3VudDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uTmFt
ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uUGxheVN0YXRlOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbjoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0QXBwZWFyYW5jZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QXNw
ZWN0UmF0aW86CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToK
KyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QmFja2dyb3VuZENsaXA6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEJhY2tncm91bmRDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEJhY2tncm91bmRPcmlnaW46CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJhY2tncm91
bmRTaXplOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJGaXQ6CisgICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJJbWFnZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
VmVydGljYWxTcGFjaW5nOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hBbGlnbjoKKyNp
ZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9OX0JSRUFLKQorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3hEZWNvcmF0aW9uQnJlYWs6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94RGlyZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hGbGV4R3JvdXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEJveExpbmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hPcmRpbmFsR3Jv
dXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveE9yaWVudDoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm94UGFjazoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sb3JDb3Jy
ZWN0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5BeGlzOgorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5CcmVha0FmdGVyOgorICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRDb2x1bW5CcmVha0JlZm9yZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1u
QnJlYWtJbnNpZGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50OgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5HYXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtblByb2dyZXNzaW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5S
dWxlQ29sb3I6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVTdHlsZToKKyAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRDb2x1bW5TcGFuOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5X
aWR0aDoKKyNpZiBFTkFCTEUoQ1VSU09SX1ZJU0lCSUxJVFkpCisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEN1cnNvclZpc2liaWxpdHk6CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0QWxpZ25Db250ZW50OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnbkl0ZW1zOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbGlnblNlbGY6CisgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdEZsZXhCYXNpczoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleERpcmVjdGlv
bjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmxleEdyb3c6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZsZXhTaHJpbms6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhXcmFw
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRKdXN0aWZ5Q29udGVudDoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0T3JkZXI6CisjaWYgRU5BQkxFKENTU19SRUdJT05TKQorICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRGbG93RnJvbToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxv
d0ludG86CisjZW5kaWYKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEtlcm5pbmc6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZvbnRTbW9vdGhpbmc6CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdEZvbnRWYXJpYW50TGlnYXR1cmVzOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRIaWdobGlnaHQ6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUNoYXJhY3Rl
cjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRBZnRlcjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0SHlwaGVuYXRlTGltaXRCZWZvcmU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEh5cGhlbmF0ZUxpbWl0TGluZXM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEh5cGhlbnM6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVBbGlnbjoKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUJyZWFrOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRMaW5lQ2xhbXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVHcmlkOgorICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRMaW5lU25hcDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
TWFycXVlZURpcmVjdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFycXVlZVN0eWxl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2U6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZU91dHNldDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlUmVwZWF0OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94
SW1hZ2VTbGljZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU291cmNl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VXaWR0aDoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0TWFza0NsaXA6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
c2tDb21wb3NpdGU6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tJbWFnZToKKyAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0TWFza09yaWdpbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza1Bvc2l0aW9uWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1Bvc2l0aW9u
WToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1JlcGVhdFg6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tSZXBlYXRZOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNr
U2l6ZToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TmJzcE1vZGU6CisgICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFBlcnNwZWN0aXZlT3JpZ2luOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRQZXJzcGVjdGl2ZU9yaWdpblg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBlcnNwZWN0
aXZlT3JpZ2luWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UHJpbnRDb2xvckFkanVzdDoK
KyNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lv
bkJyZWFrQWZ0ZXI6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbkJyZWFrQmVmb3Jl
OgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0luc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0UmVnaW9uT3ZlcmZsb3c6CisjZW5kaWYKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0UnRsT3JkZXJpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ1YnlQ
b3NpdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dENvbWJpbmU6CisjaWYgRU5B
QkxFKENTUzNfVEVYVCkKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dERlY29yYXRpb25M
aW5lOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RGVjb3JhdGlvblN0eWxlOgorICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0QWxpZ25MYXN0OgorI2VuZGlmIC8vIENTUzNfVEVY
VAorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNDb2xvcjoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0VGV4dEVtcGhhc2lzUG9zaXRpb246CisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRFbXBoYXNpc1N0eWxlOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0RmlsbENvbG9yOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U2VjdXJpdHk6Cisg
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvcjoKKyAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWDoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
VHJhbnNmb3JtT3JpZ2luWToKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3Jp
Z2luWjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtU3R5bGU6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EZWxheToKKyAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFu
c2l0aW9uUHJvcGVydHk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25UaW1p
bmdGdW5jdGlvbjoKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VXNlckRyYWc6CisgICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFVzZXJNb2RpZnk6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dFVzZXJTZWxlY3Q6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENsaXBQYXRoOgorI2lmIEVO
QUJMRShDU1NfRVhDTFVTSU9OUykKKyAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0V3JhcEZsb3c6
CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlTWFyZ2luOgorICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRTaGFwZVBhZGRpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBU
aHJvdWdoOgorICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRTaGFwZUluc2lkZToKKyAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0U2hhcGVPdXRzaWRlOgorI2VuZGlmCisgICAgY2FzZSBDU1NQcm9w
ZXJ0eVdoaXRlU3BhY2U6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdpZG93czoKKyAgICBjYXNlIENT
U1Byb3BlcnR5V2lkdGg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRCcmVhazoKKyAgICBjYXNl
IENTU1Byb3BlcnR5V29yZFNwYWNpbmc6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRXcmFwOgor
ICAgIGNhc2UgQ1NTUHJvcGVydHlaSW5kZXg6CisgICAgY2FzZSBDU1NQcm9wZXJ0eVpvb206Cisj
aWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKKyAgICBjYXNlIENTU1Byb3BlcnR5TWF4
Wm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5TWluWm9vbToKKyAgICBjYXNlIENTU1Byb3BlcnR5
T3JpZW50YXRpb246CisgICAgY2FzZSBDU1NQcm9wZXJ0eVVzZXJab29tOgorI2VuZGlmCisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAvLyBUcnkgdGhlIFNWRyBwcm9wZXJ0aWVzCisgICAg
ICAgIGFwcGx5U1ZHUHJvcGVydHkoaWQsIHZhbHVlKTsKKyNlbmRpZgorICAgICAgICByZXR1cm47
CisgICAgfQorfQorCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnN0eWxl
SW1hZ2UoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTVmFsdWUqIHZhbHVlKQoreworICAgIGlm
ICh2YWx1ZS0+aXNJbWFnZVZhbHVlKCkpCisgICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdG
cm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0ltYWdlVmFsdWUqPih2YWx1ZSkpOwor
CisgICAgaWYgKHZhbHVlLT5pc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgeworICAgICAgICBpZiAo
dmFsdWUtPmlzR3JhZGllbnRWYWx1ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9y
UGVuZGluZ0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+
KHZhbHVlKS0+Z3JhZGllbnRXaXRoU3R5bGVzUmVzb2x2ZWQodGhpcykuZ2V0KCkpOworICAgICAg
ICByZXR1cm4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2Fz
dDxDU1NJbWFnZUdlbmVyYXRvclZhbHVlKj4odmFsdWUpKTsKKyAgICB9CisKKyNpZiBFTkFCTEUo
Q1NTX0lNQUdFX1NFVCkKKyAgICBpZiAodmFsdWUtPmlzSW1hZ2VTZXRWYWx1ZSgpKQorICAgICAg
ICByZXR1cm4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNfY2FzdDxDU1NJ
bWFnZVNldFZhbHVlKj4odmFsdWUpKTsKKyNlbmRpZgorCisgICAgaWYgKHZhbHVlLT5pc0N1cnNv
ckltYWdlVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIGN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShw
cm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTQ3Vyc29ySW1hZ2VWYWx1ZSo+KHZhbHVlKSk7CisKKyAg
ICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpj
YWNoZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwgQ1NTSW1hZ2VW
YWx1ZSogdmFsdWUpCit7CisgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGltYWdlID0gdmFsdWUtPmNh
Y2hlZE9yUGVuZGluZ0ltYWdlKCk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJ
bWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJv
cGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCitQYXNzUmVm
UHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmdlbmVyYXRlZE9yUGVuZGluZ0Zyb21WYWx1
ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZUdlbmVyYXRvclZhbHVlKiB2YWx1ZSkK
K3sKKyAgICBpZiAodmFsdWUtPmlzUGVuZGluZygpKSB7CisgICAgICAgIG1fc3RhdGUucGVuZGlu
Z0ltYWdlUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICByZXR1cm4g
U3R5bGVQZW5kaW5nSW1hZ2U6OmNyZWF0ZSh2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiBTdHls
ZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUodmFsdWUpOworfQorCisjaWYgRU5BQkxFKENTU19JTUFH
RV9TRVQpCitQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OnNldE9yUGVuZGlu
Z0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHByb3BlcnR5LCBDU1NJbWFnZVNldFZhbHVlKiB2YWx1
ZSkKK3sKKyAgICBSZWZQdHI8U3R5bGVJbWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5k
aW5nSW1hZ2VTZXQoZG9jdW1lbnQoKSk7CisgICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRp
bmdJbWFnZSgpKQorICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQo
cHJvcGVydHksIHZhbHVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorI2VuZGlm
CisKK1Bhc3NSZWZQdHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y3Vyc29yT3JQZW5kaW5n
RnJvbVZhbHVlKENTU1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0N1cnNvckltYWdlVmFsdWUqIHZh
bHVlKQoreworICAgIFJlZlB0cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBl
bmRpbmdJbWFnZShkb2N1bWVudCgpKTsKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UtPmlzUGVuZGlu
Z0ltYWdlKCkpCisgICAgICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLnNldChw
cm9wZXJ0eSwgdmFsdWUpOworICAgIHJldHVybiBpbWFnZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6Y2hlY2tGb3Jab29tQ2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlKQoreworICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZlWm9vbSgp
ID09IHBhcmVudFN0eWxlLT5lZmZlY3RpdmVab29tKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRGb250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlv
bigpOworICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsK
KyAgICBzZXRGb250U2l6ZShuZXdGb250RGVzY3JpcHRpb24sIGNoaWxkRm9udC5zcGVjaWZpZWRT
aXplKCkpOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3Rm9udERlc2NyaXB0aW9u
KTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjpjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2Uo
UmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpCit7CisgICAgY29u
c3QgRm9udERlc2NyaXB0aW9uJiBjaGlsZEZvbnQgPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7
CisKKyAgICBpZiAoY2hpbGRGb250LmlzQWJzb2x1dGVTaXplKCkgfHwgIXBhcmVudFN0eWxlKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIHBhcmVudEZvbnQg
PSBwYXJlbnRTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgaWYgKGNoaWxkRm9udC51c2VG
aXhlZERlZmF1bHRTaXplKCkgPT0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIEZvciBub3csIGx1bXAgYWxsIGZhbWlsaWVzIGJ1dCBt
b25vc3BhY2UgdG9nZXRoZXIuCisgICAgaWYgKGNoaWxkRm9udC5nZW5lcmljRmFtaWx5KCkgIT0g
Rm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkKKyAgICAgICAgJiYgcGFyZW50Rm9udC5n
ZW5lcmljRmFtaWx5KCkgIT0gRm9udERlc2NyaXB0aW9uOjpNb25vc3BhY2VGYW1pbHkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFdlIGtub3cgdGhlIHBhcmVudCBpcyBtb25vc3BhY2Ugb3Ig
dGhlIGNoaWxkIGlzIG1vbm9zcGFjZSwgYW5kIHRoYXQgZm9udAorICAgIC8vIHNpemUgd2FzIHVu
c3BlY2lmaWVkLiBXZSB3YW50IHRvIHNjYWxlIG91ciBmb250IHNpemUgYXMgYXBwcm9wcmlhdGUu
CisgICAgLy8gSWYgdGhlIGZvbnQgdXNlcyBhIGtleXdvcmQgc2l6ZSwgdGhlbiB3ZSByZWZldGNo
IGZyb20gdGhlIHRhYmxlIHJhdGhlciB0aGFuCisgICAgLy8gbXVsdGlwbHlpbmcgYnkgb3VyIHNj
YWxlIGZhY3Rvci4KKyAgICBmbG9hdCBzaXplOworICAgIGlmIChjaGlsZEZvbnQua2V5d29yZFNp
emUoKSkKKyAgICAgICAgc2l6ZSA9IGZvbnRTaXplRm9yS2V5d29yZChkb2N1bWVudCgpLCBDU1NW
YWx1ZVh4U21hbGwgKyBjaGlsZEZvbnQua2V5d29yZFNpemUoKSAtIDEsIGNoaWxkRm9udC51c2VG
aXhlZERlZmF1bHRTaXplKCkpOworICAgIGVsc2UgeworICAgICAgICBTZXR0aW5ncyogc2V0dGlu
Z3MgPSBkb2N1bWVudFNldHRpbmdzKCk7CisgICAgICAgIGZsb2F0IGZpeGVkU2NhbGVGYWN0b3Ig
PSAoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkgJiYgc2V0dGlu
Z3MtPmRlZmF1bHRGb250U2l6ZSgpKQorICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxmbG9hdD4o
c2V0dGluZ3MtPmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpIC8gc2V0dGluZ3MtPmRlZmF1bHRGb250
U2l6ZSgpCisgICAgICAgICAgICA6IDE7CisgICAgICAgIHNpemUgPSBwYXJlbnRGb250LnVzZUZp
eGVkRGVmYXVsdFNpemUoKSA/CisgICAgICAgICAgICAgICAgY2hpbGRGb250LnNwZWNpZmllZFNp
emUoKSAvIGZpeGVkU2NhbGVGYWN0b3IgOgorICAgICAgICAgICAgICAgIGNoaWxkRm9udC5zcGVj
aWZpZWRTaXplKCkgKiBmaXhlZFNjYWxlRmFjdG9yOworICAgIH0KKworICAgIEZvbnREZXNjcmlw
dGlvbiBuZXdGb250RGVzY3JpcHRpb24oY2hpbGRGb250KTsKKyAgICBzZXRGb250U2l6ZShuZXdG
b250RGVzY3JpcHRpb24sIHNpemUpOworICAgIHN0eWxlLT5zZXRGb250RGVzY3JpcHRpb24obmV3
Rm9udERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHlsZVJlc29sdmVyOjppbml0aWFsaXplRm9u
dFN0eWxlKFNldHRpbmdzKiBzZXR0aW5ncykKK3sKKyAgICBGb250RGVzY3JpcHRpb24gZm9udERl
c2NyaXB0aW9uOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNj
cmlwdGlvbjo6U3RhbmRhcmRGYW1pbHkpOworICAgIGZvbnREZXNjcmlwdGlvbi5zZXRSZW5kZXJp
bmdNb2RlKHNldHRpbmdzLT5mb250UmVuZGVyaW5nTW9kZSgpKTsKKyAgICBmb250RGVzY3JpcHRp
b24uc2V0VXNlUHJpbnRlckZvbnQoZG9jdW1lbnQoKS0+cHJpbnRpbmcoKSB8fCAhc2V0dGluZ3Mt
PnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOworICAgIGNvbnN0IEF0b21pY1N0cmlu
ZyYgc3RhbmRhcmRGb250RmFtaWx5ID0gZG9jdW1lbnRTZXR0aW5ncygpLT5zdGFuZGFyZEZvbnRG
YW1pbHkoKTsKKyAgICBpZiAoIXN0YW5kYXJkRm9udEZhbWlseS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KHN0YW5kYXJkRm9udEZh
bWlseSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLmFwcGVuZEZhbWls
eSgwKTsKKyAgICB9CisgICAgZm9udERlc2NyaXB0aW9uLnNldEtleXdvcmRTaXplKENTU1ZhbHVl
TWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7CisgICAgc2V0Rm9udFNpemUoZm9udERlc2Ny
aXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVNZWRpdW0sIGZh
bHNlKSk7CisgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjpp
bml0aWFsTGluZUhlaWdodCgpKTsKKyAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsK
KyAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKK30KKwordm9pZCBTdHls
ZVJlc29sdmVyOjpzZXRGb250U2l6ZShGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwg
ZmxvYXQgc2l6ZSkKK3sKKyAgICBmb250RGVzY3JpcHRpb24uc2V0U3BlY2lmaWVkU2l6ZShzaXpl
KTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKGdldENvbXB1dGVkU2l6ZUZy
b21TcGVjaWZpZWRTaXplKGRvY3VtZW50KCksIG1fc3RhdGUuc3R5bGUoKSwgZm9udERlc2NyaXB0
aW9uLmlzQWJzb2x1dGVTaXplKCksIHNpemUsIHVzZVNWR1pvb21SdWxlcygpKSk7Cit9CisKK2Zs
b2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3Vt
ZW50KiBkb2N1bWVudCwgUmVuZGVyU3R5bGUqIHN0eWxlLCBib29sIGlzQWJzb2x1dGVTaXplLCBm
bG9hdCBzcGVjaWZpZWRTaXplLCBib29sIHVzZVNWR1pvb21SdWxlcykKK3sKKyAgICBmbG9hdCB6
b29tRmFjdG9yID0gMS4wZjsKKyAgICBpZiAoIXVzZVNWR1pvb21SdWxlcykgeworICAgICAgICB6
b29tRmFjdG9yID0gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICAgICAgaWYgKEZyYW1lKiBm
cmFtZSA9IGRvY3VtZW50LT5mcmFtZSgpKQorICAgICAgICAgICAgem9vbUZhY3RvciAqPSBmcmFt
ZS0+dGV4dFpvb21GYWN0b3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3R5bGVSZXNvbHZlcjo6
Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQsIHpvb21GYWN0b3IsIGlz
QWJzb2x1dGVTaXplLCBzcGVjaWZpZWRTaXplKTsKK30KKworZmxvYXQgU3R5bGVSZXNvbHZlcjo6
Z2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBmbG9h
dCB6b29tRmFjdG9yLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXplLCBF
U21hcnRNaW5pbXVtRm9yRm9udFNpemUgdXNlU21hcnRNaW5pbXVtRm9yRm9udFNpemUpCit7Cisg
ICAgLy8gVGV4dCB3aXRoIGEgMHB4IGZvbnQgc2l6ZSBzaG91bGQgbm90IGJlIHZpc2libGUgYW5k
IHRoZXJlZm9yZSBuZWVkcyB0byBiZQorICAgIC8vIGV4ZW1wdCBmcm9tIG1pbmltdW0gZm9udCBz
aXplIHJ1bGVzLiBBY2lkMyByZWxpZXMgb24gdGhpcyBmb3IgcGl4ZWwtcGVyZmVjdAorICAgIC8v
IHJlbmRlcmluZy4gVGhpcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBvdGhlciBicm93c2VycyB0
aGF0IGhhdmUgbWluaW11bQorICAgIC8vIGZvbnQgc2l6ZSBzZXR0aW5ncyAoZS5nLiBGaXJlZm94
KS4KKyAgICBpZiAoZmFic2Yoc3BlY2lmaWVkU2l6ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGZs
b2F0Pjo6ZXBzaWxvbigpKQorICAgICAgICByZXR1cm4gMC4wZjsKKworICAgIC8vIFdlIHN1cHBv
cnQgdHdvIHR5cGVzIG9mIG1pbmltdW0gZm9udCBzaXplLiBUaGUgZmlyc3QgaXMgYSBoYXJkIG92
ZXJyaWRlIHRoYXQgYXBwbGllcyB0bworICAgIC8vIGFsbCBmb250cy4gVGhpcyBpcyAibWluU2l6
ZS4iIFRoZSBzZWNvbmQgdHlwZSBvZiBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBhICJzbWFydCBtaW5p
bXVtIgorICAgIC8vIHRoYXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIFdlYiBwYWdlIGNhbid0
IGtub3cgd2hhdCBzaXplIGl0IHJlYWxseSBhc2tlZCBmb3IsIGUuZy4sCisgICAgLy8gd2hlbiBp
dCB1c2VzIGxvZ2ljYWwgc2l6ZXMgbGlrZSAic21hbGwiIG9yIGV4cHJlc3NlcyB0aGUgZm9udC1z
aXplIGFzIGEgcGVyY2VudGFnZSBvZgorICAgIC8vIHRoZSB1c2VyJ3MgZGVmYXVsdCBmb250IHNl
dHRpbmcuCisKKyAgICAvLyBXaXRoIHRoZSBzbWFydCBtaW5pbXVtLCB3ZSBuZXZlciB3YW50IHRv
IGdldCBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gZm9udCBzaXplIHRvIGtlZXAgZm9udHMgcmVh
ZGFibGUuCisgICAgLy8gSG93ZXZlciB3ZSBhbHdheXMgYWxsb3cgdGhlIHBhZ2UgdG8gc2V0IGFu
IGV4cGxpY2l0IHBpeGVsIHNpemUgdGhhdCBpcyBzbWFsbGVyLAorICAgIC8vIHNpbmNlIHNpdGVz
IHdpbGwgbWlzLXJlbmRlciBvdGhlcndpc2UgKGUuZy4sIGh0dHA6Ly93d3cuZ2FtZXNwb3QuY29t
IHdpdGggYSA5cHggbWluaW11bSkuCisKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVu
dC0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzKQorICAgICAgICByZXR1cm4gMS4wZjsK
KworICAgIGludCBtaW5TaXplID0gc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOworICAgIGlu
dCBtaW5Mb2dpY2FsU2l6ZSA9IHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7Cisg
ICAgZmxvYXQgem9vbWVkU2l6ZSA9IHNwZWNpZmllZFNpemUgKiB6b29tRmFjdG9yOworCisgICAg
Ly8gQXBwbHkgdGhlIGhhcmQgbWluaW11bSBmaXJzdC4gV2Ugb25seSBhcHBseSB0aGUgaGFyZCBt
aW5pbXVtIGlmIGFmdGVyIHpvb21pbmcgd2UncmUgc3RpbGwgdG9vIHNtYWxsLgorICAgIGlmICh6
b29tZWRTaXplIDwgbWluU2l6ZSkKKyAgICAgICAgem9vbWVkU2l6ZSA9IG1pblNpemU7CisKKyAg
ICAvLyBOb3cgYXBwbHkgdGhlICJzbWFydCBtaW5pbXVtLiIgVGhpcyBtaW5pbXVtIGlzIGFsc28g
b25seSBhcHBsaWVkIGlmIHdlJ3JlIHN0aWxsIHRvbyBzbWFsbAorICAgIC8vIGFmdGVyIHpvb21p
bmcuIFRoZSBmb250IHNpemUgbXVzdCBlaXRoZXIgYmUgcmVsYXRpdmUgdG8gdGhlIHVzZXIgZGVm
YXVsdCBvciB0aGUgb3JpZ2luYWwgc2l6ZQorICAgIC8vIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGFi
bGUuIEluIG90aGVyIHdvcmRzLCB3ZSBvbmx5IGFwcGx5IHRoZSBzbWFydCBtaW5pbXVtIHdoZW5l
dmVyIHdlJ3JlIHBvc2l0aXZlCisgICAgLy8gZG9pbmcgc28gd29uJ3QgZGlzcnVwdCB0aGUgbGF5
b3V0LgorICAgIGlmICh1c2VTbWFydE1pbmltdW1Gb3JGb250U2l6ZSAmJiB6b29tZWRTaXplIDwg
bWluTG9naWNhbFNpemUgJiYgKHNwZWNpZmllZFNpemUgPj0gbWluTG9naWNhbFNpemUgfHwgIWlz
QWJzb2x1dGVTaXplKSkKKyAgICAgICAgem9vbWVkU2l6ZSA9IG1pbkxvZ2ljYWxTaXplOworCisg
ICAgLy8gQWxzbyBjbGFtcCB0byBhIHJlYXNvbmFibGUgbWF4aW11bSB0byBwcmV2ZW50IGluc2Fu
ZSBmb250IHNpemVzIGZyb20gY2F1c2luZyBjcmFzaGVzIG9uIHZhcmlvdXMKKyAgICAvLyBwbGF0
Zm9ybXMgKEknbSBsb29raW5nIGF0IHlvdSwgV2luZG93cy4pCisgICAgcmV0dXJuIG1pbihtYXhp
bXVtQWxsb3dlZEZvbnRTaXplLCB6b29tZWRTaXplKTsKK30KKworY29uc3QgaW50IGZvbnRTaXpl
VGFibGVNYXggPSAxNjsKK2NvbnN0IGludCBmb250U2l6ZVRhYmxlTWluID0gOTsKK2NvbnN0IGlu
dCB0b3RhbEtleXdvcmRzID0gODsKKworLy8gV2luSUUvTmF2NCB0YWJsZSBmb3IgZm9udCBzaXpl
cy4gRGVzaWduZWQgdG8gbWF0Y2ggdGhlIGxlZ2FjeSBmb250IG1hcHBpbmcgc3lzdGVtIG9mIEhU
TUwuCitzdGF0aWMgY29uc3QgaW50IHF1aXJrc0ZvbnRTaXplVGFibGVbZm9udFNpemVUYWJsZU1h
eCAtIGZvbnRTaXplVGFibGVNaW4gKyAxXVt0b3RhbEtleXdvcmRzXSA9Cit7CisgICAgICB7IDks
ICAgIDksICAgICA5LCAgICAgOSwgICAgMTEsICAgIDE0LCAgICAxOCwgICAgMjggfSwKKyAgICAg
IHsgOSwgICAgOSwgICAgIDksICAgIDEwLCAgICAxMiwgICAgMTUsICAgIDIwLCAgICAzMSB9LAor
ICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMjIsICAgIDM0
IH0sCisgICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMiwgICAgMTQsICAgIDE4LCAgICAyNCwg
ICAgMzcgfSwKKyAgICAgIHsgOSwgICAgOSwgICAgMTAsICAgIDEzLCAgICAxNiwgICAgMjAsICAg
IDI2LCAgICA0MCB9LCAvLyBmaXhlZCBmb250IGRlZmF1bHQgKDEzKQorICAgICAgeyA5LCAgICA5
LCAgICAxMSwgICAgMTQsICAgIDE3LCAgICAyMSwgICAgMjgsICAgIDQyIH0sCisgICAgICB7IDks
ICAgMTAsICAgIDEyLCAgICAxNSwgICAgMTcsICAgIDIzLCAgICAzMCwgICAgNDUgfSwKKyAgICAg
IHsgOSwgICAxMCwgICAgMTMsICAgIDE2LCAgICAxOCwgICAgMjQsICAgIDMyLCAgICA0OCB9IC8v
IHByb3BvcnRpb25hbCBmb250IGRlZmF1bHQgKDE2KQorfTsKKy8vIEhUTUwgICAgICAgMSAgICAg
IDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNworLy8gQ1NTICB4eHMgICB4cyAg
ICAgcyAgICAgIG0gICAgICBsICAgICB4bCAgICAgeHhsCisvLyAgICAgICAgICAgICAgICAgICAg
ICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgdXNlciBwcmVmCisKKy8vIFN0cmljdCBt
b2RlIHRhYmxlIG1hdGNoZXMgTWFjSUUgYW5kIE1vemlsbGEncyBzZXR0aW5ncyBleGFjdGx5Lgor
c3RhdGljIGNvbnN0IGludCBzdHJpY3RGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBm
b250U2l6ZVRhYmxlTWluICsgMV1bdG90YWxLZXl3b3Jkc10gPQoreworICAgICAgeyA5LCAgICA5
LCAgICAgOSwgICAgIDksICAgIDExLCAgICAxNCwgICAgMTgsICAgIDI3IH0sCisgICAgICB7IDks
ICAgIDksICAgICA5LCAgICAxMCwgICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzAgfSwKKyAgICAg
IHsgOSwgICAgOSwgICAgMTAsICAgIDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzMyB9LAor
ICAgICAgeyA5LCAgICA5LCAgICAxMCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM2
IH0sCisgICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwg
ICAgMzkgfSwgLy8gZml4ZWQgZm9udCBkZWZhdWx0ICgxMykKKyAgICAgIHsgOSwgICAxMCwgICAg
MTIsICAgIDE0LCAgICAxNywgICAgMjEsICAgIDI4LCAgICA0MiB9LAorICAgICAgeyA5LCAgIDEw
LCAgICAxMywgICAgMTUsICAgIDE4LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCisgICAgICB7IDks
ICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9w
b3J0aW9uYWwgZm9udCBkZWZhdWx0ICgxNikKK307CisvLyBIVE1MICAgICAgIDEgICAgICAyICAg
ICAgMyAgICAgIDQgICAgICA1ICAgICAgNiAgICAgIDcKKy8vIENTUyAgeHhzICAgeHMgICAgIHMg
ICAgICBtICAgICAgbCAgICAgeGwgICAgIHh4bAorLy8gICAgICAgICAgICAgICAgICAgICAgICAg
IHwKKy8vICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcHJlZgorCisvLyBGb3IgdmFsdWVzIG91
dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSwgd2UgdXNlIFRvZGQgRmFocm5lcidzIHN1Z2dl
c3RlZCBzY2FsZQorLy8gZmFjdG9ycyBmb3IgZWFjaCBrZXl3b3JkIHZhbHVlLgorc3RhdGljIGNv
bnN0IGZsb2F0IGZvbnRTaXplRmFjdG9yc1t0b3RhbEtleXdvcmRzXSA9IHsgMC42MGYsIDAuNzVm
LCAwLjg5ZiwgMS4wZiwgMS4yZiwgMS41ZiwgMi4wZiwgMy4wZiB9OworCitmbG9hdCBTdHlsZVJl
c29sdmVyOjpmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQga2V5d29y
ZCwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQoreworICAgIFNldHRpbmdzKiBzZXR0
aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3MpCisgICAgICAg
IHJldHVybiAxLjBmOworCisgICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmluUXVpcmtz
TW9kZSgpOworICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSA/
IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1bHRGb250
U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYgbWVkaXVt
U2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7CisgICAgICAgIC8vIExvb2sgdXAgdGhlIGVudHJ5
IGluIHRoZSB0YWJsZS4KKyAgICAgICAgaW50IHJvdyA9IG1lZGl1bVNpemUgLSBmb250U2l6ZVRh
YmxlTWluOworICAgICAgICBpbnQgY29sID0gKGtleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGwpOwor
ICAgICAgICByZXR1cm4gcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XVtjb2xd
IDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddW2NvbF07CisgICAgfQorCisgICAgLy8gVmFsdWUg
aXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHRhYmxlLiBBcHBseSB0aGUgc2NhbGUgZmFjdG9y
IGluc3RlYWQuCisgICAgZmxvYXQgbWluTG9naWNhbFNpemUgPSBtYXgoc2V0dGluZ3MtPm1pbmlt
dW1Mb2dpY2FsRm9udFNpemUoKSwgMSk7CisgICAgcmV0dXJuIG1heChmb250U2l6ZUZhY3RvcnNb
a2V5d29yZCAtIENTU1ZhbHVlWHhTbWFsbF0qbWVkaXVtU2l6ZSwgbWluTG9naWNhbFNpemUpOwor
fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGludCBmaW5kTmVhcmVzdExlZ2FjeUZv
bnRTaXplKGludCBwaXhlbEZvbnRTaXplLCBjb25zdCBUKiB0YWJsZSwgaW50IG11bHRpcGxpZXIp
Cit7CisgICAgLy8gSWdub3JlIHRhYmxlWzBdIGJlY2F1c2UgeHgtc21hbGwgZG9lcyBub3QgY29y
cmVzcG9uZCB0byBhbnkgbGVnYWN5IGZvbnQgc2l6ZS4KKyAgICBmb3IgKGludCBpID0gMTsgaSA8
IHRvdGFsS2V5d29yZHMgLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKHBpeGVsRm9udFNpemUgKiAy
IDwgKHRhYmxlW2ldICsgdGFibGVbaSArIDFdKSAqIG11bHRpcGxpZXIpCisgICAgICAgICAgICBy
ZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsS2V5d29yZHMgLSAxOworfQorCitpbnQg
U3R5bGVSZXNvbHZlcjo6bGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqIGRvY3VtZW50LCBpbnQgcGl4
ZWxGb250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKQoreworICAgIFNldHRp
bmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpOworICAgIGlmICghc2V0dGluZ3Mp
CisgICAgICAgIHJldHVybiAxOworCisgICAgYm9vbCBxdWlya3NNb2RlID0gZG9jdW1lbnQtPmlu
UXVpcmtzTW9kZSgpOworICAgIGludCBtZWRpdW1TaXplID0gc2hvdWxkVXNlRml4ZWREZWZhdWx0
U2l6ZSA/IHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpIDogc2V0dGluZ3MtPmRlZmF1
bHRGb250U2l6ZSgpOworICAgIGlmIChtZWRpdW1TaXplID49IGZvbnRTaXplVGFibGVNaW4gJiYg
bWVkaXVtU2l6ZSA8PSBmb250U2l6ZVRhYmxlTWF4KSB7CisgICAgICAgIGludCByb3cgPSBtZWRp
dW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKKyAgICAgICAgcmV0dXJuIGZpbmROZWFyZXN0TGVn
YWN5Rm9udFNpemU8aW50PihwaXhlbEZvbnRTaXplLCBxdWlya3NNb2RlID8gcXVpcmtzRm9udFNp
emVUYWJsZVtyb3ddIDogc3RyaWN0Rm9udFNpemVUYWJsZVtyb3ddLCAxKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZTxmbG9hdD4ocGl4ZWxGb250U2l6ZSwg
Zm9udFNpemVGYWN0b3JzLCBtZWRpdW1TaXplKTsKK30KKworc3RhdGljIENvbG9yIGNvbG9yRm9y
Q1NTVmFsdWUoaW50IGNzc1ZhbHVlSWQpCit7CisgICAgc3RydWN0IENvbG9yVmFsdWUgeworICAg
ICAgICBpbnQgY3NzVmFsdWVJZDsKKyAgICAgICAgUkdCQTMyIGNvbG9yOworICAgIH07CisKKyAg
ICBzdGF0aWMgY29uc3QgQ29sb3JWYWx1ZSBjb2xvclZhbHVlc1tdID0geworICAgICAgICB7IENT
U1ZhbHVlQXF1YSwgMHhGRjAwRkZGRiB9LAorICAgICAgICB7IENTU1ZhbHVlQmxhY2ssIDB4RkYw
MDAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUJsdWUsIDB4RkYwMDAwRkYgfSwKKyAgICAgICAg
eyBDU1NWYWx1ZUZ1Y2hzaWEsIDB4RkZGRjAwRkYgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUdyYXks
IDB4RkY4MDgwODAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZUdyZWVuLCAweEZGMDA4MDAwICB9LAor
ICAgICAgICB7IENTU1ZhbHVlR3JleSwgMHhGRjgwODA4MCB9LAorICAgICAgICB7IENTU1ZhbHVl
TGltZSwgMHhGRjAwRkYwMCB9LAorICAgICAgICB7IENTU1ZhbHVlTWFyb29uLCAweEZGODAwMDAw
IH0sCisgICAgICAgIHsgQ1NTVmFsdWVOYXZ5LCAweEZGMDAwMDgwIH0sCisgICAgICAgIHsgQ1NT
VmFsdWVPbGl2ZSwgMHhGRjgwODAwMCAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZU9yYW5nZSwgMHhG
RkZGQTUwMCB9LAorICAgICAgICB7IENTU1ZhbHVlUHVycGxlLCAweEZGODAwMDgwIH0sCisgICAg
ICAgIHsgQ1NTVmFsdWVSZWQsIDB4RkZGRjAwMDAgfSwKKyAgICAgICAgeyBDU1NWYWx1ZVNpbHZl
ciwgMHhGRkMwQzBDMCB9LAorICAgICAgICB7IENTU1ZhbHVlVGVhbCwgMHhGRjAwODA4MCAgfSwK
KyAgICAgICAgeyBDU1NWYWx1ZVRyYW5zcGFyZW50LCAweDAwMDAwMDAwIH0sCisgICAgICAgIHsg
Q1NTVmFsdWVXaGl0ZSwgMHhGRkZGRkZGRiB9LAorICAgICAgICB7IENTU1ZhbHVlWWVsbG93LCAw
eEZGRkZGRjAwIH0sCisgICAgICAgIHsgMCwgMCB9CisgICAgfTsKKworICAgIGZvciAoY29uc3Qg
Q29sb3JWYWx1ZSogY29sID0gY29sb3JWYWx1ZXM7IGNvbC0+Y3NzVmFsdWVJZDsgKytjb2wpIHsK
KyAgICAgICAgaWYgKGNvbC0+Y3NzVmFsdWVJZCA9PSBjc3NWYWx1ZUlkKQorICAgICAgICAgICAg
cmV0dXJuIGNvbC0+Y29sb3I7CisgICAgfQorICAgIHJldHVybiBSZW5kZXJUaGVtZTo6ZGVmYXVs
dFRoZW1lKCktPnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworfQorCitib29sIFN0eWxlUmVzb2x2
ZXI6OmNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlSXNEZXJpdmVkRnJvbUVsZW1lbnQoQ1NTUHJpbWl0
aXZlVmFsdWUqIHZhbHVlKQoreworICAgIGludCBpZGVudCA9IHZhbHVlLT5nZXRJZGVudCgpOwor
ICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKKyAgICBj
YXNlIENTU1ZhbHVlV2Via2l0TGluazoKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0QWN0aXZlbGlu
azoKKyAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitDb2xvciBT
dHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZSog
dmFsdWUsIGJvb2wgZm9yVmlzaXRlZExpbmspIGNvbnN0Cit7CisgICAgaWYgKHZhbHVlLT5pc1JH
QkNvbG9yKCkpCisgICAgICAgIHJldHVybiBDb2xvcih2YWx1ZS0+Z2V0UkdCQTMyVmFsdWUoKSk7
CisKKyAgICBjb25zdCBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOworICAgIGludCBpZGVudCA9IHZh
bHVlLT5nZXRJZGVudCgpOworICAgIHN3aXRjaCAoaWRlbnQpIHsKKyAgICBjYXNlIDA6CisgICAg
ICAgIHJldHVybiBDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRUZXh0OgorICAgICAg
ICByZXR1cm4gc3RhdGUuZG9jdW1lbnQoKS0+dGV4dENvbG9yKCk7CisgICAgY2FzZSBDU1NWYWx1
ZVdlYmtpdExpbms6CisgICAgICAgIHJldHVybiAoc3RhdGUuZWxlbWVudCgpLT5pc0xpbmsoKSAm
JiBmb3JWaXNpdGVkTGluaykgPyBzdGF0ZS5kb2N1bWVudCgpLT52aXNpdGVkTGlua0NvbG9yKCkg
OiBzdGF0ZS5kb2N1bWVudCgpLT5saW5rQ29sb3IoKTsKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0
QWN0aXZlbGluazoKKyAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCktPmFjdGl2ZUxpbmtD
b2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRGb2N1c1JpbmdDb2xvcjoKKyAgICAgICAg
cmV0dXJuIFJlbmRlclRoZW1lOjpmb2N1c1JpbmdDb2xvcigpOworICAgIGNhc2UgQ1NTVmFsdWVD
dXJyZW50Y29sb3I6CisgICAgICAgIHJldHVybiBzdGF0ZS5zdHlsZSgpLT5jb2xvcigpOworICAg
IGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBjb2xvckZvckNTU1ZhbHVlKGlkZW50KTsKKyAgICB9
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkVmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5
UmVzdWx0KGNvbnN0IE1lZGlhUXVlcnlFeHAqIGV4cHIsIGJvb2wgcmVzdWx0KQoreworICAgIG1f
dmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5UmVzdWx0cy5hcHBlbmQoYWRvcHRQdHIobmV3IE1l
ZGlhUXVlcnlSZXN1bHQoKmV4cHIsIHJlc3VsdCkpKTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVy
OjphZmZlY3RlZEJ5Vmlld3BvcnRDaGFuZ2UoKSBjb25zdAoreworICAgIHVuc2lnbmVkIHMgPSBt
X3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMuc2l6ZSgpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzOyBpKyspIHsKKyAgICAgICAgaWYgKG1fbWVkaXVtLT5ldmFsKCZt
X3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHNbaV0tPm1fZXhwcmVzc2lvbikgIT0g
bV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHRzW2ldLT5tX3Jlc3VsdCkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp
YyBUcmFuc2Zvcm1PcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZShXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSB0eXBl
KQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpT
Q0FMRTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zvcm1P
cGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1g7CisgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4g
VHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlv
bjo6U0NBTEVfWjsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZTNEVHJh
bnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTQ0FMRV8zRDsKKyAg
ICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRp
b246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURTsKKyAgICBjYXNlIFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4g
VHJhbnNmb3JtT3BlcmF0aW9uOjpUUkFOU0xBVEVfWDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpUUkFOU0xBVEVfWTsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9u
OjpUUkFOU0xBVEVfWjsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNM
QVRFXzNEOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVRyYW5zZm9y
bU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Uk9UQVRFOworICAgIGNhc2Ug
V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVy
YXRpb246OlJPVEFURV9ZOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0
ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlJPVEFURV9a
OworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJvdGF0ZTNEVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfM0Q7CisgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6U0tFVzsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVl
OjpTa2V3WFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0tF
V19YOworICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3Bl
cmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpTS0VXX1k7CisgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJh
bnNmb3JtT3BlcmF0aW9uOjpNQVRSSVg7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1
ZTo6TWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246
Ok1BVFJJWF8zRDsKKyAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpQZXJzcGVjdGl2
ZVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6UEVSU1BFQ1RJ
VkU7CisgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5rbm93blRyYW5zZm9ybU9w
ZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKKyAgICB9CisgICAgcmV0
dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6Tk9ORTsKK30KKworYm9vbCBTdHlsZVJlc29sdmVyOjpj
cmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSog
c3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIFRyYW5zZm9ybU9wZXJhdGlvbnMmIG91dE9w
ZXJhdGlvbnMpCit7CisgICAgaWYgKCFpblZhbHVlIHx8ICFpblZhbHVlLT5pc1ZhbHVlTGlzdCgp
KSB7CisgICAgICAgIG91dE9wZXJhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIGZsb2F0IHpvb21GYWN0b3IgPSBzdHlsZSA/IHN0eWxlLT5lZmZlY3Rp
dmVab29tKCkgOiAxOworICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKKyAgICBm
b3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9yIGkgPSBpblZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZh
bmNlKCkpIHsKKyAgICAgICAgQ1NTVmFsdWUqIGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKKworICAg
ICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQorICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqIHRyYW5z
Zm9ybVZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWUqPihpLnZhbHVl
KCkpOworICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7
CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCB0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3Ro
KCk7ICsraikgeworICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjayhqKS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaGF2
ZU5vblByaW1pdGl2ZVZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQor
ICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKTsKKworICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybVZh
bHVlLT5vcGVyYXRpb25UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2NhbGVUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAg
ICAgICBkb3VibGUgc3ggPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7CisgICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAg
IHN5ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgICAgIHN4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAg
ICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRD
U1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc2Vjb25kVmFsdWUtPmdldERv
dWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgc3kgPSBzeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoU2NhbGVUcmFuc2Zvcm1PcGVy
YXRpb246OmNyZWF0ZShzeCwgc3ksIDEuMCwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFu
c2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNm
b3JtT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2Fs
ZTNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3VibGUgc3ggPSAxLjA7Cisg
ICAgICAgICAgICBkb3VibGUgc3kgPSAxLjA7CisgICAgICAgICAgICBkb3VibGUgc3ogPSAxLjA7
CisgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGVaVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAg
ICAgICAgIHN6ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGVs
c2UgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNm
b3JtVmFsdWU6OlNjYWxlWVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBzeSA9
IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBzeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAg
ICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNjYWxlWFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMikgeworICAgICAgICAgICAgICAg
ICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQ
cmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIp
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN6ID0gdGhpcmRWYWx1ZS0+Z2V0RG91YmxlVmFs
dWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHJh
bnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOworICAg
ICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BlcmF0aW9u
cy5vcGVyYXRpb25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gs
IHN5LCBzeiwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0
aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOgor
ICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3Jt
T3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xh
dGVZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgo
MCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAg
ICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAg
ICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RT
dHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0
eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3Bl
cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3Ro
KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vj
b25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5
ID0gY29udmVydFRvRmxvYXRMZW5ndGgoc2Vjb25kVmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpv
b21GYWN0b3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHguaXNVbmRlZmluZWQoKSB8fCB0eS5pc1Vu
ZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlv
bjo6Y3JlYXRlKHR4LCB0eSwgTGVuZ3RoKDAsIEZpeGVkKSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9u
VHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJh
bnNsYXRlWlRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIExl
bmd0aCB0eCA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAgICBMZW5ndGggdHkgPSBMZW5n
dGgoMCwgRml4ZWQpOworICAgICAgICAgICAgTGVuZ3RoIHR6ID0gTGVuZ3RoKDAsIEZpeGVkKTsK
KyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktp
dENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVaVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAg
ICAgICAgICAgIHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJv
b3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1
ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpUcmFuc2xhdGVZ
VHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHR5ID0gY29udmVydFRvRmxvYXRM
ZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7CisgICAgICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eCA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZp
cnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOworICAgICAgICAgICAgICAg
IGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9y
bVZhbHVlOjpUcmFuc2xhdGVYVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogdGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1By
aW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikp
OworICAgICAgICAgICAgICAgICAgICAgICAgdHogPSBjb252ZXJ0VG9GbG9hdExlbmd0aCh0aGly
ZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4g
MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNv
bnZlcnRUb0Zsb2F0TGVuZ3RoKHNlY29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFj
dG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgaWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmlu
ZWQoKSB8fCB0ei5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFRyYW5zbGF0ZVRy
YW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHR4LCB0eSwgdHosIGdldFRyYW5zZm9ybU9wZXJhdGlv
blR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gZmly
c3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0
aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSgwLCAwLCAxLCBh
bmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAg
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWVRyYW5zZm9ybU9wZXJhdGlv
bjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlWlRyYW5zZm9y
bU9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIHggPSAwOworICAgICAgICAgICAgZG91
YmxlIHkgPSAwOworICAgICAgICAgICAgZG91YmxlIHogPSAwOworICAgICAgICAgICAgZG91Ymxl
IGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKworICAgICAgICAgICAgaWYg
KHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlJvdGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb24pCisgICAgICAgICAgICAgICAgeCA9IDE7Cisg
ICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3JtT3BlcmF0aW9uKQorICAgICAg
ICAgICAgICAgIHkgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHogPSAx
OworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFJvdGF0ZVRyYW5z
Zm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHgsIHksIHosIGFuZ2xlLCBnZXRUcmFuc2Zvcm1PcGVyYXRp
b25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVyYXRpb25UeXBlKCkpKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpS
b3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogeworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZh
bHVlLT5sZW5ndGgoKSA8IDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBD
U1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAg
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7
CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZm91cnRoVmFsdWUgPSBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDMpKTsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFs
dWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSB5ID0gc2Vjb25kVmFsdWUtPmdldERvdWJsZVZhbHVl
KCk7CisgICAgICAgICAgICBkb3VibGUgeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7
CisgICAgICAgICAgICBkb3VibGUgYW5nbGUgPSBmb3VydGhWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMo
KTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFu
c2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0
aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSkpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6
U2tld1RyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlNrZXdZVHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAgICAgICAgICBkb3Vi
bGUgYW5nbGVYID0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZVkgPSAwOworICAgICAgICAg
ICAgZG91YmxlIGFuZ2xlID0gZmlyc3RWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMoKTsKKyAgICAgICAg
ICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICBhbmds
ZVkgPSBhbmdsZTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFuZ2xlWCA9
IGFuZ2xlOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlw
ZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3VHJhbnNmb3JtT3BlcmF0aW9uKSB7
CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogc2Vjb25kVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlWSA9IHNl
Y29uZFZhbHVlLT5jb21wdXRlRGVncmVlcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVy
YXRpb25zKCkuYXBwZW5kKFNrZXdUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShhbmdsZVgsIGFu
Z2xlWSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4VHJhbnNmb3JtT3BlcmF0aW9uOiB7CisgICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgNikKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFs
dWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJs
ZVZhbHVlKCk7CisgICAgICAgICAgICBkb3VibGUgYyA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpLT5nZXRE
b3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGQgPSBzdGF0aWNfY2FzdDxDU1NQcmlt
aXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDMpKS0+
Z2V0RG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRvdWJsZSBlID0gem9vbUZhY3RvciAqIHN0
YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0
Qm91bmRzQ2hlY2soNCkpLT5nZXREb3VibGVWYWx1ZSgpOworICAgICAgICAgICAgZG91YmxlIGYg
PSB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCk7CisgICAg
ICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoTWF0cml4VHJhbnNmb3JtT3Bl
cmF0aW9uOjpjcmVhdGUoYSwgYiwgYywgZCwgZSwgZikpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6TWF0cml4M0RU
cmFuc2Zvcm1PcGVyYXRpb246IHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVu
Z3RoKCkgPCAxNikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFRyYW5zZm9y
bWF0aW9uTWF0cml4IG1hdHJpeChzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5z
Zm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKS0+Z2V0RG91YmxlVmFsdWUoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpKS0+Z2V0RG91
YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxD
U1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDIpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91
dEJvdW5kc0NoZWNrKDMpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVl
LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRy
YW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDUpKS0+Z2V0RG91YmxlVmFsdWUo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRp
dmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDYpKS0+Z2V0
RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDcpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDgpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDkpKS0+Z2V0RG91YmxlVmFsdWUoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEwKSktPmdldERvdWJsZVZh
bHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMSkp
LT5nZXREb3VibGVWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21G
YWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDEyKSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgem9vbUZhY3RvciAqIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTMpKS0+Z2V0
RG91YmxlVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDE0KSktPmdldERvdWJsZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdp
dGhvdXRCb3VuZHNDaGVjaygxNSkpLT5nZXREb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChNYXRyaXgzRFRyYW5zZm9ybU9wZXJhdGlvbjo6
Y3JlYXRlKG1hdHJpeCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRp
b246IHsKKyAgICAgICAgICAgIExlbmd0aCBwID0gTGVuZ3RoKDAsIEZpeGVkKTsKKyAgICAgICAg
ICAgIGlmIChmaXJzdFZhbHVlLT5pc0xlbmd0aCgpKQorICAgICAgICAgICAgICAgIHAgPSBjb252
ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9y
KTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdWly
ayB0aGF0IHNob3VsZCBnbyBhd2F5IHdoZW4gM2QgdHJhbnNmb3JtcyBhcmUgZmluYWxpemVkLgor
ICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OworICAgICAgICAgICAgICAgIHAgPSB2YWwgPj0gMCA/IExlbmd0aChjbGFtcFRvUG9zaXRpdmVJ
bnRlZ2VyKHZhbCksIEZpeGVkKSA6IExlbmd0aChVbmRlZmluZWQpOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAocC5pc1VuZGVmaW5lZCgpKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKFBl
cnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUocCkpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VW5r
bm93blRyYW5zZm9ybU9wZXJhdGlvbjoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRPcGVyYXRp
b25zID0gb3BlcmF0aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIEVOQUJMRShDU1Nf
RklMVEVSUykKK3N0YXRpYyBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5cGUgZmlsdGVyT3Bl
cmF0aW9uRm9yVHlwZShXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RmlsdGVyT3BlcmF0aW9uVHlwZSB0
eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFs
dWU6OlJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJh
dGlvbjo6UkVGRVJFTkNFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkdyYXlzY2Fs
ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6R1JBWVND
QUxFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9u
OgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTsKKyAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJu
IEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6SHVlUm90YXRlRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpIVUVfUk9UQVRFOworICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVydEZp
bHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOwor
ICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246Cisg
ICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJVFk7CisgICAgY2FzZSBXZWJLaXRD
U1NGaWx0ZXJWYWx1ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJu
IEZpbHRlck9wZXJhdGlvbjo6QlJJR0hUTkVTUzsKKyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpDb250cmFzdEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJh
dGlvbjo6Q09OVFJBU1Q7CisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRl
ck9wZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6QkxVUjsKKyAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpEcm9wU2hhZG93RmlsdGVyT3BlcmF0aW9uOgorICAg
ICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpEUk9QX1NIQURPVzsKKyNpZiBFTkFCTEUoQ1NT
X1NIQURFUlMpCisgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q3VzdG9tRmlsdGVyT3Bl
cmF0aW9uOgorICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT007CisjZW5kaWYK
KyAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpVbmtub3duRmlsdGVyT3BlcmF0aW9uOgor
ICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0aW9uOjpOT05FOworICAgIH0KKyAgICByZXR1cm4g
RmlsdGVyT3BlcmF0aW9uOjpOT05FOworfQorCisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBF
TkFCTEUoU1ZHKQordm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NWR0RvY3VtZW50cygp
Cit7CisgICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKKyAgICBpZiAoIXN0YXRlLnN0eWxlKCkt
Pmhhc0ZpbHRlcigpIHx8IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMoKS5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJj
ZUxvYWRlciA9IHN0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7CisgICAg
VmVjdG9yPFJlZlB0cjxGaWx0ZXJPcGVyYXRpb24+ID4mIGZpbHRlck9wZXJhdGlvbnMgPSBzdGF0
ZS5zdHlsZSgpLT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJl
ZlB0cjxGaWx0ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMu
YXQoaSk7CisgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9
PSBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRSkgeworICAgICAgICAgICAgUmVmZXJlbmNlRmls
dGVyT3BlcmF0aW9uKiByZWZlcmVuY2VGaWx0ZXIgPSBzdGF0aWNfY2FzdDxSZWZlcmVuY2VGaWx0
ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24uZ2V0KCkpOworCisgICAgICAgICAgICBXZWJL
aXRDU1NTVkdEb2N1bWVudFZhbHVlKiB2YWx1ZSA9IHN0YXRlLnBlbmRpbmdTVkdEb2N1bWVudHMo
KS5nZXQocmVmZXJlbmNlRmlsdGVyKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICghdmFsdWUpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBDYWNoZWRTVkdEb2N1bWVudCog
Y2FjaGVkRG9jdW1lbnQgPSB2YWx1ZS0+bG9hZChjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAg
ICAgICAgICBpZiAoIWNhY2hlZERvY3VtZW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgICAgICAvLyBTdGFzaCB0aGUgQ2FjaGVkU1ZHRG9jdW1lbnQgb24gdGhlIHJlZmVy
ZW5jZSBmaWx0ZXIuCisgICAgICAgICAgICByZWZlcmVuY2VGaWx0ZXItPnNldENhY2hlZFNWR0Rv
Y3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShj
YWNoZWREb2N1bWVudCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0ZS5wZW5kaW5nU1ZH
RG9jdW1lbnRzKCkuY2xlYXIoKTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19TSEFERVJT
KQorU3R5bGVTaGFkZXIqIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhZGVyKENTU1ZhbHVlKiB2YWx1
ZSkKK3sKKyAgICBpZiAodmFsdWUtPmlzV2ViS2l0Q1NTU2hhZGVyVmFsdWUoKSkKKyAgICAgICAg
cmV0dXJuIGNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVlKHN0YXRpY19jYXN0PFdl
YktpdENTU1NoYWRlclZhbHVlKj4odmFsdWUpKTsKKyAgICByZXR1cm4gMDsKK30KKworU3R5bGVT
aGFkZXIqIFN0eWxlUmVzb2x2ZXI6OmNhY2hlZE9yUGVuZGluZ1N0eWxlU2hhZGVyRnJvbVZhbHVl
KFdlYktpdENTU1NoYWRlclZhbHVlKiB2YWx1ZSkKK3sKKyAgICBTdHlsZVNoYWRlciogc2hhZGVy
ID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ1NoYWRlcigpOworICAgIGlmIChzaGFkZXIgJiYgc2hh
ZGVyLT5pc1BlbmRpbmdTaGFkZXIoKSkKKyAgICAgICAgbV9zdGF0ZS5zZXRIYXNQZW5kaW5nU2hh
ZGVycyh0cnVlKTsKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit2b2lkIFN0eWxlUmVzb2x2ZXI6
OmxvYWRQZW5kaW5nU2hhZGVycygpCit7CisgICAgaWYgKCFtX3N0YXRlLnN0eWxlKCktPmhhc0Zp
bHRlcigpIHx8ICFtX3N0YXRlLmhhc1BlbmRpbmdTaGFkZXJzKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJjZUxvYWRlciA9IG1fc3Rh
dGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKworICAgIFZlY3RvcjxSZWZQ
dHI8RmlsdGVyT3BlcmF0aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gbV9zdGF0ZS5zdHlsZSgp
LT5tdXRhYmxlRmlsdGVyKCkub3BlcmF0aW9ucygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBmaWx0ZXJPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxGaWx0
ZXJPcGVyYXRpb24+IGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlck9wZXJhdGlvbnMuYXQoaSk7Cisg
ICAgICAgIGlmIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSA9PSBGaWx0ZXJP
cGVyYXRpb246OkNVU1RPTSkgeworICAgICAgICAgICAgQ3VzdG9tRmlsdGVyT3BlcmF0aW9uKiBj
dXN0b21GaWx0ZXIgPSBzdGF0aWNfY2FzdDxDdXN0b21GaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJP
cGVyYXRpb24uZ2V0KCkpOworICAgICAgICAgICAgQVNTRVJUKGN1c3RvbUZpbHRlci0+cHJvZ3Jh
bSgpKTsKKyAgICAgICAgICAgIFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSogcHJvZ3JhbSA9IHN0
YXRpY19jYXN0PFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbSo+KGN1c3RvbUZpbHRlci0+cHJvZ3Jh
bSgpKTsKKyAgICAgICAgICAgIGlmIChwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSAmJiBwcm9ncmFt
LT52ZXJ0ZXhTaGFkZXIoKS0+aXNQZW5kaW5nU2hhZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBX
ZWJLaXRDU1NTaGFkZXJWYWx1ZSogc2hhZGVyVmFsdWUgPSBzdGF0aWNfY2FzdDxTdHlsZVBlbmRp
bmdTaGFkZXIqPihwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7Cisg
ICAgICAgICAgICAgICAgcHJvZ3JhbS0+c2V0VmVydGV4U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNo
ZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpICYmIHByb2dyYW0tPmZyYWdtZW50U2hh
ZGVyKCktPmlzUGVuZGluZ1NoYWRlcigpKSB7CisgICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hh
ZGVyVmFsdWUqIHNoYWRlclZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4o
cHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKSktPmNzc1NoYWRlclZhbHVlKCk7CisgICAgICAgICAg
ICAgICAgcHJvZ3JhbS0+c2V0RnJhZ21lbnRTaGFkZXIoc2hhZGVyVmFsdWUtPmNhY2hlZFNoYWRl
cihjYWNoZWRSZXNvdXJjZUxvYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnMoZmFsc2UpOworfQorCitzdGF0aWMg
Ym9vbCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0b3IoY29uc3QgUmVmUHRyPEN1c3RvbUZp
bHRlclBhcmFtZXRlcj4mIGEsIGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBi
KQoreworICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlTGVzc1RoYW4oYS0+bmFtZSgpLCBiLT5u
YW1lKCkpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gU3R5bGVSZXNv
bHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUs
IENTU1ZhbHVlTGlzdCogdmFsdWVzKQoreworICAgIFJlZlB0cjxDdXN0b21GaWx0ZXJBcnJheVBh
cmFtZXRlcj4gYXJyYXlQYXJhbWV0ZXIgPSBDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlcjo6Y3Jl
YXRlKG5hbWUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGxlbmd0aCA9IHZhbHVlcy0+bGVu
Z3RoKCk7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1
ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaSk7CisgICAgICAgIGlmICghdmFsdWUtPmlzUHJp
bWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBDU1NQcmltaXRp
dmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHZhbHVlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0g
Q1NTUHJpbWl0aXZlVmFsdWU6OkNTU19OVU1CRVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgYXJyYXlQYXJhbWV0ZXItPmFkZFZhbHVlKHByaW1pdGl2ZVZhbHVlLT5nZXREb3VibGVW
YWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGFycmF5UGFyYW1ldGVyLnJlbGVhc2UoKTsKK30K
KworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNl
Q3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVM
aXN0KiB2YWx1ZXMpCit7CisgICAgUmVmUHRyPEN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRlcj4g
bnVtYmVyUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyOjpjcmVhdGUobmFt
ZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy0+bGVuZ3RoKCk7ICsraSkg
eworICAgICAgICBDU1NWYWx1ZSogdmFsdWUgPSB2YWx1ZXMtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soaSk7CisgICAgICAgIGlmICghdmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUg
PSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKKyAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6OkNTU19O
VU1CRVIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbnVtYmVyUGFyYW1ldGVyLT5h
ZGRWYWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7CisgICAgfQorICAgIHJl
dHVybiBudW1iZXJQYXJhbWV0ZXIucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZp
bHRlclBhcmFtZXRlcj4gU3R5bGVSZXNvbHZlcjo6cGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zvcm1Q
YXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKK3sKKyAg
ICBSZWZQdHI8Q3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyPiB0cmFuc2Zvcm1QYXJhbWV0
ZXIgPSBDdXN0b21GaWx0ZXJUcmFuc2Zvcm1QYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKKyAgICBU
cmFuc2Zvcm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgY3JlYXRlVHJhbnNmb3JtT3BlcmF0
aW9ucyh2YWx1ZXMsIG1fc3RhdGUuc3R5bGUoKSwgbV9zdGF0ZS5yb290RWxlbWVudFN0eWxlKCks
IG9wZXJhdGlvbnMpOworICAgIHRyYW5zZm9ybVBhcmFtZXRlci0+c2V0T3BlcmF0aW9ucyhvcGVy
YXRpb25zKTsKKyAgICByZXR1cm4gdHJhbnNmb3JtUGFyYW1ldGVyLnJlbGVhc2UoKTsKK30KKwor
UGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3Vz
dG9tRmlsdGVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWUqIHBhcmFtZXRl
clZhbHVlKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgb3RoZXIgcGFyYW1ldGVycyB0eXBl
cyBwYXJzaW5nLgorICAgIC8vIGJvb2xlYW5zOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NzY0MzgKKyAgICAvLyB0ZXh0dXJlczogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTcxNDQyCisgICAgLy8gbWF0MiwgbWF0MywgbWF0NDogaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcxNDQ0CisgICAgLy8gTnVtYmVyIHBh
cmFtZXRlcnMgYXJlIHdyYXBwZWQgaW5zaWRlIGEgQ1NTVmFsdWVMaXN0IGFuZCBhbGwKKyAgICAv
LyB0aGUgb3RoZXIgZnVuY3Rpb25zIHZhbHVlcyBpbmhlcml0IGZyb20gQ1NTVmFsdWVMaXN0Lgor
ICAgIGlmICghcGFyYW1ldGVyVmFsdWUtPmlzVmFsdWVMaXN0KCkpCisgICAgICAgIHJldHVybiAw
OworCisgICAgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxpc3Qq
PihwYXJhbWV0ZXJWYWx1ZSk7CisgICAgaWYgKCF2YWx1ZXMtPmxlbmd0aCgpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGlmIChwYXJhbWV0ZXJWYWx1ZS0+aXNXZWJLaXRDU1NBcnJheUZ1bmN0
aW9uVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0
ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8vIElmIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbGlz
dCBpcyBhIHRyYW5zZm9ybSBmdW5jdGlvbiwKKyAgICAvLyB0aGVuIHdlIGNvdWxkIHNhZmVseSBh
c3N1bWUgdGhhdCBhbGwgdGhlIHJlbWFpbmluZyBpdGVtcworICAgIC8vIGFyZSB0cmFuc2Zvcm1z
LiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlciB3aWxsCisgICAgLy8gcmV0dXJu
IDAgaWYgdGhhdCBhc3N1bXB0aW9uIGlzIGluY29ycmVjdC4KKyAgICBpZiAodmFsdWVzLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDApLT5pc1dlYktpdENTU1RyYW5zZm9ybVZhbHVlKCkpCisgICAg
ICAgIHJldHVybiBwYXJzZUN1c3RvbUZpbHRlclRyYW5zZm9ybVBhcmFtZXRlcihuYW1lLCB2YWx1
ZXMpOworCisgICAgLy8gV2UgY2FuIGhhdmUgb25seSBhcnJheXMgb2YgYm9vbGVhbnMgb3IgbnVt
YmVycywgc28gdXNlIHRoZSBmaXJzdCB2YWx1ZSB0byBjaG9vc2UgYmV0d2VlbiB0aG9zZSB0d28u
CisgICAgLy8gV2UgbmVlZCB1cCB0byA0IHZhbHVlcyAoYWxsIGJvb2xlYW5zIG9yIGFsbCBudW1i
ZXJzKS4KKyAgICBpZiAoIXZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNQcmlt
aXRpdmVWYWx1ZSgpIHx8IHZhbHVlcy0+bGVuZ3RoKCkgPiA0KQorICAgICAgICByZXR1cm4gMDsK
KyAgICAKKyAgICBDU1NQcmltaXRpdmVWYWx1ZSogZmlyc3RQcmltaXRpdmVWYWx1ZSA9IHN0YXRp
Y19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KDApKTsKKyAgICBpZiAoZmlyc3RQcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpID09IENT
U1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQorICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21G
aWx0ZXJOdW1iZXJQYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKKworICAgIC8vIEZJWE1FOiBJbXBs
ZW1lbnQgdGhlIGJvb2xlYW4gYXJyYXkgcGFyYW1ldGVyIGhlcmUuCisgICAgLy8gaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4CisKKyAgICByZXR1cm4gMDsKK30K
KworYm9vbCBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QoQ1NT
VmFsdWUqIHBhcmFtZXRlcnNWYWx1ZSwgQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdCYgcGFyYW1l
dGVyTGlzdCkKK3sKKyAgICBIYXNoU2V0PFN0cmluZz4ga25vd25QYXJhbWV0ZXJOYW1lczsKKyAg
ICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBwYXJhbWV0ZXJJdGVyYXRvcihwYXJhbWV0ZXJzVmFsdWUp
OworICAgIGZvciAoOyBwYXJhbWV0ZXJJdGVyYXRvci5oYXNNb3JlKCk7IHBhcmFtZXRlckl0ZXJh
dG9yLmFkdmFuY2UoKSkgeworICAgICAgICBpZiAoIXBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkt
PmlzVmFsdWVMaXN0KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKHBhcmFtZXRlckl0ZXJhdG9yLnZhbHVlKCkpOworICAg
ICAgICBpZiAoIWl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlLT5wcmltaXRpdmVUeXBlKCkgIT0gQ1NTUHJpbWl0aXZlVmFsdWU6
OkNTU19TVFJJTkcpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAgICAg
ICBTdHJpbmcgbmFtZSA9IHByaW1pdGl2ZVZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOworICAgICAg
ICAvLyBEbyBub3QgYWxsb3cgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KKyAgICAgICAgaWYg
KGtub3duUGFyYW1ldGVyTmFtZXMuY29udGFpbnMobmFtZSkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIGtub3duUGFyYW1ldGVyTmFtZXMuYWRkKG5hbWUpOworICAgICAgICAK
KyAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKCFpdGVy
YXRvci5oYXNNb3JlKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIAorICAg
ICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJhbWV0ZXIgPSBwYXJzZUN1c3Rv
bUZpbHRlclBhcmFtZXRlcihuYW1lLCBpdGVyYXRvci52YWx1ZSgpKTsKKyAgICAgICAgaWYgKCFw
YXJhbWV0ZXIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHBhcmFtZXRlckxp
c3QuYXBwZW5kKHBhcmFtZXRlci5yZWxlYXNlKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBNYWtl
IHN1cmUgd2Ugc29ydCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIGRvd24gdG8g
dGhlIEN1c3RvbUZpbHRlck9wZXJhdGlvbi4KKyAgICBzdGQ6OnNvcnQocGFyYW1ldGVyTGlzdC5i
ZWdpbigpLCBwYXJhbWV0ZXJMaXN0LmVuZCgpLCBzb3J0UGFyYW1ldGVyc0J5TmFtZUNvbXBhcmF0
b3IpOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZpbHRl
ck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0
aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUp
Cit7CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBzdHlsZSByZXNvbHV0aW9uIGZvciB0aGUgY3Vz
dG9tIGZpbHRlciBhdC1ydWxlIHJlZmVyZW5jZSBzeW50YXguCisgICAgVU5VU0VEX1BBUkFNKGZp
bHRlclZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJP
cGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJ
bmxpbmVTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQoreworICAgIENT
U1ZhbHVlKiBzaGFkZXJzVmFsdWUgPSBmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
aygwKTsKKyAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihzaGFkZXJzVmFsdWUt
PmlzVmFsdWVMaXN0KCkpOworICAgIENTU1ZhbHVlTGlzdCogc2hhZGVyc0xpc3QgPSBzdGF0aWNf
Y2FzdDxDU1NWYWx1ZUxpc3QqPihzaGFkZXJzVmFsdWUpOworCisgICAgdW5zaWduZWQgc2hhZGVy
c0xpc3RMZW5ndGggPSBzaGFkZXJzTGlzdC0+bGVuZ3RoKCk7CisgICAgQVNTRVJUKHNoYWRlcnNM
aXN0TGVuZ3RoKTsKKworICAgIFJlZlB0cjxTdHlsZVNoYWRlcj4gdmVydGV4U2hhZGVyID0gc3R5
bGVTaGFkZXIoc2hhZGVyc0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCkpOworICAgIFJl
ZlB0cjxTdHlsZVNoYWRlcj4gZnJhZ21lbnRTaGFkZXI7CisgICAgQ3VzdG9tRmlsdGVyUHJvZ3Jh
bVR5cGUgcHJvZ3JhbVR5cGUgPSBQUk9HUkFNX1RZUEVfQkxFTkRTX0VMRU1FTlRfVEVYVFVSRTsK
KyAgICBDdXN0b21GaWx0ZXJQcm9ncmFtTWl4U2V0dGluZ3MgbWl4U2V0dGluZ3M7CisKKyAgICBp
ZiAoc2hhZGVyc0xpc3RMZW5ndGggPiAxKSB7CisgICAgICAgIENTU1ZhbHVlKiBmcmFnbWVudFNo
YWRlck9yTWl4RnVuY3Rpb24gPSBzaGFkZXJzTGlzdC0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygx
KTsKKworICAgICAgICBpZiAoZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uLT5pc1dlYktpdENT
U01peEZ1bmN0aW9uVmFsdWUoKSkgeworICAgICAgICAgICAgV2ViS2l0Q1NTTWl4RnVuY3Rpb25W
YWx1ZSogbWl4RnVuY3Rpb24gPSBzdGF0aWNfY2FzdDxXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVl
Kj4oZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uKTsKKyAgICAgICAgICAgIENTU1ZhbHVlTGlz
dEl0ZXJhdG9yIGl0ZXJhdG9yKG1peEZ1bmN0aW9uKTsKKworICAgICAgICAgICAgQVNTRVJUKG1p
eEZ1bmN0aW9uLT5sZW5ndGgoKSk7CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxl
U2hhZGVyKGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgp
OworCisgICAgICAgICAgICBBU1NFUlQobWl4RnVuY3Rpb24tPmxlbmd0aCgpIDw9IDMpOworICAg
ICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc01vcmUoKSkgeworICAgICAgICAgICAgICAgIENT
U1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKENTU1BhcnNl
cjo6aXNCbGVuZE1vZGUocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkpKQorICAgICAgICAgICAg
ICAgICAgICBtaXhTZXR0aW5ncy5ibGVuZE1vZGUgPSAqcHJpbWl0aXZlVmFsdWU7CisgICAgICAg
ICAgICAgICAgZWxzZSBpZiAoQ1NTUGFyc2VyOjppc0NvbXBvc2l0ZU9wZXJhdG9yKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpKSkKKyAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuY29t
cG9zaXRlT3BlcmF0b3IgPSAqcHJpbWl0aXZlVmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgICAg
ICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBwcm9ncmFtVHlwZSA9IFBST0dSQU1fVFlQRV9OT19FTEVNRU5UX1RFWFRVUkU7
CisgICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IHN0eWxlU2hhZGVyKGZyYWdtZW50U2hhZGVy
T3JNaXhGdW5jdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdW5zaWduZWQgbWVz
aFJvd3MgPSAxOworICAgIHVuc2lnbmVkIG1lc2hDb2x1bW5zID0gMTsKKyAgICBDdXN0b21GaWx0
ZXJNZXNoVHlwZSBtZXNoVHlwZSA9IE1lc2hUeXBlQXR0YWNoZWQ7CisgICAgCisgICAgQ1NTVmFs
dWUqIHBhcmFtZXRlcnNWYWx1ZSA9IDA7CisgICAgCisgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSA+IDEpIHsKKyAgICAgICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaXRlcmF0b3IoZmlsdGVy
VmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOworICAgICAgICAKKyAgICAgICAgLy8g
VGhlIHNlY29uZCB2YWx1ZSBtaWdodCBiZSB0aGUgbWVzaCBib3ggb3IgdGhlIGxpc3Qgb2YgcGFy
YW1ldGVyczoKKyAgICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggYSBudW1iZXIgb3IgYW55IG9m
IHRoZSBtZXNoLWJveCBpZGVudGlmaWVycyBpdCBpcyAKKyAgICAgICAgLy8gdGhlIG1lc2gtYm94
IGxpc3QsIGlmIG5vdCBpdCBtZWFucyBpdCBpcyB0aGUgcGFyYW1ldGVycyBsaXN0LgorCisgICAg
ICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQcmltaXRpdmVWYWx1ZSgp
KSB7CisgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOworICAgICAgICAg
ICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc051bWJlcigpKSB7CisgICAgICAgICAgICAgICAgLy8g
SWYgb25seSBvbmUgaW50ZWdlciB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgc2V0IGJvdGgK
KyAgICAgICAgICAgICAgICAvLyB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMuCisgICAgICAgICAg
ICAgICAgbWVzaENvbHVtbnMgPSBtZXNoUm93cyA9IHByaW1pdGl2ZVZhbHVlLT5nZXRJbnRWYWx1
ZSgpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAg
ICAKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW5vdGhlciBudW1iZXIgZm9yIHRo
ZSByb3dzLgorICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0
b3IuaXNQcmltaXRpdmVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2
ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4o
aXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+aXNOdW1iZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzaFJvd3MgPSBwcmlt
aXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJh
dG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGl0ZXJhdG9y
Lmhhc01vcmUoKSAmJiBpdGVyYXRvci5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKKyAgICAgICAgICAg
IENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4oaXRlcmF0b3IudmFsdWUoKSk7CisgICAgICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVEZXRhY2hlZCkgeworICAgICAgICAgICAgICAg
IG1lc2hUeXBlID0gTWVzaFR5cGVEZXRhY2hlZDsKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5h
ZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
ICghaXRlcmF0b3IuaW5kZXgoKSkgeworICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUgd2FzIGNv
bnN1bWVkIGZyb20gdGhlIG1lc2ggdmFsdWUsIHRoZW4gaXQgaXMganVzdCBhIHBhcmFtZXRlciBs
aXN0LCBtZWFuaW5nIHRoYXQgd2UgZW5kIHVwCisgICAgICAgICAgICAvLyBoYXZpbmcganVzdCB0
d28gQ1NTTGlzdFZhbHVlczogbGlzdCBvZiBzaGFkZXJzIGFuZCBsaXN0IG9mIHBhcmFtZXRlcnMu
CisgICAgICAgICAgICBBU1NFUlQoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDIpOworICAgICAg
ICAgICAgcGFyYW1ldGVyc1ZhbHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5n
dGgoKSA+IDIgJiYgIXBhcmFtZXRlcnNWYWx1ZSkKKyAgICAgICAgcGFyYW1ldGVyc1ZhbHVlID0g
ZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMik7CisgICAgCisgICAgQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyTGlzdCBwYXJhbWV0ZXJMaXN0OworICAgIGlmIChwYXJhbWV0ZXJzVmFs
dWUgJiYgIXBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChwYXJhbWV0ZXJzVmFsdWUsIHBh
cmFtZXRlckxpc3QpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBSZWZQdHI8U3R5bGVD
dXN0b21GaWx0ZXJQcm9ncmFtPiBwcm9ncmFtID0gU3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtOjpj
cmVhdGUodmVydGV4U2hhZGVyLnJlbGVhc2UoKSwgZnJhZ21lbnRTaGFkZXIucmVsZWFzZSgpLCBw
cm9ncmFtVHlwZSwgbWl4U2V0dGluZ3MsIG1lc2hUeXBlKTsKKyAgICByZXR1cm4gQ3VzdG9tRmls
dGVyT3BlcmF0aW9uOjpjcmVhdGUocHJvZ3JhbS5yZWxlYXNlKCksIHBhcmFtZXRlckxpc3QsIG1l
c2hSb3dzLCBtZXNoQ29sdW1ucywgbWVzaFR5cGUpOworfQorCitQYXNzUmVmUHRyPEN1c3RvbUZp
bHRlck9wZXJhdGlvbj4gU3R5bGVSZXNvbHZlcjo6Y3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9u
KFdlYktpdENTU0ZpbHRlclZhbHVlKiBmaWx0ZXJWYWx1ZSkKK3sKKyAgICBBU1NFUlQoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpKTsKKyAgICBib29sIGlzQXRSdWxlUmVmZXJlbmNlU3ludGF4ID0gZmls
dGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKTsK
KyAgICByZXR1cm4gaXNBdFJ1bGVSZWZlcmVuY2VTeW50YXggPyBjcmVhdGVDdXN0b21GaWx0ZXJP
cGVyYXRpb25XaXRoQXRSdWxlUmVmZXJlbmNlU3ludGF4KGZpbHRlclZhbHVlKSA6IGNyZWF0ZUN1
c3RvbUZpbHRlck9wZXJhdGlvbldpdGhJbmxpbmVTeW50YXgoZmlsdGVyVmFsdWUpOworfQorCisj
ZW5kaWYKKworYm9vbCBTdHlsZVJlc29sdmVyOjpjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1Zh
bHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUs
IEZpbHRlck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpCit7CisgICAgQVNTRVJUKG91dE9wZXJh
dGlvbnMuaXNFbXB0eSgpKTsKKyAgICAKKyAgICBpZiAoIWluVmFsdWUpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAKKyAgICBpZiAoaW5WYWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKSB7Cisg
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENT
U1ByaW1pdGl2ZVZhbHVlKj4oaW5WYWx1ZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+
Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgaWYgKCFpblZhbHVlLT5pc1ZhbHVlTGlzdCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBmbG9hdCB6b29tRmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0
aXZlWm9vbSgpIDogMTsKKyAgICBGaWx0ZXJPcGVyYXRpb25zIG9wZXJhdGlvbnM7CisgICAgZm9y
IChDU1NWYWx1ZUxpc3RJdGVyYXRvciBpID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5j
ZSgpKSB7CisgICAgICAgIENTU1ZhbHVlKiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7CisgICAgICAg
IGlmICghY3VyclZhbHVlLT5pc1dlYktpdENTU0ZpbHRlclZhbHVlKCkpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmlsdGVyVmFsdWUgPSBz
dGF0aWNfY2FzdDxXZWJLaXRDU1NGaWx0ZXJWYWx1ZSo+KGkudmFsdWUoKSk7CisgICAgICAgIEZp
bHRlck9wZXJhdGlvbjo6T3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gZmlsdGVyT3BlcmF0
aW9uRm9yVHlwZShmaWx0ZXJWYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKTsKKworI2lmIEVOQUJMRShD
U1NfU0hBREVSUykKKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9u
OjpWQUxJREFURURfQ1VTVE9NKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZWRDdXN0b21GaWx0
ZXJPcGVyYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGVuZCB1cCBpbiB0aGUgUmVuZGVyU3R5bGUu
CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlv
bjo6Q1VTVE9NKSB7CisgICAgICAgICAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBv
cGVyYXRpb24gPSBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24oZmlsdGVyVmFsdWUpOworICAg
ICAgICAgICAgaWYgKCFvcGVyYXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQo
b3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYKKyAg
ICAgICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVOQ0UpIHsK
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAh
PSAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ1NTVmFsdWUqIGFy
Z3VtZW50ID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7CisKKyAgICAg
ICAgICAgIGlmICghYXJndW1lbnQtPmlzV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSgpKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBXZWJLaXRDU1NTVkdEb2N1bWVu
dFZhbHVlKiBzdmdEb2N1bWVudFZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTU1ZHRG9jdW1l
bnRWYWx1ZSo+KGFyZ3VtZW50KTsKKyAgICAgICAgICAgIEtVUkwgdXJsID0gbV9zdGF0ZS5kb2N1
bWVudCgpLT5jb21wbGV0ZVVSTChzdmdEb2N1bWVudFZhbHVlLT51cmwoKSk7CisKKyAgICAgICAg
ICAgIFJlZlB0cjxSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb24+IG9wZXJhdGlvbiA9IFJlZmVyZW5j
ZUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN2Z0RvY3VtZW50VmFsdWUtPnVybCgpLCB1cmwuZnJh
Z21lbnRJZGVudGlmaWVyKCksIG9wZXJhdGlvblR5cGUpOworICAgICAgICAgICAgaWYgKFNWR1VS
SVJlZmVyZW5jZTo6aXNFeHRlcm5hbFVSSVJlZmVyZW5jZShzdmdEb2N1bWVudFZhbHVlLT51cmwo
KSwgbV9zdGF0ZS5kb2N1bWVudCgpKSkgeworICAgICAgICAgICAgICAgIGlmICghc3ZnRG9jdW1l
bnRWYWx1ZS0+bG9hZFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnBl
bmRpbmdTVkdEb2N1bWVudHMoKS5zZXQob3BlcmF0aW9uLmdldCgpLCBzdmdEb2N1bWVudFZhbHVl
KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdE
b2N1bWVudCgpKQorICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24tPnNldENhY2hlZFNWR0Rv
Y3VtZW50UmVmZXJlbmNlKGFkb3B0UHRyKG5ldyBDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShz
dmdEb2N1bWVudFZhbHVlLT5jYWNoZWRTVkdEb2N1bWVudCgpKSkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7Cisj
ZW5kaWYKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hl
Y2sgdGhhdCBhbGwgcGFyYW1ldGVycyBhcmUgcHJpbWl0aXZlIHZhbHVlcywgd2l0aCB0aGUKKyAg
ICAgICAgLy8gZXhjZXB0aW9uIG9mIGRyb3Agc2hhZG93IHdoaWNoIGhhcyBhIFNoYWRvd1ZhbHVl
IHBhcmFtZXRlci4KKyAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gRmlsdGVyT3BlcmF0aW9u
OjpEUk9QX1NIQURPVykgeworICAgICAgICAgICAgYm9vbCBoYXZlTm9uUHJpbWl0aXZlVmFsdWUg
PSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBmaWx0ZXJWYWx1
ZS0+bGVuZ3RoKCk7ICsraikgeworICAgICAgICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZlVmFsdWUoKSkgeworICAgICAgICAg
ICAgICAgICAgICBoYXZlTm9uUHJpbWl0aXZlVmFsdWUgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBpZiAoaGF2ZU5vblByaW1pdGl2ZVZhbHVlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICB9CisKKyAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIGZpcnN0VmFsdWUgPSBmaWx0
ZXJWYWx1ZS0+bGVuZ3RoKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpbHRl
clZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDApKSA6IDA7CisgICAgICAgIHN3aXRjaCAo
ZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkgeworICAgICAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6OlNlcGlhRmlsdGVyT3BlcmF0aW9uOgorICAgICAgICBjYXNlIFdlYktp
dENTU0ZpbHRlclZhbHVlOjpTYXR1cmF0ZUZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAg
ZG91YmxlIGFtb3VudCA9IDE7CisgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgp
ID09IDEpIHsKKyAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVW
YWx1ZSgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkK
KyAgICAgICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29sb3JNYXRyaXhG
aWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlvbjogeworICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0g
MDsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkKKyAgICAgICAg
ICAgICAgICBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7CisKKyAgICAgICAg
ICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVy
T3BlcmF0aW9uOjpjcmVhdGUoYW5nbGUsIG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkludmVy
dEZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6QnJp
Z2h0bmVzc0ZpbHRlck9wZXJhdGlvbjoKKyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRpb246CisgICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVy
VmFsdWU6Ok9wYWNpdHlGaWx0ZXJPcGVyYXRpb246IHsKKyAgICAgICAgICAgIGRvdWJsZSBhbW91
bnQgPSAoZmlsdGVyVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NGaWx0ZXJWYWx1
ZTo6QnJpZ2h0bmVzc0ZpbHRlck9wZXJhdGlvbikgPyAwIDogMTsKKyAgICAgICAgICAgIGlmIChm
aWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGFtb3VudCA9IGZp
cnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFs
dWUtPmlzUGVyY2VudGFnZSgpKQorICAgICAgICAgICAgICAgICAgICBhbW91bnQgLz0gMTAwOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBl
bmQoQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFtb3VudCwg
b3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Qmx1ckZpbHRlck9wZXJhdGlvbjogeworICAgICAg
ICAgICAgTGVuZ3RoIHN0ZERldmlhdGlvbiA9IExlbmd0aCgwLCBGaXhlZCk7CisgICAgICAgICAg
ICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID49IDEpCisgICAgICAgICAgICAgICAgc3RkRGV2
aWF0aW9uID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1ZSwgc3R5bGUsIHJvb3RTdHls
ZSwgem9vbUZhY3Rvcik7CisgICAgICAgICAgICBpZiAoc3RkRGV2aWF0aW9uLmlzVW5kZWZpbmVk
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBvcGVyYXRp
b25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoQmx1ckZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHN0ZERl
dmlhdGlvbiwgb3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6RHJvcFNoYWRvd0ZpbHRlck9wZXJh
dGlvbjogeworICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSAhPSAxKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgQ1NTVmFsdWUqIGNzc1Zh
bHVlID0gZmlsdGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7CisgICAgICAgICAg
ICBpZiAoIWNzc1ZhbHVlLT5pc1NoYWRvd1ZhbHVlKCkpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgICAgIFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93
VmFsdWUqPihjc3NWYWx1ZSk7CisgICAgICAgICAgICBJbnRQb2ludCBsb2NhdGlvbihpdGVtLT54
LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvciksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT55LT5jb21wdXRlTGVuZ3RoPGludD4oc3R5
bGUsIHJvb3RTdHlsZSwgem9vbUZhY3RvcikpOworICAgICAgICAgICAgaW50IGJsdXIgPSBpdGVt
LT5ibHVyID8gaXRlbS0+Ymx1ci0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUs
IHpvb21GYWN0b3IpIDogMDsKKyAgICAgICAgICAgIENvbG9yIGNvbG9yOworICAgICAgICAgICAg
aWYgKGl0ZW0tPmNvbG9yKQorICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0
aXZlVmFsdWUoaXRlbS0+Y29sb3IuZ2V0KCkpOworCisgICAgICAgICAgICBvcGVyYXRpb25zLm9w
ZXJhdGlvbnMoKS5hcHBlbmQoRHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGxvY2F0
aW9uLCBibHVyLCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9yOjp0cmFuc3BhcmVudCwg
b3BlcmF0aW9uVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRPcGVyYXRpb25zID0gb3BlcmF0
aW9uczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKK1Bhc3NSZWZQdHI8U3R5bGVJ
bWFnZT4gU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSog
cGVuZGluZ0ltYWdlKQoreworICAgIENhY2hlZFJlc291cmNlTG9hZGVyKiBjYWNoZWRSZXNvdXJj
ZUxvYWRlciA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y2FjaGVkUmVzb3VyY2VMb2FkZXIoKTsKKwor
ICAgIGlmIChwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlVmFsdWUoKSkgeworICAgICAgICBDU1NJbWFn
ZVZhbHVlKiBpbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZVZhbHVlKCk7CisgICAg
ICAgIHJldHVybiBpbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNoZWRSZXNvdXJjZUxvYWRlcik7
CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VHZW5lcmF0b3JWYWx1ZSgp
KSB7CisgICAgICAgIENTU0ltYWdlR2VuZXJhdG9yVmFsdWUqIGltYWdlR2VuZXJhdG9yVmFsdWUg
PSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKTsKKyAgICAgICAgaW1hZ2VH
ZW5lcmF0b3JWYWx1ZS0+bG9hZFN1YmltYWdlcyhjYWNoZWRSZXNvdXJjZUxvYWRlcik7CisgICAg
ICAgIHJldHVybiBTdHlsZUdlbmVyYXRlZEltYWdlOjpjcmVhdGUoaW1hZ2VHZW5lcmF0b3JWYWx1
ZSk7CisgICAgfQorCisgICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzQ3Vyc29ySW1hZ2VWYWx1ZSgp
KSB7CisgICAgICAgIENTU0N1cnNvckltYWdlVmFsdWUqIGN1cnNvckltYWdlVmFsdWUgPSBwZW5k
aW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGN1cnNvcklt
YWdlVmFsdWUtPmNhY2hlZEltYWdlKGNhY2hlZFJlc291cmNlTG9hZGVyKTsKKyAgICB9CisKKyNp
ZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKKyAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJbWFnZVNl
dFZhbHVlKCkpIHsKKyAgICAgICAgQ1NTSW1hZ2VTZXRWYWx1ZSogaW1hZ2VTZXRWYWx1ZSA9IHBl
bmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gaW1hZ2VTZXRW
YWx1ZS0+Y2FjaGVkSW1hZ2VTZXQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOworICAgIH0KKyNlbmRp
ZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdJ
bWFnZXMoKQoreworICAgIGlmIChtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOjpj
b25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMo
KS5lbmQoKS5rZXlzKCk7CisgICAgZm9yIChQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3Rf
aXRlcmF0b3I6OktleXMgaXQgPSBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5iZWdp
bigpLmtleXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIENTU1Byb3BlcnR5SUQgY3Vy
cmVudFByb3BlcnR5ID0gKml0OworCisgICAgICAgIHN3aXRjaCAoY3VycmVudFByb3BlcnR5KSB7
CisgICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kSW1hZ2U6IHsKKyAgICAgICAgICAg
IGZvciAoRmlsbExheWVyKiBiYWNrZ3JvdW5kTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vz
c0JhY2tncm91bmRMYXllcnMoKTsgYmFja2dyb3VuZExheWVyOyBiYWNrZ3JvdW5kTGF5ZXIgPSBi
YWNrZ3JvdW5kTGF5ZXItPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5k
TGF5ZXItPmltYWdlKCkgJiYgYmFja2dyb3VuZExheWVyLT5pbWFnZSgpLT5pc1BlbmRpbmdJbWFn
ZSgpKQorICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kTGF5ZXItPnNldEltYWdlKGxvYWRQ
ZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihiYWNrZ3JvdW5kTGF5
ZXItPmltYWdlKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5Q29udGVudDogeworICAgICAgICAgICAgZm9y
IChDb250ZW50RGF0YSogY29udGVudERhdGEgPSBjb25zdF9jYXN0PENvbnRlbnREYXRhKj4obV9z
dGF0ZS5zdHlsZSgpLT5jb250ZW50RGF0YSgpKTsgY29udGVudERhdGE7IGNvbnRlbnREYXRhID0g
Y29udGVudERhdGEtPm5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZW50RGF0YS0+
aXNJbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0eWxlSW1hZ2UqIGltYWdlID0gc3Rh
dGljX2Nhc3Q8SW1hZ2VDb250ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+aW1hZ2UoKTsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBSZWZQdHI8U3R5bGVJbWFnZT4gbG9hZGVkSW1hZ2UgPSBsb2FkUGVuZGlu
Z0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGlmIChsb2FkZWRJbWFnZSkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxJbWFnZUNvbnRlbnREYXRhKj4oY29udGVudERhdGEpLT5zZXRJbWFn
ZShsb2FkZWRJbWFnZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUN1cnNvcjogeworICAgICAgICAgICAgaWYgKEN1cnNv
ckxpc3QqIGN1cnNvckxpc3QgPSBtX3N0YXRlLnN0eWxlKCktPmN1cnNvcnMoKSkgeworICAgICAg
ICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3Vyc29yTGlzdC0+c2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgICAgICAgICAgICAgQ3Vyc29yRGF0YSYgY3VycmVudEN1cnNvciA9IGN1cnNv
ckxpc3QtPmF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoU3R5bGVJbWFnZSogaW1hZ2Ug
PSBjdXJyZW50Q3Vyc29yLmltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChp
bWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJy
ZW50Q3Vyc29yLnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5k
aW5nSW1hZ2UqPihpbWFnZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZTogeworICAgICAgICAgICAgaWYgKG1f
c3RhdGUuc3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPmxpc3RT
dHlsZUltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAgICAgICAgICAgICAgbV9zdGF0ZS5z
dHlsZSgpLT5zZXRMaXN0U3R5bGVJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0
eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpKSkpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eUJv
cmRlckltYWdlU291cmNlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgpLT5ib3Jk
ZXJJbWFnZVNvdXJjZSgpICYmIG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKS0+
aXNQZW5kaW5nSW1hZ2UoKSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldEJv
cmRlckltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5n
SW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCkpKSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94
UmVmbGVjdDogeworICAgICAgICAgICAgaWYgKFN0eWxlUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9
IG1fc3RhdGUuc3R5bGUoKS0+Ym94UmVmbGVjdCgpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qg
TmluZVBpZWNlSW1hZ2UmIG1hc2tJbWFnZSA9IHJlZmxlY3Rpb24tPm1hc2soKTsKKyAgICAgICAg
ICAgICAgICBpZiAobWFza0ltYWdlLmltYWdlKCkgJiYgbWFza0ltYWdlLmltYWdlKCktPmlzUGVu
ZGluZ0ltYWdlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxlSW1hZ2U+IGxv
YWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFn
ZSo+KG1hc2tJbWFnZS5pbWFnZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24t
PnNldE1hc2soTmluZVBpZWNlSW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpLCBtYXNrSW1hZ2Uu
aW1hZ2VTbGljZXMoKSwgbWFza0ltYWdlLmZpbGwoKSwgbWFza0ltYWdlLmJvcmRlclNsaWNlcygp
LCBtYXNrSW1hZ2Uub3V0c2V0KCksIG1hc2tJbWFnZS5ob3Jpem9udGFsUnVsZSgpLCBtYXNrSW1h
Z2UudmVydGljYWxSdWxlKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlU291cmNlOiB7CisgICAgICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZSgp
LT5tYXNrQm94SW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNv
dXJjZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQorICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUo
KS0+c2V0TWFza0JveEltYWdlU291cmNlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5
bGVQZW5kaW5nSW1hZ2UqPihtX3N0YXRlLnN0eWxlKCktPm1hc2tCb3hJbWFnZVNvdXJjZSgpKSkp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hc2tJbWFnZTogeworICAgICAgICAgICAgZm9yIChGaWxsTGF5ZXIqIG1hc2tMYXll
ciA9IG1fc3RhdGUuc3R5bGUoKS0+YWNjZXNzTWFza0xheWVycygpOyBtYXNrTGF5ZXI7IG1hc2tM
YXllciA9IG1hc2tMYXllci0+bmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hc2tMYXll
ci0+aW1hZ2UoKSAmJiBtYXNrTGF5ZXItPmltYWdlKCktPmlzUGVuZGluZ0ltYWdlKCkpCisgICAg
ICAgICAgICAgICAgICAgIG1hc2tMYXllci0+c2V0SW1hZ2UobG9hZFBlbmRpbmdJbWFnZShzdGF0
aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1hc2tMYXllci0+aW1hZ2UoKSkpKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6
CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIG1fc3RhdGUucGVuZGluZ0ltYWdlUHJvcGVydGllcygpLmNsZWFyKCk7Cit9CisKK3ZvaWQg
U3R5bGVSZXNvbHZlcjo6bG9hZFBlbmRpbmdSZXNvdXJjZXMoKQoreworICAgIC8vIFN0YXJ0IGxv
YWRpbmcgaW1hZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KKyAgICBsb2FkUGVuZGluZ0lt
YWdlcygpOworCisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIC8vIFN0YXJ0IGxvYWRpbmcg
dGhlIHNoYWRlcnMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nU2hh
ZGVycygpOworI2VuZGlmCisgICAgCisjaWYgRU5BQkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUo
U1ZHKQorICAgIC8vIFN0YXJ0IGxvYWRpbmcgdGhlIFNWRyBEb2N1bWVudHMgcmVmZXJlbmNlZCBi
eSB0aGlzIHN0eWxlLgorICAgIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRzKCk7CisjZW5kaWYKK30K
KworaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzOjpNYXRjaGVkUHJvcGVy
dGllcygpCisgICAgOiBwb3NzaWJseVBhZGRlZE1lbWJlcigwKQoreworfQorCitpbmxpbmUgU3R5
bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6On5NYXRjaGVkUHJvcGVydGllcygpCit7Cit9
CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXM6OnJlcG9ydE1lbW9yeVVz
YWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVt
b3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5
cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKHByb3BlcnRpZXMsICJwcm9wZXJ0aWVzIik7
Cit9CisKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW06OnJl
cG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0
Cit7CisgICAgTWVtb3J5Q2xhc3NJbmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2Vi
Q29yZU1lbW9yeVR5cGVzOjpDU1MpOworICAgIGluZm8uYWRkTWVtYmVyKG1hdGNoZWRQcm9wZXJ0
aWVzLCAibWF0Y2hlZFByb3BlcnRpZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihyYW5nZXMsICJy
YW5nZXMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihyZW5kZXJTdHlsZSwgInJlbmRlclN0eWxlIik7
CisgICAgaW5mby5hZGRNZW1iZXIocGFyZW50UmVuZGVyU3R5bGUsICJwYXJlbnRSZW5kZXJTdHls
ZSIpOworfQorCit2b2lkIE1lZGlhUXVlcnlSZXN1bHQ6OnJlcG9ydE1lbW9yeVVzYWdlKE1lbW9y
eU9iamVjdEluZm8qIG1lbW9yeU9iamVjdEluZm8pIGNvbnN0Cit7CisgICAgTWVtb3J5Q2xhc3NJ
bmZvIGluZm8obWVtb3J5T2JqZWN0SW5mbywgdGhpcywgV2ViQ29yZU1lbW9yeVR5cGVzOjpDU1Mp
OworICAgIGluZm8uYWRkTWVtYmVyKG1fZXhwcmVzc2lvbiwgImV4cHJlc3Npb24iKTsKK30KKwor
dm9pZCBTdHlsZVJlc29sdmVyOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBt
ZW1vcnlPYmplY3RJbmZvKSBjb25zdAoreworICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9y
eU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKKyAgICBpbmZvLmFk
ZE1lbWJlcihtX3J1bGVTZXRzLCAicnVsZVNldHMiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX2tl
eWZyYW1lc1J1bGVNYXAsICJrZXlmcmFtZXNSdWxlTWFwIik7CisgICAgaW5mby5hZGRNZW1iZXIo
bV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZSIpOworICAg
IGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXIsICJtYXRj
aGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lciIpOworCisgICAgaW5mby5hZGRNZW1iZXIobV9t
ZWRpdW0sICJtZWRpdW0iKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3Jvb3REZWZhdWx0U3R5bGUs
ICJyb290RGVmYXVsdFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIobV9kb2N1bWVudCwgImRv
Y3VtZW50Iik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX2ZvbnRTZWxlY3RvciwgImZvbnRTZWxl
Y3RvciIpOworICAgIGluZm8uYWRkTWVtYmVyKG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1ZXJ5
UmVzdWx0cywgInZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMiKTsKKyAgICBpbmZv
Lmlnbm9yZU1lbWJlcihtX3N0eWxlQnVpbGRlcik7CisgICAgaW5mby5hZGRNZW1iZXIobV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzKTsKKyAgICBpbmZvLmFkZE1lbWJlcihtX3Njb3BlUmVzb2x2ZXIs
ICJzY29wZVJlc29sdmVyIik7CisKKyAgICBpbmZvLmFkZE1lbWJlcihtX3N0YXRlLCAic3RhdGUi
KTsKKworICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgdG8gYSBwbGFjZSB3aGVyZSBpdCB3b3VsZCBi
ZSBjYWxsZWQgb25seSBvbmNlPworICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNo
ZWV0czo6ZGVmYXVsdFN0eWxlLCAiZGVmYXVsdFN0eWxlIik7CisgICAgaW5mby5hZGRNZW1iZXIo
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUsICJkZWZhdWx0UXVpcmtz
U3R5bGUiKTsKKyAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1
bHRQcmludFN0eWxlLCJkZWZhdWx0UHJpbnRTdHlsZSIpOworICAgIGluZm8uYWRkTWVtYmVyKENT
U0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFZpZXdTb3VyY2VTdHlsZSwgImRlZmF1bHRWaWV3
U291cmNlU3R5bGUiKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNl
L1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCShyZXZpc2lvbiAxNDUxODEpCisrKyBT
b3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yNyw1MTYxICsyNywxMDQgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVk
ZSAiU3R5bGVSZXNvbHZlci5oIgorI2luY2x1ZGUgIlBhZ2VSdWxlQ29sbGVjdG9yLmgiCiAKLSNp
bmNsdWRlICJBdHRyaWJ1dGUuaCIKLSNpbmNsdWRlICJDU1NCb3JkZXJJbWFnZS5oIgotI2luY2x1
ZGUgIkNTU0NhbGN1bGF0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NDdXJzb3JJbWFnZVZhbHVl
LmgiCiAjaW5jbHVkZSAiQ1NTRGVmYXVsdFN0eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAiQ1NTRm9u
dEZhY2VSdWxlLmgiCi0jaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiQ1NT
TGluZUJveENvbnRhaW5WYWx1ZS5oIgotI2luY2x1ZGUgIkNTU1BhZ2VSdWxlLmgiCi0jaW5jbHVk
ZSAiQ1NTUGFyc2VyLmgiCi0jaW5jbHVkZSAiQ1NTUHJpbWl0aXZlVmFsdWVNYXBwaW5ncy5oIgot
I2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRlICJDU1NSZWZsZWN0VmFsdWUu
aCIKLSNpbmNsdWRlICJDU1NTZWxlY3Rvci5oIgotI2luY2x1ZGUgIkNTU1NlbGVjdG9yTGlzdC5o
IgotI2luY2x1ZGUgIkNTU1N0eWxlUnVsZS5oIgotI2luY2x1ZGUgIkNTU1N1cHBvcnRzUnVsZS5o
IgotI2luY2x1ZGUgIkNTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDU1NWYWx1
ZUxpc3QuaCIKLSNpZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSNpbmNsdWRlICJDU1NWYXJpYWJs
ZVZhbHVlLmgiCi0jZW5kaWYKLSNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIkNh
bGN1bGF0aW9uVmFsdWUuaCIKLSNpbmNsdWRlICJDb250ZW50RGF0YS5oIgotI2luY2x1ZGUgIkNv
bnRleHRGZWF0dXJlcy5oIgotI2luY2x1ZGUgIkNvdW50ZXIuaCIKLSNpbmNsdWRlICJDb3VudGVy
Q29udGVudC5oIgotI2luY2x1ZGUgIkN1cnNvckxpc3QuaCIKLSNpbmNsdWRlICJEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAiRWxlbWVudFNoYWRvdy5oIgotI2luY2x1
ZGUgIkZvbnRGZWF0dXJlVmFsdWUuaCIKLSNpbmNsdWRlICJGb250VmFsdWUuaCIKLSNpbmNsdWRl
ICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lU2VsZWN0aW9uLmgiCi0jaW5jbHVkZSAiRnJhbWVW
aWV3LmgiCi0jaW5jbHVkZSAiSFRNTERvY3VtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElGcmFtZUVs
ZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5h
bWVzLmgiCi0jaW5jbHVkZSAiSFRNTE9wdGlvbkVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MUHJv
Z3Jlc3NFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTFN0eWxlRWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKLSNpbmNsdWRlICJJbnNlcnRpb25Qb2ludC5oIgotI2lu
Y2x1ZGUgIkluc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oIgotI2luY2x1ZGUgIktleWZyYW1lTGlz
dC5oIgotI2luY2x1ZGUgIkxpbmtIYXNoLmgiCi0jaW5jbHVkZSAiTG9jYWxlVG9TY3JpcHRNYXBw
aW5nLmgiCi0jaW5jbHVkZSAiTWF0aE1MTmFtZXMuaCIKLSNpbmNsdWRlICJNYXRyaXgzRFRyYW5z
Zm9ybU9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIk1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbi5oIgot
I2luY2x1ZGUgIk1lZGlhTGlzdC5oIgotI2luY2x1ZGUgIk1lZGlhUXVlcnlFdmFsdWF0b3IuaCIK
LSNpbmNsdWRlICJOb2RlUmVuZGVyU3R5bGUuaCIKLSNpbmNsdWRlICJOb2RlUmVuZGVyaW5nQ29u
dGV4dC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQYWlyLmgiCi0jaW5jbHVkZSAi
UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJRdW90ZXNEYXRhLmgi
Ci0jaW5jbHVkZSAiUmVjdC5oIgotI2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgotI2luY2x1ZGUg
IlJlbmRlclNjcm9sbGJhci5oIgotI2luY2x1ZGUgIlJlbmRlclNjcm9sbGJhclRoZW1lLmgiCi0j
aW5jbHVkZSAiUmVuZGVyU3R5bGVDb25zdGFudHMuaCIKLSNpbmNsdWRlICJSZW5kZXJUaGVtZS5o
IgotI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKLSNpbmNsdWRlICJSb3RhdGVUcmFuc2Zvcm1PcGVy
YXRpb24uaCIKLSNpbmNsdWRlICJSdWxlU2V0LmgiCi0jaW5jbHVkZSAiU1ZHRG9jdW1lbnRFeHRl
bnNpb25zLmgiCi0jaW5jbHVkZSAiU1ZHRm9udEZhY2VFbGVtZW50LmgiCi0jaW5jbHVkZSAiU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgotI2lu
Y2x1ZGUgIlNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIK
LSNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCi0jaW5jbHVkZSAiU2hhZG93Um9vdC5oIgotI2luY2x1
ZGUgIlNoYWRvd1ZhbHVlLmgiCi0jaW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdpZXMu
aCIKLSNpbmNsdWRlICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCi0jaW5jbHVkZSAiU3R5bGVC
dWlsZGVyLmgiCi0jaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgotI2luY2x1ZGUgIlN0eWxl
R2VuZXJhdGVkSW1hZ2UuaCIKLSNpbmNsdWRlICJTdHlsZVBlbmRpbmdJbWFnZS5oIgogI2luY2x1
ZGUgIlN0eWxlUHJvcGVydHlTZXQuaCIKLSNpbmNsdWRlICJTdHlsZVByb3BlcnR5U2hvcnRoYW5k
LmgiCiAjaW5jbHVkZSAiU3R5bGVSdWxlLmgiCi0jaW5jbHVkZSAiU3R5bGVSdWxlSW1wb3J0Lmgi
Ci0jaW5jbHVkZSAiU3R5bGVTaGVldENvbnRlbnRzLmgiCi0jaW5jbHVkZSAiU3R5bGVTaGVldExp
c3QuaCIKLSNpbmNsdWRlICJUZXh0LmgiCi0jaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXgu
aCIKLSNpbmNsdWRlICJUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb24uaCIKLSNpbmNsdWRlICJV
c2VyQWdlbnRTdHlsZVNoZWV0cy5oIgotI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5o
IgotI2luY2x1ZGUgIlZpc2l0ZWRMaW5rU3RhdGUuaCIKLSNpbmNsdWRlICJXZWJDb3JlTWVtb3J5
SW5zdHJ1bWVudGF0aW9uLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVSdWxlLmgiCi0j
aW5jbHVkZSAiV2ViS2l0Q1NTS2V5ZnJhbWVzUnVsZS5oIgotI2luY2x1ZGUgIldlYktpdENTU1Jl
Z2lvblJ1bGUuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZS5oIgotI2luY2x1
ZGUgIldlYktpdEZvbnRGYW1pbHlOYW1lcy5oIgotI2luY2x1ZGUgIlhNTE5hbWVzLmgiCi0jaW5j
bHVkZSA8d3RmL01lbW9yeUluc3RydW1lbnRhdGlvbkhhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYv
TWVtb3J5SW5zdHJ1bWVudGF0aW9uSGFzaFNldC5oPgotI2luY2x1ZGUgPHd0Zi9NZW1vcnlJbnN0
cnVtZW50YXRpb25WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+Ci0jaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgotCi0jaWYgRU5BQkxFKENTU19GSUxURVJTKQotI2luY2x1ZGUg
IkZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1ZGUgIldlYktpdENTU0ZpbHRlclZhbHVlLmgiCi0j
ZW5kaWYKLQotI2lmIEVOQUJMRShEQVNIQk9BUkRfU1VQUE9SVCkKLSNpbmNsdWRlICJEYXNoYm9h
cmRSZWdpb24uaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFNWRykKLSNpbmNsdWRlICJDYWNoZWRT
VkdEb2N1bWVudC5oIgotI2luY2x1ZGUgIkNhY2hlZFNWR0RvY3VtZW50UmVmZXJlbmNlLmgiCi0j
aW5jbHVkZSAiU1ZHRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50LmgiCi0jaW5jbHVk
ZSAiU1ZHTmFtZXMuaCIKLSNpbmNsdWRlICJTVkdVUklSZWZlcmVuY2UuaCIKLSNpbmNsdWRlICJX
ZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLSNpbmNsdWRlICJDdXN0b21GaWx0ZXJBcnJheVBhcmFtZXRlci5oIgotI2luY2x1ZGUg
IkN1c3RvbUZpbHRlckNvbnN0YW50cy5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlck51bWJlclBh
cmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlck9wZXJhdGlvbi5oIgotI2luY2x1ZGUg
IkN1c3RvbUZpbHRlclBhcmFtZXRlci5oIgotI2luY2x1ZGUgIkN1c3RvbUZpbHRlclRyYW5zZm9y
bVBhcmFtZXRlci5oIgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkU2hhZGVyLmgiCi0jaW5jbHVkZSAi
U3R5bGVDdXN0b21GaWx0ZXJQcm9ncmFtLmgiCi0jaW5jbHVkZSAiU3R5bGVQZW5kaW5nU2hhZGVy
LmgiCi0jaW5jbHVkZSAiU3R5bGVTaGFkZXIuaCIKLSNpbmNsdWRlICJXZWJLaXRDU1NNaXhGdW5j
dGlvblZhbHVlLmgiCi0jaW5jbHVkZSAiV2ViS2l0Q1NTU2hhZGVyVmFsdWUuaCIKLSNlbmRpZgot
Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0jaW5jbHVkZSAiQ1NTSW1hZ2VTZXRWYWx1ZS5o
IgotI2luY2x1ZGUgIlN0eWxlQ2FjaGVkSW1hZ2VTZXQuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxF
KFZJREVPX1RSQUNLKQotI2luY2x1ZGUgIldlYlZUVEVsZW1lbnQuaCIKLSNlbmRpZgotCi11c2lu
ZyBuYW1lc3BhY2Ugc3RkOwotCi1uYW1lc3BhY2UgV1RGIHsKLQotdGVtcGxhdGU8PiBzdHJ1Y3Qg
U2VxdWVuY2VNZW1vcnlJbnN0cnVtZW50YXRpb25UcmFpdHM8Y29uc3QgV2ViQ29yZTo6UnVsZURh
dGEqPiB7Ci0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIEk+IHN0YXRpYyB2b2lkIHJlcG9ydE1lbW9y
eVVzYWdlKEksIEksIE1lbW9yeUNsYXNzSW5mbyYpIHsgfQotfTsKLQotfQogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLSNkZWZpbmUgSEFORExF
X0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5oZXJpdCkgeyBcCi0gICAgbV9zdGF0ZS5z
dHlsZSgpLT5zZXQjI1Byb3AobV9zdGF0ZS5wYXJlbnRTdHlsZSgpLT5wcm9wKCkpOyBcCi0gICAg
cmV0dXJuOyBcCi19Ci0KLSNkZWZpbmUgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwocHJvcCwg
UHJvcCkgXAotSEFORExFX0lOSEVSSVQocHJvcCwgUHJvcCkgXAotaWYgKGlzSW5pdGlhbCkgeyBc
Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXQjI1Byb3AoUmVuZGVyU3R5bGU6OmluaXRpYWwjI1By
b3AoKSk7IFwKLSAgICByZXR1cm47IFwKLX0KLQotUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6
OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7Ci0KLXN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0
VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3Jl
YXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCi0gICAgICAgIGxl
ZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVl
THRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwotfQotCi1zdGF0aWMgU3R5
bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCi17Ci0gICAgREVGSU5FX1NU
QVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0
eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNF
bXB0eSgpKQotICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5
RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0gICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQo
KTsKLX0KLQotCi1pbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRl
OjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAgaWYgKCFtX3J1bGVMaXN0KQotICAgICAgICBtX3J1
bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3J1bGVM
aXN0LmdldCgpOwotfQotCi1pbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVC
b3JkZXJBbmRCYWNrZ3JvdW5kKCkKLXsKLSAgICBtX2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUt
Pmhhc0FwcGVhcmFuY2UoKTsKLSAgICBpZiAobV9oYXNVQUFwcGVhcmFuY2UpIHsKLSAgICAgICAg
bV9ib3JkZXJEYXRhID0gbV9zdHlsZS0+Ym9yZGVyKCk7Ci0gICAgICAgIG1fYmFja2dyb3VuZERh
dGEgPSAqbV9zdHlsZS0+YmFja2dyb3VuZExheWVycygpOwotICAgICAgICBtX2JhY2tncm91bmRD
b2xvciA9IG1fc3R5bGUtPmJhY2tncm91bmRDb2xvcigpOwotICAgIH0KLX0KLQotaW5saW5lIHZv
aWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmNsZWFyKCkKLXsKLSAgICBtX2VsZW1lbnQgPSAwOwot
ICAgIG1fc3R5bGVkRWxlbWVudCA9IDA7Ci0gICAgbV9wYXJlbnRTdHlsZSA9IDA7Ci0gICAgbV9w
YXJlbnROb2RlID0gMDsKLSAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOwotICAgIG1fcnVsZUxp
c3QgPSAwOwotICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7Ci0gICAgbV9wZW5kaW5nSW1hZ2VQ
cm9wZXJ0aWVzLmNsZWFyKCk7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIG1faGFzUGVu
ZGluZ1NoYWRlcnMgPSBmYWxzZTsKLSNlbmRpZgotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYg
RU5BQkxFKFNWRykKLSAgICBtX3BlbmRpbmdTVkdEb2N1bWVudHMuY2xlYXIoKTsKLSNlbmRpZgot
fQotCi1TdHlsZVJlc29sdmVyOjpTdHlsZVJlc29sdmVyKERvY3VtZW50KiBkb2N1bWVudCwgYm9v
bCBtYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgOiBtX21hdGNoZWRQcm9wZXJ0aWVzQ2Fj
aGVBZGRpdGlvbnNTaW5jZUxhc3RTd2VlcCgwKQotICAgICwgbV9tYXRjaGVkUHJvcGVydGllc0Nh
Y2hlU3dlZXBUaW1lcih0aGlzLCAmU3R5bGVSZXNvbHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGll
c0NhY2hlKQotICAgICwgbV9kb2N1bWVudChkb2N1bWVudCkKLSAgICAsIG1fbWF0Y2hBdXRob3JB
bmRVc2VyU3R5bGVzKG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAgICAsIG1fZm9udFNlbGVj
dG9yKENTU0ZvbnRTZWxlY3Rvcjo6Y3JlYXRlKGRvY3VtZW50KSkKLSNpZiBFTkFCTEUoQ1NTX0RF
VklDRV9BREFQVEFUSU9OKQotICAgICwgbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIoVmlld3BvcnRT
dHlsZVJlc29sdmVyOjpjcmVhdGUoZG9jdW1lbnQpKQotI2VuZGlmCi0gICAgLCBtX3N0eWxlQnVp
bGRlcihTdHlsZUJ1aWxkZXI6OnNoYXJlZFN0eWxlQnVpbGRlcigpKQotICAgICwgbV9zdHlsZU1h
cCh0aGlzKQotewotICAgIEVsZW1lbnQqIHJvb3QgPSBkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50
KCk7Ci0KLSAgICBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmluaXREZWZhdWx0U3R5bGUocm9vdCk7
Ci0KLSAgICAvLyBjb25zdHJ1Y3QgZG9jdW1lbnQgcm9vdCBlbGVtZW50IGRlZmF1bHQgc3R5bGUu
IHRoaXMgaXMgbmVlZGVkCi0gICAgLy8gdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmllcyB0aGF0IGNv
bnRhaW4gcmVsYXRpdmUgY29uc3RyYWludHMsIGxpa2UgInNjcmVlbiBhbmQgKG1heC13aWR0aDog
MTBlbSkiCi0gICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgY29uc3RydWN0b3IsIGJlY2F1
c2Ugd2hlbiBjb25zdHJ1Y3RvciBpcyBydW4sCi0gICAgLy8gZG9jdW1lbnQgZG9lc24ndCBoYXZl
IGRvY3VtZW50RWxlbWVudAotICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0IGVsZW1lbnQg
dGhhdCBnZXRzIHBhc3NlZCB0byBzdHlsZUZvckVsZW1lbnQgLWNhbGwKLSAgICAvLyBpcyBhbHdh
eXMgZnJvbSB0aGUgZG9jdW1lbnQgdGhhdCBvd25zIHRoZSBzdHlsZSBzZWxlY3RvcgotICAgIEZy
YW1lVmlldyogdmlldyA9IGRvY3VtZW50LT52aWV3KCk7Ci0gICAgaWYgKHZpZXcpCi0gICAgICAg
IG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlhUXVlcnlFdmFsdWF0b3Iodmlldy0+bWVkaWFU
eXBlKCkpKTsKLSAgICBlbHNlCi0gICAgICAgIG1fbWVkaXVtID0gYWRvcHRQdHIobmV3IE1lZGlh
UXVlcnlFdmFsdWF0b3IoImFsbCIpKTsKLQotICAgIGlmIChyb290KQotICAgICAgICBtX3Jvb3RE
ZWZhdWx0U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQocm9vdCwgMCwgRGlzYWxsb3dTdHlsZVNoYXJp
bmcsIE1hdGNoT25seVVzZXJBZ2VudFJ1bGVzKTsKLQotICAgIGlmIChtX3Jvb3REZWZhdWx0U3R5
bGUgJiYgdmlldykKLSAgICAgICAgbV9tZWRpdW0gPSBhZG9wdFB0cihuZXcgTWVkaWFRdWVyeUV2
YWx1YXRvcih2aWV3LT5tZWRpYVR5cGUoKSwgdmlldy0+ZnJhbWUoKSwgbV9yb290RGVmYXVsdFN0
eWxlLmdldCgpKSk7Ci0KLSAgICBtX3J1bGVTZXRzLnJlc2V0QXV0aG9yU3R5bGUoKTsKLQotICAg
IERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24qIHN0eWxlU2hlZXRDb2xsZWN0aW9uID0gZG9j
dW1lbnQtPnN0eWxlU2hlZXRDb2xsZWN0aW9uKCk7Ci0gICAgbV9ydWxlU2V0cy5pbml0VXNlclN0
eWxlKHN0eWxlU2hlZXRDb2xsZWN0aW9uLCAqbV9tZWRpdW0sICp0aGlzKTsKLQotI2lmIEVOQUJM
RShTVkdfRk9OVFMpCi0gICAgaWYgKGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCkpIHsKLSAgICAg
ICAgY29uc3QgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPiYgc3ZnRm9udEZhY2VFbGVtZW50
cyA9IGRvY3VtZW50LT5zdmdFeHRlbnNpb25zKCktPnN2Z0ZvbnRGYWNlRWxlbWVudHMoKTsKLSAg
ICAgICAgSGFzaFNldDxTVkdGb250RmFjZUVsZW1lbnQqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
c3ZnRm9udEZhY2VFbGVtZW50cy5lbmQoKTsKLSAgICAgICAgZm9yIChIYXNoU2V0PFNWR0ZvbnRG
YWNlRWxlbWVudCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN2Z0ZvbnRGYWNlRWxlbWVudHMuYmVn
aW4oKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICAgICAgZm9udFNlbGVjdG9yKCktPmFkZEZv
bnRGYWNlUnVsZSgoKml0KS0+Zm9udEZhY2VSdWxlKCkpOwotICAgIH0KLSNlbmRpZgotCi0gICAg
YXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoMCwgc3R5bGVTaGVldENvbGxlY3Rpb24tPmFjdGl2ZUF1
dGhvclN0eWxlU2hlZXRzKCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGVuZEF1dGhv
clN0eWxlU2hlZXRzKHVuc2lnbmVkIGZpcnN0TmV3LCBjb25zdCBWZWN0b3I8UmVmUHRyPENTU1N0
eWxlU2hlZXQ+ID4mIHN0eWxlU2hlZXRzKQotewotICAgIG1fcnVsZVNldHMuYXBwZW5kQXV0aG9y
U3R5bGVTaGVldHMoZmlyc3ROZXcsIHN0eWxlU2hlZXRzLCBtX21lZGl1bS5nZXQoKSwgbV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzLCBkb2N1bWVudCgpLT5pc1ZpZXdTb3VyY2UoKSwgdGhpcyk7Ci0g
ICAgaWYgKGRvY3VtZW50KCktPnJlbmRlcmVyKCkgJiYgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+
c3R5bGUoKSkKLSAgICAgICAgZG9jdW1lbnQoKS0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+Zm9udCgp
LnVwZGF0ZShmb250U2VsZWN0b3IoKSk7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFU
SU9OKQotICAgIHZpZXdwb3J0U3R5bGVSZXNvbHZlcigpLT5yZXNvbHZlKCk7Ci0jZW5kaWYKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjpwdXNoUGFyZW50RWxlbWVudChFbGVtZW50KiBwYXJlbnQp
Ci17Ci0gICAgY29uc3QgQ29udGFpbmVyTm9kZSogcGFyZW50c1BhcmVudCA9IHBhcmVudC0+cGFy
ZW50T3JTaGFkb3dIb3N0RWxlbWVudCgpOwotCi0gICAgLy8gV2UgYXJlIG5vdCBhbHdheXMgaW52
b2tlZCBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBzY3JpcHQgZXhlY3V0aW9uIGNhbiBjYXVz
ZSB1cyB0byBlbnRlcgotICAgIC8vIHN0eWxlIHJlY2FsYyBpbiB0aGUgbWlkZGxlIG9mIHRyZWUg
YnVpbGRpbmcuIFdlIG1heSBhbHNvIGJlIGludm9rZWQgZnJvbSBzb21ld2hlcmUgd2l0aGluIHRo
ZSB0cmVlLgotICAgIC8vIFJlc2V0IHRoZSBzdGFjayBpbiB0aGlzIGNhc2UsIG9yIGlmIHdlIHNl
ZSBhIG5ldyByb290IGVsZW1lbnQuCi0gICAgLy8gT3RoZXJ3aXNlIGp1c3QgcHVzaCB0aGUgbmV3
IHBhcmVudC4KLSAgICBpZiAoIXBhcmVudHNQYXJlbnQgfHwgbV9zZWxlY3RvckZpbHRlci5wYXJl
bnRTdGFja0lzRW1wdHkoKSkKLSAgICAgICAgbV9zZWxlY3RvckZpbHRlci5zZXR1cFBhcmVudFN0
YWNrKHBhcmVudCk7Ci0gICAgZWxzZQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnB1c2hQYXJl
bnQocGFyZW50KTsKLQotICAgIC8vIE5vdGU6IFdlIG11c3RuJ3Qgc2tpcCBTaGFkb3dSb290IG5v
ZGVzIGZvciB0aGUgc2NvcGUgc3RhY2suCi0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAg
ICAgbV9zY29wZVJlc29sdmVyLT5wdXNoKHBhcmVudCwgcGFyZW50LT5wYXJlbnRPclNoYWRvd0hv
c3ROb2RlKCkpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OnBvcFBhcmVudEVsZW1lbnQoRWxl
bWVudCogcGFyZW50KQotewotICAgIC8vIE5vdGUgdGhhdCB3ZSBtYXkgZ2V0IGludm9rZWQgZm9y
IHNvbWUgcmFuZG9tIGVsZW1lbnRzIGluIHNvbWUgd2Fja3kgY2FzZXMgZHVyaW5nIHN0eWxlIHJl
c29sdmUuCi0gICAgLy8gUGF1c2UgbWFpbnRhaW5pbmcgdGhlIHN0YWNrIGluIHRoaXMgY2FzZS4K
LSAgICBpZiAobV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChwYXJlbnQp
KQotICAgICAgICBtX3NlbGVjdG9yRmlsdGVyLnBvcFBhcmVudCgpOwotICAgIGlmIChtX3Njb3Bl
UmVzb2x2ZXIpCi0gICAgICAgIG1fc2NvcGVSZXNvbHZlci0+cG9wKHBhcmVudCk7Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6cHVzaFBhcmVudFNoYWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCog
c2hhZG93Um9vdCkKLXsKLSAgICBBU1NFUlQoc2hhZG93Um9vdC0+aG9zdCgpKTsKLSAgICBpZiAo
bV9zY29wZVJlc29sdmVyKQotICAgICAgICBtX3Njb3BlUmVzb2x2ZXItPnB1c2goc2hhZG93Um9v
dCwgc2hhZG93Um9vdC0+aG9zdCgpKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpwb3BQYXJl
bnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QpCi17Ci0gICAgQVNTRVJU
KHNoYWRvd1Jvb3QtPmhvc3QoKSk7Ci0gICAgaWYgKG1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAg
bV9zY29wZVJlc29sdmVyLT5wb3Aoc2hhZG93Um9vdCk7Ci19Ci0KLS8vIFRoaXMgaXMgYSBzaW1w
bGlmaWVkIHN0eWxlIHNldHRpbmcgZnVuY3Rpb24gZm9yIGtleWZyYW1lIHN0eWxlcwotdm9pZCBT
dHlsZVJlc29sdmVyOjphZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8U3R5bGVSdWxlS2V5ZnJh
bWVzPiBydWxlKQotewotICAgIEF0b21pY1N0cmluZyBzKHJ1bGUtPm5hbWUoKSk7Ci0gICAgbV9r
ZXlmcmFtZXNSdWxlTWFwLnNldChzLmltcGwoKSwgcnVsZSk7Ci19Ci0KLVN0eWxlUmVzb2x2ZXI6
On5TdHlsZVJlc29sdmVyKCkKLXsKLSAgICBtX2ZvbnRTZWxlY3Rvci0+Y2xlYXJEb2N1bWVudCgp
OwotCi0jaWYgRU5BQkxFKENTU19ERVZJQ0VfQURBUFRBVElPTikKLSAgICBtX3ZpZXdwb3J0U3R5
bGVSZXNvbHZlci0+Y2xlYXJEb2N1bWVudCgpOwotI2VuZGlmCi19Ci0KLXZvaWQgU3R5bGVSZXNv
bHZlcjo6c3dlZXBNYXRjaGVkUHJvcGVydGllc0NhY2hlKFRpbWVyPFN0eWxlUmVzb2x2ZXI+KikK
LXsKLSAgICAvLyBMb29rIGZvciBjYWNoZSBlbnRyaWVzIGNvbnRhaW5pbmcgYSBzdHlsZSBkZWNs
YXJhdGlvbiB3aXRoIGEgc2luZ2xlIHJlZiBhbmQgcmVtb3ZlIHRoZW0uCi0gICAgLy8gVGhpcyBt
YXkgaGFwcGVuIHdoZW4gYW4gZWxlbWVudCBhdHRyaWJ1dGUgbXV0YXRpb24gY2F1c2VzIGl0IHRv
IGdlbmVyYXRlIGEgbmV3IGlubGluZVN0eWxlKCkKLSAgICAvLyBvciBwcmVzZW50YXRpb25BdHRy
aWJ1dGVTdHlsZSgpLCBwb3RlbnRpYWxseSBsZWF2aW5nIHRoaXMgY2FjaGUgd2l0aCB0aGUgbGFz
dCByZWYgb24gdGhlIG9sZCBvbmUuCi0gICAgVmVjdG9yPHVuc2lnbmVkLCAxNj4gdG9SZW1vdmU7
Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9w
ZXJ0aWVzQ2FjaGUuYmVnaW4oKTsKLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlOjppdGVyYXRv
ciBlbmQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZW5kKCk7Ci0gICAgZm9yICg7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXM+JiBtYXRjaGVk
UHJvcGVydGllcyA9IGl0LT52YWx1ZS5tYXRjaGVkUHJvcGVydGllczsKLSAgICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtYXRjaGVkUHJvcGVydGllcy5zaXplKCk7ICsraSkgewotICAgICAg
ICAgICAgaWYgKG1hdGNoZWRQcm9wZXJ0aWVzW2ldLnByb3BlcnRpZXMtPmhhc09uZVJlZigpKSB7
Ci0gICAgICAgICAgICAgICAgdG9SZW1vdmUuYXBwZW5kKGl0LT5rZXkpOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgdG9SZW1vdmUuc2l6ZSgpOyArK2kpCi0gICAgICAgIG1fbWF0Y2hlZFBy
b3BlcnRpZXNDYWNoZS5yZW1vdmUodG9SZW1vdmVbaV0pOwotCi0gICAgbV9tYXRjaGVkUHJvcGVy
dGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPSAwOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29u
c3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25l
ZCBsaW5rTWF0Y2hUeXBlLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RU
eXBlKQotewotICAgIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1
bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXMm
IG5ld1Byb3BlcnRpZXMgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7Ci0g
ICAgbmV3UHJvcGVydGllcy5wcm9wZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0
Kj4ocHJvcGVydGllcyk7Ci0gICAgbmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01h
dGNoVHlwZTsKLSAgICBuZXdQcm9wZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRl
bGlzdFR5cGU7Ci0gICAgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKLX0K
LQotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhN
YXRjaFJlc3VsdCYgcmVzdWx0LCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwg
Ym9vbCBpc0NhY2hlYWJsZSkKLXsKLSAgICBpZiAoIXByb3BlcnR5U2V0KQotICAgICAgICByZXR1
cm47Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCk7Ci0gICAgaWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09
IC0xKQotICAgICAgICByZXN1bHQucmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5n
ZXMubGFzdEF1dGhvclJ1bGU7Ci0gICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9w
ZXJ0eVNldCk7Ci0gICAgaWYgKCFpc0NhY2hlYWJsZSkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVh
YmxlID0gZmFsc2U7Ci19Ci0KLWNsYXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsKLXB1YmxpYzoK
LSAgICBNYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotICAgIH5NYXRjaGluZ1VBUnVsZXNTY29wZSgp
OwotCi0gICAgc3RhdGljIGJvb2wgaXNNYXRjaGluZ1VBUnVsZXMoKTsKLQotcHJpdmF0ZToKLSAg
ICBzdGF0aWMgYm9vbCBtX21hdGNoaW5nVUFSdWxlczsKLX07Ci0KLU1hdGNoaW5nVUFSdWxlc1Nj
b3BlOjpNYXRjaGluZ1VBUnVsZXNTY29wZSgpCi17Ci0gICAgQVNTRVJUKCFtX21hdGNoaW5nVUFS
dWxlcyk7Ci0gICAgbV9tYXRjaGluZ1VBUnVsZXMgPSB0cnVlOwotfQotCi1NYXRjaGluZ1VBUnVs
ZXNTY29wZTo6fk1hdGNoaW5nVUFSdWxlc1Njb3BlKCkKLXsKLSAgICBtX21hdGNoaW5nVUFSdWxl
cyA9IGZhbHNlOwotfQotCi1pbmxpbmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRj
aGluZ1VBUnVsZXMoKQotewotICAgIHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsKLX0KLQotYm9v
bCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3Qm
IG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgQVNTRVJUKG1hdGNo
UmVxdWVzdC5ydWxlU2V0KTsKLSAgICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkpOwotCi0gICAg
U3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGUuZWxl
bWVudCgpOwotICAgIGNvbnN0IFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQgPSBzdGF0ZS5z
dHlsZWRFbGVtZW50KCk7Ci0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9JZCA9IGVsZW1l
bnQtPnNoYWRvd1BzZXVkb0lkKCk7Ci0gICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgQVNTRVJUKHN0eWxlZEVsZW1lbnQpOwotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxl
c0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1lbnRSdWxlcyhw
c2V1ZG9JZC5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgfQotCi0jaWYg
RU5BQkxFKFZJREVPX1RSQUNLKQotICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSkK
LSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0
LT5jdWVQc2V1ZG9SdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0jZW5kaWYKLSAg
ICAvLyBDaGVjayB3aGV0aGVyIG90aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBsaWNhYmxlIGlu
IHRoZSBjdXJyZW50IHRyZWUgc2NvcGUuIENyaXRlcmlhIGZvciB0aGlzOgotICAgIC8vIGEpIGl0
J3MgYSBVQSBydWxlCi0gICAgLy8gYikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1dGhvciBydWxl
cwotICAgIC8vIGMpIHRoZSBydWxlcyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxlIHNoZWV0IHdp
dGhpbiB0aGUgc2FtZSB0cmVlIHNjb3BlCi0gICAgVHJlZVNjb3BlKiB0cmVlU2NvcGUgPSBlbGVt
ZW50LT50cmVlU2NvcGUoKTsKLSAgICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNo
aW5nVUFSdWxlcygpCi0gICAgICAgICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkK
LSAgICAgICAgJiYgKCFtYXRjaFJlcXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50
cmVlU2NvcGUoKSAhPSB0cmVlU2NvcGUpCi0gICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlv
ckF0Qm91bmRhcnkgPT0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3Ig
aWQsIGNsYXNzLCB0YWcsIGFuZCBldmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKLSAg
ICAvLyB0aGVuIHNvcnQgdGhlIGJ1ZmZlci4KLSAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSkKLSAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5p
ZFJ1bGVzKGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwgbWF0Y2hSZXF1
ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxlZEVsZW1lbnQt
Pmhhc0NsYXNzKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZWRFbGVt
ZW50LT5jbGFzc05hbWVzKCkuc2l6ZSgpOyArK2kpCi0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMoc3R5bGVkRWxl
bWVudC0+Y2xhc3NOYW1lcygpW2ldLmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsK
LSAgICB9Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNMaW5rKCkpCi0gICAgICAgIGNvbGxlY3RNYXRj
aGluZ1J1bGVzRm9yTGlzdChtYXRjaFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVkb0NsYXNzUnVs
ZXMoKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGlmIChTZWxlY3RvckNoZWNrZXI6
Om1hdGNoZXNGb2N1c1BzZXVkb0NsYXNzKGVsZW1lbnQpKQotICAgICAgICBjb2xsZWN0TWF0Y2hp
bmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRvQ2xhc3NSdWxl
cygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5sb2NhbE5hbWUo
KS5pbXBsKCkpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRj
aFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1h
dGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1
bGVSYW5nZSYgcnVsZVJhbmdlKQotewotICAgIGlmICghbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5n
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBtYXRjaFJlcXVlc3Qu
cnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBjb25zdCBDU1NTZWxlY3Rv
ciogcmVnaW9uU2VsZWN0b3IgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3Rv
cnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3RvcjsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2Vs
ZWN0b3IocmVnaW9uU2VsZWN0b3IsIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0YXRlLnJlZ2lv
bkZvclN0eWxpbmcoKS0+bm9kZSgpKSkpIHsKLSAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1
bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMu
YXQoaSkucnVsZVNldC5nZXQoKTsKLSAgICAgICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7Ci0g
ICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVnaW9uUnVsZXMs
IG1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNjb3BlKSwgcnVs
ZVJhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0
QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0
Y2hlZFJ1bGVzID0gc3RhdGUubWF0Y2hlZFJ1bGVzKCk7Ci0gICAgaWYgKG1hdGNoZWRSdWxlcy5p
c0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKLQot
ICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMp
IHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7
ICsraSkKLSAgICAgICAgICAgIHN0YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5k
KG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVk
IHJ1bGVzIG92ZXIgdG8gb3VyIGxpc3Qgb2YgZGVjbGFyYXRpb25zLgotICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBtYXRjaGVkUnVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHN0
YXRlLnN0eWxlKCkgJiYgbWF0Y2hlZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0cmlidXRl
U2VsZWN0b3IoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAg
ICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgp
LT5wcm9wZXJ0aWVzKCksIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVsZXNbaV0t
PmxpbmtNYXRjaFR5cGUoKSwgbWF0Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlzdFR5cGUo
KSk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVs
ZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSNpZiBF
TkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBpZiAoIW1fc2Nv
cGVSZXNvbHZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2ggc2NvcGVkIGF1dGhv
ciBydWxlcyBieSB0cmF2ZXJzaW5nIHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAocmVidWlsZCBp
dCBpZiBpdCBnb3QgaW5jb25zaXN0ZW50KS4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyLT5oYXNT
Y29wZWRTdHlsZXMoKSAmJiBtX3Njb3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29uc2lzdGVuY3ko
bV9zdGF0ZS5lbGVtZW50KCkpKSB7Ci0gICAgICAgIGJvb2wgYXBwbHlBdXRob3JTdHlsZXMgPSBt
X3N0YXRlLmVsZW1lbnQoKS0+dHJlZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVzKCk7Ci0gICAg
ICAgIGJvb2wgZG9jdW1lbnRTY29wZSA9IHRydWU7Ci0gICAgICAgIHVuc2lnbmVkIHNjb3BlU2l6
ZSA9IG1fc2NvcGVSZXNvbHZlci0+c3RhY2tTaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzY29wZVNpemU7ICsraSkgewotICAgICAgICAgICAgbV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5jbGVhcigpOwotICAgICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVs
ZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0gICAgICAgICAgICBj
b25zdCBTdHlsZVNjb3BlUmVzb2x2ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29s
dmVyLT5zdGFja0ZyYW1lQXQoaSk7Ci0gICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1l
bnRTY29wZSAmJiAhZnJhbWUubV9zY29wZS0+aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgICAg
IGlmIChkb2N1bWVudFNjb3BlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0
eWxlcykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgICAgIGlmICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3Vu
ZHMoZnJhbWUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgTWF0Y2hSZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQs
IGluY2x1ZGVFbXB0eVJ1bGVzLCBmcmFtZS5tX3Njb3BlKTsKLSAgICAgICAgICAgIFJ1bGVSYW5n
ZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICAg
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAg
ICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotICAgICAgICAgICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5VU0VEX1BB
UkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJl
c29sdmVyOjpzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkKK3N0YXRpYyBp
bmxpbmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBjb25z
dCBTdHlsZVJ1bGVQYWdlKiByMikKIHsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICByZXR1
cm4gbV9zY29wZVJlc29sdmVyICYmIG1fc2NvcGVSZXNvbHZlci0+c3R5bGVTaGFyaW5nQ2FuZGlk
YXRlTWF0Y2hlc0hvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSk7Ci0jZWxzZQotICAgIHJldHVy
biBmYWxzZTsKLSNlbmRpZgorICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHko
KSA8IHIyLT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2
ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5
UnVsZXMpCitib29sIFBhZ2VSdWxlQ29sbGVjdG9yOjppc0xlZnRQYWdlKGludCBwYWdlSW5kZXgp
IGNvbnN0CiB7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgQVNTRVJUKG1fc2NvcGVSZXNv
bHZlcik7Ci0KLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmVzdWx0
LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkg
LSAxOwotCi0gICAgVmVjdG9yPFJ1bGVTZXQqPiBtYXRjaGVkUnVsZXM7Ci0gICAgbV9zY29wZVJl
c29sdmVyLT5tYXRjaEhvc3RSdWxlcyhtX3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsK
LSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOworICAgIGJv
b2wgaXNGaXJzdFBhZ2VMZWZ0ID0gZmFsc2U7CisgICAgaWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50
U3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICBpc0ZpcnN0UGFnZUxl
ZnQgPSB0cnVlOwogCi0gICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hlZFJ1bGVzLnNpemUoKTsg
aSA+IDA7IC0taSkgewotICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdl
cy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hS
ZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlSdWxlcywgbV9zdGF0ZS5l
bGVtZW50KCkpLCBydWxlUmFuZ2UpOwotICAgIH0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVk
UnVsZXMocmVzdWx0KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5V
U0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgorICAgIHJldHVybiAocGFnZUlu
ZGV4ICsgKGlzRmlyc3RQYWdlTGVmdCA/IDEgOiAwKSkgJSAyOwogfQogCi12b2lkIFN0eWxlUmVz
b2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcykKK2Jvb2wgUGFnZVJ1bGVDb2xsZWN0b3I6OmlzRmlyc3RQYWdlKGludCBwYWdl
SW5kZXgpIGNvbnN0CiB7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAg
IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpIC0gMTsKLQotICAgIGlmICghbV9zdGF0ZS5lbGVtZW50KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIC8vIE1hdGNoIGdsb2JhbCBhdXRob3IgcnVsZXMuCi0gICAgTWF0Y2hSZXF1ZXN0
IG1hdGNoUmVxdWVzdChtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVz
KTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFu
Z2UoKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFu
Z2UpOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotICAgIFZlY3RvcjxNYXRjaFJlcXVlc3Q+IG1h
dGNoUmVxdWVzdHM7Ci0gICAgbV9ydWxlU2V0cy5zaGFkb3dEaXN0cmlidXRlZFJ1bGVzKCkuY29s
bGVjdE1hdGNoUmVxdWVzdHMoaW5jbHVkZUVtcHR5UnVsZXMsIG1hdGNoUmVxdWVzdHMpOwotICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hSZXF1ZXN0cy5zaXplKCk7ICsraSkKLSAgICAg
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0c1tpXSwgcnVsZVJhbmdlKTsKLSNl
bmRpZgotCi0gICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0KLSAgICBt
YXRjaFNjb3BlZEF1dGhvclJ1bGVzKHJlc3VsdCwgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIC8v
IEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2UgYXQgaW5kZXgg
MSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KKyAgICByZXR1cm4gKCFwYWdlSW5kZXgp
OwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVXNlclJ1bGVzKE1hdGNoUmVzdWx0JiBy
ZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCitTdHJpbmcgUGFnZVJ1bGVDb2xsZWN0b3I6
OnBhZ2VOYW1lKGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3J1bGVT
ZXRzLnVzZXJTdHlsZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgbV9zdGF0ZS5tYXRj
aGVkUnVsZXMoKS5jbGVhcigpOwotCi0gICAgcmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUgPSBy
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMTsKLSAgICBNYXRjaFJlcXVlc3QgbWF0
Y2hSZXF1ZXN0KG1fcnVsZVNldHMudXNlclN0eWxlKCksIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAg
ICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy51c2VyUnVsZVJhbmdlKCk7Ci0g
ICAgY29sbGVjdE1hdGNoaW5nUnVsZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzRm9yUmVnaW9uKG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLQot
ICAgIHNvcnRBbmRUcmFuc2Zlck1hdGNoZWRSdWxlcyhyZXN1bHQpOworICAgIC8vIEZJWE1FOiBJ
bXBsZW1lbnQgcGFnZSBpbmRleCB0byBwYWdlIG5hbWUgbWFwcGluZy4KKyAgICByZXR1cm4gIiI7
CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1
bHQsIFJ1bGVTZXQqIHJ1bGVzKQordm9pZCBQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hBbGxQYWdl
UnVsZXMoaW50IHBhZ2VJbmRleCkKIHsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFy
KCk7CisgICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdlKHBhZ2VJbmRleCk7CisgICAg
Y29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUluZGV4KTsKKyAgICBjb25zdCBT
dHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7CiAgICAgCi0gICAgcmVzdWx0LnJhbmdl
cy5sYXN0VUFSdWxlID0gcmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDE7Ci0gICAg
UnVsZVJhbmdlIHJ1bGVSYW5nZSA9IHJlc3VsdC5yYW5nZXMuVUFSdWxlUmFuZ2UoKTsKLSAgICBj
b2xsZWN0TWF0Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocnVsZXMpLCBydWxlUmFuZ2UpOwotCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7CisgICAgbWF0Y2hQYWdlUnVs
ZXMoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0Zp
cnN0LCBwYWdlKTsKKyAgICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLnVzZXJTdHlsZSgpLCBp
c0xlZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIC8vIE9ubHkgY29uc2lkZXIgdGhlIGdsb2JhbCBh
dXRob3IgUnVsZVNldCBmb3IgQHBhZ2UgcnVsZXMsIGFzIHBlciB0aGUgSFRNTDUgc3BlYy4KKyAg
ICBtYXRjaFBhZ2VSdWxlcyhtX3J1bGVTZXRzLmF1dGhvclN0eWxlKCksIGlzTGVmdCwgaXNGaXJz
dCwgcGFnZSk7CiB9CiAKLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JMaXN0KGNvbnN0IFZlY3RvcjxSdWxlRGF0YT4qIHJ1bGVzLCBjb25zdCBNYXRjaFJlcXVlc3Qm
IG1hdGNoUmVxdWVzdCwgUnVsZVJhbmdlJiBydWxlUmFuZ2UpCit2b2lkIFBhZ2VSdWxlQ29sbGVj
dG9yOjptYXRjaFBhZ2VSdWxlcyhSdWxlU2V0KiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29s
IGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQogewogICAgIGlmICghcnVsZXMp
CiAgICAgICAgIHJldHVybjsKIAotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgLy8g
SW4gc29tZSBjYXNlcyB3ZSBtYXkgZW5kIHVwIGxvb2tpbmcgdXAgc3R5bGUgZm9yIHJhbmRvbSBl
bGVtZW50cyBpbiB0aGUgbWlkZGxlIG9mIGEgcmVjdXJzaXZlIHRyZWUgcmVzb2x2ZS4KLSAgICAv
LyBBbmNlc3RvciBpZGVudGlmaWVyIGZpbHRlciB3b24ndCBiZSB1cC10by1kYXRlIGluIHRoYXQg
Y2FzZSBhbmQgd2UgY2FuJ3QgdXNlIHRoZSBmYXN0IHBhdGguCi0gICAgYm9vbCBjYW5Vc2VGYXN0
UmVqZWN0ID0gbV9zZWxlY3RvckZpbHRlci5wYXJlbnRTdGFja0lzQ29uc2lzdGVudChzdGF0ZS5w
YXJlbnROb2RlKCkpICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0
b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeTsKLQotICAgIHVuc2lnbmVkIHNpemUgPSBy
dWxlcy0+c2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsK
LSAgICAgICAgY29uc3QgUnVsZURhdGEmIHJ1bGVEYXRhID0gcnVsZXMtPmF0KGkpOwotICAgICAg
ICBpZiAoY2FuVXNlRmFzdFJlamVjdCAmJiBtX3NlbGVjdG9yRmlsdGVyLmZhc3RSZWplY3RTZWxl
Y3RvcjxSdWxlRGF0YTo6bWF4aW11bUlkZW50aWZpZXJDb3VudD4ocnVsZURhdGEuZGVzY2VuZGFu
dFNlbGVjdG9ySWRlbnRpZmllckhhc2hlcygpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIFN0eWxlUnVsZSogcnVsZSA9IHJ1bGVEYXRhLnJ1bGUoKTsKLSAgICAgICAgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIGNvb2tpZSA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bjo6d2lsbE1hdGNoUnVsZShkb2N1bWVudCgpLCBydWxlLCB0aGlzKTsKLSAgICAgICAgUHNldWRv
SWQgZHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOwotICAgICAgICBpZiAocnVsZU1hdGNoZXMocnVs
ZURhdGEsIG1hdGNoUmVxdWVzdC5zY29wZSwgZHluYW1pY1BzZXVkbywgbWF0Y2hSZXF1ZXN0LmJl
aGF2aW9yQXRCb3VuZGFyeSkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBw
cm9wZXJ0aWVzIHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdCBpbiB0aGUgbm9uLWRlYnVnIG1vZGUu
Ci0gICAgICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzID0gcnVsZS0+
cHJvcGVydGllcygpOwotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzIHx8IChwcm9wZXJ0aWVz
LT5pc0VtcHR5KCkgJiYgIW1hdGNoUmVxdWVzdC5pbmNsdWRlRW1wdHlSdWxlcykpIHsKLSAgICAg
ICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUs
IGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBFeHBvc2luZyB0aGUgbm9uLXN0YW5kYXJkIGdldE1hdGNoZWRDU1NS
dWxlcyBBUEkgdG8gd2ViIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGlzIG5lZWRlZC4KLSAgICAg
ICAgICAgIGlmIChzdGF0ZS5pc1NhbWVPcmlnaW5Pbmx5KCkgJiYgIXJ1bGVEYXRhLmhhc0RvY3Vt
ZW50U2VjdXJpdHlPcmlnaW4oKSkgewotICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1l
bnRhdGlvbjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgd2UncmUgbWF0Y2hpbmcg
bm9ybWFsIHJ1bGVzLCBzZXQgYSBwc2V1ZG8gYml0IGlmCi0gICAgICAgICAgICAvLyB3ZSByZWFs
bHkganVzdCBtYXRjaGVkIGEgcHNldWRvLWVsZW1lbnQuCi0gICAgICAgICAgICBpZiAoZHluYW1p
Y1BzZXVkbyAhPSBOT1BTRVVETyAmJiBzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9J
ZCA9PSBOT1BTRVVETykgewotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlKCkgPT0gU2Vs
ZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICBpZiAoZHluYW1pY1BzZXVkbyA8IEZJUlNUX0lOVEVSTkFMX1BTRVVET0lEKQotICAgICAg
ICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRIYXNQc2V1ZG9TdHlsZShkeW5hbWljUHNl
dWRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIG91
ciBmaXJzdC9sYXN0IHJ1bGUgaW5kaWNlcyBpbiB0aGUgbWF0Y2hlZCBydWxlcyBhcnJheS4KLSAg
ICAgICAgICAgICAgICArK3J1bGVSYW5nZS5sYXN0UnVsZUluZGV4OwotICAgICAgICAgICAgICAg
IGlmIChydWxlUmFuZ2UuZmlyc3RSdWxlSW5kZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgICAg
IHJ1bGVSYW5nZS5maXJzdFJ1bGVJbmRleCA9IHJ1bGVSYW5nZS5sYXN0UnVsZUluZGV4OwotCi0g
ICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1
bGVzLgotICAgICAgICAgICAgICAgIG1fc3RhdGUuYWRkTWF0Y2hlZFJ1bGUoJnJ1bGVEYXRhKTsK
LSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShj
b29raWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkTWF0Y2hSdWxl
KGNvb2tpZSwgZmFsc2UpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVS
dWxlcyhjb25zdCBSdWxlRGF0YSogcjEsIGNvbnN0IFJ1bGVEYXRhKiByMikKLXsKLSAgICB1bnNp
Z25lZCBzcGVjaWZpY2l0eTEgPSByMS0+c3BlY2lmaWNpdHkoKTsKLSAgICB1bnNpZ25lZCBzcGVj
aWZpY2l0eTIgPSByMi0+c3BlY2lmaWNpdHkoKTsKLSAgICByZXR1cm4gKHNwZWNpZmljaXR5MSA9
PSBzcGVjaWZpY2l0eTIpID8gcjEtPnBvc2l0aW9uKCkgPCByMi0+cG9zaXRpb24oKSA6IHNwZWNp
ZmljaXR5MSA8IHNwZWNpZmljaXR5MjsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0TWF0
Y2hlZFJ1bGVzKCkKLXsKLSAgICBzdGQ6OnNvcnQobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5iZWdp
bigpLCBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmVuZCgpLCBjb21wYXJlUnVsZXMpOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQWxsUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCwgYm9v
bCBpbmNsdWRlU01JTFByb3BlcnRpZXMpCi17Ci0gICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCk7Ci0K
LSAgICAvLyBOb3cgd2UgY2hlY2sgdXNlciBzaGVldCBydWxlcy4KLSAgICBpZiAobV9tYXRjaEF1
dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoVXNlclJ1bGVzKHJlc3VsdCwgZmFsc2Up
OwotCi0gICAgLy8gTm93IGNoZWNrIGF1dGhvciBydWxlcywgYmVnaW5uaW5nIGZpcnN0IHdpdGgg
cHJlc2VudGF0aW9uYWwgYXR0cmlidXRlcyBtYXBwZWQgZnJvbSBIVE1MLgotICAgIGlmIChtX3N0
YXRlLnN0eWxlZEVsZW1lbnQoKSkgewotICAgICAgICBhZGRFbGVtZW50U3R5bGVQcm9wZXJ0aWVz
KHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRhdGlvbkF0dHJpYnV0ZVN0
eWxlKCkpOwotCi0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayBhZGRpdGlvbmFsIG1hcHBlZCBkZWNs
YXJhdGlvbnMuCi0gICAgICAgIC8vIFRhYmxlcyBhbmQgdGFibGUgY2VsbHMgc2hhcmUgYW4gYWRk
aXRpb25hbCBtYXBwZWQgcnVsZSB0aGF0IG11c3QgYmUgYXBwbGllZAotICAgICAgICAvLyBhZnRl
ciBhbGwgYXR0cmlidXRlcywgc2luY2UgdGhlaXIgbWFwcGVkIHN0eWxlIGRlcGVuZHMgb24gdGhl
IHZhbHVlcyBvZiBtdWx0aXBsZSBhdHRyaWJ1dGVzLgotICAgICAgICBhZGRFbGVtZW50U3R5bGVQ
cm9wZXJ0aWVzKHJlc3VsdCwgbV9zdGF0ZS5zdHlsZWRFbGVtZW50KCktPmFkZGl0aW9uYWxQcmVz
ZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICBpZiAobV9zdGF0ZS5zdHlsZWRF
bGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgYm9vbCBpc0F1dG87Ci0g
ICAgICAgICAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb24gPSB0b0hUTUxFbGVtZW50KG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpKS0+ZGlyZWN0aW9uYWxpdHlJZmhhc0RpckF1dG9BdHRyaWJ1
dGUoaXNBdXRvKTsKLSAgICAgICAgICAgIGlmIChpc0F1dG8pCi0gICAgICAgICAgICAgICAgYWRk
TWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCB0ZXh0RGlyZWN0aW9uID09IExUUiA/IGxlZnRUb1Jp
Z2h0RGVjbGFyYXRpb24oKSA6IHJpZ2h0VG9MZWZ0RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIH0K
LSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sgdGhlIHJ1bGVzIGluIGF1dGhvciBzaGVldHMgbmV4
dC4KLSAgICBpZiAobV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgIG1hdGNoQXV0
aG9yUnVsZXMocmVzdWx0LCBmYWxzZSk7Ci0KLSAgICAvLyBOb3cgY2hlY2sgb3VyIGlubGluZSBz
dHlsZSBhdHRyaWJ1dGUuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzICYmIG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVT
dHlsZSgpKSB7Ci0gICAgICAgIC8vIElubGluZSBzdHlsZSBpcyBpbW11dGFibGUgYXMgbG9uZyBh
cyB0aGVyZSBpcyBubyBDU1NPTSB3cmFwcGVyLgotICAgICAgICAvLyBGSVhNRTogTWVkaWEgY29u
dHJvbCBzaGFkb3cgdHJlZXMgc2VlbSB0byBoYXZlIHByb2JsZW1zIHdpdGggY2FjaGluZy4KLSAg
ICAgICAgYm9vbCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlID0gIW1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpLT5pc011dGFibGUoKSAmJiAhbV9zdGF0ZS5zdHlsZWRFbGVtZW50
KCktPmlzSW5TaGFkb3dUcmVlKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBDb25zdGlmeS4KLSAgICAg
ICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5bGVkRWxlbWVu
dCgpLT5pbmxpbmVTdHlsZSgpLCBpc0lubGluZVN0eWxlQ2FjaGVhYmxlKTsKLSAgICB9Ci0KLSNp
ZiBFTkFCTEUoU1ZHKQotICAgIC8vIE5vdyBjaGVjayBTTUlMIGFuaW1hdGlvbiBvdmVycmlkZSBz
dHlsZS4KLSAgICBpZiAoaW5jbHVkZVNNSUxQcm9wZXJ0aWVzICYmIG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzICYmIG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpICYmIG1fc3RhdGUuc3R5bGVkRWxl
bWVudCgpLT5pc1NWR0VsZW1lbnQoKSkKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGll
cyhyZXN1bHQsIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpLCBmYWxzZSAvKiBpc0NhY2hlYWJsZSAq
Lyk7Ci0jZWxzZQotICAgIFVOVVNFRF9QQVJBTShpbmNsdWRlU01JTFByb3BlcnRpZXMpOwotI2Vu
ZGlmCi19CisgICAgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiBtYXRjaGVkUGFnZVJ1bGVzOworICAg
IG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVkUGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVz
KCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBwYWdlTmFtZSk7CisgICAgaWYgKG1hdGNoZWRQ
YWdlUnVsZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CiAKLWJvb2wgU3R5bGVSZXNvbHZl
cjo6Y2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25zdCBTcGFjZVNwbGl0U3RyaW5nJiBjbGFz
c05hbWVzKSBjb25zdAotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjbGFzc05hbWVz
LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX3J1bGVTZXRzLmZlYXR1cmVzKCkuY2xhc3Nl
c0luUnVsZXMuY29udGFpbnMoY2xhc3NOYW1lc1tpXS5pbXBsKCkpKQotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KKyAgICBzdGQ6OnN0YWJsZV9z
b3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwgbWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29t
cGFyZVBhZ2VSdWxlcyk7CiAKLWlubGluZSB2b2lkIFN0eWxlUmVzb2x2ZXI6OlN0YXRlOjppbml0
RWxlbWVudChFbGVtZW50KiBlKQotewotICAgIG1fZWxlbWVudCA9IGU7Ci0gICAgbV9zdHlsZWRF
bGVtZW50ID0gZSAmJiBlLT5pc1N0eWxlZEVsZW1lbnQoKSA/IHN0YXRpY19jYXN0PFN0eWxlZEVs
ZW1lbnQqPihlKSA6IDA7Ci0gICAgbV9lbGVtZW50TGlua1N0YXRlID0gZSA/IGUtPmRvY3VtZW50
KCktPnZpc2l0ZWRMaW5rU3RhdGUoKS0+ZGV0ZXJtaW5lTGlua1N0YXRlKGUpIDogTm90SW5zaWRl
TGluazsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXpl
KCk7IGkrKykKKyAgICAgICAgbV9yZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hlZFBh
Z2VSdWxlc1tpXS0+cHJvcGVydGllcygpKTsKIH0KIAotaW5saW5lIHZvaWQgU3R5bGVSZXNvbHZl
cjo6aW5pdEVsZW1lbnQoRWxlbWVudCogZSkKK3N0YXRpYyBib29sIGNoZWNrUGFnZVNlbGVjdG9y
Q29tcG9uZW50cyhjb25zdCBDU1NTZWxlY3Rvciogc2VsZWN0b3IsIGJvb2wgaXNMZWZ0UGFnZSwg
Ym9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKIHsKLSAgICBpZiAobV9z
dGF0ZS5lbGVtZW50KCkgIT0gZSkgewotICAgICAgICBtX3N0YXRlLmluaXRFbGVtZW50KGUpOwot
ICAgICAgICBpZiAoZSAmJiBlID09IGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpKSB7
Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXREaXJlY3Rpb25TZXRPbkRvY3VtZW50RWxl
bWVudChmYWxzZSk7Ci0gICAgICAgICAgICBlLT5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNl
dE9uRG9jdW1lbnRFbGVtZW50KGZhbHNlKTsKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBj
b21wb25lbnQgPSBzZWxlY3RvcjsgY29tcG9uZW50OyBjb21wb25lbnQgPSBjb21wb25lbnQtPnRh
Z0hpc3RvcnkoKSkgeworICAgICAgICBpZiAoY29tcG9uZW50LT5tX21hdGNoID09IENTU1NlbGVj
dG9yOjpUYWcpIHsKKyAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxOYW1lID0g
Y29tcG9uZW50LT50YWdRTmFtZSgpLmxvY2FsTmFtZSgpOworICAgICAgICAgICAgaWYgKGxvY2Fs
TmFtZSAhPSBzdGFyQXRvbSAmJiBsb2NhbE5hbWUgIT0gcGFnZU5hbWUpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgfQotfQotCi1pbmxpbmUgdm9pZCBTdHls
ZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCogZG9jdW1lbnQs
IEVsZW1lbnQqIGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgY29uc3QgUHNldWRvU3R5bGVS
ZXF1ZXN0JiBwc2V1ZG9TdHlsZVJlcXVlc3QsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGlu
ZykKLXsKLSAgICBtX3BzZXVkb1N0eWxlUmVxdWVzdCA9IHBzZXVkb1N0eWxlUmVxdWVzdDsKLSAg
ICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdpb25Gb3JTdHlsaW5nOwogCi0gICAgaWYgKGUpIHsK
LSAgICAgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQgY29udGV4dChlKTsKLSAgICAgICAgbV9wYXJl
bnROb2RlID0gY29udGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICAg
ICAgbV9wYXJlbnRTdHlsZSA9IGNvbnRleHQucmVzZXRTdHlsZUluaGVyaXRhbmNlKCkgPyAwIDoK
LSAgICAgICAgICAgIHBhcmVudFN0eWxlID8gcGFyZW50U3R5bGUgOgotICAgICAgICAgICAgbV9w
YXJlbnROb2RlID8gbV9wYXJlbnROb2RlLT5yZW5kZXJTdHlsZSgpIDogMDsKLSAgICAgICAgbV9k
aXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQgPSBjb250ZXh0Lmluc2VydGlvblBvaW50KCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgbV9wYXJlbnROb2RlID0gMDsKLSAgICAgICAgbV9wYXJlbnRT
dHlsZSA9IHBhcmVudFN0eWxlOwotICAgICAgICBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2lu
dCA9IGZhbHNlOwotICAgIH0KLQotICAgIE5vZGUqIGRvY0VsZW1lbnQgPSBlID8gZS0+ZG9jdW1l
bnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgOiAwOwotICAgIFJlbmRlclN0eWxlKiBkb2NTdHlsZSA9
IGRvY3VtZW50LT5yZW5kZXJTdHlsZSgpOwotICAgIG1fcm9vdEVsZW1lbnRTdHlsZSA9IGRvY0Vs
ZW1lbnQgJiYgZSAhPSBkb2NFbGVtZW50ID8gZG9jRWxlbWVudC0+cmVuZGVyU3R5bGUoKSA6IGRv
Y1N0eWxlOwotCi0gICAgbV9zdHlsZSA9IDA7Ci0gICAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVz
LmNsZWFyKCk7Ci0gICAgbV9ydWxlTGlzdCA9IDA7Ci0gICAgbV9mb250RGlydHkgPSBmYWxzZTsK
LX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaFRocmVzaG9sZCA9IDEwOwot
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkID0gMTA7Ci0K
LXN0YXRpYyBpbmxpbmUgYm9vbCBwYXJlbnRFbGVtZW50UHJldmVudHNTaGFyaW5nKGNvbnN0IEVs
ZW1lbnQqIHBhcmVudEVsZW1lbnQpCi17Ci0gICAgaWYgKCFwYXJlbnRFbGVtZW50KQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHBhcmVudEVsZW1lbnQtPmhhc0ZsYWdzU2V0RHVy
aW5nU3R5bGluZ09mQ2hpbGRyZW4oKTsKLX0KLQotTm9kZSogU3R5bGVSZXNvbHZlcjo6bG9jYXRl
Q291c2luTGlzdChFbGVtZW50KiBwYXJlbnQsIHVuc2lnbmVkJiB2aXNpdGVkTm9kZUNvdW50KSBj
b25zdAotewotICAgIGlmICh2aXNpdGVkTm9kZUNvdW50ID49IGNTdHlsZVNlYXJjaFRocmVzaG9s
ZCAqIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkKQotICAgICAgICByZXR1cm4gMDsKLSAgICBp
ZiAoIXBhcmVudCB8fCAhcGFyZW50LT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgaWYgKHBhcmVudC0+aGFzU2NvcGVkSFRNTFN0eWxlQ2hpbGQoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgU3R5bGVkRWxlbWVudCogcCA9IHN0YXRpY19jYXN0PFN0eWxlZEVsZW1l
bnQqPihwYXJlbnQpOwotICAgIGlmIChwLT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4g
MDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChwLT5pc1NWR0VsZW1lbnQoKSAmJiBzdGF0aWNf
Y2FzdDxTVkdFbGVtZW50Kj4ocCktPmFuaW1hdGVkU01JTFN0eWxlUHJvcGVydGllcygpKQotICAg
ICAgICByZXR1cm4gMDsKLSNlbmRpZgotICAgIGlmIChwLT5oYXNJRCgpICYmIG1fcnVsZVNldHMu
ZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5zKHAtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCku
aW1wbCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5
bGUgPSBwLT5yZW5kZXJTdHlsZSgpOwotICAgIHVuc2lnbmVkIHN1YmNvdW50ID0gMDsKLSAgICBO
b2RlKiB0aGlzQ291c2luID0gcDsKLSAgICBOb2RlKiBjdXJyZW50Tm9kZSA9IHAtPnByZXZpb3Vz
U2libGluZygpOwotCi0gICAgLy8gUmVzZXJ2ZSB0aGUgdHJpZXMgZm9yIHRoaXMgbGV2ZWwuIFRo
aXMgZWZmZWN0aXZlbHkgbWFrZXMgc3VyZSB0aGF0IHRoZSBhbGdvcml0aG0KLSAgICAvLyB3aWxs
IG5ldmVyIGdvIGRlZXBlciB0aGFuIGNTdHlsZVNlYXJjaExldmVsVGhyZXNob2xkIGxldmVscyBp
bnRvIHJlY3Vyc2lvbi4KLSAgICB2aXNpdGVkTm9kZUNvdW50ICs9IGNTdHlsZVNlYXJjaFRocmVz
aG9sZDsKLSAgICB3aGlsZSAodGhpc0NvdXNpbikgewotICAgICAgICB3aGlsZSAoY3VycmVudE5v
ZGUpIHsKLSAgICAgICAgICAgICsrc3ViY291bnQ7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE5v
ZGUtPnJlbmRlclN0eWxlKCkgPT0gcGFyZW50U3R5bGUgJiYgY3VycmVudE5vZGUtPmxhc3RDaGls
ZCgpCi0gICAgICAgICAgICAgICAgJiYgY3VycmVudE5vZGUtPmlzRWxlbWVudE5vZGUoKSAmJiAh
cGFyZW50RWxlbWVudFByZXZlbnRzU2hhcmluZyh0b0VsZW1lbnQoY3VycmVudE5vZGUpKQotI2lm
IEVOQUJMRShTSEFET1dfRE9NKQotICAgICAgICAgICAgICAgICYmICF0b0VsZW1lbnQoY3VycmVu
dE5vZGUpLT5zaGFkb3coKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gQWRqdXN0IGZvciB1bnVzZWQgcmVzZXJ2ZWQgdHJpZXMuCi0gICAgICAgICAgICAg
ICAgdmlzaXRlZE5vZGVDb3VudCAtPSBjU3R5bGVTZWFyY2hUaHJlc2hvbGQgLSBzdWJjb3VudDsK
LSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGUtPmxhc3RDaGlsZCgpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgaWYgKHN1YmNvdW50ID49IGNTdHlsZVNlYXJjaFRocmVzaG9s
ZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIGN1cnJlbnROb2RlID0g
Y3VycmVudE5vZGUtPnByZXZpb3VzU2libGluZygpOworICAgICAgICBDU1NTZWxlY3Rvcjo6UHNl
dWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7CisgICAgICAgIGlm
ICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2UgJiYgIWlzTGVmdFBh
Z2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvUmln
aHRQYWdlICYmIGlzTGVmdFBhZ2UpCisgICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NT
ZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBjdXJyZW50Tm9kZSA9
IGxvY2F0ZUNvdXNpbkxpc3QodGhpc0NvdXNpbi0+cGFyZW50RWxlbWVudCgpLCB2aXNpdGVkTm9k
ZUNvdW50KTsKLSAgICAgICAgdGhpc0NvdXNpbiA9IGN1cnJlbnROb2RlOwogICAgIH0KLQotICAg
IHJldHVybiAwOwotfQotCi1ib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmluZ0NhbmRpZGF0
ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqIHJ1bGVTZXQpCi17Ci0gICAgaWYgKCFydWxlU2V0KQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigp
OwotCi0gICAgbV9zdGF0ZS5zZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6U2hhcmluZ1J1bGVzKTsK
LSAgICBpbnQgZmlyc3RSdWxlSW5kZXggPSAtMSwgbGFzdFJ1bGVJbmRleCA9IC0xOwotICAgIFJ1
bGVSYW5nZSBydWxlUmFuZ2UoZmlyc3RSdWxlSW5kZXgsIGxhc3RSdWxlSW5kZXgpOwotICAgIGNv
bGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlU2V0KSwgcnVsZVJhbmdlKTsKLSAg
ICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0gICAg
aWYgKG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwogICAgIHJldHVybiB0cnVl
OwogfQogCi1ib29sIFN0eWxlUmVzb2x2ZXI6OmNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChTdHls
ZWRFbGVtZW50KiBlbGVtZW50KSBjb25zdAordm9pZCBQYWdlUnVsZUNvbGxlY3Rvcjo6bWF0Y2hQ
YWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29u
c3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgcnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBp
c0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBwYWdlTmFtZSkKIHsKLSAgICBjb25zdCBTdGF0ZSYg
c3RhdGUgPSBtX3N0YXRlOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIHRoaXNJbnB1dEVsZW1lbnQg
PSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgpOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIG90aGVy
SW5wdXRFbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpLT50b0lucHV0RWxlbWVudCgpOwotCi0gICAg
aWYgKCF0aGlzSW5wdXRFbGVtZW50IHx8ICFvdGhlcklucHV0RWxlbWVudCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkgIT0g
b3RoZXJJbnB1dEVsZW1lbnQtPmVsZW1lbnREYXRhKCkpIHsKLSAgICAgICAgaWYgKHRoaXNJbnB1
dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUodHlwZUF0dHIpICE9IG90aGVySW5wdXRFbGVtZW50
LT5mYXN0R2V0QXR0cmlidXRlKHR5cGVBdHRyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmZhc3RHZXRBdHRyaWJ1dGUocmVhZG9ubHlB
dHRyKSAhPSBvdGhlcklucHV0RWxlbWVudC0+ZmFzdEdldEF0dHJpYnV0ZShyZWFkb25seUF0dHIp
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0aGlzSW5wdXRF
bGVtZW50LT5pc0F1dG9maWxsZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNBdXRvZmlsbGVk
KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+c2hv
dWxkQXBwZWFyQ2hlY2tlZCgpICE9IG90aGVySW5wdXRFbGVtZW50LT5zaG91bGRBcHBlYXJDaGVj
a2VkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAodGhpc0lucHV0RWxlbWVudC0+
aXNJbmRldGVybWluYXRlKCkgIT0gb3RoZXJJbnB1dEVsZW1lbnQtPmlzSW5kZXRlcm1pbmF0ZSgp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHRoaXNJbnB1dEVsZW1lbnQtPmlzUmVx
dWlyZWQoKSAhPSBvdGhlcklucHV0RWxlbWVudC0+aXNSZXF1aXJlZCgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNFbmFibGVkRm9ybUNvbnRyb2woKSAhPSBz
dGF0ZS5lbGVtZW50KCktPmlzRW5hYmxlZEZvcm1Db250cm9sKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGlmIChlbGVtZW50LT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkgIT0gc3Rh
dGUuZWxlbWVudCgpLT5pc0RlZmF1bHRCdXR0b25Gb3JGb3JtKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGlmIChzdGF0ZS5kb2N1bWVudCgpLT5jb250YWluc1ZhbGlkaXR5U3R5bGVS
dWxlcygpKSB7Ci0gICAgICAgIGJvb2wgd2lsbFZhbGlkYXRlID0gZWxlbWVudC0+d2lsbFZhbGlk
YXRlKCk7Ci0KLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAhPSBzdGF0ZS5lbGVtZW50KCktPndp
bGxWYWxpZGF0ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBydWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHlsZVJ1bGVQYWdl
KiBydWxlID0gcnVsZXNbaV07CiAKLSAgICAgICAgaWYgKHdpbGxWYWxpZGF0ZSAmJiAoZWxlbWVu
dC0+aXNWYWxpZEZvcm1Db250cm9sRWxlbWVudCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNWYWxp
ZEZvcm1Db250cm9sRWxlbWVudCgpKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+c2VsZWN0b3IoKSwgaXNM
ZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwog
Ci0gICAgICAgIGlmIChlbGVtZW50LT5pc0luUmFuZ2UoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlz
SW5SYW5nZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBJZiB0aGUg
cnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwgdGhlbiBpZ25vcmUgaXQuCisgICAgICAg
IGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMgPSBydWxlLT5wcm9wZXJ0aWVzKCk7
CisgICAgICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLT5pc0VtcHR5KCkpCisgICAg
ICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoZWxlbWVudC0+aXNPdXRPZlJhbmdlKCkg
IT0gc3RhdGUuZWxlbWVudCgpLT5pc091dE9mUmFuZ2UoKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgLy8gQWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1
bGVzLgorICAgICAgICBtYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwogICAgIH0KLQotICAgIHJl
dHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgZWxlbWVudEhhc0RpcmVjdGlvbkF1
dG8oRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBsaW5lIGlzIHN1cnBy
aXNpbmdseSBob3QsIHdlIG1heSB3aXNoIHRvIGlubGluZSBoYXNEaXJlY3Rpb25BdXRvIGludG8g
U3R5bGVSZXNvbHZlci4KLSAgICByZXR1cm4gZWxlbWVudC0+aXNIVE1MRWxlbWVudCgpICYmIHRv
SFRNTEVsZW1lbnQoZWxlbWVudCktPmhhc0RpcmVjdGlvbkF1dG8oKTsKLX0KLQotYm9vbCBTdHls
ZVJlc29sdmVyOjpzaGFyaW5nQ2FuZGlkYXRlSGFzSWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRy
aWJ1dGVzKFN0eWxlZEVsZW1lbnQqIHNoYXJpbmdDYW5kaWRhdGUpIGNvbnN0Ci17Ci0gICAgY29u
c3QgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpLT5lbGVt
ZW50RGF0YSgpID09IHNoYXJpbmdDYW5kaWRhdGUtPmVsZW1lbnREYXRhKCkpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmZhc3RHZXRBdHRyaWJ1dGUoWE1M
TmFtZXM6OmxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRlLT5mYXN0R2V0QXR0cmlidXRlKFhN
TE5hbWVzOjpsYW5nQXR0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3RhdGUu
ZWxlbWVudCgpLT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSAhPSBzaGFyaW5nQ2FuZGlkYXRl
LT5mYXN0R2V0QXR0cmlidXRlKGxhbmdBdHRyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKCFzdGF0ZS5lbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoKSkgewotICAgICAgICBp
ZiAoc2hhcmluZ0NhbmRpZGF0ZS0+aGFzQ2xhc3MoKSAmJiBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1
bGVzKHNoYXJpbmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkpCi0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChzaGFyaW5nQ2FuZGlkYXRlLT5oYXNDbGFzcygpKSB7Ci0j
aWYgRU5BQkxFKFNWRykKLSAgICAgICAgLy8gU1ZHIGVsZW1lbnRzIHJlcXVpcmUgYSAoc2xvdyEp
IGdldEF0dHJpYnV0ZSBjb21wYXJpc2lvbiBiZWNhdXNlICJjbGFzcyIgaXMgYW4gYW5pbWF0YWJs
ZSBhdHRyaWJ1dGUgZm9yIFNWRy4KLSAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aXNTVkdF
bGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS5lbGVtZW50KCktPmdldEF0dHJpYnV0
ZShjbGFzc0F0dHIpICE9IHNoYXJpbmdDYW5kaWRhdGUtPmdldEF0dHJpYnV0ZShjbGFzc0F0dHIp
KQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSNlbmRp
ZgotICAgICAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+Y2xhc3NOYW1lcygpICE9IHNoYXJp
bmdDYW5kaWRhdGUtPmNsYXNzTmFtZXMoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPnByZXNlbnRh
dGlvbkF0dHJpYnV0ZVN0eWxlKCkgIT0gc2hhcmluZ0NhbmRpZGF0ZS0+cHJlc2VudGF0aW9uQXR0
cmlidXRlU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0jaWYgRU5BQkxFKFBST0dS
RVNTX0VMRU1FTlQpCi0gICAgaWYgKHN0YXRlLmVsZW1lbnQoKS0+aGFzVGFnTmFtZShwcm9ncmVz
c1RhZykpIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PEhUTUxQcm9ncmVzc0VsZW1lbnQqPihz
dGF0ZS5lbGVtZW50KCkpLT5pc0RldGVybWluYXRlKCkgIT0gc3RhdGljX2Nhc3Q8SFRNTFByb2dy
ZXNzRWxlbWVudCo+KHNoYXJpbmdDYW5kaWRhdGUpLT5pc0RldGVybWluYXRlKCkpCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gdHJ1ZTsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQoU3R5bGVkRWxl
bWVudCogZWxlbWVudCkgY29uc3QKLXsKLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBlbGVtZW50
LT5yZW5kZXJTdHlsZSgpOwotICAgIGNvbnN0IFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAg
ICBpZiAoIXN0eWxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHN0eWxlLT51bmlx
dWUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChzdHlsZS0+aGFzVW5pcXVlUHNl
dWRvU3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT50YWdR
TmFtZSgpICE9IHN0YXRlLmVsZW1lbnQoKS0+dGFnUU5hbWUoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIGlmIChlbGVtZW50LT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgaWYgKGVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotI2lmIEVOQUJMRShTVkcpCi0gICAgaWYgKGVsZW1lbnQtPmlzU1ZHRWxlbWVudCgp
ICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihlbGVtZW50KS0+YW5pbWF0ZWRTTUlMU3R5bGVQ
cm9wZXJ0aWVzKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIGlmIChlbGVt
ZW50LT5pc0xpbmsoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmlzTGluaygpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmhvdmVyZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCkt
PmhvdmVyZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5hY3Rp
dmUoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmFjdGl2ZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgaWYgKGVsZW1lbnQtPmZvY3VzZWQoKSAhPSBzdGF0ZS5lbGVtZW50KCktPmZvY3VzZWQo
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5zaGFkb3dQc2V1ZG9J
ZCgpICE9IHN0YXRlLmVsZW1lbnQoKS0+c2hhZG93UHNldWRvSWQoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChlbGVtZW50ID09IGVsZW1lbnQtPmRvY3VtZW50KCktPmNzc1Rhcmdl
dCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFzaGFyaW5nQ2FuZGlkYXRlSGFz
SWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKGVsZW1lbnQpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgaWYgKGVsZW1lbnQtPmFkZGl0aW9uYWxQcmVzZW50YXRpb25BdHRyaWJ1
dGVTdHlsZSgpICE9IHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+YWRkaXRpb25hbFByZXNlbnRhdGlv
bkF0dHJpYnV0ZVN0eWxlKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChlbGVt
ZW50LT5oYXNJRCgpICYmIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5z
KGVsZW1lbnQtPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIGlmIChlbGVtZW50LT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHNoYXJlIHN0eWxl
IGZvciBvcHRpb24gYW5kIG9wdGdyb3VwIHdoZW5ldmVyIHBvc3NpYmxlLgotICAgIC8vIEJlZm9y
ZSBkb2luZyBzbywgd2UgbmVlZCB0byByZXNvbHZlIGlzc3VlcyBpbiBIVE1MU2VsZWN0RWxlbWVu
dDo6cmVjYWxjTGlzdEl0ZW1zCi0gICAgLy8gYW5kIFJlbmRlck1lbnVMaXN0OjpzZXRUZXh0LiBT
ZWUgYWxzbyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg0MDUKLSAg
ICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShvcHRpb25UYWcpIHx8IGVsZW1lbnQtPmhhc1RhZ05h
bWUob3B0Z3JvdXBUYWcpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGlzQ29u
dHJvbCA9IGVsZW1lbnQtPmlzRm9ybUNvbnRyb2xFbGVtZW50KCk7Ci0KLSAgICBpZiAoaXNDb250
cm9sICE9IHN0YXRlLmVsZW1lbnQoKS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGlzQ29udHJvbCAmJiAhY2FuU2hhcmVTdHlsZVdpdGhD
b250cm9sKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoc3R5bGUt
PnRyYW5zaXRpb25zKCkgfHwgc3R5bGUtPmFuaW1hdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIC8vIFR1cm4gb2Zm
IHN0eWxlIHNoYXJpbmcgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdhaW4gbGF5ZXJzIGZvciByZWFz
b25zIG91dHNpZGUgb2YgdGhlIHN0eWxlIHN5c3RlbS4KLSAgICAvLyBTZWUgY29tbWVudHMgaW4g
UmVuZGVyT2JqZWN0OjpzZXRTdHlsZSgpLgotICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKGlm
cmFtZVRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShmcmFtZVRhZykgfHwgZWxlbWVudC0+aGFz
VGFnTmFtZShlbWJlZFRhZykgfHwgZWxlbWVudC0+aGFzVGFnTmFtZShvYmplY3RUYWcpIHx8IGVs
ZW1lbnQtPmhhc1RhZ05hbWUoYXBwbGV0VGFnKSB8fCBlbGVtZW50LT5oYXNUYWdOYW1lKGNhbnZh
c1RhZykKLSNpZiBFTkFCTEUoUExVR0lOX1BST1hZX0ZPUl9WSURFTykKLSAgICAgICAgLy8gV2l0
aCBwcm94eWluZywgdGhlIG1lZGlhIGVsZW1lbnRzIGFyZSBiYWNrZWQgYnkgYSBSZW5kZXJFbWJl
ZGRlZE9iamVjdC4KLSAgICAgICAgfHwgZWxlbWVudC0+aGFzVGFnTmFtZSh2aWRlb1RhZykgfHwg
ZWxlbWVudC0+aGFzVGFnTmFtZShhdWRpb1RhZykKLSNlbmRpZgotICAgICAgICApCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gICAgaWYgKGVsZW1lbnRIYXNEaXJlY3Rpb25BdXRv
KGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxlbWVudC0+aXNM
aW5rKCkgJiYgc3RhdGUuZWxlbWVudExpbmtTdGF0ZSgpICE9IHN0eWxlLT5pbnNpZGVMaW5rKCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICAv
LyBEZW55IHNoYXJpbmcgc3R5bGVzIGJldHdlZW4gV2ViVlRUIGFuZCBub24tV2ViVlRUIG5vZGVz
LgotICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSAhPSBzdGF0ZS5lbGVtZW50KCkt
PmlzV2ViVlRURWxlbWVudCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoZWxl
bWVudC0+aXNXZWJWVFRFbGVtZW50KCkgJiYgc3RhdGUuZWxlbWVudCgpLT5pc1dlYlZUVEVsZW1l
bnQoKSAmJiB0b1dlYlZUVEVsZW1lbnQoZWxlbWVudCktPmlzUGFzdE5vZGUoKSAhPSB0b1dlYlZU
VEVsZW1lbnQoc3RhdGUuZWxlbWVudCgpKS0+aXNQYXN0Tm9kZSgpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKLSAgICBpZiAoZWxl
bWVudCA9PSBlbGVtZW50LT5kb2N1bWVudCgpLT53ZWJraXRDdXJyZW50RnVsbFNjcmVlbkVsZW1l
bnQoKSB8fCBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+d2Via2l0Q3VycmVu
dEZ1bGxTY3JlZW5FbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotICAg
IHJldHVybiB0cnVlOwotfQotCi1pbmxpbmUgU3R5bGVkRWxlbWVudCogU3R5bGVSZXNvbHZlcjo6
ZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSogbm9kZSwgdW5zaWduZWQmIGNvdW50KSBj
b25zdAotewotICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCkp
IHsKLSAgICAgICAgaWYgKCFub2RlLT5pc1N0eWxlZEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICBpZiAoY2FuU2hhcmVTdHlsZVdpdGhFbGVtZW50KHN0YXRpY19jYXN0
PFN0eWxlZEVsZW1lbnQqPihub2RlKSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYg
KGNvdW50KysgPT0gY1N0eWxlU2VhcmNoVGhyZXNob2xkKQotICAgICAgICAgICAgcmV0dXJuIDA7
Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdHlsZWRFbGVtZW50Kj4obm9kZSk7Ci19
Ci0KLVJlbmRlclN0eWxlKiBTdHlsZVJlc29sdmVyOjpsb2NhdGVTaGFyZWRTdHlsZSgpCi17Ci0g
ICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLSAgICBpZiAoIXN0YXRlLnN0eWxlZEVsZW1lbnQo
KSB8fCAhc3RhdGUucGFyZW50U3R5bGUoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBJ
ZiB0aGUgZWxlbWVudCBoYXMgaW5saW5lIHN0eWxlIGl0IGlzIHByb2JhYmx5IHVuaXF1ZS4KLSAg
ICBpZiAoc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pbmxpbmVTdHlsZSgpKQotICAgICAgICByZXR1
cm4gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAgIGlmIChzdGF0ZS5zdHlsZWRFbGVtZW50KCktPmlz
U1ZHRWxlbWVudCgpICYmIHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihzdGF0ZS5zdHlsZWRFbGVt
ZW50KCkpLT5hbmltYXRlZFNNSUxTdHlsZVByb3BlcnRpZXMoKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0jZW5kaWYKLSAgICAvLyBJZHMgc3RvcCBzdHlsZSBzaGFyaW5nIGlmIHRoZXkgc2hvdyB1cCBp
biB0aGUgc3R5bGVzaGVldHMuCi0gICAgaWYgKHN0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aGFzSUQo
KSAmJiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhzdGF0ZS5zdHls
ZWRFbGVtZW50KCktPmlkRm9yU3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgaWYgKHBhcmVudEVsZW1lbnRQcmV2ZW50c1NoYXJpbmcoc3RhdGUuZWxlbWVu
dCgpLT5wYXJlbnRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoc3RhdGUu
c3R5bGVkRWxlbWVudCgpLT5oYXNTY29wZWRIVE1MU3R5bGVDaGlsZCgpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBpZiAoc3RhdGUuZWxlbWVudCgpID09IHN0YXRlLmRvY3VtZW50KCktPmNzc1Rh
cmdldCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZWxlbWVudEhhc0RpcmVjdGlvbkF1
dG8oc3RhdGUuZWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBDYWNoZSB3
aGV0aGVyIHN0YXRlLmVsZW1lbnQgaXMgYWZmZWN0ZWQgYnkgYW55IGtub3duIGNsYXNzIHNlbGVj
dG9ycy4KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3QgYmUgYSBtZW1iZXIgdmFyaWFibGUu
IFRoZSBzdHlsZSBzaGFyaW5nIGNvZGUgY291bGQgYmUgZmFjdG9yZWQgb3V0IG9mIFN0eWxlUmVz
b2x2ZXIuCi0gICAgc3RhdGUuc2V0RWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKHN0YXRlLmVs
ZW1lbnQoKSAmJiBzdGF0ZS5lbGVtZW50KCktPmhhc0NsYXNzKCkgJiYgY2xhc3NOYW1lc0FmZmVj
dGVkQnlSdWxlcyhzdGF0ZS5lbGVtZW50KCktPmNsYXNzTmFtZXMoKSkpOwotCi0gICAgLy8gQ2hl
Y2sgcHJldmlvdXMgc2libGluZ3MgYW5kIHRoZWlyIGNvdXNpbnMuCi0gICAgdW5zaWduZWQgY291
bnQgPSAwOwotICAgIHVuc2lnbmVkIHZpc2l0ZWROb2RlQ291bnQgPSAwOwotICAgIFN0eWxlZEVs
ZW1lbnQqIHNoYXJlRWxlbWVudCA9IDA7Ci0gICAgTm9kZSogY291c2luTGlzdCA9IHN0YXRlLnN0
eWxlZEVsZW1lbnQoKS0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKGNvdXNpbkxpc3Qp
IHsKLSAgICAgICAgc2hhcmVFbGVtZW50ID0gZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoY291
c2luTGlzdCwgY291bnQpOwotICAgICAgICBpZiAoc2hhcmVFbGVtZW50KQotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNvdXNpbkxpc3QgPSBsb2NhdGVDb3VzaW5MaXN0KGNvdXNpbkxpc3Qt
PnBhcmVudEVsZW1lbnQoKSwgdmlzaXRlZE5vZGVDb3VudCk7Ci0gICAgfQotCi0gICAgLy8gSWYg
d2UgaGF2ZSBleGhhdXN0ZWQgYWxsIG91ciBidWRnZXQgb3Igb3VyIGNvdXNpbnMuCi0gICAgaWYg
KCFzaGFyZUVsZW1lbnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gQ2FuJ3Qgc2hhcmUg
aWYgc2libGluZyBydWxlcyBhcHBseS4gVGhpcyBpcyBjaGVja2VkIGF0IHRoZSBlbmQgYXMgaXQg
c2hvdWxkIHJhcmVseSBmYWlsLgotICAgIGlmIChzdHlsZVNoYXJpbmdDYW5kaWRhdGVNYXRjaGVz
UnVsZVNldChtX3J1bGVTZXRzLnNpYmxpbmcoKSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIC8v
IENhbid0IHNoYXJlIGlmIGF0dHJpYnV0ZSBydWxlcyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFy
aW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQobV9ydWxlU2V0cy51bmNvbW1vbkF0dHJpYnV0ZSgp
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8gQ2FuJ3Qgc2hhcmUgaWYgQGhvc3QgQC1ydWxl
cyBhcHBseS4KLSAgICBpZiAoc3R5bGVTaGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAvLyBUcmFja2luZyBjaGlsZCBpbmRleCByZXF1aXJl
cyB1bmlxdWUgc3R5bGUgZm9yIGVhY2ggbm9kZS4gVGhpcyBtYXkgZ2V0IHNldCBieSB0aGUgc2li
bGluZyBydWxlIG1hdGNoIGFib3ZlLgotICAgIGlmIChwYXJlbnRFbGVtZW50UHJldmVudHNTaGFy
aW5nKHN0YXRlLmVsZW1lbnQoKS0+cGFyZW50RWxlbWVudCgpKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgcmV0dXJuIHNoYXJlRWxlbWVudC0+cmVuZGVyU3R5bGUoKTsKLX0KLQotdm9pZCBTdHls
ZVJlc29sdmVyOjptYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBNYXRj
aGluZ1VBUnVsZXNTY29wZSBzY29wZTsKLQotICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZy
b20gdGhlIHVzZXIgYWdlbnQgc2hlZXQuCi0gICAgaWYgKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6
c2ltcGxlRGVmYXVsdFN0eWxlU2hlZXQpCi0gICAgICAgIHJlc3VsdC5pc0NhY2hlYWJsZSA9IGZh
bHNlOwotICAgIFJ1bGVTZXQqIHVzZXJBZ2VudFN0eWxlU2hlZXQgPSBtX21lZGl1bS0+bWVkaWFU
eXBlTWF0Y2hTcGVjaWZpYygicHJpbnQiKQotICAgICAgICA/IENTU0RlZmF1bHRTdHlsZVNoZWV0
czo6ZGVmYXVsdFByaW50U3R5bGUgOiBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHls
ZTsKLSAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCB1c2VyQWdlbnRTdHlsZVNoZWV0KTsKLQotICAg
IC8vIEluIHF1aXJrcyBtb2RlLCB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSBxdWlya3MgdXNlciBh
Z2VudCBzaGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aW5RdWlya3NNb2RlKCkpCi0gICAgICAg
IG1hdGNoVUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVmYXVsdFF1aXJr
c1N0eWxlKTsKLQotICAgIC8vIElmIGRvY3VtZW50IHVzZXMgdmlldyBzb3VyY2Ugc3R5bGVzIChp
biB2aWV3IHNvdXJjZSBtb2RlIG9yIGluIHhtbCB2aWV3ZXIgbW9kZSksIHRoZW4gd2UgbWF0Y2gg
cnVsZXMgZnJvbSB0aGUgdmlldyBzb3VyY2Ugc3R5bGUgc2hlZXQuCi0gICAgaWYgKGRvY3VtZW50
KCktPmlzVmlld1NvdXJjZSgpKQotICAgICAgICBtYXRjaFVBUnVsZXMocmVzdWx0LCBDU1NEZWZh
dWx0U3R5bGVTaGVldHM6OnZpZXdTb3VyY2VTdHlsZSgpKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0
U3R5bGVzRm9yUGFnaW5hdGlvbk1vZGUoUGFnaW5hdGlvbjo6TW9kZSBwYWdpbmF0aW9uTW9kZSwg
UmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIGlmIChwYWdpbmF0aW9uTW9kZSA9PSBQYWdpbmF0
aW9uOjpVbnBhZ2luYXRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBzd2l0Y2gg
KHBhZ2luYXRpb25Nb2RlKSB7Ci0gICAgY2FzZSBQYWdpbmF0aW9uOjpMZWZ0VG9SaWdodFBhZ2lu
YXRlZDoKLSAgICAgICAgc3R5bGUtPnNldENvbHVtbkF4aXMoSG9yaXpvbnRhbENvbHVtbkF4aXMp
OwotICAgICAgICBpZiAoc3R5bGUtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCi0gICAgICAg
ICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzTGVmdFRvUmlnaHREaXJl
Y3Rpb24oKSA/IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNz
aW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNz
aW9uKHN0eWxlLT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpID8gUmV2ZXJzZUNvbHVtblBy
b2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFBhZ2luYXRpb246OlJpZ2h0VG9MZWZ0UGFnaW5hdGVkOgotICAgICAgICBzdHlsZS0+
c2V0Q29sdW1uQXhpcyhIb3Jpem9udGFsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Q
cm9ncmVzc2lvbihzdHlsZS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gUmV2ZXJzZUNvbHVt
blByb2dyZXNzaW9uIDogTm9ybWFsQ29sdW1uUHJvZ3Jlc3Npb24pOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICBzdHlsZS0+c2V0Q29sdW1uUHJvZ3Jlc3Npb24oc3R5bGUtPmlzRmxpcHBlZEJs
b2Nrc1dyaXRpbmdNb2RlKCkgPyBOb3JtYWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1
bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6VG9w
VG9Cb3R0b21QYWdpbmF0ZWQ6Ci0gICAgICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2Fs
Q29sdW1uQXhpcyk7Ci0gICAgICAgIGlmIChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUo
KSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlw
cGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbiA6IE5vcm1h
bENvbHVtblByb2dyZXNzaW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNl
dENvbHVtblByb2dyZXNzaW9uKHN0eWxlLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBOb3Jt
YWxDb2x1bW5Qcm9ncmVzc2lvbiA6IFJldmVyc2VDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgUGFnaW5hdGlvbjo6Qm90dG9tVG9Ub3BQYWdpbmF0ZWQ6Ci0gICAg
ICAgIHN0eWxlLT5zZXRDb2x1bW5BeGlzKFZlcnRpY2FsQ29sdW1uQXhpcyk7Ci0gICAgICAgIGlm
IChzdHlsZS0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAgICAgICAgIHN0eWxlLT5z
ZXRDb2x1bW5Qcm9ncmVzc2lvbihzdHlsZS0+aXNGbGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSA/
IE5vcm1hbENvbHVtblByb2dyZXNzaW9uIDogUmV2ZXJzZUNvbHVtblByb2dyZXNzaW9uKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgc3R5bGUtPnNldENvbHVtblByb2dyZXNzaW9uKHN0eWxl
LT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBSZXZlcnNlQ29sdW1uUHJvZ3Jlc3Npb24gOiBO
b3JtYWxDb2x1bW5Qcm9ncmVzc2lvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGFnaW5h
dGlvbjo6VW5wYWdpbmF0ZWQ6Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0
aW9uKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgRm9udE9yaWVudGF0aW9uJiBmb250T3JpZW50
YXRpb24sIE5vbkNKS0dseXBoT3JpZW50YXRpb24mIGdseXBoT3JpZW50YXRpb24pCi17Ci0gICAg
aWYgKHN0eWxlLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7Ci0gICAgICAgIGZvbnRPcmll
bnRhdGlvbiA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktH
bHlwaE9yaWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIHN3aXRjaCAoc3R5bGUtPnRleHRPcmllbnRhdGlvbigpKSB7Ci0gICAgY2FzZSBUZXh0T3Jp
ZW50YXRpb25WZXJ0aWNhbFJpZ2h0OgotICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNh
bDsKLSAgICAgICAgZ2x5cGhPcmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0
aWNhbFJpZ2h0OwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25VcHJp
Z2h0OgotICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsKLSAgICAgICAgZ2x5cGhP
cmllbnRhdGlvbiA9IE5vbkNKS0dseXBoT3JpZW50YXRpb25VcHJpZ2h0OwotICAgICAgICByZXR1
cm47Ci0gICAgY2FzZSBUZXh0T3JpZW50YXRpb25TaWRld2F5czoKLSAgICAgICAgaWYgKHN0eWxl
LT53cml0aW5nTW9kZSgpID09IExlZnRUb1JpZ2h0V3JpdGluZ01vZGUpIHsKLSAgICAgICAgICAg
IC8vIEZJWE1FOiBUaGlzIHNob3VsZCBtYXAgdG8gc2lkZXdheXMtbGVmdCwgd2hpY2ggaXMgbm90
IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAgICAgICBmb250T3JpZW50YXRpb24gPSBWZXJ0aWNhbDsK
LSAgICAgICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9yaWVudGF0aW9uVmVy
dGljYWxSaWdodDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb250
T3JpZW50YXRpb24gPSBIb3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9u
Q0pLR2x5cGhPcmllbnRhdGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICBj
YXNlIFRleHRPcmllbnRhdGlvblNpZGV3YXlzUmlnaHQ6Ci0gICAgICAgIGZvbnRPcmllbnRhdGlv
biA9IEhvcml6b250YWw7Ci0gICAgICAgIGdseXBoT3JpZW50YXRpb24gPSBOb25DSktHbHlwaE9y
aWVudGF0aW9uVmVydGljYWxSaWdodDsKLSAgICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBmb250T3JpZW50YXRpb24gPSBI
b3Jpem9udGFsOwotICAgICAgICBnbHlwaE9yaWVudGF0aW9uID0gTm9uQ0pLR2x5cGhPcmllbnRh
dGlvblZlcnRpY2FsUmlnaHQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLVBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQq
IGRvY3VtZW50LCBDU1NGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcikKLXsKLSAgICBGcmFtZSog
ZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKTsKLQotICAgIC8vIEhUTUw1IHN0YXRlcyB0aGF0IHNl
YW1sZXNzIGlmcmFtZXMgc2hvdWxkIHJlcGxhY2UgZGVmYXVsdCBDU1MgdmFsdWVzCi0gICAgLy8g
d2l0aCB2YWx1ZXMgaW5oZXJpdGVkIGZyb20gdGhlIGNvbnRhaW5pbmcgaWZyYW1lIGVsZW1lbnQu
IEhvd2V2ZXIsCi0gICAgLy8gc29tZSB2YWx1ZXMgKHN1Y2ggYXMgdGhlIGNhc2Ugb2YgZGVzaWdu
TW9kZSA9ICJvbiIpIHN0aWxsIG5lZWQgdG8KLSAgICAvLyBiZSBzZXQgYnkgdGhpcyAiZG9jdW1l
bnQgc3R5bGUiLgotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gZG9jdW1lbnRTdHlsZSA9IFJlbmRl
clN0eWxlOjpjcmVhdGUoKTsKLSAgICBib29sIHNlYW1sZXNzV2l0aFBhcmVudCA9IGRvY3VtZW50
LT5zaG91bGREaXNwbGF5U2VhbWxlc3NseVdpdGhQYXJlbnQoKTsKLSAgICBpZiAoc2VhbWxlc3NX
aXRoUGFyZW50KSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBpZnJhbWVTdHlsZSA9IGRvY3VtZW50
LT5zZWFtbGVzc1BhcmVudElGcmFtZSgpLT5yZW5kZXJTdHlsZSgpOwotICAgICAgICBpZiAoaWZy
YW1lU3R5bGUpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5pbmhlcml0RnJvbShpZnJhbWVT
dHlsZSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHdoaWNoIHZhbHVl
cyBiZWxvdyB3ZSB3YW50IHRvIG92ZXJyaWRlIGluIHRoZSBzZWFtbGVzcyBjYXNlIQotICAgIGRv
Y3VtZW50U3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgIGlmICghc2VhbWxlc3NXaXRoUGFy
ZW50KSB7Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldFJUTE9yZGVyaW5nKGRvY3VtZW50LT52
aXN1YWxseU9yZGVyZWQoKSA/IFZpc3VhbE9yZGVyIDogTG9naWNhbE9yZGVyKTsKLSAgICAgICAg
ZG9jdW1lbnRTdHlsZS0+c2V0Wm9vbShmcmFtZSAmJiAhZG9jdW1lbnQtPnByaW50aW5nKCkgPyBm
cmFtZS0+cGFnZVpvb21GYWN0b3IoKSA6IDEpOwotICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRQ
YWdlU2NhbGVUcmFuc2Zvcm0oZnJhbWUgPyBmcmFtZS0+ZnJhbWVTY2FsZUZhY3RvcigpIDogMSk7
Ci0gICAgICAgIGRvY3VtZW50U3R5bGUtPnNldExvY2FsZShkb2N1bWVudC0+Y29udGVudExhbmd1
YWdlKCkpOwotICAgIH0KLSAgICAvLyBUaGlzIG92ZXJyaWRlcyBhbnkgLXdlYmtpdC11c2VyLW1v
ZGlmeSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGlmcmFtZS4KLSAgICBkb2N1bWVudFN0eWxl
LT5zZXRVc2VyTW9kaWZ5KGRvY3VtZW50LT5pbkRlc2lnbk1vZGUoKSA/IFJFQURfV1JJVEUgOiBS
RUFEX09OTFkpOwotCi0gICAgRWxlbWVudCogZG9jRWxlbWVudCA9IGRvY3VtZW50LT5kb2N1bWVu
dEVsZW1lbnQoKTsKLSAgICBSZW5kZXJPYmplY3QqIGRvY0VsZW1lbnRSZW5kZXJlciA9IGRvY0Vs
ZW1lbnQgPyBkb2NFbGVtZW50LT5yZW5kZXJlcigpIDogMDsKLSAgICBpZiAoZG9jRWxlbWVudFJl
bmRlcmVyKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGlyZWN0aW9uIGFuZCB3cml0aW5nLW1vZGUg
b2YgdGhlIGJvZHkgdG8gc2V0IHRoZQotICAgICAgICAvLyB2aWV3cG9ydCdzIGRpcmVjdGlvbiBh
bmQgd3JpdGluZy1tb2RlIHVubGVzcyB0aGUgcHJvcGVydHkgaXMgc2V0IG9uIHRoZSBkb2N1bWVu
dCBlbGVtZW50LgotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBib2R5LCB0aGVuIHVzZSB0aGUg
ZG9jdW1lbnQgZWxlbWVudC4KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBib2R5UmVuZGVyZXIgPSBk
b2N1bWVudC0+Ym9keSgpID8gZG9jdW1lbnQtPmJvZHkoKS0+cmVuZGVyZXIoKSA6IDA7Ci0gICAg
ICAgIGlmIChib2R5UmVuZGVyZXIgJiYgIWRvY3VtZW50LT53cml0aW5nTW9kZVNldE9uRG9jdW1l
bnRFbGVtZW50KCkpCi0gICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShi
b2R5UmVuZGVyZXItPnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRXcml0aW5nTW9kZShkb2NFbGVtZW50UmVuZGVyZXIt
PnN0eWxlKCktPndyaXRpbmdNb2RlKCkpOwotICAgICAgICBpZiAoYm9keVJlbmRlcmVyICYmICFk
b2N1bWVudC0+ZGlyZWN0aW9uU2V0T25Eb2N1bWVudEVsZW1lbnQoKSkKLSAgICAgICAgICAgIGRv
Y3VtZW50U3R5bGUtPnNldERpcmVjdGlvbihib2R5UmVuZGVyZXItPnN0eWxlKCktPmRpcmVjdGlv
bigpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnRTdHlsZS0+c2V0RGlyZWN0
aW9uKGRvY0VsZW1lbnRSZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpOwotICAgIH0KLQot
ICAgIGlmIChmcmFtZSkgewotICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBmcmFt
ZS0+dmlldygpKSB7Ci0gICAgICAgICAgICBjb25zdCBQYWdpbmF0aW9uJiBwYWdpbmF0aW9uID0g
ZnJhbWVWaWV3LT5wYWdpbmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAocGFnaW5hdGlvbi5tb2Rl
ICE9IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3R5bGVz
Rm9yUGFnaW5hdGlvbk1vZGUocGFnaW5hdGlvbi5tb2RlLCBkb2N1bWVudFN0eWxlLmdldCgpKTsK
LSAgICAgICAgICAgICAgICBkb2N1bWVudFN0eWxlLT5zZXRDb2x1bW5HYXAocGFnaW5hdGlvbi5n
YXApOwotICAgICAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3KiB2aWV3ID0gZG9jdW1lbnQtPnJl
bmRlclZpZXcoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodmlldy0+aGFzQ29sdW1ucygp
KQotICAgICAgICAgICAgICAgICAgICAgICAgdmlldy0+dXBkYXRlQ29sdW1uSW5mb0Zyb21TdHls
ZShkb2N1bWVudFN0eWxlLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTZWFtbGVzcyBpZnJhbWVzIHdhbnQgdG8gaW5o
ZXJpdCB0aGVpciBmb250IGZyb20gdGhlaXIgcGFyZW50IGlmcmFtZSwgc28gZWFybHkgcmV0dXJu
IGJlZm9yZSBzZXR0aW5nIHRoZSBmb250LgotICAgIGlmIChzZWFtbGVzc1dpdGhQYXJlbnQpCi0g
ICAgICAgIHJldHVybiBkb2N1bWVudFN0eWxlLnJlbGVhc2UoKTsKLQotICAgIEZvbnREZXNjcmlw
dGlvbiBmb250RGVzY3JpcHRpb247Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFNjcmlwdChsb2Nh
bGVUb1NjcmlwdENvZGVGb3JGb250U2VsZWN0aW9uKGRvY3VtZW50U3R5bGUtPmxvY2FsZSgpKSk7
Ci0gICAgaWYgKFNldHRpbmdzKiBzZXR0aW5ncyA9IGRvY3VtZW50LT5zZXR0aW5ncygpKSB7Ci0g
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRp
bmcoKSB8fCAhc2V0dGluZ3MtPnNjcmVlbkZvbnRTdWJzdGl0dXRpb25FbmFibGVkKCkpOwotICAg
ICAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRl
cmluZ01vZGUoKSk7Ci0gICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgc3RhbmRhcmRGb250ID0g
c2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseShmb250RGVzY3JpcHRpb24uc2NyaXB0KCkpOwot
ICAgICAgICBpZiAoIXN0YW5kYXJkRm9udC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U3RhbmRhcmRGYW1p
bHkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5
KHN0YW5kYXJkRm9udCk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uZmlyc3RGYW1pbHko
KS5hcHBlbmRGYW1pbHkoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNl
dEtleXdvcmRTaXplKENTU1ZhbHVlTWVkaXVtIC0gQ1NTVmFsdWVYeFNtYWxsICsgMSk7Ci0gICAg
ICAgIGludCBzaXplID0gU3R5bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3b3JkKGRvY3VtZW50
LCBDU1NWYWx1ZU1lZGl1bSwgZmFsc2UpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0U3Bl
Y2lmaWVkU2l6ZShzaXplKTsKLSAgICAgICAgYm9vbCB1c2VTVkdab29tUnVsZXMgPSBkb2N1bWVu
dC0+aXNTVkdEb2N1bWVudCgpOwotICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRT
aXplKFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKGRvY3Vt
ZW50LCBkb2N1bWVudFN0eWxlLmdldCgpLCBmb250RGVzY3JpcHRpb24uaXNBYnNvbHV0ZVNpemUo
KSwgc2l6ZSwgdXNlU1ZHWm9vbVJ1bGVzKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRVc2VQcmludGVyRm9udChkb2N1bWVudC0+cHJpbnRpbmcoKSk7Ci0KLSAgICBG
b250T3JpZW50YXRpb24gZm9udE9yaWVudGF0aW9uOwotICAgIE5vbkNKS0dseXBoT3JpZW50YXRp
b24gZ2x5cGhPcmllbnRhdGlvbjsKLSAgICBnZXRGb250QW5kR2x5cGhPcmllbnRhdGlvbihkb2N1
bWVudFN0eWxlLmdldCgpLCBmb250T3JpZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRPcmllbnRhdGlvbihmb250T3JpZW50YXRpb24pOwotICAgIGZv
bnREZXNjcmlwdGlvbi5zZXROb25DSktHbHlwaE9yaWVudGF0aW9uKGdseXBoT3JpZW50YXRpb24p
OwotCi0gICAgZG9jdW1lbnRTdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlv
bik7Ci0gICAgZG9jdW1lbnRTdHlsZS0+Zm9udCgpLnVwZGF0ZShmb250U2VsZWN0b3IpOwotCi0g
ICAgcmV0dXJuIGRvY3VtZW50U3R5bGUucmVsZWFzZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJv
b2wgaXNBdFNoYWRvd0JvdW5kYXJ5KGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgaWYg
KCFlbGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQ29udGFpbmVyTm9kZSogcGFy
ZW50Tm9kZSA9IGVsZW1lbnQtPnBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSAm
JiBwYXJlbnROb2RlLT5pc1NoYWRvd1Jvb3QoKTsKLX0KLQotUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIFJlbmRl
clN0eWxlKiBkZWZhdWx0UGFyZW50LAotICAgIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHNoYXJpbmdC
ZWhhdmlvciwgUnVsZU1hdGNoaW5nQmVoYXZpb3IgbWF0Y2hpbmdCZWhhdmlvciwgUmVuZGVyUmVn
aW9uKiByZWdpb25Gb3JTdHlsaW5nKQotewotICAgIC8vIE9uY2UgYW4gZWxlbWVudCBoYXMgYSBy
ZW5kZXJlciwgd2UgZG9uJ3QgdHJ5IHRvIGRlc3Ryb3kgaXQsIHNpbmNlIG90aGVyd2lzZSB0aGUg
cmVuZGVyZXIKLSAgICAvLyB3aWxsIHZhbmlzaCBpZiBhIHN0eWxlIHJlY2FsYyBoYXBwZW5zIGR1
cmluZyBsb2FkaW5nLgotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHlsZVNoYXJp
bmcgJiYgIWVsZW1lbnQtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpICYmICFl
bGVtZW50LT5yZW5kZXJlcigpKSB7Ci0gICAgICAgIGlmICghc19zdHlsZU5vdFlldEF2YWlsYWJs
ZSkgewotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZSA9IFJlbmRlclN0eWxlOjpj
cmVhdGUoKS5sZWFrUmVmKCk7Ci0gICAgICAgICAgICBzX3N0eWxlTm90WWV0QXZhaWxhYmxlLT5z
ZXREaXNwbGF5KE5PTkUpOwotICAgICAgICAgICAgc19zdHlsZU5vdFlldEF2YWlsYWJsZS0+Zm9u
dCgpLnVwZGF0ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC0+
ZG9jdW1lbnQoKS0+c2V0SGFzTm9kZXNXaXRoUGxhY2Vob2xkZXJTdHlsZSgpOwotICAgICAgICBy
ZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJsZTsKLSAgICB9Ci0KLSAgICBTdGF0ZSYgc3RhdGUg
PSBtX3N0YXRlOwotICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0YXRlLmluaXRGb3JT
dHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgTk9QU0VVRE8s
IHJlZ2lvbkZvclN0eWxpbmcpOwotICAgIGlmIChzaGFyaW5nQmVoYXZpb3IgPT0gQWxsb3dTdHls
ZVNoYXJpbmcgJiYgIXN0YXRlLmRpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAg
ICAgIFJlbmRlclN0eWxlKiBzaGFyZWRTdHlsZSA9IGxvY2F0ZVNoYXJlZFN0eWxlKCk7Ci0gICAg
ICAgIGlmIChzaGFyZWRTdHlsZSkKLSAgICAgICAgICAgIHJldHVybiBzaGFyZWRTdHlsZTsKLSAg
ICB9Ci0KLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGNsb25lRm9yUGFyZW50OwotCi0gICAgaWYg
KHN0YXRlLnBhcmVudFN0eWxlKCkpIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5
bGU6OmNyZWF0ZSgpKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20oc3RhdGUu
cGFyZW50U3R5bGUoKSwgaXNBdFNoYWRvd0JvdW5kYXJ5KGVsZW1lbnQpID8gUmVuZGVyU3R5bGU6
OkF0U2hhZG93Qm91bmRhcnkgOiBSZW5kZXJTdHlsZTo6Tm90QXRTaGFkb3dCb3VuZGFyeSk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGUuc2V0U3R5bGUoZGVmYXVsdFN0eWxlRm9yRWxlbWVu
dCgpKTsKLSAgICAgICAgY2xvbmVGb3JQYXJlbnQgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoc3RhdGUu
c3R5bGUoKSk7Ci0gICAgICAgIHN0YXRlLnNldFBhcmVudFN0eWxlKGNsb25lRm9yUGFyZW50Lmdl
dCgpKTsKLSAgICB9Ci0gICAgLy8gY29udGVudGVkaXRhYmxlIGF0dHJpYnV0ZSAoaW1wbGVtZW50
ZWQgYnkgLXdlYmtpdC11c2VyLW1vZGlmeSkgc2hvdWxkCi0gICAgLy8gYmUgcHJvcGFnYXRlZCBm
cm9tIHNoYWRvdyBob3N0IHRvIGRpc3RyaWJ1dGVkIG5vZGUuCi0gICAgaWYgKHN0YXRlLmRpc3Ry
aWJ1dGVkVG9JbnNlcnRpb25Qb2ludCgpKSB7Ci0gICAgICAgIGlmIChFbGVtZW50KiBwYXJlbnQg
PSBlbGVtZW50LT5wYXJlbnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJTdHls
ZSogc3R5bGVPZlNoYWRvd0hvc3QgPSBwYXJlbnQtPnJlbmRlclN0eWxlKCkpCi0gICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0VXNlck1vZGlmeShzdHlsZU9mU2hhZG93SG9zdC0+dXNl
ck1vZGlmeSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlbGVtZW50LT5pc0xpbmso
KSkgewotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJc0xpbmsodHJ1ZSk7Ci0gICAgICAgIEVJ
bnNpZGVMaW5rIGxpbmtTdGF0ZSA9IHN0YXRlLmVsZW1lbnRMaW5rU3RhdGUoKTsKLSAgICAgICAg
aWYgKGxpbmtTdGF0ZSAhPSBOb3RJbnNpZGVMaW5rKSB7Ci0gICAgICAgICAgICBib29sIGZvcmNl
VmlzaXRlZCA9IEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6Zm9yY2VQc2V1ZG9TdGF0ZShlbGVt
ZW50LCBDU1NTZWxlY3Rvcjo6UHNldWRvVmlzaXRlZCk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VW
aXNpdGVkKQotICAgICAgICAgICAgICAgIGxpbmtTdGF0ZSA9IEluc2lkZVZpc2l0ZWRMaW5rOwot
ICAgICAgICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEluc2lkZUxpbmsobGlua1N0YXRl
KTsKLSAgICB9Ci0KLSAgICBib29sIG5lZWRzQ29sbGVjdGlvbiA9IGZhbHNlOwotICAgIENTU0Rl
ZmF1bHRTdHlsZVNoZWV0czo6ZW5zdXJlRGVmYXVsdFN0eWxlU2hlZXRzRm9yRWxlbWVudChlbGVt
ZW50LCBuZWVkc0NvbGxlY3Rpb24pOwotICAgIGlmIChuZWVkc0NvbGxlY3Rpb24pCi0gICAgICAg
IG1fcnVsZVNldHMuY29sbGVjdEZlYXR1cmVzKGRvY3VtZW50KCktPmlzVmlld1NvdXJjZSgpLCBt
X3Njb3BlUmVzb2x2ZXIuZ2V0KCkpOwotCi0gICAgTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQ7Ci0g
ICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5VXNlckFnZW50UnVsZXMpCi0gICAg
ICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7Ci0gICAgZWxzZQotICAgICAgICBtYXRjaEFs
bFJ1bGVzKG1hdGNoUmVzdWx0LCBtYXRjaGluZ0JlaGF2aW9yICE9IE1hdGNoQWxsUnVsZXNFeGNs
dWRpbmdTTUlMKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGVs
ZW1lbnQpOwotCi0gICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkgYW5k
IHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCi0gICAgYWRqdXN0UmVuZGVy
U3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxlbWVudCk7Ci0KLSAg
ICBzdGF0ZS5jbGVhcigpOyAvLyBDbGVhciBvdXQgZm9yIHRoZSBuZXh0IHJlc29sdmUuCi0KLSAg
ICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAvLyBOb3cgcmV0
dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19Ci0KLVBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yS2V5ZnJhbWUoY29uc3Qg
UmVuZGVyU3R5bGUqIGVsZW1lbnRTdHlsZSwgY29uc3QgU3R5bGVLZXlmcmFtZSoga2V5ZnJhbWUs
IEtleWZyYW1lVmFsdWUmIGtleWZyYW1lVmFsdWUpCi17Ci0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0
OwotICAgIGlmIChrZXlmcmFtZS0+cHJvcGVydGllcygpKQotICAgICAgICBhZGRNYXRjaGVkUHJv
cGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpOwotCi0gICAgQVNTRVJUKCFt
X3N0YXRlLnN0eWxlKCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0ZTsKLQotICAgIC8v
IENyZWF0ZSB0aGUgc3R5bGUKLSAgICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y2xvbmUo
ZWxlbWVudFN0eWxlKSk7Ci0gICAgc3RhdGUuc2V0TGluZUhlaWdodFZhbHVlKDApOwotCi0gICAg
Ly8gV2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgd2l0aCAhaW1wb3J0YW50LiBTaW5jZSB0aGVyZSBp
cyBvbmx5IGV2ZXIgb25lCi0gICAgLy8gZGVjbCwgdGhlcmUncyBub3RoaW5nIHRvIG92ZXJyaWRl
LiBTbyBqdXN0IGFkZCB0aGUgZmlyc3QgcHJvcGVydGllcy4KLSAgICBib29sIGluaGVyaXRlZE9u
bHkgPSBmYWxzZTsKLSAgICBpZiAoa2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkKLSAgICAgICAgYXBw
bHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNl
LCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7
Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCwgZ28gYWhlYWQgYW5kIHVwZGF0ZSBp
dCBub3cuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gTGluZS1oZWlnaHQgaXMgc2V0IHdo
ZW4gd2UgYXJlIHN1cmUgd2UgZGVjaWRlZCBvbiB0aGUgZm9udC1zaXplCi0gICAgaWYgKHN0YXRl
LmxpbmVIZWlnaHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5KENTU1Byb3BlcnR5TGlu
ZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAgLy8gTm93IGRvIHJlc3Qg
b2YgdGhlIHByb3BlcnRpZXMuCi0gICAgaWYgKGtleWZyYW1lLT5wcm9wZXJ0aWVzKCkpCi0gICAg
ICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJpb3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQs
IGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVk
T25seSk7Ci0KLSAgICAvLyBJZiBvdXIgZm9udCBnb3QgZGlydGllZCBieSBvbmUgb2YgdGhlIG5v
bi1lc3NlbnRpYWwgZm9udCBwcm9wcywKLSAgICAvLyBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IGEg
c2Vjb25kIHRpbWUuCi0gICAgdXBkYXRlRm9udCgpOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyBy
ZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3Vy
Y2VzKCk7Ci0gICAgCi0gICAgLy8gQWRkIGFsbCB0aGUgYW5pbWF0aW5nIHByb3BlcnRpZXMgdG8g
dGhlIGtleWZyYW1lLgotICAgIGlmIChjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBzdHlsZURlY2xh
cmF0aW9uID0ga2V5ZnJhbWUtPnByb3BlcnRpZXMoKSkgewotICAgICAgICB1bnNpZ25lZCBwcm9w
ZXJ0eUNvdW50ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlDb3VudCgpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcHJvcGVydHlDb3VudDsgKytpKSB7Ci0gICAgICAgICAg
ICBDU1NQcm9wZXJ0eUlEIHByb3BlcnR5ID0gc3R5bGVEZWNsYXJhdGlvbi0+cHJvcGVydHlBdChp
KS5pZCgpOwotICAgICAgICAgICAgLy8gVGltaW5nLWZ1bmN0aW9uIHdpdGhpbiBrZXlmcmFtZXMg
aXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBub3QgYW5pbWF0ZWQ7IGl0IGp1c3QKLSAgICAgICAg
ICAgIC8vIGRlc2NyaWJlcyB0aGUgdGltaW5nIGZ1bmN0aW9uIGJldHdlZW4gdGhpcyBrZXlmcmFt
ZSBhbmQgdGhlIG5leHQuCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gQ1NTUHJvcGVydHlX
ZWJraXRBbmltYXRpb25UaW1pbmdGdW5jdGlvbikKLSAgICAgICAgICAgICAgICBrZXlmcmFtZVZh
bHVlLmFkZFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRvY3Vt
ZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAgIHJldHVybiBzdGF0ZS50YWtl
U3R5bGUoKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjprZXlmcmFtZVN0eWxlc0ZvckFuaW1h
dGlvbihFbGVtZW50KiBlLCBjb25zdCBSZW5kZXJTdHlsZSogZWxlbWVudFN0eWxlLCBLZXlmcmFt
ZUxpc3QmIGxpc3QpCi17Ci0gICAgbGlzdC5jbGVhcigpOwotCi0gICAgLy8gR2V0IHRoZSBrZXlm
cmFtZXNSdWxlIGZvciB0aGlzIG5hbWUKLSAgICBpZiAoIWUgfHwgbGlzdC5hbmltYXRpb25OYW1l
KCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX2tleWZyYW1lc1J1bGVNYXAu
Y2hlY2tDb25zaXN0ZW5jeSgpOwotCi0gICAgS2V5ZnJhbWVzUnVsZU1hcDo6aXRlcmF0b3IgaXQg
PSBtX2tleWZyYW1lc1J1bGVNYXAuZmluZChsaXN0LmFuaW1hdGlvbk5hbWUoKS5pbXBsKCkpOwot
ICAgIGlmIChpdCA9PSBtX2tleWZyYW1lc1J1bGVNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGNvbnN0IFN0eWxlUnVsZUtleWZyYW1lcyoga2V5ZnJhbWVzUnVsZSA9IGl0LT52YWx1
ZS5nZXQoKTsKLQotICAgIC8vIENvbnN0cnVjdCBhbmQgcG9wdWxhdGUgdGhlIHN0eWxlIGZvciBl
YWNoIGtleWZyYW1lCi0gICAgY29uc3QgVmVjdG9yPFJlZlB0cjxTdHlsZUtleWZyYW1lPiA+JiBr
ZXlmcmFtZXMgPSBrZXlmcmFtZXNSdWxlLT5rZXlmcmFtZXMoKTsKLSAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwga2V5ZnJhbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIC8vIEFwcGx5IHRo
ZSBkZWNsYXJhdGlvbiB0byB0aGUgc3R5bGUuIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24g
b2YgdGhlIGxvZ2ljIGluIHN0eWxlRm9yRWxlbWVudAotICAgICAgICBpbml0RWxlbWVudChlKTsK
LSAgICAgICAgbV9zdGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUpOwotCi0g
ICAgICAgIGNvbnN0IFN0eWxlS2V5ZnJhbWUqIGtleWZyYW1lID0ga2V5ZnJhbWVzW2ldLmdldCgp
OwotCi0gICAgICAgIEtleWZyYW1lVmFsdWUga2V5ZnJhbWVWYWx1ZSgwLCAwKTsKLSAgICAgICAg
a2V5ZnJhbWVWYWx1ZS5zZXRTdHlsZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwga2V5
ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLQotICAgICAgICAvLyBBZGQgdGhpcyBrZXlmcmFtZSBz
dHlsZSB0byBhbGwgdGhlIGluZGljYXRlZCBrZXkgdGltZXMKLSAgICAgICAgVmVjdG9yPGZsb2F0
PiBrZXlzOwotICAgICAgICBrZXlmcmFtZS0+Z2V0S2V5cyhrZXlzKTsKLSAgICAgICAgZm9yIChz
aXplX3Qga2V5SW5kZXggPSAwOyBrZXlJbmRleCA8IGtleXMuc2l6ZSgpOyArK2tleUluZGV4KSB7
Ci0gICAgICAgICAgICBrZXlmcmFtZVZhbHVlLnNldEtleShrZXlzW2tleUluZGV4XSk7Ci0gICAg
ICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIC8vIElmIHRoZSAwJSBrZXlmcmFtZSBpcyBtaXNzaW5nLCBjcmVhdGUgaXQgKGJ1dCBvbmx5
IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdGhlciBrZXlmcmFtZSkKLSAgICBpbnQgaW5pdGlh
bExpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYg
bGlzdFswXS5rZXkoKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlmcmFtZSogemVyb1BlcmNl
bnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCF6ZXJvUGVyY2VudEtleWZyYW1lKSB7Ci0gICAgICAg
ICAgICB6ZXJvUGVyY2VudEtleWZyYW1lID0gU3R5bGVLZXlmcmFtZTo6Y3JlYXRlKCkubGVha1Jl
ZigpOwotICAgICAgICAgICAgemVyb1BlcmNlbnRLZXlmcmFtZS0+c2V0S2V5VGV4dCgiMCUiKTsK
LSAgICAgICAgfQotICAgICAgICBLZXlmcmFtZVZhbHVlIGtleWZyYW1lVmFsdWUoMCwgMCk7Ci0g
ICAgICAgIGtleWZyYW1lVmFsdWUuc2V0U3R5bGUoc3R5bGVGb3JLZXlmcmFtZShlbGVtZW50U3R5
bGUsIHplcm9QZXJjZW50S2V5ZnJhbWUsIGtleWZyYW1lVmFsdWUpKTsKLSAgICAgICAgbGlzdC5p
bnNlcnQoa2V5ZnJhbWVWYWx1ZSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIDEwMCUga2V5ZnJh
bWUgaXMgbWlzc2luZywgY3JlYXRlIGl0IChidXQgb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBv
bmUgb3RoZXIga2V5ZnJhbWUpCi0gICAgaWYgKGluaXRpYWxMaXN0U2l6ZSA+IDAgJiYgKGxpc3Rb
bGlzdC5zaXplKCkgLSAxXS5rZXkoKSAhPSAxKSkgewotICAgICAgICBzdGF0aWMgU3R5bGVLZXlm
cmFtZSogaHVuZHJlZFBlcmNlbnRLZXlmcmFtZTsKLSAgICAgICAgaWYgKCFodW5kcmVkUGVyY2Vu
dEtleWZyYW1lKSB7Ci0gICAgICAgICAgICBodW5kcmVkUGVyY2VudEtleWZyYW1lID0gU3R5bGVL
ZXlmcmFtZTo6Y3JlYXRlKCkubGVha1JlZigpOwotICAgICAgICAgICAgaHVuZHJlZFBlcmNlbnRL
ZXlmcmFtZS0+c2V0S2V5VGV4dCgiMTAwJSIpOwotICAgICAgICB9Ci0gICAgICAgIEtleWZyYW1l
VmFsdWUga2V5ZnJhbWVWYWx1ZSgxLCAwKTsKLSAgICAgICAga2V5ZnJhbWVWYWx1ZS5zZXRTdHls
ZShzdHlsZUZvcktleWZyYW1lKGVsZW1lbnRTdHlsZSwgaHVuZHJlZFBlcmNlbnRLZXlmcmFtZSwg
a2V5ZnJhbWVWYWx1ZSkpOwotICAgICAgICBsaXN0Lmluc2VydChrZXlmcmFtZVZhbHVlKTsKLSAg
ICB9Ci19Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnBzZXVkb1N0
eWxlRm9yRWxlbWVudChFbGVtZW50KiBlLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVk
b1N0eWxlUmVxdWVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIEFTU0VSVChw
YXJlbnRTdHlsZSk7Ci0gICAgaWYgKCFlKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFN0YXRl
JiBzdGF0ZSA9IG1fc3RhdGU7Ci0KLSAgICBpbml0RWxlbWVudChlKTsKLQotICAgIHN0YXRlLmlu
aXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgcGFyZW50U3R5bGUsIHBzZXVkb1N0eWxl
UmVxdWVzdCk7Ci0gICAgc3RhdGUuc2V0U3R5bGUoUmVuZGVyU3R5bGU6OmNyZWF0ZSgpKTsKLSAg
ICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotCi0g
ICAgLy8gU2luY2Ugd2UgZG9uJ3QgdXNlIHBzZXVkby1lbGVtZW50cyBpbiBhbnkgb2Ygb3VyIHF1
aXJrL3ByaW50IHVzZXIgYWdlbnQgcnVsZXMsIGRvbid0IHdhc3RlIHRpbWUgd2Fsa2luZwotICAg
IC8vIHRob3NlIHJ1bGVzLgotCi0gICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5kIGF1dGhvciBydWxl
cy4KLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVBUnVsZXMobWF0Y2hS
ZXN1bHQpOwotCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKSB7Ci0gICAgICAg
IG1hdGNoVXNlclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgIG1hdGNoQXV0aG9y
UnVsZXMobWF0Y2hSZXN1bHQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAobWF0Y2hSZXN1bHQu
bWF0Y2hlZFByb3BlcnRpZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN0
YXRlLnN0eWxlKCktPnNldFN0eWxlVHlwZShwc2V1ZG9TdHlsZVJlcXVlc3QucHNldWRvSWQpOwot
Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllcyhtYXRjaFJlc3VsdCwgZSk7Ci0KLSAgICAvLyBD
bGVhbiB1cCBvdXIgc3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAo
YW1vbmcgb3RoZXIgZml4dXBzKS4KLSAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgp
LCBtX3N0YXRlLnBhcmVudFN0eWxlKCksIDApOwotCi0gICAgLy8gU3RhcnQgbG9hZGluZyByZXNv
dXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHN0eWxlLgotICAgIGxvYWRQZW5kaW5nUmVzb3VyY2Vz
KCk7Ci0KLSAgICBkb2N1bWVudCgpLT5kaWRBY2Nlc3NTdHlsZVJlc29sdmVyKCk7Ci0KLSAgICAv
LyBOb3cgcmV0dXJuIHRoZSBzdHlsZS4KLSAgICByZXR1cm4gc3RhdGUudGFrZVN0eWxlKCk7Ci19
Ci0KLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6OnN0eWxlRm9yUGFnZShp
bnQgcGFnZUluZGV4KQotewotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVu
dCgpLCBkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSk7IC8vIG1fcm9vdEVsZW1lbnRTdHls
ZSB3aWxsIGJlIHNldCB0byB0aGUgZG9jdW1lbnQgc3R5bGUuCi0KLSAgICBtX3N0YXRlLnNldFN0
eWxlKFJlbmRlclN0eWxlOjpjcmVhdGUoKSk7Ci0gICAgbV9zdGF0ZS5zdHlsZSgpLT5pbmhlcml0
RnJvbShtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICBjb25zdCBib29sIGlzTGVm
dCA9IGlzTGVmdFBhZ2UocGFnZUluZGV4KTsKLSAgICBjb25zdCBib29sIGlzRmlyc3QgPSBpc0Zp
cnN0UGFnZShwYWdlSW5kZXgpOwotICAgIGNvbnN0IFN0cmluZyBwYWdlID0gcGFnZU5hbWUocGFn
ZUluZGV4KTsKLSAgICAKLSAgICBNYXRjaFJlc3VsdCByZXN1bHQ7Ci0gICAgbWF0Y2hQYWdlUnVs
ZXMocmVzdWx0LCBDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRQcmludFN0eWxlLCBpc0xl
ZnQsIGlzRmlyc3QsIHBhZ2UpOwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0
cy51c2VyU3R5bGUoKSwgaXNMZWZ0LCBpc0ZpcnN0LCBwYWdlKTsKLSAgICAvLyBPbmx5IGNvbnNp
ZGVyIHRoZSBnbG9iYWwgYXV0aG9yIFJ1bGVTZXQgZm9yIEBwYWdlIHJ1bGVzLCBhcyBwZXIgdGhl
IEhUTUw1IHNwZWMuCi0gICAgbWF0Y2hQYWdlUnVsZXMocmVzdWx0LCBtX3J1bGVTZXRzLmF1dGhv
clN0eWxlKCksIGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgbV9zdGF0ZS5zZXRMaW5lSGVp
Z2h0VmFsdWUoMCk7Ci0gICAgYm9vbCBpbmhlcml0ZWRPbmx5ID0gZmFsc2U7Ci0jaWYgRU5BQkxF
KENTU19WQVJJQUJMRVMpCi0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmlu
aXRpb25zPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMSwgaW5oZXJpdGVkT25seSk7Ci0jZW5kaWYKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVz
PEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KHJlc3VsdCwgZmFsc2UsIDAsIHJlc3VsdC5tYXRjaGVk
UHJvcGVydGllcy5zaXplKCkgLSAxLCBpbmhlcml0ZWRPbmx5KTsKLQotICAgIC8vIElmIG91ciBm
b250IGdvdCBkaXJ0aWVkLCBnbyBhaGVhZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1cGRhdGVG
b250KCk7Ci0KLSAgICAvLyBMaW5lLWhlaWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBk
ZWNpZGVkIG9uIHRoZSBmb250LXNpemUuCi0gICAgaWYgKG1fc3RhdGUubGluZUhlaWdodFZhbHVl
KCkpCi0gICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCBtX3N0YXRl
LmxpbmVIZWlnaHRWYWx1ZSgpKTsKLQotICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRpZXM8TG93UHJp
b3JpdHlQcm9wZXJ0aWVzPihyZXN1bHQsIGZhbHNlLCAwLCByZXN1bHQubWF0Y2hlZFByb3BlcnRp
ZXMuc2l6ZSgpIC0gMSwgaW5oZXJpdGVkT25seSk7Ci0KLSAgICAvLyBTdGFydCBsb2FkaW5nIHJl
c291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdSZXNvdXJj
ZXMoKTsKLQotICAgIGRvY3VtZW50KCktPmRpZEFjY2Vzc1N0eWxlUmVzb2x2ZXIoKTsKLQotICAg
IC8vIE5vdyByZXR1cm4gdGhlIHN0eWxlLgotICAgIHJldHVybiBtX3N0YXRlLnRha2VTdHlsZSgp
OwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpkZWZhdWx0U3R5
bGVGb3JFbGVtZW50KCkKLXsKLSAgICBtX3N0YXRlLnNldFN0eWxlKFJlbmRlclN0eWxlOjpjcmVh
dGUoKSk7Ci0gICAgLy8gTWFrZSBzdXJlIG91ciBmb250cyBhcmUgaW5pdGlhbGl6ZWQgaWYgd2Ug
ZG9uJ3QgaW5oZXJpdCB0aGVtIGZyb20gb3VyIHBhcmVudCBzdHlsZS4KLSAgICBpZiAoU2V0dGlu
Z3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpKSB7Ci0gICAgICAgIGluaXRpYWxpemVG
b250U3R5bGUoc2V0dGluZ3MpOwotICAgICAgICBtX3N0YXRlLnN0eWxlKCktPmZvbnQoKS51cGRh
dGUoZm9udFNlbGVjdG9yKCkpOwotICAgIH0gZWxzZQotICAgICAgICBtX3N0YXRlLnN0eWxlKCkt
PmZvbnQoKS51cGRhdGUoMCk7Ci0KLSAgICByZXR1cm4gbV9zdGF0ZS50YWtlU3R5bGUoKTsKLX0K
LQotUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6c3R5bGVGb3JUZXh0KFRl
eHQqIHRleHROb2RlKQotewotICAgIEFTU0VSVCh0ZXh0Tm9kZSk7Ci0KLSAgICBOb2RlUmVuZGVy
aW5nQ29udGV4dCBjb250ZXh0KHRleHROb2RlKTsKLSAgICBOb2RlKiBwYXJlbnROb2RlID0gY29u
dGV4dC5wYXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKTsKLSAgICByZXR1cm4gY29udGV4
dC5yZXNldFN0eWxlSW5oZXJpdGFuY2UoKSB8fCAhcGFyZW50Tm9kZSA/Ci0gICAgICAgIGRlZmF1
bHRTdHlsZUZvckVsZW1lbnQoKSA6IHBhcmVudE5vZGUtPnJlbmRlclN0eWxlKCk7Ci19Ci0KLXN0
YXRpYyB2b2lkIGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAg
IC8vIEludHJpbnNpYyBtYXJnaW4gdmFsdWUuCi0gICAgY29uc3QgaW50IGludHJpbnNpY01hcmdp
biA9IDIgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gRklYTUU6IFVzaW5nIHdp
ZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgt
d2lkdGggaXMgZmxhd2VkLgotICAgIC8vIEZJWE1FOiBVc2luZyAicXVpcmsiIHRvIGRlY2lkZSB0
aGUgbWFyZ2luIHdhc24ndCBzZXQgaXMga2luZCBvZiBsYW1lLgotICAgIGlmIChzdHlsZS0+d2lk
dGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7Ci0gICAgICAgIGlmIChzdHlsZS0+bWFyZ2luTGVm
dCgpLnF1aXJrKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVmdChMZW5ndGgoaW50
cmluc2ljTWFyZ2luLCBGaXhlZCkpOwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblJpZ2h0KCku
cXVpcmsoKSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChMZW5ndGgoaW50cmlu
c2ljTWFyZ2luLCBGaXhlZCkpOwotICAgIH0KLQotICAgIGlmIChzdHlsZS0+aGVpZ2h0KCkuaXNB
dXRvKCkpIHsKLSAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5Ub3AoKS5xdWlyaygpKQotICAgICAg
ICAgICAgc3R5bGUtPnNldE1hcmdpblRvcChMZW5ndGgoaW50cmluc2ljTWFyZ2luLCBGaXhlZCkp
OwotICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkpCi0gICAgICAgICAg
ICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChpbnRyaW5zaWNNYXJnaW4sIEZpeGVkKSk7
Ci0gICAgfQotfQotCi1zdGF0aWMgRURpc3BsYXkgZXF1aXZhbGVudEJsb2NrRGlzcGxheShFRGlz
cGxheSBkaXNwbGF5LCBib29sIGlzRmxvYXRpbmcsIGJvb2wgc3RyaWN0UGFyc2luZykKLXsKLSAg
ICBzd2l0Y2ggKGRpc3BsYXkpIHsKLSAgICBjYXNlIEJMT0NLOgotICAgIGNhc2UgVEFCTEU6Ci0g
ICAgY2FzZSBCT1g6Ci0gICAgY2FzZSBGTEVYOgotICAgIGNhc2UgR1JJRDoKLSAgICAgICAgcmV0
dXJuIGRpc3BsYXk7Ci0KLSAgICBjYXNlIExJU1RfSVRFTToKLSAgICAgICAgLy8gSXQgaXMgYSBX
aW5JRSBidWcgdGhhdCBmbG9hdGVkIGxpc3QgaXRlbXMgbG9zZSB0aGVpciBidWxsZXRzLCBzbyB3
ZSdsbCBlbXVsYXRlIHRoZSBxdWlyaywgYnV0IG9ubHkgaW4gcXVpcmtzIG1vZGUuCi0gICAgICAg
IGlmICghc3RyaWN0UGFyc2luZyAmJiBpc0Zsb2F0aW5nKQotICAgICAgICAgICAgcmV0dXJuIEJM
T0NLOwotICAgICAgICByZXR1cm4gZGlzcGxheTsKLSAgICBjYXNlIElOTElORV9UQUJMRToKLSAg
ICAgICAgcmV0dXJuIFRBQkxFOwotICAgIGNhc2UgSU5MSU5FX0JPWDoKLSAgICAgICAgcmV0dXJu
IEJPWDsKLSAgICBjYXNlIElOTElORV9GTEVYOgotICAgICAgICByZXR1cm4gRkxFWDsKLSAgICBj
YXNlIElOTElORV9HUklEOgotICAgICAgICByZXR1cm4gR1JJRDsKLQotICAgIGNhc2UgSU5MSU5F
OgotICAgIGNhc2UgUlVOX0lOOgotICAgIGNhc2UgQ09NUEFDVDoKLSAgICBjYXNlIElOTElORV9C
TE9DSzoKLSAgICBjYXNlIFRBQkxFX1JPV19HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0hFQURFUl9H
Uk9VUDoKLSAgICBjYXNlIFRBQkxFX0ZPT1RFUl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX1JPVzoK
LSAgICBjYXNlIFRBQkxFX0NPTFVNTl9HUk9VUDoKLSAgICBjYXNlIFRBQkxFX0NPTFVNTjoKLSAg
ICBjYXNlIFRBQkxFX0NFTEw6Ci0gICAgY2FzZSBUQUJMRV9DQVBUSU9OOgotICAgICAgICByZXR1
cm4gQkxPQ0s7Ci0gICAgY2FzZSBOT05FOgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgcmV0dXJuIE5PTkU7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwot
ICAgIHJldHVybiBCTE9DSzsKLX0KLQotLy8gQ1NTIHJlcXVpcmVzIHRleHQtZGVjb3JhdGlvbiB0
byBiZSByZXNldCBhdCBlYWNoIERPTSBlbGVtZW50IGZvciB0YWJsZXMsIAotLy8gaW5saW5lIGJs
b2NrcywgaW5saW5lIHRhYmxlcywgcnVuLWlucywgc2hhZG93IERPTSBjcm9zc2luZ3MsIGZsb2F0
aW5nIGVsZW1lbnRzLAotLy8gYW5kIGFic29sdXRlIG9yIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBl
bGVtZW50cy4KLXN0YXRpYyBib29sIGRvZXNOb3RJbmhlcml0VGV4dERlY29yYXRpb24oUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKQotewotICAgIHJldHVybiBzdHlsZS0+ZGlzcGxheSgp
ID09IFRBQkxFIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX1RBQkxFIHx8IHN0eWxlLT5k
aXNwbGF5KCkgPT0gUlVOX0lOCi0gICAgICAgIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5F
X0JMT0NLIHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gSU5MSU5FX0JPWCB8fCBpc0F0U2hhZG93Qm91
bmRhcnkoZSkKLSAgICAgICAgfHwgc3R5bGUtPmlzRmxvYXRpbmcoKSB8fCBzdHlsZS0+aGFzT3V0
T2ZGbG93UG9zaXRpb24oKTsKLX0KLQotc3RhdGljIGJvb2wgaXNEaXNwbGF5RmxleGlibGVCb3go
RURpc3BsYXkgZGlzcGxheSkKLXsKLSAgICByZXR1cm4gZGlzcGxheSA9PSBGTEVYIHx8IGRpc3Bs
YXkgPT0gSU5MSU5FX0ZMRVg7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YWRqdXN0UmVuZGVy
U3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1l
bnQgKmUpCi17Ci0gICAgQVNTRVJUKHBhcmVudFN0eWxlKTsKLQotICAgIC8vIENhY2hlIG91ciBv
cmlnaW5hbCBkaXNwbGF5LgotICAgIHN0eWxlLT5zZXRPcmlnaW5hbERpc3BsYXkoc3R5bGUtPmRp
c3BsYXkoKSk7Ci0KLSAgICBpZiAoc3R5bGUtPmRpc3BsYXkoKSAhPSBOT05FKSB7Ci0gICAgICAg
IC8vIElmIHdlIGhhdmUgYSA8dGQ+IHRoYXQgc3BlY2lmaWVzIGEgZmxvYXQgcHJvcGVydHksIGlu
IHF1aXJrcyBtb2RlIHdlIGp1c3QgZHJvcCB0aGUgZmxvYXQKLSAgICAgICAgLy8gcHJvcGVydHku
Ci0gICAgICAgIC8vIFNpdGVzIGFsc28gY29tbW9ubHkgdXNlIGRpc3BsYXk6aW5saW5lL2Jsb2Nr
IG9uIDx0ZD5zIGFuZCA8dGFibGU+cy4gSW4gcXVpcmtzIG1vZGUgd2UgZm9yY2UKLSAgICAgICAg
Ly8gdGhlc2UgdGFncyB0byByZXRhaW4gdGhlaXIgZGlzcGxheSB0eXBlcy4KLSAgICAgICAgaWYg
KGRvY3VtZW50KCktPmluUXVpcmtzTW9kZSgpICYmIGUpIHsKLSAgICAgICAgICAgIGlmIChlLT5o
YXNUYWdOYW1lKHRkVGFnKSkgewotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KFRB
QkxFX0NFTEwpOwotICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsK
LSAgICAgICAgICAgIH0gZWxzZSBpZiAoZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykpCi0gICAgICAg
ICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoc3R5bGUtPmlzRGlzcGxheUlubGluZVR5cGUoKSA/
IElOTElORV9UQUJMRSA6IFRBQkxFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlICYmIChl
LT5oYXNUYWdOYW1lKHRkVGFnKSB8fCBlLT5oYXNUYWdOYW1lKHRoVGFnKSkpIHsKLSAgICAgICAg
ICAgIGlmIChzdHlsZS0+d2hpdGVTcGFjZSgpID09IEtIVE1MX05PV1JBUCkgewotICAgICAgICAg
ICAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2UgYXJlIHJlYWxseSBub3dyYXBwaW5nIG9yIGlmIHdl
IHNob3VsZCBqdXN0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIG5vcm1hbCBpbnN0ZWFkLiBJZiB0
aGUgd2lkdGggb2YgdGhlIGNlbGwgaXMgZml4ZWQsIHRoZW4KLSAgICAgICAgICAgICAgICAvLyB3
ZSBkb24ndCBhY3R1YWxseSB1c2UgTk9XUkFQLgotICAgICAgICAgICAgICAgIGlmIChzdHlsZS0+
d2lkdGgoKS5pc0ZpeGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zZXRXaGl0ZVNw
YWNlKE5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBz
dHlsZS0+c2V0V2hpdGVTcGFjZShOT1dSQVApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0K
LSAgICAgICAgLy8gVGFibGVzIG5ldmVyIHN1cHBvcnQgdGhlIC13ZWJraXQtKiB2YWx1ZXMgZm9y
IHRleHQtYWxpZ24gYW5kIHdpbGwgcmVzZXQgYmFjayB0byB0aGUgZGVmYXVsdC4KLSAgICAgICAg
aWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0YWJsZVRhZykgJiYgKHN0eWxlLT50ZXh0QWxpZ24oKSA9
PSBXRUJLSVRfTEVGVCB8fCBzdHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX0NFTlRFUiB8fCBz
dHlsZS0+dGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAgICAgICAgIHN0eWxlLT5z
ZXRUZXh0QWxpZ24oVEFTVEFSVCk7Ci0KLSAgICAgICAgLy8gRnJhbWVzIGFuZCBmcmFtZXNldHMg
bmV2ZXIgaG9ub3IgcG9zaXRpb246cmVsYXRpdmUgb3IgcG9zaXRpb246YWJzb2x1dGUuIFRoaXMg
aXMgbmVjZXNzYXJ5IHRvCi0gICAgICAgIC8vIGZpeCBhIGNyYXNoIHdoZXJlIGEgc2l0ZSB0cmll
cyB0byBwb3NpdGlvbiB0aGVzZSBvYmplY3RzLiBUaGV5IGFsc28gbmV2ZXIgaG9ub3IgZGlzcGxh
eS4KLSAgICAgICAgaWYgKGUgJiYgKGUtPmhhc1RhZ05hbWUoZnJhbWVUYWcpIHx8IGUtPmhhc1Rh
Z05hbWUoZnJhbWVzZXRUYWcpKSkgewotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFN0
YXRpY1Bvc2l0aW9uKTsKLSAgICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIC8vIFJ1YnkgdGV4dCBkb2VzIG5vdCBzdXBwb3J0IGZsb2F0IG9y
IHBvc2l0aW9uLiBUaGlzIG1pZ2h0IGNoYW5nZSB3aXRoIGV2b2x1dGlvbiBvZiB0aGUgc3BlY2lm
aWNhdGlvbi4KLSAgICAgICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZShydFRhZykpIHsKLSAgICAg
ICAgICAgIHN0eWxlLT5zZXRQb3NpdGlvbihTdGF0aWNQb3NpdGlvbik7Ci0gICAgICAgICAgICBz
dHlsZS0+c2V0RmxvYXRpbmcoTm9GbG9hdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhN
RTogV2Ugc2hvdWxkbid0IGJlIG92ZXJyaWRpbmcgc3RhcnQvLXdlYmtpdC1hdXRvIGxpa2UgdGhp
cy4gRG8gaXQgaW4gaHRtbC5jc3MgaW5zdGVhZC4KLSAgICAgICAgLy8gVGFibGUgaGVhZGVycyB3
aXRoIGEgdGV4dC1hbGlnbiBvZiAtd2Via2l0LWF1dG8gd2lsbCBjaGFuZ2UgdGhlIHRleHQtYWxp
Z24gdG8gY2VudGVyLgotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKHRoVGFnKSAmJiBz
dHlsZS0+dGV4dEFsaWduKCkgPT0gVEFTVEFSVCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRUZXh0
QWxpZ24oQ0VOVEVSKTsKLQotICAgICAgICBpZiAoZSAmJiBlLT5oYXNUYWdOYW1lKGxlZ2VuZFRh
ZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0KLSAgICAgICAgLy8g
QWJzb2x1dGUvZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywgZmxvYXRpbmcgZWxlbWVudHMgYW5k
IHRoZSBkb2N1bWVudCBlbGVtZW50IG5lZWQgYmxvY2stbGlrZSBvdXRzaWRlIGRpc3BsYXkuCi0g
ICAgICAgIGlmIChzdHlsZS0+aGFzT3V0T2ZGbG93UG9zaXRpb24oKSB8fCBzdHlsZS0+aXNGbG9h
dGluZygpIHx8IChlICYmIGUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IGUpKQot
ICAgICAgICAgICAgc3R5bGUtPnNldERpc3BsYXkoZXF1aXZhbGVudEJsb2NrRGlzcGxheShzdHls
ZS0+ZGlzcGxheSgpLCBzdHlsZS0+aXNGbG9hdGluZygpLCAhZG9jdW1lbnQoKS0+aW5RdWlya3NN
b2RlKCkpKTsKLQotICAgICAgICAvLyBGSVhNRTogRG9uJ3Qgc3VwcG9ydCB0aGlzIG11dGF0aW9u
IGZvciBwc2V1ZG8gc3R5bGVzIGxpa2UgZmlyc3QtbGV0dGVyIG9yIGZpcnN0LWxpbmUsIHNpbmNl
IGl0J3Mgbm90IGNvbXBsZXRlbHkKLSAgICAgICAgLy8gY2xlYXIgaG93IHRoYXQgc2hvdWxkIHdv
cmsuCi0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IElOTElORSAmJiBzdHlsZS0+c3R5
bGVUeXBlKCkgPT0gTk9QU0VVRE8gJiYgc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gcGFyZW50U3R5
bGUtPndyaXRpbmdNb2RlKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVf
QkxPQ0spOwotCi0gICAgICAgIC8vIEFmdGVyIHBlcmZvcm1pbmcgdGhlIGRpc3BsYXkgbXV0YXRp
b24sIGNoZWNrIHRhYmxlIHJvd3MuIFdlIGRvIG5vdCBob25vciBwb3NpdGlvbjpyZWxhdGl2ZSBv
ciBwb3NpdGlvbjpzdGlja3kgb24KLSAgICAgICAgLy8gdGFibGUgcm93cyBvciBjZWxscy4gVGhp
cyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBmb3IgcG9zaXRpb246cmVsYXRpdmUgaW4gQ1NTMi4xIChh
bmQgY2F1c2VkIGEgY3Jhc2ggaW4gY29udGFpbmluZ0Jsb2NrKCkKLSAgICAgICAgLy8gb24gc29t
ZSBzaXRlcykuCi0gICAgICAgIGlmICgoc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9IRUFERVJf
R1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAg
IHx8IHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEVfRk9PVEVSX0dST1VQIHx8IHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfUk9XKQotICAgICAgICAgICAgJiYgc3R5bGUtPmhhc0luRmxvd1Bvc2l0
aW9uKCkpCi0gICAgICAgICAgICBzdHlsZS0+c2V0UG9zaXRpb24oU3RhdGljUG9zaXRpb24pOwot
Ci0gICAgICAgIC8vIHdyaXRpbmctbW9kZSBkb2VzIG5vdCBhcHBseSB0byB0YWJsZSByb3cgZ3Jv
dXBzLCB0YWJsZSBjb2x1bW4gZ3JvdXBzLCB0YWJsZSByb3dzLCBhbmQgdGFibGUgY29sdW1ucy4K
LSAgICAgICAgLy8gRklYTUU6IFRhYmxlIGNlbGxzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGJlIHBl
cnBlbmRpY3VsYXIgb3IgZmxpcHBlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHRhYmxlLCB0aG91Z2gu
Ci0gICAgICAgIGlmIChzdHlsZS0+ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTiB8fCBzdHlsZS0+
ZGlzcGxheSgpID09IFRBQkxFX0NPTFVNTl9HUk9VUCB8fCBzdHlsZS0+ZGlzcGxheSgpID09IFRB
QkxFX0ZPT1RFUl9HUk9VUAotICAgICAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJM
RV9IRUFERVJfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cgfHwgc3R5bGUt
PmRpc3BsYXkoKSA9PSBUQUJMRV9ST1dfR1JPVVAKLSAgICAgICAgICAgIHx8IHN0eWxlLT5kaXNw
bGF5KCkgPT0gVEFCTEVfQ0VMTCkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShw
YXJlbnRTdHlsZS0+d3JpdGluZ01vZGUoKSk7Ci0KLSAgICAgICAgLy8gRklYTUU6IFNpbmNlIHdl
IGRvbid0IHN1cHBvcnQgYmxvY2stZmxvdyBvbiBmbGV4aWJsZSBib3hlcyB5ZXQsIGRpc2FsbG93
IHNldHRpbmcKLSAgICAgICAgLy8gb2YgYmxvY2stZmxvdyB0byBhbnl0aGluZyBvdGhlciB0aGFu
IFRvcFRvQm90dG9tV3JpdGluZ01vZGUuCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD00NjQxOCAtIEZsZXhpYmxlIGJveCBzdXBwb3J0LgotICAgICAg
ICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gVG9wVG9Cb3R0b21Xcml0aW5nTW9kZSAmJiAo
c3R5bGUtPmRpc3BsYXkoKSA9PSBCT1ggfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBJTkxJTkVfQk9Y
KSkKLSAgICAgICAgICAgIHN0eWxlLT5zZXRXcml0aW5nTW9kZShUb3BUb0JvdHRvbVdyaXRpbmdN
b2RlKTsKLQotICAgICAgICBpZiAoaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRp
c3BsYXkoKSkpIHsKLSAgICAgICAgICAgIHN0eWxlLT5zZXRGbG9hdGluZyhOb0Zsb2F0KTsKLSAg
ICAgICAgICAgIHN0eWxlLT5zZXREaXNwbGF5KGVxdWl2YWxlbnRCbG9ja0Rpc3BsYXkoc3R5bGUt
PmRpc3BsYXkoKSwgc3R5bGUtPmlzRmxvYXRpbmcoKSwgIWRvY3VtZW50KCktPmluUXVpcmtzTW9k
ZSgpKSk7Ci0gICAgICAgIH0KLQotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAg
Ly8gUGVyIHRoZSBzcGVjLCBwb3NpdGlvbiAnc3RhdGljJyBhbmQgJ3JlbGF0aXZlJyBpbiB0aGUg
dG9wIGxheWVyIGNvbXB1dGUgdG8gJ2Fic29sdXRlJy4KLSAgICAgICAgaWYgKGUgJiYgZS0+aXNJ
blRvcExheWVyKCkgJiYgKHN0eWxlLT5wb3NpdGlvbigpID09IFN0YXRpY1Bvc2l0aW9uIHx8IHN0
eWxlLT5wb3NpdGlvbigpID09IFJlbGF0aXZlUG9zaXRpb24pKSB7Ci0gICAgICAgICAgICBzdHls
ZS0+c2V0UG9zaXRpb24oQWJzb2x1dGVQb3NpdGlvbik7Ci0gICAgICAgICAgICBzdHlsZS0+c2V0
RGlzcGxheShCTE9DSyk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgIH0KLQotICAgIC8vIE1ha2Ug
c3VyZSBvdXIgei1pbmRleCB2YWx1ZSBpcyBvbmx5IGFwcGxpZWQgaWYgdGhlIG9iamVjdCBpcyBw
b3NpdGlvbmVkLgotICAgIGlmIChzdHlsZS0+cG9zaXRpb24oKSA9PSBTdGF0aWNQb3NpdGlvbiAm
JiAhaXNEaXNwbGF5RmxleGlibGVCb3gocGFyZW50U3R5bGUtPmRpc3BsYXkoKSkpCi0gICAgICAg
IHN0eWxlLT5zZXRIYXNBdXRvWkluZGV4KCk7Ci0KLSAgICAvLyBBdXRvIHotaW5kZXggYmVjb21l
cyAwIGZvciB0aGUgcm9vdCBlbGVtZW50IGFuZCB0cmFuc3BhcmVudCBvYmplY3RzLiBUaGlzIHBy
ZXZlbnRzCi0gICAgLy8gY2FzZXMgd2hlcmUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBibGVuZGVk
IGFzIGEgc2luZ2xlIHVuaXQgZW5kIHVwIHdpdGggYSBub24tdHJhbnNwYXJlbnQKLSAgICAvLyBv
YmplY3Qgd2VkZ2VkIGluIGJldHdlZW4gdGhlbS4gQXV0byB6LWluZGV4IGFsc28gYmVjb21lcyAw
IGZvciBvYmplY3RzIHRoYXQgc3BlY2lmeSB0cmFuc2Zvcm1zL21hc2tzL3JlZmxlY3Rpb25zLgot
ICAgIGlmIChzdHlsZS0+aGFzQXV0b1pJbmRleCgpICYmICgoZSAmJiBlLT5kb2N1bWVudCgpLT5k
b2N1bWVudEVsZW1lbnQoKSA9PSBlKQotICAgICAgICB8fCBzdHlsZS0+b3BhY2l0eSgpIDwgMS4w
ZgotICAgICAgICB8fCBzdHlsZS0+aGFzVHJhbnNmb3JtUmVsYXRlZFByb3BlcnR5KCkKLSAgICAg
ICAgfHwgc3R5bGUtPmhhc01hc2soKQotICAgICAgICB8fCBzdHlsZS0+Y2xpcFBhdGgoKQotICAg
ICAgICB8fCBzdHlsZS0+Ym94UmVmbGVjdCgpCi0gICAgICAgIHx8IHN0eWxlLT5oYXNGaWx0ZXIo
KQotICAgICAgICB8fCBzdHlsZS0+aGFzQmxlbmRNb2RlKCkKLSAgICAgICAgfHwgc3R5bGUtPnBv
c2l0aW9uKCkgPT0gU3RpY2t5UG9zaXRpb24KLSAgICAgICAgfHwgKHN0eWxlLT5wb3NpdGlvbigp
ID09IEZpeGVkUG9zaXRpb24gJiYgZSAmJiBlLT5kb2N1bWVudCgpLT5wYWdlKCkgJiYgZS0+ZG9j
dW1lbnQoKS0+cGFnZSgpLT5zZXR0aW5ncygpLT5maXhlZFBvc2l0aW9uQ3JlYXRlc1N0YWNraW5n
Q29udGV4dCgpKQotI2lmIEVOQUJMRShBQ0NFTEVSQVRFRF9PVkVSRkxPV19TQ1JPTExJTkcpCi0g
ICAgICAgIC8vIFRvdWNoIG92ZXJmbG93IHNjcm9sbGluZyBjcmVhdGVzIGEgc3RhY2tpbmcgY29u
dGV4dC4KLSAgICAgICAgfHwgKChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT0hJRERFTiB8fCBzdHls
ZS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikgJiYgc3R5bGUtPnVzZVRvdWNoT3ZlcmZsb3dTY3Jv
bGxpbmcoKSkKLSNlbmRpZgotI2lmIEVOQUJMRShESUFMT0dfRUxFTUVOVCkKLSAgICAgICAgfHwg
KGUgJiYgZS0+aXNJblRvcExheWVyKCkpCi0jZW5kaWYKLSAgICAgICAgKSkKLSAgICAgICAgc3R5
bGUtPnNldFpJbmRleCgwKTsKLQotICAgIC8vIFRleHRhcmVhIGNvbnNpZGVycyBvdmVyZmxvdyB2
aXNpYmxlIGFzIGF1dG8uCi0gICAgaWYgKGUgJiYgZS0+aGFzVGFnTmFtZSh0ZXh0YXJlYVRhZykp
IHsKLSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChzdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJ
U0lCTEUgPyBPQVVUTyA6IHN0eWxlLT5vdmVyZmxvd1goKSk7Ci0gICAgICAgIHN0eWxlLT5zZXRP
dmVyZmxvd1koc3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdHlsZS0+
b3ZlcmZsb3dZKCkpOwotICAgIH0KLQotICAgIGlmIChkb2VzTm90SW5oZXJpdFRleHREZWNvcmF0
aW9uKHN0eWxlLCBlKSkKLSAgICAgICAgc3R5bGUtPnNldFRleHREZWNvcmF0aW9uc0luRWZmZWN0
KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLSAgICBlbHNlCi0gICAgICAgIHN0eWxlLT5hZGRU
b1RleHREZWNvcmF0aW9uc0luRWZmZWN0KHN0eWxlLT50ZXh0RGVjb3JhdGlvbigpKTsKLQotICAg
IC8vIElmIGVpdGhlciBvdmVyZmxvdyB2YWx1ZSBpcyBub3QgdmlzaWJsZSwgY2hhbmdlIHRvIGF1
dG8uCi0gICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPTUFSUVVFRSAmJiBzdHlsZS0+b3Zl
cmZsb3dZKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT01BUlFV
RUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPTUFSUVVFRSAmJiBzdHls
ZS0+b3ZlcmZsb3dYKCkgIT0gT01BUlFVRUUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1go
T01BUlFVRUUpOwotICAgIGVsc2UgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSA9PSBPVklTSUJMRSAm
JiBzdHlsZS0+b3ZlcmZsb3dZKCkgIT0gT1ZJU0lCTEUpIHsKLSAgICAgICAgLy8gRklYTUU6IE9u
Y2Ugd2UgaW1wbGVtZW50IHBhZ2luYXRpb24gY29udHJvbHMsIG92ZXJmbG93LXggc2hvdWxkIGRl
ZmF1bHQgdG8gaGlkZGVuCi0gICAgICAgIC8vIGlmIG92ZXJmbG93LXkgaXMgc2V0IHRvIC13ZWJr
aXQtcGFnZWQteCBvciAtd2Via2l0LXBhZ2UteS4gRm9yIG5vdywgd2UnbGwgbGV0IGl0Ci0gICAg
ICAgIC8vIGRlZmF1bHQgdG8gYXV0byBzbyB3ZSBjYW4gYXQgbGVhc3Qgc2Nyb2xsIHRocm91Z2gg
dGhlIHBhZ2VzLgotICAgICAgICBzdHlsZS0+c2V0T3ZlcmZsb3dYKE9BVVRPKTsKLSAgICB9IGVs
c2UgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dY
KCkgIT0gT1ZJU0lCTEUpCi0gICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1koT0FVVE8pOwotCi0g
ICAgLy8gQ2FsbCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZSgpIGlmIGEgcGFnaW5hdGlvbiBt
b2RlIGlzIHNldCBmb3IgYW55IG5vbi1yb290IGVsZW1lbnRzLiBJZiB0aGVzZQotICAgIC8vIHN0
eWxlcyBhcmUgc3BlY2lmaWVkIG9uIGEgcm9vdCBlbGVtZW50LCB0aGVuIHRoZXkgd2lsbCBiZSBp
bmNvcnBvcmF0ZWQgaW4KLSAgICAvLyBTdHlsZVJlc29sdmVyOjpzdHlsZUZvckRvY3VtZW50KCku
Ci0gICAgaWYgKChzdHlsZS0+b3ZlcmZsb3dZKCkgPT0gT1BBR0VEWCB8fCBzdHlsZS0+b3ZlcmZs
b3dZKCkgPT0gT1BBR0VEWSkgJiYgIShlICYmIChlLT5oYXNUYWdOYW1lKGh0bWxUYWcpIHx8IGUt
Pmhhc1RhZ05hbWUoYm9keVRhZykpKSkKLSAgICAgICAgc2V0U3R5bGVzRm9yUGFnaW5hdGlvbk1v
ZGUoV2ViQ29yZTo6cGFnaW5hdGlvbk1vZGVGb3JSZW5kZXJTdHlsZShzdHlsZSksIHN0eWxlKTsK
LQotICAgIC8vIFRhYmxlIHJvd3MsIHNlY3Rpb25zIGFuZCB0aGUgdGFibGUgaXRzZWxmIHdpbGwg
c3VwcG9ydCBvdmVyZmxvdzpoaWRkZW4gYW5kIHdpbGwgaWdub3JlIHNjcm9sbC9hdXRvLgotICAg
IC8vIEZJWE1FOiBFdmVudHVhbGx5IHRhYmxlIHNlY3Rpb25zIHdpbGwgc3VwcG9ydCBhdXRvIGFu
ZCBzY3JvbGwuCi0gICAgaWYgKHN0eWxlLT5kaXNwbGF5KCkgPT0gVEFCTEUgfHwgc3R5bGUtPmRp
c3BsYXkoKSA9PSBJTkxJTkVfVEFCTEUKLSAgICAgICAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBU
QUJMRV9ST1dfR1JPVVAgfHwgc3R5bGUtPmRpc3BsYXkoKSA9PSBUQUJMRV9ST1cpIHsKLSAgICAg
ICAgaWYgKHN0eWxlLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSAmJiBzdHlsZS0+b3ZlcmZsb3dY
KCkgIT0gT0hJRERFTikKLSAgICAgICAgICAgIHN0eWxlLT5zZXRPdmVyZmxvd1goT1ZJU0lCTEUp
OwotICAgICAgICBpZiAoc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFICYmIHN0eWxlLT5v
dmVyZmxvd1koKSAhPSBPSElEREVOKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShP
VklTSUJMRSk7Ci0gICAgfQotCi0gICAgLy8gTWVudWxpc3RzIHNob3VsZCBoYXZlIHZpc2libGUg
b3ZlcmZsb3cKLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpIHsK
LSAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0gICAgICAgIHN0eWxlLT5z
ZXRPdmVyZmxvd1koT1ZJU0lCTEUpOwotICAgIH0KLQotICAgIC8vIEN1bGwgb3V0IGFueSB1c2Vs
ZXNzIGxheWVycyBhbmQgYWxzbyByZXBlYXQgcGF0dGVybnMgaW50byBhZGRpdGlvbmFsIGxheWVy
cy4KLSAgICBzdHlsZS0+YWRqdXN0QmFja2dyb3VuZExheWVycygpOwotICAgIHN0eWxlLT5hZGp1
c3RNYXNrTGF5ZXJzKCk7Ci0KLSAgICAvLyBEbyB0aGUgc2FtZSBmb3IgYW5pbWF0aW9ucyBhbmQg
dHJhbnNpdGlvbnMuCi0gICAgc3R5bGUtPmFkanVzdEFuaW1hdGlvbnMoKTsKLSAgICBzdHlsZS0+
YWRqdXN0VHJhbnNpdGlvbnMoKTsKLQotICAgIC8vIEltcG9ydGFudDogSW50cmluc2ljIG1hcmdp
bnMgZ2V0IGFkZGVkIHRvIGNvbnRyb2xzIGJlZm9yZSB0aGUgdGhlbWUgaGFzIGFkanVzdGVkIHRo
ZSBzdHlsZSwgc2luY2UgdGhlIHRoZW1lIHdpbGwKLSAgICAvLyBhbHRlciBmb250cyBhbmQgaGVp
Z2h0cy93aWR0aHMuCi0gICAgaWYgKGUgJiYgZS0+aXNGb3JtQ29udHJvbEVsZW1lbnQoKSAmJiBz
dHlsZS0+Zm9udFNpemUoKSA+PSAxMSkgewotICAgICAgICAvLyBEb24ndCBhcHBseSBpbnRyaW5z
aWMgbWFyZ2lucyB0byBpbWFnZSBidXR0b25zLiBUaGUgZGVzaWduZXIga25vd3MgaG93IGJpZyB0
aGUgaW1hZ2VzIGFyZSwKLSAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB0cmVhdCBhbGwgaW1hZ2Ug
YnV0dG9ucyBhcyB0aG91Z2ggdGhleSB3ZXJlIGV4cGxpY2l0bHkgc2l6ZWQuCi0gICAgICAgIGlm
ICghZS0+aGFzVGFnTmFtZShpbnB1dFRhZykgfHwgIXN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihlKS0+aXNJbWFnZUJ1dHRvbigpKQotICAgICAgICAgICAgYWRkSW50cmluc2ljTWFyZ2lu
cyhzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gTGV0IHRoZSB0aGVtZSBhbHNvIGhhdmUgYSBjcmFj
ayBhdCBhZGp1c3RpbmcgdGhlIHN0eWxlLgotICAgIGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgp
KQotICAgICAgICBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFkanVzdFN0eWxlKHRoaXMs
IHN0eWxlLCBlLCBtX3N0YXRlLmhhc1VBQXBwZWFyYW5jZSgpLCBtX3N0YXRlLmJvcmRlckRhdGEo
KSwgbV9zdGF0ZS5iYWNrZ3JvdW5kRGF0YSgpLCBtX3N0YXRlLmJhY2tncm91bmRDb2xvcigpKTsK
LQotICAgIC8vIElmIHdlIGhhdmUgZmlyc3QtbGV0dGVyIHBzZXVkbyBzdHlsZSwgZG8gbm90IHNo
YXJlIHRoaXMgc3R5bGUuCi0gICAgaWYgKHN0eWxlLT5oYXNQc2V1ZG9TdHlsZShGSVJTVF9MRVRU
RVIpKQotICAgICAgICBzdHlsZS0+c2V0VW5pcXVlKCk7Ci0KLSAgICAvLyBGSVhNRTogd2hlbiBk
cm9wcGluZyB0aGUgLXdlYmtpdCBwcmVmaXggb24gdHJhbnNmb3JtLXN0eWxlLCB3ZSBzaG91bGQg
YWxzbyBoYXZlIG9wYWNpdHkgPCAxIGNhdXNlIGZsYXR0ZW5pbmcuCi0gICAgaWYgKHN0eWxlLT5w
cmVzZXJ2ZXMzRCgpICYmIChzdHlsZS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUKLSAgICAgICAg
fHwgc3R5bGUtPm92ZXJmbG93WSgpICE9IE9WSVNJQkxFCi0gICAgICAgIHx8IHN0eWxlLT5oYXNG
aWx0ZXIoKSkpCi0gICAgICAgIHN0eWxlLT5zZXRUcmFuc2Zvcm1TdHlsZTNEKFRyYW5zZm9ybVN0
eWxlM0RGbGF0KTsKLQotICAgIC8vIFNlYW1sZXNzIGlmcmFtZXMgYmVoYXZlIGxpa2UgYmxvY2tz
LiBNYXAgdGhlaXIgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sgd2hlbiBtYXJrZWQgaW5saW5lLgot
ICAgIGlmIChlICYmIGUtPmhhc1RhZ05hbWUoaWZyYW1lVGFnKSAmJiBzdHlsZS0+ZGlzcGxheSgp
ID09IElOTElORSAmJiBzdGF0aWNfY2FzdDxIVE1MSUZyYW1lRWxlbWVudCo+KGUpLT5zaG91bGRE
aXNwbGF5U2VhbWxlc3NseSgpKQotICAgICAgICBzdHlsZS0+c2V0RGlzcGxheShJTkxJTkVfQkxP
Q0spOwotCi0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoZSAmJiBlLT5pc1NWR0VsZW1lbnQoKSkg
ewotICAgICAgICAvLyBTcGVjOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvbWFza2luZy5odG1s
I092ZXJmbG93UHJvcGVydHkKLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1koKSA9PSBPU0NS
T0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WShPSElEREVOKTsKLSAgICAgICAg
ZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WSgpID09IE9BVVRPKQotICAgICAgICAgICAgc3R5bGUt
PnNldE92ZXJmbG93WShPVklTSUJMRSk7Ci0KLSAgICAgICAgaWYgKHN0eWxlLT5vdmVyZmxvd1go
KSA9PSBPU0NST0xMKQotICAgICAgICAgICAgc3R5bGUtPnNldE92ZXJmbG93WChPSElEREVOKTsK
LSAgICAgICAgZWxzZSBpZiAoc3R5bGUtPm92ZXJmbG93WCgpID09IE9BVVRPKQotICAgICAgICAg
ICAgc3R5bGUtPnNldE92ZXJmbG93WChPVklTSUJMRSk7Ci0KLSAgICAgICAgLy8gT25seSB0aGUg
cm9vdCA8c3ZnPiBlbGVtZW50IGluIGFuIFNWRyBkb2N1bWVudCBmcmFnbWVudCB0cmVlIGhvbm9y
cyBjc3MgcG9zaXRpb24KLSAgICAgICAgaWYgKCEoZS0+aGFzVGFnTmFtZShTVkdOYW1lczo6c3Zn
VGFnKSAmJiBlLT5wYXJlbnROb2RlKCkgJiYgIWUtPnBhcmVudE5vZGUoKS0+aXNTVkdFbGVtZW50
KCkpKQotICAgICAgICAgICAgc3R5bGUtPnNldFBvc2l0aW9uKFJlbmRlclN0eWxlOjppbml0aWFs
UG9zaXRpb24oKSk7Ci0KLSAgICAgICAgLy8gUmVuZGVyU1ZHUm9vdCBoYW5kbGVzIHpvb21pbmcg
Zm9yIHRoZSB3aG9sZSBTVkcgc3VidHJlZSwgc28gZm9yZWlnbk9iamVjdCBjb250ZW50IHNob3Vs
ZAotICAgICAgICAvLyBub3QgYmUgc2NhbGVkIGFnYWluLgotICAgICAgICBpZiAoZS0+aGFzVGFn
TmFtZShTVkdOYW1lczo6Zm9yZWlnbk9iamVjdFRhZykpCi0gICAgICAgICAgICBzdHlsZS0+c2V0
RWZmZWN0aXZlWm9vbShSZW5kZXJTdHlsZTo6aW5pdGlhbFpvb20oKSk7Ci0gICAgfQotI2VuZGlm
Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiByZWdp
b25FbGVtZW50KQotewotICAgIC8vIEZJWE1FIChCVUcgNzI0NzIpOiBXZSBkb24ndCBhZGQgQC13
ZWJraXQtcmVnaW9uIHJ1bGVzIG9mIHNjb3BlZCBzdHlsZSBzaGVldHMgZm9yIHRoZSBtb21lbnQs
Ci0gICAgLy8gc28gYWxsIHJlZ2lvbiBydWxlcyBhcmUgZ2xvYmFsIGJ5IGRlZmF1bHQuIFZlcmlm
eSB3aGV0aGVyIHRoYXQgY2FuIHN0YW5kIG9yIG5lZWRzIGNoYW5naW5nLgotCi0gICAgdW5zaWdu
ZWQgcnVsZXNTaXplID0gbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9y
c0FuZFJ1bGVTZXRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcnVsZXNT
aXplOyArK2kpIHsKLSAgICAgICAgQVNTRVJUKG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKS0+bV9y
ZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5ydWxlU2V0LmdldCgpKTsKLSAgICAgICAg
aWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLT5tX3JlZ2lv
blNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnNlbGVjdG9yLCByZWdpb25FbGVtZW50KSkKLSAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3J1bGVTZXRzLnVzZXJT
dHlsZSgpKSB7Ci0gICAgICAgIHJ1bGVzU2l6ZSA9IG1fcnVsZVNldHMudXNlclN0eWxlKCktPm1f
cmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgcnVsZXNTaXplOyArK2kpIHsKLSAgICAgICAgICAgIEFTU0VSVChtX3J1bGVT
ZXRzLnVzZXJTdHlsZSgpLT5tX3JlZ2lvblNlbGVjdG9yc0FuZFJ1bGVTZXRzLmF0KGkpLnJ1bGVT
ZXQuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IobV9ydWxlU2V0
cy51c2VyU3R5bGUoKS0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5zZWxlY3Rv
ciwgcmVnaW9uRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRm9y
T3JpZW50YXRpb25DaGFuZ2UoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIEZvbnRPcmllbnRh
dGlvbiBmb250T3JpZW50YXRpb247Ci0gICAgTm9uQ0pLR2x5cGhPcmllbnRhdGlvbiBnbHlwaE9y
aWVudGF0aW9uOwotICAgIGdldEZvbnRBbmRHbHlwaE9yaWVudGF0aW9uKHN0eWxlLCBmb250T3Jp
ZW50YXRpb24sIGdseXBoT3JpZW50YXRpb24pOwotCi0gICAgY29uc3QgRm9udERlc2NyaXB0aW9u
JiBmb250RGVzY3JpcHRpb24gPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGZv
bnREZXNjcmlwdGlvbi5vcmllbnRhdGlvbigpID09IGZvbnRPcmllbnRhdGlvbiAmJiBmb250RGVz
Y3JpcHRpb24ubm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09IGdseXBoT3JpZW50YXRpb24pCi0g
ICAgICAgIHJldHVybjsKLQotICAgIEZvbnREZXNjcmlwdGlvbiBuZXdGb250RGVzY3JpcHRpb24o
Zm9udERlc2NyaXB0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0Tm9uQ0pLR2x5cGhP
cmllbnRhdGlvbihnbHlwaE9yaWVudGF0aW9uKTsKLSAgICBuZXdGb250RGVzY3JpcHRpb24uc2V0
T3JpZW50YXRpb24oZm9udE9yaWVudGF0aW9uKTsKLSAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0
aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6dXBkYXRl
Rm9udCgpCi17Ci0gICAgaWYgKCFtX3N0YXRlLmZvbnREaXJ0eSgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBSZW5kZXJTdHlsZSogc3R5bGUgPSBtX3N0YXRlLnN0eWxlKCk7Ci0gICAgY2hlY2tG
b3JHZW5lcmljRmFtaWx5Q2hhbmdlKHN0eWxlLCBtX3N0YXRlLnBhcmVudFN0eWxlKCkpOwotICAg
IGNoZWNrRm9yWm9vbUNoYW5nZShzdHlsZSwgbV9zdGF0ZS5wYXJlbnRTdHlsZSgpKTsKLSAgICBj
aGVja0Zvck9yaWVudGF0aW9uQ2hhbmdlKHN0eWxlKTsKLSAgICBzdHlsZS0+Zm9udCgpLnVwZGF0
ZShtX2ZvbnRTZWxlY3Rvcik7Ci0gICAgbV9zdGF0ZS5zZXRGb250RGlydHkoZmFsc2UpOwotfQot
Ci1QYXNzUmVmUHRyPENTU1J1bGVMaXN0PiBTdHlsZVJlc29sdmVyOjpzdHlsZVJ1bGVzRm9yRWxl
bWVudChFbGVtZW50KiBlLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVkZSkKLXsKLSAgICByZXR1cm4g
cHNldWRvU3R5bGVSdWxlc0ZvckVsZW1lbnQoZSwgTk9QU0VVRE8sIHJ1bGVzVG9JbmNsdWRlKTsK
LX0KLQotUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gU3R5bGVSZXNvbHZlcjo6cHNldWRvU3R5bGVS
dWxlc0ZvckVsZW1lbnQoRWxlbWVudCogZSwgUHNldWRvSWQgcHNldWRvSWQsIHVuc2lnbmVkIHJ1
bGVzVG9JbmNsdWRlKQotewotICAgIGlmICghZSB8fCAhZS0+ZG9jdW1lbnQoKS0+aGF2ZVN0eWxl
c2hlZXRzTG9hZGVkKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgbV9zdGF0ZS5zZXRNb2Rl
KFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVjdGluZ1J1bGVzKTsKLQotICAgIGluaXRFbGVtZW50KGUp
OwotICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCAwLCBwc2V1
ZG9JZCk7Ci0KLSAgICBNYXRjaFJlc3VsdCBkdW1teTsKLSAgICBpZiAocnVsZXNUb0luY2x1ZGUg
JiBVQUFuZFVzZXJDU1NSdWxlcykgewotICAgICAgICAvLyBGaXJzdCB3ZSBtYXRjaCBydWxlcyBm
cm9tIHRoZSB1c2VyIGFnZW50IHNoZWV0LgotICAgICAgICBtYXRjaFVBUnVsZXMoZHVtbXkpOwot
Ci0gICAgICAgIC8vIE5vdyB3ZSBjaGVjayB1c2VyIHNoZWV0IHJ1bGVzLgotICAgICAgICBpZiAo
bV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMpCi0gICAgICAgICAgICBtYXRjaFVzZXJSdWxlcyhk
dW1teSwgcnVsZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKLSAgICB9Ci0KLSAgICBpZiAo
bV9tYXRjaEF1dGhvckFuZFVzZXJTdHlsZXMgJiYgKHJ1bGVzVG9JbmNsdWRlICYgQXV0aG9yQ1NT
UnVsZXMpKSB7Ci0gICAgICAgIG1fc3RhdGUuc2V0U2FtZU9yaWdpbk9ubHkoIShydWxlc1RvSW5j
bHVkZSAmIENyb3NzT3JpZ2luQ1NTUnVsZXMpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgcnVs
ZXMgaW4gYXV0aG9yIHNoZWV0cy4KLSAgICAgICAgbWF0Y2hBdXRob3JSdWxlcyhkdW1teSwgcnVs
ZXNUb0luY2x1ZGUgJiBFbXB0eUNTU1J1bGVzKTsKLQotICAgICAgICBtX3N0YXRlLnNldFNhbWVP
cmlnaW5Pbmx5KGZhbHNlKTsKLSAgICB9Ci0KLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JD
aGVja2VyOjpSZXNvbHZpbmdTdHlsZSk7Ci0KLSAgICByZXR1cm4gbV9zdGF0ZS50YWtlUnVsZUxp
c3QoKTsKLX0KLQotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6cnVsZU1hdGNoZXMoY29uc3Qg
UnVsZURhdGEmIHJ1bGVEYXRhLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSwgUHNldWRvSWQm
IGR5bmFtaWNQc2V1ZG8sIFNlbGVjdG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5IGJlaGF2
aW9yQXRCb3VuZGFyeSkKLXsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotCi0gICAgaWYg
KHJ1bGVEYXRhLmhhc0Zhc3RDaGVja2FibGVTZWxlY3RvcigpKSB7Ci0gICAgICAgIC8vIFdlIGtu
b3cgdGhpcyBzZWxlY3RvciBkb2VzIG5vdCBpbmNsdWRlIGFueSBwc2V1ZG8gZWxlbWVudHMuCi0g
ICAgICAgIGlmIChzdGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5wc2V1ZG9JZCAhPSBOT1BTRVVE
TykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy8gV2Uga25vdyBhIHN1ZmZp
Y2llbnRseSBzaW1wbGUgc2luZ2xlIHBhcnQgc2VsZWN0b3IgbWF0Y2hlcyBzaW1wbHkgYmVjYXVz
ZSB3ZSBmb3VuZCBpdCBmcm9tIHRoZSBydWxlIGhhc2guCi0gICAgICAgIC8vIFRoaXMgaXMgbGlt
aXRlZCB0byBIVE1MIG9ubHkgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgbmFtZXNwYWNl
LgotICAgICAgICBpZiAocnVsZURhdGEuaGFzUmlnaHRtb3N0U2VsZWN0b3JNYXRjaGluZ0hUTUxC
YXNlZE9uUnVsZUhhc2goKSAmJiBzdGF0ZS5lbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSkgewot
ICAgICAgICAgICAgaWYgKCFydWxlRGF0YS5oYXNNdWx0aXBhcnRTZWxlY3RvcigpKQotICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChydWxlRGF0YS5z
ZWxlY3RvcigpLT5tX21hdGNoID09IENTU1NlbGVjdG9yOjpUYWcgJiYgIVNlbGVjdG9yQ2hlY2tl
cjo6dGFnTWF0Y2hlcyhzdGF0ZS5lbGVtZW50KCksIHJ1bGVEYXRhLnNlbGVjdG9yKCktPnRhZ1FO
YW1lKCkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBTZWxlY3RvckNoZWNr
ZXJGYXN0UGF0aCBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aChydWxlRGF0YS5zZWxlY3RvcigpLCBz
dGF0ZS5lbGVtZW50KCkpOwotICAgICAgICBpZiAoIXNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoLm1h
dGNoZXNSaWdodG1vc3RBdHRyaWJ1dGVTZWxlY3RvcigpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgICAgIHJldHVybiBzZWxlY3RvckNoZWNrZXJGYXN0UGF0aC5tYXRjaGVzKCk7
Ci0gICAgfQotCi0gICAgLy8gU2xvdyBwYXRoLgotICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3Rv
ckNoZWNrZXIoZG9jdW1lbnQoKSwgc3RhdGUubW9kZSgpKTsKLSAgICBTZWxlY3RvckNoZWNrZXI6
OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IGNvbnRleHQocnVsZURhdGEuc2VsZWN0b3IoKSwgc3Rh
dGUuZWxlbWVudCgpLCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaEVuYWJsZWQpOwotICAg
IGNvbnRleHQuZWxlbWVudFN0eWxlID0gc3RhdGUuc3R5bGUoKTsKLSAgICBjb250ZXh0LnNjb3Bl
ID0gc2NvcGU7Ci0gICAgY29udGV4dC5wc2V1ZG9JZCA9IHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVz
dCgpLnBzZXVkb0lkOwotICAgIGNvbnRleHQuc2Nyb2xsYmFyID0gc3RhdGUucHNldWRvU3R5bGVS
ZXF1ZXN0KCkuc2Nyb2xsYmFyOwotICAgIGNvbnRleHQuc2Nyb2xsYmFyUGFydCA9IHN0YXRlLnBz
ZXVkb1N0eWxlUmVxdWVzdCgpLnNjcm9sbGJhclBhcnQ7Ci0gICAgY29udGV4dC5iZWhhdmlvckF0
Qm91bmRhcnkgPSBiZWhhdmlvckF0Qm91bmRhcnk7Ci0gICAgU2VsZWN0b3JDaGVja2VyOjpNYXRj
aCBtYXRjaCA9IHNlbGVjdG9yQ2hlY2tlci5tYXRjaChjb250ZXh0LCBkeW5hbWljUHNldWRvLCBE
T01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSk7Ci0gICAgaWYgKG1hdGNoICE9IFNlbGVjdG9y
Q2hlY2tlcjo6U2VsZWN0b3JNYXRjaGVzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYg
KHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IE5PUFNFVURPICYmIHN0YXRl
LnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBzZXVkb0lkICE9IGR5bmFtaWNQc2V1ZG8pCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVy
OjpjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9yKiByZWdpb25TZWxlY3Rvciwg
RWxlbWVudCogcmVnaW9uRWxlbWVudCkKLXsKLSAgICBpZiAoIXJlZ2lvblNlbGVjdG9yIHx8ICFy
ZWdpb25FbGVtZW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTZWxlY3RvckNoZWNr
ZXIgc2VsZWN0b3JDaGVja2VyKGRvY3VtZW50KCksIG1fc3RhdGUubW9kZSgpKTsKLSAgICBmb3Ig
KGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2VsZWN0b3I7IHM7IHMgPSBDU1NTZWxlY3Rv
ckxpc3Q6Om5leHQocykpIHsKLSAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpTZWxlY3RvckNoZWNr
aW5nQ29udGV4dCBzZWxlY3RvckNoZWNraW5nQ29udGV4dChzLCByZWdpb25FbGVtZW50LCBTZWxl
Y3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERpc2FibGVkKTsKLSAgICAgICAgUHNldWRvSWQgaWdu
b3JlRHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOwotICAgICAgICBpZiAoc2VsZWN0b3JDaGVja2Vy
Lm1hdGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0LCBpZ25vcmVEeW5hbWljUHNldWRvLCBET01T
aWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkgPT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1h
dGNoZXMpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoaXMgaXMgbW9z
dGx5IGJvcmluZyBzdHVmZiBvbiBob3cgdG8gYXBwbHkgYSBjZXJ0YWluIHJ1bGUgdG8gdGhlIHJl
bmRlcnN0eWxlLi4uCi0KLUxlbmd0aCBTdHlsZVJlc29sdmVyOjpjb252ZXJ0VG9JbnRMZW5ndGgo
Q1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJl
bmRlclN0eWxlKiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQotewotICAgIHJldHVybiBw
cmltaXRpdmVWYWx1ZSA/IHByaW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRl
Z2VyQ29udmVyc2lvbiB8IFBlcmNlbnRDb252ZXJzaW9uIHwgQ2FsY3VsYXRlZENvbnZlcnNpb24g
fCBGcmFjdGlvbkNvbnZlcnNpb24gfCBWaWV3cG9ydFBlcmNlbnRhZ2VDb252ZXJzaW9uPihzdHls
ZSwgcm9vdFN0eWxlLCBtdWx0aXBsaWVyKSA6IExlbmd0aChVbmRlZmluZWQpOwotfQotCi1MZW5n
dGggU3R5bGVSZXNvbHZlcjo6Y29udmVydFRvRmxvYXRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUq
IHByaW1pdGl2ZVZhbHVlLCBSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5
bGUsIGRvdWJsZSBtdWx0aXBsaWVyKQotewotICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZSA/IHBy
aW1pdGl2ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRGbG9hdENvbnZlcnNpb24gfCBQZXJj
ZW50Q29udmVyc2lvbiB8IENhbGN1bGF0ZWRDb252ZXJzaW9uIHwgRnJhY3Rpb25Db252ZXJzaW9u
IHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbj4oc3R5bGUsIHJvb3RTdHlsZSwgbXVsdGlw
bGllcikgOiBMZW5ndGgoVW5kZWZpbmVkKTsKLX0KLQotdGVtcGxhdGUgPFN0eWxlUmVzb2x2ZXI6
OlN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJv
cGVydGllcyhjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqIHJ1
bGUsIGJvb2wgaXNJbXBvcnRhbnQsIGJvb2wgaW5oZXJpdGVkT25seSwgUHJvcGVydHlXaGl0ZWxp
c3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKLXsKLSAgICBBU1NFUlQoKHByb3BlcnR5V2hp
dGVsaXN0VHlwZSAhPSBQcm9wZXJ0eVdoaXRlbGlzdFJlZ2lvbikgfHwgbV9zdGF0ZS5yZWdpb25G
b3JTdHlsaW5nKCkpOwotICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSBjb29raWUg
PSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxQcm9jZXNzUnVsZShkb2N1bWVudCgpLCBy
dWxlLCB0aGlzKTsKLQotICAgIHVuc2lnbmVkIHByb3BlcnR5Q291bnQgPSBwcm9wZXJ0aWVzLT5w
cm9wZXJ0eUNvdW50KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3BlcnR5Q291
bnQ7ICsraSkgewotICAgICAgICBTdHlsZVByb3BlcnR5U2V0OjpQcm9wZXJ0eVJlZmVyZW5jZSBj
dXJyZW50ID0gcHJvcGVydGllcy0+cHJvcGVydHlBdChpKTsKLSAgICAgICAgaWYgKGlzSW1wb3J0
YW50ICE9IGN1cnJlbnQuaXNJbXBvcnRhbnQoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICBpZiAoaW5oZXJpdGVkT25seSAmJiAhY3VycmVudC5pc0luaGVyaXRlZCgpKSB7Ci0gICAg
ICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgZXhwbGljaXRseSBpbmhlcml0ZWQs
IHdlIG5lZWQgdG8gYXBwbHkgZnVydGhlciBub24taW5oZXJpdGVkIHByb3BlcnRpZXMKLSAgICAg
ICAgICAgIC8vIGFzIHRoZXkgbWlnaHQgb3ZlcnJpZGUgdGhlIHZhbHVlIGluaGVyaXRlZCBoZXJl
LiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb25zIHdpdGgKLSAgICAg
ICAgICAgIC8vIGV4cGxpY2l0bHkgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG8gYmUgY2FjaGVkLgot
ICAgICAgICAgICAgQVNTRVJUKCFjdXJyZW50LnZhbHVlKCktPmlzSW5oZXJpdGVkVmFsdWUoKSk7
Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDU1NQcm9wZXJ0eUlE
IHByb3BlcnR5ID0gY3VycmVudC5pZCgpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eVdoaXRlbGlz
dFR5cGUgPT0gUHJvcGVydHlXaGl0ZWxpc3RSZWdpb24gJiYgIVN0eWxlUmVzb2x2ZXI6OmlzVmFs
aWRSZWdpb25TdHlsZVByb3BlcnR5KHByb3BlcnR5KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
I2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICAgICAgaWYgKHByb3BlcnR5V2hpdGVsaXN0VHlw
ZSA9PSBQcm9wZXJ0eVdoaXRlbGlzdEN1ZSAmJiAhU3R5bGVSZXNvbHZlcjo6aXNWYWxpZEN1ZVN0
eWxlUHJvcGVydHkocHJvcGVydHkpKQotICAgICAgICAgICAgY29udGludWU7Ci0jZW5kaWYKLSAg
ICAgICAgc3dpdGNoIChwYXNzKSB7Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgICAg
IGNhc2UgVmFyaWFibGVEZWZpbml0aW9uczoKLSAgICAgICAgICAgIENPTVBJTEVfQVNTRVJUKENT
U1Byb3BlcnR5VmFyaWFibGUgPCBmaXJzdENTU1Byb3BlcnR5LCBDU1NfdmFyaWFibGVfaXNfYmVm
b3JlX2ZpcnN0X3Byb3BlcnR5KTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBDU1NQcm9w
ZXJ0eVZhcmlhYmxlKQotICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgp
LCBjdXJyZW50LnZhbHVlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAg
Y2FzZSBIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzOgotICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQo
Zmlyc3RDU1NQcm9wZXJ0eSA9PSBDU1NQcm9wZXJ0eUNvbG9yLCBDU1NfY29sb3JfaXNfZmlyc3Rf
cHJvcGVydHkpOwotICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlab29tID09
IENTU1Byb3BlcnR5Q29sb3IgKyAxNywgQ1NTX3pvb21faXNfZW5kX29mX2ZpcnN0X3Byb3BfcmFu
Z2UpOwotICAgICAgICAgICAgQ09NUElMRV9BU1NFUlQoQ1NTUHJvcGVydHlMaW5lSGVpZ2h0ID09
IENTU1Byb3BlcnR5Wm9vbSArIDEsIENTU19saW5lX2hlaWdodF9pc19hZnRlcl96b29tKTsKLSNp
ZiBFTkFCTEUoQ1NTX1ZBUklBQkxFUykKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBDU1NQ
cm9wZXJ0eVZhcmlhYmxlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotI2VuZGlmCi0gICAg
ICAgICAgICAvLyBnaXZlIHNwZWNpYWwgcHJpb3JpdHkgdG8gZm9udC14eHgsIGNvbG9yIHByb3Bl
cnRpZXMsIGV0YwotICAgICAgICAgICAgaWYgKHByb3BlcnR5IDwgQ1NTUHJvcGVydHlMaW5lSGVp
Z2h0KQotICAgICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50
LnZhbHVlKCkpOwotICAgICAgICAgICAgLy8gd2UgYXBwbHkgbGluZS1oZWlnaHQgbGF0ZXIKLSAg
ICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IENTU1Byb3BlcnR5TGluZUhlaWdodCkKLSAg
ICAgICAgICAgICAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZShjdXJyZW50LnZhbHVlKCkp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTG93UHJpb3JpdHlQcm9wZXJ0aWVz
OgotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID4gQ1NTUHJvcGVydHlMaW5lSGVpZ2h0KQotICAg
ICAgICAgICAgICAgIGFwcGx5UHJvcGVydHkoY3VycmVudC5pZCgpLCBjdXJyZW50LnZhbHVlKCkp
OwotICAgICAgICB9Ci0gICAgfQotICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGlkUHJv
Y2Vzc1J1bGUoY29va2llKTsKLX0KLQotdGVtcGxhdGUgPFN0eWxlUmVzb2x2ZXI6OlN0eWxlQXBw
bGljYXRpb25QYXNzIHBhc3M+Ci12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5TWF0Y2hlZFByb3Bl
cnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0LCBib29sIGlzSW1wb3J0YW50LCBp
bnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBib29sIGluaGVyaXRlZE9ubHkpCi17Ci0gICAg
aWYgKHN0YXJ0SW5kZXggPT0gLTEpCi0gICAgICAgIHJldHVybjsKLQotICAgIFN0YXRlJiBzdGF0
ZSA9IG1fc3RhdGU7Ci0gICAgaWYgKHN0YXRlLnN0eWxlKCktPmluc2lkZUxpbmsoKSAhPSBOb3RJ
bnNpZGVMaW5rKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZElu
ZGV4OyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJiBtYXRjaGVk
UHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldOwotICAgICAgICAg
ICAgdW5zaWduZWQgbGlua01hdGNoVHlwZSA9IG1hdGNoZWRQcm9wZXJ0aWVzLmxpbmtNYXRjaFR5
cGU7Ci0gICAgICAgICAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZXIgdG8gcGFzcyB0aGVz
ZSBhcyBhcmd1bWVudHMgYnV0IHRoYXQgcmVxdWlyZXMgY2hhbmdlcyBpbiBtYW55IHBsYWNlcy4K
LSAgICAgICAgICAgIHN0YXRlLnNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShsaW5rTWF0
Y2hUeXBlICYgU2VsZWN0b3JDaGVja2VyOjpNYXRjaExpbmspOwotICAgICAgICAgICAgc3RhdGUu
c2V0QXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShsaW5rTWF0Y2hUeXBlICYgU2VsZWN0
b3JDaGVja2VyOjpNYXRjaFZpc2l0ZWQpOwotCi0gICAgICAgICAgICBhcHBseVByb3BlcnRpZXM8
cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJvcGVydGllcy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0
Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwgaW5oZXJpdGVkT25seSwgc3RhdGljX2Nhc3Q8UHJv
cGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVkUHJvcGVydGllcy53aGl0ZWxpc3RUeXBlKSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgc3RhdGUuc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKHRy
dWUpOwotICAgICAgICBzdGF0ZS5zZXRBcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGZh
bHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gc3RhcnRJbmRl
eDsgaSA8PSBlbmRJbmRleDsgKytpKSB7Ci0gICAgICAgIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVz
JiBtYXRjaGVkUHJvcGVydGllcyA9IG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldOwot
ICAgICAgICBhcHBseVByb3BlcnRpZXM8cGFzcz4obWF0Y2hlZFByb3BlcnRpZXMucHJvcGVydGll
cy5nZXQoKSwgbWF0Y2hSZXN1bHQubWF0Y2hlZFJ1bGVzW2ldLCBpc0ltcG9ydGFudCwgaW5oZXJp
dGVkT25seSwgc3RhdGljX2Nhc3Q8UHJvcGVydHlXaGl0ZWxpc3RUeXBlPihtYXRjaGVkUHJvcGVy
dGllcy53aGl0ZWxpc3RUeXBlKSk7Ci0gICAgfQotfQotCi11bnNpZ25lZCBTdHlsZVJlc29sdmVy
Ojpjb21wdXRlTWF0Y2hlZFByb3BlcnRpZXNIYXNoKGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzKiBw
cm9wZXJ0aWVzLCB1bnNpZ25lZCBzaXplKQotewotICAgIAotICAgIHJldHVybiBTdHJpbmdIYXNo
ZXI6Omhhc2hNZW1vcnkocHJvcGVydGllcywgc2l6ZW9mKE1hdGNoZWRQcm9wZXJ0aWVzKSAqIHNp
emUpOwotfQotCi1ib29sIG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hSYW5n
ZXMmIGEsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBiKQotewotICAgIHJldHVy
biBhLmZpcnN0VUFSdWxlID09IGIuZmlyc3RVQVJ1bGUKLSAgICAgICAgJiYgYS5sYXN0VUFSdWxl
ID09IGIubGFzdFVBUnVsZQotICAgICAgICAmJiBhLmZpcnN0QXV0aG9yUnVsZSA9PSBiLmZpcnN0
QXV0aG9yUnVsZQotICAgICAgICAmJiBhLmxhc3RBdXRob3JSdWxlID09IGIubGFzdEF1dGhvclJ1
bGUKLSAgICAgICAgJiYgYS5maXJzdFVzZXJSdWxlID09IGIuZmlyc3RVc2VyUnVsZQotICAgICAg
ICAmJiBhLmxhc3RVc2VyUnVsZSA9PSBiLmxhc3RVc2VyUnVsZTsKLX0KLQotYm9vbCBvcGVyYXRv
ciE9KGNvbnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmFuZ2VzJiBhLCBjb25zdCBTdHlsZVJlc29s
dmVyOjpNYXRjaFJhbmdlcyYgYikKLXsKLSAgICByZXR1cm4gIShhID09IGIpOwotfQotCi1ib29s
IG9wZXJhdG9yPT0oY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMmIGEsIGNv
bnN0IFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBiKQotewotICAgIHJldHVybiBh
LnByb3BlcnRpZXMgPT0gYi5wcm9wZXJ0aWVzICYmIGEubGlua01hdGNoVHlwZSA9PSBiLmxpbmtN
YXRjaFR5cGU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHlsZVJlc29sdmVyOjpNYXRj
aGVkUHJvcGVydGllcyYgYSwgY29uc3QgU3R5bGVSZXNvbHZlcjo6TWF0Y2hlZFByb3BlcnRpZXMm
IGIpCi17Ci0gICAgcmV0dXJuICEoYSA9PSBiKTsKLX0KLQotY29uc3QgU3R5bGVSZXNvbHZlcjo6
TWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIFN0eWxlUmVzb2x2ZXI6OmZpbmRGcm9tTWF0Y2hl
ZFByb3BlcnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYgbWF0Y2hS
ZXN1bHQpCi17Ci0gICAgQVNTRVJUKGhhc2gpOwotCi0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZTo6aXRlcmF0b3IgaXQgPSBtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUuZmluZChoYXNoKTsKLSAg
ICBpZiAoaXQgPT0gbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmVuZCgpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSYgY2FjaGVJdGVtID0gaXQtPnZh
bHVlOwotCi0gICAgc2l6ZV90IHNpemUgPSBtYXRjaFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5z
aXplKCk7Ci0gICAgaWYgKHNpemUgIT0gY2FjaGVJdGVtLm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUo
KSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyAr
K2kpIHsKLSAgICAgICAgaWYgKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzW2ldICE9IGNh
Y2hlSXRlbS5tYXRjaGVkUHJvcGVydGllc1tpXSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAg
IH0KLSAgICBpZiAoY2FjaGVJdGVtLnJhbmdlcyAhPSBtYXRjaFJlc3VsdC5yYW5nZXMpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIHJldHVybiAmY2FjaGVJdGVtOwotfQotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6OmFkZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShjb25zdCBSZW5kZXJTdHlsZSogc3R5
bGUsIGNvbnN0IFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgdW5zaWduZWQgaGFzaCwgY29uc3Qg
TWF0Y2hSZXN1bHQmIG1hdGNoUmVzdWx0KQotewotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBt
YXRjaGVkRGVjbGFyYXRpb25DYWNoZUFkZGl0aW9uc0JldHdlZW5Td2VlcHMgPSAxMDA7Ci0gICAg
aWYgKCsrbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXAgPj0g
bWF0Y2hlZERlY2xhcmF0aW9uQ2FjaGVBZGRpdGlvbnNCZXR3ZWVuU3dlZXBzCi0gICAgICAgICYm
ICFtX21hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLmlzQWN0aXZlKCkpIHsKLSAgICAg
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlU3dlZXBUaW1l
SW5TZWNvbmRzID0gNjA7Ci0gICAgICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGlt
ZXIuc3RhcnRPbmVTaG90KG1hdGNoZWREZWNsYXJhdGlvbkNhY2hlU3dlZXBUaW1lSW5TZWNvbmRz
KTsKLSAgICB9Ci0KLSAgICBBU1NFUlQoaGFzaCk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXNDYWNo
ZUl0ZW0gY2FjaGVJdGVtOwotICAgIGNhY2hlSXRlbS5tYXRjaGVkUHJvcGVydGllcy5hcHBlbmQo
bWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMpOwotICAgIGNhY2hlSXRlbS5yYW5nZXMgPSBt
YXRjaFJlc3VsdC5yYW5nZXM7Ci0gICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IGNhY2hlIHRoZSBv
cmlnaW5hbCBSZW5kZXJTdHlsZSBpbnN0YW5jZS4gSXQgbWF5IGJlIGZ1cnRoZXIgbW9kaWZpZWQu
Ci0gICAgLy8gVGhlIFJlbmRlclN0eWxlIGluIHRoZSBjYWNoZSBpcyByZWFsbHkganVzdCBhIGhv
bGRlciBmb3IgdGhlIHN1YnN0cnVjdHVyZXMgYW5kIG5ldmVyIHVzZWQgYXMtaXMuCi0gICAgY2Fj
aGVJdGVtLnJlbmRlclN0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHN0eWxlKTsKLSAgICBjYWNo
ZUl0ZW0ucGFyZW50UmVuZGVyU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocGFyZW50U3R5bGUp
OwotICAgIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZS5hZGQoaGFzaCwgY2FjaGVJdGVtKTsKLX0K
LQotdm9pZCBTdHlsZVJlc29sdmVyOjppbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSgp
Ci17Ci0gICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlLmNsZWFyKCk7Ci19Ci0KLXN0YXRpYyBi
b29sIGlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IEVsZW1lbnQqIGVs
ZW1lbnQsIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVu
dFN0eWxlKQotewotICAgIC8vIEZJWE1FOiBDU1NQcm9wZXJ0eVdlYmtpdFdyaXRpbmdNb2RlIG1v
ZGlmaWVzIHN0YXRlIHdoZW4gYXBwbHlpbmcgdG8gZG9jdW1lbnQgZWxlbWVudC4gV2UgY2FuJ3Qg
c2tpcCB0aGUgYXBwbHlpbmcgYnkgY2FjaGluZy4KLSAgICBpZiAoZWxlbWVudCA9PSBlbGVtZW50
LT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSAmJiBlbGVtZW50LT5kb2N1bWVudCgpLT53
cml0aW5nTW9kZVNldE9uRG9jdW1lbnRFbGVtZW50KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoc3R5bGUtPnVuaXF1ZSgpIHx8IChzdHlsZS0+c3R5bGVUeXBlKCkgIT0gTk9QU0VV
RE8gJiYgcGFyZW50U3R5bGUtPnVuaXF1ZSgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGlmIChzdHlsZS0+aGFzQXBwZWFyYW5jZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKHN0eWxlLT56b29tKCkgIT0gUmVuZGVyU3R5bGU6OmluaXRpYWxab29tKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICBpZiAoc3R5bGUtPndyaXRpbmdNb2RlKCkgIT0gUmVuZGVyU3R5
bGU6OmluaXRpYWxXcml0aW5nTW9kZSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8g
VGhlIGNhY2hlIGFzc3VtZXMgc3RhdGljIGtub3dsZWRnZSBhYm91dCB3aGljaCBwcm9wZXJ0aWVz
IGFyZSBpbmhlcml0ZWQuCi0gICAgaWYgKHBhcmVudFN0eWxlLT5oYXNFeHBsaWNpdGx5SW5oZXJp
dGVkUHJvcGVydGllcygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6YXBwbHlNYXRjaGVkUHJvcGVydGllcyhjb25zdCBN
YXRjaFJlc3VsdCYgbWF0Y2hSZXN1bHQsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAg
QVNTRVJUKGVsZW1lbnQpOwotICAgIFN0YXRlJiBzdGF0ZSA9IG1fc3RhdGU7Ci0gICAgdW5zaWdu
ZWQgY2FjaGVIYXNoID0gbWF0Y2hSZXN1bHQuaXNDYWNoZWFibGUgPyBjb21wdXRlTWF0Y2hlZFBy
b3BlcnRpZXNIYXNoKG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmRhdGEoKSwgbWF0Y2hS
ZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpKSA6IDA7Ci0gICAgYm9vbCBhcHBseUluaGVy
aXRlZE9ubHkgPSBmYWxzZTsKLSAgICBjb25zdCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSog
Y2FjaGVJdGVtID0gMDsKLSAgICBpZiAoY2FjaGVIYXNoICYmIChjYWNoZUl0ZW0gPSBmaW5kRnJv
bU1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCkpKSB7Ci0gICAg
ICAgIC8vIFdlIGNhbiBidWlsZCB1cCB0aGUgc3R5bGUgYnkgY29weWluZyBub24taW5oZXJpdGVk
IHByb3BlcnRpZXMgZnJvbSBhbiBlYXJsaWVyIHN0eWxlIG9iamVjdCBidWlsdCB1c2luZyB0aGUg
c2FtZSBleGFjdAotICAgICAgICAvLyBzdHlsZSBkZWNsYXJhdGlvbnMuIFdlIHRoZW4gb25seSBu
ZWVkIHRvIGFwcGx5IHRoZSBpbmhlcml0ZWQgcHJvcGVydGllcywgaWYgYW55LCBhcyB0aGVpciB2
YWx1ZXMgY2FuIGRlcGVuZCBvbiB0aGUgCi0gICAgICAgIC8vIGVsZW1lbnQgY29udGV4dC4gVGhp
cyBpcyBmYXN0IGFuZCBzYXZlcyBtZW1vcnkgYnkgcmV1c2luZyB0aGUgc3R5bGUgZGF0YSBzdHJ1
Y3R1cmVzLgotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5jb3B5Tm9uSW5oZXJpdGVkRnJvbShjYWNo
ZUl0ZW0tPnJlbmRlclN0eWxlLmdldCgpKTsKLSAgICAgICAgaWYgKHN0YXRlLnBhcmVudFN0eWxl
KCktPmluaGVyaXRlZERhdGFTaGFyZWQoY2FjaGVJdGVtLT5wYXJlbnRSZW5kZXJTdHlsZS5nZXQo
KSkgJiYgIWlzQXRTaGFkb3dCb3VuZGFyeShlbGVtZW50KSkgewotICAgICAgICAgICAgRUluc2lk
ZUxpbmsgbGlua1N0YXR1cyA9IHN0YXRlLnN0eWxlKCktPmluc2lkZUxpbmsoKTsKLSAgICAgICAg
ICAgIC8vIElmIHRoZSBjYWNoZSBpdGVtIHBhcmVudCBzdHlsZSBoYXMgaWRlbnRpY2FsIGluaGVy
aXRlZCBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJyZW50IHBhcmVudCBzdHlsZSB0aGVuIHRoZQotICAg
ICAgICAgICAgLy8gcmVzdWx0aW5nIHN0eWxlIHdpbGwgYmUgaWRlbnRpY2FsIHRvby4gV2UgY29w
eSB0aGUgaW5oZXJpdGVkIHByb3BlcnRpZXMgb3ZlciBmcm9tIHRoZSBjYWNoZSBhbmQgYXJlIGRv
bmUuCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5pbmhlcml0RnJvbShjYWNoZUl0ZW0tPnJl
bmRlclN0eWxlLmdldCgpKTsKLQotICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSB0aGUgbGlu
ayBzdGF0dXMgaXMgdHJlYXRlZCBsaWtlIGFuIGluaGVyaXRlZCBwcm9wZXJ0eS4gV2UgbmVlZCB0
byBleHBsaWNpdGx5IHJlc3RvcmUgaXQuCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRJ
bnNpZGVMaW5rKGxpbmtTdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0g
ICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IHRydWU7IAotICAgIH0KLQotI2lmIEVOQUJMRShD
U1NfVkFSSUFCTEVTKQotICAgIC8vIEZpcnN0IGFwcGx5IGFsbCB2YXJpYWJsZSBkZWZpbml0aW9u
cywgYXMgdGhleSBtYXkgYmUgdXNlZCBkdXJpbmcgYXBwbGljYXRpb24gb2YgbGF0ZXIgcHJvcGVy
dGllcy4KLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZhcmlhYmxlRGVmaW5pdGlvbnM+KG1h
dGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgp
IC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPFZh
cmlhYmxlRGVmaW5pdGlvbnM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMu
Zmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5
SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmlu
aXRpb25zPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VXNlclJ1
bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7
Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxWYXJpYWJsZURlZmluaXRpb25zPihtYXRjaFJl
c3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZpcnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5y
YW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSNlbmRpZgotCi0gICAgLy8g
Tm93IHdlIGhhdmUgYWxsIG9mIHRoZSBtYXRjaGVkIHJ1bGVzIGluIHRoZSBhcHByb3ByaWF0ZSBv
cmRlci4gV2FsayB0aGUgcnVsZXMgYW5kIGFwcGx5Ci0gICAgLy8gaGlnaC1wcmlvcml0eSBwcm9w
ZXJ0aWVzIGZpcnN0LCBpLmUuLCB0aG9zZSBwcm9wZXJ0aWVzIHRoYXQgb3RoZXIgcHJvcGVydGll
cyBkZXBlbmQgb24uCi0gICAgLy8gVGhlIG9yZGVyIGlzICgxKSBoaWdoLXByaW9yaXR5IG5vdCBp
bXBvcnRhbnQsICgyKSBoaWdoLXByaW9yaXR5IGltcG9ydGFudCwgKDMpIG5vcm1hbCBub3QgaW1w
b3J0YW50Ci0gICAgLy8gYW5kICg0KSBub3JtYWwgaW1wb3J0YW50LgotICAgIHN0YXRlLnNldExp
bmVIZWlnaHRWYWx1ZSgwKTsKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0
eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCBmYWxzZSwgMCwgbWF0Y2hSZXN1bHQubWF0Y2hlZFBy
b3BlcnRpZXMuc2l6ZSgpIC0gMSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsKLSAgICBhcHBseU1hdGNo
ZWRQcm9wZXJ0aWVzPEhpZ2hQcmlvcml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBt
YXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFz
dEF1dGhvclJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVy
dGllczxIaWdoUHJpb3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1
bHQucmFuZ2VzLmZpcnN0VXNlclJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0VXNlclJ1bGUs
IGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxIaWdoUHJp
b3JpdHlQcm9wZXJ0aWVzPihtYXRjaFJlc3VsdCwgdHJ1ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmZp
cnN0VUFSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdFVBUnVsZSwgYXBwbHlJbmhlcml0ZWRP
bmx5KTsKLQotICAgIGlmIChjYWNoZUl0ZW0gJiYgY2FjaGVJdGVtLT5yZW5kZXJTdHlsZS0+ZWZm
ZWN0aXZlWm9vbSgpICE9IHN0YXRlLnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSkgewotICAgICAg
ICBzdGF0ZS5zZXRGb250RGlydHkodHJ1ZSk7Ci0gICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9
IGZhbHNlOwotICAgIH0KLQotICAgIC8vIElmIG91ciBmb250IGdvdCBkaXJ0aWVkLCBnbyBhaGVh
ZCBhbmQgdXBkYXRlIGl0IG5vdy4KLSAgICB1cGRhdGVGb250KCk7Ci0KLSAgICAvLyBMaW5lLWhl
aWdodCBpcyBzZXQgd2hlbiB3ZSBhcmUgc3VyZSB3ZSBkZWNpZGVkIG9uIHRoZSBmb250LXNpemUu
Ci0gICAgaWYgKHN0YXRlLmxpbmVIZWlnaHRWYWx1ZSgpKQotICAgICAgICBhcHBseVByb3BlcnR5
KENTU1Byb3BlcnR5TGluZUhlaWdodCwgc3RhdGUubGluZUhlaWdodFZhbHVlKCkpOwotCi0gICAg
Ly8gTWFueSBwcm9wZXJ0aWVzIGRlcGVuZCBvbiB0aGUgZm9udC4gSWYgaXQgY2hhbmdlcyB3ZSBq
dXN0IGFwcGx5IGFsbCBwcm9wZXJ0aWVzLgotICAgIGlmIChjYWNoZUl0ZW0gJiYgY2FjaGVJdGVt
LT5yZW5kZXJTdHlsZS0+Zm9udERlc2NyaXB0aW9uKCkgIT0gc3RhdGUuc3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCkpCi0gICAgICAgIGFwcGx5SW5oZXJpdGVkT25seSA9IGZhbHNlOwotCi0gICAg
Ly8gTm93IGRvIHRoZSBub3JtYWwgcHJpb3JpdHkgVUEgcHJvcGVydGllcy4KLSAgICBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNl
LCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVQVJ1bGUsIG1hdGNoUmVzdWx0LnJhbmdlcy5sYXN0
VUFSdWxlLCBhcHBseUluaGVyaXRlZE9ubHkpOwotICAgIAotICAgIC8vIENhY2hlIG91ciBib3Jk
ZXIgYW5kIGJhY2tncm91bmQgc28gdGhhdCB3ZSBjYW4gZXhhbWluZSB0aGVtIGxhdGVyLgotICAg
IHN0YXRlLmNhY2hlQm9yZGVyQW5kQmFja2dyb3VuZCgpOwotICAgIAotICAgIC8vIE5vdyBkbyB0
aGUgYXV0aG9yIGFuZCB1c2VyIG5vcm1hbCBwcmlvcml0eSBwcm9wZXJ0aWVzIGFuZCBhbGwgdGhl
ICFpbXBvcnRhbnQgcHJvcGVydGllcy4KLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1By
aW9yaXR5UHJvcGVydGllcz4obWF0Y2hSZXN1bHQsIGZhbHNlLCBtYXRjaFJlc3VsdC5yYW5nZXMu
bGFzdFVBUnVsZSArIDEsIG1hdGNoUmVzdWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEs
IGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlv
cml0eVByb3BlcnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmly
c3RBdXRob3JSdWxlLCBtYXRjaFJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGUsIGFwcGx5SW5o
ZXJpdGVkT25seSk7Ci0gICAgYXBwbHlNYXRjaGVkUHJvcGVydGllczxMb3dQcmlvcml0eVByb3Bl
cnRpZXM+KG1hdGNoUmVzdWx0LCB0cnVlLCBtYXRjaFJlc3VsdC5yYW5nZXMuZmlyc3RVc2VyUnVs
ZSwgbWF0Y2hSZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSwgYXBwbHlJbmhlcml0ZWRPbmx5KTsK
LSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzPExvd1ByaW9yaXR5UHJvcGVydGllcz4obWF0Y2hS
ZXN1bHQsIHRydWUsIG1hdGNoUmVzdWx0LnJhbmdlcy5maXJzdFVBUnVsZSwgbWF0Y2hSZXN1bHQu
cmFuZ2VzLmxhc3RVQVJ1bGUsIGFwcGx5SW5oZXJpdGVkT25seSk7Ci0gICAKLSAgICAvLyBTdGFy
dCBsb2FkaW5nIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBl
bmRpbmdSZXNvdXJjZXMoKTsKLSAgICAKLSAgICBBU1NFUlQoIXN0YXRlLmZvbnREaXJ0eSgpKTsK
LSAgICAKLSAgICBpZiAoY2FjaGVJdGVtIHx8ICFjYWNoZUhhc2gpCi0gICAgICAgIHJldHVybjsK
LSAgICBpZiAoIWlzQ2FjaGVhYmxlSW5NYXRjaGVkUHJvcGVydGllc0NhY2hlKHN0YXRlLmVsZW1l
bnQoKSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSkpCi0gICAgICAgIHJldHVy
bjsKLSAgICBhZGRUb01hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUu
cGFyZW50U3R5bGUoKSwgY2FjaGVIYXNoLCBtYXRjaFJlc3VsdCk7Ci19Ci0KLXN0YXRpYyBpbmxp
bmUgYm9vbCBjb21wYXJlUGFnZVJ1bGVzKGNvbnN0IFN0eWxlUnVsZVBhZ2UqIHIxLCBjb25zdCBT
dHlsZVJ1bGVQYWdlKiByMikKLXsKLSAgICByZXR1cm4gcjEtPnNlbGVjdG9yKCktPnNwZWNpZmlj
aXR5KCkgPCByMi0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKTsKLX0KLQotdm9pZCBTdHlsZVJl
c29sdmVyOjptYXRjaFBhZ2VSdWxlcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBSdWxlU2V0KiBydWxl
cywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VO
YW1lKQotewotICAgIGlmICghcnVsZXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4gbWF0Y2hlZFBhZ2VSdWxlczsKLSAgICBtYXRjaFBhZ2VSdWxlc0Zvckxp
c3QobWF0Y2hlZFBhZ2VSdWxlcywgcnVsZXMtPnBhZ2VSdWxlcygpLCBpc0xlZnRQYWdlLCBpc0Zp
cnN0UGFnZSwgcGFnZU5hbWUpOwotICAgIGlmIChtYXRjaGVkUGFnZVJ1bGVzLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgc3RkOjpzdGFibGVfc29ydChtYXRjaGVkUGFnZVJ1bGVz
LmJlZ2luKCksIG1hdGNoZWRQYWdlUnVsZXMuZW5kKCksIGNvbXBhcmVQYWdlUnVsZXMpOwotCi0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1hdGNoZWRQYWdlUnVsZXMuc2l6ZSgpOyBpKysp
Ci0gICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJlc3VsdCwgbWF0Y2hlZFBhZ2VSdWxlc1tp
XS0+cHJvcGVydGllcygpKTsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tQYWdlU2VsZWN0b3JDb21w
b25lbnRzKGNvbnN0IENTU1NlbGVjdG9yKiBzZWxlY3RvciwgYm9vbCBpc0xlZnRQYWdlLCBib29s
IGlzRmlyc3RQYWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQotewotICAgIGZvciAoY29uc3Qg
Q1NTU2VsZWN0b3IqIGNvbXBvbmVudCA9IHNlbGVjdG9yOyBjb21wb25lbnQ7IGNvbXBvbmVudCA9
IGNvbXBvbmVudC0+dGFnSGlzdG9yeSgpKSB7Ci0gICAgICAgIGlmIChjb21wb25lbnQtPm1fbWF0
Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZykgewotICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBsb2NhbE5hbWUgPSBjb21wb25lbnQtPnRhZ1FOYW1lKCkubG9jYWxOYW1lKCk7Ci0gICAgICAg
ICAgICBpZiAobG9jYWxOYW1lICE9IHN0YXJBdG9tICYmIGxvY2FsTmFtZSAhPSBwYWdlTmFtZSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBDU1NT
ZWxlY3Rvcjo6UHNldWRvVHlwZSBwc2V1ZG9UeXBlID0gY29tcG9uZW50LT5wc2V1ZG9UeXBlKCk7
Ci0gICAgICAgIGlmICgocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvTGVmdFBhZ2Ug
JiYgIWlzTGVmdFBhZ2UpCi0gICAgICAgICAgICB8fCAocHNldWRvVHlwZSA9PSBDU1NTZWxlY3Rv
cjo6UHNldWRvUmlnaHRQYWdlICYmIGlzTGVmdFBhZ2UpCi0gICAgICAgICAgICB8fCAocHNldWRv
VHlwZSA9PSBDU1NTZWxlY3Rvcjo6UHNldWRvRmlyc3RQYWdlICYmICFpc0ZpcnN0UGFnZSkpCi0g
ICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjptYXRjaFBhZ2VSdWxlc0Zv
ckxpc3QoVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYgbWF0Y2hlZFJ1bGVzLCBjb25zdCBWZWN0b3I8
U3R5bGVSdWxlUGFnZSo+JiBydWxlcywgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQYWdl
LCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBydWxlcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHlsZVJ1bGVQYWdlKiBydWxlID0gcnVs
ZXNbaV07Ci0KLSAgICAgICAgaWYgKCFjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMocnVsZS0+
c2VsZWN0b3IoKSwgaXNMZWZ0UGFnZSwgaXNGaXJzdFBhZ2UsIHBhZ2VOYW1lKSkKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIElmIHRoZSBydWxlIGhhcyBubyBwcm9wZXJ0aWVz
IHRvIGFwcGx5LCB0aGVuIGlnbm9yZSBpdC4KLSAgICAgICAgY29uc3QgU3R5bGVQcm9wZXJ0eVNl
dCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0
aWVzIHx8IHByb3BlcnRpZXMtPmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIC8vIEFkZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAg
ICAgICAgbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3R5bGVS
ZXNvbHZlcjo6aXNMZWZ0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAotewotICAgIGJvb2wgaXNG
aXJzdFBhZ2VMZWZ0ID0gZmFsc2U7Ci0gICAgaWYgKCFtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQotICAgICAgICBpc0ZpcnN0UGFnZUxlZnQgPSB0
cnVlOwotCi0gICAgcmV0dXJuIChwYWdlSW5kZXggKyAoaXNGaXJzdFBhZ2VMZWZ0ID8gMSA6IDAp
KSAlIDI7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6aXNGaXJzdFBhZ2UoaW50IHBhZ2VJbmRl
eCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSW4gY2FzZSBvZiBmb3JjZWQgbGVmdC9yaWdodCBw
YWdlLCBwYWdlIGF0IGluZGV4IDEgKG5vdCAwKSBjYW4gYmUgdGhlIGZpcnN0IHBhZ2UuCi0gICAg
cmV0dXJuICghcGFnZUluZGV4KTsKLX0KLQotU3RyaW5nIFN0eWxlUmVzb2x2ZXI6OnBhZ2VOYW1l
KGludCAvKiBwYWdlSW5kZXggKi8pIGNvbnN0Ci17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudCBw
YWdlIGluZGV4IHRvIHBhZ2UgbmFtZSBtYXBwaW5nLgotICAgIHJldHVybiAiIjsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjphcHBseVByb3BlcnR5VG9TdHlsZShDU1NQcm9wZXJ0eUlEIGlkLCBD
U1NWYWx1ZSogdmFsdWUsIFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICBpbml0RWxlbWVudCgw
KTsKLSAgICBtX3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgMCwgc3R5bGUp
OwotICAgIG1fc3RhdGUuc2V0U3R5bGUoc3R5bGUpOwotICAgIGFwcGx5UHJvcGVydHlUb0N1cnJl
bnRTdHlsZShpZCwgdmFsdWUpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFwcGx5UHJvcGVy
dHlUb0N1cnJlbnRTdHlsZShDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUpCi17Ci0g
ICAgaWYgKHZhbHVlKQotICAgICAgICBhcHBseVByb3BlcnR5KGlkLCB2YWx1ZSk7Ci19Ci0KLWlu
bGluZSBib29sIGlzVmFsaWRWaXNpdGVkTGlua1Byb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCi17
Ci0gICAgc3dpdGNoIChpZCkgewotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5Qm9yZGVyUmlnaHRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdFRleHRFbXBoYXNpc0NvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0Rmls
bENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3I6Ci0jaWYg
RU5BQkxFKFNWRykKLSAgICBjYXNlIENTU1Byb3BlcnR5RmlsbDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5U3Ryb2tlOgotI2VuZGlmCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gaHR0cDov
L2Rldi53My5vcmcvY3Nzd2cvY3NzMy1yZWdpb25zLyN0aGUtYXQtcmVnaW9uLXN0eWxlLXJ1bGUK
LS8vIEZJWE1FOiBhZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3Igb3RoZXIgcmVnaW9uIHN0eWxp
bmcgcHJvcGVydGllcy4KLWlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OmlzVmFsaWRSZWdpb25T
dHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkgewotICAg
IGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUNv
bG9yOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsK
LSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZiBFTkFCTEUoVklERU9fVFJBQ0sp
Ci1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjppc1ZhbGlkQ3VlU3R5bGVQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUlEIGlkKQotewotICAgIHN3aXRjaCAoaWQpIHsKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEF0dGFjaG1lbnQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRJbWFnZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZE9yaWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZFBvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRp
b25YOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3Jv
dW5kUmVwZWF0WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdFk6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDb2xv
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udEZh
bWlseToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFNpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUZvbnRTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udFZhcmlhbnQ6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUZvbnRXZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpbmVIZWlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU9wYWNpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU91dGxpbmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
T3V0bGluZU9mZnNldDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3V0bGluZVN0eWxlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlPdXRsaW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxp
dHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdoaXRlU3BhY2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVRleHREZWNvcmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0U2hhZG93OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJTdHlsZToKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVm
YXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRp
ZgotLy8gU1ZHIGhhbmRsZXMgem9vbWluZyBpbiBhIGRpZmZlcmVudCB3YXkgY29tcGFyZWQgdG8g
Q1NTLiBUaGUgd2hvbGUgZG9jdW1lbnQgaXMgc2NhbGVkIGluc3RlYWQKLS8vIG9mIGVhY2ggaW5k
aXZpZHVhbCBsZW5ndGggdmFsdWUgaW4gdGhlIHJlbmRlciBzdHlsZSAvIHRyZWUuIENTU1ByaW1p
dGl2ZVZhbHVlOjpjb21wdXRlTGVuZ3RoKigpCi0vLyBtdWx0aXBsaWVzIGVhY2ggcmVzb2x2ZWQg
bGVuZ3RoIHdpdGggdGhlIHpvb20gbXVsdGlwbGllciAtIHNvIGZvciBTVkcgd2UgbmVlZCB0byBk
aXNhYmxlIHRoYXQuCi0vLyBUaG91Z2ggYWxsIENTUyB2YWx1ZXMgdGhhdCBjYW4gYmUgYXBwbGll
ZCB0byBvdXRlcm1vc3QgPHN2Zz4gZWxlbWVudHMgKHdpZHRoL2hlaWdodC9ib3JkZXIvcGFkZGlu
Zy4uLikKLS8vIG5lZWQgdG8gcmVzcGVjdCB0aGUgc2NhbGluZy4gUmVuZGVyQm94ICh0aGUgcGFy
ZW50IGNsYXNzIG9mIFJlbmRlclNWR1Jvb3QpIGdyYWJzIHZhbHVlcyBsaWtlCi0vLyB3aWR0aC9o
ZWlnaHQvYm9yZGVyL3BhZGRpbmcvLi4uIGZyb20gdGhlIFJlbmRlclN0eWxlIC0+IGZvciBTVkcg
dGhlc2UgdmFsdWVzIHdvdWxkIG5ldmVyIHNjYWxlLAotLy8gaWYgd2UnZCBwYXNzIGEgMS4wIHpv
b20gZmFjdG9yIGV2ZXJ5aHdlcmUuIFNvIHdlIG9ubHkgcGFzcyBhIHpvb20gZmFjdG9yIG9mIDEu
MCBmb3Igc3BlY2lmaWMKLS8vIHByb3BlcnRpZXMgdGhhdCBhcmUgTk9UIGFsbG93ZWQgdG8gc2Nh
bGUgd2l0aGluIGEgem9vbWVkIFNWRyBkb2N1bWVudCAobGV0dGVyL3dvcmQtc3BhY2luZy9mb250
LXNpemUpLgotYm9vbCBTdHlsZVJlc29sdmVyOjp1c2VTVkdab29tUnVsZXMoKQotewotICAgIHJl
dHVybiBtX3N0YXRlLmVsZW1lbnQoKSAmJiBtX3N0YXRlLmVsZW1lbnQoKS0+aXNTVkdFbGVtZW50
KCk7Ci19Ci0KLXN0YXRpYyBib29sIGNyZWF0ZUdyaWRUcmFja0JyZWFkdGgoQ1NTUHJpbWl0aXZl
VmFsdWUqIHByaW1pdGl2ZVZhbHVlLCBjb25zdCBTdHlsZVJlc29sdmVyOjpTdGF0ZSYgc3RhdGUs
IExlbmd0aCYgd29ya2luZ0xlbmd0aCkKLXsKLSAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCkgPT0gQ1NTVmFsdWVXZWJraXRNaW5Db250ZW50KSB7Ci0gICAgICAgIHdvcmtpbmdMZW5n
dGggPSBMZW5ndGgoTWluQ29udGVudCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQot
ICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZVdlYmtpdE1heENv
bnRlbnQpIHsKLSAgICAgICAgd29ya2luZ0xlbmd0aCA9IExlbmd0aChNYXhDb250ZW50KTsKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgd29ya2luZ0xlbmd0aCA9IHByaW1pdGl2
ZVZhbHVlLT5jb252ZXJ0VG9MZW5ndGg8Rml4ZWRJbnRlZ2VyQ29udmVyc2lvbiB8IFBlcmNlbnRD
b252ZXJzaW9uIHwgVmlld3BvcnRQZXJjZW50YWdlQ29udmVyc2lvbiB8IEF1dG9Db252ZXJzaW9u
PihzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCksIHN0YXRlLnN0eWxlKCkt
PmVmZmVjdGl2ZVpvb20oKSk7Ci0gICAgaWYgKHdvcmtpbmdMZW5ndGguaXNVbmRlZmluZWQoKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc0xlbmd0
aCgpKQotICAgICAgICB3b3JraW5nTGVuZ3RoLnNldFF1aXJrKHByaW1pdGl2ZVZhbHVlLT5pc1F1
aXJrVmFsdWUoKSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgY3JlYXRl
R3JpZFRyYWNrTWluTWF4KENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSwgY29uc3Qg
U3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlLCBHcmlkVHJhY2tTaXplJiB0cmFja1NpemUpCi17
Ci0gICAgUGFpciogbWluTWF4VHJhY2tCcmVhZHRoID0gcHJpbWl0aXZlVmFsdWUtPmdldFBhaXJW
YWx1ZSgpOwotICAgIGlmICghbWluTWF4VHJhY2tCcmVhZHRoKSB7Ci0gICAgICAgIExlbmd0aCB3
b3JraW5nTGVuZ3RoOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgocHJpbWl0
aXZlVmFsdWUsIHN0YXRlLCB3b3JraW5nTGVuZ3RoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICB0cmFja1NpemUuc2V0TGVuZ3RoKHdvcmtpbmdMZW5ndGgpOwotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBMZW5ndGggbWluVHJhY2tCcmVhZHRoOwotICAg
IExlbmd0aCBtYXhUcmFja0JyZWFkdGg7Ci0gICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tCcmVhZHRo
KG1pbk1heFRyYWNrQnJlYWR0aC0+Zmlyc3QoKSwgc3RhdGUsIG1pblRyYWNrQnJlYWR0aCkgfHwg
IWNyZWF0ZUdyaWRUcmFja0JyZWFkdGgobWluTWF4VHJhY2tCcmVhZHRoLT5zZWNvbmQoKSwgc3Rh
dGUsIG1heFRyYWNrQnJlYWR0aCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHRyYWNr
U2l6ZS5zZXRNaW5NYXgobWluVHJhY2tCcmVhZHRoLCBtYXhUcmFja0JyZWFkdGgpOwotICAgIHJl
dHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBjcmVhdGVHcmlkVHJhY2tHcm91cChDU1NWYWx1
ZSogdmFsdWUsIGNvbnN0IFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgVmVjdG9yPEdyaWRU
cmFja1NpemU+JiB0cmFja1NpemVzKQotewotICAgIGlmICghdmFsdWUtPmlzVmFsdWVMaXN0KCkp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3Ig
aSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgQ1NTVmFsdWUq
IGN1cnJWYWx1ZSA9IGkudmFsdWUoKTsKLSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzUHJpbWl0
aXZlVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBHcmlkVHJh
Y2tTaXplIHRyYWNrU2l6ZTsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tNaW5NYXgoc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihjdXJyVmFsdWUpLCBzdGF0ZSwgdHJhY2tTaXpl
KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB0cmFja1NpemVzLmFwcGVu
ZCh0cmFja1NpemUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wg
Y3JlYXRlR3JpZFRyYWNrTGlzdChDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxHcmlkVHJhY2tTaXpl
PiYgdHJhY2tTaXplcywgY29uc3QgU3R5bGVSZXNvbHZlcjo6U3RhdGUmIHN0YXRlKQotewotICAg
IC8vIEhhbmRsZSAnbm9uZScuCi0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsK
LSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0
ZUdyaWRUcmFja0dyb3VwKHZhbHVlLCBzdGF0ZSwgdHJhY2tTaXplcyk7Ci19Ci0KLQotc3RhdGlj
IGJvb2wgY3JlYXRlR3JpZFBvc2l0aW9uKENTU1ZhbHVlKiB2YWx1ZSwgR3JpZFBvc2l0aW9uJiBw
b3NpdGlvbikKLXsKLSAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IGFjY2VwdDogPGludGVnZXI+IHwg
J2F1dG8nCi0gICAgaWYgKCF2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBzdGF0
aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHZhbHVlKTsKLSAgICBpZiAocHJpbWl0aXZlVmFs
dWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVBdXRvKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQot
ICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHByaW1pdGl2ZVZhbHVlLT5pc051
bWJlcigpKTsKLSAgICBwb3NpdGlvbi5zZXRJbnRlZ2VyUG9zaXRpb24ocHJpbWl0aXZlVmFsdWUt
PmdldEludFZhbHVlKCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0jaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCi1zdGF0aWMgYm9vbCBoYXNWYXJpYWJsZVJlZmVyZW5jZShDU1NWYWx1ZSogdmFs
dWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZS0+aGFzVmFyaWFi
bGVSZWZlcmVuY2UoKTsKLSAgICB9Ci0KLSAgICBpZiAodmFsdWUtPmlzQ2FsY3VsYXRpb25WYWx1
ZSgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1NTQ2FsY1ZhbHVlKj4odmFsdWUpLT5o
YXNWYXJpYWJsZVJlZmVyZW5jZSgpOwotCi0gICAgaWYgKHZhbHVlLT5pc1JlZmxlY3RWYWx1ZSgp
KSB7Ci0gICAgICAgIENTU1JlZmxlY3RWYWx1ZSogcmVmbGVjdFZhbHVlID0gc3RhdGljX2Nhc3Q8
Q1NTUmVmbGVjdFZhbHVlKj4odmFsdWUpOwotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogZGly
ZWN0aW9uID0gcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKTsKLSAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIG9mZnNldCA9IHJlZmxlY3RWYWx1ZS0+b2Zmc2V0KCk7Ci0gICAgICAgIENTU1ZhbHVl
KiBtYXNrID0gcmVmbGVjdFZhbHVlLT5tYXNrKCk7Ci0gICAgICAgIHJldHVybiAoZGlyZWN0aW9u
ICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKGRpcmVjdGlvbikpIHx8IChvZmZzZXQgJiYgaGFzVmFy
aWFibGVSZWZlcmVuY2Uob2Zmc2V0KSkgfHwgKG1hc2sgJiYgaGFzVmFyaWFibGVSZWZlcmVuY2Uo
bWFzaykpOwotICAgIH0KLQotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVl
OyBpLmhhc01vcmUoKTsgaS5hZHZhbmNlKCkpIHsKLSAgICAgICAgaWYgKGhhc1ZhcmlhYmxlUmVm
ZXJlbmNlKGkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVzb2x2ZVZhcmlhYmxl
cyhDU1NQcm9wZXJ0eUlEIGlkLCBDU1NWYWx1ZSogdmFsdWUsIFZlY3RvcjxzdGQ6OnBhaXI8Q1NT
UHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKQotewotICAgIHN0ZDo6cGFp
cjxDU1NQcm9wZXJ0eUlELCBTdHJpbmc+IGV4cHJlc3Npb24oaWQsIHZhbHVlLT5zZXJpYWxpemVS
ZXNvbHZpbmdWYXJpYWJsZXMoKm1fc3RhdGUuc3R5bGUoKS0+dmFyaWFibGVzKCkpKTsKLQotICAg
IGlmIChrbm93bkV4cHJlc3Npb25zLmNvbnRhaW5zKGV4cHJlc3Npb24pKQotICAgICAgICByZXR1
cm47IC8vIGN5Y2xlIGRldGVjdGVkLgotCi0gICAga25vd25FeHByZXNzaW9ucy5hcHBlbmQoZXhw
cmVzc2lvbik7Ci0KLSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgZmFzdGVyIG5vdCB0byByZS1w
YXJzZSBmcm9tIHN0cmluZ3MsIGJ1dCBmb3Igbm93IENTUyBwcm9wZXJ0eSB2YWxpZGF0aW9uIGxp
dmVzIGluc2lkZSB0aGUgcGFyc2VyIHNvIHdlIGRvIGl0IHRoZXJlLgotICAgIFJlZlB0cjxTdHls
ZVByb3BlcnR5U2V0PiByZXN1bHRTZXQgPSBTdHlsZVByb3BlcnR5U2V0OjpjcmVhdGUoKTsKLSAg
ICBpZiAoIUNTU1BhcnNlcjo6cGFyc2VWYWx1ZShyZXN1bHRTZXQuZ2V0KCksIGlkLCBleHByZXNz
aW9uLnNlY29uZCwgZmFsc2UsIGRvY3VtZW50KCkpKQotICAgICAgICByZXR1cm47IC8vIGV4cHJl
c3Npb24gZmFpbGVkIHRvIHBhcnNlLgotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJl
c3VsdFNldC0+cHJvcGVydHlDb3VudCgpOyBpKyspIHsKLSAgICAgICAgU3R5bGVQcm9wZXJ0eVNl
dDo6UHJvcGVydHlSZWZlcmVuY2UgcHJvcGVydHkgPSByZXN1bHRTZXQtPnByb3BlcnR5QXQoaSk7
Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5pZCgpICE9IENTU1Byb3BlcnR5VmFyaWFibGUgJiYgaGFz
VmFyaWFibGVSZWZlcmVuY2UocHJvcGVydHkudmFsdWUoKSkpCi0gICAgICAgICAgICByZXNvbHZl
VmFyaWFibGVzKHByb3BlcnR5LmlkKCksIHByb3BlcnR5LnZhbHVlKCksIGtub3duRXhwcmVzc2lv
bnMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcHBseVByb3BlcnR5KHByb3BlcnR5Lmlk
KCksIHByb3BlcnR5LnZhbHVlKCkpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIFN0eWxlUmVz
b2x2ZXI6OmFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlJRCBpZCwgQ1NTVmFsdWUqIHZhbHVlKQot
ewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIGlmIChpZCAhPSBDU1NQcm9wZXJ0eVZh
cmlhYmxlICYmIGhhc1ZhcmlhYmxlUmVmZXJlbmNlKHZhbHVlKSkgewotICAgICAgICBWZWN0b3I8
c3RkOjpwYWlyPENTU1Byb3BlcnR5SUQsIFN0cmluZz4gPiBrbm93bkV4cHJlc3Npb25zOwotICAg
ICAgICByZXNvbHZlVmFyaWFibGVzKGlkLCB2YWx1ZSwga25vd25FeHByZXNzaW9ucyk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIENTUyB2YXJpYWJsZXMgZG9uJ3Qg
cmVzb2x2ZSBzaG9ydGhhbmRzIGF0IHBhcnNpbmcgdGltZSwgc28gdGhpcyBzaG91bGQgYmUgKmFm
dGVyKiBoYW5kbGluZyB2YXJpYWJsZXMuCi0gICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghaXNFeHBh
bmRlZFNob3J0aGFuZChpZCksICJTaG9ydGhhbmQgcHJvcGVydHkgaWQgPSAlZCB3YXNuJ3QgZXhw
YW5kZWQgYXQgcGFyc2luZyB0aW1lIiwgaWQpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLSAgICBib29sIGlzSW5oZXJpdCA9IHN0YXRlLnBhcmVudE5vZGUoKSAmJiB2YWx1ZS0+aXNJ
bmhlcml0ZWRWYWx1ZSgpOwotICAgIGJvb2wgaXNJbml0aWFsID0gdmFsdWUtPmlzSW5pdGlhbFZh
bHVlKCkgfHwgKCFzdGF0ZS5wYXJlbnROb2RlKCkgJiYgdmFsdWUtPmlzSW5oZXJpdGVkVmFsdWUo
KSk7Ci0KLSAgICBBU1NFUlQoIWlzSW5oZXJpdCB8fCAhaXNJbml0aWFsKTsgLy8gaXNJbmhlcml0
IC0+ICFpc0luaXRpYWwgJiYgaXNJbml0aWFsIC0+ICFpc0luaGVyaXQKLSAgICBBU1NFUlQoIWlz
SW5oZXJpdCB8fCAoc3RhdGUucGFyZW50Tm9kZSgpICYmIHN0YXRlLnBhcmVudFN0eWxlKCkpKTsg
Ly8gaXNJbmhlcml0IC0+IChzdGF0ZS5wYXJlbnROb2RlKCkgJiYgc3RhdGUucGFyZW50U3R5bGUo
KSkKLQotICAgIGlmICghc3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgJiYgKCFz
dGF0ZS5hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkgfHwgIWlzVmFsaWRWaXNpdGVk
TGlua1Byb3BlcnR5KGlkKSkpIHsKLSAgICAgICAgLy8gTGltaXQgdGhlIHByb3BlcnRpZXMgdGhh
dCBjYW4gYmUgYXBwbGllZCB0byBvbmx5IHRoZSBvbmVzIGhvbm9yZWQgYnkgOnZpc2l0ZWQuCi0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoaXNJbmhlcml0ICYmICFzdGF0ZS5wYXJl
bnRTdHlsZSgpLT5oYXNFeHBsaWNpdGx5SW5oZXJpdGVkUHJvcGVydGllcygpICYmICFDU1NQcm9w
ZXJ0eTo6aXNJbmhlcml0ZWRQcm9wZXJ0eShpZCkpCi0gICAgICAgIHN0YXRlLnBhcmVudFN0eWxl
KCktPnNldEhhc0V4cGxpY2l0bHlJbmhlcml0ZWRQcm9wZXJ0aWVzKCk7Ci0KLSNpZiBFTkFCTEUo
Q1NTX1ZBUklBQkxFUykKLSAgICBpZiAoaWQgPT0gQ1NTUHJvcGVydHlWYXJpYWJsZSkgewotICAg
ICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTih2YWx1ZS0+aXNWYXJpYWJsZVZh
bHVlKCkpOwotICAgICAgICBDU1NWYXJpYWJsZVZhbHVlKiB2YXJpYWJsZSA9IHN0YXRpY19jYXN0
PENTU1ZhcmlhYmxlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIEFTU0VSVCghdmFyaWFibGUtPm5h
bWUoKS5pc0VtcHR5KCkpOwotICAgICAgICBBU1NFUlQoIXZhcmlhYmxlLT52YWx1ZSgpLmlzRW1w
dHkoKSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFZhcmlhYmxlKHZhcmlhYmxlLT5uYW1l
KCksIHZhcmlhYmxlLT52YWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgot
Ci0gICAgLy8gQ2hlY2sgbG9va3VwIHRhYmxlIGZvciBpbXBsZW1lbnRhdGlvbnMgYW5kIHVzZSB3
aGVuIGF2YWlsYWJsZS4KLSAgICBjb25zdCBQcm9wZXJ0eUhhbmRsZXImIGhhbmRsZXIgPSBtX3N0
eWxlQnVpbGRlci5wcm9wZXJ0eUhhbmRsZXIoaWQpOwotICAgIGlmIChoYW5kbGVyLmlzVmFsaWQo
KSkgewotICAgICAgICBpZiAoaXNJbmhlcml0KQotICAgICAgICAgICAgaGFuZGxlci5hcHBseUlu
aGVyaXRWYWx1ZShpZCwgdGhpcyk7Ci0gICAgICAgIGVsc2UgaWYgKGlzSW5pdGlhbCkKLSAgICAg
ICAgICAgIGhhbmRsZXIuYXBwbHlJbml0aWFsVmFsdWUoaWQsIHRoaXMpOwotICAgICAgICBlbHNl
Ci0gICAgICAgICAgICBoYW5kbGVyLmFwcGx5VmFsdWUoaWQsIHRoaXMsIHZhbHVlKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLQotICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1
ZSA9IHZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkgPyBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVW
YWx1ZSo+KHZhbHVlKSA6IDA7Ci0KLSAgICBmbG9hdCB6b29tRmFjdG9yID0gc3RhdGUuc3R5bGUo
KS0+ZWZmZWN0aXZlWm9vbSgpOwotCi0gICAgLy8gV2hhdCBmb2xsb3dzIGlzIGEgbGlzdCB0aGF0
IG1hcHMgdGhlIENTUyBwcm9wZXJ0aWVzIGludG8gdGhlaXIgY29ycmVzcG9uZGluZyBmcm9udC1l
bmQKLSAgICAvLyBSZW5kZXJTdHlsZSB2YWx1ZXMuCi0gICAgc3dpdGNoIChpZCkgewotICAgIC8v
IGxpc3RzCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUNvbnRlbnQ6Ci0gICAgICAgIC8vIGxpc3Qgb2Yg
c3RyaW5nLCB1cmksIGNvdW50ZXIsIGF0dHIsIGkKLSAgICAgICAgewotICAgICAgICAgICAgLy8g
RklYTUU6IEluIENTUzMsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gaW5oZXJpdCBjb250ZW50LiBJ
biBDU1MyIGl0IGlzIG5vdC4gVGhpcwotICAgICAgICAgICAgLy8gbm90ZSBpcyBhIHJlbWluZGVy
IHRoYXQgZXZlbnR1YWxseSAiaW5oZXJpdCIgbmVlZHMgdG8gYmUgc3VwcG9ydGVkLgotCi0gICAg
ICAgICAgICBpZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+
Y2xlYXJDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICBpZiAoIXZhbHVlLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAgICAgICAg
IHJldHVybjsKLQotICAgICAgICAgICAgYm9vbCBkaWRTZXQgPSBmYWxzZTsKLSAgICAgICAgICAg
IGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZh
bmNlKCkpIHsKLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSogaXRlbSA9IGkudmFsdWUoKTsKLSAg
ICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZUdlbmVyYXRvclZhbHVlKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmlzR3JhZGllbnRWYWx1ZSgpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChTdHlsZUdlbmVyYXRlZEltYWdl
OjpjcmVhdGUoc3RhdGljX2Nhc3Q8Q1NTR3JhZGllbnRWYWx1ZSo+KGl0ZW0pLT5ncmFkaWVudFdp
dGhTdHlsZXNSZXNvbHZlZCh0aGlzKS5nZXQoKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRl
bnQoU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHN0YXRpY19jYXN0PENTU0ltYWdlR2VuZXJh
dG9yVmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9
IHRydWU7Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0gICAgICAgICAgICAgICAgfSBlbHNl
IGlmIChpdGVtLT5pc0ltYWdlU2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRDb250ZW50KHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUNv
bnRlbnQsIHN0YXRpY19jYXN0PENTU0ltYWdlU2V0VmFsdWUqPihpdGVtKSksIGRpZFNldCk7Ci0g
ICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0jZW5kaWYKLSAgICAgICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXRlbS0+aXNJbWFnZVZhbHVlKCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjYWNoZWRPclBlbmRpbmdG
cm9tVmFsdWUoQ1NTUHJvcGVydHlDb250ZW50LCBzdGF0aWNfY2FzdDxDU1NJbWFnZVZhbHVlKj4o
aXRlbSkpLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgICAgICBpZiAoIWl0ZW0tPmlzUHJpbWl0aXZlVmFsdWUoKSkKLSAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogY29udGVu
dFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsKLQotICAgICAg
ICAgICAgICAgIGlmIChjb250ZW50VmFsdWUtPmlzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0Q29udGVudChjb250ZW50VmFsdWUtPmdldFN0cmluZ1Zh
bHVlKCkuaW1wbCgpLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVl
OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFZhbHVlLT5pc0F0dHIoKSkgewot
ICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogQ2FuIGEgbmFtZXNwYWNlIGJlIHNwZWNpZmll
ZCBmb3IgYW4gYXR0cihmb28pPwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc3R5bGUo
KS0+c3R5bGVUeXBlKCkgPT0gTk9QU0VVRE8pCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0
ZS5zdHlsZSgpLT5zZXRVbmlxdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGUucGFyZW50U3R5bGUoKS0+c2V0VW5pcXVlKCk7Ci0gICAg
ICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgYXR0cihudWxsQXRvbSwgY29udGVudFZhbHVl
LT5nZXRTdHJpbmdWYWx1ZSgpLmltcGwoKSwgbnVsbEF0b20pOwotICAgICAgICAgICAgICAgICAg
ICBjb25zdCBBdG9taWNTdHJpbmcmIHZhbHVlID0gc3RhdGUuZWxlbWVudCgpLT5nZXRBdHRyaWJ1
dGUoYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQo
dmFsdWUuaXNOdWxsKCkgPyBlbXB0eUF0b20gOiB2YWx1ZS5pbXBsKCksIGRpZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJl
Z2lzdGVyIHRoZSBmYWN0IHRoYXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBhZmZlY3RzIHRoZSBzdHls
ZQotICAgICAgICAgICAgICAgICAgICBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJblJ1bGVz
LmFkZChhdHRyLmxvY2FsTmFtZSgpLmltcGwoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlm
IChjb250ZW50VmFsdWUtPmlzQ291bnRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvdW50
ZXIqIGNvdW50ZXJWYWx1ZSA9IGNvbnRlbnRWYWx1ZS0+Z2V0Q291bnRlclZhbHVlKCk7Ci0gICAg
ICAgICAgICAgICAgICAgIEVMaXN0U3R5bGVUeXBlIGxpc3RTdHlsZVR5cGUgPSBOb25lTGlzdFN0
eWxlOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdFN0eWxlSWRlbnQgPSBjb3VudGVyVmFs
dWUtPmxpc3RTdHlsZUlkZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0U3R5bGVJ
ZGVudCAhPSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0U3R5bGVU
eXBlID0gc3RhdGljX2Nhc3Q8RUxpc3RTdHlsZVR5cGU+KGxpc3RTdHlsZUlkZW50IC0gQ1NTVmFs
dWVEaXNjKTsKLSAgICAgICAgICAgICAgICAgICAgT3duUHRyPENvdW50ZXJDb250ZW50PiBjb3Vu
dGVyID0gYWRvcHRQdHIobmV3IENvdW50ZXJDb250ZW50KGNvdW50ZXJWYWx1ZS0+aWRlbnRpZmll
cigpLCBsaXN0U3R5bGVUeXBlLCBjb3VudGVyVmFsdWUtPnNlcGFyYXRvcigpKSk7Ci0gICAgICAg
ICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoY291bnRlci5yZWxlYXNlKCks
IGRpZFNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7Ci0gICAgICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VmFsdWUt
PmdldElkZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZU9wZW5RdW90
ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldENvbnRlbnQoT1BF
Tl9RVU9URSwgZGlkU2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNldCA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZUNsb3NlUXVvdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRDb250ZW50KENMT1NFX1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAg
ICAgICAgZGlkU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlTm9PcGVuUXVvdGU6Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250ZW50KE5PX09QRU5fUVVPVEUsIGRpZFNl
dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWRTZXQgPSB0cnVlOwotICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVOb0Ns
b3NlUXVvdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRDb250
ZW50KE5PX0NMT1NFX1FVT1RFLCBkaWRTZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlk
U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIGFuZCBu
b25lIGRvIG5vdCBoYXZlIGFueSBlZmZlY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICB7IH0K
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGlmICghZGlkU2V0KQotICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCkt
PmNsZWFyQ29udGVudCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVF1b3RlczoKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0UXVvdGVzKHN0YXRlLnBhcmVudFN0eWxlKCktPnF1b3Rlcygp
KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNJbml0aWFs
KSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRRdW90ZXMoMCk7Ci0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlLT5pc1ZhbHVlTGlzdCgpKSB7
Ci0gICAgICAgICAgICBDU1NWYWx1ZUxpc3QqIGxpc3QgPSBzdGF0aWNfY2FzdDxDU1NWYWx1ZUxp
c3QqPih2YWx1ZSk7Ci0gICAgICAgICAgICBSZWZQdHI8UXVvdGVzRGF0YT4gcXVvdGVzID0gUXVv
dGVzRGF0YTo6Y3JlYXRlKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxp
c3QtPmxlbmd0aCgpOyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICBDU1NWYWx1ZSogZmlyc3Qg
PSBsaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwotICAgICAgICAgICAgICAgIC8vIGl0
ZW0oKSByZXR1cm5zIG51bGwgaWYgb3V0IG9mIGJvdW5kcyBzbyB0aGlzIGlzIHNhZmUuCi0gICAg
ICAgICAgICAgICAgQ1NTVmFsdWUqIHNlY29uZCA9IGxpc3QtPml0ZW0oaSArIDEpOwotICAgICAg
ICAgICAgICAgIGlmICghc2Vjb25kKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihmaXJzdC0+aXNQ
cmltaXRpdmVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9J
TVBMSUNBVElPTihzZWNvbmQtPmlzUHJpbWl0aXZlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAg
U3RyaW5nIHN0YXJ0UXVvdGUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGZpcnN0
KS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW5kUXVvdGUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHNlY29uZCktPmdldFN0cmluZ1ZhbHVlKCk7
Ci0gICAgICAgICAgICAgICAgcXVvdGVzLT5hZGRQYWlyKHN0ZDo6bWFrZV9wYWlyKHN0YXJ0UXVv
dGUsIGVuZFF1b3RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgp
LT5zZXRRdW90ZXMocXVvdGVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg
ICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1
ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUpCi0gICAgICAgICAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0UXVvdGVzKFF1b3Rlc0RhdGE6OmNyZWF0ZSgpKTsKLSAgICAgICAgfQotICAgICAg
ICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRGYW1pbHk6IHsKLSAgICAgICAgLy8g
bGlzdCBvZiBzdHJpbmdzIGFuZCBpZHMKLSAgICAgICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAg
ICAgICAgRm9udERlc2NyaXB0aW9uIHBhcmVudEZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnBhcmVu
dFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgRm9udERlc2NyaXB0aW9u
IGZvbnREZXNjcmlwdGlvbiA9IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAg
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkocGFyZW50Rm9udERlc2Ny
aXB0aW9uLmdlbmVyaWNGYW1pbHkoKSk7Ci0gICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0
RmFtaWx5KHBhcmVudEZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpKTsKLSAgICAgICAgICAg
IGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmllZEZvbnQocGFyZW50Rm9udERlc2NyaXB0aW9u
LmlzU3BlY2lmaWVkRm9udCgpKTsKLSAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihmb250
RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKGlzSW5pdGlhbCkgewotICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGluaXRpYWxEZXNj
ID0gRm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBGb250RGVzY3JpcHRpb24gZm9udERl
c2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIGFkanVzdCB0aGUgc2l6ZSB0byBhY2NvdW50IGZvciB0aGUgZ2VuZXJp
YyBmYW1pbHkgY2hhbmdlIGZyb20gbW9ub3NwYWNlCi0gICAgICAgICAgICAvLyB0byBub24tbW9u
b3NwYWNlLgotICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5rZXl3b3JkU2l6ZSgpICYm
IGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCkpCi0gICAgICAgICAgICAgICAg
c2V0Rm9udFNpemUoZm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQo
KSwgQ1NTVmFsdWVYeFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgLSAxLCBm
YWxzZSkpOwotICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoaW5p
dGlhbERlc2MuZ2VuZXJpY0ZhbWlseSgpKTsKLSAgICAgICAgICAgIGlmICghaW5pdGlhbERlc2Mu
Zmlyc3RGYW1pbHkoKS5mYW1pbHlJc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZm9udERlc2Ny
aXB0aW9uLnNldEZhbWlseShpbml0aWFsRGVzYy5maXJzdEZhbWlseSgpKTsKLSAgICAgICAgICAg
IHNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9
IHN0YXRlLnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICBGb250RmFtaWx5JiBm
aXJzdEZhbWlseSA9IGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpOwotICAgICAgICBGb250
RmFtaWx5KiBjdXJyRmFtaWx5ID0gMDsKLQotICAgICAgICAvLyBCZWZvcmUgbWFwcGluZyBpbiBh
IG5ldyBmb250LWZhbWlseSBwcm9wZXJ0eSwgd2Ugc2hvdWxkIHJlc2V0IHRoZSBnZW5lcmljIGZh
bWlseS4KLSAgICAgICAgYm9vbCBvbGRGYW1pbHlVc2VkRml4ZWREZWZhdWx0U2l6ZSA9IGZvbnRE
ZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlv
bi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6Tm9GYW1pbHkpOwotCi0gICAgICAg
IGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9IHZhbHVlOyBpLmhhc01vcmUoKTsgaS5hZHZh
bmNlKCkpIHsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBpdGVtID0gaS52YWx1ZSgpOwotICAgICAg
ICAgICAgaWYgKCFpdGVtLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogY29udGVudFZhbHVlID0gc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihpdGVtKTsKLSAgICAgICAgICAgIEF0b21pY1N0
cmluZyBmYWNlOwotICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0
aW5ncygpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRWYWx1ZS0+aXNTdHJpbmcoKSkKLSAgICAg
ICAgICAgICAgICBmYWNlID0gY29udGVudFZhbHVlLT5nZXRTdHJpbmdWYWx1ZSgpOwotICAgICAg
ICAgICAgZWxzZSBpZiAoc2V0dGluZ3MpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRl
bnRWYWx1ZS0+Z2V0SWRlbnQoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVXZWJr
aXRCb2R5OgotICAgICAgICAgICAgICAgICAgICBmYWNlID0gc2V0dGluZ3MtPnN0YW5kYXJkRm9u
dEZhbWlseSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBj
YXNlIENTU1ZhbHVlU2VyaWY6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBzZXJpZkZhbWls
eTsKLSAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHko
Rm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWlseSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFsdWVTYW5zU2VyaWY6Ci0gICAgICAgICAgICAg
ICAgICAgIGZhY2UgPSBzYW5zU2VyaWZGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnRE
ZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6U2Fuc1NlcmlmRmFt
aWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZUN1cnNpdmU6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBjdXJzaXZlRmFtaWx5
OwotICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShG
b250RGVzY3JpcHRpb246OkN1cnNpdmVGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICBjYXNlIENTU1ZhbHVlRmFudGFzeToKLSAgICAgICAgICAgICAg
ICAgICAgZmFjZSA9IGZhbnRhc3lGYW1pbHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZvbnREZXNjcmlwdGlvbjo6RmFudGFzeUZhbWlseSk7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1NTVmFs
dWVNb25vc3BhY2U6Ci0gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBtb25vc3BhY2VGYW1pbHk7
Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRHZW5lcmljRmFtaWx5KEZv
bnREZXNjcmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdFBpY3RvZ3JhcGg6Ci0gICAg
ICAgICAgICAgICAgICAgIGZhY2UgPSBwaWN0b2dyYXBoRmFtaWx5OwotICAgICAgICAgICAgICAg
ICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlBp
Y3RvZ3JhcGhGYW1pbHkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmFjZS5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1cnJGYW1pbHkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gRmlsbGluZyBpbiB0aGUgZmlyc3QgZmFtaWx5LgotICAgICAgICAgICAgICAgICAgICBm
aXJzdEZhbWlseS5zZXRGYW1pbHkoZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0RmFt
aWx5LmFwcGVuZEZhbWlseSgwKTsgLy8gUmVtb3ZlIGFueSBpbmhlcml0ZWQgZmFtaWx5LWZhbGxi
YWNrIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIGN1cnJGYW1pbHkgPSAmZmlyc3RGYW1pbHk7
Ci0gICAgICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRJc1NwZWNpZmllZEZvbnQo
Zm9udERlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSA9PSBGb250RGVzY3JpcHRpb246Ok5vRmFt
aWx5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBSZWZQ
dHI8U2hhcmVkRm9udEZhbWlseT4gbmV3RmFtaWx5ID0gU2hhcmVkRm9udEZhbWlseTo6Y3JlYXRl
KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0ZhbWlseS0+c2V0RmFtaWx5KGZhY2UpOwotICAg
ICAgICAgICAgICAgICAgICBjdXJyRmFtaWx5LT5hcHBlbmRGYW1pbHkobmV3RmFtaWx5KTsKLSAg
ICAgICAgICAgICAgICAgICAgY3VyckZhbWlseSA9IG5ld0ZhbWlseS5nZXQoKTsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4n
dCBjYWxsIHVzZUZpeGVkRGVmYXVsdFNpemUoKSB1bnRpbCBhbGwgbmV3IGZvbnQgZmFtaWxpZXMg
aGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgIC8vIElmIGN1cnJGYW1pbHkgaXMgbm9uLXplcm8gdGhl
biB3ZSBzZXQgYXQgbGVhc3Qgb25lIGZhbWlseSBvbiB0aGlzIGRlc2NyaXB0aW9uLgotICAgICAg
ICBpZiAoY3VyckZhbWlseSkgewotICAgICAgICAgICAgaWYgKGZvbnREZXNjcmlwdGlvbi5rZXl3
b3JkU2l6ZSgpICYmIGZvbnREZXNjcmlwdGlvbi51c2VGaXhlZERlZmF1bHRTaXplKCkgIT0gb2xk
RmFtaWx5VXNlZEZpeGVkRGVmYXVsdFNpemUpCi0gICAgICAgICAgICAgICAgc2V0Rm9udFNpemUo
Zm9udERlc2NyaXB0aW9uLCBmb250U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVY
eFNtYWxsICsgZm9udERlc2NyaXB0aW9uLmtleXdvcmRTaXplKCkgLSAxLCAhb2xkRmFtaWx5VXNl
ZEZpeGVkRGVmYXVsdFNpemUpKTsKLQotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAv
LyBTaG9ydGhhbmQgcHJvcGVydGllcy4KLSAgICBjYXNlIENTU1Byb3BlcnR5Rm9udDoKLSAgICAg
ICAgaWYgKGlzSW5oZXJpdCkgewotICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNj
cmlwdGlvbiA9IHN0YXRlLnBhcmVudFN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOwotICAgICAg
ICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TGluZUhlaWdodChzdGF0ZS5wYXJlbnRTdHlsZSgpLT5z
cGVjaWZpZWRMaW5lSGVpZ2h0KCkpOwotICAgICAgICAgICAgc3RhdGUuc2V0TGluZUhlaWdodFZh
bHVlKDApOwotICAgICAgICAgICAgc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7
Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNJbml0aWFsKSB7Ci0gICAgICAgICAgICBTZXR0aW5ncyog
c2V0dGluZ3MgPSBkb2N1bWVudFNldHRpbmdzKCk7Ci0gICAgICAgICAgICBBU1NFUlQoc2V0dGlu
Z3MpOyAvLyBJZiB3ZSdyZSBkb2luZyBzdHlsZSByZXNvbHV0aW9uLCB0aGlzIGRvY3VtZW50IHNo
b3VsZCBhbHdheXMgYmUgaW4gYSBmcmFtZSBhbmQgdGh1cyBoYXZlIHNldHRpbmdzCi0gICAgICAg
ICAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAg
IGluaXRpYWxpemVGb250U3R5bGUoc2V0dGluZ3MpOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1p
dGl2ZVZhbHVlKSB7Ci0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRMaW5lSGVpZ2h0KFJl
bmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKLSAgICAgICAgICAgIHN0YXRlLnNldExp
bmVIZWlnaHRWYWx1ZSgwKTsKLQotICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNj
cmlwdGlvbjsKLSAgICAgICAgICAgIFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+c3lzdGVt
Rm9udChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSwgZm9udERlc2NyaXB0aW9uKTsKLQotICAg
ICAgICAgICAgLy8gRG91YmxlLWNoZWNrIGFuZCBzZWUgaWYgdGhlIHRoZW1lIGRpZCBhbnl0aGlu
Zy4gSWYgbm90LCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhlIGZvbnQuCi0gICAgICAgICAgICBp
ZiAoZm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCkpIHsKLSAgICAgICAgICAgICAgICAv
LyBNYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBtb2RlIGFuZCBwcmludGVyIGZvbnQgc2V0dGluZ3Mg
YXJlIHVwZGF0ZWQuCi0gICAgICAgICAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1l
bnRTZXR0aW5ncygpOwotICAgICAgICAgICAgICAgIEFTU0VSVChzZXR0aW5ncyk7IC8vIElmIHdl
J3JlIGRvaW5nIHN0eWxlIHJlc29sdXRpb24sIHRoaXMgZG9jdW1lbnQgc2hvdWxkIGFsd2F5cyBi
ZSBpbiBhIGZyYW1lIGFuZCB0aHVzIGhhdmUgc2V0dGluZ3MKLSAgICAgICAgICAgICAgICBpZiAo
IXNldHRpbmdzKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAg
Zm9udERlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUoc2V0dGluZ3MtPmZvbnRSZW5kZXJpbmdN
b2RlKCkpOwotICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRVc2VQcmludGVyRm9u
dChkb2N1bWVudCgpLT5wcmludGluZygpIHx8ICFzZXR0aW5ncy0+c2NyZWVuRm9udFN1YnN0aXR1
dGlvbkVuYWJsZWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdGhlIHpvb20gZmFj
dG9yLgotICAgICAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoZ2V0
Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoZG9jdW1lbnQoKSwgc3RhdGUuc3R5bGUoKSwg
Zm9udERlc2NyaXB0aW9uLmlzQWJzb2x1dGVTaXplKCksIGZvbnREZXNjcmlwdGlvbi5zcGVjaWZp
ZWRTaXplKCksIHVzZVNWR1pvb21SdWxlcygpKSk7Ci0gICAgICAgICAgICAgICAgc2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZSBpZiAodmFsdWUtPmlzRm9udFZhbHVlKCkpIHsKLSAgICAgICAgICAgIEZvbnRWYWx1ZSogZm9u
dCA9IHN0YXRpY19jYXN0PEZvbnRWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgICAgIGlmICghZm9u
dC0+c3R5bGUgfHwgIWZvbnQtPnZhcmlhbnQgfHwgIWZvbnQtPndlaWdodAotICAgICAgICAgICAg
ICAgIHx8ICFmb250LT5zaXplIHx8ICFmb250LT5saW5lSGVpZ2h0IHx8ICFmb250LT5mYW1pbHkp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQ
cm9wZXJ0eUZvbnRTdHlsZSwgZm9udC0+c3R5bGUuZ2V0KCkpOwotICAgICAgICAgICAgYXBwbHlQ
cm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRWYXJpYW50LCBmb250LT52YXJpYW50LmdldCgpKTsKLSAg
ICAgICAgICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250V2VpZ2h0LCBmb250LT53ZWln
aHQuZ2V0KCkpOwotICAgICAgICAgICAgLy8gVGhlIHByZXZpb3VzIHByb3BlcnRpZXMgY2FuIGRp
cnR5IG91ciBmb250IGJ1dCB0aGV5IGRvbid0IHRyeSB0byByZWFkIHRoZSBmb250J3MKLSAgICAg
ICAgICAgIC8vIHByb3BlcnRpZXMgYmFjaywgd2hpY2ggaXMgc2FmZS4gSG93ZXZlciBpZiBmb250
LXNpemUgaXMgdXNpbmcgdGhlICdleCcgdW5pdCwgaXQgd2lsbAotICAgICAgICAgICAgLy8gbmVl
ZCBxdWVyeSB0aGUgZGlydGllZCBmb250J3MgeC1oZWlnaHQgdG8gZ2V0IHRoZSBjb21wdXRlZCBz
aXplLiBUbyBiZSBzYWZlIGluIHRoaXMKLSAgICAgICAgICAgIC8vIGNhc2UsIGxldCdzIGp1c3Qg
dXBkYXRlIHRoZSBmb250IG5vdy4KLSAgICAgICAgICAgIHVwZGF0ZUZvbnQoKTsKLSAgICAgICAg
ICAgIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVydHlGb250U2l6ZSwgZm9udC0+c2l6ZS5nZXQoKSk7
Ci0KLSAgICAgICAgICAgIHN0YXRlLnNldExpbmVIZWlnaHRWYWx1ZShmb250LT5saW5lSGVpZ2h0
LmdldCgpKTsKLQotICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUZvbnRGYW1p
bHksIGZvbnQtPmZhbWlseS5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tn
cm91bmRQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZFJlcGVhdDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJCb3R0
b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlCb3JkZXJJbWFnZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyUmFkaXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJSaWdo
dDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5Qm9yZGVyU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRvcDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RTdHlsZToK
LSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5l
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdmVyZmxvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFk
ZGluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0QW5pbWF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRl
cjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQmVmb3JlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRCb3JkZXJFbmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
clN0YXJ0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJSYWRpdXM6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbnM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENv
bHVtblJ1bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXg6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEZsZXhGbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkQ29s
dW1uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkUm93OgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRNYXJnaW5Db2xsYXBzZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFy
cXVlZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFzazoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0TWFza1Bvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVw
ZWF0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXM6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRy
YW5zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpbjoKLSNp
ZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXA6
Ci0jZW5kaWYKLSAgICAgICAgQVNTRVJUKGlzRXhwYW5kZWRTaG9ydGhhbmQoaWQpKTsKLSAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgLy8gQ1NTMyBQ
cm9wZXJ0aWVzCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRTaGFkb3c6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eUJveFNoYWRvdzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93OiB7
Ci0gICAgICAgIGlmIChpc0luaGVyaXQpIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBDU1NQcm9w
ZXJ0eVRleHRTaGFkb3cpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnN0eWxlKCktPnNl
dFRleHRTaGFkb3coc3RhdGUucGFyZW50U3R5bGUoKS0+dGV4dFNoYWRvdygpID8gYWRvcHRQdHIo
bmV3IFNoYWRvd0RhdGEoKnN0YXRlLnBhcmVudFN0eWxlKCktPnRleHRTaGFkb3coKSkpIDogbnVs
bHB0cik7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KHN0
YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpID8gYWRvcHRQdHIobmV3IFNoYWRvd0RhdGEo
KnN0YXRlLnBhcmVudFN0eWxlKCktPmJveFNoYWRvdygpKSkgOiBudWxscHRyKTsKLSAgICAgICAg
fQotICAgICAgICBpZiAoaXNJbml0aWFsIHx8IHByaW1pdGl2ZVZhbHVlKSAvLyBpbml0aWFsIHwg
bm9uZQotICAgICAgICAgICAgcmV0dXJuIGlkID09IENTU1Byb3BlcnR5VGV4dFNoYWRvdyA/IHN0
YXRlLnN0eWxlKCktPnNldFRleHRTaGFkb3cobnVsbHB0cikgOiBzdGF0ZS5zdHlsZSgpLT5zZXRC
b3hTaGFkb3cobnVsbHB0cik7Ci0KLSAgICAgICAgaWYgKCF2YWx1ZS0+aXNWYWx1ZUxpc3QoKSkK
LSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmb3IgKENTU1ZhbHVlTGlzdEl0ZXJhdG9y
IGkgPSB2YWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgICAgICBDU1NW
YWx1ZSogY3VyclZhbHVlID0gaS52YWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFjdXJyVmFsdWUt
PmlzU2hhZG93VmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAg
IFNoYWRvd1ZhbHVlKiBpdGVtID0gc3RhdGljX2Nhc3Q8U2hhZG93VmFsdWUqPihjdXJyVmFsdWUp
OwotICAgICAgICAgICAgaW50IHggPSBpdGVtLT54LT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUu
c3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAg
ICAgIGludCB5ID0gaXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0YXRlLnN0eWxlKCksIHN0
YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBpbnQgYmx1
ciA9IGl0ZW0tPmJsdXIgPyBpdGVtLT5ibHVyLT5jb21wdXRlTGVuZ3RoPGludD4oc3RhdGUuc3R5
bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSA6IDA7Ci0gICAgICAg
ICAgICBpbnQgc3ByZWFkID0gaXRlbS0+c3ByZWFkID8gaXRlbS0+c3ByZWFkLT5jb21wdXRlTGVu
Z3RoPGludD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFj
dG9yKSA6IDA7Ci0gICAgICAgICAgICBTaGFkb3dTdHlsZSBzaGFkb3dTdHlsZSA9IGl0ZW0tPnN0
eWxlICYmIGl0ZW0tPnN0eWxlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlSW5zZXQgPyBJbnNldCA6
IE5vcm1hbDsKLSAgICAgICAgICAgIENvbG9yIGNvbG9yOwotICAgICAgICAgICAgaWYgKGl0ZW0t
PmNvbG9yKQotICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JGcm9tUHJpbWl0aXZlVmFsdWUo
aXRlbS0+Y29sb3IuZ2V0KCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuc3R5bGUoKSkK
LSAgICAgICAgICAgICAgICBjb2xvciA9IHN0YXRlLnN0eWxlKCktPmNvbG9yKCk7Ci0KLSAgICAg
ICAgICAgIE93blB0cjxTaGFkb3dEYXRhPiBzaGFkb3dEYXRhID0gYWRvcHRQdHIobmV3IFNoYWRv
d0RhdGEoSW50UG9pbnQoeCwgeSksIGJsdXIsIHNwcmVhZCwgc2hhZG93U3R5bGUsIGlkID09IENT
U1Byb3BlcnR5V2Via2l0Qm94U2hhZG93LCBjb2xvci5pc1ZhbGlkKCkgPyBjb2xvciA6IENvbG9y
Ojp0cmFuc3BhcmVudCkpOwotICAgICAgICAgICAgaWYgKGlkID09IENTU1Byb3BlcnR5VGV4dFNo
YWRvdykKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRUZXh0U2hhZG93KHNoYWRv
d0RhdGEucmVsZWFzZSgpLCBpLmluZGV4KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYgdGhpcyBp
cyBub3QgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0Qm94U2hhZG93KHNoYWRvd0RhdGEucmVsZWFzZSgpLCBpLmluZGV4
KCkpOyAvLyBhZGQgdG8gdGhlIGxpc3QgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGVudHJ5Ci0g
ICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0Qm94UmVmbGVjdDogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTChib3hS
ZWZsZWN0LCBCb3hSZWZsZWN0KQotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUpIHsKLSAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEJveFJlZmxlY3QoUmVuZGVyU3R5bGU6OmluaXRpYWxC
b3hSZWZsZWN0KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAg
aWYgKCF2YWx1ZS0+aXNSZWZsZWN0VmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAg
ICAgICBDU1NSZWZsZWN0VmFsdWUqIHJlZmxlY3RWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1JlZmxl
Y3RWYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAgUmVmUHRyPFN0eWxlUmVmbGVjdGlvbj4gcmVmbGVj
dGlvbiA9IFN0eWxlUmVmbGVjdGlvbjo6Y3JlYXRlKCk7Ci0gICAgICAgIHJlZmxlY3Rpb24tPnNl
dERpcmVjdGlvbigqcmVmbGVjdFZhbHVlLT5kaXJlY3Rpb24oKSk7Ci0gICAgICAgIGlmIChyZWZs
ZWN0VmFsdWUtPm9mZnNldCgpKQotICAgICAgICAgICAgcmVmbGVjdGlvbi0+c2V0T2Zmc2V0KHJl
ZmxlY3RWYWx1ZS0+b2Zmc2V0KCktPmNvbnZlcnRUb0xlbmd0aDxGaXhlZEludGVnZXJDb252ZXJz
aW9uIHwgUGVyY2VudENvbnZlcnNpb24gfCBDYWxjdWxhdGVkQ29udmVyc2lvbj4oc3RhdGUuc3R5
bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKSk7Ci0gICAgICAgIE5p
bmVQaWVjZUltYWdlIG1hc2s7Ci0gICAgICAgIG1hc2suc2V0TWFza0RlZmF1bHRzKCk7Ci0gICAg
ICAgIG1fc3R5bGVNYXAubWFwTmluZVBpZWNlSW1hZ2UoaWQsIHJlZmxlY3RWYWx1ZS0+bWFzaygp
LCBtYXNrKTsKLSAgICAgICAgcmVmbGVjdGlvbi0+c2V0TWFzayhtYXNrKTsKLQotICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRCb3hSZWZsZWN0KHJlZmxlY3Rpb24ucmVsZWFzZSgpKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIENTU1Byb3BlcnR5U3JjOiAvLyBPbmx5IHVzZWQg
aW4gQGZvbnQtZmFjZSBydWxlcy4KLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgQ1NTUHJvcGVy
dHlVbmljb2RlUmFuZ2U6IC8vIE9ubHkgdXNlZCBpbiBAZm9udC1mYWNlIHJ1bGVzLgotICAgICAg
ICByZXR1cm47Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVSZXBldGl0aW9uOiB7
Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKG1hcnF1ZWVMb29wQ291bnQsIE1h
cnF1ZWVMb29wQ291bnQpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NW
YWx1ZUluZmluaXRlKQotICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUxvb3BD
b3VudCgtMSk7IC8vIC0xIG1lYW5zIHJlcGVhdCBmb3JldmVyLgotICAgICAgICBlbHNlIGlmIChw
cmltaXRpdmVWYWx1ZS0+aXNOdW1iZXIoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dE1hcnF1ZWVMb29wQ291bnQocHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCkpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJxdWVlU3BlZWQ6
IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lOSVRJQUwobWFycXVlZVNwZWVkLCBNYXJx
dWVlU3BlZWQpCi0gICAgICAgIGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1
cm47Ci0gICAgICAgIGlmIChpbnQgaWRlbnQgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkg
ewotICAgICAgICAgICAgc3dpdGNoIChpZGVudCkgewotICAgICAgICAgICAgY2FzZSBDU1NWYWx1
ZVNsb3c6Ci0gICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDUw
MCk7IC8vIDUwMCBtc2VjLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2Fz
ZSBDU1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJx
dWVlU3BlZWQoODUpOyAvLyA4NW1zZWMuIFRoZSBXaW5JRSBkZWZhdWx0LgotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUZhc3Q6Ci0gICAgICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZVNwZWVkKDEwKTsgLy8gMTBtc2VjLiBTdXBlciBm
YXN0LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVs
c2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5pc1RpbWUoKSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Y29tcHV0ZVRpbWU8aW50LCBDU1NQ
cmltaXRpdmVWYWx1ZTo6TWlsbGlzZWNvbmRzPigpKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0
aXZlVmFsdWUtPmlzTnVtYmVyKCkpIC8vIEZvciBzY3JvbGxhbW91bnQgc3VwcG9ydC4KLSAgICAg
ICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVTcGVlZChwcmltaXRpdmVWYWx1ZS0+Z2V0
SW50VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1hcnF1ZWVJbmNyZW1lbnQ6IHsKLSAgICAgICAgSEFORExFX0lOSEVSSVRfQU5EX0lO
SVRJQUwobWFycXVlZUluY3JlbWVudCwgTWFycXVlZUluY3JlbWVudCkKLSAgICAgICAgaWYgKCFw
cmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZhbHVl
LT5nZXRJZGVudCgpKSB7Ci0gICAgICAgICAgICBjYXNlIENTU1ZhbHVlU21hbGw6Ci0gICAgICAg
ICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0TWFycXVlZUluY3JlbWVudChMZW5ndGgoMSwgRml4
ZWQpKTsgLy8gMXB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBD
U1NWYWx1ZU5vcm1hbDoKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVl
SW5jcmVtZW50KExlbmd0aCg2LCBGaXhlZCkpOyAvLyA2cHguIFRoZSBXaW5JRSBkZWZhdWx0Lgot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDU1NWYWx1ZUxhcmdlOgot
ICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldE1hcnF1ZWVJbmNyZW1lbnQoTGVuZ3Ro
KDM2LCBGaXhlZCkpOyAvLyAzNnB4LgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGVuZ3RoIG1hcnF1ZWVMZW5ndGgg
PSBjb252ZXJ0VG9JbnRMZW5ndGgocHJpbWl0aXZlVmFsdWUsIHN0YXRlLnN0eWxlKCksIHN0YXRl
LnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0gICAgICAgICAgICBpZiAoIW1hcnF1ZWVMZW5ndGguaXNV
bmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRNYXJxdWVlSW5j
cmVtZW50KG1hcnF1ZWVMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExvY2FsZTogewotICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTChsb2NhbGUsIExvY2FsZSk7Ci0gICAgICAgIGlmICghcHJpbWl0aXZl
VmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+
Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZUF1dG8pCi0gICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRMb2NhbGUobnVsbEF0b20pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRMb2NhbGUocHJpbWl0aXZlVmFsdWUtPmdldFN0cmluZ1ZhbHVlKCkpOwotICAgICAg
ICBGb250RGVzY3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERl
c2NyaXB0aW9uKCk7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTY3JpcHQobG9jYWxlVG9T
Y3JpcHRDb2RlRm9yRm9udFNlbGVjdGlvbihzdGF0ZS5zdHlsZSgpLT5sb2NhbGUoKSkpOwotICAg
ICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLSNpZiBFTkFCTEUoREFTSEJPQVJEX1NVUFBPUlQpCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdERhc2hib2FyZFJlZ2lvbjoKLSAgICB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklU
X0FORF9JTklUSUFMKGRhc2hib2FyZFJlZ2lvbnMsIERhc2hib2FyZFJlZ2lvbnMpCi0gICAgICAg
IGlmICghcHJpbWl0aXZlVmFsdWUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYg
KHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlTm9uZSkgewotICAgICAgICAg
ICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9ucyhSZW5kZXJTdHlsZTo6bm9uZURh
c2hib2FyZFJlZ2lvbnMoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAg
ICAgICBEYXNoYm9hcmRSZWdpb24qIHJlZ2lvbiA9IHByaW1pdGl2ZVZhbHVlLT5nZXREYXNoYm9h
cmRSZWdpb25WYWx1ZSgpOwotICAgICAgICBpZiAoIXJlZ2lvbikKLSAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICBEYXNoYm9hcmRSZWdpb24qIGZpcnN0ID0gcmVnaW9uOwotICAgICAgICB3
aGlsZSAocmVnaW9uKSB7Ci0gICAgICAgICAgICBMZW5ndGggdG9wID0gY29udmVydFRvSW50TGVu
Z3RoKHJlZ2lvbi0+dG9wKCksIHN0YXRlLnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUo
KSk7Ci0gICAgICAgICAgICBMZW5ndGggcmlnaHQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9u
LT5yaWdodCgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAg
ICAgICAgICAgTGVuZ3RoIGJvdHRvbSA9IGNvbnZlcnRUb0ludExlbmd0aChyZWdpb24tPmJvdHRv
bSgpLCBzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5yb290RWxlbWVudFN0eWxlKCkpOwotICAgICAgICAg
ICAgTGVuZ3RoIGxlZnQgPSBjb252ZXJ0VG9JbnRMZW5ndGgocmVnaW9uLT5sZWZ0KCksIHN0YXRl
LnN0eWxlKCksIHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmICh0
b3AuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAgICB0b3AgPSBMZW5ndGgoKTsKLSAgICAg
ICAgICAgIGlmIChyaWdodC5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJpZ2h0ID0g
TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoYm90dG9tLmlzVW5kZWZpbmVkKCkpCi0gICAgICAg
ICAgICAgICAgYm90dG9tID0gTGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVmdC5pc1VuZGVm
aW5lZCgpKQotICAgICAgICAgICAgICAgIGxlZnQgPSBMZW5ndGgoKTsKLQotICAgICAgICAgICAg
aWYgKHJlZ2lvbi0+bV9pc0NpcmNsZSkKLSAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXREYXNoYm9hcmRSZWdpb24oU3R5bGVEYXNoYm9hcmRSZWdpb246OkNpcmNsZSwgcmVnaW9uLT5t
X2xhYmVsLCB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHJlZ2lvbiA9PSBmaXJzdCA/IGZhbHNl
IDogdHJ1ZSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZWdpb24tPm1faXNSZWN0YW5nbGUpCi0g
ICAgICAgICAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0RGFzaGJvYXJkUmVnaW9uKFN0eWxlRGFz
aGJvYXJkUmVnaW9uOjpSZWN0YW5nbGUsIHJlZ2lvbi0+bV9sYWJlbCwgdG9wLCByaWdodCwgYm90
dG9tLCBsZWZ0LCByZWdpb24gPT0gZmlyc3QgPyBmYWxzZSA6IHRydWUpOwotICAgICAgICAgICAg
cmVnaW9uID0gcmVnaW9uLT5tX25leHQuZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0
ZS5kb2N1bWVudCgpLT5zZXRIYXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotCi0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0jZW5kaWYKLSNpZiBFTkFCTEUoRFJBR0dBQkxFX1JFR0lPTikKLSAgICBj
YXNlIENTU1Byb3BlcnR5V2Via2l0QXBwUmVnaW9uOiB7Ci0gICAgICAgIGlmICghcHJpbWl0aXZl
VmFsdWUgfHwgIXByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpKQotICAgICAgICAgICAgcmV0dXJu
OwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXREcmFnZ2FibGVSZWdpb25Nb2RlKHByaW1pdGl2
ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlRHJhZyA/IERyYWdnYWJsZVJlZ2lvbkRyYWcg
OiBEcmFnZ2FibGVSZWdpb25Ob0RyYWcpOwotICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRI
YXNBbm5vdGF0ZWRSZWdpb25zKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlm
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VXaWR0aDogewotICAgICAgICBI
QU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0ZXh0U3Ryb2tlV2lkdGgsIFRleHRTdHJva2VXaWR0
aCkKLSAgICAgICAgZmxvYXQgd2lkdGggPSAwOwotICAgICAgICBzd2l0Y2ggKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpKSB7Ci0gICAgICAgIGNhc2UgQ1NTVmFsdWVUaGluOgotICAgICAgICBj
YXNlIENTU1ZhbHVlTWVkaXVtOgotICAgICAgICBjYXNlIENTU1ZhbHVlVGhpY2s6IHsKLSAgICAg
ICAgICAgIGRvdWJsZSByZXN1bHQgPSAxLjAgLyA0ODsKLSAgICAgICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU1lZGl1bSkKLSAgICAgICAgICAgICAgICBy
ZXN1bHQgKj0gMzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVu
dCgpID09IENTU1ZhbHVlVGhpY2spCi0gICAgICAgICAgICAgICAgcmVzdWx0ICo9IDU7Ci0gICAg
ICAgICAgICB3aWR0aCA9IENTU1ByaW1pdGl2ZVZhbHVlOjpjcmVhdGUocmVzdWx0LCBDU1NQcmlt
aXRpdmVWYWx1ZTo6Q1NTX0VNUyktPmNvbXB1dGVMZW5ndGg8ZmxvYXQ+KHN0YXRlLnN0eWxlKCks
IHN0YXRlLnJvb3RFbGVtZW50U3R5bGUoKSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgd2lkdGggPSBwcmlt
aXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldFRleHRTdHJva2VXaWR0aCh3aWR0aCk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9y
bTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5JVElBTCh0cmFuc2Zvcm0sIFRyYW5z
Zm9ybSk7Ci0gICAgICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAg
Y3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyh2YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKLSAgICAgICAgc3RhdGUuc3R5bGUoKS0+c2V0
VHJhbnNmb3JtKG9wZXJhdGlvbnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9B
TkRfSU5JVElBTChwZXJzcGVjdGl2ZSwgUGVyc3BlY3RpdmUpCi0KLSAgICAgICAgaWYgKCFwcmlt
aXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocHJpbWl0aXZl
VmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25lKSB7Ci0gICAgICAgICAgICBzdGF0ZS5z
dHlsZSgpLT5zZXRQZXJzcGVjdGl2ZSgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotCi0gICAgICAgIGZsb2F0IHBlcnNwZWN0aXZlVmFsdWU7Ci0gICAgICAgIGlmIChwcmltaXRp
dmVWYWx1ZS0+aXNMZW5ndGgoKSkKLSAgICAgICAgICAgIHBlcnNwZWN0aXZlVmFsdWUgPSBwcmlt
aXRpdmVWYWx1ZS0+Y29tcHV0ZUxlbmd0aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9v
dEVsZW1lbnRTdHlsZSgpLCB6b29tRmFjdG9yKTsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZl
VmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAgICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRp
YmlsaXR5LCB0cmVhdCB2YWx1ZWxlc3MgbnVtYmVycyBhcyBweC4KLSAgICAgICAgICAgIHBlcnNw
ZWN0aXZlVmFsdWUgPSBDU1NQcmltaXRpdmVWYWx1ZTo6Y3JlYXRlKHByaW1pdGl2ZVZhbHVlLT5n
ZXREb3VibGVWYWx1ZSgpLCBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX1BYKS0+Y29tcHV0ZUxlbmd0
aDxmbG9hdD4oc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCB6b29tRmFj
dG9yKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYg
KHBlcnNwZWN0aXZlVmFsdWUgPj0gMC4wZikKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNl
dFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlVmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
I2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRhcEhp
Z2hsaWdodENvbG9yOiB7Ci0gICAgICAgIEhBTkRMRV9JTkhFUklUX0FORF9JTklUSUFMKHRhcEhp
Z2hsaWdodENvbG9yLCBUYXBIaWdobGlnaHRDb2xvcik7Ci0gICAgICAgIGlmICghcHJpbWl0aXZl
VmFsdWUpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBDb2xvciBjb2wgPSBjb2xvckZy
b21QcmltaXRpdmVWYWx1ZShwcmltaXRpdmVWYWx1ZSk7Ci0gICAgICAgIHN0YXRlLnN0eWxlKCkt
PnNldFRhcEhpZ2hsaWdodENvbG9yKGNvbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5k
aWYKLSNpZiBFTkFCTEUoQUNDRUxFUkFURURfT1ZFUkZMT1dfU0NST0xMSU5HKQotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogewotICAgICAgICBIQU5ETEVfSU5I
RVJJVF9BTkRfSU5JVElBTCh1c2VUb3VjaE92ZXJmbG93U2Nyb2xsaW5nLCBVc2VUb3VjaE92ZXJm
bG93U2Nyb2xsaW5nKTsKLSAgICAgICAgaWYgKCFwcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRVc2VUb3VjaE92ZXJmbG93U2Nyb2xs
aW5nKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1ZhbHVlVG91Y2gpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eUludmFsaWQ6Ci0g
ICAgICAgIHJldHVybjsKLSAgICAvLyBEaXJlY3Rpb25hbCBwcm9wZXJ0aWVzIGFyZSByZXNvbHZl
ZCBieSByZXNvbHZlRGlyZWN0aW9uQXdhcmVQcm9wZXJ0eSgpIGJlZm9yZSB0aGUgc3dpdGNoLgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJFbmRDb2xvcjoKLSAgICBjYXNlIENTU1By
b3BlcnR5V2Via2l0Qm9yZGVyRW5kU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlckVuZFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydENvbG9y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFN0eWxlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJTdGFydFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3JkZXJCZWZvcmVDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVy
QmVmb3JlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJlZm9yZVdpZHRo
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlckNvbG9yOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRCb3JkZXJBZnRlclN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3JkZXJBZnRlcldpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5F
bmQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpblN0YXJ0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXJnaW5CZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1h
cmdpbkFmdGVyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXJnaW5CZWZvcmVDb2xsYXBz
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFyZ2luVG9wQ29sbGFwc2U6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcmdpbkFmdGVyQ29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdE1hcmdpbkJvdHRvbUNvbGxhcHNlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRQYWRkaW5nRW5kOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQYWRkaW5nU3RhcnQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFBhZGRpbmdCZWZvcmU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFBhZGRpbmdBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TG9naWNh
bFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRMb2dpY2FsSGVpZ2h0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlXZWJraXRNaW5Mb2dpY2FsV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE1pbkxvZ2ljYWxIZWlnaHQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1heExv
Z2ljYWxXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWF4TG9naWNhbEhlaWdodDoK
LSAgICB7Ci0gICAgICAgIENTU1Byb3BlcnR5SUQgbmV3SWQgPSBDU1NQcm9wZXJ0eTo6cmVzb2x2
ZURpcmVjdGlvbkF3YXJlUHJvcGVydHkoaWQsIHN0YXRlLnN0eWxlKCktPmRpcmVjdGlvbigpLCBz
dGF0ZS5zdHlsZSgpLT53cml0aW5nTW9kZSgpKTsKLSAgICAgICAgQVNTRVJUKG5ld0lkICE9IGlk
KTsKLSAgICAgICAgcmV0dXJuIGFwcGx5UHJvcGVydHkobmV3SWQsIHZhbHVlKTsKLSAgICB9Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTdHJldGNoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQYWdl
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2g6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRMaW5lVGhyb3VnaENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRo
cm91Z2hNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0TGluZVRocm91Z2hTdHlsZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5VGV4dExpbmVUaHJvdWdoV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRPdmVybGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dE92ZXJsaW5lQ29sb3I6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRPdmVybGluZU1vZGU6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRPdmVybGluZVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmxpbmVX
aWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZToKLSAgICBjYXNlIENTU1By
b3BlcnR5VGV4dFVuZGVybGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJs
aW5lTW9kZToKLSAgICBjYXNlIENTU1Byb3BlcnR5VGV4dFVuZGVybGluZVN0eWxlOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0VW5kZXJsaW5lV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEZvbnRTaXplRGVsdGE6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0
aW9uc0luRWZmZWN0OgotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBDU1MgVGV4dCBMYXlvdXQg
TW9kdWxlIExldmVsIDM6IFZlcnRpY2FsIHdyaXRpbmcgc3VwcG9ydAotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRXcml0aW5nTW9kZTogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRfSU5J
VElBTCh3cml0aW5nTW9kZSwgV3JpdGluZ01vZGUpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBy
aW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgc2V0V3JpdGluZ01vZGUoKnByaW1pdGl2ZVZhbHVl
KTsKLQotICAgICAgICAvLyBGSVhNRTogSXQgaXMgbm90IG9rIHRvIG1vZGlmeSBkb2N1bWVudCBz
dGF0ZSB3aGlsZSBhcHBseWluZyBzdHlsZS4KLSAgICAgICAgaWYgKHN0YXRlLmVsZW1lbnQoKSAm
JiBzdGF0ZS5lbGVtZW50KCkgPT0gc3RhdGUuZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkp
Ci0gICAgICAgICAgICBzdGF0ZS5kb2N1bWVudCgpLT5zZXRXcml0aW5nTW9kZVNldE9uRG9jdW1l
bnRFbGVtZW50KHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRPcmllbnRhdGlvbjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9B
TkRfSU5JVElBTCh0ZXh0T3JpZW50YXRpb24sIFRleHRPcmllbnRhdGlvbik7Ci0KLSAgICAgICAg
aWYgKHByaW1pdGl2ZVZhbHVlKQotICAgICAgICAgICAgc2V0VGV4dE9yaWVudGF0aW9uKCpwcmlt
aXRpdmVWYWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRMaW5lQm94Q29udGFpbjogewotICAgICAgICBIQU5ETEVfSU5IRVJJVF9BTkRf
SU5JVElBTChsaW5lQm94Q29udGFpbiwgTGluZUJveENvbnRhaW4pCi0gICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZSAmJiBwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSA9PSBDU1NWYWx1ZU5vbmUp
IHsKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldExpbmVCb3hDb250YWluKExpbmVCb3hD
b250YWluTm9uZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoIXZhbHVlLT5pc0NTU0xpbmVCb3hDb250YWluVmFsdWUoKSkKLSAgICAgICAgICAgIHJldHVy
bjsKLQotICAgICAgICBDU1NMaW5lQm94Q29udGFpblZhbHVlKiBsaW5lQm94Q29udGFpblZhbHVl
ID0gc3RhdGljX2Nhc3Q8Q1NTTGluZUJveENvbnRhaW5WYWx1ZSo+KHZhbHVlKTsKLSAgICAgICAg
c3RhdGUuc3R5bGUoKS0+c2V0TGluZUJveENvbnRhaW4obGluZUJveENvbnRhaW5WYWx1ZS0+dmFs
dWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDU1MgRm9udHMgTW9kdWxl
IExldmVsIDMKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rm9udEZlYXR1cmVTZXR0aW5nczog
ewotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUgJiYgcHJpbWl0aXZlVmFsdWUtPmdldElkZW50
KCkgPT0gQ1NTVmFsdWVOb3JtYWwpIHsKLSAgICAgICAgICAgIHNldEZvbnREZXNjcmlwdGlvbihz
dGF0ZS5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKS5tYWtlTm9ybWFsRmVhdHVyZVNldHRpbmdz
KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2YWx1
ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBGb250RGVz
Y3JpcHRpb24gZm9udERlc2NyaXB0aW9uID0gc3RhdGUuc3R5bGUoKS0+Zm9udERlc2NyaXB0aW9u
KCk7Ci0gICAgICAgIENTU1ZhbHVlTGlzdCogbGlzdCA9IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlz
dCo+KHZhbHVlKTsKLSAgICAgICAgUmVmUHRyPEZvbnRGZWF0dXJlU2V0dGluZ3M+IHNldHRpbmdz
ID0gRm9udEZlYXR1cmVTZXR0aW5nczo6Y3JlYXRlKCk7Ci0gICAgICAgIGludCBsZW4gPSBsaXN0
LT5sZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAg
ICAgICAgICAgQ1NTVmFsdWUqIGl0ZW0gPSBsaXN0LT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkp
OwotICAgICAgICAgICAgaWYgKCFpdGVtLT5pc0ZvbnRGZWF0dXJlVmFsdWUoKSkKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIEZvbnRGZWF0dXJlVmFsdWUqIGZlYXR1cmUg
PSBzdGF0aWNfY2FzdDxGb250RmVhdHVyZVZhbHVlKj4oaXRlbSk7Ci0gICAgICAgICAgICBzZXR0
aW5ncy0+YXBwZW5kKEZvbnRGZWF0dXJlKGZlYXR1cmUtPnRhZygpLCBmZWF0dXJlLT52YWx1ZSgp
KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEZlYXR1cmVTZXR0aW5n
cyhzZXR0aW5ncy5yZWxlYXNlKCkpOwotICAgICAgICBzZXRGb250RGVzY3JpcHRpb24oZm9udERl
c2NyaXB0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIEVOQUJMRShDU1NfRklM
VEVSUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0RmlsdGVyOiB7Ci0gICAgICAgIEhBTkRM
RV9JTkhFUklUX0FORF9JTklUSUFMKGZpbHRlciwgRmlsdGVyKTsKLSAgICAgICAgRmlsdGVyT3Bl
cmF0aW9ucyBvcGVyYXRpb25zOwotICAgICAgICBpZiAoY3JlYXRlRmlsdGVyT3BlcmF0aW9ucyh2
YWx1ZSwgc3RhdGUuc3R5bGUoKSwgc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25z
KSkKLSAgICAgICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEZpbHRlcihvcGVyYXRpb25zKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRH
cmlkQ29sdW1uczogewotICAgICAgICBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4gdHJhY2tTaXplczsK
LSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0KHZhbHVlLCB0cmFja1NpemVzLCBzdGF0
ZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxlKCktPnNldEdyaWRD
b2x1bW5zKHRyYWNrU2l6ZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRHcmlkUm93czogewotICAgICAgICBWZWN0b3I8R3JpZFRyYWNrU2l6ZT4g
dHJhY2tTaXplczsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkVHJhY2tMaXN0KHZhbHVlLCB0cmFj
a1NpemVzLCBzdGF0ZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHN0YXRlLnN0eWxl
KCktPnNldEdyaWRSb3dzKHRyYWNrU2l6ZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRTdGFydDogewotICAgICAgICBHcmlkUG9zaXRp
b24gc3RhcnRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFsdWUs
IHN0YXJ0UG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBzdGF0ZS5zdHls
ZSgpLT5zZXRHcmlkSXRlbVN0YXJ0KHN0YXJ0UG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRHcmlkRW5kOiB7Ci0gICAgICAgIEdyaWRQ
b3NpdGlvbiBlbmRQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVHcmlkUG9zaXRpb24odmFs
dWUsIGVuZFBvc2l0aW9uKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3RhdGUuc3R5
bGUoKS0+c2V0R3JpZEl0ZW1FbmQoZW5kUG9zaXRpb24pOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRCZWZvcmU6IHsKLSAgICAgICAgR3Jp
ZFBvc2l0aW9uIGJlZm9yZVBvc2l0aW9uOwotICAgICAgICBpZiAoIWNyZWF0ZUdyaWRQb3NpdGlv
bih2YWx1ZSwgYmVmb3JlUG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBz
dGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUJlZm9yZShiZWZvcmVQb3NpdGlvbik7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEdyaWRBZnRlcjogewot
ICAgICAgICBHcmlkUG9zaXRpb24gYWZ0ZXJQb3NpdGlvbjsKLSAgICAgICAgaWYgKCFjcmVhdGVH
cmlkUG9zaXRpb24odmFsdWUsIGFmdGVyUG9zaXRpb24pKQotICAgICAgICAgICAgcmV0dXJuOwot
ICAgICAgICBzdGF0ZS5zdHlsZSgpLT5zZXRHcmlkSXRlbUFmdGVyKGFmdGVyUG9zaXRpb24pOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlc2UgcHJvcGVydGllcyBhcmUgYWxp
YXNlZCBhbmQgU3R5bGVCdWlsZGVyIGFscmVhZHkgYXBwbGllZCB0aGUgcHJvcGVydHkgb24gdGhl
IHByZWZpeGVkIHZlcnNpb24uCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25EZWxheToK
LSAgICBjYXNlIENTU1Byb3BlcnR5VHJhbnNpdGlvbkR1cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlUcmFuc2l0aW9uUHJvcGVydHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRyYW5zaXRpb25U
aW1pbmdGdW5jdGlvbjoKLSAgICAgICAgcmV0dXJuOwotICAgIC8vIFRoZXNlIHByb3BlcnRpZXMg
YXJlIGltcGxlbWVudGVkIGluIHRoZSBTdHlsZUJ1aWxkZXIgbG9va3VwIHRhYmxlLgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQXR0YWNobWVudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZENsaXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3VuZEltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kT3JpZ2luOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25Y
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlCYWNrZ3JvdW5kUG9zaXRpb25ZOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kUmVwZWF0WDoKLSAgICBjYXNlIENTU1Byb3BlcnR5QmFja2dyb3Vu
ZFJlcGVhdFk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJhY2tncm91bmRTaXplOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Qm90dG9tTGVmdFJhZGl1czoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tUmlnaHRS
YWRpdXM6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVN0eWxlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlCb3JkZXJCb3R0b21XaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVy
Q29sbGFwc2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlT3V0c2V0OgotICAgIGNh
c2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVJlcGVhdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9y
ZGVySW1hZ2VTbGljZToKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVySW1hZ2VTb3VyY2U6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlckltYWdlV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlckxlZnRDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Qm9yZGVyTGVmdFN0eWxlOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJMZWZ0V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJvcmRlclJpZ2h0Q29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0U3R5bGU6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0V2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUJvcmRlclRvcENvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BMZWZ0UmFk
aXVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJUb3BSaWdodFJhZGl1czoKLSAgICBjYXNl
IENTU1Byb3BlcnR5Qm9yZGVyVG9wU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUJvcmRlclRv
cFdpZHRoOgotICAgIGNhc2UgQ1NTUHJvcGVydHlCb3R0b206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eUJveFNpemluZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q2FwdGlvblNpZGU6Ci0gICAgY2FzZSBD
U1NQcm9wZXJ0eUNsZWFyOgotICAgIGNhc2UgQ1NTUHJvcGVydHlDbGlwOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlDb2xvcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5Q291bnRlckluY3JlbWVudDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5Q291bnRlclJlc2V0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlDdXJz
b3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eURpcmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5
RGlzcGxheToKLSAgICBjYXNlIENTU1Byb3BlcnR5RW1wdHlDZWxsczoKLSAgICBjYXNlIENTU1By
b3BlcnR5RmxvYXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRTaXplOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlGb250U3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUZvbnRWYXJpYW50OgotICAg
IGNhc2UgQ1NTUHJvcGVydHlGb250V2VpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlIZWlnaHQ6
Ci0jaWYgRU5BQkxFKENTU19JTUFHRV9PUklFTlRBVElPTikKLSAgICBjYXNlIENTU1Byb3BlcnR5
SW1hZ2VPcmllbnRhdGlvbjoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlJbWFnZVJlbmRl
cmluZzoKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1JFU09MVVRJT04pCi0gICAgY2FzZSBDU1NQcm9w
ZXJ0eUltYWdlUmVzb2x1dGlvbjoKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlMZWZ0Ogot
ICAgIGNhc2UgQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlM
aW5lSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlMaXN0U3R5bGVJbWFnZToKLSAgICBjYXNl
IENTU1Byb3BlcnR5TGlzdFN0eWxlUG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eUxpc3RT
dHlsZVR5cGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbToKLSAgICBjYXNlIENT
U1Byb3BlcnR5TWFyZ2luTGVmdDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWFyZ2luUmlnaHQ6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eU1hcmdpblRvcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5TWF4SGVp
Z2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNYXhXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5
TWluSGVpZ2h0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlNaW5XaWR0aDoKLSAgICBjYXNlIENTU1By
b3BlcnR5T3BhY2l0eToKLSAgICBjYXNlIENTU1Byb3BlcnR5T3JwaGFuczoKLSAgICBjYXNlIENT
U1Byb3BlcnR5T3V0bGluZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlPdXRsaW5lU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eU91dGxpbmVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5T3ZlcmZsb3dXcmFwOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlPdmVyZmxvd1g6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU92ZXJmbG93WToK
LSAgICBjYXNlIENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbToKLSAgICBjYXNlIENTU1Byb3BlcnR5
UGFkZGluZ0xlZnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZGRpbmdSaWdodDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5UGFkZGluZ1RvcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5UGFnZUJyZWFrQWZ0
ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVBhZ2VCcmVha0JlZm9yZToKLSAgICBjYXNlIENTU1By
b3BlcnR5UGFnZUJyZWFrSW5zaWRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlQb2ludGVyRXZlbnRz
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlQb3NpdGlvbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5UmVz
aXplOgotICAgIGNhc2UgQ1NTUHJvcGVydHlSaWdodDoKLSAgICBjYXNlIENTU1Byb3BlcnR5U2l6
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5U3BlYWs6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRhYlNp
emU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRhYmxlTGF5b3V0OgotICAgIGNhc2UgQ1NTUHJvcGVy
dHlUZXh0QWxpZ246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHREZWNvcmF0aW9uOgotICAgIGNh
c2UgQ1NTUHJvcGVydHlUZXh0SW5kZW50OgotICAgIGNhc2UgQ1NTUHJvcGVydHlUZXh0T3ZlcmZs
b3c6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRleHRSZW5kZXJpbmc6Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVRleHRUcmFuc2Zvcm06Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVRvcDoKLSAgICBjYXNlIENT
U1Byb3BlcnR5VW5pY29kZUJpZGk6Ci0jaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCi0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVZhcmlhYmxlOgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVZlcnRp
Y2FsQWxpZ246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVZpc2liaWxpdHk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkRlbGF5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRB
bmltYXRpb25EaXJlY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbkR1
cmF0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRBbmltYXRpb25GaWxsTW9kZToKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEFuaW1hdGlvbk5hbWU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEFuaW1hdGlvblBsYXlTdGF0ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0QW5pbWF0
aW9uVGltaW5nRnVuY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFwcGVhcmFuY2U6
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFzcGVjdFJhdGlvOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRCYWNrZmFjZVZpc2liaWxpdHk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtp
dEJhY2tncm91bmRDbGlwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kQ29t
cG9zaXRlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kT3JpZ2luOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCYWNrZ3JvdW5kU2l6ZToKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Qm9yZGVyRml0OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJIb3Jp
em9udGFsU3BhY2luZzoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm9yZGVySW1hZ2U6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2luZzoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Qm94QWxpZ246Ci0jaWYgRU5BQkxFKENTU19CT1hfREVDT1JBVElP
Tl9CUkVBSykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94RGVjb3JhdGlvbkJyZWFrOgot
I2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveERpcmVjdGlvbjoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Qm94RmxleDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Qm94
RmxleEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRCb3hMaW5lczoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0Qm94T3JkaW5hbEdyb3VwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlX
ZWJraXRCb3hPcmllbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFBhY2s6Ci0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbG9yQ29ycmVjdGlvbjoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uQXhpczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJl
YWtBZnRlcjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQnJlYWtCZWZvcmU6Ci0g
ICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkJyZWFrSW5zaWRlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDb2x1bW5Db3VudDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uR2FwOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Qcm9ncmVzc2lvbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yOgotICAgIGNhc2UgQ1NTUHJv
cGVydHlXZWJraXRDb2x1bW5SdWxlU3R5bGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdENv
bHVtblJ1bGVXaWR0aDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uU3BhbjoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGg6Ci0jaWYgRU5BQkxFKENVUlNPUl9W
SVNJQklMSVRZKQotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRDdXJzb3JWaXNpYmlsaXR5Ogot
I2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEFsaWduQ29udGVudDoKLSAgICBjYXNl
IENTU1Byb3BlcnR5V2Via2l0QWxpZ25JdGVtczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0
QWxpZ25TZWxmOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4QmFzaXM6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdEZsZXhEaXJlY3Rpb246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEZsZXhHcm93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4U2hyaW5rOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGbGV4V3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0SnVzdGlmeUNvbnRlbnQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE9yZGVyOgotI2lm
IEVOQUJMRShDU1NfUkVHSU9OUykKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0Rmxvd0Zyb206
Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEZsb3dJbnRvOgotI2VuZGlmCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdEZvbnRLZXJuaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRG
b250U21vb3RoaW5nOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRGb250VmFyaWFudExpZ2F0
dXJlczoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0SGlnaGxpZ2h0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRIeXBoZW5hdGVDaGFyYWN0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdEh5cGhlbmF0ZUxpbWl0QWZ0ZXI6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEh5cGhl
bmF0ZUxpbWl0QmVmb3JlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5hdGVMaW1p
dExpbmVzOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRIeXBoZW5zOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRMaW5lQWxpZ246Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdExpbmVC
cmVhazoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZUNsYW1wOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRMaW5lR3JpZDoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TGluZVNu
YXA6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVEaXJlY3Rpb246Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hcnF1ZWVTdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQm94SW1hZ2VP
dXRzZXQ6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVJlcGVhdDoKLSAg
ICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza0JveEltYWdlU2xpY2U6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNvdXJjZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0TWFza0JveEltYWdlV2lkdGg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tDbGlw
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrQ29tcG9zaXRlOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tP
cmlnaW46Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblg6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tQb3NpdGlvblk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdl
YmtpdE1hc2tSZXBlYXRYOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrUmVwZWF0WToK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0TWFza1NpemU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdE5ic3BNb2RlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9y
aWdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0UGVyc3BlY3RpdmVPcmlnaW5YOgotICAg
IGNhc2UgQ1NTUHJvcGVydHlXZWJraXRQZXJzcGVjdGl2ZU9yaWdpblk6Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFByaW50Q29sb3JBZGp1c3Q6Ci0jaWYgRU5BQkxFKENTU19SRUdJT05TKQot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSZWdpb25CcmVha0FmdGVyOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRSZWdpb25CcmVha0JlZm9yZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0UmVnaW9uQnJlYWtJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJlZ2lvbk92
ZXJmbG93OgotI2VuZGlmCi0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFJ0bE9yZGVyaW5nOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRSdWJ5UG9zaXRpb246Ci0gICAgY2FzZSBDU1NQcm9w
ZXJ0eVdlYmtpdFRleHRDb21iaW5lOgotI2lmIEVOQUJMRShDU1MzX1RFWFQpCi0gICAgY2FzZSBD
U1NQcm9wZXJ0eVdlYmtpdFRleHREZWNvcmF0aW9uTGluZToKLSAgICBjYXNlIENTU1Byb3BlcnR5
V2Via2l0VGV4dERlY29yYXRpb25TdHlsZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4
dEFsaWduTGFzdDoKLSNlbmRpZiAvLyBDU1MzX1RFWFQKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Vi
a2l0VGV4dEVtcGhhc2lzQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRleHRFbXBo
YXNpc1Bvc2l0aW9uOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUZXh0RW1waGFzaXNTdHls
ZToKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvcjoKLSAgICBjYXNlIENT
U1Byb3BlcnR5V2Via2l0VGV4dFNlY3VyaXR5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRU
ZXh0U3Ryb2tlQ29sb3I6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
blg6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblk6Ci0gICAgY2Fz
ZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblo6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eVdlYmtpdFRyYW5zZm9ybVN0eWxlOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRUcmFuc2l0
aW9uRGVsYXk6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zaXRpb25EdXJhdGlvbjoK
LSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0VHJhbnNpdGlvblByb3BlcnR5OgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXZWJraXRUcmFuc2l0aW9uVGltaW5nRnVuY3Rpb246Ci0gICAgY2FzZSBDU1NQ
cm9wZXJ0eVdlYmtpdFVzZXJEcmFnOgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyTW9k
aWZ5OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRVc2VyU2VsZWN0OgotICAgIGNhc2UgQ1NT
UHJvcGVydHlXZWJraXRDbGlwUGF0aDoKLSNpZiBFTkFCTEUoQ1NTX0VYQ0xVU0lPTlMpCi0gICAg
Y2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFdyYXBGbG93OgotICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJr
aXRTaGFwZU1hcmdpbjoKLSAgICBjYXNlIENTU1Byb3BlcnR5V2Via2l0U2hhcGVQYWRkaW5nOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRXcmFwVGhyb3VnaDoKLSAgICBjYXNlIENTU1Byb3Bl
cnR5V2Via2l0U2hhcGVJbnNpZGU6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdFNoYXBlT3V0
c2lkZToKLSNlbmRpZgotICAgIGNhc2UgQ1NTUHJvcGVydHlXaGl0ZVNwYWNlOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXaWRvd3M6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdpZHRoOgotICAgIGNhc2Ug
Q1NTUHJvcGVydHlXb3JkQnJlYWs6Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eVdvcmRTcGFjaW5nOgot
ICAgIGNhc2UgQ1NTUHJvcGVydHlXb3JkV3JhcDoKLSAgICBjYXNlIENTU1Byb3BlcnR5WkluZGV4
OgotICAgIGNhc2UgQ1NTUHJvcGVydHlab29tOgotI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBU
QVRJT04pCi0gICAgY2FzZSBDU1NQcm9wZXJ0eU1heFpvb206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0
eU1pblpvb206Ci0gICAgY2FzZSBDU1NQcm9wZXJ0eU9yaWVudGF0aW9uOgotICAgIGNhc2UgQ1NT
UHJvcGVydHlVc2VyWm9vbToKLSNlbmRpZgotICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAg
Ly8gVHJ5IHRoZSBTVkcgcHJvcGVydGllcwotICAgICAgICBhcHBseVNWR1Byb3BlcnR5KGlkLCB2
YWx1ZSk7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotUGFzc1JlZlB0cjxT
dHlsZUltYWdlPiBTdHlsZVJlc29sdmVyOjpzdHlsZUltYWdlKENTU1Byb3BlcnR5SUQgcHJvcGVy
dHksIENTU1ZhbHVlKiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUtPmlzSW1hZ2VWYWx1ZSgpKQot
ICAgICAgICByZXR1cm4gY2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKHByb3BlcnR5LCBzdGF0aWNf
Y2FzdDxDU1NJbWFnZVZhbHVlKj4odmFsdWUpKTsKLQotICAgIGlmICh2YWx1ZS0+aXNJbWFnZUdl
bmVyYXRvclZhbHVlKCkpIHsKLSAgICAgICAgaWYgKHZhbHVlLT5pc0dyYWRpZW50VmFsdWUoKSkK
LSAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHks
IHN0YXRpY19jYXN0PENTU0dyYWRpZW50VmFsdWUqPih2YWx1ZSktPmdyYWRpZW50V2l0aFN0eWxl
c1Jlc29sdmVkKHRoaXMpLmdldCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZE9yUGVuZGlu
Z0Zyb21WYWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSo+
KHZhbHVlKSk7Ci0gICAgfQotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0gICAgaWYgKHZh
bHVlLT5pc0ltYWdlU2V0VmFsdWUoKSkKLSAgICAgICAgcmV0dXJuIHNldE9yUGVuZGluZ0Zyb21W
YWx1ZShwcm9wZXJ0eSwgc3RhdGljX2Nhc3Q8Q1NTSW1hZ2VTZXRWYWx1ZSo+KHZhbHVlKSk7Ci0j
ZW5kaWYKLQotICAgIGlmICh2YWx1ZS0+aXNDdXJzb3JJbWFnZVZhbHVlKCkpCi0gICAgICAgIHJl
dHVybiBjdXJzb3JPclBlbmRpbmdGcm9tVmFsdWUocHJvcGVydHksIHN0YXRpY19jYXN0PENTU0N1
cnNvckltYWdlVmFsdWUqPih2YWx1ZSkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gU3R5bGVSZXNvbHZlcjo6Y2FjaGVkT3JQZW5kaW5nRnJvbVZhbHVlKENT
U1Byb3BlcnR5SUQgcHJvcGVydHksIENTU0ltYWdlVmFsdWUqIHZhbHVlKQotewotICAgIFJlZlB0
cjxTdHlsZUltYWdlPiBpbWFnZSA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdJbWFnZSgpOwotICAg
IGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgbV9zdGF0ZS5w
ZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgcmV0dXJu
IGltYWdlLnJlbGVhc2UoKTsKLX0KLQotUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBTdHlsZVJlc29s
dmVyOjpnZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBwcm9wZXJ0eSwg
Q1NTSW1hZ2VHZW5lcmF0b3JWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1BlbmRp
bmcoKSkgewotICAgICAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJv
cGVydHksIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIFN0eWxlUGVuZGluZ0ltYWdlOjpjcmVhdGUo
dmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gU3R5bGVHZW5lcmF0ZWRJbWFnZTo6Y3JlYXRlKHZh
bHVlKTsKLX0KLQotI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQotUGFzc1JlZlB0cjxTdHlsZUlt
YWdlPiBTdHlsZVJlc29sdmVyOjpzZXRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCBw
cm9wZXJ0eSwgQ1NTSW1hZ2VTZXRWYWx1ZSogdmFsdWUpCi17Ci0gICAgUmVmUHRyPFN0eWxlSW1h
Z2U+IGltYWdlID0gdmFsdWUtPmNhY2hlZE9yUGVuZGluZ0ltYWdlU2V0KGRvY3VtZW50KCkpOwot
ICAgIGlmIChpbWFnZSAmJiBpbWFnZS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgbV9zdGF0
ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuc2V0KHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgcmV0
dXJuIGltYWdlLnJlbGVhc2UoKTsKLX0KLSNlbmRpZgotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+
IFN0eWxlUmVzb2x2ZXI6OmN1cnNvck9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlEIHBy
b3BlcnR5LCBDU1NDdXJzb3JJbWFnZVZhbHVlKiB2YWx1ZSkKLXsKLSAgICBSZWZQdHI8U3R5bGVJ
bWFnZT4gaW1hZ2UgPSB2YWx1ZS0+Y2FjaGVkT3JQZW5kaW5nSW1hZ2UoZG9jdW1lbnQoKSk7Ci0g
ICAgaWYgKGltYWdlICYmIGltYWdlLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICBtX3N0YXRl
LnBlbmRpbmdJbWFnZVByb3BlcnRpZXMoKS5zZXQocHJvcGVydHksIHZhbHVlKTsKLSAgICByZXR1
cm4gaW1hZ2UucmVsZWFzZSgpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmNoZWNrRm9yWm9v
bUNoYW5nZShSZW5kZXJTdHlsZSogc3R5bGUsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSkKLXsK
LSAgICBpZiAoc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA9PSBwYXJlbnRTdHlsZS0+ZWZmZWN0aXZl
Wm9vbSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGNo
aWxkRm9udCA9IHN0eWxlLT5mb250RGVzY3JpcHRpb24oKTsKLSAgICBGb250RGVzY3JpcHRpb24g
bmV3Rm9udERlc2NyaXB0aW9uKGNoaWxkRm9udCk7Ci0gICAgc2V0Rm9udFNpemUobmV3Rm9udERl
c2NyaXB0aW9uLCBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgpKTsKLSAgICBzdHlsZS0+c2V0Rm9u
dERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZl
cjo6Y2hlY2tGb3JHZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0eWxlKiBzdHlsZSwgUmVuZGVy
U3R5bGUqIHBhcmVudFN0eWxlKQotewotICAgIGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgY2hpbGRG
b250ID0gc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOwotCi0gICAgaWYgKGNoaWxkRm9udC5pc0Fi
c29sdXRlU2l6ZSgpIHx8ICFwYXJlbnRTdHlsZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29u
c3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250ID0gcGFyZW50U3R5bGUtPmZvbnREZXNjcmlw
dGlvbigpOwotICAgIGlmIChjaGlsZEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpID09IHBhcmVu
dEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBG
b3Igbm93LCBsdW1wIGFsbCBmYW1pbGllcyBidXQgbW9ub3NwYWNlIHRvZ2V0aGVyLgotICAgIGlm
IChjaGlsZEZvbnQuZ2VuZXJpY0ZhbWlseSgpICE9IEZvbnREZXNjcmlwdGlvbjo6TW9ub3NwYWNl
RmFtaWx5Ci0gICAgICAgICYmIHBhcmVudEZvbnQuZ2VuZXJpY0ZhbWlseSgpICE9IEZvbnREZXNj
cmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBr
bm93IHRoZSBwYXJlbnQgaXMgbW9ub3NwYWNlIG9yIHRoZSBjaGlsZCBpcyBtb25vc3BhY2UsIGFu
ZCB0aGF0IGZvbnQKLSAgICAvLyBzaXplIHdhcyB1bnNwZWNpZmllZC4gV2Ugd2FudCB0byBzY2Fs
ZSBvdXIgZm9udCBzaXplIGFzIGFwcHJvcHJpYXRlLgotICAgIC8vIElmIHRoZSBmb250IHVzZXMg
YSBrZXl3b3JkIHNpemUsIHRoZW4gd2UgcmVmZXRjaCBmcm9tIHRoZSB0YWJsZSByYXRoZXIgdGhh
bgotICAgIC8vIG11bHRpcGx5aW5nIGJ5IG91ciBzY2FsZSBmYWN0b3IuCi0gICAgZmxvYXQgc2l6
ZTsKLSAgICBpZiAoY2hpbGRGb250LmtleXdvcmRTaXplKCkpCi0gICAgICAgIHNpemUgPSBmb250
U2l6ZUZvcktleXdvcmQoZG9jdW1lbnQoKSwgQ1NTVmFsdWVYeFNtYWxsICsgY2hpbGRGb250Lmtl
eXdvcmRTaXplKCkgLSAxLCBjaGlsZEZvbnQudXNlRml4ZWREZWZhdWx0U2l6ZSgpKTsKLSAgICBl
bHNlIHsKLSAgICAgICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnRTZXR0aW5ncygpOwot
ICAgICAgICBmbG9hdCBmaXhlZFNjYWxlRmFjdG9yID0gKHNldHRpbmdzICYmIHNldHRpbmdzLT5k
ZWZhdWx0Rml4ZWRGb250U2l6ZSgpICYmIHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSkKLSAg
ICAgICAgICAgID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250
U2l6ZSgpKSAvIHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKQotICAgICAgICAgICAgOiAxOwot
ICAgICAgICBzaXplID0gcGFyZW50Rm9udC51c2VGaXhlZERlZmF1bHRTaXplKCkgPwotICAgICAg
ICAgICAgICAgIGNoaWxkRm9udC5zcGVjaWZpZWRTaXplKCkgLyBmaXhlZFNjYWxlRmFjdG9yIDoK
LSAgICAgICAgICAgICAgICBjaGlsZEZvbnQuc3BlY2lmaWVkU2l6ZSgpICogZml4ZWRTY2FsZUZh
Y3RvcjsKLSAgICB9Ci0KLSAgICBGb250RGVzY3JpcHRpb24gbmV3Rm9udERlc2NyaXB0aW9uKGNo
aWxkRm9udCk7Ci0gICAgc2V0Rm9udFNpemUobmV3Rm9udERlc2NyaXB0aW9uLCBzaXplKTsKLSAg
ICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKG5ld0ZvbnREZXNjcmlwdGlvbik7Ci19Ci0KLXZv
aWQgU3R5bGVSZXNvbHZlcjo6aW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5ncyogc2V0dGluZ3Mp
Ci17Ci0gICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbjsKLSAgICBmb250RGVzY3Jp
cHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246OlN0YW5kYXJkRmFtaWx5KTsK
LSAgICBmb250RGVzY3JpcHRpb24uc2V0UmVuZGVyaW5nTW9kZShzZXR0aW5ncy0+Zm9udFJlbmRl
cmluZ01vZGUoKSk7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNldFVzZVByaW50ZXJGb250KGRvY3Vt
ZW50KCktPnByaW50aW5nKCkgfHwgIXNldHRpbmdzLT5zY3JlZW5Gb250U3Vic3RpdHV0aW9uRW5h
YmxlZCgpKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIHN0YW5kYXJkRm9udEZhbWlseSA9IGRv
Y3VtZW50U2V0dGluZ3MoKS0+c3RhbmRhcmRGb250RmFtaWx5KCk7Ci0gICAgaWYgKCFzdGFuZGFy
ZEZvbnRGYW1pbHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZh
bWlseSgpLnNldEZhbWlseShzdGFuZGFyZEZvbnRGYW1pbHkpOwotICAgICAgICBmb250RGVzY3Jp
cHRpb24uZmlyc3RGYW1pbHkoKS5hcHBlbmRGYW1pbHkoMCk7Ci0gICAgfQotICAgIGZvbnREZXNj
cmlwdGlvbi5zZXRLZXl3b3JkU2l6ZShDU1NWYWx1ZU1lZGl1bSAtIENTU1ZhbHVlWHhTbWFsbCAr
IDEpOwotICAgIHNldEZvbnRTaXplKGZvbnREZXNjcmlwdGlvbiwgZm9udFNpemVGb3JLZXl3b3Jk
KGRvY3VtZW50KCksIENTU1ZhbHVlTWVkaXVtLCBmYWxzZSkpOwotICAgIG1fc3RhdGUuc3R5bGUo
KS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExpbmVIZWlnaHQoKSk7Ci0gICAg
bV9zdGF0ZS5zZXRMaW5lSGVpZ2h0VmFsdWUoMCk7Ci0gICAgc2V0Rm9udERlc2NyaXB0aW9uKGZv
bnREZXNjcmlwdGlvbik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6c2V0Rm9udFNpemUoRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGZsb2F0IHNpemUpCi17Ci0gICAgZm9udERl
c2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoc2l6ZSk7Ci0gICAgZm9udERlc2NyaXB0aW9uLnNl
dENvbXB1dGVkU2l6ZShnZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShkb2N1bWVudCgp
LCBtX3N0YXRlLnN0eWxlKCksIGZvbnREZXNjcmlwdGlvbi5pc0Fic29sdXRlU2l6ZSgpLCBzaXpl
LCB1c2VTVkdab29tUnVsZXMoKSkpOwotfQotCi1mbG9hdCBTdHlsZVJlc29sdmVyOjpnZXRDb21w
dXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCogZG9jdW1lbnQsIFJlbmRlclN0eWxl
KiBzdHlsZSwgYm9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgYm9vbCB1
c2VTVkdab29tUnVsZXMpCi17Ci0gICAgZmxvYXQgem9vbUZhY3RvciA9IDEuMGY7Ci0gICAgaWYg
KCF1c2VTVkdab29tUnVsZXMpIHsKLSAgICAgICAgem9vbUZhY3RvciA9IHN0eWxlLT5lZmZlY3Rp
dmVab29tKCk7Ci0gICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudC0+ZnJhbWUoKSkK
LSAgICAgICAgICAgIHpvb21GYWN0b3IgKj0gZnJhbWUtPnRleHRab29tRmFjdG9yKCk7Ci0gICAg
fQotCi0gICAgcmV0dXJuIFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZp
ZWRTaXplKGRvY3VtZW50LCB6b29tRmFjdG9yLCBpc0Fic29sdXRlU2l6ZSwgc3BlY2lmaWVkU2l6
ZSk7Ci19Ci0KLWZsb2F0IFN0eWxlUmVzb2x2ZXI6OmdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZp
ZWRTaXplKERvY3VtZW50KiBkb2N1bWVudCwgZmxvYXQgem9vbUZhY3RvciwgYm9vbCBpc0Fic29s
dXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHVz
ZVNtYXJ0TWluaW11bUZvckZvbnRTaXplKQotewotICAgIC8vIFRleHQgd2l0aCBhIDBweCBmb250
IHNpemUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIGFuZCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUKLSAg
ICAvLyBleGVtcHQgZnJvbSBtaW5pbXVtIGZvbnQgc2l6ZSBydWxlcy4gQWNpZDMgcmVsaWVzIG9u
IHRoaXMgZm9yIHBpeGVsLXBlcmZlY3QKLSAgICAvLyByZW5kZXJpbmcuIFRoaXMgaXMgYWxzbyBj
b21wYXRpYmxlIHdpdGggb3RoZXIgYnJvd3NlcnMgdGhhdCBoYXZlIG1pbmltdW0KLSAgICAvLyBm
b250IHNpemUgc2V0dGluZ3MgKGUuZy4gRmlyZWZveCkuCi0gICAgaWYgKGZhYnNmKHNwZWNpZmll
ZFNpemUpIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKSkKLSAgICAgICAg
cmV0dXJuIDAuMGY7Ci0KLSAgICAvLyBXZSBzdXBwb3J0IHR3byB0eXBlcyBvZiBtaW5pbXVtIGZv
bnQgc2l6ZS4gVGhlIGZpcnN0IGlzIGEgaGFyZCBvdmVycmlkZSB0aGF0IGFwcGxpZXMgdG8KLSAg
ICAvLyBhbGwgZm9udHMuIFRoaXMgaXMgIm1pblNpemUuIiBUaGUgc2Vjb25kIHR5cGUgb2YgbWlu
aW11bSBmb250IHNpemUgaXMgYSAic21hcnQgbWluaW11bSIKLSAgICAvLyB0aGF0IGlzIGFwcGxp
ZWQgb25seSB3aGVuIHRoZSBXZWIgcGFnZSBjYW4ndCBrbm93IHdoYXQgc2l6ZSBpdCByZWFsbHkg
YXNrZWQgZm9yLCBlLmcuLAotICAgIC8vIHdoZW4gaXQgdXNlcyBsb2dpY2FsIHNpemVzIGxpa2Ug
InNtYWxsIiBvciBleHByZXNzZXMgdGhlIGZvbnQtc2l6ZSBhcyBhIHBlcmNlbnRhZ2Ugb2YKLSAg
ICAvLyB0aGUgdXNlcidzIGRlZmF1bHQgZm9udCBzZXR0aW5nLgotCi0gICAgLy8gV2l0aCB0aGUg
c21hcnQgbWluaW11bSwgd2UgbmV2ZXIgd2FudCB0byBnZXQgc21hbGxlciB0aGFuIHRoZSBtaW5p
bXVtIGZvbnQgc2l6ZSB0byBrZWVwIGZvbnRzIHJlYWRhYmxlLgotICAgIC8vIEhvd2V2ZXIgd2Ug
YWx3YXlzIGFsbG93IHRoZSBwYWdlIHRvIHNldCBhbiBleHBsaWNpdCBwaXhlbCBzaXplIHRoYXQg
aXMgc21hbGxlciwKLSAgICAvLyBzaW5jZSBzaXRlcyB3aWxsIG1pcy1yZW5kZXIgb3RoZXJ3aXNl
IChlLmcuLCBodHRwOi8vd3d3LmdhbWVzcG90LmNvbSB3aXRoIGEgOXB4IG1pbmltdW0pLgotCi0g
ICAgU2V0dGluZ3MqIHNldHRpbmdzID0gZG9jdW1lbnQtPnNldHRpbmdzKCk7Ci0gICAgaWYgKCFz
ZXR0aW5ncykKLSAgICAgICAgcmV0dXJuIDEuMGY7Ci0KLSAgICBpbnQgbWluU2l6ZSA9IHNldHRp
bmdzLT5taW5pbXVtRm9udFNpemUoKTsKLSAgICBpbnQgbWluTG9naWNhbFNpemUgPSBzZXR0aW5n
cy0+bWluaW11bUxvZ2ljYWxGb250U2l6ZSgpOwotICAgIGZsb2F0IHpvb21lZFNpemUgPSBzcGVj
aWZpZWRTaXplICogem9vbUZhY3RvcjsKLQotICAgIC8vIEFwcGx5IHRoZSBoYXJkIG1pbmltdW0g
Zmlyc3QuIFdlIG9ubHkgYXBwbHkgdGhlIGhhcmQgbWluaW11bSBpZiBhZnRlciB6b29taW5nIHdl
J3JlIHN0aWxsIHRvbyBzbWFsbC4KLSAgICBpZiAoem9vbWVkU2l6ZSA8IG1pblNpemUpCi0gICAg
ICAgIHpvb21lZFNpemUgPSBtaW5TaXplOwotCi0gICAgLy8gTm93IGFwcGx5IHRoZSAic21hcnQg
bWluaW11bS4iIFRoaXMgbWluaW11bSBpcyBhbHNvIG9ubHkgYXBwbGllZCBpZiB3ZSdyZSBzdGls
bCB0b28gc21hbGwKLSAgICAvLyBhZnRlciB6b29taW5nLiBUaGUgZm9udCBzaXplIG11c3QgZWl0
aGVyIGJlIHJlbGF0aXZlIHRvIHRoZSB1c2VyIGRlZmF1bHQgb3IgdGhlIG9yaWdpbmFsIHNpemUK
LSAgICAvLyBtdXN0IGhhdmUgYmVlbiBhY2NlcHRhYmxlLiBJbiBvdGhlciB3b3Jkcywgd2Ugb25s
eSBhcHBseSB0aGUgc21hcnQgbWluaW11bSB3aGVuZXZlciB3ZSdyZSBwb3NpdGl2ZQotICAgIC8v
IGRvaW5nIHNvIHdvbid0IGRpc3J1cHQgdGhlIGxheW91dC4KLSAgICBpZiAodXNlU21hcnRNaW5p
bXVtRm9yRm9udFNpemUgJiYgem9vbWVkU2l6ZSA8IG1pbkxvZ2ljYWxTaXplICYmIChzcGVjaWZp
ZWRTaXplID49IG1pbkxvZ2ljYWxTaXplIHx8ICFpc0Fic29sdXRlU2l6ZSkpCi0gICAgICAgIHpv
b21lZFNpemUgPSBtaW5Mb2dpY2FsU2l6ZTsKLQotICAgIC8vIEFsc28gY2xhbXAgdG8gYSByZWFz
b25hYmxlIG1heGltdW0gdG8gcHJldmVudCBpbnNhbmUgZm9udCBzaXplcyBmcm9tIGNhdXNpbmcg
Y3Jhc2hlcyBvbiB2YXJpb3VzCi0gICAgLy8gcGxhdGZvcm1zIChJJ20gbG9va2luZyBhdCB5b3Us
IFdpbmRvd3MuKQotICAgIHJldHVybiBtaW4obWF4aW11bUFsbG93ZWRGb250U2l6ZSwgem9vbWVk
U2l6ZSk7Ci19Ci0KLWNvbnN0IGludCBmb250U2l6ZVRhYmxlTWF4ID0gMTY7Ci1jb25zdCBpbnQg
Zm9udFNpemVUYWJsZU1pbiA9IDk7Ci1jb25zdCBpbnQgdG90YWxLZXl3b3JkcyA9IDg7Ci0KLS8v
IFdpbklFL05hdjQgdGFibGUgZm9yIGZvbnQgc2l6ZXMuIERlc2lnbmVkIHRvIG1hdGNoIHRoZSBs
ZWdhY3kgZm9udCBtYXBwaW5nIHN5c3RlbSBvZiBIVE1MLgotc3RhdGljIGNvbnN0IGludCBxdWly
a3NGb250U2l6ZVRhYmxlW2ZvbnRTaXplVGFibGVNYXggLSBmb250U2l6ZVRhYmxlTWluICsgMV1b
dG90YWxLZXl3b3Jkc10gPQotewotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgIDksICAgIDEx
LCAgICAxNCwgICAgMTgsICAgIDI4IH0sCi0gICAgICB7IDksICAgIDksICAgICA5LCAgICAxMCwg
ICAgMTIsICAgIDE1LCAgICAyMCwgICAgMzEgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAg
IDExLCAgICAxMywgICAgMTcsICAgIDIyLCAgICAzNCB9LAotICAgICAgeyA5LCAgICA5LCAgICAx
MCwgICAgMTIsICAgIDE0LCAgICAxOCwgICAgMjQsICAgIDM3IH0sCi0gICAgICB7IDksICAgIDks
ICAgIDEwLCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNiwgICAgNDAgfSwgLy8gZml4ZWQgZm9u
dCBkZWZhdWx0ICgxMykKLSAgICAgIHsgOSwgICAgOSwgICAgMTEsICAgIDE0LCAgICAxNywgICAg
MjEsICAgIDI4LCAgICA0MiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAxMiwgICAgMTUsICAgIDE3
LCAgICAyMywgICAgMzAsICAgIDQ1IH0sCi0gICAgICB7IDksICAgMTAsICAgIDEzLCAgICAxNiwg
ICAgMTgsICAgIDI0LCAgICAzMiwgICAgNDggfSAvLyBwcm9wb3J0aW9uYWwgZm9udCBkZWZhdWx0
ICgxNikKLX07Ci0vLyBIVE1MICAgICAgIDEgICAgICAyICAgICAgMyAgICAgIDQgICAgICA1ICAg
ICAgNiAgICAgIDcKLS8vIENTUyAgeHhzICAgeHMgICAgIHMgICAgICBtICAgICAgbCAgICAgeGwg
ICAgIHh4bAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICAgICAgICAgICAgICAg
ICAgICAgIHVzZXIgcHJlZgotCi0vLyBTdHJpY3QgbW9kZSB0YWJsZSBtYXRjaGVzIE1hY0lFIGFu
ZCBNb3ppbGxhJ3Mgc2V0dGluZ3MgZXhhY3RseS4KLXN0YXRpYyBjb25zdCBpbnQgc3RyaWN0Rm9u
dFNpemVUYWJsZVtmb250U2l6ZVRhYmxlTWF4IC0gZm9udFNpemVUYWJsZU1pbiArIDFdW3RvdGFs
S2V5d29yZHNdID0KLXsKLSAgICAgIHsgOSwgICAgOSwgICAgIDksICAgICA5LCAgICAxMSwgICAg
MTQsICAgIDE4LCAgICAyNyB9LAotICAgICAgeyA5LCAgICA5LCAgICAgOSwgICAgMTAsICAgIDEy
LCAgICAxNSwgICAgMjAsICAgIDMwIH0sCi0gICAgICB7IDksICAgIDksICAgIDEwLCAgICAxMSwg
ICAgMTMsICAgIDE3LCAgICAyMiwgICAgMzMgfSwKLSAgICAgIHsgOSwgICAgOSwgICAgMTAsICAg
IDEyLCAgICAxNCwgICAgMTgsICAgIDI0LCAgICAzNiB9LAotICAgICAgeyA5LCAgIDEwLCAgICAx
MiwgICAgMTMsICAgIDE2LCAgICAyMCwgICAgMjYsICAgIDM5IH0sIC8vIGZpeGVkIGZvbnQgZGVm
YXVsdCAoMTMpCi0gICAgICB7IDksICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTcsICAgIDIxLCAg
ICAyOCwgICAgNDIgfSwKLSAgICAgIHsgOSwgICAxMCwgICAgMTMsICAgIDE1LCAgICAxOCwgICAg
MjMsICAgIDMwLCAgICA0NSB9LAotICAgICAgeyA5LCAgIDEwLCAgICAxMywgICAgMTYsICAgIDE4
LCAgICAyNCwgICAgMzIsICAgIDQ4IH0gLy8gcHJvcG9ydGlvbmFsIGZvbnQgZGVmYXVsdCAoMTYp
Ci19OwotLy8gSFRNTCAgICAgICAxICAgICAgMiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgIDYg
ICAgICA3Ci0vLyBDU1MgIHh4cyAgIHhzICAgICBzICAgICAgbSAgICAgIGwgICAgIHhsICAgICB4
eGwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAg
ICB1c2VyIHByZWYKLQotLy8gRm9yIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgdGFi
bGUsIHdlIHVzZSBUb2RkIEZhaHJuZXIncyBzdWdnZXN0ZWQgc2NhbGUKLS8vIGZhY3RvcnMgZm9y
IGVhY2gga2V5d29yZCB2YWx1ZS4KLXN0YXRpYyBjb25zdCBmbG9hdCBmb250U2l6ZUZhY3RvcnNb
dG90YWxLZXl3b3Jkc10gPSB7IDAuNjBmLCAwLjc1ZiwgMC44OWYsIDEuMGYsIDEuMmYsIDEuNWYs
IDIuMGYsIDMuMGYgfTsKLQotZmxvYXQgU3R5bGVSZXNvbHZlcjo6Zm9udFNpemVGb3JLZXl3b3Jk
KERvY3VtZW50KiBkb2N1bWVudCwgaW50IGtleXdvcmQsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZh
dWx0U2l6ZSkKLXsKLSAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+c2V0dGluZ3Mo
KTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICByZXR1cm4gMS4wZjsKLQotICAgIGJvb2wg
cXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01vZGUoKTsKLSAgICBpbnQgbWVkaXVtU2l6
ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBzZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9u
dFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKTsKLSAgICBpZiAobWVkaXVtU2l6
ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNpemUgPD0gZm9udFNpemVUYWJsZU1heCkg
ewotICAgICAgICAvLyBMb29rIHVwIHRoZSBlbnRyeSBpbiB0aGUgdGFibGUuCi0gICAgICAgIGlu
dCByb3cgPSBtZWRpdW1TaXplIC0gZm9udFNpemVUYWJsZU1pbjsKLSAgICAgICAgaW50IGNvbCA9
IChrZXl3b3JkIC0gQ1NTVmFsdWVYeFNtYWxsKTsKLSAgICAgICAgcmV0dXJuIHF1aXJrc01vZGUg
PyBxdWlya3NGb250U2l6ZVRhYmxlW3Jvd11bY29sXSA6IHN0cmljdEZvbnRTaXplVGFibGVbcm93
XVtjb2xdOwotICAgIH0KLQotICAgIC8vIFZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRo
ZSB0YWJsZS4gQXBwbHkgdGhlIHNjYWxlIGZhY3RvciBpbnN0ZWFkLgotICAgIGZsb2F0IG1pbkxv
Z2ljYWxTaXplID0gbWF4KHNldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCksIDEpOwot
ICAgIHJldHVybiBtYXgoZm9udFNpemVGYWN0b3JzW2tleXdvcmQgLSBDU1NWYWx1ZVh4U21hbGxd
Km1lZGl1bVNpemUsIG1pbkxvZ2ljYWxTaXplKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4K
LXN0YXRpYyBpbnQgZmluZE5lYXJlc3RMZWdhY3lGb250U2l6ZShpbnQgcGl4ZWxGb250U2l6ZSwg
Y29uc3QgVCogdGFibGUsIGludCBtdWx0aXBsaWVyKQotewotICAgIC8vIElnbm9yZSB0YWJsZVsw
XSBiZWNhdXNlIHh4LXNtYWxsIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IGxlZ2FjeSBmb250
IHNpemUuCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0b3RhbEtleXdvcmRzIC0gMTsgaSsrKSB7
Ci0gICAgICAgIGlmIChwaXhlbEZvbnRTaXplICogMiA8ICh0YWJsZVtpXSArIHRhYmxlW2kgKyAx
XSkgKiBtdWx0aXBsaWVyKQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIHJldHVy
biB0b3RhbEtleXdvcmRzIC0gMTsKLX0KLQotaW50IFN0eWxlUmVzb2x2ZXI6OmxlZ2FjeUZvbnRT
aXplKERvY3VtZW50KiBkb2N1bWVudCwgaW50IHBpeGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNl
Rml4ZWREZWZhdWx0U2l6ZSkKLXsKLSAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudC0+
c2V0dGluZ3MoKTsKLSAgICBpZiAoIXNldHRpbmdzKQotICAgICAgICByZXR1cm4gMTsKLQotICAg
IGJvb2wgcXVpcmtzTW9kZSA9IGRvY3VtZW50LT5pblF1aXJrc01vZGUoKTsKLSAgICBpbnQgbWVk
aXVtU2l6ZSA9IHNob3VsZFVzZUZpeGVkRGVmYXVsdFNpemUgPyBzZXR0aW5ncy0+ZGVmYXVsdEZp
eGVkRm9udFNpemUoKSA6IHNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKTsKLSAgICBpZiAobWVk
aXVtU2l6ZSA+PSBmb250U2l6ZVRhYmxlTWluICYmIG1lZGl1bVNpemUgPD0gZm9udFNpemVUYWJs
ZU1heCkgewotICAgICAgICBpbnQgcm93ID0gbWVkaXVtU2l6ZSAtIGZvbnRTaXplVGFibGVNaW47
Ci0gICAgICAgIHJldHVybiBmaW5kTmVhcmVzdExlZ2FjeUZvbnRTaXplPGludD4ocGl4ZWxGb250
U2l6ZSwgcXVpcmtzTW9kZSA/IHF1aXJrc0ZvbnRTaXplVGFibGVbcm93XSA6IHN0cmljdEZvbnRT
aXplVGFibGVbcm93XSwgMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbmROZWFyZXN0TGVnYWN5
Rm9udFNpemU8ZmxvYXQ+KHBpeGVsRm9udFNpemUsIGZvbnRTaXplRmFjdG9ycywgbWVkaXVtU2l6
ZSk7Ci19Ci0KLXN0YXRpYyBDb2xvciBjb2xvckZvckNTU1ZhbHVlKGludCBjc3NWYWx1ZUlkKQot
ewotICAgIHN0cnVjdCBDb2xvclZhbHVlIHsKLSAgICAgICAgaW50IGNzc1ZhbHVlSWQ7Ci0gICAg
ICAgIFJHQkEzMiBjb2xvcjsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IENvbG9yVmFsdWUg
Y29sb3JWYWx1ZXNbXSA9IHsKLSAgICAgICAgeyBDU1NWYWx1ZUFxdWEsIDB4RkYwMEZGRkYgfSwK
LSAgICAgICAgeyBDU1NWYWx1ZUJsYWNrLCAweEZGMDAwMDAwIH0sCi0gICAgICAgIHsgQ1NTVmFs
dWVCbHVlLCAweEZGMDAwMEZGIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVGdWNoc2lhLCAweEZGRkYw
MEZGIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVHcmF5LCAweEZGODA4MDgwIH0sCi0gICAgICAgIHsg
Q1NTVmFsdWVHcmVlbiwgMHhGRjAwODAwMCAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUdyZXksIDB4
RkY4MDgwODAgfSwKLSAgICAgICAgeyBDU1NWYWx1ZUxpbWUsIDB4RkYwMEZGMDAgfSwKLSAgICAg
ICAgeyBDU1NWYWx1ZU1hcm9vbiwgMHhGRjgwMDAwMCB9LAotICAgICAgICB7IENTU1ZhbHVlTmF2
eSwgMHhGRjAwMDA4MCB9LAotICAgICAgICB7IENTU1ZhbHVlT2xpdmUsIDB4RkY4MDgwMDAgIH0s
Ci0gICAgICAgIHsgQ1NTVmFsdWVPcmFuZ2UsIDB4RkZGRkE1MDAgfSwKLSAgICAgICAgeyBDU1NW
YWx1ZVB1cnBsZSwgMHhGRjgwMDA4MCB9LAotICAgICAgICB7IENTU1ZhbHVlUmVkLCAweEZGRkYw
MDAwIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVTaWx2ZXIsIDB4RkZDMEMwQzAgfSwKLSAgICAgICAg
eyBDU1NWYWx1ZVRlYWwsIDB4RkYwMDgwODAgIH0sCi0gICAgICAgIHsgQ1NTVmFsdWVUcmFuc3Bh
cmVudCwgMHgwMDAwMDAwMCB9LAotICAgICAgICB7IENTU1ZhbHVlV2hpdGUsIDB4RkZGRkZGRkYg
fSwKLSAgICAgICAgeyBDU1NWYWx1ZVllbGxvdywgMHhGRkZGRkYwMCB9LAotICAgICAgICB7IDAs
IDAgfQotICAgIH07Ci0KLSAgICBmb3IgKGNvbnN0IENvbG9yVmFsdWUqIGNvbCA9IGNvbG9yVmFs
dWVzOyBjb2wtPmNzc1ZhbHVlSWQ7ICsrY29sKSB7Ci0gICAgICAgIGlmIChjb2wtPmNzc1ZhbHVl
SWQgPT0gY3NzVmFsdWVJZCkKLSAgICAgICAgICAgIHJldHVybiBjb2wtPmNvbG9yOwotICAgIH0K
LSAgICByZXR1cm4gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5zeXN0ZW1Db2xvcihjc3NW
YWx1ZUlkKTsKLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpjb2xvckZyb21QcmltaXRpdmVWYWx1
ZUlzRGVyaXZlZEZyb21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVlKiB2YWx1ZSkKLXsKLSAgICBp
bnQgaWRlbnQgPSB2YWx1ZS0+Z2V0SWRlbnQoKTsKLSAgICBzd2l0Y2ggKGlkZW50KSB7Ci0gICAg
Y2FzZSBDU1NWYWx1ZVdlYmtpdFRleHQ6Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdExpbms6Ci0g
ICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxpbms6Ci0gICAgY2FzZSBDU1NWYWx1ZUN1cnJl
bnRjb2xvcjoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLX0KLQotQ29sb3IgU3R5bGVSZXNvbHZlcjo6Y29sb3JGcm9tUHJp
bWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqIHZhbHVlLCBib29sIGZvclZpc2l0ZWRMaW5r
KSBjb25zdAotewotICAgIGlmICh2YWx1ZS0+aXNSR0JDb2xvcigpKQotICAgICAgICByZXR1cm4g
Q29sb3IodmFsdWUtPmdldFJHQkEzMlZhbHVlKCkpOwotCi0gICAgY29uc3QgU3RhdGUmIHN0YXRl
ID0gbV9zdGF0ZTsKLSAgICBpbnQgaWRlbnQgPSB2YWx1ZS0+Z2V0SWRlbnQoKTsKLSAgICBzd2l0
Y2ggKGlkZW50KSB7Ci0gICAgY2FzZSAwOgotICAgICAgICByZXR1cm4gQ29sb3IoKTsKLSAgICBj
YXNlIENTU1ZhbHVlV2Via2l0VGV4dDoKLSAgICAgICAgcmV0dXJuIHN0YXRlLmRvY3VtZW50KCkt
PnRleHRDb2xvcigpOwotICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRMaW5rOgotICAgICAgICByZXR1
cm4gKHN0YXRlLmVsZW1lbnQoKS0+aXNMaW5rKCkgJiYgZm9yVmlzaXRlZExpbmspID8gc3RhdGUu
ZG9jdW1lbnQoKS0+dmlzaXRlZExpbmtDb2xvcigpIDogc3RhdGUuZG9jdW1lbnQoKS0+bGlua0Nv
bG9yKCk7Ci0gICAgY2FzZSBDU1NWYWx1ZVdlYmtpdEFjdGl2ZWxpbms6Ci0gICAgICAgIHJldHVy
biBzdGF0ZS5kb2N1bWVudCgpLT5hY3RpdmVMaW5rQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVl
V2Via2l0Rm9jdXNSaW5nQ29sb3I6Ci0gICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6Zm9jdXNS
aW5nQ29sb3IoKTsKLSAgICBjYXNlIENTU1ZhbHVlQ3VycmVudGNvbG9yOgotICAgICAgICByZXR1
cm4gc3RhdGUuc3R5bGUoKS0+Y29sb3IoKTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4g
Y29sb3JGb3JDU1NWYWx1ZShpZGVudCk7Ci0gICAgfQotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
OmFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhw
KiBleHByLCBib29sIHJlc3VsdCkKLXsKLSAgICBtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVy
eVJlc3VsdHMuYXBwZW5kKGFkb3B0UHRyKG5ldyBNZWRpYVF1ZXJ5UmVzdWx0KCpleHByLCByZXN1
bHQpKSk7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6YWZmZWN0ZWRCeVZpZXdwb3J0Q2hhbmdl
KCkgY29uc3QKLXsKLSAgICB1bnNpZ25lZCBzID0gbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cnlSZXN1bHRzLnNpemUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgczsgaSsrKSB7
Ci0gICAgICAgIGlmIChtX21lZGl1bS0+ZXZhbCgmbV92aWV3cG9ydERlcGVuZGVudE1lZGlhUXVl
cnlSZXN1bHRzW2ldLT5tX2V4cHJlc3Npb24pICE9IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1
ZXJ5UmVzdWx0c1tpXS0+bV9yZXN1bHQpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgVHJhbnNmb3JtT3BlcmF0aW9uOjpPcGVy
YXRpb25UeXBlIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUoV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlRyYW5zZm9ybU9wZXJhdGlvblR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsK
LSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVRyYW5zZm9ybU9wZXJhdGlv
bjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NU
cmFuc2Zvcm1WYWx1ZTo6U2NhbGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3Jt
T3BlcmF0aW9uOjpTQ0FMRV9YOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNj
YWxlWVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVf
WTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVpUcmFuc2Zvcm1PcGVy
YXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNDQUxFX1o7Ci0gICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRy
YW5zZm9ybU9wZXJhdGlvbjo6U0NBTEVfM0Q7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6VHJhbnNsYXRlVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0
aW9uOjpUUkFOU0xBVEU7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNs
YXRlWFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNM
QVRFX1g7Ci0gICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5z
Zm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1k7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWlRyYW5zZm9ybU9wZXJh
dGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6VFJBTlNMQVRFX1o7Ci0gICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246IHJl
dHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlRSQU5TTEFURV8zRDsKLSAgICBjYXNlIFdlYktpdENT
U1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zv
cm1PcGVyYXRpb246OlJPVEFURTsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpS
b3RhdGVYVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RB
VEVfWDsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVZVHJhbnNmb3Jt
T3BlcmF0aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWTsKLSAgICBjYXNl
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVaVHJhbnNmb3JtT3BlcmF0aW9uOiByZXR1
cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpST1RBVEVfWjsKLSAgICBjYXNlIFdlYktpdENTU1RyYW5z
Zm9ybVZhbHVlOjpSb3RhdGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6Uk9UQVRFXzNEOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNr
ZXdUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVc7Ci0g
ICAgY2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1hUcmFuc2Zvcm1PcGVyYXRpb246
IHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246OlNLRVdfWDsKLSAgICBjYXNlIFdlYktpdENTU1Ry
YW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9w
ZXJhdGlvbjo6U0tFV19ZOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJp
eFRyYW5zZm9ybU9wZXJhdGlvbjogcmV0dXJuIFRyYW5zZm9ybU9wZXJhdGlvbjo6TUFUUklYOwot
ICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0
aW9uOiByZXR1cm4gVHJhbnNmb3JtT3BlcmF0aW9uOjpNQVRSSVhfM0Q7Ci0gICAgY2FzZSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6UGVyc3BlY3RpdmVUcmFuc2Zvcm1PcGVyYXRpb246IHJldHVy
biBUcmFuc2Zvcm1PcGVyYXRpb246OlBFUlNQRUNUSVZFOwotICAgIGNhc2UgV2ViS2l0Q1NTVHJh
bnNmb3JtVmFsdWU6OlVua25vd25UcmFuc2Zvcm1PcGVyYXRpb246IHJldHVybiBUcmFuc2Zvcm1P
cGVyYXRpb246Ok5PTkU7Ci0gICAgfQotICAgIHJldHVybiBUcmFuc2Zvcm1PcGVyYXRpb246Ok5P
TkU7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6Y3JlYXRlVHJhbnNmb3JtT3BlcmF0aW9ucyhD
U1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0
eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKQotewotICAgIGlmICghaW5W
YWx1ZSB8fCAhaW5WYWx1ZS0+aXNWYWx1ZUxpc3QoKSkgewotICAgICAgICBvdXRPcGVyYXRpb25z
LmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmbG9hdCB6b29t
RmFjdG9yID0gc3R5bGUgPyBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpIDogMTsKLSAgICBUcmFuc2Zv
cm1PcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgZm9yIChDU1NWYWx1ZUxpc3RJdGVyYXRvciBp
ID0gaW5WYWx1ZTsgaS5oYXNNb3JlKCk7IGkuYWR2YW5jZSgpKSB7Ci0gICAgICAgIENTU1ZhbHVl
KiBjdXJyVmFsdWUgPSBpLnZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKCFjdXJyVmFsdWUtPmlzV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWUoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAg
IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlKiB0cmFuc2Zvcm1WYWx1ZSA9IHN0YXRpY19jYXN0PFdl
YktpdENTU1RyYW5zZm9ybVZhbHVlKj4oaS52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCF0cmFuc2Zv
cm1WYWx1ZS0+bGVuZ3RoKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBib29s
IGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IGZhbHNlOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGog
PSAwOyBqIDwgdHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpOyArK2opIHsKLSAgICAgICAgICAgIGlm
ICghdHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soaiktPmlzUHJpbWl0aXZl
VmFsdWUoKSkgewotICAgICAgICAgICAgICAgIGhhdmVOb25QcmltaXRpdmVWYWx1ZSA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1ZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0g
ICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7
Ci0KLSAgICAgICAgc3dpdGNoICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9uVHlwZSgpKSB7Ci0g
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlVHJhbnNmb3JtT3BlcmF0
aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zv
cm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxl
WVRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIHN4ID0gMS4wOwotICAg
ICAgICAgICAgZG91YmxlIHN5ID0gMS4wOwotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVl
LT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWVRyYW5z
Zm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzeSA9IGZpcnN0VmFsdWUtPmdldERvdWJs
ZVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeCA9IGZpcnN0
VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZh
bHVlLT5vcGVyYXRpb25UeXBlKCkgIT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWFRy
YW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBzeSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAg
ICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gc3g7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKFNjYWxlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoc3gsIHN5LCAxLjAs
IGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUo
KSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0
Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxlWlRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2Fz
ZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2NhbGUzRFRyYW5zZm9ybU9wZXJhdGlvbjogewot
ICAgICAgICAgICAgZG91YmxlIHN4ID0gMS4wOwotICAgICAgICAgICAgZG91YmxlIHN5ID0gMS4w
OwotICAgICAgICAgICAgZG91YmxlIHN6ID0gMS4wOwotICAgICAgICAgICAgaWYgKHRyYW5zZm9y
bVZhbHVlLT5vcGVyYXRpb25UeXBlKCkgPT0gV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNjYWxl
WlRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzeiA9IGZpcnN0VmFsdWUtPmdl
dERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVlUcmFuc2Zvcm1P
cGVyYXRpb24pCi0gICAgICAgICAgICAgICAgc3kgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1
ZSgpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3ggPSBmaXJzdFZhbHVl
LT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+
b3BlcmF0aW9uVHlwZSgpICE9IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTY2FsZVhUcmFuc2Zv
cm1PcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5s
ZW5ndGgoKSA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVl
KiB0aGlyZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1W
YWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBzeiA9IHRoaXJkVmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1
ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSBzZWNv
bmRWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHN4OwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChTY2Fs
ZVRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKHN4LCBzeSwgc3osIGdldFRyYW5zZm9ybU9wZXJh
dGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6
OlRyYW5zbGF0ZVRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NUcmFu
c2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbjogewot
ICAgICAgICAgICAgTGVuZ3RoIHR4ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAgIExl
bmd0aCB0eSA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFs
dWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRl
WVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0
TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0aChm
aXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAg
ICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zv
cm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAg
ICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAg
ICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygx
KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKHNl
Y29uZFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKHR4LmlzVW5kZWZpbmVkKCkgfHwgdHkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFw
cGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh0eCwgdHksIExlbmd0aCgw
LCBGaXhlZCksIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246
Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlRyYW5zbGF0ZTNEVHJhbnNm
b3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5ndGggdHggPSBMZW5ndGgoMCwgRml4ZWQp
OwotICAgICAgICAgICAgTGVuZ3RoIHR5ID0gTGVuZ3RoKDAsIEZpeGVkKTsKLSAgICAgICAgICAg
IExlbmd0aCB0eiA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3Jt
VmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNs
YXRlWlRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB0eiA9IGNvbnZlcnRUb0Zs
b2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAg
ICAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJL
aXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAg
ICAgICAgICAgICB0eSA9IGNvbnZlcnRUb0Zsb2F0TGVuZ3RoKGZpcnN0VmFsdWUsIHN0eWxlLCBy
b290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgdHggPSBjb252ZXJ0VG9GbG9hdExlbmd0aChmaXJzdFZhbHVlLCBzdHlsZSwgcm9vdFN0eWxl
LCB6b29tRmFjdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJh
dGlvblR5cGUoKSAhPSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6VHJhbnNsYXRlWFRyYW5zZm9y
bU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxl
bmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUq
IHRoaXJkVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZh
bHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHR6ID0gY29udmVydFRvRmxvYXRMZW5ndGgodGhpcmRWYWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwg
em9vbUZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
aWYgKHRyYW5zZm9ybVZhbHVlLT5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIENTU1ByaW1pdGl2ZVZhbHVlKiBzZWNvbmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1p
dGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSkpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBjb252ZXJ0VG9GbG9hdExlbmd0aChzZWNvbmRW
YWx1ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0
eC5pc1VuZGVmaW5lZCgpIHx8IHR5LmlzVW5kZWZpbmVkKCkgfHwgdHouaXNVbmRlZmluZWQoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChUcmFuc2xhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh0
eCwgdHksIHR6LCBnZXRUcmFuc2Zvcm1PcGVyYXRpb25UeXBlKHRyYW5zZm9ybVZhbHVlLT5vcGVy
YXRpb25UeXBlKCkpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246IHsK
LSAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7
Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNm
b3JtT3BlcmF0aW9uOjpjcmVhdGUoMCwgMCwgMSwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlv
blR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlJv
dGF0ZVhUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3Jt
VmFsdWU6OlJvdGF0ZVlUcmFuc2Zvcm1PcGVyYXRpb246Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NT
VHJhbnNmb3JtVmFsdWU6OlJvdGF0ZVpUcmFuc2Zvcm1PcGVyYXRpb246IHsKLSAgICAgICAgICAg
IGRvdWJsZSB4ID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSB5ID0gMDsKLSAgICAgICAgICAgIGRv
dWJsZSB6ID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFsdWUtPmNvbXB1
dGVEZWdyZWVzKCk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+b3BlcmF0aW9u
VHlwZSgpID09IFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpSb3RhdGVYVHJhbnNmb3JtT3BlcmF0
aW9uKQotICAgICAgICAgICAgICAgIHggPSAxOwotICAgICAgICAgICAgZWxzZSBpZiAodHJhbnNm
b3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90
YXRlWVRyYW5zZm9ybU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICB6ID0gMTsKLSAgICAgICAgICAgIG9wZXJhdGlvbnMu
b3BlcmF0aW9ucygpLmFwcGVuZChSb3RhdGVUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZSh4LCB5
LCB6LCBhbmdsZSwgZ2V0VHJhbnNmb3JtT3BlcmF0aW9uVHlwZSh0cmFuc2Zvcm1WYWx1ZS0+b3Bl
cmF0aW9uVHlwZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6Um90YXRlM0RUcmFuc2Zvcm1PcGVyYXRpb246
IHsKLSAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZS0+bGVuZ3RoKCkgPCA0KQotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZh
bHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
dGhpcmRWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMikpOwotICAgICAgICAgICAgQ1NTUHJpbWl0aXZl
VmFsdWUqIGZvdXJ0aFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSk7Ci0gICAgICAgICAgICBkb3Vi
bGUgeCA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUg
eSA9IHNlY29uZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIHog
PSB0aGlyZFZhbHVlLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91YmxlIGFuZ2xl
ID0gZm91cnRoVmFsdWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25z
Lm9wZXJhdGlvbnMoKS5hcHBlbmQoUm90YXRlVHJhbnNmb3JtT3BlcmF0aW9uOjpjcmVhdGUoeCwg
eSwgeiwgYW5nbGUsIGdldFRyYW5zZm9ybU9wZXJhdGlvblR5cGUodHJhbnNmb3JtVmFsdWUtPm9w
ZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAg
IGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdUcmFuc2Zvcm1PcGVyYXRpb246Ci0g
ICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlNrZXdYVHJhbnNmb3JtT3BlcmF0
aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU1RyYW5zZm9ybVZhbHVlOjpTa2V3WVRyYW5zZm9y
bU9wZXJhdGlvbjogewotICAgICAgICAgICAgZG91YmxlIGFuZ2xlWCA9IDA7Ci0gICAgICAgICAg
ICBkb3VibGUgYW5nbGVZID0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGZpcnN0VmFs
dWUtPmNvbXB1dGVEZWdyZWVzKCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPm9w
ZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZTo6U2tld1lUcmFuc2Zvcm1P
cGVyYXRpb24pCi0gICAgICAgICAgICAgICAgYW5nbGVZID0gYW5nbGU7Ci0gICAgICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgICAgICBhbmdsZVggPSBhbmdsZTsKLSAgICAgICAgICAgICAgICBp
ZiAodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSA9PSBXZWJLaXRDU1NUcmFuc2Zvcm1W
YWx1ZTo6U2tld1RyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAo
dHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
Q1NTUHJpbWl0aXZlVmFsdWUqIHNlY29uZFZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxKSk7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBhbmdsZVkgPSBzZWNvbmRWYWx1ZS0+Y29tcHV0ZURlZ3JlZXMo
KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChTa2V3VHJhbnNm
b3JtT3BlcmF0aW9uOjpjcmVhdGUoYW5nbGVYLCBhbmdsZVksIGdldFRyYW5zZm9ybU9wZXJhdGlv
blR5cGUodHJhbnNmb3JtVmFsdWUtPm9wZXJhdGlvblR5cGUoKSkpKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1h
dHJpeFRyYW5zZm9ybU9wZXJhdGlvbjogewotICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVl
LT5sZW5ndGgoKSA8IDYpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkb3Vi
bGUgYSA9IGZpcnN0VmFsdWUtPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBkb3VibGUg
YiA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1X
aXRob3V0Qm91bmRzQ2hlY2soMSkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgZG91
YmxlIGMgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDIpKS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAg
IGRvdWJsZSBkID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1
ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSktPmdldERvdWJsZVZhbHVlKCk7Ci0gICAgICAg
ICAgICBkb3VibGUgZSA9IHpvb21GYWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1
ZSo+KHRyYW5zZm9ybVZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDQpKS0+Z2V0RG91Ymxl
VmFsdWUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBmID0gem9vbUZhY3RvciAqIHN0YXRpY19jYXN0
PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hl
Y2soNSkpLT5nZXREb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRp
b25zKCkuYXBwZW5kKE1hdHJpeFRyYW5zZm9ybU9wZXJhdGlvbjo6Y3JlYXRlKGEsIGIsIGMsIGQs
IGUsIGYpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2Vi
S2l0Q1NTVHJhbnNmb3JtVmFsdWU6Ok1hdHJpeDNEVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAg
ICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWUtPmxlbmd0aCgpIDwgMTYpCi0gICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXgoc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3Vu
ZHNDaGVjaygwKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRl
bVdpdGhvdXRCb3VuZHNDaGVjaygxKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zv
cm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygyKSktPmdldERvdWJsZVZhbHVlKCksCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFs
dWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygzKSktPmdldERvdWJs
ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NT
UHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg0
KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRC
b3VuZHNDaGVjayg1KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+
aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg2KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg3KSktPmdldERvdWJsZVZhbHVlKCks
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjayg4KSktPmdldERv
dWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVj
ayg5KSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhv
dXRCb3VuZHNDaGVjaygxMCkpLT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVlKj4odHJhbnNmb3JtVmFs
dWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTEpKS0+Z2V0RG91YmxlVmFsdWUoKSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tRmFjdG9yICogc3RhdGljX2Nhc3Q8Q1NTUHJp
bWl0aXZlVmFsdWUqPih0cmFuc2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxMikp
LT5nZXREb3VibGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb21G
YWN0b3IgKiBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KHRyYW5zZm9ybVZhbHVlLT5p
dGVtV2l0aG91dEJvdW5kc0NoZWNrKDEzKSktPmdldERvdWJsZVZhbHVlKCksCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih0cmFu
c2Zvcm1WYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygxNCkpLT5nZXREb3VibGVWYWx1ZSgp
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2
ZVZhbHVlKj4odHJhbnNmb3JtVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMTUpKS0+Z2V0
RG91YmxlVmFsdWUoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMoKS5hcHBl
bmQoTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb246OmNyZWF0ZShtYXRyaXgpKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFs
dWU6OlBlcnNwZWN0aXZlVHJhbnNmb3JtT3BlcmF0aW9uOiB7Ci0gICAgICAgICAgICBMZW5ndGgg
cCA9IExlbmd0aCgwLCBGaXhlZCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZS0+aXNMZW5n
dGgoKSkKLSAgICAgICAgICAgICAgICBwID0gY29udmVydFRvRmxvYXRMZW5ndGgoZmlyc3RWYWx1
ZSwgc3R5bGUsIHJvb3RTdHlsZSwgem9vbUZhY3Rvcik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcXVpcmsgdGhhdCBzaG91bGQgZ28gYXdheSB3aGVu
IDNkIHRyYW5zZm9ybXMgYXJlIGZpbmFsaXplZC4KLSAgICAgICAgICAgICAgICBkb3VibGUgdmFs
ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBwID0gdmFs
ID49IDAgPyBMZW5ndGgoY2xhbXBUb1Bvc2l0aXZlSW50ZWdlcih2YWwpLCBGaXhlZCkgOiBMZW5n
dGgoVW5kZWZpbmVkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHAuaXNVbmRl
ZmluZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9w
ZXJhdGlvbnMub3BlcmF0aW9ucygpLmFwcGVuZChQZXJzcGVjdGl2ZVRyYW5zZm9ybU9wZXJhdGlv
bjo6Y3JlYXRlKHApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNh
c2UgV2ViS2l0Q1NTVHJhbnNmb3JtVmFsdWU6OlVua25vd25UcmFuc2Zvcm1PcGVyYXRpb246Ci0g
ICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgb3V0T3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi1zdGF0aWMgRmlsdGVyT3Bl
cmF0aW9uOjpPcGVyYXRpb25UeXBlIGZpbHRlck9wZXJhdGlvbkZvclR5cGUoV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OkZpbHRlck9wZXJhdGlvblR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUp
IHsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpSZWZlcmVuY2VGaWx0ZXJPcGVyYXRp
b246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlJFRkVSRU5DRTsKLSAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpHcmF5c2NhbGVGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAg
IHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkdSQVlTQ0FMRTsKLSAgICBjYXNlIFdlYktpdENTU0Zp
bHRlclZhbHVlOjpTZXBpYUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9w
ZXJhdGlvbjo6U0VQSUE7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2F0dXJhdGVG
aWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OlNBVFVSQVRF
OwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6Okh1ZVJvdGF0ZUZpbHRlck9wZXJhdGlv
bjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6SFVFX1JPVEFURTsKLSAgICBjYXNl
IFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJl
dHVybiBGaWx0ZXJPcGVyYXRpb246OklOVkVSVDsKLSAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZh
bHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0aW9uOgotICAgICAgICByZXR1cm4gRmlsdGVyT3BlcmF0
aW9uOjpPUEFDSVRZOwotICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5lc3NG
aWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkJSSUdIVE5F
U1M7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6Q29udHJhc3RGaWx0ZXJPcGVyYXRp
b246Ci0gICAgICAgIHJldHVybiBGaWx0ZXJPcGVyYXRpb246OkNPTlRSQVNUOwotICAgIGNhc2Ug
V2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJsdXJGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIHJldHVy
biBGaWx0ZXJPcGVyYXRpb246OkJMVVI7Ci0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6
RHJvcFNoYWRvd0ZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJhdGlv
bjo6RFJPUF9TSEFET1c7Ci0jaWYgRU5BQkxFKENTU19TSEFERVJTKQotICAgIGNhc2UgV2ViS2l0
Q1NTRmlsdGVyVmFsdWU6OkN1c3RvbUZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZp
bHRlck9wZXJhdGlvbjo6Q1VTVE9NOwotI2VuZGlmCi0gICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJW
YWx1ZTo6VW5rbm93bkZpbHRlck9wZXJhdGlvbjoKLSAgICAgICAgcmV0dXJuIEZpbHRlck9wZXJh
dGlvbjo6Tk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIEZpbHRlck9wZXJhdGlvbjo6Tk9ORTsKLX0K
LQotI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLXZvaWQgU3R5bGVSZXNv
bHZlcjo6bG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0gICAgaWYgKCFzdGF0ZS5zdHlsZSgpLT5oYXNGaWx0ZXIoKSB8fCBzdGF0ZS5wZW5k
aW5nU1ZHRG9jdW1lbnRzKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNo
ZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBzdGF0ZS5kb2N1bWVudCgp
LT5jYWNoZWRSZXNvdXJjZUxvYWRlcigpOwotICAgIFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0
aW9uPiA+JiBmaWx0ZXJPcGVyYXRpb25zID0gc3RhdGUuc3R5bGUoKS0+bXV0YWJsZUZpbHRlcigp
Lm9wZXJhdGlvbnMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmlsdGVyT3BlcmF0
aW9ucy5zaXplKCk7ICsraSkgewotICAgICAgICBSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiBmaWx0
ZXJPcGVyYXRpb24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOwotICAgICAgICBpZiAoZmlsdGVy
T3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVyT3BlcmF0aW9uOjpSRUZFUkVO
Q0UpIHsKLSAgICAgICAgICAgIFJlZmVyZW5jZUZpbHRlck9wZXJhdGlvbiogcmVmZXJlbmNlRmls
dGVyID0gc3RhdGljX2Nhc3Q8UmVmZXJlbmNlRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0
aW9uLmdldCgpKTsKLQotICAgICAgICAgICAgV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSogdmFs
dWUgPSBzdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuZ2V0KHJlZmVyZW5jZUZpbHRlcikuZ2V0
KCk7Ci0gICAgICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgQ2FjaGVkU1ZHRG9jdW1lbnQqIGNhY2hlZERvY3VtZW50ID0gdmFsdWUtPmxv
YWQoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgICAgICAgICAgaWYgKCFjYWNoZWREb2N1bWVu
dCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgLy8gU3Rhc2ggdGhl
IENhY2hlZFNWR0RvY3VtZW50IG9uIHRoZSByZWZlcmVuY2UgZmlsdGVyLgotICAgICAgICAgICAg
cmVmZXJlbmNlRmlsdGVyLT5zZXRDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShhZG9wdFB0cihu
ZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UoY2FjaGVkRG9jdW1lbnQpKSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgc3RhdGUucGVuZGluZ1NWR0RvY3VtZW50cygpLmNsZWFyKCk7Ci19Ci0j
ZW5kaWYKLQotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLVN0eWxlU2hhZGVyKiBTdHlsZVJlc29s
dmVyOjpzdHlsZVNoYWRlcihDU1NWYWx1ZSogdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlLT5pc1dl
YktpdENTU1NoYWRlclZhbHVlKCkpCi0gICAgICAgIHJldHVybiBjYWNoZWRPclBlbmRpbmdTdHls
ZVNoYWRlckZyb21WYWx1ZShzdGF0aWNfY2FzdDxXZWJLaXRDU1NTaGFkZXJWYWx1ZSo+KHZhbHVl
KSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVN0eWxlU2hhZGVyKiBTdHlsZVJlc29sdmVyOjpjYWNo
ZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSogdmFs
dWUpCi17Ci0gICAgU3R5bGVTaGFkZXIqIHNoYWRlciA9IHZhbHVlLT5jYWNoZWRPclBlbmRpbmdT
aGFkZXIoKTsKLSAgICBpZiAoc2hhZGVyICYmIHNoYWRlci0+aXNQZW5kaW5nU2hhZGVyKCkpCi0g
ICAgICAgIG1fc3RhdGUuc2V0SGFzUGVuZGluZ1NoYWRlcnModHJ1ZSk7Ci0gICAgcmV0dXJuIHNo
YWRlcjsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpsb2FkUGVuZGluZ1NoYWRlcnMoKQotewot
ICAgIGlmICghbV9zdGF0ZS5zdHlsZSgpLT5oYXNGaWx0ZXIoKSB8fCAhbV9zdGF0ZS5oYXNQZW5k
aW5nU2hhZGVycygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBDYWNoZWRSZXNvdXJjZUxvYWRl
ciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBtX3N0YXRlLmRvY3VtZW50KCktPmNhY2hlZFJlc291
cmNlTG9hZGVyKCk7Ci0KLSAgICBWZWN0b3I8UmVmUHRyPEZpbHRlck9wZXJhdGlvbj4gPiYgZmls
dGVyT3BlcmF0aW9ucyA9IG1fc3RhdGUuc3R5bGUoKS0+bXV0YWJsZUZpbHRlcigpLm9wZXJhdGlv
bnMoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmlsdGVyT3BlcmF0aW9ucy5zaXpl
KCk7ICsraSkgewotICAgICAgICBSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPiBmaWx0ZXJPcGVyYXRp
b24gPSBmaWx0ZXJPcGVyYXRpb25zLmF0KGkpOwotICAgICAgICBpZiAoZmlsdGVyT3BlcmF0aW9u
LT5nZXRPcGVyYXRpb25UeXBlKCkgPT0gRmlsdGVyT3BlcmF0aW9uOjpDVVNUT00pIHsKLSAgICAg
ICAgICAgIEN1c3RvbUZpbHRlck9wZXJhdGlvbiogY3VzdG9tRmlsdGVyID0gc3RhdGljX2Nhc3Q8
Q3VzdG9tRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9uLmdldCgpKTsKLSAgICAgICAg
ICAgIEFTU0VSVChjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7Ci0gICAgICAgICAgICBTdHlsZUN1
c3RvbUZpbHRlclByb2dyYW0qIHByb2dyYW0gPSBzdGF0aWNfY2FzdDxTdHlsZUN1c3RvbUZpbHRl
clByb2dyYW0qPihjdXN0b21GaWx0ZXItPnByb2dyYW0oKSk7Ci0gICAgICAgICAgICBpZiAocHJv
Z3JhbS0+dmVydGV4U2hhZGVyKCkgJiYgcHJvZ3JhbS0+dmVydGV4U2hhZGVyKCktPmlzUGVuZGlu
Z1NoYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgV2ViS2l0Q1NTU2hhZGVyVmFsdWUqIHNoYWRl
clZhbHVlID0gc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nU2hhZGVyKj4ocHJvZ3JhbS0+dmVydGV4
U2hhZGVyKCkpLT5jc3NTaGFkZXJWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHByb2dyYW0tPnNl
dFZlcnRleFNoYWRlcihzaGFkZXJWYWx1ZS0+Y2FjaGVkU2hhZGVyKGNhY2hlZFJlc291cmNlTG9h
ZGVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvZ3JhbS0+ZnJhZ21lbnRT
aGFkZXIoKSAmJiBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLT5pc1BlbmRpbmdTaGFkZXIoKSkg
ewotICAgICAgICAgICAgICAgIFdlYktpdENTU1NoYWRlclZhbHVlKiBzaGFkZXJWYWx1ZSA9IHN0
YXRpY19jYXN0PFN0eWxlUGVuZGluZ1NoYWRlcio+KHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkp
LT5jc3NTaGFkZXJWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHByb2dyYW0tPnNldEZyYWdtZW50
U2hhZGVyKHNoYWRlclZhbHVlLT5jYWNoZWRTaGFkZXIoY2FjaGVkUmVzb3VyY2VMb2FkZXIpKTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtX3N0YXRlLnNldEhhc1BlbmRp
bmdTaGFkZXJzKGZhbHNlKTsKLX0KLQotc3RhdGljIGJvb2wgc29ydFBhcmFtZXRlcnNCeU5hbWVD
b21wYXJhdG9yKGNvbnN0IFJlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+JiBhLCBjb25zdCBS
ZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiYgYikKLXsKLSAgICByZXR1cm4gY29kZVBvaW50
Q29tcGFyZUxlc3NUaGFuKGEtPm5hbWUoKSwgYi0+bmFtZSgpKTsKLX0KLQotUGFzc1JlZlB0cjxD
dXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyQXJy
YXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqIHZhbHVlcykKLXsK
LSAgICBSZWZQdHI8Q3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI+IGFycmF5UGFyYW1ldGVyID0g
Q3VzdG9tRmlsdGVyQXJyYXlQYXJhbWV0ZXI6OmNyZWF0ZShuYW1lKTsKLSAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwLCBsZW5ndGggPSB2YWx1ZXMtPmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyArK2kpIHsK
LSAgICAgICAgQ1NTVmFsdWUqIHZhbHVlID0gdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNr
KGkpOwotICAgICAgICBpZiAoIXZhbHVlLT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgQ1NTUHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0g
c3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIGlmIChwcmlt
aXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVN
QkVSKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGFycmF5UGFyYW1ldGVyLT5hZGRW
YWx1ZShwcmltaXRpdmVWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVy
biBhcnJheVBhcmFtZXRlci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVy
UGFyYW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlck51bWJlclBhcmFtZXRl
cihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1ZhbHVlTGlzdCogdmFsdWVzKQotewotICAgIFJlZlB0
cjxDdXN0b21GaWx0ZXJOdW1iZXJQYXJhbWV0ZXI+IG51bWJlclBhcmFtZXRlciA9IEN1c3RvbUZp
bHRlck51bWJlclBhcmFtZXRlcjo6Y3JlYXRlKG5hbWUpOwotICAgIGZvciAodW5zaWduZWQgaSA9
IDA7IGkgPCB2YWx1ZXMtPmxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgQ1NTVmFsdWUqIHZhbHVl
ID0gdmFsdWVzLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGkpOwotICAgICAgICBpZiAoIXZhbHVl
LT5pc1ByaW1pdGl2ZVZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgQ1NT
UHJpbWl0aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZl
VmFsdWUqPih2YWx1ZSk7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0aXZlVHlw
ZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfTlVNQkVSKQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIG51bWJlclBhcmFtZXRlci0+YWRkVmFsdWUocHJpbWl0aXZlVmFsdWUtPmdl
dERvdWJsZVZhbHVlKCkpOwotICAgIH0KLSAgICByZXR1cm4gbnVtYmVyUGFyYW1ldGVyLnJlbGVh
c2UoKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IFN0eWxlUmVzb2x2
ZXI6OnBhcnNlQ3VzdG9tRmlsdGVyVHJhbnNmb3JtUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFt
ZSwgQ1NTVmFsdWVMaXN0KiB2YWx1ZXMpCi17Ci0gICAgUmVmUHRyPEN1c3RvbUZpbHRlclRyYW5z
Zm9ybVBhcmFtZXRlcj4gdHJhbnNmb3JtUGFyYW1ldGVyID0gQ3VzdG9tRmlsdGVyVHJhbnNmb3Jt
UGFyYW1ldGVyOjpjcmVhdGUobmFtZSk7Ci0gICAgVHJhbnNmb3JtT3BlcmF0aW9ucyBvcGVyYXRp
b25zOwotICAgIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnModmFsdWVzLCBtX3N0YXRlLnN0eWxl
KCksIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLCBvcGVyYXRpb25zKTsKLSAgICB0cmFuc2Zv
cm1QYXJhbWV0ZXItPnNldE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7Ci0gICAgcmV0dXJuIHRyYW5z
Zm9ybVBhcmFtZXRlci5yZWxlYXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFy
YW1ldGVyPiBTdHlsZVJlc29sdmVyOjpwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBT
dHJpbmcmIG5hbWUsIENTU1ZhbHVlKiBwYXJhbWV0ZXJWYWx1ZSkKLXsKLSAgICAvLyBGSVhNRTog
SW1wbGVtZW50IG90aGVyIHBhcmFtZXRlcnMgdHlwZXMgcGFyc2luZy4KLSAgICAvLyBib29sZWFu
czogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc2NDM4Ci0gICAgLy8g
dGV4dHVyZXM6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MTQ0Mgot
ICAgIC8vIG1hdDIsIG1hdDMsIG1hdDQ6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03MTQ0NAotICAgIC8vIE51bWJlciBwYXJhbWV0ZXJzIGFyZSB3cmFwcGVkIGluc2lk
ZSBhIENTU1ZhbHVlTGlzdCBhbmQgYWxsCi0gICAgLy8gdGhlIG90aGVyIGZ1bmN0aW9ucyB2YWx1
ZXMgaW5oZXJpdCBmcm9tIENTU1ZhbHVlTGlzdC4KLSAgICBpZiAoIXBhcmFtZXRlclZhbHVlLT5p
c1ZhbHVlTGlzdCgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIENTU1ZhbHVlTGlzdCogdmFs
dWVzID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4ocGFyYW1ldGVyVmFsdWUpOwotICAgIGlm
ICghdmFsdWVzLT5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAocGFyYW1l
dGVyVmFsdWUtPmlzV2ViS2l0Q1NTQXJyYXlGdW5jdGlvblZhbHVlKCkpCi0gICAgICAgIHJldHVy
biBwYXJzZUN1c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKG5hbWUsIHZhbHVlcyk7Ci0KLSAgICAv
LyBJZiB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGxpc3QgaXMgYSB0cmFuc2Zvcm0gZnVuY3Rpb24s
Ci0gICAgLy8gdGhlbiB3ZSBjb3VsZCBzYWZlbHkgYXNzdW1lIHRoYXQgYWxsIHRoZSByZW1haW5p
bmcgaXRlbXMKLSAgICAvLyBhcmUgdHJhbnNmb3Jtcy4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zv
cm1QYXJhbWV0ZXIgd2lsbAotICAgIC8vIHJldHVybiAwIGlmIHRoYXQgYXNzdW1wdGlvbiBpcyBp
bmNvcnJlY3QuCi0gICAgaWYgKHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKS0+aXNX
ZWJLaXRDU1NUcmFuc2Zvcm1WYWx1ZSgpKQotICAgICAgICByZXR1cm4gcGFyc2VDdXN0b21GaWx0
ZXJUcmFuc2Zvcm1QYXJhbWV0ZXIobmFtZSwgdmFsdWVzKTsKLQotICAgIC8vIFdlIGNhbiBoYXZl
IG9ubHkgYXJyYXlzIG9mIGJvb2xlYW5zIG9yIG51bWJlcnMsIHNvIHVzZSB0aGUgZmlyc3QgdmFs
dWUgdG8gY2hvb3NlIGJldHdlZW4gdGhvc2UgdHdvLgotICAgIC8vIFdlIG5lZWQgdXAgdG8gNCB2
YWx1ZXMgKGFsbCBib29sZWFucyBvciBhbGwgbnVtYmVycykuCi0gICAgaWYgKCF2YWx1ZXMtPml0
ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCktPmlzUHJpbWl0aXZlVmFsdWUoKSB8fCB2YWx1ZXMtPmxl
bmd0aCgpID4gNCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgQ1NTUHJpbWl0aXZlVmFs
dWUqIGZpcnN0UHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+
KHZhbHVlcy0+aXRlbVdpdGhvdXRCb3VuZHNDaGVjaygwKSk7Ci0gICAgaWYgKGZpcnN0UHJpbWl0
aXZlVmFsdWUtPnByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZTo6Q1NTX05VTUJF
UikKLSAgICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tRmlsdGVyTnVtYmVyUGFyYW1ldGVyKG5hbWUs
IHZhbHVlcyk7Ci0KLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IHRoZSBib29sZWFuIGFycmF5IHBh
cmFtZXRlciBoZXJlLgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03NjQzOAotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgU3R5bGVSZXNvbHZlcjo6cGFy
c2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiBwYXJhbWV0ZXJzVmFsdWUsIEN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmIHBhcmFtZXRlckxpc3QpCi17Ci0gICAgSGFzaFNldDxT
dHJpbmc+IGtub3duUGFyYW1ldGVyTmFtZXM7Ci0gICAgQ1NTVmFsdWVMaXN0SXRlcmF0b3IgcGFy
YW1ldGVySXRlcmF0b3IocGFyYW1ldGVyc1ZhbHVlKTsKLSAgICBmb3IgKDsgcGFyYW1ldGVySXRl
cmF0b3IuaGFzTW9yZSgpOyBwYXJhbWV0ZXJJdGVyYXRvci5hZHZhbmNlKCkpIHsKLSAgICAgICAg
aWYgKCFwYXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpLT5pc1ZhbHVlTGlzdCgpKQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihw
YXJhbWV0ZXJJdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgaWYgKCFpdGVyYXRvci5pc1ByaW1p
dGl2ZVZhbHVlKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIENTU1ByaW1p
dGl2ZVZhbHVlKiBwcmltaXRpdmVWYWx1ZSA9IHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZhbHVl
Kj4oaXRlcmF0b3IudmFsdWUoKSk7Ci0gICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+cHJpbWl0
aXZlVHlwZSgpICE9IENTU1ByaW1pdGl2ZVZhbHVlOjpDU1NfU1RSSU5HKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwcmltaXRpdmVW
YWx1ZS0+Z2V0U3RyaW5nVmFsdWUoKTsKLSAgICAgICAgLy8gRG8gbm90IGFsbG93IGR1cGxpY2F0
ZSBwYXJhbWV0ZXIgbmFtZXMuCi0gICAgICAgIGlmIChrbm93blBhcmFtZXRlck5hbWVzLmNvbnRh
aW5zKG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBrbm93blBhcmFt
ZXRlck5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXJhdG9yLmFkdmFuY2Uo
KTsKLSAgICAgICAgCi0gICAgICAgIGlmICghaXRlcmF0b3IuaGFzTW9yZSgpKQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4gcGFyYW1ldGVyID0gcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXIobmFtZSwgaXRl
cmF0b3IudmFsdWUoKSk7Ci0gICAgICAgIGlmICghcGFyYW1ldGVyKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICBwYXJhbWV0ZXJMaXN0LmFwcGVuZChwYXJhbWV0ZXIucmVsZWFz
ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gTWFrZSBzdXJlIHdlIHNvcnQgdGhlIHBhcmFtZXRl
cnMgYmVmb3JlIHBhc3NpbmcgdGhlbSBkb3duIHRvIHRoZSBDdXN0b21GaWx0ZXJPcGVyYXRpb24u
Ci0gICAgc3RkOjpzb3J0KHBhcmFtZXRlckxpc3QuYmVnaW4oKSwgcGFyYW1ldGVyTGlzdC5lbmQo
KSwgc29ydFBhcmFtZXRlcnNCeU5hbWVDb21wYXJhdG9yKTsKLSAgICAKLSAgICByZXR1cm4gdHJ1
ZTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2ZXI6
OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoV2Vi
S2l0Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1l
bnQgc3R5bGUgcmVzb2x1dGlvbiBmb3IgdGhlIGN1c3RvbSBmaWx0ZXIgYXQtcnVsZSByZWZlcmVu
Y2Ugc3ludGF4LgotICAgIFVOVVNFRF9QQVJBTShmaWx0ZXJWYWx1ZSk7Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLVBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBTdHlsZVJlc29sdmVyOjpj
cmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5saW5lU3ludGF4KFdlYktpdENTU0ZpbHRl
clZhbHVlKiBmaWx0ZXJWYWx1ZSkKLXsKLSAgICBDU1NWYWx1ZSogc2hhZGVyc1ZhbHVlID0gZmls
dGVyVmFsdWUtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMCk7Ci0gICAgQVNTRVJUX1dJVEhfU0VD
VVJJVFlfSU1QTElDQVRJT04oc2hhZGVyc1ZhbHVlLT5pc1ZhbHVlTGlzdCgpKTsKLSAgICBDU1NW
YWx1ZUxpc3QqIHNoYWRlcnNMaXN0ID0gc3RhdGljX2Nhc3Q8Q1NTVmFsdWVMaXN0Kj4oc2hhZGVy
c1ZhbHVlKTsKLQotICAgIHVuc2lnbmVkIHNoYWRlcnNMaXN0TGVuZ3RoID0gc2hhZGVyc0xpc3Qt
Pmxlbmd0aCgpOwotICAgIEFTU0VSVChzaGFkZXJzTGlzdExlbmd0aCk7Ci0KLSAgICBSZWZQdHI8
U3R5bGVTaGFkZXI+IHZlcnRleFNoYWRlciA9IHN0eWxlU2hhZGVyKHNoYWRlcnNMaXN0LT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDApKTsKLSAgICBSZWZQdHI8U3R5bGVTaGFkZXI+IGZyYWdtZW50
U2hhZGVyOwotICAgIEN1c3RvbUZpbHRlclByb2dyYW1UeXBlIHByb2dyYW1UeXBlID0gUFJPR1JB
TV9UWVBFX0JMRU5EU19FTEVNRU5UX1RFWFRVUkU7Ci0gICAgQ3VzdG9tRmlsdGVyUHJvZ3JhbU1p
eFNldHRpbmdzIG1peFNldHRpbmdzOwotCi0gICAgaWYgKHNoYWRlcnNMaXN0TGVuZ3RoID4gMSkg
ewotICAgICAgICBDU1NWYWx1ZSogZnJhZ21lbnRTaGFkZXJPck1peEZ1bmN0aW9uID0gc2hhZGVy
c0xpc3QtPml0ZW1XaXRob3V0Qm91bmRzQ2hlY2soMSk7Ci0KLSAgICAgICAgaWYgKGZyYWdtZW50
U2hhZGVyT3JNaXhGdW5jdGlvbi0+aXNXZWJLaXRDU1NNaXhGdW5jdGlvblZhbHVlKCkpIHsKLSAg
ICAgICAgICAgIFdlYktpdENTU01peEZ1bmN0aW9uVmFsdWUqIG1peEZ1bmN0aW9uID0gc3RhdGlj
X2Nhc3Q8V2ViS2l0Q1NTTWl4RnVuY3Rpb25WYWx1ZSo+KGZyYWdtZW50U2hhZGVyT3JNaXhGdW5j
dGlvbik7Ci0gICAgICAgICAgICBDU1NWYWx1ZUxpc3RJdGVyYXRvciBpdGVyYXRvcihtaXhGdW5j
dGlvbik7Ci0KLSAgICAgICAgICAgIEFTU0VSVChtaXhGdW5jdGlvbi0+bGVuZ3RoKCkpOwotICAg
ICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBzdHlsZVNoYWRlcihpdGVyYXRvci52YWx1ZSgpKTsK
LSAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKLQotICAgICAgICAgICAgQVNTRVJUKG1p
eEZ1bmN0aW9uLT5sZW5ndGgoKSA8PSAzKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5o
YXNNb3JlKCkpIHsKLSAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZl
VmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkp
OwotICAgICAgICAgICAgICAgIGlmIChDU1NQYXJzZXI6OmlzQmxlbmRNb2RlKHByaW1pdGl2ZVZh
bHVlLT5nZXRJZGVudCgpKSkKLSAgICAgICAgICAgICAgICAgICAgbWl4U2V0dGluZ3MuYmxlbmRN
b2RlID0gKnByaW1pdGl2ZVZhbHVlOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKENTU1BhcnNl
cjo6aXNDb21wb3NpdGVPcGVyYXRvcihwcmltaXRpdmVWYWx1ZS0+Z2V0SWRlbnQoKSkpCi0gICAg
ICAgICAgICAgICAgICAgIG1peFNldHRpbmdzLmNvbXBvc2l0ZU9wZXJhdG9yID0gKnByaW1pdGl2
ZVZhbHVlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvZ3JhbVR5cGUgPSBQ
Uk9HUkFNX1RZUEVfTk9fRUxFTUVOVF9URVhUVVJFOwotICAgICAgICAgICAgZnJhZ21lbnRTaGFk
ZXIgPSBzdHlsZVNoYWRlcihmcmFnbWVudFNoYWRlck9yTWl4RnVuY3Rpb24pOwotICAgICAgICB9
Ci0gICAgfQotICAgIAotICAgIHVuc2lnbmVkIG1lc2hSb3dzID0gMTsKLSAgICB1bnNpZ25lZCBt
ZXNoQ29sdW1ucyA9IDE7Ci0gICAgQ3VzdG9tRmlsdGVyTWVzaFR5cGUgbWVzaFR5cGUgPSBNZXNo
VHlwZUF0dGFjaGVkOwotICAgIAotICAgIENTU1ZhbHVlKiBwYXJhbWV0ZXJzVmFsdWUgPSAwOwot
ICAgIAotICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgIENTU1Zh
bHVlTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0No
ZWNrKDEpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBzZWNvbmQgdmFsdWUgbWlnaHQgYmUg
dGhlIG1lc2ggYm94IG9yIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnM6Ci0gICAgICAgIC8vIElmIGl0
IHN0YXJ0cyB3aXRoIGEgbnVtYmVyIG9yIGFueSBvZiB0aGUgbWVzaC1ib3ggaWRlbnRpZmllcnMg
aXQgaXMgCi0gICAgICAgIC8vIHRoZSBtZXNoLWJveCBsaXN0LCBpZiBub3QgaXQgbWVhbnMgaXQg
aXMgdGhlIHBhcmFtZXRlcnMgbGlzdC4KLQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTW9yZSgp
ICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICAgICAgQ1NTUHJpbWl0
aXZlVmFsdWUqIHByaW1pdGl2ZVZhbHVlID0gc3RhdGljX2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUq
PihpdGVyYXRvci52YWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChwcmltaXRpdmVWYWx1ZS0+aXNO
dW1iZXIoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIG9ubHkgb25lIGludGVnZXIgdmFsdWUg
aXMgc3BlY2lmaWVkLCBpdCB3aWxsIHNldCBib3RoCi0gICAgICAgICAgICAgICAgLy8gdGhlIHJv
d3MgYW5kIHRoZSBjb2x1bW5zLgotICAgICAgICAgICAgICAgIG1lc2hDb2x1bW5zID0gbWVzaFJv
d3MgPSBwcmltaXRpdmVWYWx1ZS0+Z2V0SW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpdGVy
YXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVHJ5
IHRvIG1hdGNoIGFub3RoZXIgbnVtYmVyIGZvciB0aGUgcm93cy4KLSAgICAgICAgICAgICAgICBp
ZiAoaXRlcmF0b3IuaGFzTW9yZSgpICYmIGl0ZXJhdG9yLmlzUHJpbWl0aXZlVmFsdWUoKSkgewot
ICAgICAgICAgICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0aXZlVmFsdWUgPSBz
dGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVlKCkpOwotICAgICAg
ICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmlzTnVtYmVyKCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIG1lc2hSb3dzID0gcHJpbWl0aXZlVmFsdWUtPmdldEludFZhbHVlKCk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0K
LSAgICAgICAgCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNNb3JlKCkgJiYgaXRlcmF0b3IuaXNQ
cmltaXRpdmVWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSogcHJpbWl0
aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGl0ZXJhdG9yLnZhbHVl
KCkpOwotICAgICAgICAgICAgaWYgKHByaW1pdGl2ZVZhbHVlLT5nZXRJZGVudCgpID09IENTU1Zh
bHVlRGV0YWNoZWQpIHsKLSAgICAgICAgICAgICAgICBtZXNoVHlwZSA9IE1lc2hUeXBlRGV0YWNo
ZWQ7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IuYWR2YW5jZSgpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIWl0ZXJhdG9yLmluZGV4KCkpIHsKLSAg
ICAgICAgICAgIC8vIElmIG5vIHZhbHVlIHdhcyBjb25zdW1lZCBmcm9tIHRoZSBtZXNoIHZhbHVl
LCB0aGVuIGl0IGlzIGp1c3QgYSBwYXJhbWV0ZXIgbGlzdCwgbWVhbmluZyB0aGF0IHdlIGVuZCB1
cAotICAgICAgICAgICAgLy8gaGF2aW5nIGp1c3QgdHdvIENTU0xpc3RWYWx1ZXM6IGxpc3Qgb2Yg
c2hhZGVycyBhbmQgbGlzdCBvZiBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgQVNTRVJUKGZpbHRl
clZhbHVlLT5sZW5ndGgoKSA9PSAyKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IGZp
bHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKDEpOwotICAgICAgICB9Ci0gICAgfQot
ICAgIAotICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgPiAyICYmICFwYXJhbWV0ZXJzVmFs
dWUpCi0gICAgICAgIHBhcmFtZXRlcnNWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJv
dW5kc0NoZWNrKDIpOwotICAgIAotICAgIEN1c3RvbUZpbHRlclBhcmFtZXRlckxpc3QgcGFyYW1l
dGVyTGlzdDsKLSAgICBpZiAocGFyYW1ldGVyc1ZhbHVlICYmICFwYXJzZUN1c3RvbUZpbHRlclBh
cmFtZXRlckxpc3QocGFyYW1ldGVyc1ZhbHVlLCBwYXJhbWV0ZXJMaXN0KSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgCi0gICAgUmVmUHRyPFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbT4gcHJvZ3Jh
bSA9IFN0eWxlQ3VzdG9tRmlsdGVyUHJvZ3JhbTo6Y3JlYXRlKHZlcnRleFNoYWRlci5yZWxlYXNl
KCksIGZyYWdtZW50U2hhZGVyLnJlbGVhc2UoKSwgcHJvZ3JhbVR5cGUsIG1peFNldHRpbmdzLCBt
ZXNoVHlwZSk7Ci0gICAgcmV0dXJuIEN1c3RvbUZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKHByb2dy
YW0ucmVsZWFzZSgpLCBwYXJhbWV0ZXJMaXN0LCBtZXNoUm93cywgbWVzaENvbHVtbnMsIG1lc2hU
eXBlKTsKLX0KLQotUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IFN0eWxlUmVzb2x2
ZXI6OmNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJLaXRDU1NGaWx0ZXJWYWx1ZSogZmls
dGVyVmFsdWUpCi17Ci0gICAgQVNTRVJUKGZpbHRlclZhbHVlLT5sZW5ndGgoKSk7Ci0gICAgYm9v
bCBpc0F0UnVsZVJlZmVyZW5jZVN5bnRheCA9IGZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5k
c0NoZWNrKDApLT5pc1ByaW1pdGl2ZVZhbHVlKCk7Ci0gICAgcmV0dXJuIGlzQXRSdWxlUmVmZXJl
bmNlU3ludGF4ID8gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9uV2l0aEF0UnVsZVJlZmVyZW5j
ZVN5bnRheChmaWx0ZXJWYWx1ZSkgOiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb25XaXRoSW5s
aW5lU3ludGF4KGZpbHRlclZhbHVlKTsKLX0KLQotI2VuZGlmCi0KLWJvb2wgU3R5bGVSZXNvbHZl
cjo6Y3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5WYWx1ZSwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0eWxlLCBGaWx0ZXJPcGVyYXRpb25zJiBvdXRPcGVy
YXRpb25zKQotewotICAgIEFTU0VSVChvdXRPcGVyYXRpb25zLmlzRW1wdHkoKSk7Ci0gICAgCi0g
ICAgaWYgKCFpblZhbHVlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKGlu
VmFsdWUtPmlzUHJpbWl0aXZlVmFsdWUoKSkgewotICAgICAgICBDU1NQcmltaXRpdmVWYWx1ZSog
cHJpbWl0aXZlVmFsdWUgPSBzdGF0aWNfY2FzdDxDU1NQcmltaXRpdmVWYWx1ZSo+KGluVmFsdWUp
OwotICAgICAgICBpZiAocHJpbWl0aXZlVmFsdWUtPmdldElkZW50KCkgPT0gQ1NTVmFsdWVOb25l
KQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIGlmICghaW5WYWx1
ZS0+aXNWYWx1ZUxpc3QoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZmxvYXQgem9v
bUZhY3RvciA9IHN0eWxlID8gc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSA6IDE7Ci0gICAgRmlsdGVy
T3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgIGZvciAoQ1NTVmFsdWVMaXN0SXRlcmF0b3IgaSA9
IGluVmFsdWU7IGkuaGFzTW9yZSgpOyBpLmFkdmFuY2UoKSkgewotICAgICAgICBDU1NWYWx1ZSog
Y3VyclZhbHVlID0gaS52YWx1ZSgpOwotICAgICAgICBpZiAoIWN1cnJWYWx1ZS0+aXNXZWJLaXRD
U1NGaWx0ZXJWYWx1ZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgV2ViS2l0
Q1NTRmlsdGVyVmFsdWUqIGZpbHRlclZhbHVlID0gc3RhdGljX2Nhc3Q8V2ViS2l0Q1NTRmlsdGVy
VmFsdWUqPihpLnZhbHVlKCkpOwotICAgICAgICBGaWx0ZXJPcGVyYXRpb246Ok9wZXJhdGlvblR5
cGUgb3BlcmF0aW9uVHlwZSA9IGZpbHRlck9wZXJhdGlvbkZvclR5cGUoZmlsdGVyVmFsdWUtPm9w
ZXJhdGlvblR5cGUoKSk7Ci0KLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIGlmIChv
cGVyYXRpb25UeXBlID09IEZpbHRlck9wZXJhdGlvbjo6VkFMSURBVEVEX0NVU1RPTSkgewotICAg
ICAgICAgICAgLy8gVmFsaWRhdGVkQ3VzdG9tRmlsdGVyT3BlcmF0aW9uIGlzIG5vdCBzdXBwb3Nl
ZCB0byBlbmQgdXAgaW4gdGhlIFJlbmRlclN0eWxlLgotICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAo
b3BlcmF0aW9uVHlwZSA9PSBGaWx0ZXJPcGVyYXRpb246OkNVU1RPTSkgewotICAgICAgICAgICAg
UmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gb3BlcmF0aW9uID0gY3JlYXRlQ3VzdG9tRmls
dGVyT3BlcmF0aW9uKGZpbHRlclZhbHVlKTsKLSAgICAgICAgICAgIGlmICghb3BlcmF0aW9uKQot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
b3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmIChvcGVyYXRpb25UeXBlID09
IEZpbHRlck9wZXJhdGlvbjo6UkVGRVJFTkNFKSB7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAg
ICAgIGlmIChmaWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIENTU1ZhbHVlKiBhcmd1bWVudCA9IGZpbHRlclZhbHVlLT5pdGVt
V2l0aG91dEJvdW5kc0NoZWNrKDApOwotCi0gICAgICAgICAgICBpZiAoIWFyZ3VtZW50LT5pc1dl
YktpdENTU1NWR0RvY3VtZW50VmFsdWUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQot
ICAgICAgICAgICAgV2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZSogc3ZnRG9jdW1lbnRWYWx1ZSA9
IHN0YXRpY19jYXN0PFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWUqPihhcmd1bWVudCk7Ci0gICAg
ICAgICAgICBLVVJMIHVybCA9IG1fc3RhdGUuZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoc3ZnRG9j
dW1lbnRWYWx1ZS0+dXJsKCkpOwotCi0gICAgICAgICAgICBSZWZQdHI8UmVmZXJlbmNlRmlsdGVy
T3BlcmF0aW9uPiBvcGVyYXRpb24gPSBSZWZlcmVuY2VGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShz
dmdEb2N1bWVudFZhbHVlLT51cmwoKSwgdXJsLmZyYWdtZW50SWRlbnRpZmllcigpLCBvcGVyYXRp
b25UeXBlKTsKLSAgICAgICAgICAgIGlmIChTVkdVUklSZWZlcmVuY2U6OmlzRXh0ZXJuYWxVUklS
ZWZlcmVuY2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+dXJsKCksIG1fc3RhdGUuZG9jdW1lbnQoKSkpIHsK
LSAgICAgICAgICAgICAgICBpZiAoIXN2Z0RvY3VtZW50VmFsdWUtPmxvYWRSZXF1ZXN0ZWQoKSkK
LSAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZS5wZW5kaW5nU1ZHRG9jdW1lbnRzKCkuc2V0KG9w
ZXJhdGlvbi5nZXQoKSwgc3ZnRG9jdW1lbnRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBp
ZiAoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVkU1ZHRG9jdW1lbnQoKSkKLSAgICAgICAgICAgICAg
ICAgICAgb3BlcmF0aW9uLT5zZXRDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZShhZG9wdFB0cihu
ZXcgQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2Uoc3ZnRG9jdW1lbnRWYWx1ZS0+Y2FjaGVkU1ZH
RG9jdW1lbnQoKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3Bl
cmF0aW9ucygpLmFwcGVuZChvcGVyYXRpb24pOwotI2VuZGlmCi0gICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgYWxsIHBhcmFtZXRlcnMgYXJl
IHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggdGhlCi0gICAgICAgIC8vIGV4Y2VwdGlvbiBvZiBkcm9w
IHNoYWRvdyB3aGljaCBoYXMgYSBTaGFkb3dWYWx1ZSBwYXJhbWV0ZXIuCi0gICAgICAgIGlmIChv
cGVyYXRpb25UeXBlICE9IEZpbHRlck9wZXJhdGlvbjo6RFJPUF9TSEFET1cpIHsKLSAgICAgICAg
ICAgIGJvb2wgaGF2ZU5vblByaW1pdGl2ZVZhbHVlID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3Ig
KHVuc2lnbmVkIGogPSAwOyBqIDwgZmlsdGVyVmFsdWUtPmxlbmd0aCgpOyArK2opIHsKLSAgICAg
ICAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlLT5pdGVtV2l0aG91dEJvdW5kc0NoZWNrKGopLT5p
c1ByaW1pdGl2ZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZU5vblByaW1pdGl2
ZVZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhhdmVOb25QcmltaXRpdmVWYWx1
ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIENTU1By
aW1pdGl2ZVZhbHVlKiBmaXJzdFZhbHVlID0gZmlsdGVyVmFsdWUtPmxlbmd0aCgpID8gc3RhdGlj
X2Nhc3Q8Q1NTUHJpbWl0aXZlVmFsdWUqPihmaWx0ZXJWYWx1ZS0+aXRlbVdpdGhvdXRCb3VuZHND
aGVjaygwKSkgOiAwOwotICAgICAgICBzd2l0Y2ggKGZpbHRlclZhbHVlLT5vcGVyYXRpb25UeXBl
KCkpIHsKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6R3JheXNjYWxlRmlsdGVy
T3BlcmF0aW9uOgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpTZXBpYUZpbHRl
ck9wZXJhdGlvbjoKLSAgICAgICAgY2FzZSBXZWJLaXRDU1NGaWx0ZXJWYWx1ZTo6U2F0dXJhdGVG
aWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbW91bnQgPSAxOwotICAgICAg
ICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAg
YW1vdW50ID0gZmlyc3RWYWx1ZS0+Z2V0RG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBp
ZiAoZmlyc3RWYWx1ZS0+aXNQZXJjZW50YWdlKCkpCi0gICAgICAgICAgICAgICAgICAgIGFtb3Vu
dCAvPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMub3BlcmF0
aW9ucygpLmFwcGVuZChCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uOjpjcmVhdGUoYW1v
dW50LCBvcGVyYXRpb25UeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpIdWVSb3RhdGVGaWx0ZXJPcGVyYXRpb246
IHsKLSAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IDA7Ci0gICAgICAgICAgICBpZiAoZmlsdGVy
VmFsdWUtPmxlbmd0aCgpID09IDEpCi0gICAgICAgICAgICAgICAgYW5nbGUgPSBmaXJzdFZhbHVl
LT5jb21wdXRlRGVncmVlcygpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25zLm9wZXJhdGlvbnMo
KS5hcHBlbmQoQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbjo6Y3JlYXRlKGFuZ2xlLCBv
cGVyYXRpb25UeXBlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpJbnZlcnRGaWx0ZXJPcGVyYXRpb246Ci0gICAgICAg
IGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRpb246Ci0g
ICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkNvbnRyYXN0RmlsdGVyT3BlcmF0aW9u
OgotICAgICAgICBjYXNlIFdlYktpdENTU0ZpbHRlclZhbHVlOjpPcGFjaXR5RmlsdGVyT3BlcmF0
aW9uOiB7Ci0gICAgICAgICAgICBkb3VibGUgYW1vdW50ID0gKGZpbHRlclZhbHVlLT5vcGVyYXRp
b25UeXBlKCkgPT0gV2ViS2l0Q1NTRmlsdGVyVmFsdWU6OkJyaWdodG5lc3NGaWx0ZXJPcGVyYXRp
b24pID8gMCA6IDE7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUtPmxlbmd0aCgpID09IDEp
IHsKLSAgICAgICAgICAgICAgICBhbW91bnQgPSBmaXJzdFZhbHVlLT5nZXREb3VibGVWYWx1ZSgp
OwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlLT5pc1BlcmNlbnRhZ2UoKSkKLSAgICAg
ICAgICAgICAgICAgICAgYW1vdW50IC89IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJhc2ljQ29tcG9uZW50VHJhbnNmZXJG
aWx0ZXJPcGVyYXRpb246OmNyZWF0ZShhbW91bnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OkJsdXJGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIExlbmd0aCBzdGREZXZpYXRpb24g
PSBMZW5ndGgoMCwgRml4ZWQpOwotICAgICAgICAgICAgaWYgKGZpbHRlclZhbHVlLT5sZW5ndGgo
KSA+PSAxKQotICAgICAgICAgICAgICAgIHN0ZERldmlhdGlvbiA9IGNvbnZlcnRUb0Zsb2F0TGVu
Z3RoKGZpcnN0VmFsdWUsIHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3IpOwotICAgICAgICAg
ICAgaWYgKHN0ZERldmlhdGlvbi5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKEJs
dXJGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShzdGREZXZpYXRpb24sIG9wZXJhdGlvblR5cGUpKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmls
dGVyVmFsdWU6OkRyb3BTaGFkb3dGaWx0ZXJPcGVyYXRpb246IHsKLSAgICAgICAgICAgIGlmIChm
aWx0ZXJWYWx1ZS0+bGVuZ3RoKCkgIT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICAgICAgICAgIENTU1ZhbHVlKiBjc3NWYWx1ZSA9IGZpbHRlclZhbHVlLT5pdGVtV2l0
aG91dEJvdW5kc0NoZWNrKDApOwotICAgICAgICAgICAgaWYgKCFjc3NWYWx1ZS0+aXNTaGFkb3dW
YWx1ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBTaGFkb3dW
YWx1ZSogaXRlbSA9IHN0YXRpY19jYXN0PFNoYWRvd1ZhbHVlKj4oY3NzVmFsdWUpOwotICAgICAg
ICAgICAgSW50UG9pbnQgbG9jYXRpb24oaXRlbS0+eC0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxl
LCByb290U3R5bGUsIHpvb21GYWN0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aXRlbS0+eS0+Y29tcHV0ZUxlbmd0aDxpbnQ+KHN0eWxlLCByb290U3R5bGUsIHpvb21GYWN0b3Ip
KTsKLSAgICAgICAgICAgIGludCBibHVyID0gaXRlbS0+Ymx1ciA/IGl0ZW0tPmJsdXItPmNvbXB1
dGVMZW5ndGg8aW50PihzdHlsZSwgcm9vdFN0eWxlLCB6b29tRmFjdG9yKSA6IDA7Ci0gICAgICAg
ICAgICBDb2xvciBjb2xvcjsKLSAgICAgICAgICAgIGlmIChpdGVtLT5jb2xvcikKLSAgICAgICAg
ICAgICAgICBjb2xvciA9IGNvbG9yRnJvbVByaW1pdGl2ZVZhbHVlKGl0ZW0tPmNvbG9yLmdldCgp
KTsKLQotICAgICAgICAgICAgb3BlcmF0aW9ucy5vcGVyYXRpb25zKCkuYXBwZW5kKERyb3BTaGFk
b3dGaWx0ZXJPcGVyYXRpb246OmNyZWF0ZShsb2NhdGlvbiwgYmx1ciwgY29sb3IuaXNWYWxpZCgp
ID8gY29sb3IgOiBDb2xvcjo6dHJhbnNwYXJlbnQsIG9wZXJhdGlvblR5cGUpKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViS2l0Q1NTRmlsdGVyVmFsdWU6
OlVua25vd25GaWx0ZXJPcGVyYXRpb246Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgb3V0T3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgcmV0dXJuIHRydWU7Ci19
Ci0KLSNlbmRpZgotCi1QYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IFN0eWxlUmVzb2x2ZXI6OmxvYWRQ
ZW5kaW5nSW1hZ2UoU3R5bGVQZW5kaW5nSW1hZ2UqIHBlbmRpbmdJbWFnZSkKLXsKLSAgICBDYWNo
ZWRSZXNvdXJjZUxvYWRlciogY2FjaGVkUmVzb3VyY2VMb2FkZXIgPSBtX3N0YXRlLmRvY3VtZW50
KCktPmNhY2hlZFJlc291cmNlTG9hZGVyKCk7Ci0KLSAgICBpZiAocGVuZGluZ0ltYWdlLT5jc3NJ
bWFnZVZhbHVlKCkpIHsKLSAgICAgICAgQ1NTSW1hZ2VWYWx1ZSogaW1hZ2VWYWx1ZSA9IHBlbmRp
bmdJbWFnZS0+Y3NzSW1hZ2VWYWx1ZSgpOwotICAgICAgICByZXR1cm4gaW1hZ2VWYWx1ZS0+Y2Fj
aGVkSW1hZ2UoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgIH0KLQotICAgIGlmIChwZW5kaW5n
SW1hZ2UtPmNzc0ltYWdlR2VuZXJhdG9yVmFsdWUoKSkgewotICAgICAgICBDU1NJbWFnZUdlbmVy
YXRvclZhbHVlKiBpbWFnZUdlbmVyYXRvclZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NJbWFnZUdl
bmVyYXRvclZhbHVlKCk7Ci0gICAgICAgIGltYWdlR2VuZXJhdG9yVmFsdWUtPmxvYWRTdWJpbWFn
ZXMoY2FjaGVkUmVzb3VyY2VMb2FkZXIpOwotICAgICAgICByZXR1cm4gU3R5bGVHZW5lcmF0ZWRJ
bWFnZTo6Y3JlYXRlKGltYWdlR2VuZXJhdG9yVmFsdWUpOwotICAgIH0KLQotICAgIGlmIChwZW5k
aW5nSW1hZ2UtPmNzc0N1cnNvckltYWdlVmFsdWUoKSkgewotICAgICAgICBDU1NDdXJzb3JJbWFn
ZVZhbHVlKiBjdXJzb3JJbWFnZVZhbHVlID0gcGVuZGluZ0ltYWdlLT5jc3NDdXJzb3JJbWFnZVZh
bHVlKCk7Ci0gICAgICAgIHJldHVybiBjdXJzb3JJbWFnZVZhbHVlLT5jYWNoZWRJbWFnZShjYWNo
ZWRSZXNvdXJjZUxvYWRlcik7Ci0gICAgfQotCi0jaWYgRU5BQkxFKENTU19JTUFHRV9TRVQpCi0g
ICAgaWYgKHBlbmRpbmdJbWFnZS0+Y3NzSW1hZ2VTZXRWYWx1ZSgpKSB7Ci0gICAgICAgIENTU0lt
YWdlU2V0VmFsdWUqIGltYWdlU2V0VmFsdWUgPSBwZW5kaW5nSW1hZ2UtPmNzc0ltYWdlU2V0VmFs
dWUoKTsKLSAgICAgICAgcmV0dXJuIGltYWdlU2V0VmFsdWUtPmNhY2hlZEltYWdlU2V0KGNhY2hl
ZFJlc291cmNlTG9hZGVyKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi12
b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5nSW1hZ2VzKCkKLXsKLSAgICBpZiAobV9zdGF0
ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcDo6Y29uc3RfaXRlcmF0b3I6OktleXMgZW5kID0g
bV9zdGF0ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuZW5kKCkua2V5cygpOwotICAgIGZvciAo
UGVuZGluZ0ltYWdlUHJvcGVydHlNYXA6OmNvbnN0X2l0ZXJhdG9yOjpLZXlzIGl0ID0gbV9zdGF0
ZS5wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkuYmVnaW4oKS5rZXlzKCk7IGl0ICE9IGVuZDsgKytp
dCkgewotICAgICAgICBDU1NQcm9wZXJ0eUlEIGN1cnJlbnRQcm9wZXJ0eSA9ICppdDsKLQotICAg
ICAgICBzd2l0Y2ggKGN1cnJlbnRQcm9wZXJ0eSkgewotICAgICAgICBjYXNlIENTU1Byb3BlcnR5
QmFja2dyb3VuZEltYWdlOiB7Ci0gICAgICAgICAgICBmb3IgKEZpbGxMYXllciogYmFja2dyb3Vu
ZExheWVyID0gbV9zdGF0ZS5zdHlsZSgpLT5hY2Nlc3NCYWNrZ3JvdW5kTGF5ZXJzKCk7IGJhY2tn
cm91bmRMYXllcjsgYmFja2dyb3VuZExheWVyID0gYmFja2dyb3VuZExheWVyLT5uZXh0KCkpIHsK
LSAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZExheWVyLT5pbWFnZSgpICYmIGJhY2tncm91
bmRMYXllci0+aW1hZ2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkKLSAgICAgICAgICAgICAgICAgICAg
YmFja2dyb3VuZExheWVyLT5zZXRJbWFnZShsb2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0
eWxlUGVuZGluZ0ltYWdlKj4oYmFja2dyb3VuZExheWVyLT5pbWFnZSgpKSkpOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDU1NQcm9w
ZXJ0eUNvbnRlbnQ6IHsKLSAgICAgICAgICAgIGZvciAoQ29udGVudERhdGEqIGNvbnRlbnREYXRh
ID0gY29uc3RfY2FzdDxDb250ZW50RGF0YSo+KG1fc3RhdGUuc3R5bGUoKS0+Y29udGVudERhdGEo
KSk7IGNvbnRlbnREYXRhOyBjb250ZW50RGF0YSA9IGNvbnRlbnREYXRhLT5uZXh0KCkpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoY29udGVudERhdGEtPmlzSW1hZ2UoKSkgewotICAgICAgICAgICAg
ICAgICAgICBTdHlsZUltYWdlKiBpbWFnZSA9IHN0YXRpY19jYXN0PEltYWdlQ29udGVudERhdGEq
Pihjb250ZW50RGF0YSktPmltYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+
aXNQZW5kaW5nSW1hZ2UoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUmVmUHRyPFN0eWxl
SW1hZ2U+IGxvYWRlZEltYWdlID0gbG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBl
bmRpbmdJbWFnZSo+KGltYWdlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVk
SW1hZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SW1hZ2VDb250
ZW50RGF0YSo+KGNvbnRlbnREYXRhKS0+c2V0SW1hZ2UobG9hZGVkSW1hZ2UucmVsZWFzZSgpKTsK
LSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlD
dXJzb3I6IHsKLSAgICAgICAgICAgIGlmIChDdXJzb3JMaXN0KiBjdXJzb3JMaXN0ID0gbV9zdGF0
ZS5zdHlsZSgpLT5jdXJzb3JzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IGN1cnNvckxpc3QtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEN1
cnNvckRhdGEmIGN1cnJlbnRDdXJzb3IgPSBjdXJzb3JMaXN0LT5hdChpKTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKFN0eWxlSW1hZ2UqIGltYWdlID0gY3VycmVudEN1cnNvci5pbWFnZSgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2UtPmlzUGVuZGluZ0ltYWdlKCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN1cnNvci5zZXRJbWFnZShsb2FkUGVu
ZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4oaW1hZ2UpKSk7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENTU1Byb3BlcnR5TGlzdFN0
eWxlSW1hZ2U6IHsKLSAgICAgICAgICAgIGlmIChtX3N0YXRlLnN0eWxlKCktPmxpc3RTdHlsZUlt
YWdlKCkgJiYgbV9zdGF0ZS5zdHlsZSgpLT5saXN0U3R5bGVJbWFnZSgpLT5pc1BlbmRpbmdJbWFn
ZSgpKQotICAgICAgICAgICAgICAgIG1fc3RhdGUuc3R5bGUoKS0+c2V0TGlzdFN0eWxlSW1hZ2Uo
bG9hZFBlbmRpbmdJbWFnZShzdGF0aWNfY2FzdDxTdHlsZVBlbmRpbmdJbWFnZSo+KG1fc3RhdGUu
c3R5bGUoKS0+bGlzdFN0eWxlSW1hZ2UoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlCb3JkZXJJbWFnZVNvdXJjZTogewotICAgICAg
ICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+Ym9yZGVySW1hZ2VTb3VyY2UoKSAmJiBtX3N0YXRl
LnN0eWxlKCktPmJvcmRlckltYWdlU291cmNlKCktPmlzUGVuZGluZ0ltYWdlKCkpCi0gICAgICAg
ICAgICAgICAgbV9zdGF0ZS5zdHlsZSgpLT5zZXRCb3JkZXJJbWFnZVNvdXJjZShsb2FkUGVuZGlu
Z0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5zdHlsZSgpLT5i
b3JkZXJJbWFnZVNvdXJjZSgpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdEJveFJlZmxlY3Q6IHsKLSAgICAgICAgICAgIGlm
IChTdHlsZVJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtX3N0YXRlLnN0eWxlKCktPmJveFJlZmxl
Y3QoKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IE5pbmVQaWVjZUltYWdlJiBtYXNrSW1hZ2Ug
PSByZWZsZWN0aW9uLT5tYXNrKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hc2tJbWFnZS5pbWFn
ZSgpICYmIG1hc2tJbWFnZS5pbWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIFJlZlB0cjxTdHlsZUltYWdlPiBsb2FkZWRJbWFnZSA9IGxvYWRQZW5kaW5nSW1h
Z2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2UqPihtYXNrSW1hZ2UuaW1hZ2UoKSkpOwot
ICAgICAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5zZXRNYXNrKE5pbmVQaWVjZUltYWdlKGxv
YWRlZEltYWdlLnJlbGVhc2UoKSwgbWFza0ltYWdlLmltYWdlU2xpY2VzKCksIG1hc2tJbWFnZS5m
aWxsKCksIG1hc2tJbWFnZS5ib3JkZXJTbGljZXMoKSwgbWFza0ltYWdlLm91dHNldCgpLCBtYXNr
SW1hZ2UuaG9yaXpvbnRhbFJ1bGUoKSwgbWFza0ltYWdlLnZlcnRpY2FsUnVsZSgpKSk7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IH0KLSAgICAgICAgY2FzZSBDU1NQcm9wZXJ0eVdlYmtpdE1hc2tCb3hJbWFnZVNvdXJjZTogewot
ICAgICAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGUoKS0+bWFza0JveEltYWdlU291cmNlKCkgJiYg
bV9zdGF0ZS5zdHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKS0+aXNQZW5kaW5nSW1hZ2UoKSkK
LSAgICAgICAgICAgICAgICBtX3N0YXRlLnN0eWxlKCktPnNldE1hc2tCb3hJbWFnZVNvdXJjZShs
b2FkUGVuZGluZ0ltYWdlKHN0YXRpY19jYXN0PFN0eWxlUGVuZGluZ0ltYWdlKj4obV9zdGF0ZS5z
dHlsZSgpLT5tYXNrQm94SW1hZ2VTb3VyY2UoKSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIGNhc2UgQ1NTUHJvcGVydHlXZWJraXRNYXNrSW1hZ2U6IHsKLSAgICAg
ICAgICAgIGZvciAoRmlsbExheWVyKiBtYXNrTGF5ZXIgPSBtX3N0YXRlLnN0eWxlKCktPmFjY2Vz
c01hc2tMYXllcnMoKTsgbWFza0xheWVyOyBtYXNrTGF5ZXIgPSBtYXNrTGF5ZXItPm5leHQoKSkg
ewotICAgICAgICAgICAgICAgIGlmIChtYXNrTGF5ZXItPmltYWdlKCkgJiYgbWFza0xheWVyLT5p
bWFnZSgpLT5pc1BlbmRpbmdJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBtYXNrTGF5ZXIt
PnNldEltYWdlKGxvYWRQZW5kaW5nSW1hZ2Uoc3RhdGljX2Nhc3Q8U3R5bGVQZW5kaW5nSW1hZ2Uq
PihtYXNrTGF5ZXItPmltYWdlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtX3N0YXRlLnBlbmRpbmdJbWFnZVBy
b3BlcnRpZXMoKS5jbGVhcigpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmxvYWRQZW5kaW5n
UmVzb3VyY2VzKCkKLXsKLSAgICAvLyBTdGFydCBsb2FkaW5nIGltYWdlcyByZWZlcmVuY2VkIGJ5
IHRoaXMgc3R5bGUuCi0gICAgbG9hZFBlbmRpbmdJbWFnZXMoKTsKLQotI2lmIEVOQUJMRShDU1Nf
U0hBREVSUykKLSAgICAvLyBTdGFydCBsb2FkaW5nIHRoZSBzaGFkZXJzIHJlZmVyZW5jZWQgYnkg
dGhpcyBzdHlsZS4KLSAgICBsb2FkUGVuZGluZ1NoYWRlcnMoKTsKLSNlbmRpZgotICAgIAotI2lm
IEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICAvLyBTdGFydCBsb2FkaW5n
IHRoZSBTVkcgRG9jdW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhpcyBzdHlsZS4KLSAgICBsb2FkUGVu
ZGluZ1NWR0RvY3VtZW50cygpOwotI2VuZGlmCi19Ci0KLWlubGluZSBTdHlsZVJlc29sdmVyOjpN
YXRjaGVkUHJvcGVydGllczo6TWF0Y2hlZFByb3BlcnRpZXMoKQotICAgIDogcG9zc2libHlQYWRk
ZWRNZW1iZXIoMCkKLXsKLX0KLQotaW5saW5lIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0
aWVzOjp+TWF0Y2hlZFByb3BlcnRpZXMoKQotewotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Ok1h
dGNoZWRQcm9wZXJ0aWVzOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1v
cnlPYmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9i
amVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1l
bWJlcihwcm9wZXJ0aWVzLCAicHJvcGVydGllcyIpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6
Ok1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJdGVtOjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmpl
Y3RJbmZvKiBtZW1vcnlPYmplY3RJbmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBp
bmZvKG1lbW9yeU9iamVjdEluZm8sIHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAg
ICBpbmZvLmFkZE1lbWJlcihtYXRjaGVkUHJvcGVydGllcywgIm1hdGNoZWRQcm9wZXJ0aWVzIik7
Ci0gICAgaW5mby5hZGRNZW1iZXIocmFuZ2VzLCAicmFuZ2VzIik7Ci0gICAgaW5mby5hZGRNZW1i
ZXIocmVuZGVyU3R5bGUsICJyZW5kZXJTdHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKHBhcmVu
dFJlbmRlclN0eWxlLCAicGFyZW50UmVuZGVyU3R5bGUiKTsKLX0KLQotdm9pZCBNZWRpYVF1ZXJ5
UmVzdWx0OjpyZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKiBtZW1vcnlPYmplY3RJ
bmZvKSBjb25zdAotewotICAgIE1lbW9yeUNsYXNzSW5mbyBpbmZvKG1lbW9yeU9iamVjdEluZm8s
IHRoaXMsIFdlYkNvcmVNZW1vcnlUeXBlczo6Q1NTKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX2V4
cHJlc3Npb24sICJleHByZXNzaW9uIik7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6cmVwb3J0
TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyogbWVtb3J5T2JqZWN0SW5mbykgY29uc3QKLXsK
LSAgICBNZW1vcnlDbGFzc0luZm8gaW5mbyhtZW1vcnlPYmplY3RJbmZvLCB0aGlzLCBXZWJDb3Jl
TWVtb3J5VHlwZXM6OkNTUyk7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9ydWxlU2V0cywgInJ1bGVT
ZXRzIik7Ci0gICAgaW5mby5hZGRNZW1iZXIobV9rZXlmcmFtZXNSdWxlTWFwLCAia2V5ZnJhbWVz
UnVsZU1hcCIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZSwg
Im1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihtX21hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGVTd2VlcFRpbWVyLCAibWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGlt
ZXIiKTsKLQotICAgIGluZm8uYWRkTWVtYmVyKG1fbWVkaXVtLCAibWVkaXVtIik7Ci0gICAgaW5m
by5hZGRNZW1iZXIobV9yb290RGVmYXVsdFN0eWxlLCAicm9vdERlZmF1bHRTdHlsZSIpOwotICAg
IGluZm8uYWRkTWVtYmVyKG1fZG9jdW1lbnQsICJkb2N1bWVudCIpOwotCi0gICAgaW5mby5hZGRN
ZW1iZXIobV9mb250U2VsZWN0b3IsICJmb250U2VsZWN0b3IiKTsKLSAgICBpbmZvLmFkZE1lbWJl
cihtX3ZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdHMsICJ2aWV3cG9ydERlcGVuZGVu
dE1lZGlhUXVlcnlSZXN1bHRzIik7Ci0gICAgaW5mby5pZ25vcmVNZW1iZXIobV9zdHlsZUJ1aWxk
ZXIpOwotICAgIGluZm8uYWRkTWVtYmVyKG1faW5zcGVjdG9yQ1NTT01XcmFwcGVycyk7Ci0gICAg
aW5mby5hZGRNZW1iZXIobV9zY29wZVJlc29sdmVyLCAic2NvcGVSZXNvbHZlciIpOwotCi0gICAg
aW5mby5hZGRNZW1iZXIobV9zdGF0ZSwgInN0YXRlIik7Ci0KLSAgICAvLyBGSVhNRTogbW92ZSB0
aGlzIHRvIGEgcGxhY2Ugd2hlcmUgaXQgd291bGQgYmUgY2FsbGVkIG9ubHkgb25jZT8KLSAgICBp
bmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1bHRTdHlsZSwgImRlZmF1
bHRTdHlsZSIpOwotICAgIGluZm8uYWRkTWVtYmVyKENTU0RlZmF1bHRTdHlsZVNoZWV0czo6ZGVm
YXVsdFF1aXJrc1N0eWxlLCAiZGVmYXVsdFF1aXJrc1N0eWxlIik7Ci0gICAgaW5mby5hZGRNZW1i
ZXIoQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwiZGVmYXVsdFByaW50
U3R5bGUiKTsKLSAgICBpbmZvLmFkZE1lbWJlcihDU1NEZWZhdWx0U3R5bGVTaGVldHM6OmRlZmF1
bHRWaWV3U291cmNlU3R5bGUsICJkZWZhdWx0Vmlld1NvdXJjZVN0eWxlIik7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxl
Y3Rvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9QYWdlUnVsZUNvbGxlY3Rv
ci5oCShyZXZpc2lvbiAxNDUxODEpCShmcm9tIFNvdXJjZS9XZWJDb3JlL2Nzcy9TdHlsZVJlc29s
dmVyLmg6MTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29sbGVjdG9yLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5
OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAw
NCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFN0eWxlUmVzb2x2ZXJfaAorI2RlZmluZSBT
dHlsZVJlc29sdmVyX2gKKworI2luY2x1ZGUgIkNTU1J1bGVMaXN0LmgiCisjaW5jbHVkZSAiQ1NT
VG9TdHlsZU1hcC5oIgorI2luY2x1ZGUgIkNTU1ZhbHVlTGlzdC5oIgorI2luY2x1ZGUgIkRvY3Vt
ZW50UnVsZVNldHMuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDU1NPTVdyYXBwZXJzLmgiCisjaW5j
bHVkZSAiTGlua0hhc2guaCIKKyNpbmNsdWRlICJNZWRpYVF1ZXJ5RXhwLmgiCisjaW5jbHVkZSAi
UmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRlICJSdWxlRmVhdHVyZS5oIgorI2luY2x1ZGUgIlJ1bGVT
ZXQuaCIKKyNpbmNsdWRlICJSdW50aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU2Ny
b2xsVHlwZXMuaCIKKyNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXIuaCIKKyNpbmNsdWRlICJTZWxl
Y3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlN0eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUg
IlN0eWxlU2NvcGVSZXNvbHZlci5oIgorI2luY2x1ZGUgIlZpZXdwb3J0U3R5bGVSZXNvbHZlci5o
IgorI2lmIEVOQUJMRShDU1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJXZWJL
aXRDU1NTVkdEb2N1bWVudFZhbHVlLmgiCisjZW5kaWYKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5o
PgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdIYXNo
Lmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2VudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFydE1pbmlt
dW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUgfTsKKworY2xhc3MgQ1NT
Q3Vyc29ySW1hZ2VWYWx1ZTsKK2NsYXNzIENTU0ZvbnRTZWxlY3RvcjsKK2NsYXNzIENTU0ZvbnRG
YWNlOworY2xhc3MgQ1NTRm9udEZhY2VSdWxlOworY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0b3JWYWx1
ZTsKK2NsYXNzIENTU0ltYWdlU2V0VmFsdWU7CitjbGFzcyBDU1NJbWFnZVZhbHVlOworY2xhc3Mg
Q1NTUGFnZVJ1bGU7CitjbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKK2NsYXNzIENTU1Byb3BlcnR5
OworY2xhc3MgQ1NTUnVsZUxpc3Q7CitjbGFzcyBDU1NTZWxlY3RvcjsKK2NsYXNzIENTU1N0eWxl
U2hlZXQ7CitjbGFzcyBDU1NWYWx1ZTsKK2NsYXNzIENvbnRhaW5lck5vZGU7CitjbGFzcyBDdXN0
b21GaWx0ZXJPcGVyYXRpb247CitjbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXI7CitjbGFzcyBD
dXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OworY2xhc3MgRG9jdW1lbnQ7CitjbGFzcyBFbGVtZW50
OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZVZpZXc7CitjbGFzcyBLVVJMOworY2xhc3MgS2V5
ZnJhbWVMaXN0OworY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKK2NsYXNzIE1lZGlhUXVlcnlFdmFsdWF0
b3I7CitjbGFzcyBOb2RlOworY2xhc3MgUmVuZGVyUmVnaW9uOworY2xhc3MgUmVuZGVyU2Nyb2xs
YmFyOworY2xhc3MgUnVsZURhdGE7CitjbGFzcyBSdWxlU2V0OworY2xhc3MgU2V0dGluZ3M7Citj
bGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKK2NsYXNzIFN0eWxlQnVpbGRlcjsKK2NsYXNzIFN0eWxl
U2NvcGVSZXNvbHZlcjsKK2NsYXNzIFN0eWxlSW1hZ2U7CitjbGFzcyBTdHlsZUtleWZyYW1lOwor
Y2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7CitjbGFzcyBTdHlsZVByb3BlcnR5U2V0OworY2xhc3Mg
U3R5bGVSdWxlOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorY2xhc3MgU3R5bGVSdWxlSG9zdDsK
KyNlbmRpZgorY2xhc3MgU3R5bGVSdWxlS2V5ZnJhbWVzOworY2xhc3MgU3R5bGVSdWxlUGFnZTsK
K2NsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKK2NsYXNzIFN0eWxlU2hhZGVyOworY2xhc3MgU3R5bGVT
aGVldDsKK2NsYXNzIFN0eWxlU2hlZXRMaXN0OworY2xhc3MgU3R5bGVkRWxlbWVudDsKK2NsYXNz
IFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKK2NsYXNzIFdlYktpdENTU0ZpbHRlclZhbHVlOworY2xh
c3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7CitjbGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVudFZhbHVl
OworCitjbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShN
ZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAg
TWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHByLCBib29sIHJlc3VsdCkK
KyAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhwcikKKyAgICAgICAgLCBtX3Jlc3VsdChyZXN1bHQp
CisgICAgeworICAgIH0KKyAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdElu
Zm8qKSBjb25zdDsKKworICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNzaW9uOworICAgIGJvb2wg
bV9yZXN1bHQ7Cit9OworCitlbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHsKKyAgICBBbGxvd1N0
eWxlU2hhcmluZywKKyAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKK307CisKKy8vIE1hdGNoT25s
eVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywgd2hlcmUgcmVsYXRpdmUg
dW5pdHMKKy8vIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50IHJvb3Qg
ZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBvbmx5CisvLyBmcm9tIHRoZSBVc2VyIEFnZW50IFN0
eWxlc2hlZXQgcnVsZXMuCisKK2VudW0gUnVsZU1hdGNoaW5nQmVoYXZpb3IgeworICAgIE1hdGNo
QWxsUnVsZXMsCisgICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwsCisgICAgTWF0Y2hPbmx5
VXNlckFnZW50UnVsZXMsCit9OworCitjbGFzcyBQc2V1ZG9TdHlsZVJlcXVlc3QgeworcHVibGlj
OgorICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVyU2Nyb2xs
YmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBOb1BhcnQp
CisgICAgICAgIDogcHNldWRvSWQocHNldWRvSWQpCisgICAgICAgICwgc2Nyb2xsYmFyUGFydChz
Y3JvbGxiYXJQYXJ0KQorICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxiYXIpCisgICAgeworICAg
IH0KKworICAgIFBzZXVkb0lkIHBzZXVkb0lkOworICAgIFNjcm9sbGJhclBhcnQgc2Nyb2xsYmFy
UGFydDsKKyAgICBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKK307CisKK2NsYXNzIE1hdGNo
UmVxdWVzdCB7CitwdWJsaWM6CisgICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJv
b2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUg
PSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRh
cnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgICAgICA6IHJ1
bGVTZXQocnVsZVNldCkKKyAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRlRW1wdHlS
dWxlcykKKyAgICAgICAgLCBzY29wZShzY29wZSkKKyAgICAgICAgLCBiZWhhdmlvckF0Qm91bmRh
cnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0KKyAgICBjb25zdCBSdWxlU2V0KiBydWxlU2V0Owor
ICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXM7CisgICAgY29uc3QgQ29udGFpbmVyTm9k
ZSogc2NvcGU7CisgICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91bmRhcnkg
YmVoYXZpb3JBdEJvdW5kYXJ5OworfTsKKworLy8gVGhpcyBjbGFzcyBzZWxlY3RzIGEgUmVuZGVy
U3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Ygc3R5bGVz
aGVldHMuCitjbGFzcyBTdHlsZVJlc29sdmVyIHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShT
dHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgU3R5
bGVSZXNvbHZlcihEb2N1bWVudCosIGJvb2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKKyAg
ICB+U3R5bGVSZXNvbHZlcigpOworCisgICAgLy8gVXNpbmcgdGhlc2UgZHVyaW5nIHRyZWUgd2Fs
ayB3aWxsIGFsbG93IHN0eWxlIHNlbGVjdG9yIHRvIG9wdGltaXplIGNoaWxkIGFuZCBkZXNjZW5k
YW50IHNlbGVjdG9yIGxvb2t1cHMuCisgICAgdm9pZCBwdXNoUGFyZW50RWxlbWVudChFbGVtZW50
Kik7CisgICAgdm9pZCBwb3BQYXJlbnRFbGVtZW50KEVsZW1lbnQqKTsKKyAgICB2b2lkIHB1c2hQ
YXJlbnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKKyAgICB2b2lkIHBvcFBhcmVudFNo
YWRvd1Jvb3QoY29uc3QgU2hhZG93Um9vdCopOworI2lmIEVOQUJMRShTSEFET1dfRE9NKQorICAg
IHZvaWQgYWRkSG9zdFJ1bGUoU3R5bGVSdWxlSG9zdCogcnVsZSwgYm9vbCBoYXNEb2N1bWVudFNl
Y3VyaXR5T3JpZ2luLCBjb25zdCBDb250YWluZXJOb2RlKiBzY29wZSkgeyBlbnN1cmVTY29wZVJl
c29sdmVyKCktPmFkZEhvc3RSdWxlKHJ1bGUsIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIHNj
b3BlKTsgfQorI2VuZGlmCisKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZUZvckVs
ZW1lbnQoRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFN0eWxlU2hhcmlu
Z0JlaGF2aW9yID0gQWxsb3dTdHlsZVNoYXJpbmcsCisgICAgICAgIFJ1bGVNYXRjaGluZ0JlaGF2
aW9yID0gTWF0Y2hBbGxSdWxlcywgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nID0gMCk7
CisKKyAgICB2b2lkIGtleWZyYW1lU3R5bGVzRm9yQW5pbWF0aW9uKEVsZW1lbnQqLCBjb25zdCBS
ZW5kZXJTdHlsZSosIEtleWZyYW1lTGlzdCYpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHls
ZT4gcHNldWRvU3R5bGVGb3JFbGVtZW50KEVsZW1lbnQqLCBjb25zdCBQc2V1ZG9TdHlsZVJlcXVl
c3QmLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJT
dHlsZT4gc3R5bGVGb3JQYWdlKGludCBwYWdlSW5kZXgpOworICAgIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IGRlZmF1bHRTdHlsZUZvckVsZW1lbnQoKTsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBzdHlsZUZvclRleHQoVGV4dCopOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IHN0eWxlRm9yRG9jdW1lbnQoRG9jdW1lbnQqLCBDU1NGb250U2VsZWN0b3IqID0gMCk7
CisKKyAgICBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnN0eWxl
KCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0
YXRlLnBhcmVudFN0eWxlKCk7IH0KKyAgICBSZW5kZXJTdHlsZSogcm9vdEVsZW1lbnRTdHlsZSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpOyB9CisgICAgRWxlbWVu
dCogZWxlbWVudCgpIHsgcmV0dXJuIG1fc3RhdGUuZWxlbWVudCgpOyB9CisgICAgRG9jdW1lbnQq
IGRvY3VtZW50KCkgeyByZXR1cm4gbV9kb2N1bWVudDsgfQorICAgIFN0eWxlU2NvcGVSZXNvbHZl
ciogc2NvcGVSZXNvbHZlcigpIGNvbnN0IHsgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQoKTsg
fQorICAgIGJvb2wgaGFzUGFyZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUucGFyZW50
Tm9kZSgpOyB9CisKKyAgICAvLyBGSVhNRTogSXQgY291bGQgYmUgYmV0dGVyIHRvIGNhbGwgbV9y
dWxlU2V0cy5hcHBlbmRBdXRob3JTdHlsZVNoZWV0cygpIGRpcmVjdGx5IGFmdGVyIHdlIGZhY3Rv
ciBTdHlsZVJzb2x2ZXIgZnVydGhlci4KKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTA4ODkwCisgICAgdm9pZCBhcHBlbmRBdXRob3JTdHlsZVNoZWV0cyh1
bnNpZ25lZCBmaXJzdE5ldywgY29uc3QgVmVjdG9yPFJlZlB0cjxDU1NTdHlsZVNoZWV0PiA+Jik7
CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7
IH0KKyAgICBjb25zdCBEb2N1bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJu
IG1fcnVsZVNldHM7IH0KKworI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpIHx8IEVOQUJMRShTSEFE
T1dfRE9NKQorICAgIFN0eWxlU2NvcGVSZXNvbHZlciogZW5zdXJlU2NvcGVSZXNvbHZlcigpCisg
ICAgeworI2lmIEVOQUJMRShTVFlMRV9TQ09QRUQpCisjaWYgRU5BQkxFKFNIQURPV19ET00pCisg
ICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkg
fHwgUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c3R5bGVTY29wZWRFbmFibGVkKCkpOworI2Vsc2UK
KyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxl
ZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgQVNTRVJUKFJ1bnRpbWVFbmFibGVkRmVhdHVy
ZXM6OnNoYWRvd0RPTUVuYWJsZWQoKSk7CisjZW5kaWYKKyAgICAgICAgaWYgKCFtX3Njb3BlUmVz
b2x2ZXIpCisgICAgICAgICAgICBtX3Njb3BlUmVzb2x2ZXIgPSBhZG9wdFB0cihuZXcgU3R5bGVT
Y29wZVJlc29sdmVyKCkpOworICAgICAgICByZXR1cm4gbV9zY29wZVJlc29sdmVyLmdldCgpOwor
ICAgIH0KKyNlbmRpZgorCitwcml2YXRlOgorICAgIHZvaWQgaW5pdEVsZW1lbnQoRWxlbWVudCop
OworICAgIFJlbmRlclN0eWxlKiBsb2NhdGVTaGFyZWRTdHlsZSgpOworICAgIGJvb2wgc3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc1J1bGVTZXQoUnVsZVNldCopOworICAgIGJvb2wgc3R5bGVT
aGFyaW5nQ2FuZGlkYXRlTWF0Y2hlc0hvc3RSdWxlcygpOworICAgIE5vZGUqIGxvY2F0ZUNvdXNp
bkxpc3QoRWxlbWVudCogcGFyZW50LCB1bnNpZ25lZCYgdmlzaXRlZE5vZGVDb3VudCkgY29uc3Q7
CisgICAgU3R5bGVkRWxlbWVudCogZmluZFNpYmxpbmdGb3JTdHlsZVNoYXJpbmcoTm9kZSosIHVu
c2lnbmVkJiBjb3VudCkgY29uc3Q7CisgICAgYm9vbCBjYW5TaGFyZVN0eWxlV2l0aEVsZW1lbnQo
U3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5
bGVGb3JLZXlmcmFtZShjb25zdCBSZW5kZXJTdHlsZSosIGNvbnN0IFN0eWxlS2V5ZnJhbWUqLCBL
ZXlmcmFtZVZhbHVlJik7CisKK3B1YmxpYzoKKyAgICAvLyBUaGVzZSBtZXRob2RzIHdpbGwgZ2l2
ZSBiYWNrIHRoZSBzZXQgb2YgcnVsZXMgdGhhdCBtYXRjaGVkIGZvciBhIGdpdmVuIGVsZW1lbnQg
KG9yIGEgcHNldWRvLWVsZW1lbnQpLgorICAgIGVudW0gQ1NTUnVsZUZpbHRlciB7CisgICAgICAg
IFVBQW5kVXNlckNTU1J1bGVzICAgPSAxIDw8IDEsCisgICAgICAgIEF1dGhvckNTU1J1bGVzICAg
ICAgPSAxIDw8IDIsCisgICAgICAgIEVtcHR5Q1NTUnVsZXMgICAgICAgPSAxIDw8IDMsCisgICAg
ICAgIENyb3NzT3JpZ2luQ1NTUnVsZXMgPSAxIDw8IDQsCisgICAgICAgIEFsbEJ1dEVtcHR5Q1NT
UnVsZXMgPSBVQUFuZFVzZXJDU1NSdWxlcyB8IEF1dGhvckNTU1J1bGVzIHwgQ3Jvc3NPcmlnaW5D
U1NSdWxlcywKKyAgICAgICAgQWxsQ1NTUnVsZXMgICAgICAgICA9IEFsbEJ1dEVtcHR5Q1NTUnVs
ZXMgfCBFbXB0eUNTU1J1bGVzLAorICAgIH07CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4g
c3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCosIHVuc2lnbmVkIHJ1bGVzVG9JbmNsdWRlID0g
QWxsQnV0RW1wdHlDU1NSdWxlcyk7CisgICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gcHNldWRv
U3R5bGVSdWxlc0ZvckVsZW1lbnQoRWxlbWVudCosIFBzZXVkb0lkLCB1bnNpZ25lZCBydWxlc1Rv
SW5jbHVkZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOworCisgICAgLy8gR2l2ZW4gYSBDU1Mga2V5
d29yZCBpbiB0aGUgcmFuZ2UgKHh4LXNtYWxsIHRvIC13ZWJraXQteHh4LWxhcmdlKSwgdGhpcyBm
dW5jdGlvbiB3aWxsIHJldHVybgorICAgIC8vIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBzY2FsZWQg
cmVsYXRpdmUgdG8gdGhlIHVzZXIncyBkZWZhdWx0IChtZWRpdW0pLgorICAgIHN0YXRpYyBmbG9h
dCBmb250U2l6ZUZvcktleXdvcmQoRG9jdW1lbnQqLCBpbnQga2V5d29yZCwgYm9vbCBzaG91bGRV
c2VGaXhlZERlZmF1bHRTaXplKTsKKworICAgIC8vIEdpdmVuIGEgZm9udCBzaXplIGluIHBpeGVs
LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGxlZ2FjeSBmb250IHNpemUgYmV0d2VlbiAxIGFu
ZCA3LgorICAgIHN0YXRpYyBpbnQgbGVnYWN5Rm9udFNpemUoRG9jdW1lbnQqLCBpbnQgcGl4ZWxG
b250U2l6ZSwgYm9vbCBzaG91bGRVc2VGaXhlZERlZmF1bHRTaXplKTsKKworcHVibGljOgorICAg
IHZvaWQgYXBwbHlQcm9wZXJ0eVRvU3R5bGUoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqLCBSZW5k
ZXJTdHlsZSopOworCisgICAgdm9pZCBhcHBseVByb3BlcnR5VG9DdXJyZW50U3R5bGUoQ1NTUHJv
cGVydHlJRCwgQ1NTVmFsdWUqKTsKKworICAgIHZvaWQgdXBkYXRlRm9udCgpOworICAgIHZvaWQg
aW5pdGlhbGl6ZUZvbnRTdHlsZShTZXR0aW5ncyopOworCisgICAgc3RhdGljIGZsb2F0IGdldENv
bXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50KiwgZmxvYXQgem9vbUZhY3Rvciwg
Ym9vbCBpc0Fic29sdXRlU2l6ZSwgZmxvYXQgc3BlY2lmaWVkU2l6ZSwgRVNtYXJ0TWluaW11bUZv
ckZvbnRTaXplID0gVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUpOworCisgICAgdm9pZCBzZXRG
b250U2l6ZShGb250RGVzY3JpcHRpb24mLCBmbG9hdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBz
dGF0aWMgZmxvYXQgZ2V0Q29tcHV0ZWRTaXplRnJvbVNwZWNpZmllZFNpemUoRG9jdW1lbnQqLCBS
ZW5kZXJTdHlsZSosIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIGJv
b2wgdXNlU1ZHWm9vbVJ1bGVzKTsKKworcHVibGljOgorICAgIGJvb2wgdXNlU1ZHWm9vbVJ1bGVz
KCk7CisKKyAgICBzdGF0aWMgYm9vbCBjb2xvckZyb21QcmltaXRpdmVWYWx1ZUlzRGVyaXZlZEZy
b21FbGVtZW50KENTU1ByaW1pdGl2ZVZhbHVlKik7CisgICAgQ29sb3IgY29sb3JGcm9tUHJpbWl0
aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUqLCBib29sIGZvclZpc2l0ZWRMaW5rID0gZmFsc2Up
IGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxlY3RvckZvcklkKGNvbnN0IEF0b21pY1N0cmluZyYp
IGNvbnN0OworICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JDbGFzcyhjb25zdCBBdG9taWNTdHJpbmcm
KSBjb25zdDsKKyAgICBib29sIGhhc1NlbGVjdG9yRm9yQXR0cmlidXRlKGNvbnN0IEF0b21pY1N0
cmluZyYpIGNvbnN0OworCisgICAgQ1NTRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25z
dCB7IHJldHVybiBtX2ZvbnRTZWxlY3Rvci5nZXQoKTsgfQorI2lmIEVOQUJMRShDU1NfREVWSUNF
X0FEQVBUQVRJT04pCisgICAgVmlld3BvcnRTdHlsZVJlc29sdmVyKiB2aWV3cG9ydFN0eWxlUmVz
b2x2ZXIoKSB7IHJldHVybiBtX3ZpZXdwb3J0U3R5bGVSZXNvbHZlci5nZXQoKTsgfQorI2VuZGlm
CisKKyAgICB2b2lkIGFkZFZpZXdwb3J0RGVwZW5kZW50TWVkaWFRdWVyeVJlc3VsdChjb25zdCBN
ZWRpYVF1ZXJ5RXhwKiwgYm9vbCByZXN1bHQpOworICAgIGJvb2wgaGFzVmlld3BvcnREZXBlbmRl
bnRNZWRpYVF1ZXJpZXMoKSBjb25zdCB7IHJldHVybiAhbV92aWV3cG9ydERlcGVuZGVudE1lZGlh
UXVlcnlSZXN1bHRzLmlzRW1wdHkoKTsgfQorICAgIGJvb2wgYWZmZWN0ZWRCeVZpZXdwb3J0Q2hh
bmdlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZEtleWZyYW1lU3R5bGUoUGFzc1JlZlB0cjxTdHls
ZVJ1bGVLZXlmcmFtZXM+KTsKKworICAgIGJvb2wgY2hlY2tSZWdpb25TdHlsZShFbGVtZW50KiBy
ZWdpb25FbGVtZW50KTsKKworICAgIGJvb2wgdXNlc1NpYmxpbmdSdWxlcygpIGNvbnN0IHsgcmV0
dXJuICFtX3J1bGVTZXRzLmZlYXR1cmVzKCkuc2libGluZ1J1bGVzLmlzRW1wdHkoKTsgfQorICAg
IGJvb2wgdXNlc0ZpcnN0TGluZVJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0
dXJlcygpLnVzZXNGaXJzdExpbmVSdWxlczsgfQorICAgIGJvb2wgdXNlc0JlZm9yZUFmdGVyUnVs
ZXMoKSBjb25zdCB7IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkudXNlc0JlZm9yZUFmdGVy
UnVsZXM7IH0KKworICAgIHN0YXRpYyBib29sIGNyZWF0ZVRyYW5zZm9ybU9wZXJhdGlvbnMoQ1NT
VmFsdWUqIGluVmFsdWUsIFJlbmRlclN0eWxlKiBpblN0eWxlLCBSZW5kZXJTdHlsZSogcm9vdFN0
eWxlLCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBvdXRPcGVyYXRpb25zKTsKKyAgICAKKyAgICB2b2lk
IGludmFsaWRhdGVNYXRjaGVkUHJvcGVydGllc0NhY2hlKCk7CisKKyNpZiBFTkFCTEUoQ1NTX0ZJ
TFRFUlMpCisgICAgYm9vbCBjcmVhdGVGaWx0ZXJPcGVyYXRpb25zKENTU1ZhbHVlKiBpblZhbHVl
LCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJvb3RTdHlsZSwgRmlsdGVyT3Bl
cmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7CisjaWYgRU5BQkxFKENTU19TSEFERVJTKQorICAgIFN0
eWxlU2hhZGVyKiBzdHlsZVNoYWRlcihDU1NWYWx1ZSopOworICAgIFN0eWxlU2hhZGVyKiBjYWNo
ZWRPclBlbmRpbmdTdHlsZVNoYWRlckZyb21WYWx1ZShXZWJLaXRDU1NTaGFkZXJWYWx1ZSopOwor
ICAgIGJvb2wgcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0KENTU1ZhbHVlKiwgQ3VzdG9t
RmlsdGVyUGFyYW1ldGVyTGlzdCYpOworICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1l
dGVyPiBwYXJzZUN1c3RvbUZpbHRlclBhcmFtZXRlcihjb25zdCBTdHJpbmcmIG5hbWUsIENTU1Zh
bHVlKik7CisgICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9t
RmlsdGVyQXJyYXlQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsK
KyAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJO
dW1iZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQ
YXNzUmVmUHRyPEN1c3RvbUZpbHRlclBhcmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJUcmFuc2Zv
cm1QYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBDU1NWYWx1ZUxpc3QqKTsKKyAgICBQYXNz
UmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3BlcmF0aW9u
V2l0aEF0UnVsZVJlZmVyZW5jZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIFBh
c3NSZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRp
b25XaXRoSW5saW5lU3ludGF4KFdlYktpdENTU0ZpbHRlclZhbHVlKik7CisgICAgUGFzc1JlZlB0
cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJhdGlvbihXZWJL
aXRDU1NGaWx0ZXJWYWx1ZSopOworICAgIHZvaWQgbG9hZFBlbmRpbmdTaGFkZXJzKCk7CisjZW5k
aWYKKyNpZiBFTkFCTEUoU1ZHKQorICAgIHZvaWQgbG9hZFBlbmRpbmdTVkdEb2N1bWVudHMoKTsK
KyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShDU1NfRklMVEVSUykKKworICAgIHZvaWQgbG9hZFBl
bmRpbmdSZXNvdXJjZXMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGZpeGVz
IHVwIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpZiBpdCBkZXRlY3RzIHRoYXQgdGhlIGN1cnJlbnQg
Z2VuZXJpYyBmb250IGZhbWlseSBoYXMgY2hhbmdlZC4gLWR3aAorICAgIHZvaWQgY2hlY2tGb3JH
ZW5lcmljRmFtaWx5Q2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxl
KTsKKyAgICB2b2lkIGNoZWNrRm9yWm9vbUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiBwYXJlbnRTdHlsZSk7CisKKyAgICB2b2lkIGFkanVzdFJlbmRlclN0eWxlKFJlbmRlclN0eWxl
KiBzdHlsZVRvQWRqdXN0LCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUsIEVsZW1lbnQqKTsKKwor
ICAgIHN0cnVjdCBSdWxlUmFuZ2UgeworICAgICAgICBSdWxlUmFuZ2UoaW50JiBmaXJzdFJ1bGVJ
bmRleCwgaW50JiBsYXN0UnVsZUluZGV4KTogZmlyc3RSdWxlSW5kZXgoZmlyc3RSdWxlSW5kZXgp
LCBsYXN0UnVsZUluZGV4KGxhc3RSdWxlSW5kZXgpIHsgfQorICAgICAgICBpbnQmIGZpcnN0UnVs
ZUluZGV4OworICAgICAgICBpbnQmIGxhc3RSdWxlSW5kZXg7CisgICAgfTsKKworICAgIHN0cnVj
dCBNYXRjaFJhbmdlcyB7CisgICAgICAgIE1hdGNoUmFuZ2VzKCkgOiBmaXJzdFVBUnVsZSgtMSks
IGxhc3RVQVJ1bGUoLTEpLCBmaXJzdEF1dGhvclJ1bGUoLTEpLCBsYXN0QXV0aG9yUnVsZSgtMSks
IGZpcnN0VXNlclJ1bGUoLTEpLCBsYXN0VXNlclJ1bGUoLTEpIHsgfQorICAgICAgICBpbnQgZmly
c3RVQVJ1bGU7CisgICAgICAgIGludCBsYXN0VUFSdWxlOworICAgICAgICBpbnQgZmlyc3RBdXRo
b3JSdWxlOworICAgICAgICBpbnQgbGFzdEF1dGhvclJ1bGU7CisgICAgICAgIGludCBmaXJzdFVz
ZXJSdWxlOworICAgICAgICBpbnQgbGFzdFVzZXJSdWxlOworICAgICAgICBSdWxlUmFuZ2UgVUFS
dWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVQVJ1bGUsIGxhc3RVQVJ1bGUpOyB9
CisgICAgICAgIFJ1bGVSYW5nZSBhdXRob3JSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2Uo
Zmlyc3RBdXRob3JSdWxlLCBsYXN0QXV0aG9yUnVsZSk7IH0KKyAgICAgICAgUnVsZVJhbmdlIHVz
ZXJSdWxlUmFuZ2UoKSB7IHJldHVybiBSdWxlUmFuZ2UoZmlyc3RVc2VyUnVsZSwgbGFzdFVzZXJS
dWxlKTsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXMgeworICAgICAg
ICBNYXRjaGVkUHJvcGVydGllcygpOworICAgICAgICB+TWF0Y2hlZFByb3BlcnRpZXMoKTsKKyAg
ICAgICAgdm9pZCByZXBvcnRNZW1vcnlVc2FnZShNZW1vcnlPYmplY3RJbmZvKikgY29uc3Q7Cisg
ICAgICAgIAorICAgICAgICBSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4gcHJvcGVydGllczsKKyAg
ICAgICAgdW5pb24geworICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICB1bnNp
Z25lZCBsaW5rTWF0Y2hUeXBlIDogMjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aGl0ZWxp
c3RUeXBlIDogMjsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvLyBVc2VkIHRvIG1ha2Ug
c3VyZSBhbGwgbWVtb3J5IGlzIHplcm8taW5pdGlhbGl6ZWQgc2luY2Ugd2UgY29tcHV0ZSB0aGUg
aGFzaCBvdmVyIHRoZSBieXRlcyBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICAgIHZvaWQqIHBv
c3NpYmx5UGFkZGVkTWVtYmVyOworICAgICAgICB9OworICAgIH07CisKKyAgICBzdHJ1Y3QgTWF0
Y2hSZXN1bHQgeworICAgICAgICBNYXRjaFJlc3VsdCgpIDogaXNDYWNoZWFibGUodHJ1ZSkgeyB9
CisgICAgICAgIFZlY3RvcjxNYXRjaGVkUHJvcGVydGllcywgNjQ+IG1hdGNoZWRQcm9wZXJ0aWVz
OworICAgICAgICBWZWN0b3I8U3R5bGVSdWxlKiwgNjQ+IG1hdGNoZWRSdWxlczsKKyAgICAgICAg
TWF0Y2hSYW5nZXMgcmFuZ2VzOworICAgICAgICBib29sIGlzQ2FjaGVhYmxlOworICAgIH07CisK
KyAgICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhNYXRjaFJlc3VsdCYsIGNvbnN0
IFN0eWxlUHJvcGVydHlTZXQqIHByb3BlcnRpZXMsIFN0eWxlUnVsZSogPSAwLCB1bnNpZ25lZCBs
aW5rTWF0Y2hUeXBlID0gU2VsZWN0b3JDaGVja2VyOjpNYXRjaEFsbCwgUHJvcGVydHlXaGl0ZWxp
c3RUeXBlID0gUHJvcGVydHlXaGl0ZWxpc3ROb25lKTsKKyAgICB2b2lkIGFkZEVsZW1lbnRTdHls
ZVByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiwgYm9vbCBp
c0NhY2hlYWJsZSA9IHRydWUpOworCisgICAgdm9pZCBtYXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0
JiwgYm9vbCBpbmNsdWRlU01JTFByb3BlcnRpZXMpOworICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1h
dGNoUmVzdWx0Jik7CisgICAgdm9pZCBtYXRjaFVBUnVsZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0
Kik7CisgICAgdm9pZCBtYXRjaEF1dGhvclJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRl
RW1wdHlSdWxlcyk7CisgICAgdm9pZCBtYXRjaFVzZXJSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wg
aW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hTY29wZWRBdXRob3JSdWxlcyhNYXRj
aFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOworICAgIHZvaWQgbWF0Y2hIb3N0UnVs
ZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKKworICAgIHZvaWQgY29s
bGVjdE1hdGNoaW5nUnVsZXMoY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisgICAg
dm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihjb25zdCBNYXRjaFJlcXVlc3QmLCBS
dWxlUmFuZ2UmKTsKKyAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChjb25zdCBW
ZWN0b3I8UnVsZURhdGE+KiwgY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7CisKKyAg
ICBib29sIGZhc3RSZWplY3RTZWxlY3Rvcihjb25zdCBSdWxlRGF0YSYpIGNvbnN0OworICAgIHZv
aWQgc29ydE1hdGNoZWRSdWxlcygpOworICAgIHZvaWQgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1
bGVzKE1hdGNoUmVzdWx0Jik7CisKKyAgICBib29sIHJ1bGVNYXRjaGVzKGNvbnN0IFJ1bGVEYXRh
JiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUsIFBzZXVkb0lkJiwgU2VsZWN0b3JDaGVja2Vy
OjpCZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5k
YXJ5KTsKKyAgICBib29sIGNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJl
Z2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KTsKKyAgICB2b2lkIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBjb25zdCBFbGVtZW50Kik7CisgICAg
ZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisg
ICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCisjZW5kaWYKKyAgICAgICAgSGlnaFByaW9yaXR5
UHJvcGVydGllcywKKyAgICAgICAgTG93UHJpb3JpdHlQcm9wZXJ0aWVzCisgICAgfTsKKyAgICB0
ZW1wbGF0ZSA8U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5TWF0Y2hl
ZFByb3BlcnRpZXMoY29uc3QgTWF0Y2hSZXN1bHQmLCBib29sIGltcG9ydGFudCwgaW50IHN0YXJ0
SW5kZXgsIGludCBlbmRJbmRleCwgYm9vbCBpbmhlcml0ZWRPbmx5KTsKKyAgICB0ZW1wbGF0ZSA8
U3R5bGVBcHBsaWNhdGlvblBhc3MgcGFzcz4KKyAgICB2b2lkIGFwcGx5UHJvcGVydGllcyhjb25z
dCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqLCBib29sIGlzSW1wb3J0
YW50LCBib29sIGluaGVyaXRlZE9ubHksIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9IFByb3BlcnR5
V2hpdGVsaXN0Tm9uZSk7CisjaWYgRU5BQkxFKENTU19WQVJJQUJMRVMpCisgICAgdm9pZCByZXNv
bHZlVmFyaWFibGVzKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwgVmVjdG9yPHN0ZDo6cGFpcjxD
U1NQcm9wZXJ0eUlELCBTdHJpbmc+ID4mIGtub3duRXhwcmVzc2lvbnMpOworI2VuZGlmCisgICAg
c3RhdGljIGJvb2wgaXNWYWxpZFJlZ2lvblN0eWxlUHJvcGVydHkoQ1NTUHJvcGVydHlJRCk7Cisj
aWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIHN0YXRpYyBib29sIGlzVmFsaWRDdWVTdHlsZVBy
b3BlcnR5KENTU1Byb3BlcnR5SUQpOworI2VuZGlmCisgICAgdm9pZCBtYXRjaFBhZ2VSdWxlcyhN
YXRjaFJlc3VsdCYsIFJ1bGVTZXQqLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2Us
IGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0
KFZlY3RvcjxTdHlsZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxl
UnVsZVBhZ2UqPiYsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3Ry
aW5nJiBwYWdlTmFtZSk7CisgICAgU2V0dGluZ3MqIGRvY3VtZW50U2V0dGluZ3MoKSB7IHJldHVy
biBtX2RvY3VtZW50LT5zZXR0aW5ncygpOyB9CisKKyAgICBib29sIGlzTGVmdFBhZ2UoaW50IHBh
Z2VJbmRleCkgY29uc3Q7CisgICAgYm9vbCBpc1JpZ2h0UGFnZShpbnQgcGFnZUluZGV4KSBjb25z
dCB7IHJldHVybiAhaXNMZWZ0UGFnZShwYWdlSW5kZXgpOyB9CisgICAgYm9vbCBpc0ZpcnN0UGFn
ZShpbnQgcGFnZUluZGV4KSBjb25zdDsKKyAgICBTdHJpbmcgcGFnZU5hbWUoaW50IHBhZ2VJbmRl
eCkgY29uc3Q7CisKKyAgICBEb2N1bWVudFJ1bGVTZXRzIG1fcnVsZVNldHM7CisKKyAgICB0eXBl
ZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIFJlZlB0cjxTdHlsZVJ1bGVLZXlmcmFtZXM+
ID4gS2V5ZnJhbWVzUnVsZU1hcDsKKyAgICBLZXlmcmFtZXNSdWxlTWFwIG1fa2V5ZnJhbWVzUnVs
ZU1hcDsKKworcHVibGljOgorICAgIHR5cGVkZWYgSGFzaE1hcDxDU1NQcm9wZXJ0eUlELCBSZWZQ
dHI8Q1NTVmFsdWU+ID4gUGVuZGluZ0ltYWdlUHJvcGVydHlNYXA7CisjaWYgRU5BQkxFKENTU19G
SUxURVJTKSAmJiBFTkFCTEUoU1ZHKQorICAgIHR5cGVkZWYgSGFzaE1hcDxGaWx0ZXJPcGVyYXRp
b24qLCBSZWZQdHI8V2ViS2l0Q1NTU1ZHRG9jdW1lbnRWYWx1ZT4gPiBQZW5kaW5nU1ZHRG9jdW1l
bnRNYXA7CisjZW5kaWYKKworICAgIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgV1RGX01BS0VfTk9O
Q09QWUFCTEUoU3RhdGUpOworICAgIHB1YmxpYzoKKyAgICAgICAgU3RhdGUoKQorICAgICAgICA6
IG1fZWxlbWVudCgwKQorICAgICAgICAsIG1fc3R5bGVkRWxlbWVudCgwKQorICAgICAgICAsIG1f
cGFyZW50Tm9kZSgwKQorICAgICAgICAsIG1fcGFyZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3Jv
b3RFbGVtZW50U3R5bGUoMCkKKyAgICAgICAgLCBtX3JlZ2lvbkZvclN0eWxpbmcoMCkKKyAgICAg
ICAgLCBtX3NhbWVPcmlnaW5Pbmx5KGZhbHNlKQorICAgICAgICAsIG1fcHNldWRvU3R5bGVSZXF1
ZXN0KE5PUFNFVURPKQorICAgICAgICAsIG1fZWxlbWVudExpbmtTdGF0ZShOb3RJbnNpZGVMaW5r
KQorICAgICAgICAsIG1fZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KGZhbHNlKQorICAgICAg
ICAsIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzKGZhbHNlKQorICAgICAgICAsIG1fbW9k
ZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKQorICAgICAgICAsIG1fYXBwbHlQcm9w
ZXJ0eVRvUmVndWxhclN0eWxlKHRydWUpCisgICAgICAgICwgbV9hcHBseVByb3BlcnR5VG9WaXNp
dGVkTGlua1N0eWxlKGZhbHNlKQorI2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgLCBt
X2hhc1BlbmRpbmdTaGFkZXJzKGZhbHNlKQorI2VuZGlmCisgICAgICAgICwgbV9saW5lSGVpZ2h0
VmFsdWUoMCkKKyAgICAgICAgLCBtX2ZvbnREaXJ0eShmYWxzZSkKKyAgICAgICAgLCBtX2hhc1VB
QXBwZWFyYW5jZShmYWxzZSkKKyAgICAgICAgLCBtX2JhY2tncm91bmREYXRhKEJhY2tncm91bmRG
aWxsTGF5ZXIpIHsgfQorCisgICAgcHVibGljOgorICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVs
ZW1lbnQqKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxl
bWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVx
dWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgICAgIERvY3Vt
ZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudC0+ZG9jdW1lbnQoKTsgfQor
ICAgICAgICBFbGVtZW50KiBlbGVtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50OyB9Cisg
ICAgICAgIFN0eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3N0
eWxlZEVsZW1lbnQ7IH0KKyAgICAgICAgdm9pZCBzZXRTdHlsZShQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiBzdHlsZSkgeyBtX3N0eWxlID0gc3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQorICAgICAgICBQYXNzUmVmUHRy
PFJlbmRlclN0eWxlPiB0YWtlU3R5bGUoKSB7IHJldHVybiBtX3N0eWxlLnJlbGVhc2UoKTsgfQor
CisgICAgICAgIFN0YXRpY0NTU1J1bGVMaXN0KiBlbnN1cmVSdWxlTGlzdCgpOworICAgICAgICBQ
YXNzUmVmUHRyPENTU1J1bGVMaXN0PiB0YWtlUnVsZUxpc3QoKSB7IHJldHVybiBtX3J1bGVMaXN0
LnJlbGVhc2UoKTsgfQorCisgICAgICAgIGNvbnN0IENvbnRhaW5lck5vZGUqIHBhcmVudE5vZGUo
KSBjb25zdCB7IHJldHVybiBtX3BhcmVudE5vZGU7IH0KKyAgICAgICAgdm9pZCBzZXRQYXJlbnRT
dHlsZShSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpIHsgbV9wYXJlbnRTdHlsZSA9IHBhcmVudFN0
eWxlOyB9CisgICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSgpIGNvbnN0IHsgcmV0dXJu
IG1fcGFyZW50U3R5bGU7IH0KKyAgICAgICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5bGUo
KSBjb25zdCB7IHJldHVybiBtX3Jvb3RFbGVtZW50U3R5bGU7IH0KKworICAgICAgICBjb25zdCBS
ZW5kZXJSZWdpb24qIHJlZ2lvbkZvclN0eWxpbmcoKSBjb25zdCB7IHJldHVybiBtX3JlZ2lvbkZv
clN0eWxpbmc7IH0KKyAgICAgICAgdm9pZCBzZXRTYW1lT3JpZ2luT25seShib29sIGlzU2FtZU9y
aWdpbk9ubHkpIHsgbV9zYW1lT3JpZ2luT25seSA9IGlzU2FtZU9yaWdpbk9ubHk7IH0KKyAgICAg
ICAgYm9vbCBpc1NhbWVPcmlnaW5Pbmx5KCkgY29uc3QgeyByZXR1cm4gbV9zYW1lT3JpZ2luT25s
eTsgfQorICAgICAgICBjb25zdCBQc2V1ZG9TdHlsZVJlcXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVz
dCgpIGNvbnN0IHsgcmV0dXJuIG1fcHNldWRvU3R5bGVSZXF1ZXN0OyB9CisgICAgICAgIEVJbnNp
ZGVMaW5rIGVsZW1lbnRMaW5rU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRMaW5rU3Rh
dGU7IH0KKyAgICAgICAgYm9vbCBkaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQoKSBjb25zdCB7
IHJldHVybiBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludDsgfQorICAgICAgICB2b2lkIHNl
dEVsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhib29sIGlzQWZmZWN0ZWQpIHsgbV9lbGVtZW50
QWZmZWN0ZWRCeUNsYXNzUnVsZXMgPSBpc0FmZmVjdGVkOyB9CisgICAgICAgIGJvb2wgZWxlbWVu
dEFmZmVjdGVkQnlDbGFzc1J1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50QWZmZWN0ZWRC
eUNsYXNzUnVsZXM7IH0KKyAgICAgICAgdm9pZCBzZXRNb2RlKFNlbGVjdG9yQ2hlY2tlcjo6TW9k
ZSBtb2RlKSB7IG1fbW9kZSA9IG1vZGU7IH0KKyAgICAgICAgU2VsZWN0b3JDaGVja2VyOjpNb2Rl
IG1vZGUoKSBjb25zdCB7IHJldHVybiBtX21vZGU7IH0KKyAgICAgICAgCisgICAgICAgIHZvaWQg
c2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KKyAgICAgICAgdm9pZCBzZXRBcHBseVBy
b3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJvcGVydHlU
b1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9CisgICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0
eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9SZWd1bGFy
U3R5bGU7IH0KKyAgICAgICAgYm9vbCBhcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKCkg
Y29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlOyB9CisgICAg
ICAgIFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwJiBwZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzKCkgeyBy
ZXR1cm4gbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOyB9CisjaWYgRU5BQkxFKENTU19GSUxURVJT
KSAmJiBFTkFCTEUoU1ZHKQorICAgICAgICBQZW5kaW5nU1ZHRG9jdW1lbnRNYXAmIHBlbmRpbmdT
VkdEb2N1bWVudHMoKSB7IHJldHVybiBtX3BlbmRpbmdTVkdEb2N1bWVudHM7IH0KKyNlbmRpZgor
I2lmIEVOQUJMRShDU1NfU0hBREVSUykKKyAgICAgICAgdm9pZCBzZXRIYXNQZW5kaW5nU2hhZGVy
cyhib29sIGhhc1BlbmRpbmdTaGFkZXJzKSB7IG1faGFzUGVuZGluZ1NoYWRlcnMgPSBoYXNQZW5k
aW5nU2hhZGVyczsgfQorICAgICAgICBib29sIGhhc1BlbmRpbmdTaGFkZXJzKCkgY29uc3QgeyBy
ZXR1cm4gbV9oYXNQZW5kaW5nU2hhZGVyczsgfQorI2VuZGlmCisKKyAgICAgICAgdm9pZCBzZXRM
aW5lSGVpZ2h0VmFsdWUoQ1NTVmFsdWUqIHZhbHVlKSB7IG1fbGluZUhlaWdodFZhbHVlID0gdmFs
dWU7IH0KKyAgICAgICAgQ1NTVmFsdWUqIGxpbmVIZWlnaHRWYWx1ZSgpIHsgcmV0dXJuIG1fbGlu
ZUhlaWdodFZhbHVlOyB9CisgICAgICAgIHZvaWQgc2V0Rm9udERpcnR5KGJvb2wgaXNEaXJ0eSkg
eyBtX2ZvbnREaXJ0eSA9IGlzRGlydHk7IH0KKyAgICAgICAgYm9vbCBmb250RGlydHkoKSBjb25z
dCB7IHJldHVybiBtX2ZvbnREaXJ0eTsgfQorCisgICAgICAgIHZvaWQgY2FjaGVCb3JkZXJBbmRC
YWNrZ3JvdW5kKCk7CisgICAgICAgIGJvb2wgaGFzVUFBcHBlYXJhbmNlKCkgY29uc3QgeyByZXR1
cm4gbV9oYXNVQUFwcGVhcmFuY2U7IH0KKyAgICAgICAgQm9yZGVyRGF0YSBib3JkZXJEYXRhKCkg
Y29uc3QgeyByZXR1cm4gbV9ib3JkZXJEYXRhOyB9CisgICAgICAgIEZpbGxMYXllciBiYWNrZ3Jv
dW5kRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZERhdGE7IH0KKyAgICAgICAgQ29s
b3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ29sb3I7IH0K
KworICAgICAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbigpIHsgcmV0
dXJuIG1fc3R5bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9CisgICAgICAgIGNvbnN0IEZvbnREZXNj
cmlwdGlvbiYgcGFyZW50Rm9udERlc2NyaXB0aW9uKCkgeyByZXR1cm4gbV9wYXJlbnRTdHlsZS0+
Zm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICAgICAgdm9pZCBzZXRGb250RGVzY3JpcHRpb24oY29u
c3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9mb250RGlydHkgfD0gbV9z
dHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7IH0KKyAgICAgICAgdm9p
ZCBzZXRab29tKGZsb2F0IGYpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+c2V0Wm9vbShmKTsg
fQorICAgICAgICB2b2lkIHNldEVmZmVjdGl2ZVpvb20oZmxvYXQgZikgeyBtX2ZvbnREaXJ0eSB8
PSBtX3N0eWxlLT5zZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgICAgIHZvaWQgc2V0V3JpdGlu
Z01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0gbV9zdHlsZS0+
c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9CisgICAgICAgIHZvaWQgc2V0VGV4dE9yaWVu
dGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0KKworICAgICAg
ICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsgcmV0dXJuIG1f
bWF0Y2hlZFJ1bGVzOyB9CisgICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29uc3QgUnVsZURh
dGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9CisgICAgICAgIAorICAg
IHByaXZhdGU6CisgICAgICAgIC8vIEZJWE1FKGJ1ZyAxMDg1NjMpOiB0byBtYWtlIGl0IGVhc2ll
ciB0byByZXZpZXcsIHRoZXNlIG1lbWJlcgorICAgICAgICAvLyB2YXJpYWJsZXMgYXJlIHB1Ymxp
Yy4gSG93ZXZlciB3ZSBzaG91bGQgYWRkIG1ldGhvZHMgdG8gYWNjZXNzCisgICAgICAgIC8vIHRo
ZXNlIHZhcmlhYmxlcy4KKyAgICAgICAgRWxlbWVudCogbV9lbGVtZW50OworICAgICAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IG1fc3R5bGU7CisgICAgICAgIFN0eWxlZEVsZW1lbnQqIG1fc3R5bGVk
RWxlbWVudDsKKyAgICAgICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlOworICAgICAgICBS
ZW5kZXJTdHlsZSogbV9wYXJlbnRTdHlsZTsKKyAgICAgICAgUmVuZGVyU3R5bGUqIG1fcm9vdEVs
ZW1lbnRTdHlsZTsKKyAgICAgICAgCisgICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JT
dHlsaW5nOworICAgICAgICBib29sIG1fc2FtZU9yaWdpbk9ubHk7CisgICAgICAgIFBzZXVkb1N0
eWxlUmVxdWVzdCBtX3BzZXVkb1N0eWxlUmVxdWVzdDsKKworICAgICAgICBFSW5zaWRlTGluayBt
X2VsZW1lbnRMaW5rU3RhdGU7CisKKyAgICAgICAgYm9vbCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRp
b25Qb2ludDsKKworICAgICAgICBib29sIG1fZWxlbWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzOwor
CisgICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6TW9kZSBtX21vZGU7CisKKyAgICAgICAgLy8gQSBi
dWZmZXIgdXNlZCB0byBob2xkIHRoZSBzZXQgb2YgbWF0Y2hlZCBydWxlcyBmb3IgYW4gZWxlbWVu
dCwKKyAgICAgICAgLy8gYW5kIGEgdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGZvciBtZXJnZSBzb3J0
aW5nLgorICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4gbV9tYXRjaGVkUnVsZXM7
CisgICAgICAgIFJlZlB0cjxTdGF0aWNDU1NSdWxlTGlzdD4gbV9ydWxlTGlzdDsKKworICAgICAg
ICBib29sIG1fYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlOworICAgICAgICBib29sIG1fYXBw
bHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsKKworICAgICAgICBQZW5kaW5nSW1hZ2VQcm9w
ZXJ0eU1hcCBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXM7CisjaWYgRU5BQkxFKENTU19TSEFERVJT
KQorICAgICAgICBib29sIG1faGFzUGVuZGluZ1NoYWRlcnM7CisjZW5kaWYKKyNpZiBFTkFCTEUo
Q1NTX0ZJTFRFUlMpICYmIEVOQUJMRShTVkcpCisgICAgICAgIFBlbmRpbmdTVkdEb2N1bWVudE1h
cCBtX3BlbmRpbmdTVkdEb2N1bWVudHM7CisjZW5kaWYKKyAgICAgICAgQ1NTVmFsdWUqIG1fbGlu
ZUhlaWdodFZhbHVlOworICAgICAgICBib29sIG1fZm9udERpcnR5OworCisgICAgICAgIGJvb2wg
bV9oYXNVQUFwcGVhcmFuY2U7CisgICAgICAgIEJvcmRlckRhdGEgbV9ib3JkZXJEYXRhOworICAg
ICAgICBGaWxsTGF5ZXIgbV9iYWNrZ3JvdW5kRGF0YTsKKyAgICAgICAgQ29sb3IgbV9iYWNrZ3Jv
dW5kQ29sb3I7CisgICAgfTsKKworICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogc3R5bGVOb3RZZXRB
dmFpbGFibGUoKSB7IHJldHVybiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOyB9CisKKyAgICBQYXNz
UmVmUHRyPFN0eWxlSW1hZ2U+IHN0eWxlSW1hZ2UoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsK
KyAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGNhY2hlZE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQ
cm9wZXJ0eUlELCBDU1NJbWFnZVZhbHVlKik7CisgICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBn
ZW5lcmF0ZWRPclBlbmRpbmdGcm9tVmFsdWUoQ1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VHZW5lcmF0
b3JWYWx1ZSopOworI2lmIEVOQUJMRShDU1NfSU1BR0VfU0VUKQorICAgIFBhc3NSZWZQdHI8U3R5
bGVJbWFnZT4gc2V0T3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlU2V0
VmFsdWUqKTsKKyNlbmRpZgorICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFnZT4gY3Vyc29yT3JQZW5k
aW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0N1cnNvckltYWdlVmFsdWUqKTsKKworICAg
IGJvb2wgYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0
ZS5hcHBseVByb3BlcnR5VG9SZWd1bGFyU3R5bGUoKTsgfQorICAgIGJvb2wgYXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhdGUuYXBwbHlQcm9wZXJ0
eVRvVmlzaXRlZExpbmtTdHlsZSgpOyB9CisKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZlcnRUb0lu
dExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHJv
b3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsKKyAgICBzdGF0aWMgTGVuZ3RoIGNvbnZl
cnRUb0Zsb2F0TGVuZ3RoKENTU1ByaW1pdGl2ZVZhbHVlKiwgUmVuZGVyU3R5bGUqLCBSZW5kZXJT
dHlsZSogcm9vdFN0eWxlLCBkb3VibGUgbXVsdGlwbGllciA9IDEpOworCisgICAgQ1NTVG9TdHls
ZU1hcCogc3R5bGVNYXAoKSB7IHJldHVybiAmbV9zdHlsZU1hcDsgfQorICAgIEluc3BlY3RvckNT
U09NV3JhcHBlcnMmIGluc3BlY3RvckNTU09NV3JhcHBlcnMoKSB7IHJldHVybiBtX2luc3BlY3Rv
ckNTU09NV3JhcHBlcnM7IH0KKyAgICBjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlw
dGlvbigpIHsgcmV0dXJuIG1fc3RhdGUuZm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICBjb25zdCBG
b250RGVzY3JpcHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fc3RhdGUu
cGFyZW50Rm9udERlc2NyaXB0aW9uKCk7IH0KKyAgICB2b2lkIHNldEZvbnREZXNjcmlwdGlvbihj
b25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgeyBtX3N0YXRlLnNldEZvbnRE
ZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9CisgICAgdm9pZCBzZXRab29tKGZsb2F0IGYp
IHsgbV9zdGF0ZS5zZXRab29tKGYpOyB9CisgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0
IGYpIHsgbV9zdGF0ZS5zZXRFZmZlY3RpdmVab29tKGYpOyB9CisgICAgdm9pZCBzZXRXcml0aW5n
TW9kZShXcml0aW5nTW9kZSB3cml0aW5nTW9kZSkgeyBtX3N0YXRlLnNldFdyaXRpbmdNb2RlKHdy
aXRpbmdNb2RlKTsgfQorICAgIHZvaWQgc2V0VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlv
biB0ZXh0T3JpZW50YXRpb24pIHsgbV9zdGF0ZS5zZXRUZXh0T3JpZW50YXRpb24odGV4dE9yaWVu
dGF0aW9uKTsgfQorICAgIAorICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0
SW5mbyopIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHNf
c3R5bGVOb3RZZXRBdmFpbGFibGU7CisKKyAgICB2b2lkIGNhY2hlQm9yZGVyQW5kQmFja2dyb3Vu
ZCgpOworCitwcml2YXRlOgorICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhDb250cm9sKFN0eWxl
ZEVsZW1lbnQqKSBjb25zdDsKKworICAgIHZvaWQgYXBwbHlQcm9wZXJ0eShDU1NQcm9wZXJ0eUlE
LCBDU1NWYWx1ZSopOworCisjaWYgRU5BQkxFKFNWRykKKyAgICB2b2lkIGFwcGx5U1ZHUHJvcGVy
dHkoQ1NTUHJvcGVydHlJRCwgQ1NTVmFsdWUqKTsKKyNlbmRpZgorCisgICAgUGFzc1JlZlB0cjxT
dHlsZUltYWdlPiBsb2FkUGVuZGluZ0ltYWdlKFN0eWxlUGVuZGluZ0ltYWdlKik7CisgICAgdm9p
ZCBsb2FkUGVuZGluZ0ltYWdlcygpOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVNYXRj
aGVkUHJvcGVydGllc0hhc2goY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMqLCB1bnNpZ25lZCBzaXpl
KTsKKyAgICBzdHJ1Y3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0geworICAgICAgICB2b2lk
IHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9iamVjdEluZm8qKSBjb25zdDsKKyAgICAgICAgVmVj
dG9yPE1hdGNoZWRQcm9wZXJ0aWVzPiBtYXRjaGVkUHJvcGVydGllczsKKyAgICAgICAgTWF0Y2hS
YW5nZXMgcmFuZ2VzOworICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHJlbmRlclN0eWxlOwor
ICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHBhcmVudFJlbmRlclN0eWxlOworICAgIH07Cisg
ICAgY29uc3QgTWF0Y2hlZFByb3BlcnRpZXNDYWNoZUl0ZW0qIGZpbmRGcm9tTWF0Y2hlZFByb3Bl
cnRpZXNDYWNoZSh1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYpOworICAgIHZvaWQg
YWRkVG9NYXRjaGVkUHJvcGVydGllc0NhY2hlKGNvbnN0IFJlbmRlclN0eWxlKiwgY29uc3QgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlLCB1bnNpZ25lZCBoYXNoLCBjb25zdCBNYXRjaFJlc3VsdCYp
OworCisgICAgLy8gRXZlcnkgTiBhZGRpdGlvbnMgdG8gdGhlIG1hdGNoZWQgZGVjbGFyYXRpb24g
Y2FjaGUgdHJpZ2dlciBhIHN3ZWVwIHdoZXJlIGVudHJpZXMgaG9sZGluZworICAgIC8vIHRoZSBs
YXN0IHJlZmVyZW5jZSB0byBhIHN0eWxlIGRlY2xhcmF0aW9uIGFyZSBnYXJiYWdlIGNvbGxlY3Rl
ZC4KKyAgICB2b2lkIHN3ZWVwTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShUaW1lcjxTdHlsZVJlc29s
dmVyPiopOworCisgICAgYm9vbCBjbGFzc05hbWVzQWZmZWN0ZWRCeVJ1bGVzKGNvbnN0IFNwYWNl
U3BsaXRTdHJpbmcmKSBjb25zdDsKKyAgICBib29sIHNoYXJpbmdDYW5kaWRhdGVIYXNJZGVudGlj
YWxTdHlsZUFmZmVjdGluZ0F0dHJpYnV0ZXMoU3R5bGVkRWxlbWVudCopIGNvbnN0OworCisgICAg
dW5zaWduZWQgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2luY2VMYXN0U3dlZXA7
CisKKyAgICB0eXBlZGVmIEhhc2hNYXA8dW5zaWduZWQsIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGVJ
dGVtPiBNYXRjaGVkUHJvcGVydGllc0NhY2hlOworICAgIE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUg
bV9tYXRjaGVkUHJvcGVydGllc0NhY2hlOworCisgICAgVGltZXI8U3R5bGVSZXNvbHZlcj4gbV9t
YXRjaGVkUHJvcGVydGllc0NhY2hlU3dlZXBUaW1lcjsKKworICAgIE93blB0cjxNZWRpYVF1ZXJ5
RXZhbHVhdG9yPiBtX21lZGl1bTsKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG1fcm9vdERlZmF1
bHRTdHlsZTsKKworICAgIERvY3VtZW50KiBtX2RvY3VtZW50OworICAgIFNlbGVjdG9yRmlsdGVy
IG1fc2VsZWN0b3JGaWx0ZXI7CisKKyAgICBib29sIG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVz
OworCisgICAgUmVmUHRyPENTU0ZvbnRTZWxlY3Rvcj4gbV9mb250U2VsZWN0b3I7CisgICAgVmVj
dG9yPE93blB0cjxNZWRpYVF1ZXJ5UmVzdWx0PiA+IG1fdmlld3BvcnREZXBlbmRlbnRNZWRpYVF1
ZXJ5UmVzdWx0czsKKworI2lmIEVOQUJMRShDU1NfREVWSUNFX0FEQVBUQVRJT04pCisgICAgUmVm
UHRyPFZpZXdwb3J0U3R5bGVSZXNvbHZlcj4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXI7CisjZW5k
aWYKKworICAgIGNvbnN0IFN0eWxlQnVpbGRlciYgbV9zdHlsZUJ1aWxkZXI7CisKKyAgICBPd25Q
dHI8U3R5bGVTY29wZVJlc29sdmVyPiBtX3Njb3BlUmVzb2x2ZXI7CisgICAgQ1NTVG9TdHlsZU1h
cCBtX3N0eWxlTWFwOworICAgIEluc3BlY3RvckNTU09NV3JhcHBlcnMgbV9pbnNwZWN0b3JDU1NP
TVdyYXBwZXJzOworCisgICAgU3RhdGUgbV9zdGF0ZTsKKworICAgIGZyaWVuZCBjbGFzcyBTdHls
ZUJ1aWxkZXI7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaGVkUHJvcGVy
dGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBNYXRjaGVkUHJvcGVydGllcyYsIGNvbnN0IE1hdGNoZWRQcm9wZXJ0aWVzJik7
CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXRjaFJhbmdlcyYsIGNvbnN0IE1h
dGNoUmFuZ2VzJik7CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYXRjaFJhbmdl
cyYsIGNvbnN0IE1hdGNoUmFuZ2VzJik7Cit9OworCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVy
OjpoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9taWNTdHJpbmcgJmF0dHJpYnV0ZU5h
bWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFhdHRyaWJ1dGVOYW1lLmlzRW1wdHkoKSk7CisgICAg
cmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5hdHRyc0luUnVsZXMuY29udGFpbnMoYXR0cmli
dXRlTmFtZS5pbXBsKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpoYXNTZWxl
Y3RvckZvckNsYXNzKGNvbnN0IEF0b21pY1N0cmluZyYgY2xhc3NWYWx1ZSkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoIWNsYXNzVmFsdWUuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gbV9ydWxlU2V0cy5m
ZWF0dXJlcygpLmNsYXNzZXNJblJ1bGVzLmNvbnRhaW5zKGNsYXNzVmFsdWUuaW1wbCgpKTsKK30K
KworaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JJZChjb25zdCBBdG9t
aWNTdHJpbmcmIGlkVmFsdWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFpZFZhbHVlLmlzRW1wdHko
KSk7CisgICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMoKS5pZHNJblJ1bGVzLmNvbnRhaW5z
KGlkVmFsdWUuaW1wbCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gU3R5bGVSZXNvbHZlcl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xs
ZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jc3MvUGFnZVJ1bGVDb2xsZWN0
b3IuaAkocmV2aXNpb24gMTQ1MTgxKQorKysgU291cmNlL1dlYkNvcmUvY3NzL1BhZ2VSdWxlQ29s
bGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5LDY3OSArMTksNDIgQEAKICAqCiAgKi8KIAot
I2lmbmRlZiBTdHlsZVJlc29sdmVyX2gKLSNkZWZpbmUgU3R5bGVSZXNvbHZlcl9oCisjaWZuZGVm
IFBhZ2VSdWxlQ29sbGVjdG9yX2gKKyNkZWZpbmUgUGFnZVJ1bGVDb2xsZWN0b3JfaAogCi0jaW5j
bHVkZSAiQ1NTUnVsZUxpc3QuaCIKLSNpbmNsdWRlICJDU1NUb1N0eWxlTWFwLmgiCi0jaW5jbHVk
ZSAiQ1NTVmFsdWVMaXN0LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRSdWxlU2V0cy5oIgotI2luY2x1
ZGUgIkluc3BlY3RvckNTU09NV3JhcHBlcnMuaCIKLSNpbmNsdWRlICJMaW5rSGFzaC5oIgotI2lu
Y2x1ZGUgIk1lZGlhUXVlcnlFeHAuaCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgotI2luY2x1
ZGUgIlJ1bGVGZWF0dXJlLmgiCi0jaW5jbHVkZSAiUnVsZVNldC5oIgotI2luY2x1ZGUgIlJ1bnRp
bWVFbmFibGVkRmVhdHVyZXMuaCIKLSNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgotI2luY2x1ZGUg
IlNlbGVjdG9yQ2hlY2tlci5oIgotI2luY2x1ZGUgIlNlbGVjdG9yRmlsdGVyLmgiCi0jaW5jbHVk
ZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCi0jaW5jbHVkZSAiU3R5bGVTY29wZVJlc29sdmVyLmgi
Ci0jaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVyLmgiCi0jaWYgRU5BQkxFKENTU19GSUxU
RVJTKSAmJiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUgIldlYktpdENTU1NWR0RvY3VtZW50VmFsdWUu
aCIKLSNlbmRpZgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hT
ZXQuaD4KKyNpbmNsdWRlICJTdHlsZVJlc29sdmVyLmgiCiAjaW5jbHVkZSA8d3RmL1JlZlB0ci5o
PgogI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJp
bmdIYXNoLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKLWVudW0gRVNtYXJ0TWluaW11bUZvckZvbnRTaXplIHsgRG9Ob3RVc2VTbWFy
dE1pbmltdW1Gb3JGb250U2l6ZSwgVXNlU21hcnRNaW5pbXVtRm9yRm9udEZpemUgfTsKLQotY2xh
c3MgQ1NTQ3Vyc29ySW1hZ2VWYWx1ZTsKLWNsYXNzIENTU0ZvbnRTZWxlY3RvcjsKLWNsYXNzIENT
U0ZvbnRGYWNlOwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlOwotY2xhc3MgQ1NTSW1hZ2VHZW5lcmF0
b3JWYWx1ZTsKLWNsYXNzIENTU0ltYWdlU2V0VmFsdWU7Ci1jbGFzcyBDU1NJbWFnZVZhbHVlOwot
Y2xhc3MgQ1NTUGFnZVJ1bGU7Ci1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZTsKLWNsYXNzIENTU1By
b3BlcnR5OwotY2xhc3MgQ1NTUnVsZUxpc3Q7Ci1jbGFzcyBDU1NTZWxlY3RvcjsKLWNsYXNzIENT
U1N0eWxlU2hlZXQ7Ci1jbGFzcyBDU1NWYWx1ZTsKLWNsYXNzIENvbnRhaW5lck5vZGU7Ci1jbGFz
cyBDdXN0b21GaWx0ZXJPcGVyYXRpb247Ci1jbGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXI7Ci1j
bGFzcyBDdXN0b21GaWx0ZXJQYXJhbWV0ZXJMaXN0OwotY2xhc3MgRG9jdW1lbnQ7Ci1jbGFzcyBF
bGVtZW50OwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBGcmFtZVZpZXc7Ci1jbGFzcyBLVVJMOwotY2xh
c3MgS2V5ZnJhbWVMaXN0OwotY2xhc3MgS2V5ZnJhbWVWYWx1ZTsKLWNsYXNzIE1lZGlhUXVlcnlF
dmFsdWF0b3I7Ci1jbGFzcyBOb2RlOwotY2xhc3MgUmVuZGVyUmVnaW9uOwotY2xhc3MgUmVuZGVy
U2Nyb2xsYmFyOwotY2xhc3MgUnVsZURhdGE7Ci1jbGFzcyBSdWxlU2V0OwotY2xhc3MgU2V0dGlu
Z3M7Ci1jbGFzcyBTdGF0aWNDU1NSdWxlTGlzdDsKLWNsYXNzIFN0eWxlQnVpbGRlcjsKLWNsYXNz
IFN0eWxlU2NvcGVSZXNvbHZlcjsKLWNsYXNzIFN0eWxlSW1hZ2U7Ci1jbGFzcyBTdHlsZUtleWZy
YW1lOwotY2xhc3MgU3R5bGVQZW5kaW5nSW1hZ2U7Ci1jbGFzcyBTdHlsZVByb3BlcnR5U2V0Owot
Y2xhc3MgU3R5bGVSdWxlOwotI2lmIEVOQUJMRShTSEFET1dfRE9NKQotY2xhc3MgU3R5bGVSdWxl
SG9zdDsKLSNlbmRpZgotY2xhc3MgU3R5bGVSdWxlS2V5ZnJhbWVzOwogY2xhc3MgU3R5bGVSdWxl
UGFnZTsKLWNsYXNzIFN0eWxlUnVsZVJlZ2lvbjsKLWNsYXNzIFN0eWxlU2hhZGVyOwotY2xhc3Mg
U3R5bGVTaGVldDsKLWNsYXNzIFN0eWxlU2hlZXRMaXN0OwotY2xhc3MgU3R5bGVkRWxlbWVudDsK
LWNsYXNzIFZpZXdwb3J0U3R5bGVSZXNvbHZlcjsKLWNsYXNzIFdlYktpdENTU0ZpbHRlclZhbHVl
OwotY2xhc3MgV2ViS2l0Q1NTU2hhZGVyVmFsdWU7Ci1jbGFzcyBXZWJLaXRDU1NTVkdEb2N1bWVu
dFZhbHVlOwotCi1jbGFzcyBNZWRpYVF1ZXJ5UmVzdWx0IHsKLSAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShNZWRpYVF1ZXJ5UmVzdWx0KTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6
Ci0gICAgTWVkaWFRdWVyeVJlc3VsdChjb25zdCBNZWRpYVF1ZXJ5RXhwJiBleHByLCBib29sIHJl
c3VsdCkKLSAgICAgICAgOiBtX2V4cHJlc3Npb24oZXhwcikKLSAgICAgICAgLCBtX3Jlc3VsdChy
ZXN1bHQpCi0gICAgewotICAgIH0KLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKLQotICAgIE1lZGlhUXVlcnlFeHAgbV9leHByZXNzaW9uOwotICAg
IGJvb2wgbV9yZXN1bHQ7Ci19OwotCi1lbnVtIFN0eWxlU2hhcmluZ0JlaGF2aW9yIHsKLSAgICBB
bGxvd1N0eWxlU2hhcmluZywKLSAgICBEaXNhbGxvd1N0eWxlU2hhcmluZywKLX07Ci0KLS8vIE1h
dGNoT25seVVzZXJBZ2VudFJ1bGVzIGlzIHVzZWQgaW4gbWVkaWEgcXVlcmllcywgd2hlcmUgcmVs
YXRpdmUgdW5pdHMKLS8vIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50
IHJvb3QgZWxlbWVudCBzdHlsZSwgYW5kIHN0eWxlZCBvbmx5Ci0vLyBmcm9tIHRoZSBVc2VyIEFn
ZW50IFN0eWxlc2hlZXQgcnVsZXMuCi0KLWVudW0gUnVsZU1hdGNoaW5nQmVoYXZpb3IgewotICAg
IE1hdGNoQWxsUnVsZXMsCi0gICAgTWF0Y2hBbGxSdWxlc0V4Y2x1ZGluZ1NNSUwsCi0gICAgTWF0
Y2hPbmx5VXNlckFnZW50UnVsZXMsCi19OwotCi1jbGFzcyBQc2V1ZG9TdHlsZVJlcXVlc3Qgewot
cHVibGljOgotICAgIFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1ZG9JZCBwc2V1ZG9JZCwgUmVuZGVy
U2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAwLCBTY3JvbGxiYXJQYXJ0IHNjcm9sbGJhclBhcnQgPSBO
b1BhcnQpCi0gICAgICAgIDogcHNldWRvSWQocHNldWRvSWQpCi0gICAgICAgICwgc2Nyb2xsYmFy
UGFydChzY3JvbGxiYXJQYXJ0KQotICAgICAgICAsIHNjcm9sbGJhcihzY3JvbGxiYXIpCi0gICAg
ewotICAgIH0KLQotICAgIFBzZXVkb0lkIHBzZXVkb0lkOwotICAgIFNjcm9sbGJhclBhcnQgc2Ny
b2xsYmFyUGFydDsKLSAgICBSZW5kZXJTY3JvbGxiYXIqIHNjcm9sbGJhcjsKLX07Ci0KLWNsYXNz
IE1hdGNoUmVxdWVzdCB7Ci1wdWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVT
ZXQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSog
c2NvcGUgPSAwLCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0
Qm91bmRhcnkgPSBTZWxlY3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQotICAgICAg
ICA6IHJ1bGVTZXQocnVsZVNldCkKLSAgICAgICAgLCBpbmNsdWRlRW1wdHlSdWxlcyhpbmNsdWRl
RW1wdHlSdWxlcykKLSAgICAgICAgLCBzY29wZShzY29wZSkKLSAgICAgICAgLCBiZWhhdmlvckF0
Qm91bmRhcnkoYmVoYXZpb3JBdEJvdW5kYXJ5KSB7IH0KLSAgICBjb25zdCBSdWxlU2V0KiBydWxl
U2V0OwotICAgIGNvbnN0IGJvb2wgaW5jbHVkZUVtcHR5UnVsZXM7Ci0gICAgY29uc3QgQ29udGFp
bmVyTm9kZSogc2NvcGU7Ci0gICAgY29uc3QgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlvckF0Qm91
bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5OwotfTsKIAotLy8gVGhpcyBjbGFzcyBzZWxlY3RzIGEg
UmVuZGVyU3R5bGUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbGxlY3Rpb24gb2Yg
c3R5bGVzaGVldHMuCi1jbGFzcyBTdHlsZVJlc29sdmVyIHsKLSAgICBXVEZfTUFLRV9OT05DT1BZ
QUJMRShTdHlsZVJlc29sdmVyKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitjbGFzcyBQYWdl
UnVsZUNvbGxlY3RvciB7CiBwdWJsaWM6Ci0gICAgU3R5bGVSZXNvbHZlcihEb2N1bWVudCosIGJv
b2wgbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKTsKLSAgICB+U3R5bGVSZXNvbHZlcigpOworICAg
IFBhZ2VSdWxlQ29sbGVjdG9yKFN0eWxlUmVzb2x2ZXI6OlN0YXRlJiBzdGF0ZSwgRG9jdW1lbnRS
dWxlU2V0cyYgcnVsZVNldHMpCisgICAgICAgIDogbV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgLCBt
X3J1bGVTZXRzKHJ1bGVTZXRzKSB7IH0KIAotICAgIC8vIFVzaW5nIHRoZXNlIGR1cmluZyB0cmVl
IHdhbGsgd2lsbCBhbGxvdyBzdHlsZSBzZWxlY3RvciB0byBvcHRpbWl6ZSBjaGlsZCBhbmQgZGVz
Y2VuZGFudCBzZWxlY3RvciBsb29rdXBzLgotICAgIHZvaWQgcHVzaFBhcmVudEVsZW1lbnQoRWxl
bWVudCopOwotICAgIHZvaWQgcG9wUGFyZW50RWxlbWVudChFbGVtZW50Kik7Ci0gICAgdm9pZCBw
dXNoUGFyZW50U2hhZG93Um9vdChjb25zdCBTaGFkb3dSb290Kik7Ci0gICAgdm9pZCBwb3BQYXJl
bnRTaGFkb3dSb290KGNvbnN0IFNoYWRvd1Jvb3QqKTsKLSNpZiBFTkFCTEUoU0hBRE9XX0RPTSkK
LSAgICB2b2lkIGFkZEhvc3RSdWxlKFN0eWxlUnVsZUhvc3QqIHJ1bGUsIGJvb2wgaGFzRG9jdW1l
bnRTZWN1cml0eU9yaWdpbiwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUpIHsgZW5zdXJlU2Nv
cGVSZXNvbHZlcigpLT5hZGRIb3N0UnVsZShydWxlLCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2lu
LCBzY29wZSk7IH0KLSNlbmRpZgotCi0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gc3R5bGVG
b3JFbGVtZW50KEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBTdHlsZVNo
YXJpbmdCZWhhdmlvciA9IEFsbG93U3R5bGVTaGFyaW5nLAotICAgICAgICBSdWxlTWF0Y2hpbmdC
ZWhhdmlvciA9IE1hdGNoQWxsUnVsZXMsIFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZyA9
IDApOwotCi0gICAgdm9pZCBrZXlmcmFtZVN0eWxlc0ZvckFuaW1hdGlvbihFbGVtZW50KiwgY29u
c3QgUmVuZGVyU3R5bGUqLCBLZXlmcmFtZUxpc3QmKTsKLQotICAgIFBhc3NSZWZQdHI8UmVuZGVy
U3R5bGU+IHBzZXVkb1N0eWxlRm9yRWxlbWVudChFbGVtZW50KiwgY29uc3QgUHNldWRvU3R5bGVS
ZXF1ZXN0JiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKLQotICAgIFBhc3NSZWZQdHI8UmVu
ZGVyU3R5bGU+IHN0eWxlRm9yUGFnZShpbnQgcGFnZUluZGV4KTsKLSAgICBQYXNzUmVmUHRyPFJl
bmRlclN0eWxlPiBkZWZhdWx0U3R5bGVGb3JFbGVtZW50KCk7Ci0gICAgUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gc3R5bGVGb3JUZXh0KFRleHQqKTsKLQotICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJl
bmRlclN0eWxlPiBzdHlsZUZvckRvY3VtZW50KERvY3VtZW50KiwgQ1NTRm9udFNlbGVjdG9yKiA9
IDApOwotCi0gICAgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdGF0ZS5z
dHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKCkgY29uc3QgeyByZXR1cm4g
bV9zdGF0ZS5wYXJlbnRTdHlsZSgpOyB9Ci0gICAgUmVuZGVyU3R5bGUqIHJvb3RFbGVtZW50U3R5
bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnJvb3RFbGVtZW50U3R5bGUoKTsgfQotICAgIEVs
ZW1lbnQqIGVsZW1lbnQoKSB7IHJldHVybiBtX3N0YXRlLmVsZW1lbnQoKTsgfQotICAgIERvY3Vt
ZW50KiBkb2N1bWVudCgpIHsgcmV0dXJuIG1fZG9jdW1lbnQ7IH0KLSAgICBTdHlsZVNjb3BlUmVz
b2x2ZXIqIHNjb3BlUmVzb2x2ZXIoKSBjb25zdCB7IHJldHVybiBtX3Njb3BlUmVzb2x2ZXIuZ2V0
KCk7IH0KLSAgICBib29sIGhhc1BhcmVudE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLnBh
cmVudE5vZGUoKTsgfQotCi0gICAgLy8gRklYTUU6IEl0IGNvdWxkIGJlIGJldHRlciB0byBjYWxs
IG1fcnVsZVNldHMuYXBwZW5kQXV0aG9yU3R5bGVTaGVldHMoKSBkaXJlY3RseSBhZnRlciB3ZSBm
YWN0b3IgU3R5bGVSc29sdmVyIGZ1cnRoZXIuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTEwODg5MAotICAgIHZvaWQgYXBwZW5kQXV0aG9yU3R5bGVTaGVl
dHModW5zaWduZWQgZmlyc3ROZXcsIGNvbnN0IFZlY3RvcjxSZWZQdHI8Q1NTU3R5bGVTaGVldD4g
PiYpOwotCi0gICAgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSB7IHJldHVybiBtX3J1bGVT
ZXRzOyB9Ci0gICAgY29uc3QgRG9jdW1lbnRSdWxlU2V0cyYgcnVsZVNldHMoKSBjb25zdCB7IHJl
dHVybiBtX3J1bGVTZXRzOyB9Ci0KLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUo
U0hBRE9XX0RPTSkKLSAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIGVuc3VyZVNjb3BlUmVzb2x2ZXIo
KQotICAgIHsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKQotI2lmIEVOQUJMRShTSEFET1dfRE9N
KQotICAgICAgICBBU1NFUlQoUnVudGltZUVuYWJsZWRGZWF0dXJlczo6c2hhZG93RE9NRW5hYmxl
ZCgpIHx8IFJ1bnRpbWVFbmFibGVkRmVhdHVyZXM6OnN0eWxlU2NvcGVkRW5hYmxlZCgpKTsKLSNl
bHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZlYXR1cmVzOjpzdHlsZVNjb3BlZEVu
YWJsZWQoKSk7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgIEFTU0VSVChSdW50aW1lRW5hYmxlZEZl
YXR1cmVzOjpzaGFkb3dET01FbmFibGVkKCkpOwotI2VuZGlmCi0gICAgICAgIGlmICghbV9zY29w
ZVJlc29sdmVyKQotICAgICAgICAgICAgbV9zY29wZVJlc29sdmVyID0gYWRvcHRQdHIobmV3IFN0
eWxlU2NvcGVSZXNvbHZlcigpKTsKLSAgICAgICAgcmV0dXJuIG1fc2NvcGVSZXNvbHZlci5nZXQo
KTsKLSAgICB9Ci0jZW5kaWYKKyAgICB2b2lkIG1hdGNoQWxsUGFnZVJ1bGVzKGludCBwYWdlSW5k
ZXgpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNoUmVzdWx0JiBtYXRjaGVkUmVzdWx0KCkgeyBy
ZXR1cm4gbV9yZXN1bHQ7IH0KIAogcHJpdmF0ZToKLSAgICB2b2lkIGluaXRFbGVtZW50KEVsZW1l
bnQqKTsKLSAgICBSZW5kZXJTdHlsZSogbG9jYXRlU2hhcmVkU3R5bGUoKTsKLSAgICBib29sIHN0
eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNSdWxlU2V0KFJ1bGVTZXQqKTsKLSAgICBib29sIHN0
eWxlU2hhcmluZ0NhbmRpZGF0ZU1hdGNoZXNIb3N0UnVsZXMoKTsKLSAgICBOb2RlKiBsb2NhdGVD
b3VzaW5MaXN0KEVsZW1lbnQqIHBhcmVudCwgdW5zaWduZWQmIHZpc2l0ZWROb2RlQ291bnQpIGNv
bnN0OwotICAgIFN0eWxlZEVsZW1lbnQqIGZpbmRTaWJsaW5nRm9yU3R5bGVTaGFyaW5nKE5vZGUq
LCB1bnNpZ25lZCYgY291bnQpIGNvbnN0OwotICAgIGJvb2wgY2FuU2hhcmVTdHlsZVdpdGhFbGVt
ZW50KFN0eWxlZEVsZW1lbnQqKSBjb25zdDsKLQotICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+
IHN0eWxlRm9yS2V5ZnJhbWUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBTdHlsZUtleWZyYW1l
KiwgS2V5ZnJhbWVWYWx1ZSYpOwotCi1wdWJsaWM6Ci0gICAgLy8gVGhlc2UgbWV0aG9kcyB3aWxs
IGdpdmUgYmFjayB0aGUgc2V0IG9mIHJ1bGVzIHRoYXQgbWF0Y2hlZCBmb3IgYSBnaXZlbiBlbGVt
ZW50IChvciBhIHBzZXVkby1lbGVtZW50KS4KLSAgICBlbnVtIENTU1J1bGVGaWx0ZXIgewotICAg
ICAgICBVQUFuZFVzZXJDU1NSdWxlcyAgID0gMSA8PCAxLAotICAgICAgICBBdXRob3JDU1NSdWxl
cyAgICAgID0gMSA8PCAyLAotICAgICAgICBFbXB0eUNTU1J1bGVzICAgICAgID0gMSA8PCAzLAot
ICAgICAgICBDcm9zc09yaWdpbkNTU1J1bGVzID0gMSA8PCA0LAotICAgICAgICBBbGxCdXRFbXB0
eUNTU1J1bGVzID0gVUFBbmRVc2VyQ1NTUnVsZXMgfCBBdXRob3JDU1NSdWxlcyB8IENyb3NzT3Jp
Z2luQ1NTUnVsZXMsCi0gICAgICAgIEFsbENTU1J1bGVzICAgICAgICAgPSBBbGxCdXRFbXB0eUNT
U1J1bGVzIHwgRW1wdHlDU1NSdWxlcywKLSAgICB9OwotICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxp
c3Q+IHN0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCB1bnNpZ25lZCBydWxlc1RvSW5jbHVk
ZSA9IEFsbEJ1dEVtcHR5Q1NTUnVsZXMpOwotICAgIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IHBz
ZXVkb1N0eWxlUnVsZXNGb3JFbGVtZW50KEVsZW1lbnQqLCBQc2V1ZG9JZCwgdW5zaWduZWQgcnVs
ZXNUb0luY2x1ZGUgPSBBbGxCdXRFbXB0eUNTU1J1bGVzKTsKLQotICAgIC8vIEdpdmVuIGEgQ1NT
IGtleXdvcmQgaW4gdGhlIHJhbmdlICh4eC1zbWFsbCB0byAtd2Via2l0LXh4eC1sYXJnZSksIHRo
aXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KLSAgICAvLyB0aGUgY29ycmVjdCBmb250IHNpemUgc2Nh
bGVkIHJlbGF0aXZlIHRvIHRoZSB1c2VyJ3MgZGVmYXVsdCAobWVkaXVtKS4KLSAgICBzdGF0aWMg
ZmxvYXQgZm9udFNpemVGb3JLZXl3b3JkKERvY3VtZW50KiwgaW50IGtleXdvcmQsIGJvb2wgc2hv
dWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0KLSAgICAvLyBHaXZlbiBhIGZvbnQgc2l6ZSBpbiBw
aXhlbCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBsZWdhY3kgZm9udCBzaXplIGJldHdlZW4g
MSBhbmQgNy4KLSAgICBzdGF0aWMgaW50IGxlZ2FjeUZvbnRTaXplKERvY3VtZW50KiwgaW50IHBp
eGVsRm9udFNpemUsIGJvb2wgc2hvdWxkVXNlRml4ZWREZWZhdWx0U2l6ZSk7Ci0KLXB1YmxpYzoK
LSAgICB2b2lkIGFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKiwg
UmVuZGVyU3R5bGUqKTsKLQotICAgIHZvaWQgYXBwbHlQcm9wZXJ0eVRvQ3VycmVudFN0eWxlKENT
U1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0KLSAgICB2b2lkIHVwZGF0ZUZvbnQoKTsKLSAgICB2
b2lkIGluaXRpYWxpemVGb250U3R5bGUoU2V0dGluZ3MqKTsKLQotICAgIHN0YXRpYyBmbG9hdCBn
ZXRDb21wdXRlZFNpemVGcm9tU3BlY2lmaWVkU2l6ZShEb2N1bWVudCosIGZsb2F0IHpvb21GYWN0
b3IsIGJvb2wgaXNBYnNvbHV0ZVNpemUsIGZsb2F0IHNwZWNpZmllZFNpemUsIEVTbWFydE1pbmlt
dW1Gb3JGb250U2l6ZSA9IFVzZVNtYXJ0TWluaW11bUZvckZvbnRGaXplKTsKLQotICAgIHZvaWQg
c2V0Rm9udFNpemUoRm9udERlc2NyaXB0aW9uJiwgZmxvYXQgc2l6ZSk7Ci0KLXByaXZhdGU6Ci0g
ICAgc3RhdGljIGZsb2F0IGdldENvbXB1dGVkU2l6ZUZyb21TcGVjaWZpZWRTaXplKERvY3VtZW50
KiwgUmVuZGVyU3R5bGUqLCBib29sIGlzQWJzb2x1dGVTaXplLCBmbG9hdCBzcGVjaWZpZWRTaXpl
LCBib29sIHVzZVNWR1pvb21SdWxlcyk7Ci0KLXB1YmxpYzoKLSAgICBib29sIHVzZVNWR1pvb21S
dWxlcygpOwotCi0gICAgc3RhdGljIGJvb2wgY29sb3JGcm9tUHJpbWl0aXZlVmFsdWVJc0Rlcml2
ZWRGcm9tRWxlbWVudChDU1NQcmltaXRpdmVWYWx1ZSopOwotICAgIENvbG9yIGNvbG9yRnJvbVBy
aW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlKiwgYm9vbCBmb3JWaXNpdGVkTGluayA9IGZh
bHNlKSBjb25zdDsKLQotICAgIGJvb2wgaGFzU2VsZWN0b3JGb3JJZChjb25zdCBBdG9taWNTdHJp
bmcmKSBjb25zdDsKLSAgICBib29sIGhhc1NlbGVjdG9yRm9yQ2xhc3MoY29uc3QgQXRvbWljU3Ry
aW5nJikgY29uc3Q7Ci0gICAgYm9vbCBoYXNTZWxlY3RvckZvckF0dHJpYnV0ZShjb25zdCBBdG9t
aWNTdHJpbmcmKSBjb25zdDsKLQotICAgIENTU0ZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkg
Y29uc3QgeyByZXR1cm4gbV9mb250U2VsZWN0b3IuZ2V0KCk7IH0KLSNpZiBFTkFCTEUoQ1NTX0RF
VklDRV9BREFQVEFUSU9OKQotICAgIFZpZXdwb3J0U3R5bGVSZXNvbHZlciogdmlld3BvcnRTdHls
ZVJlc29sdmVyKCkgeyByZXR1cm4gbV92aWV3cG9ydFN0eWxlUmVzb2x2ZXIuZ2V0KCk7IH0KLSNl
bmRpZgotCi0gICAgdm9pZCBhZGRWaWV3cG9ydERlcGVuZGVudE1lZGlhUXVlcnlSZXN1bHQoY29u
c3QgTWVkaWFRdWVyeUV4cCosIGJvb2wgcmVzdWx0KTsKLSAgICBib29sIGhhc1ZpZXdwb3J0RGVw
ZW5kZW50TWVkaWFRdWVyaWVzKCkgY29uc3QgeyByZXR1cm4gIW1fdmlld3BvcnREZXBlbmRlbnRN
ZWRpYVF1ZXJ5UmVzdWx0cy5pc0VtcHR5KCk7IH0KLSAgICBib29sIGFmZmVjdGVkQnlWaWV3cG9y
dENoYW5nZSgpIGNvbnN0OwotCi0gICAgdm9pZCBhZGRLZXlmcmFtZVN0eWxlKFBhc3NSZWZQdHI8
U3R5bGVSdWxlS2V5ZnJhbWVzPik7Ci0KLSAgICBib29sIGNoZWNrUmVnaW9uU3R5bGUoRWxlbWVu
dCogcmVnaW9uRWxlbWVudCk7Ci0KLSAgICBib29sIHVzZXNTaWJsaW5nUnVsZXMoKSBjb25zdCB7
IHJldHVybiAhbV9ydWxlU2V0cy5mZWF0dXJlcygpLnNpYmxpbmdSdWxlcy5pc0VtcHR5KCk7IH0K
LSAgICBib29sIHVzZXNGaXJzdExpbmVSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHMu
ZmVhdHVyZXMoKS51c2VzRmlyc3RMaW5lUnVsZXM7IH0KLSAgICBib29sIHVzZXNCZWZvcmVBZnRl
clJ1bGVzKCkgY29uc3QgeyByZXR1cm4gbV9ydWxlU2V0cy5mZWF0dXJlcygpLnVzZXNCZWZvcmVB
ZnRlclJ1bGVzOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBjcmVhdGVUcmFuc2Zvcm1PcGVyYXRpb25z
KENTU1ZhbHVlKiBpblZhbHVlLCBSZW5kZXJTdHlsZSogaW5TdHlsZSwgUmVuZGVyU3R5bGUqIHJv
b3RTdHlsZSwgVHJhbnNmb3JtT3BlcmF0aW9ucyYgb3V0T3BlcmF0aW9ucyk7Ci0gICAgCi0gICAg
dm9pZCBpbnZhbGlkYXRlTWF0Y2hlZFByb3BlcnRpZXNDYWNoZSgpOwotCi0jaWYgRU5BQkxFKENT
U19GSUxURVJTKQotICAgIGJvb2wgY3JlYXRlRmlsdGVyT3BlcmF0aW9ucyhDU1NWYWx1ZSogaW5W
YWx1ZSwgUmVuZGVyU3R5bGUqIGluU3R5bGUsIFJlbmRlclN0eWxlKiByb290U3R5bGUsIEZpbHRl
ck9wZXJhdGlvbnMmIG91dE9wZXJhdGlvbnMpOwotI2lmIEVOQUJMRShDU1NfU0hBREVSUykKLSAg
ICBTdHlsZVNoYWRlciogc3R5bGVTaGFkZXIoQ1NTVmFsdWUqKTsKLSAgICBTdHlsZVNoYWRlciog
Y2FjaGVkT3JQZW5kaW5nU3R5bGVTaGFkZXJGcm9tVmFsdWUoV2ViS2l0Q1NTU2hhZGVyVmFsdWUq
KTsKLSAgICBib29sIHBhcnNlQ3VzdG9tRmlsdGVyUGFyYW1ldGVyTGlzdChDU1NWYWx1ZSosIEN1
c3RvbUZpbHRlclBhcmFtZXRlckxpc3QmKTsKLSAgICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlclBh
cmFtZXRlcj4gcGFyc2VDdXN0b21GaWx0ZXJQYXJhbWV0ZXIoY29uc3QgU3RyaW5nJiBuYW1lLCBD
U1NWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8Q3VzdG9tRmlsdGVyUGFyYW1ldGVyPiBwYXJzZUN1
c3RvbUZpbHRlckFycmF5UGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0
Kik7Ci0gICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmls
dGVyTnVtYmVyUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0Kik7Ci0g
ICAgUGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJQYXJhbWV0ZXI+IHBhcnNlQ3VzdG9tRmlsdGVyVHJh
bnNmb3JtUGFyYW1ldGVyKGNvbnN0IFN0cmluZyYgbmFtZSwgQ1NTVmFsdWVMaXN0Kik7Ci0gICAg
UGFzc1JlZlB0cjxDdXN0b21GaWx0ZXJPcGVyYXRpb24+IGNyZWF0ZUN1c3RvbUZpbHRlck9wZXJh
dGlvbldpdGhBdFJ1bGVSZWZlcmVuY2VTeW50YXgoV2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAg
ICBQYXNzUmVmUHRyPEN1c3RvbUZpbHRlck9wZXJhdGlvbj4gY3JlYXRlQ3VzdG9tRmlsdGVyT3Bl
cmF0aW9uV2l0aElubGluZVN5bnRheChXZWJLaXRDU1NGaWx0ZXJWYWx1ZSopOwotICAgIFBhc3NS
ZWZQdHI8Q3VzdG9tRmlsdGVyT3BlcmF0aW9uPiBjcmVhdGVDdXN0b21GaWx0ZXJPcGVyYXRpb24o
V2ViS2l0Q1NTRmlsdGVyVmFsdWUqKTsKLSAgICB2b2lkIGxvYWRQZW5kaW5nU2hhZGVycygpOwot
I2VuZGlmCi0jaWYgRU5BQkxFKFNWRykKLSAgICB2b2lkIGxvYWRQZW5kaW5nU1ZHRG9jdW1lbnRz
KCk7Ci0jZW5kaWYKLSNlbmRpZiAvLyBFTkFCTEUoQ1NTX0ZJTFRFUlMpCi0KLSAgICB2b2lkIGxv
YWRQZW5kaW5nUmVzb3VyY2VzKCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBm
aXhlcyB1cCB0aGUgZGVmYXVsdCBmb250IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBjdXJy
ZW50IGdlbmVyaWMgZm9udCBmYW1pbHkgaGFzIGNoYW5nZWQuIC1kd2gKLSAgICB2b2lkIGNoZWNr
Rm9yR2VuZXJpY0ZhbWlseUNoYW5nZShSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRT
dHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zvclpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJT
dHlsZSogcGFyZW50U3R5bGUpOwotCi0gICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJT
dHlsZSogc3R5bGVUb0FkanVzdCwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50Kik7
Ci0KLSAgICBzdHJ1Y3QgUnVsZVJhbmdlIHsKLSAgICAgICAgUnVsZVJhbmdlKGludCYgZmlyc3RS
dWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJbmRleCk6IGZpcnN0UnVsZUluZGV4KGZpcnN0UnVsZUlu
ZGV4KSwgbGFzdFJ1bGVJbmRleChsYXN0UnVsZUluZGV4KSB7IH0KLSAgICAgICAgaW50JiBmaXJz
dFJ1bGVJbmRleDsKLSAgICAgICAgaW50JiBsYXN0UnVsZUluZGV4OwotICAgIH07Ci0KLSAgICBz
dHJ1Y3QgTWF0Y2hSYW5nZXMgewotICAgICAgICBNYXRjaFJhbmdlcygpIDogZmlyc3RVQVJ1bGUo
LTEpLCBsYXN0VUFSdWxlKC0xKSwgZmlyc3RBdXRob3JSdWxlKC0xKSwgbGFzdEF1dGhvclJ1bGUo
LTEpLCBmaXJzdFVzZXJSdWxlKC0xKSwgbGFzdFVzZXJSdWxlKC0xKSB7IH0KLSAgICAgICAgaW50
IGZpcnN0VUFSdWxlOwotICAgICAgICBpbnQgbGFzdFVBUnVsZTsKLSAgICAgICAgaW50IGZpcnN0
QXV0aG9yUnVsZTsKLSAgICAgICAgaW50IGxhc3RBdXRob3JSdWxlOwotICAgICAgICBpbnQgZmly
c3RVc2VyUnVsZTsKLSAgICAgICAgaW50IGxhc3RVc2VyUnVsZTsKLSAgICAgICAgUnVsZVJhbmdl
IFVBUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VUFSdWxlLCBsYXN0VUFSdWxl
KTsgfQotICAgICAgICBSdWxlUmFuZ2UgYXV0aG9yUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJh
bmdlKGZpcnN0QXV0aG9yUnVsZSwgbGFzdEF1dGhvclJ1bGUpOyB9Ci0gICAgICAgIFJ1bGVSYW5n
ZSB1c2VyUnVsZVJhbmdlKCkgeyByZXR1cm4gUnVsZVJhbmdlKGZpcnN0VXNlclJ1bGUsIGxhc3RV
c2VyUnVsZSk7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IE1hdGNoZWRQcm9wZXJ0aWVzIHsKLSAg
ICAgICAgTWF0Y2hlZFByb3BlcnRpZXMoKTsKLSAgICAgICAgfk1hdGNoZWRQcm9wZXJ0aWVzKCk7
Ci0gICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0
OwotICAgICAgICAKLSAgICAgICAgUmVmUHRyPFN0eWxlUHJvcGVydHlTZXQ+IHByb3BlcnRpZXM7
Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAg
dW5zaWduZWQgbGlua01hdGNoVHlwZSA6IDI7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgd2hp
dGVsaXN0VHlwZSA6IDI7Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gVXNlZCB0byBt
YWtlIHN1cmUgYWxsIG1lbW9yeSBpcyB6ZXJvLWluaXRpYWxpemVkIHNpbmNlIHdlIGNvbXB1dGUg
dGhlIGhhc2ggb3ZlciB0aGUgYnl0ZXMgb2YgdGhpcyBvYmplY3QuCi0gICAgICAgICAgICB2b2lk
KiBwb3NzaWJseVBhZGRlZE1lbWJlcjsKLSAgICAgICAgfTsKLSAgICB9OwotCi0gICAgc3RydWN0
IE1hdGNoUmVzdWx0IHsKLSAgICAgICAgTWF0Y2hSZXN1bHQoKSA6IGlzQ2FjaGVhYmxlKHRydWUp
IHsgfQotICAgICAgICBWZWN0b3I8TWF0Y2hlZFByb3BlcnRpZXMsIDY0PiBtYXRjaGVkUHJvcGVy
dGllczsKLSAgICAgICAgVmVjdG9yPFN0eWxlUnVsZSosIDY0PiBtYXRjaGVkUnVsZXM7Ci0gICAg
ICAgIE1hdGNoUmFuZ2VzIHJhbmdlczsKLSAgICAgICAgYm9vbCBpc0NhY2hlYWJsZTsKLSAgICB9
OwotCi0gICAgc3RhdGljIHZvaWQgYWRkTWF0Y2hlZFByb3BlcnRpZXMoTWF0Y2hSZXN1bHQmLCBj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWdu
ZWQgbGlua01hdGNoVHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hp
dGVsaXN0VHlwZSA9IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7Ci0gICAgdm9pZCBhZGRFbGVtZW50
U3R5bGVQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCosIGJv
b2wgaXNDYWNoZWFibGUgPSB0cnVlKTsKLQotICAgIHZvaWQgbWF0Y2hBbGxSdWxlcyhNYXRjaFJl
c3VsdCYsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxl
cyhNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQgbWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVs
ZVNldCopOwotICAgIHZvaWQgbWF0Y2hBdXRob3JSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5j
bHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmLCBi
b29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMo
TWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9z
dFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcyk7Ci0KLSAgICB2b2lk
IGNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwot
ICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0
JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29u
c3QgVmVjdG9yPFJ1bGVEYXRhPiosIGNvbnN0IE1hdGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwot
Ci0gICAgYm9vbCBmYXN0UmVqZWN0U2VsZWN0b3IoY29uc3QgUnVsZURhdGEmKSBjb25zdDsKLSAg
ICB2b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKLSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zlck1hdGNo
ZWRSdWxlcyhNYXRjaFJlc3VsdCYpOwotCi0gICAgYm9vbCBydWxlTWF0Y2hlcyhjb25zdCBSdWxl
RGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVjdG9yQ2hl
Y2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NC
b3VuZGFyeSk7Ci0gICAgYm9vbCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1NlbGVjdG9y
KiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCk7Ci0gICAgdm9pZCBhcHBs
eU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgY29uc3QgRWxlbWVudCopOwot
ICAgIGVudW0gU3R5bGVBcHBsaWNhdGlvblBhc3MgewotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVT
KQotICAgICAgICBWYXJpYWJsZURlZmluaXRpb25zLAotI2VuZGlmCi0gICAgICAgIEhpZ2hQcmlv
cml0eVByb3BlcnRpZXMsCi0gICAgICAgIExvd1ByaW9yaXR5UHJvcGVydGllcwotICAgIH07Ci0g
ICAgdGVtcGxhdGUgPFN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseU1h
dGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgYm9vbCBpbXBvcnRhbnQsIGludCBz
dGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIGJvb2wgaW5oZXJpdGVkT25seSk7Ci0gICAgdGVtcGxh
dGUgPFN0eWxlQXBwbGljYXRpb25QYXNzIHBhc3M+Ci0gICAgdm9pZCBhcHBseVByb3BlcnRpZXMo
Y29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcywgU3R5bGVSdWxlKiwgYm9vbCBpc0lt
cG9ydGFudCwgYm9vbCBpbmhlcml0ZWRPbmx5LCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9w
ZXJ0eVdoaXRlbGlzdE5vbmUpOwotI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQotICAgIHZvaWQg
cmVzb2x2ZVZhcmlhYmxlcyhDU1NQcm9wZXJ0eUlELCBDU1NWYWx1ZSosIFZlY3RvcjxzdGQ6OnBh
aXI8Q1NTUHJvcGVydHlJRCwgU3RyaW5nPiA+JiBrbm93bkV4cHJlc3Npb25zKTsKLSNlbmRpZgot
ICAgIHN0YXRpYyBib29sIGlzVmFsaWRSZWdpb25TdHlsZVByb3BlcnR5KENTU1Byb3BlcnR5SUQp
OwotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkQ3VlU3R5
bGVQcm9wZXJ0eShDU1NQcm9wZXJ0eUlEKTsKLSNlbmRpZgotICAgIHZvaWQgbWF0Y2hQYWdlUnVs
ZXMoTWF0Y2hSZXN1bHQmLCBSdWxlU2V0KiwgYm9vbCBpc0xlZnRQYWdlLCBib29sIGlzRmlyc3RQ
YWdlLCBjb25zdCBTdHJpbmcmIHBhZ2VOYW1lKTsKLSAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzRm9y
TGlzdChWZWN0b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxT
dHlsZVJ1bGVQYWdlKj4mLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0
IFN0cmluZyYgcGFnZU5hbWUpOwotICAgIFNldHRpbmdzKiBkb2N1bWVudFNldHRpbmdzKCkgeyBy
ZXR1cm4gbV9kb2N1bWVudC0+c2V0dGluZ3MoKTsgfQotCiAgICAgYm9vbCBpc0xlZnRQYWdlKGlu
dCBwYWdlSW5kZXgpIGNvbnN0OwogICAgIGJvb2wgaXNSaWdodFBhZ2UoaW50IHBhZ2VJbmRleCkg
Y29uc3QgeyByZXR1cm4gIWlzTGVmdFBhZ2UocGFnZUluZGV4KTsgfQogICAgIGJvb2wgaXNGaXJz
dFBhZ2UoaW50IHBhZ2VJbmRleCkgY29uc3Q7CiAgICAgU3RyaW5nIHBhZ2VOYW1lKGludCBwYWdl
SW5kZXgpIGNvbnN0OwogCi0gICAgRG9jdW1lbnRSdWxlU2V0cyBtX3J1bGVTZXRzOwotCi0gICAg
dHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBSZWZQdHI8U3R5bGVSdWxlS2V5ZnJh
bWVzPiA+IEtleWZyYW1lc1J1bGVNYXA7Ci0gICAgS2V5ZnJhbWVzUnVsZU1hcCBtX2tleWZyYW1l
c1J1bGVNYXA7Ci0KLXB1YmxpYzoKLSAgICB0eXBlZGVmIEhhc2hNYXA8Q1NTUHJvcGVydHlJRCwg
UmVmUHRyPENTU1ZhbHVlPiA+IFBlbmRpbmdJbWFnZVByb3BlcnR5TWFwOwotI2lmIEVOQUJMRShD
U1NfRklMVEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICB0eXBlZGVmIEhhc2hNYXA8RmlsdGVyT3Bl
cmF0aW9uKiwgUmVmUHRyPFdlYktpdENTU1NWR0RvY3VtZW50VmFsdWU+ID4gUGVuZGluZ1NWR0Rv
Y3VtZW50TWFwOwotI2VuZGlmCi0KLSAgICBjbGFzcyBTdGF0ZSB7Ci0gICAgICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKFN0YXRlKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFN0YXRlKCkKLSAgICAg
ICAgOiBtX2VsZW1lbnQoMCkKLSAgICAgICAgLCBtX3N0eWxlZEVsZW1lbnQoMCkKLSAgICAgICAg
LCBtX3BhcmVudE5vZGUoMCkKLSAgICAgICAgLCBtX3BhcmVudFN0eWxlKDApCi0gICAgICAgICwg
bV9yb290RWxlbWVudFN0eWxlKDApCi0gICAgICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCi0g
ICAgICAgICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkKLSAgICAgICAgLCBtX3BzZXVkb1N0eWxl
UmVxdWVzdChOT1BTRVVETykKLSAgICAgICAgLCBtX2VsZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRl
TGluaykKLSAgICAgICAgLCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludChmYWxzZSkKLSAg
ICAgICAgLCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxzZSkKLSAgICAgICAgLCBt
X21vZGUoU2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKLSAgICAgICAgLCBtX2FwcGx5
UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSh0cnVlKQotICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRv
VmlzaXRlZExpbmtTdHlsZShmYWxzZSkKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAg
ICwgbV9oYXNQZW5kaW5nU2hhZGVycyhmYWxzZSkKLSNlbmRpZgotICAgICAgICAsIG1fbGluZUhl
aWdodFZhbHVlKDApCi0gICAgICAgICwgbV9mb250RGlydHkoZmFsc2UpCi0gICAgICAgICwgbV9o
YXNVQUFwcGVhcmFuY2UoZmFsc2UpCi0gICAgICAgICwgbV9iYWNrZ3JvdW5kRGF0YShCYWNrZ3Jv
dW5kRmlsbExheWVyKSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgdm9pZCBpbml0RWxlbWVu
dChFbGVtZW50Kik7Ci0gICAgICAgIHZvaWQgaW5pdEZvclN0eWxlUmVzb2x2ZShEb2N1bWVudCos
IEVsZW1lbnQqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSAwLCBjb25zdCBQc2V1ZG9TdHls
ZVJlcXVlc3QmID0gUHNldWRvU3R5bGVSZXF1ZXN0KE5PUFNFVURPKSwgUmVuZGVyUmVnaW9uKiBy
ZWdpb25Gb3JTdHlsaW5nID0gMCk7Ci0gICAgICAgIHZvaWQgY2xlYXIoKTsKLQotICAgICAgICBE
b2N1bWVudCogZG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnQtPmRvY3VtZW50KCk7
IH0KLSAgICAgICAgRWxlbWVudCogZWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudDsg
fQotICAgICAgICBTdHlsZWRFbGVtZW50KiBzdHlsZWRFbGVtZW50KCkgY29uc3QgeyByZXR1cm4g
bV9zdHlsZWRFbGVtZW50OyB9Ci0gICAgICAgIHZvaWQgc2V0U3R5bGUoUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4gc3R5bGUpIHsgbV9zdHlsZSA9IHN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxl
KiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KLSAgICAgICAgUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7
IH0KLQotICAgICAgICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAg
ICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxl
TGlzdC5yZWxlYXNlKCk7IH0KLQotICAgICAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRO
b2RlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnROb2RlOyB9Ci0gICAgICAgIHZvaWQgc2V0UGFy
ZW50U3R5bGUoUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJl
bnRTdHlsZTsgfQotICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX3BhcmVudFN0eWxlOyB9Ci0gICAgICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxlOyB9Ci0KLSAgICAgICAgY29u
c3QgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdp
b25Gb3JTdHlsaW5nOyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1Nh
bWVPcmlnaW5Pbmx5KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0g
ICAgICAgIGJvb2wgaXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdp
bk9ubHk7IH0KLSAgICAgICAgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJl
cXVlc3QoKSBjb25zdCB7IHJldHVybiBtX3BzZXVkb1N0eWxlUmVxdWVzdDsgfQotICAgICAgICBF
SW5zaWRlTGluayBlbGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlu
a1N0YXRlOyB9Ci0gICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29u
c3QgeyByZXR1cm4gbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KLSAgICAgICAgdm9p
ZCBzZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxl
bWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQotICAgICAgICBib29sIGVs
ZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVj
dGVkQnlDbGFzc1J1bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6
Ok1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAotICAgICAgICB2
b2lkIHNldEFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBs
eVByb3BlcnR5VG9SZWd1bGFyU3R5bGUgPSBpc0FwcGx5OyB9Ci0gICAgICAgIHZvaWQgc2V0QXBw
bHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZShib29sIGlzQXBwbHkpIHsgbV9hcHBseVByb3Bl
cnR5VG9WaXNpdGVkTGlua1N0eWxlID0gaXNBcHBseTsgfQotICAgICAgICBib29sIGFwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvUmVn
dWxhclN0eWxlOyB9Ci0gICAgICAgIGJvb2wgYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHls
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRlZExpbmtTdHlsZTsgfQot
ICAgICAgICBQZW5kaW5nSW1hZ2VQcm9wZXJ0eU1hcCYgcGVuZGluZ0ltYWdlUHJvcGVydGllcygp
IHsgcmV0dXJuIG1fcGVuZGluZ0ltYWdlUHJvcGVydGllczsgfQotI2lmIEVOQUJMRShDU1NfRklM
VEVSUykgJiYgRU5BQkxFKFNWRykKLSAgICAgICAgUGVuZGluZ1NWR0RvY3VtZW50TWFwJiBwZW5k
aW5nU1ZHRG9jdW1lbnRzKCkgeyByZXR1cm4gbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOyB9Ci0jZW5k
aWYKLSNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCi0gICAgICAgIHZvaWQgc2V0SGFzUGVuZGluZ1No
YWRlcnMoYm9vbCBoYXNQZW5kaW5nU2hhZGVycykgeyBtX2hhc1BlbmRpbmdTaGFkZXJzID0gaGFz
UGVuZGluZ1NoYWRlcnM7IH0KLSAgICAgICAgYm9vbCBoYXNQZW5kaW5nU2hhZGVycygpIGNvbnN0
IHsgcmV0dXJuIG1faGFzUGVuZGluZ1NoYWRlcnM7IH0KLSNlbmRpZgotCi0gICAgICAgIHZvaWQg
c2V0TGluZUhlaWdodFZhbHVlKENTU1ZhbHVlKiB2YWx1ZSkgeyBtX2xpbmVIZWlnaHRWYWx1ZSA9
IHZhbHVlOyB9Ci0gICAgICAgIENTU1ZhbHVlKiBsaW5lSGVpZ2h0VmFsdWUoKSB7IHJldHVybiBt
X2xpbmVIZWlnaHRWYWx1ZTsgfQotICAgICAgICB2b2lkIHNldEZvbnREaXJ0eShib29sIGlzRGly
dHkpIHsgbV9mb250RGlydHkgPSBpc0RpcnR5OyB9Ci0gICAgICAgIGJvb2wgZm9udERpcnR5KCkg
Y29uc3QgeyByZXR1cm4gbV9mb250RGlydHk7IH0KLQotICAgICAgICB2b2lkIGNhY2hlQm9yZGVy
QW5kQmFja2dyb3VuZCgpOwotICAgICAgICBib29sIGhhc1VBQXBwZWFyYW5jZSgpIGNvbnN0IHsg
cmV0dXJuIG1faGFzVUFBcHBlYXJhbmNlOyB9Ci0gICAgICAgIEJvcmRlckRhdGEgYm9yZGVyRGF0
YSgpIGNvbnN0IHsgcmV0dXJuIG1fYm9yZGVyRGF0YTsgfQotICAgICAgICBGaWxsTGF5ZXIgYmFj
a2dyb3VuZERhdGEoKSBjb25zdCB7IHJldHVybiBtX2JhY2tncm91bmREYXRhOyB9Ci0gICAgICAg
IENvbG9yIGJhY2tncm91bmRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dyb3VuZENvbG9y
OyB9Ci0KLSAgICAgICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24oKSB7
IHJldHVybiBtX3N0eWxlLT5mb250RGVzY3JpcHRpb24oKTsgfQotICAgICAgICBjb25zdCBGb250
RGVzY3JpcHRpb24mIHBhcmVudEZvbnREZXNjcmlwdGlvbigpIHsgcmV0dXJuIG1fcGFyZW50U3R5
bGUtPmZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgICAgIHZvaWQgc2V0Rm9udERlc2NyaXB0aW9u
KGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSB7IG1fZm9udERpcnR5IHw9
IG1fc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOyB9Ci0gICAgICAg
IHZvaWQgc2V0Wm9vbShmbG9hdCBmKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5bGUtPnNldFpvb20o
Zik7IH0KLSAgICAgICAgdm9pZCBzZXRFZmZlY3RpdmVab29tKGZsb2F0IGYpIHsgbV9mb250RGly
dHkgfD0gbV9zdHlsZS0+c2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgICAgICB2b2lkIHNldFdy
aXRpbmdNb2RlKFdyaXRpbmdNb2RlIHdyaXRpbmdNb2RlKSB7IG1fZm9udERpcnR5IHw9IG1fc3R5
bGUtPnNldFdyaXRpbmdNb2RlKHdyaXRpbmdNb2RlKTsgfQotICAgICAgICB2b2lkIHNldFRleHRP
cmllbnRhdGlvbihUZXh0T3JpZW50YXRpb24gdGV4dE9yaWVudGF0aW9uKSB7IG1fZm9udERpcnR5
IHw9IG1fc3R5bGUtPnNldFRleHRPcmllbnRhdGlvbih0ZXh0T3JpZW50YXRpb24pOyB9Ci0KLSAg
ICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+JiBtYXRjaGVkUnVsZXMoKSB7IHJldHVy
biBtX21hdGNoZWRSdWxlczsgfQotICAgICAgICB2b2lkIGFkZE1hdGNoZWRSdWxlKGNvbnN0IFJ1
bGVEYXRhKiBydWxlKSB7IG1fbWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsgfQotICAgICAgICAK
LSAgICBwcml2YXRlOgotICAgICAgICAvLyBGSVhNRShidWcgMTA4NTYzKTogdG8gbWFrZSBpdCBl
YXNpZXIgdG8gcmV2aWV3LCB0aGVzZSBtZW1iZXIKLSAgICAgICAgLy8gdmFyaWFibGVzIGFyZSBw
dWJsaWMuIEhvd2V2ZXIgd2Ugc2hvdWxkIGFkZCBtZXRob2RzIHRvIGFjY2VzcwotICAgICAgICAv
LyB0aGVzZSB2YXJpYWJsZXMuCi0gICAgICAgIEVsZW1lbnQqIG1fZWxlbWVudDsKLSAgICAgICAg
UmVmUHRyPFJlbmRlclN0eWxlPiBtX3N0eWxlOwotICAgICAgICBTdHlsZWRFbGVtZW50KiBtX3N0
eWxlZEVsZW1lbnQ7Ci0gICAgICAgIENvbnRhaW5lck5vZGUqIG1fcGFyZW50Tm9kZTsKLSAgICAg
ICAgUmVuZGVyU3R5bGUqIG1fcGFyZW50U3R5bGU7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBtX3Jv
b3RFbGVtZW50U3R5bGU7Ci0gICAgICAgIAotICAgICAgICBSZW5kZXJSZWdpb24qIG1fcmVnaW9u
Rm9yU3R5bGluZzsKLSAgICAgICAgYm9vbCBtX3NhbWVPcmlnaW5Pbmx5OwotICAgICAgICBQc2V1
ZG9TdHlsZVJlcXVlc3QgbV9wc2V1ZG9TdHlsZVJlcXVlc3Q7Ci0KLSAgICAgICAgRUluc2lkZUxp
bmsgbV9lbGVtZW50TGlua1N0YXRlOwotCi0gICAgICAgIGJvb2wgbV9kaXN0cmlidXRlZFRvSW5z
ZXJ0aW9uUG9pbnQ7Ci0KLSAgICAgICAgYm9vbCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxl
czsKLQotICAgICAgICBTZWxlY3RvckNoZWNrZXI6Ok1vZGUgbV9tb2RlOwotCi0gICAgICAgIC8v
IEEgYnVmZmVyIHVzZWQgdG8gaG9sZCB0aGUgc2V0IG9mIG1hdGNoZWQgcnVsZXMgZm9yIGFuIGVs
ZW1lbnQsCi0gICAgICAgIC8vIGFuZCBhIHRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgbWVyZ2Ug
c29ydGluZy4KLSAgICAgICAgVmVjdG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+IG1fbWF0Y2hlZFJ1
bGVzOwotICAgICAgICBSZWZQdHI8U3RhdGljQ1NTUnVsZUxpc3Q+IG1fcnVsZUxpc3Q7Ci0KLSAg
ICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZTsKLSAgICAgICAgYm9vbCBt
X2FwcGx5UHJvcGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGU7Ci0KLSAgICAgICAgUGVuZGluZ0ltYWdl
UHJvcGVydHlNYXAgbV9wZW5kaW5nSW1hZ2VQcm9wZXJ0aWVzOwotI2lmIEVOQUJMRShDU1NfU0hB
REVSUykKLSAgICAgICAgYm9vbCBtX2hhc1BlbmRpbmdTaGFkZXJzOwotI2VuZGlmCi0jaWYgRU5B
QkxFKENTU19GSUxURVJTKSAmJiBFTkFCTEUoU1ZHKQotICAgICAgICBQZW5kaW5nU1ZHRG9jdW1l
bnRNYXAgbV9wZW5kaW5nU1ZHRG9jdW1lbnRzOwotI2VuZGlmCi0gICAgICAgIENTU1ZhbHVlKiBt
X2xpbmVIZWlnaHRWYWx1ZTsKLSAgICAgICAgYm9vbCBtX2ZvbnREaXJ0eTsKLQotICAgICAgICBi
b29sIG1faGFzVUFBcHBlYXJhbmNlOwotICAgICAgICBCb3JkZXJEYXRhIG1fYm9yZGVyRGF0YTsK
LSAgICAgICAgRmlsbExheWVyIG1fYmFja2dyb3VuZERhdGE7Ci0gICAgICAgIENvbG9yIG1fYmFj
a2dyb3VuZENvbG9yOwotICAgIH07Ci0KLSAgICBzdGF0aWMgUmVuZGVyU3R5bGUqIHN0eWxlTm90
WWV0QXZhaWxhYmxlKCkgeyByZXR1cm4gc19zdHlsZU5vdFlldEF2YWlsYWJsZTsgfQotCi0gICAg
UGFzc1JlZlB0cjxTdHlsZUltYWdlPiBzdHlsZUltYWdlKENTU1Byb3BlcnR5SUQsIENTU1ZhbHVl
Kik7Ci0gICAgUGFzc1JlZlB0cjxTdHlsZUltYWdlPiBjYWNoZWRPclBlbmRpbmdGcm9tVmFsdWUo
Q1NTUHJvcGVydHlJRCwgQ1NTSW1hZ2VWYWx1ZSopOwotICAgIFBhc3NSZWZQdHI8U3R5bGVJbWFn
ZT4gZ2VuZXJhdGVkT3JQZW5kaW5nRnJvbVZhbHVlKENTU1Byb3BlcnR5SUQsIENTU0ltYWdlR2Vu
ZXJhdG9yVmFsdWUqKTsKLSNpZiBFTkFCTEUoQ1NTX0lNQUdFX1NFVCkKLSAgICBQYXNzUmVmUHRy
PFN0eWxlSW1hZ2U+IHNldE9yUGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NJbWFn
ZVNldFZhbHVlKik7Ci0jZW5kaWYKLSAgICBQYXNzUmVmUHRyPFN0eWxlSW1hZ2U+IGN1cnNvck9y
UGVuZGluZ0Zyb21WYWx1ZShDU1NQcm9wZXJ0eUlELCBDU1NDdXJzb3JJbWFnZVZhbHVlKik7Ci0K
LSAgICBib29sIGFwcGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1f
c3RhdGUuYXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKCk7IH0KLSAgICBib29sIGFwcGx5UHJv
cGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX3N0YXRlLmFwcGx5UHJv
cGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUoKTsgfQotCi0gICAgc3RhdGljIExlbmd0aCBjb252ZXJ0
VG9JbnRMZW5ndGgoQ1NTUHJpbWl0aXZlVmFsdWUqLCBSZW5kZXJTdHlsZSosIFJlbmRlclN0eWxl
KiByb290U3R5bGUsIGRvdWJsZSBtdWx0aXBsaWVyID0gMSk7Ci0gICAgc3RhdGljIExlbmd0aCBj
b252ZXJ0VG9GbG9hdExlbmd0aChDU1NQcmltaXRpdmVWYWx1ZSosIFJlbmRlclN0eWxlKiwgUmVu
ZGVyU3R5bGUqIHJvb3RTdHlsZSwgZG91YmxlIG11bHRpcGxpZXIgPSAxKTsKLQotICAgIENTU1Rv
U3R5bGVNYXAqIHN0eWxlTWFwKCkgeyByZXR1cm4gJm1fc3R5bGVNYXA7IH0KLSAgICBJbnNwZWN0
b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzKCkgeyByZXR1cm4gbV9pbnNw
ZWN0b3JDU1NPTVdyYXBwZXJzOyB9Ci0gICAgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVz
Y3JpcHRpb24oKSB7IHJldHVybiBtX3N0YXRlLmZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgY29u
c3QgRm9udERlc2NyaXB0aW9uJiBwYXJlbnRGb250RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX3N0
YXRlLnBhcmVudEZvbnREZXNjcmlwdGlvbigpOyB9Ci0gICAgdm9pZCBzZXRGb250RGVzY3JpcHRp
b24oY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIHsgbV9zdGF0ZS5zZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsgfQotICAgIHZvaWQgc2V0Wm9vbShmbG9h
dCBmKSB7IG1fc3RhdGUuc2V0Wm9vbShmKTsgfQotICAgIHZvaWQgc2V0RWZmZWN0aXZlWm9vbShm
bG9hdCBmKSB7IG1fc3RhdGUuc2V0RWZmZWN0aXZlWm9vbShmKTsgfQotICAgIHZvaWQgc2V0V3Jp
dGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9zdGF0ZS5zZXRXcml0aW5nTW9k
ZSh3cml0aW5nTW9kZSk7IH0KLSAgICB2b2lkIHNldFRleHRPcmllbnRhdGlvbihUZXh0T3JpZW50
YXRpb24gdGV4dE9yaWVudGF0aW9uKSB7IG1fc3RhdGUuc2V0VGV4dE9yaWVudGF0aW9uKHRleHRP
cmllbnRhdGlvbik7IH0KLSAgICAKLSAgICB2b2lkIHJlcG9ydE1lbW9yeVVzYWdlKE1lbW9yeU9i
amVjdEluZm8qKSBjb25zdDsKLSAgICAKLXByaXZhdGU6Ci0gICAgc3RhdGljIFJlbmRlclN0eWxl
KiBzX3N0eWxlTm90WWV0QXZhaWxhYmxlOwotCi0gICAgdm9pZCBjYWNoZUJvcmRlckFuZEJhY2tn
cm91bmQoKTsKLQotcHJpdmF0ZToKLSAgICBib29sIGNhblNoYXJlU3R5bGVXaXRoQ29udHJvbChT
dHlsZWRFbGVtZW50KikgY29uc3Q7Ci0KLSAgICB2b2lkIGFwcGx5UHJvcGVydHkoQ1NTUHJvcGVy
dHlJRCwgQ1NTVmFsdWUqKTsKLQotI2lmIEVOQUJMRShTVkcpCi0gICAgdm9pZCBhcHBseVNWR1By
b3BlcnR5KENTU1Byb3BlcnR5SUQsIENTU1ZhbHVlKik7Ci0jZW5kaWYKLQotICAgIFBhc3NSZWZQ
dHI8U3R5bGVJbWFnZT4gbG9hZFBlbmRpbmdJbWFnZShTdHlsZVBlbmRpbmdJbWFnZSopOwotICAg
IHZvaWQgbG9hZFBlbmRpbmdJbWFnZXMoKTsKKyAgICB2b2lkIG1hdGNoUGFnZVJ1bGVzKFJ1bGVT
ZXQqIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmlu
ZyYgcGFnZU5hbWUpOworICAgIHZvaWQgbWF0Y2hQYWdlUnVsZXNGb3JMaXN0KFZlY3RvcjxTdHls
ZVJ1bGVQYWdlKj4mIG1hdGNoZWRSdWxlcywgY29uc3QgVmVjdG9yPFN0eWxlUnVsZVBhZ2UqPiYg
cnVsZXMsIGJvb2wgaXNMZWZ0UGFnZSwgYm9vbCBpc0ZpcnN0UGFnZSwgY29uc3QgU3RyaW5nJiBw
YWdlTmFtZSk7CiAKLSAgICBzdGF0aWMgdW5zaWduZWQgY29tcHV0ZU1hdGNoZWRQcm9wZXJ0aWVz
SGFzaChjb25zdCBNYXRjaGVkUHJvcGVydGllcyosIHVuc2lnbmVkIHNpemUpOwotICAgIHN0cnVj
dCBNYXRjaGVkUHJvcGVydGllc0NhY2hlSXRlbSB7Ci0gICAgICAgIHZvaWQgcmVwb3J0TWVtb3J5
VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwotICAgICAgICBWZWN0b3I8TWF0Y2hlZFBy
b3BlcnRpZXM+IG1hdGNoZWRQcm9wZXJ0aWVzOwotICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7
Ci0gICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcmVuZGVyU3R5bGU7Ci0gICAgICAgIFJlZlB0
cjxSZW5kZXJTdHlsZT4gcGFyZW50UmVuZGVyU3R5bGU7Ci0gICAgfTsKLSAgICBjb25zdCBNYXRj
aGVkUHJvcGVydGllc0NhY2hlSXRlbSogZmluZEZyb21NYXRjaGVkUHJvcGVydGllc0NhY2hlKHVu
c2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7Ci0gICAgdm9pZCBhZGRUb01hdGNoZWRQ
cm9wZXJ0aWVzQ2FjaGUoY29uc3QgUmVuZGVyU3R5bGUqLCBjb25zdCBSZW5kZXJTdHlsZSogcGFy
ZW50U3R5bGUsIHVuc2lnbmVkIGhhc2gsIGNvbnN0IE1hdGNoUmVzdWx0Jik7CisgICAgY29uc3Qg
U3R5bGVSZXNvbHZlcjo6U3RhdGUmIG1fc3RhdGU7CisgICAgRG9jdW1lbnRSdWxlU2V0cyYgbV9y
dWxlU2V0czsKIAotICAgIC8vIEV2ZXJ5IE4gYWRkaXRpb25zIHRvIHRoZSBtYXRjaGVkIGRlY2xh
cmF0aW9uIGNhY2hlIHRyaWdnZXIgYSBzd2VlcCB3aGVyZSBlbnRyaWVzIGhvbGRpbmcKLSAgICAv
LyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBzdHlsZSBkZWNsYXJhdGlvbiBhcmUgZ2FyYmFnZSBj
b2xsZWN0ZWQuCi0gICAgdm9pZCBzd2VlcE1hdGNoZWRQcm9wZXJ0aWVzQ2FjaGUoVGltZXI8U3R5
bGVSZXNvbHZlcj4qKTsKLQotICAgIGJvb2wgY2xhc3NOYW1lc0FmZmVjdGVkQnlSdWxlcyhjb25z
dCBTcGFjZVNwbGl0U3RyaW5nJikgY29uc3Q7Ci0gICAgYm9vbCBzaGFyaW5nQ2FuZGlkYXRlSGFz
SWRlbnRpY2FsU3R5bGVBZmZlY3RpbmdBdHRyaWJ1dGVzKFN0eWxlZEVsZW1lbnQqKSBjb25zdDsK
LQotICAgIHVuc2lnbmVkIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZUFkZGl0aW9uc1NpbmNlTGFz
dFN3ZWVwOwotCi0gICAgdHlwZWRlZiBIYXNoTWFwPHVuc2lnbmVkLCBNYXRjaGVkUHJvcGVydGll
c0NhY2hlSXRlbT4gTWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKLSAgICBNYXRjaGVkUHJvcGVydGll
c0NhY2hlIG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZTsKLQotICAgIFRpbWVyPFN0eWxlUmVzb2x2
ZXI+IG1fbWF0Y2hlZFByb3BlcnRpZXNDYWNoZVN3ZWVwVGltZXI7Ci0KLSAgICBPd25QdHI8TWVk
aWFRdWVyeUV2YWx1YXRvcj4gbV9tZWRpdW07Ci0gICAgUmVmUHRyPFJlbmRlclN0eWxlPiBtX3Jv
b3REZWZhdWx0U3R5bGU7Ci0KLSAgICBEb2N1bWVudCogbV9kb2N1bWVudDsKLSAgICBTZWxlY3Rv
ckZpbHRlciBtX3NlbGVjdG9yRmlsdGVyOwotCi0gICAgYm9vbCBtX21hdGNoQXV0aG9yQW5kVXNl
clN0eWxlczsKLQotICAgIFJlZlB0cjxDU1NGb250U2VsZWN0b3I+IG1fZm9udFNlbGVjdG9yOwot
ICAgIFZlY3RvcjxPd25QdHI8TWVkaWFRdWVyeVJlc3VsdD4gPiBtX3ZpZXdwb3J0RGVwZW5kZW50
TWVkaWFRdWVyeVJlc3VsdHM7Ci0KLSNpZiBFTkFCTEUoQ1NTX0RFVklDRV9BREFQVEFUSU9OKQot
ICAgIFJlZlB0cjxWaWV3cG9ydFN0eWxlUmVzb2x2ZXI+IG1fdmlld3BvcnRTdHlsZVJlc29sdmVy
OwotI2VuZGlmCi0KLSAgICBjb25zdCBTdHlsZUJ1aWxkZXImIG1fc3R5bGVCdWlsZGVyOwotCi0g
ICAgT3duUHRyPFN0eWxlU2NvcGVSZXNvbHZlcj4gbV9zY29wZVJlc29sdmVyOwotICAgIENTU1Rv
U3R5bGVNYXAgbV9zdHlsZU1hcDsKLSAgICBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzIG1faW5zcGVj
dG9yQ1NTT01XcmFwcGVyczsKLQotICAgIFN0YXRlIG1fc3RhdGU7Ci0KLSAgICBmcmllbmQgY2xh
c3MgU3R5bGVCdWlsZGVyOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hl
ZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVydGllcyYpOwotICAgIGZyaWVuZCBib29s
IG9wZXJhdG9yIT0oY29uc3QgTWF0Y2hlZFByb3BlcnRpZXMmLCBjb25zdCBNYXRjaGVkUHJvcGVy
dGllcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hSYW5nZXMmLCBj
b25zdCBNYXRjaFJhbmdlcyYpOwotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWF0
Y2hSYW5nZXMmLCBjb25zdCBNYXRjaFJhbmdlcyYpOworICAgIFN0eWxlUmVzb2x2ZXI6Ok1hdGNo
UmVzdWx0IG1fcmVzdWx0OwogfTsKIAotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2Vs
ZWN0b3JGb3JBdHRyaWJ1dGUoY29uc3QgQXRvbWljU3RyaW5nICZhdHRyaWJ1dGVOYW1lKSBjb25z
dAotewotICAgIEFTU0VSVCghYXR0cmlidXRlTmFtZS5pc0VtcHR5KCkpOwotICAgIHJldHVybiBt
X3J1bGVTZXRzLmZlYXR1cmVzKCkuYXR0cnNJblJ1bGVzLmNvbnRhaW5zKGF0dHJpYnV0ZU5hbWUu
aW1wbCgpKTsKLX0KLQotaW5saW5lIGJvb2wgU3R5bGVSZXNvbHZlcjo6aGFzU2VsZWN0b3JGb3JD
bGFzcyhjb25zdCBBdG9taWNTdHJpbmcmIGNsYXNzVmFsdWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJU
KCFjbGFzc1ZhbHVlLmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIG1fcnVsZVNldHMuZmVhdHVyZXMo
KS5jbGFzc2VzSW5SdWxlcy5jb250YWlucyhjbGFzc1ZhbHVlLmltcGwoKSk7Ci19Ci0KLWlubGlu
ZSBib29sIFN0eWxlUmVzb2x2ZXI6Omhhc1NlbGVjdG9yRm9ySWQoY29uc3QgQXRvbWljU3RyaW5n
JiBpZFZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVCghaWRWYWx1ZS5pc0VtcHR5KCkpOwotICAg
IHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRzSW5SdWxlcy5jb250YWlucyhpZFZhbHVl
LmltcGwoKSk7Ci19Ci0KIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmIC8vIFN0eWxl
UmVzb2x2ZXJfaAorI2VuZGlmIC8vIFBhZ2VSdWxlQ29sbGVjdG9yX2gKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9jc3MvU3R5bGVSZXNvbHZlci5jcHAJKHJldmlzaW9uIDE0NTMzOCkKKysrIFNvdXJjZS9XZWJD
b3JlL2Nzcy9TdHlsZVJlc29sdmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTksNiArNTksNyBA
QAogI2luY2x1ZGUgIkNvdW50ZXJDb250ZW50LmgiCiAjaW5jbHVkZSAiQ3Vyc29yTGlzdC5oIgog
I2luY2x1ZGUgIkRvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJFbGVt
ZW50UnVsZUNvbGxlY3Rvci5oIgogI2luY2x1ZGUgIkVsZW1lbnRTaGFkb3cuaCIKICNpbmNsdWRl
ICJGb250RmVhdHVyZVZhbHVlLmgiCiAjaW5jbHVkZSAiRm9udFZhbHVlLmgiCkBAIC04Niw2ICs4
Nyw3IEBACiAjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxlLmgiCiAjaW5jbHVkZSAiTm9kZVJlbmRl
cmluZ0NvbnRleHQuaCIKICNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGFnZVJ1bGVDb2xs
ZWN0b3IuaCIKICNpbmNsdWRlICJQYWlyLmgiCiAjaW5jbHVkZSAiUGVyc3BlY3RpdmVUcmFuc2Zv
cm1PcGVyYXRpb24uaCIKICNpbmNsdWRlICJRdW90ZXNEYXRhLmgiCkBAIC0xMDcsNyArMTA5LDYg
QEAKICNpbmNsdWRlICJTaGFkb3dEYXRhLmgiCiAjaW5jbHVkZSAiU2hhZG93Um9vdC5oIgogI2lu
Y2x1ZGUgIlNoYWRvd1ZhbHVlLmgiCi0jaW5jbHVkZSAiU2libGluZ1RyYXZlcnNhbFN0cmF0ZWdp
ZXMuaCIKICNpbmNsdWRlICJTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmgiCiAjaW5jbHVkZSAiU3R5
bGVCdWlsZGVyLmgiCiAjaW5jbHVkZSAiU3R5bGVDYWNoZWRJbWFnZS5oIgpAQCAtMjEwLDMwICsy
MTEsNiBAQCBpZiAoaXNJbml0aWFsKSB7IFwKIAogUmVuZGVyU3R5bGUqIFN0eWxlUmVzb2x2ZXI6
OnNfc3R5bGVOb3RZZXRBdmFpbGFibGU7CiAKLXN0YXRpYyBTdHlsZVByb3BlcnR5U2V0KiBsZWZ0
VG9SaWdodERlY2xhcmF0aW9uKCkKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFJlZlB0cjxT
dHlsZVByb3BlcnR5U2V0PiwgbGVmdFRvUmlnaHREZWNsLCAoU3R5bGVQcm9wZXJ0eVNldDo6Y3Jl
YXRlKCkpKTsKLSAgICBpZiAobGVmdFRvUmlnaHREZWNsLT5pc0VtcHR5KCkpCi0gICAgICAgIGxl
ZnRUb1JpZ2h0RGVjbC0+c2V0UHJvcGVydHkoQ1NTUHJvcGVydHlEaXJlY3Rpb24sIENTU1ZhbHVl
THRyKTsKLSAgICByZXR1cm4gbGVmdFRvUmlnaHREZWNsLmdldCgpOwotfQotCi1zdGF0aWMgU3R5
bGVQcm9wZXJ0eVNldCogcmlnaHRUb0xlZnREZWNsYXJhdGlvbigpCi17Ci0gICAgREVGSU5FX1NU
QVRJQ19MT0NBTChSZWZQdHI8U3R5bGVQcm9wZXJ0eVNldD4sIHJpZ2h0VG9MZWZ0RGVjbCwgKFN0
eWxlUHJvcGVydHlTZXQ6OmNyZWF0ZSgpKSk7Ci0gICAgaWYgKHJpZ2h0VG9MZWZ0RGVjbC0+aXNF
bXB0eSgpKQotICAgICAgICByaWdodFRvTGVmdERlY2wtPnNldFByb3BlcnR5KENTU1Byb3BlcnR5
RGlyZWN0aW9uLCBDU1NWYWx1ZVJ0bCk7Ci0gICAgcmV0dXJuIHJpZ2h0VG9MZWZ0RGVjbC5nZXQo
KTsKLX0KLQotCi1pbmxpbmUgU3RhdGljQ1NTUnVsZUxpc3QqIFN0eWxlUmVzb2x2ZXI6OlN0YXRl
OjplbnN1cmVSdWxlTGlzdCgpCi17Ci0gICAgaWYgKCFtX3J1bGVMaXN0KQotICAgICAgICBtX3J1
bGVMaXN0ID0gU3RhdGljQ1NTUnVsZUxpc3Q6OmNyZWF0ZSgpOwotICAgIHJldHVybiBtX3J1bGVM
aXN0LmdldCgpOwotfQotCiBpbmxpbmUgdm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6Y2FjaGVC
b3JkZXJBbmRCYWNrZ3JvdW5kKCkKIHsKICAgICBtX2hhc1VBQXBwZWFyYW5jZSA9IG1fc3R5bGUt
Pmhhc0FwcGVhcmFuY2UoKTsKQEAgLTI1MSw4ICsyMjgsNiBAQCBpbmxpbmUgdm9pZCBTdHlsZVJl
c29sdmVyOjpTdGF0ZTo6Y2xlYXIoCiAgICAgbV9wYXJlbnRTdHlsZSA9IDA7CiAgICAgbV9wYXJl
bnROb2RlID0gMDsKICAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSAwOwotICAgIG1fcnVsZUxpc3Qg
PSAwOwotICAgIG1fbWF0Y2hlZFJ1bGVzLmNsZWFyKCk7CiAgICAgbV9wZW5kaW5nSW1hZ2VQcm9w
ZXJ0aWVzLmNsZWFyKCk7CiAjaWYgRU5BQkxFKENTU19TSEFERVJTKQogICAgIG1faGFzUGVuZGlu
Z1NoYWRlcnMgPSBmYWxzZTsKQEAgLTI2Miw2ICsyMzcsMTYgQEAgaW5saW5lIHZvaWQgU3R5bGVS
ZXNvbHZlcjo6U3RhdGU6OmNsZWFyKAogI2VuZGlmCiB9CiAKK3ZvaWQgU3R5bGVSZXNvbHZlcjo6
TWF0Y2hSZXN1bHQ6OmFkZE1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IFN0eWxlUHJvcGVydHlTZXQq
IHByb3BlcnRpZXMsIFN0eWxlUnVsZSogcnVsZSwgdW5zaWduZWQgbGlua01hdGNoVHlwZSwgUHJv
cGVydHlXaGl0ZWxpc3RUeXBlIHByb3BlcnR5V2hpdGVsaXN0VHlwZSkKK3sKKyAgICBtYXRjaGVk
UHJvcGVydGllcy5ncm93KG1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSArIDEpOworICAgIFN0eWxl
UmVzb2x2ZXI6Ok1hdGNoZWRQcm9wZXJ0aWVzJiBuZXdQcm9wZXJ0aWVzID0gbWF0Y2hlZFByb3Bl
cnRpZXMubGFzdCgpOworICAgIG5ld1Byb3BlcnRpZXMucHJvcGVydGllcyA9IGNvbnN0X2Nhc3Q8
U3R5bGVQcm9wZXJ0eVNldCo+KHByb3BlcnRpZXMpOworICAgIG5ld1Byb3BlcnRpZXMubGlua01h
dGNoVHlwZSA9IGxpbmtNYXRjaFR5cGU7CisgICAgbmV3UHJvcGVydGllcy53aGl0ZWxpc3RUeXBl
ID0gcHJvcGVydHlXaGl0ZWxpc3RUeXBlOworICAgIG1hdGNoZWRSdWxlcy5hcHBlbmQocnVsZSk7
Cit9CisKIFN0eWxlUmVzb2x2ZXI6OlN0eWxlUmVzb2x2ZXIoRG9jdW1lbnQqIGRvY3VtZW50LCBi
b29sIG1hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKICAgICA6IG1fbWF0Y2hlZFByb3BlcnRpZXND
YWNoZUFkZGl0aW9uc1NpbmNlTGFzdFN3ZWVwKDApCiAgICAgLCBtX21hdGNoZWRQcm9wZXJ0aWVz
Q2FjaGVTd2VlcFRpbWVyKHRoaXMsICZTdHlsZVJlc29sdmVyOjpzd2VlcE1hdGNoZWRQcm9wZXJ0
aWVzQ2FjaGUpCkBAIC00MDUsMTgyICszOTAsNiBAQCB2b2lkIFN0eWxlUmVzb2x2ZXI6OnN3ZWVw
TWF0Y2hlZFByb3BlcnRpCiAgICAgbV9tYXRjaGVkUHJvcGVydGllc0NhY2hlQWRkaXRpb25zU2lu
Y2VMYXN0U3dlZXAgPSAwOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6OmFkZE1hdGNoZWRQcm9w
ZXJ0aWVzKE1hdGNoUmVzdWx0JiBtYXRjaFJlc3VsdCwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCog
cHJvcGVydGllcywgU3R5bGVSdWxlKiBydWxlLCB1bnNpZ25lZCBsaW5rTWF0Y2hUeXBlLCBQcm9w
ZXJ0eVdoaXRlbGlzdFR5cGUgcHJvcGVydHlXaGl0ZWxpc3RUeXBlKQotewotICAgIG1hdGNoUmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLmdyb3cobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMu
c2l6ZSgpICsgMSk7Ci0gICAgTWF0Y2hlZFByb3BlcnRpZXMmIG5ld1Byb3BlcnRpZXMgPSBtYXRj
aFJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5sYXN0KCk7Ci0gICAgbmV3UHJvcGVydGllcy5wcm9w
ZXJ0aWVzID0gY29uc3RfY2FzdDxTdHlsZVByb3BlcnR5U2V0Kj4ocHJvcGVydGllcyk7Ci0gICAg
bmV3UHJvcGVydGllcy5saW5rTWF0Y2hUeXBlID0gbGlua01hdGNoVHlwZTsKLSAgICBuZXdQcm9w
ZXJ0aWVzLndoaXRlbGlzdFR5cGUgPSBwcm9wZXJ0eVdoaXRlbGlzdFR5cGU7Ci0gICAgbWF0Y2hS
ZXN1bHQubWF0Y2hlZFJ1bGVzLmFwcGVuZChydWxlKTsKLX0KLQotaW5saW5lIHZvaWQgU3R5bGVS
ZXNvbHZlcjo6YWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3VsdCYgcmVzdWx0LCBj
b25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0eVNldCwgYm9vbCBpc0NhY2hlYWJsZSkKLXsK
LSAgICBpZiAoIXByb3BlcnR5U2V0KQotICAgICAgICByZXR1cm47Ci0gICAgcmVzdWx0LnJhbmdl
cy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCk7Ci0gICAg
aWYgKHJlc3VsdC5yYW5nZXMuZmlyc3RBdXRob3JSdWxlID09IC0xKQotICAgICAgICByZXN1bHQu
cmFuZ2VzLmZpcnN0QXV0aG9yUnVsZSA9IHJlc3VsdC5yYW5nZXMubGFzdEF1dGhvclJ1bGU7Ci0g
ICAgYWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBwcm9wZXJ0eVNldCk7Ci0gICAgaWYgKCFp
c0NhY2hlYWJsZSkKLSAgICAgICAgcmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci19Ci0KLWNs
YXNzIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHsKLXB1YmxpYzoKLSAgICBNYXRjaGluZ1VBUnVsZXNT
Y29wZSgpOwotICAgIH5NYXRjaGluZ1VBUnVsZXNTY29wZSgpOwotCi0gICAgc3RhdGljIGJvb2wg
aXNNYXRjaGluZ1VBUnVsZXMoKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgYm9vbCBtX21hdGNo
aW5nVUFSdWxlczsKLX07Ci0KLU1hdGNoaW5nVUFSdWxlc1Njb3BlOjpNYXRjaGluZ1VBUnVsZXNT
Y29wZSgpCi17Ci0gICAgQVNTRVJUKCFtX21hdGNoaW5nVUFSdWxlcyk7Ci0gICAgbV9tYXRjaGlu
Z1VBUnVsZXMgPSB0cnVlOwotfQotCi1NYXRjaGluZ1VBUnVsZXNTY29wZTo6fk1hdGNoaW5nVUFS
dWxlc1Njb3BlKCkKLXsKLSAgICBtX21hdGNoaW5nVUFSdWxlcyA9IGZhbHNlOwotfQotCi1pbmxp
bmUgYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29wZTo6aXNNYXRjaGluZ1VBUnVsZXMoKQotewotICAg
IHJldHVybiBtX21hdGNoaW5nVUFSdWxlczsKLX0KLQotYm9vbCBNYXRjaGluZ1VBUnVsZXNTY29w
ZTo6bV9tYXRjaGluZ1VBUnVsZXMgPSBmYWxzZTsKLQotdm9pZCBTdHlsZVJlc29sdmVyOjpjb2xs
ZWN0TWF0Y2hpbmdSdWxlcyhjb25zdCBNYXRjaFJlcXVlc3QmIG1hdGNoUmVxdWVzdCwgUnVsZVJh
bmdlJiBydWxlUmFuZ2UpCi17Ci0gICAgQVNTRVJUKG1hdGNoUmVxdWVzdC5ydWxlU2V0KTsKLSAg
ICBBU1NFUlQobV9zdGF0ZS5lbGVtZW50KCkpOwotCi0gICAgU3RhdGUmIHN0YXRlID0gbV9zdGF0
ZTsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGUuZWxlbWVudCgpOwotICAgIGNvbnN0IFN0
eWxlZEVsZW1lbnQqIHN0eWxlZEVsZW1lbnQgPSBzdGF0ZS5zdHlsZWRFbGVtZW50KCk7Ci0gICAg
Y29uc3QgQXRvbWljU3RyaW5nJiBwc2V1ZG9JZCA9IGVsZW1lbnQtPnNoYWRvd1BzZXVkb0lkKCk7
Ci0gICAgaWYgKCFwc2V1ZG9JZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNTRVJUKHN0eWxlZEVs
ZW1lbnQpOwotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hSZXF1ZXN0
LnJ1bGVTZXQtPnNoYWRvd1BzZXVkb0VsZW1lbnRSdWxlcyhwc2V1ZG9JZC5pbXBsKCkpLCBtYXRj
aFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFZJREVPX1RSQUNLKQot
ICAgIGlmIChlbGVtZW50LT5pc1dlYlZUVEVsZW1lbnQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5jdWVQc2V1ZG9SdWxlcygpLCBt
YXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0jZW5kaWYKLSAgICAvLyBDaGVjayB3aGV0aGVyIG90
aGVyIHR5cGVzIG9mIHJ1bGVzIGFyZSBhcHBsaWNhYmxlIGluIHRoZSBjdXJyZW50IHRyZWUgc2Nv
cGUuIENyaXRlcmlhIGZvciB0aGlzOgotICAgIC8vIGEpIGl0J3MgYSBVQSBydWxlCi0gICAgLy8g
YikgdGhlIHRyZWUgc2NvcGUgYWxsb3dzIGF1dGhvciBydWxlcwotICAgIC8vIGMpIHRoZSBydWxl
cyBjb21lcyBmcm9tIGEgc2NvcGVkIHN0eWxlIHNoZWV0IHdpdGhpbiB0aGUgc2FtZSB0cmVlIHNj
b3BlCi0gICAgVHJlZVNjb3BlKiB0cmVlU2NvcGUgPSBlbGVtZW50LT50cmVlU2NvcGUoKTsKLSAg
ICBpZiAoIU1hdGNoaW5nVUFSdWxlc1Njb3BlOjppc01hdGNoaW5nVUFSdWxlcygpCi0gICAgICAg
ICYmICF0cmVlU2NvcGUtPmFwcGx5QXV0aG9yU3R5bGVzKCkKLSAgICAgICAgJiYgKCFtYXRjaFJl
cXVlc3Quc2NvcGUgfHwgbWF0Y2hSZXF1ZXN0LnNjb3BlLT50cmVlU2NvcGUoKSAhPSB0cmVlU2Nv
cGUpCi0gICAgICAgICYmIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkgPT0gU2VsZWN0
b3JDaGVja2VyOjpEb2VzTm90Q3Jvc3NCb3VuZGFyeSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gV2UgbmVlZCB0byBjb2xsZWN0IHRoZSBydWxlcyBmb3IgaWQsIGNsYXNzLCB0YWcsIGFuZCBl
dmVyeXRoaW5nIGVsc2UgaW50byBhIGJ1ZmZlciBhbmQKLSAgICAvLyB0aGVuIHNvcnQgdGhlIGJ1
ZmZlci4KLSAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSkKLSAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5ydWxlU2V0LT5pZFJ1bGVzKGVsZW1lbnQtPmlkRm9y
U3R5bGVSZXNvbHV0aW9uKCkuaW1wbCgpKSwgbWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAg
IGlmIChzdHlsZWRFbGVtZW50ICYmIHN0eWxlZEVsZW1lbnQtPmhhc0NsYXNzKCkpIHsKLSAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZWRFbGVtZW50LT5jbGFzc05hbWVzKCkuc2l6
ZSgpOyArK2kpCi0gICAgICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQtPmNsYXNzUnVsZXMoc3R5bGVkRWxlbWVudC0+Y2xhc3NOYW1lcygpW2ld
LmltcGwoKSksIG1hdGNoUmVxdWVzdCwgcnVsZVJhbmdlKTsKLSAgICB9Ci0KLSAgICBpZiAoZWxl
bWVudC0+aXNMaW5rKCkpCi0gICAgICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzRm9yTGlzdChtYXRj
aFJlcXVlc3QucnVsZVNldC0+bGlua1BzZXVkb0NsYXNzUnVsZXMoKSwgbWF0Y2hSZXF1ZXN0LCBy
dWxlUmFuZ2UpOwotICAgIGlmIChTZWxlY3RvckNoZWNrZXI6Om1hdGNoZXNGb2N1c1BzZXVkb0Ns
YXNzKGVsZW1lbnQpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QobWF0Y2hS
ZXF1ZXN0LnJ1bGVTZXQtPmZvY3VzUHNldWRvQ2xhc3NSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1
bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVxdWVzdC5y
dWxlU2V0LT50YWdSdWxlcyhlbGVtZW50LT5sb2NhbE5hbWUoKS5pbXBsKCkpLCBtYXRjaFJlcXVl
c3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29sbGVjdE1hdGNoaW5nUnVsZXNGb3JMaXN0KG1hdGNoUmVx
dWVzdC5ydWxlU2V0LT51bml2ZXJzYWxSdWxlcygpLCBtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7
Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6Y29sbGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24o
Y29uc3QgTWF0Y2hSZXF1ZXN0JiBtYXRjaFJlcXVlc3QsIFJ1bGVSYW5nZSYgcnVsZVJhbmdlKQot
ewotICAgIGlmICghbV9zdGF0ZS5yZWdpb25Gb3JTdHlsaW5nKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIHVuc2lnbmVkIHNpemUgPSBtYXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxl
Y3RvcnNBbmRSdWxlU2V0cy5zaXplKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNp
emU7ICsraSkgewotICAgICAgICBjb25zdCBDU1NTZWxlY3RvciogcmVnaW9uU2VsZWN0b3IgPSBt
YXRjaFJlcXVlc3QucnVsZVNldC0+bV9yZWdpb25TZWxlY3RvcnNBbmRSdWxlU2V0cy5hdChpKS5z
ZWxlY3RvcjsKLSAgICAgICAgaWYgKGNoZWNrUmVnaW9uU2VsZWN0b3IocmVnaW9uU2VsZWN0b3Is
IHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX3N0YXRlLnJlZ2lvbkZvclN0eWxpbmcoKS0+bm9kZSgp
KSkpIHsKLSAgICAgICAgICAgIFJ1bGVTZXQqIHJlZ2lvblJ1bGVzID0gbWF0Y2hSZXF1ZXN0LnJ1
bGVTZXQtPm1fcmVnaW9uU2VsZWN0b3JzQW5kUnVsZVNldHMuYXQoaSkucnVsZVNldC5nZXQoKTsK
LSAgICAgICAgICAgIEFTU0VSVChyZWdpb25SdWxlcyk7Ci0gICAgICAgICAgICBjb2xsZWN0TWF0
Y2hpbmdSdWxlcyhNYXRjaFJlcXVlc3QocmVnaW9uUnVsZXMsIG1hdGNoUmVxdWVzdC5pbmNsdWRl
RW1wdHlSdWxlcywgbWF0Y2hSZXF1ZXN0LnNjb3BlKSwgcnVsZVJhbmdlKTsKLSAgICAgICAgfQot
ICAgIH0KLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVs
ZXMoTWF0Y2hSZXN1bHQmIHJlc3VsdCkKLXsKLSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwot
ICAgIFZlY3Rvcjxjb25zdCBSdWxlRGF0YSosIDMyPiYgbWF0Y2hlZFJ1bGVzID0gc3RhdGUubWF0
Y2hlZFJ1bGVzKCk7Ci0gICAgaWYgKG1hdGNoZWRSdWxlcy5pc0VtcHR5KCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIHNvcnRNYXRjaGVkUnVsZXMoKTsKLQotICAgIGlmIChzdGF0ZS5tb2RlKCkg
PT0gU2VsZWN0b3JDaGVja2VyOjpDb2xsZWN0aW5nUnVsZXMpIHsKLSAgICAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG1hdGNoZWRSdWxlcy5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIHN0
YXRlLmVuc3VyZVJ1bGVMaXN0KCktPnJ1bGVzKCkuYXBwZW5kKG1hdGNoZWRSdWxlc1tpXS0+cnVs
ZSgpLT5jcmVhdGVDU1NPTVdyYXBwZXIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICAvLyBOb3cgdHJhbnNmZXIgdGhlIHNldCBvZiBtYXRjaGVkIHJ1bGVzIG92ZXIgdG8gb3VyIGxp
c3Qgb2YgZGVjbGFyYXRpb25zLgotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtYXRjaGVk
UnVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHN0YXRlLnN0eWxlKCkgJiYgbWF0Y2hl
ZFJ1bGVzW2ldLT5jb250YWluc1VuY29tbW9uQXR0cmlidXRlU2VsZWN0b3IoKSkKLSAgICAgICAg
ICAgIHN0YXRlLnN0eWxlKCktPnNldFVuaXF1ZSgpOwotICAgICAgICBhZGRNYXRjaGVkUHJvcGVy
dGllcyhyZXN1bHQsIG1hdGNoZWRSdWxlc1tpXS0+cnVsZSgpLT5wcm9wZXJ0aWVzKCksIG1hdGNo
ZWRSdWxlc1tpXS0+cnVsZSgpLCBtYXRjaGVkUnVsZXNbaV0tPmxpbmtNYXRjaFR5cGUoKSwgbWF0
Y2hlZFJ1bGVzW2ldLT5wcm9wZXJ0eVdoaXRlbGlzdFR5cGUoKSk7Ci0gICAgfQotfQotCi12b2lk
IFN0eWxlUmVzb2x2ZXI6Om1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8
fCBFTkFCTEUoU0hBRE9XX0RPTSkKLSAgICBpZiAoIW1fc2NvcGVSZXNvbHZlcikKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgLy8gTWF0Y2ggc2NvcGVkIGF1dGhvciBydWxlcyBieSB0cmF2ZXJzaW5n
IHRoZSBzY29wZWQgZWxlbWVudCBzdGFjayAocmVidWlsZCBpdCBpZiBpdCBnb3QgaW5jb25zaXN0
ZW50KS4KLSAgICBpZiAobV9zY29wZVJlc29sdmVyLT5oYXNTY29wZWRTdHlsZXMoKSAmJiBtX3Nj
b3BlUmVzb2x2ZXItPmVuc3VyZVN0YWNrQ29uc2lzdGVuY3kobV9zdGF0ZS5lbGVtZW50KCkpKSB7
Ci0gICAgICAgIGJvb2wgYXBwbHlBdXRob3JTdHlsZXMgPSBtX3N0YXRlLmVsZW1lbnQoKS0+dHJl
ZVNjb3BlKCktPmFwcGx5QXV0aG9yU3R5bGVzKCk7Ci0gICAgICAgIGJvb2wgZG9jdW1lbnRTY29w
ZSA9IHRydWU7Ci0gICAgICAgIHVuc2lnbmVkIHNjb3BlU2l6ZSA9IG1fc2NvcGVSZXNvbHZlci0+
c3RhY2tTaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzY29wZVNpemU7
ICsraSkgewotICAgICAgICAgICAgbV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5jbGVhcigpOwotICAg
ICAgICAgICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRjaGVkUHJv
cGVydGllcy5zaXplKCkgLSAxOwotCi0gICAgICAgICAgICBjb25zdCBTdHlsZVNjb3BlUmVzb2x2
ZXI6OlN0YWNrRnJhbWUmIGZyYW1lID0gbV9zY29wZVJlc29sdmVyLT5zdGFja0ZyYW1lQXQoaSk7
Ci0gICAgICAgICAgICBkb2N1bWVudFNjb3BlID0gZG9jdW1lbnRTY29wZSAmJiAhZnJhbWUubV9z
Y29wZS0+aXNJblNoYWRvd1RyZWUoKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudFNjb3BlKSB7
Ci0gICAgICAgICAgICAgICAgaWYgKCFhcHBseUF1dGhvclN0eWxlcykKLSAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlm
ICghbV9zY29wZVJlc29sdmVyLT5tYXRjaGVzU3R5bGVCb3VuZHMoZnJhbWUpKQotICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWF0Y2hS
ZXF1ZXN0IG1hdGNoUmVxdWVzdChmcmFtZS5tX3J1bGVTZXQsIGluY2x1ZGVFbXB0eVJ1bGVzLCBm
cmFtZS5tX3Njb3BlKTsKLSAgICAgICAgICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQu
cmFuZ2VzLmF1dGhvclJ1bGVSYW5nZSgpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5nUnVs
ZXMobWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgY29sbGVjdE1hdGNoaW5n
UnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotICAgICAgICAgICAgc29y
dEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBtYXRjaEhvc3RSdWxlcyhyZXN1bHQsIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbHNlCi0gICAg
VU5VU0VEX1BBUkFNKHJlc3VsdCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVz
KTsKLSNlbmRpZgotfQotCiBpbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpzdHlsZVNoYXJpbmdD
YW5kaWRhdGVNYXRjaGVzSG9zdFJ1bGVzKCkKIHsKICNpZiBFTkFCTEUoU0hBRE9XX0RPTSkKQEAg
LTU5MCwxOTcgKzM5OSw2IEBAIGlubGluZSBib29sIFN0eWxlUmVzb2x2ZXI6OnN0eWxlU2hhcmlu
Z0MKICNlbmRpZgogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoSG9zdFJ1bGVzKE1hdGNo
UmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpCi17Ci0jaWYgRU5BQkxFKFNI
QURPV19ET00pCi0gICAgQVNTRVJUKG1fc2NvcGVSZXNvbHZlcik7Ci0KLSAgICBtX3N0YXRlLm1h
dGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9
IHJlc3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0gICAgVmVjdG9yPFJ1bGVT
ZXQqPiBtYXRjaGVkUnVsZXM7Ci0gICAgbV9zY29wZVJlc29sdmVyLT5tYXRjaEhvc3RSdWxlcyht
X3N0YXRlLmVsZW1lbnQoKSwgbWF0Y2hlZFJ1bGVzKTsKLSAgICBpZiAobWF0Y2hlZFJ1bGVzLmlz
RW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gbWF0Y2hl
ZFJ1bGVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotICAgICAgICBSdWxlUmFuZ2UgcnVsZVJhbmdl
ID0gcmVzdWx0LnJhbmdlcy5hdXRob3JSdWxlUmFuZ2UoKTsKLSAgICAgICAgY29sbGVjdE1hdGNo
aW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KG1hdGNoZWRSdWxlcy5hdChpLTEpLCBpbmNsdWRlRW1wdHlS
dWxlcywgbV9zdGF0ZS5lbGVtZW50KCkpLCBydWxlUmFuZ2UpOwotICAgIH0KLSAgICBzb3J0QW5k
VHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKHJl
c3VsdCk7Ci0gICAgVU5VU0VEX1BBUkFNKGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSNlbmRpZgotfQot
Ci12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmIHJlc3Vs
dCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygp
LmNsZWFyKCk7Ci0gICAgcmVzdWx0LnJhbmdlcy5sYXN0QXV0aG9yUnVsZSA9IHJlc3VsdC5tYXRj
aGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotCi0gICAgaWYgKCFtX3N0YXRlLmVsZW1lbnQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWF0Y2ggZ2xvYmFsIGF1dGhvciBydWxlcy4KLSAg
ICBNYXRjaFJlcXVlc3QgbWF0Y2hSZXF1ZXN0KG1fcnVsZVNldHMuYXV0aG9yU3R5bGUoKSwgaW5j
bHVkZUVtcHR5UnVsZXMpOwotICAgIFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2Vz
LmF1dGhvclJ1bGVSYW5nZSgpOwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKG1hdGNoUmVxdWVz
dCwgcnVsZVJhbmdlKTsKLSAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlc0ZvclJlZ2lvbihtYXRjaFJl
cXVlc3QsIHJ1bGVSYW5nZSk7Ci0jaWYgRU5BQkxFKFNIQURPV19ET00pCi0gICAgVmVjdG9yPE1h
dGNoUmVxdWVzdD4gbWF0Y2hSZXF1ZXN0czsKLSAgICBtX3J1bGVTZXRzLnNoYWRvd0Rpc3RyaWJ1
dGVkUnVsZXMoKS5jb2xsZWN0TWF0Y2hSZXF1ZXN0cyhpbmNsdWRlRW1wdHlSdWxlcywgbWF0Y2hS
ZXF1ZXN0cyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaFJlcXVlc3RzLnNpemUo
KTsgKytpKQotICAgICAgICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3RzW2ldLCBy
dWxlUmFuZ2UpOwotI2VuZGlmCi0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVz
dWx0KTsKLQotICAgIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMocmVzdWx0LCBpbmNsdWRlRW1wdHlS
dWxlcyk7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6bWF0Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1
bHQmIHJlc3VsdCwgYm9vbCBpbmNsdWRlRW1wdHlSdWxlcykKLXsKLSAgICBpZiAoIW1fcnVsZVNl
dHMudXNlclN0eWxlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3N0YXRlLm1hdGNo
ZWRSdWxlcygpLmNsZWFyKCk7Ci0KLSAgICByZXN1bHQucmFuZ2VzLmxhc3RVc2VyUnVsZSA9IHJl
c3VsdC5tYXRjaGVkUHJvcGVydGllcy5zaXplKCkgLSAxOwotICAgIE1hdGNoUmVxdWVzdCBtYXRj
aFJlcXVlc3QobV9ydWxlU2V0cy51c2VyU3R5bGUoKSwgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAg
IFJ1bGVSYW5nZSBydWxlUmFuZ2UgPSByZXN1bHQucmFuZ2VzLnVzZXJSdWxlUmFuZ2UoKTsKLSAg
ICBjb2xsZWN0TWF0Y2hpbmdSdWxlcyhtYXRjaFJlcXVlc3QsIHJ1bGVSYW5nZSk7Ci0gICAgY29s
bGVjdE1hdGNoaW5nUnVsZXNGb3JSZWdpb24obWF0Y2hSZXF1ZXN0LCBydWxlUmFuZ2UpOwotCi0g
ICAgc29ydEFuZFRyYW5zZmVyTWF0Y2hlZFJ1bGVzKHJlc3VsdCk7Ci19Ci0KLXZvaWQgU3R5bGVS
ZXNvbHZlcjo6bWF0Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVz
KQotewotICAgIG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuY2xlYXIoKTsKLSAgICAKLSAgICByZXN1
bHQucmFuZ2VzLmxhc3RVQVJ1bGUgPSByZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuc2l6ZSgpIC0g
MTsKLSAgICBSdWxlUmFuZ2UgcnVsZVJhbmdlID0gcmVzdWx0LnJhbmdlcy5VQVJ1bGVSYW5nZSgp
OwotICAgIGNvbGxlY3RNYXRjaGluZ1J1bGVzKE1hdGNoUmVxdWVzdChydWxlcyksIHJ1bGVSYW5n
ZSk7Ci0KLSAgICBzb3J0QW5kVHJhbnNmZXJNYXRjaGVkUnVsZXMocmVzdWx0KTsKLX0KLQotdm9p
ZCBTdHlsZVJlc29sdmVyOjpjb2xsZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9y
PFJ1bGVEYXRhPiogcnVsZXMsIGNvbnN0IE1hdGNoUmVxdWVzdCYgbWF0Y2hSZXF1ZXN0LCBSdWxl
UmFuZ2UmIHJ1bGVSYW5nZSkKLXsKLSAgICBpZiAoIXJ1bGVzKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBTdGF0ZSYgc3RhdGUgPSBtX3N0YXRlOwotICAgIC8vIEluIHNvbWUgY2FzZXMgd2UgbWF5
IGVuZCB1cCBsb29raW5nIHVwIHN0eWxlIGZvciByYW5kb20gZWxlbWVudHMgaW4gdGhlIG1pZGRs
ZSBvZiBhIHJlY3Vyc2l2ZSB0cmVlIHJlc29sdmUuCi0gICAgLy8gQW5jZXN0b3IgaWRlbnRpZmll
ciBmaWx0ZXIgd29uJ3QgYmUgdXAtdG8tZGF0ZSBpbiB0aGF0IGNhc2UgYW5kIHdlIGNhbid0IHVz
ZSB0aGUgZmFzdCBwYXRoLgotICAgIGJvb2wgY2FuVXNlRmFzdFJlamVjdCA9IG1fc2VsZWN0b3JG
aWx0ZXIucGFyZW50U3RhY2tJc0NvbnNpc3RlbnQoc3RhdGUucGFyZW50Tm9kZSgpKSAmJiBtYXRj
aFJlcXVlc3QuYmVoYXZpb3JBdEJvdW5kYXJ5ID09IFNlbGVjdG9yQ2hlY2tlcjo6RG9lc05vdENy
b3NzQm91bmRhcnk7Ci0KLSAgICB1bnNpZ25lZCBzaXplID0gcnVsZXMtPnNpemUoKTsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFJ1bGVE
YXRhJiBydWxlRGF0YSA9IHJ1bGVzLT5hdChpKTsKLSAgICAgICAgaWYgKGNhblVzZUZhc3RSZWpl
Y3QgJiYgbV9zZWxlY3RvckZpbHRlci5mYXN0UmVqZWN0U2VsZWN0b3I8UnVsZURhdGE6Om1heGlt
dW1JZGVudGlmaWVyQ291bnQ+KHJ1bGVEYXRhLmRlc2NlbmRhbnRTZWxlY3RvcklkZW50aWZpZXJI
YXNoZXMoKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBTdHlsZVJ1bGUqIHJ1
bGUgPSBydWxlRGF0YS5ydWxlKCk7Ci0gICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbkNv
b2tpZSBjb29raWUgPSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGUoZG9j
dW1lbnQoKSwgcnVsZSwgdGhpcyk7Ci0gICAgICAgIFBzZXVkb0lkIGR5bmFtaWNQc2V1ZG8gPSBO
T1BTRVVETzsKLSAgICAgICAgaWYgKHJ1bGVNYXRjaGVzKHJ1bGVEYXRhLCBtYXRjaFJlcXVlc3Qu
c2NvcGUsIGR5bmFtaWNQc2V1ZG8sIG1hdGNoUmVxdWVzdC5iZWhhdmlvckF0Qm91bmRhcnkpKSB7
Ci0gICAgICAgICAgICAvLyBJZiB0aGUgcnVsZSBoYXMgbm8gcHJvcGVydGllcyB0byBhcHBseSwg
dGhlbiBpZ25vcmUgaXQgaW4gdGhlIG5vbi1kZWJ1ZyBtb2RlLgotICAgICAgICAgICAgY29uc3Qg
U3R5bGVQcm9wZXJ0eVNldCogcHJvcGVydGllcyA9IHJ1bGUtPnByb3BlcnRpZXMoKTsKLSAgICAg
ICAgICAgIGlmICghcHJvcGVydGllcyB8fCAocHJvcGVydGllcy0+aXNFbXB0eSgpICYmICFtYXRj
aFJlcXVlc3QuaW5jbHVkZUVtcHR5UnVsZXMpKSB7Ci0gICAgICAgICAgICAgICAgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCBmYWxzZSk7Ci0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGSVhNRTogRXhw
b3NpbmcgdGhlIG5vbi1zdGFuZGFyZCBnZXRNYXRjaGVkQ1NTUnVsZXMgQVBJIHRvIHdlYiBpcyB0
aGUgb25seSByZWFzb24gdGhpcyBpcyBuZWVkZWQuCi0gICAgICAgICAgICBpZiAoc3RhdGUuaXNT
YW1lT3JpZ2luT25seSgpICYmICFydWxlRGF0YS5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKCkp
IHsKLSAgICAgICAgICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVs
ZShjb29raWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIG1hdGNoaW5nIG5vcm1hbCBydWxlcywgc2V0IGEg
cHNldWRvIGJpdCBpZgotICAgICAgICAgICAgLy8gd2UgcmVhbGx5IGp1c3QgbWF0Y2hlZCBhIHBz
ZXVkby1lbGVtZW50LgotICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1ZG8gIT0gTk9QU0VVRE8g
JiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgPT0gTk9QU0VVRE8pIHsKLSAg
ICAgICAgICAgICAgICBpZiAoc3RhdGUubW9kZSgpID09IFNlbGVjdG9yQ2hlY2tlcjo6Q29sbGVj
dGluZ1J1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bjo6ZGlkTWF0Y2hSdWxlKGNvb2tpZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGR5bmFtaWNQc2V1
ZG8gPCBGSVJTVF9JTlRFUk5BTF9QU0VVRE9JRCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUu
c3R5bGUoKS0+c2V0SGFzUHNldWRvU3R5bGUoZHluYW1pY1BzZXVkbyk7Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgZmlyc3QvbGFzdCBydWxlIGlu
ZGljZXMgaW4gdGhlIG1hdGNoZWQgcnVsZXMgYXJyYXkuCi0gICAgICAgICAgICAgICAgKytydWxl
UmFuZ2UubGFzdFJ1bGVJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAocnVsZVJhbmdlLmZpcnN0
UnVsZUluZGV4ID09IC0xKQotICAgICAgICAgICAgICAgICAgICBydWxlUmFuZ2UuZmlyc3RSdWxl
SW5kZXggPSBydWxlUmFuZ2UubGFzdFJ1bGVJbmRleDsKLQotICAgICAgICAgICAgICAgIC8vIEFk
ZCB0aGlzIHJ1bGUgdG8gb3VyIGxpc3Qgb2YgbWF0Y2hlZCBydWxlcy4KLSAgICAgICAgICAgICAg
ICBtX3N0YXRlLmFkZE1hdGNoZWRSdWxlKCZydWxlRGF0YSk7Ci0gICAgICAgICAgICAgICAgSW5z
cGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRNYXRjaFJ1bGUoY29va2llLCB0cnVlKTsKLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb246OmRpZE1hdGNoUnVsZShjb29raWUsIGZhbHNlKTsKLSAg
ICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlUnVsZXMoY29uc3QgUnVsZURhdGEq
IHIxLCBjb25zdCBSdWxlRGF0YSogcjIpCi17Ci0gICAgdW5zaWduZWQgc3BlY2lmaWNpdHkxID0g
cjEtPnNwZWNpZmljaXR5KCk7Ci0gICAgdW5zaWduZWQgc3BlY2lmaWNpdHkyID0gcjItPnNwZWNp
ZmljaXR5KCk7Ci0gICAgcmV0dXJuIChzcGVjaWZpY2l0eTEgPT0gc3BlY2lmaWNpdHkyKSA/IHIx
LT5wb3NpdGlvbigpIDwgcjItPnBvc2l0aW9uKCkgOiBzcGVjaWZpY2l0eTEgPCBzcGVjaWZpY2l0
eTI7Ci19Ci0KLXZvaWQgU3R5bGVSZXNvbHZlcjo6c29ydE1hdGNoZWRSdWxlcygpCi17Ci0gICAg
c3RkOjpzb3J0KG1fc3RhdGUubWF0Y2hlZFJ1bGVzKCkuYmVnaW4oKSwgbV9zdGF0ZS5tYXRjaGVk
UnVsZXMoKS5lbmQoKSwgY29tcGFyZVJ1bGVzKTsKLX0KLQotdm9pZCBTdHlsZVJlc29sdmVyOjpt
YXRjaEFsbFJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0
aWVzKQotewotICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQpOwotCi0gICAgLy8gTm93IHdlIGNoZWNr
IHVzZXIgc2hlZXQgcnVsZXMuCi0gICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRVc2VyU3R5bGVzKQot
ICAgICAgICBtYXRjaFVzZXJSdWxlcyhyZXN1bHQsIGZhbHNlKTsKLQotICAgIC8vIE5vdyBjaGVj
ayBhdXRob3IgcnVsZXMsIGJlZ2lubmluZyBmaXJzdCB3aXRoIHByZXNlbnRhdGlvbmFsIGF0dHJp
YnV0ZXMgbWFwcGVkIGZyb20gSFRNTC4KLSAgICBpZiAobV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkp
IHsKLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1fc3RhdGUuc3R5
bGVkRWxlbWVudCgpLT5wcmVzZW50YXRpb25BdHRyaWJ1dGVTdHlsZSgpKTsKLQotICAgICAgICAv
LyBOb3cgd2UgY2hlY2sgYWRkaXRpb25hbCBtYXBwZWQgZGVjbGFyYXRpb25zLgotICAgICAgICAv
LyBUYWJsZXMgYW5kIHRhYmxlIGNlbGxzIHNoYXJlIGFuIGFkZGl0aW9uYWwgbWFwcGVkIHJ1bGUg
dGhhdCBtdXN0IGJlIGFwcGxpZWQKLSAgICAgICAgLy8gYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMsIHNp
bmNlIHRoZWlyIG1hcHBlZCBzdHlsZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2YgbXVsdGlwbGUg
YXR0cmlidXRlcy4KLSAgICAgICAgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhyZXN1bHQsIG1f
c3RhdGUuc3R5bGVkRWxlbWVudCgpLT5hZGRpdGlvbmFsUHJlc2VudGF0aW9uQXR0cmlidXRlU3R5
bGUoKSk7Ci0KLSAgICAgICAgaWYgKG1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0hUTUxFbGVt
ZW50KCkpIHsKLSAgICAgICAgICAgIGJvb2wgaXNBdXRvOwotICAgICAgICAgICAgVGV4dERpcmVj
dGlvbiB0ZXh0RGlyZWN0aW9uID0gdG9IVE1MRWxlbWVudChtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSktPmRpcmVjdGlvbmFsaXR5SWZoYXNEaXJBdXRvQXR0cmlidXRlKGlzQXV0byk7Ci0gICAgICAg
ICAgICBpZiAoaXNBdXRvKQotICAgICAgICAgICAgICAgIGFkZE1hdGNoZWRQcm9wZXJ0aWVzKHJl
c3VsdCwgdGV4dERpcmVjdGlvbiA9PSBMVFIgPyBsZWZ0VG9SaWdodERlY2xhcmF0aW9uKCkgOiBy
aWdodFRvTGVmdERlY2xhcmF0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8v
IENoZWNrIHRoZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzIG5leHQuCi0gICAgaWYgKG1fbWF0Y2hB
dXRob3JBbmRVc2VyU3R5bGVzKQotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKHJlc3VsdCwgZmFs
c2UpOwotCi0gICAgLy8gTm93IGNoZWNrIG91ciBpbmxpbmUgc3R5bGUgYXR0cmlidXRlLgotICAg
IGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQo
KSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSkgewotICAgICAgICAv
LyBJbmxpbmUgc3R5bGUgaXMgaW1tdXRhYmxlIGFzIGxvbmcgYXMgdGhlcmUgaXMgbm8gQ1NTT00g
d3JhcHBlci4KLSAgICAgICAgLy8gRklYTUU6IE1lZGlhIGNvbnRyb2wgc2hhZG93IHRyZWVzIHNl
ZW0gdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIGNhY2hpbmcuCi0gICAgICAgIGJvb2wgaXNJbmxpbmVT
dHlsZUNhY2hlYWJsZSA9ICFtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKS0+
aXNNdXRhYmxlKCkgJiYgIW1fc3RhdGUuc3R5bGVkRWxlbWVudCgpLT5pc0luU2hhZG93VHJlZSgp
OwotICAgICAgICAvLyBGSVhNRTogQ29uc3RpZnkuCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVBy
b3BlcnRpZXMocmVzdWx0LCBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aW5saW5lU3R5bGUoKSwg
aXNJbmxpbmVTdHlsZUNhY2hlYWJsZSk7Ci0gICAgfQotCi0jaWYgRU5BQkxFKFNWRykKLSAgICAv
LyBOb3cgY2hlY2sgU01JTCBhbmltYXRpb24gb3ZlcnJpZGUgc3R5bGUuCi0gICAgaWYgKGluY2x1
ZGVTTUlMUHJvcGVydGllcyAmJiBtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcyAmJiBtX3N0YXRl
LnN0eWxlZEVsZW1lbnQoKSAmJiBtX3N0YXRlLnN0eWxlZEVsZW1lbnQoKS0+aXNTVkdFbGVtZW50
KCkpCi0gICAgICAgIGFkZEVsZW1lbnRTdHlsZVByb3BlcnRpZXMocmVzdWx0LCBzdGF0aWNfY2Fz
dDxTVkdFbGVtZW50Kj4obV9zdGF0ZS5zdHlsZWRFbGVtZW50KCkpLT5hbmltYXRlZFNNSUxTdHls
ZVByb3BlcnRpZXMoKSwgZmFsc2UgLyogaXNDYWNoZWFibGUgKi8pOwotI2Vsc2UKLSAgICBVTlVT
RURfUEFSQU0oaW5jbHVkZVNNSUxQcm9wZXJ0aWVzKTsKLSNlbmRpZgotfQotCiBib29sIFN0eWxl
UmVzb2x2ZXI6OmNsYXNzTmFtZXNBZmZlY3RlZEJ5UnVsZXMoY29uc3QgU3BhY2VTcGxpdFN0cmlu
ZyYgY2xhc3NOYW1lcykgY29uc3QKIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2xh
c3NOYW1lcy5zaXplKCk7ICsraSkgewpAQCAtODA4LDkgKzQyNiw4IEBAIGlubGluZSB2b2lkIFN0
eWxlUmVzb2x2ZXI6OmluaXRFbGVtZW50KEUKICAgICB9CiB9CiAKLWlubGluZSB2b2lkIFN0eWxl
UmVzb2x2ZXI6OlN0YXRlOjppbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiBkb2N1bWVudCwg
RWxlbWVudCogZSwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBjb25zdCBQc2V1ZG9TdHlsZVJl
cXVlc3QmIHBzZXVkb1N0eWxlUmVxdWVzdCwgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5n
KQoraW5saW5lIHZvaWQgU3R5bGVSZXNvbHZlcjo6U3RhdGU6OmluaXRGb3JTdHlsZVJlc29sdmUo
RG9jdW1lbnQqIGRvY3VtZW50LCBFbGVtZW50KiBlLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUs
IFJlbmRlclJlZ2lvbiogcmVnaW9uRm9yU3R5bGluZykKIHsKLSAgICBtX3BzZXVkb1N0eWxlUmVx
dWVzdCA9IHBzZXVkb1N0eWxlUmVxdWVzdDsKICAgICBtX3JlZ2lvbkZvclN0eWxpbmcgPSByZWdp
b25Gb3JTdHlsaW5nOwogCiAgICAgaWYgKGUpIHsKQEAgLTgzMiw3ICs0NDksNiBAQCBpbmxpbmUg
dm9pZCBTdHlsZVJlc29sdmVyOjpTdGF0ZTo6aW5pdEZvCiAKICAgICBtX3N0eWxlID0gMDsKICAg
ICBtX3BlbmRpbmdJbWFnZVByb3BlcnRpZXMuY2xlYXIoKTsKLSAgICBtX3J1bGVMaXN0ID0gMDsK
ICAgICBtX2ZvbnREaXJ0eSA9IGZhbHNlOwogfQogCkBAIC05MDAsMTcgKzUxNiw5IEBAIGJvb2wg
U3R5bGVSZXNvbHZlcjo6c3R5bGVTaGFyaW5nQ2FuZGlkYXQKIHsKICAgICBpZiAoIXJ1bGVTZXQp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFy
KCk7CiAKLSAgICBtX3N0YXRlLnNldE1vZGUoU2VsZWN0b3JDaGVja2VyOjpTaGFyaW5nUnVsZXMp
OwotICAgIGludCBmaXJzdFJ1bGVJbmRleCA9IC0xLCBsYXN0UnVsZUluZGV4ID0gLTE7Ci0gICAg
UnVsZVJhbmdlIHJ1bGVSYW5nZShmaXJzdFJ1bGVJbmRleCwgbGFzdFJ1bGVJbmRleCk7Ci0gICAg
Y29sbGVjdE1hdGNoaW5nUnVsZXMoTWF0Y2hSZXF1ZXN0KHJ1bGVTZXQpLCBydWxlUmFuZ2UpOwot
ICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLSAg
ICBpZiAobV9zdGF0ZS5tYXRjaGVkUnVsZXMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICBtX3N0YXRlLm1hdGNoZWRSdWxlcygpLmNsZWFyKCk7Ci0gICAgcmV0dXJuIHRy
dWU7CisgICAgRWxlbWVudFJ1bGVDb2xsZWN0b3IgY29sbGVjdG9yKHRoaXMsIG1fc3RhdGUpOwor
ICAgIHJldHVybiBjb2xsZWN0b3IuaGFzQW55TWF0Y2hpbmdSdWxlcyhydWxlU2V0KTsKIH0KIAog
Ym9vbCBTdHlsZVJlc29sdmVyOjpjYW5TaGFyZVN0eWxlV2l0aENvbnRyb2woU3R5bGVkRWxlbWVu
dCogZWxlbWVudCkgY29uc3QKQEAgLTExNzgsMjYgKzc4Niw2IEBAIFJlbmRlclN0eWxlKiBTdHls
ZVJlc29sdmVyOjpsb2NhdGVTaGFyZWQKICAgICByZXR1cm4gc2hhcmVFbGVtZW50LT5yZW5kZXJT
dHlsZSgpOwogfQogCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoVUFSdWxlcyhNYXRjaFJlc3Vs
dCYgcmVzdWx0KQotewotICAgIE1hdGNoaW5nVUFSdWxlc1Njb3BlIHNjb3BlOwotCi0gICAgLy8g
Rmlyc3Qgd2UgbWF0Y2ggcnVsZXMgZnJvbSB0aGUgdXNlciBhZ2VudCBzaGVldC4KLSAgICBpZiAo
Q1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpzaW1wbGVEZWZhdWx0U3R5bGVTaGVldCkKLSAgICAgICAg
cmVzdWx0LmlzQ2FjaGVhYmxlID0gZmFsc2U7Ci0gICAgUnVsZVNldCogdXNlckFnZW50U3R5bGVT
aGVldCA9IG1fbWVkaXVtLT5tZWRpYVR5cGVNYXRjaFNwZWNpZmljKCJwcmludCIpCi0gICAgICAg
ID8gQ1NTRGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSA6IENTU0RlZmF1bHRT
dHlsZVNoZWV0czo6ZGVmYXVsdFN0eWxlOwotICAgIG1hdGNoVUFSdWxlcyhyZXN1bHQsIHVzZXJB
Z2VudFN0eWxlU2hlZXQpOwotCi0gICAgLy8gSW4gcXVpcmtzIG1vZGUsIHdlIG1hdGNoIHJ1bGVz
IGZyb20gdGhlIHF1aXJrcyB1c2VyIGFnZW50IHNoZWV0LgotICAgIGlmIChkb2N1bWVudCgpLT5p
blF1aXJrc01vZGUoKSkKLSAgICAgICAgbWF0Y2hVQVJ1bGVzKHJlc3VsdCwgQ1NTRGVmYXVsdFN0
eWxlU2hlZXRzOjpkZWZhdWx0UXVpcmtzU3R5bGUpOwotCi0gICAgLy8gSWYgZG9jdW1lbnQgdXNl
cyB2aWV3IHNvdXJjZSBzdHlsZXMgKGluIHZpZXcgc291cmNlIG1vZGUgb3IgaW4geG1sIHZpZXdl
ciBtb2RlKSwgdGhlbiB3ZSBtYXRjaCBydWxlcyBmcm9tIHRoZSB2aWV3IHNvdXJjZSBzdHlsZSBz
aGVldC4KLSAgICBpZiAoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCkpCi0gICAgICAgIG1hdGNo
VUFSdWxlcyhyZXN1bHQsIENTU0RlZmF1bHRTdHlsZVNoZWV0czo6dmlld1NvdXJjZVN0eWxlKCkp
OwotfQotCiBzdGF0aWMgdm9pZCBzZXRTdHlsZXNGb3JQYWdpbmF0aW9uTW9kZShQYWdpbmF0aW9u
OjpNb2RlIHBhZ2luYXRpb25Nb2RlLCBSZW5kZXJTdHlsZSogc3R5bGUpCiB7CiAgICAgaWYgKHBh
Z2luYXRpb25Nb2RlID09IFBhZ2luYXRpb246OlVucGFnaW5hdGVkKQpAQCAtMTM5NSw3ICs5ODMs
NyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVyOjpzCiAKICAgICBTdGF0
ZSYgc3RhdGUgPSBtX3N0YXRlOwogICAgIGluaXRFbGVtZW50KGVsZW1lbnQpOwotICAgIHN0YXRl
LmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwg
Tk9QU0VVRE8sIHJlZ2lvbkZvclN0eWxpbmcpOworICAgIHN0YXRlLmluaXRGb3JTdHlsZVJlc29s
dmUoZG9jdW1lbnQoKSwgZWxlbWVudCwgZGVmYXVsdFBhcmVudCwgcmVnaW9uRm9yU3R5bGluZyk7
CiAgICAgaWYgKHNoYXJpbmdCZWhhdmlvciA9PSBBbGxvd1N0eWxlU2hhcmluZyAmJiAhc3RhdGUu
ZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkpIHsKICAgICAgICAgUmVuZGVyU3R5bGUqIHNo
YXJlZFN0eWxlID0gbG9jYXRlU2hhcmVkU3R5bGUoKTsKICAgICAgICAgaWYgKHNoYXJlZFN0eWxl
KQpAQCAtMTQzNywxMyArMTAyNSwxNiBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJl
c29sdmVyOjpzCiAgICAgaWYgKG5lZWRzQ29sbGVjdGlvbikKICAgICAgICAgbV9ydWxlU2V0cy5j
b2xsZWN0RmVhdHVyZXMoZG9jdW1lbnQoKS0+aXNWaWV3U291cmNlKCksIG1fc2NvcGVSZXNvbHZl
ci5nZXQoKSk7CiAKLSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKKyAgICBFbGVtZW50UnVs
ZUNvbGxlY3RvciBjb2xsZWN0b3IodGhpcywgc3RhdGUpOworICAgIGNvbGxlY3Rvci5zZXRSZWdp
b25Gb3JTdHlsaW5nKHJlZ2lvbkZvclN0eWxpbmcpOworICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0o
bV9tZWRpdW0uZ2V0KCkpOworCiAgICAgaWYgKG1hdGNoaW5nQmVoYXZpb3IgPT0gTWF0Y2hPbmx5
VXNlckFnZW50UnVsZXMpCi0gICAgICAgIG1hdGNoVUFSdWxlcyhtYXRjaFJlc3VsdCk7CisgICAg
ICAgIGNvbGxlY3Rvci5tYXRjaFVBUnVsZXMoKTsKICAgICBlbHNlCi0gICAgICAgIG1hdGNoQWxs
UnVsZXMobWF0Y2hSZXN1bHQsIG1hdGNoaW5nQmVoYXZpb3IgIT0gTWF0Y2hBbGxSdWxlc0V4Y2x1
ZGluZ1NNSUwpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hBbGxSdWxlcyhtX21hdGNoQXV0aG9y
QW5kVXNlclN0eWxlcywgbWF0Y2hpbmdCZWhhdmlvciAhPSBNYXRjaEFsbFJ1bGVzRXhjbHVkaW5n
U01JTCk7CiAKLSAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKG1hdGNoUmVzdWx0LCBlbGVtZW50
KTsKKyAgICBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbGxlY3Rvci5tYXRjaGVkUmVzdWx0KCks
IGVsZW1lbnQpOwogCiAgICAgLy8gQ2xlYW4gdXAgb3VyIHN0eWxlIG9iamVjdCdzIGRpc3BsYXkg
YW5kIHRleHQgZGVjb3JhdGlvbnMgKGFtb25nIG90aGVyIGZpeHVwcykuCiAgICAgYWRqdXN0UmVu
ZGVyU3R5bGUoc3RhdGUuc3R5bGUoKSwgc3RhdGUucGFyZW50U3R5bGUoKSwgZWxlbWVudCk7CkBA
IC0xNDYwLDcgKzEwNTEsNyBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBTdHlsZVJlc29sdmVy
OjpzCiB7CiAgICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwogICAgIGlmIChrZXlmcmFtZS0+cHJvcGVy
dGllcygpKQotICAgICAgICBhZGRNYXRjaGVkUHJvcGVydGllcyhyZXN1bHQsIGtleWZyYW1lLT5w
cm9wZXJ0aWVzKCkpOworICAgICAgICByZXN1bHQuYWRkTWF0Y2hlZFByb3BlcnRpZXMoa2V5ZnJh
bWUtPnByb3BlcnRpZXMoKSk7CiAKICAgICBBU1NFUlQoIW1fc3RhdGUuc3R5bGUoKSk7CiAKQEAg
LTE1ODQsNyArMTE3NSw3IEBAIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFN0eWxlUmVzb2x2ZXI6
OnAKIAogICAgIGluaXRFbGVtZW50KGUpOwogCi0gICAgc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2
ZShkb2N1bWVudCgpLCBlLCBwYXJlbnRTdHlsZSwgcHNldWRvU3R5bGVSZXF1ZXN0KTsKKyAgICBz
dGF0ZS5pbml0Rm9yU3R5bGVSZXNvbHZlKGRvY3VtZW50KCksIGUsIHBhcmVudFN0eWxlKTsKICAg
ICBzdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHlsZTo6Y3JlYXRlKCkpOwogICAgIHN0YXRlLnN0eWxl
KCktPmluaGVyaXRGcm9tKG1fc3RhdGUucGFyZW50U3R5bGUoKSk7CiAKQEAgLTE1OTIsMjAgKzEx
ODMsMjIgQEAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gU3R5bGVSZXNvbHZlcjo6cAogICAgIC8v
IHRob3NlIHJ1bGVzLgogCiAgICAgLy8gQ2hlY2sgVUEsIHVzZXIgYW5kIGF1dGhvciBydWxlcy4K
LSAgICBNYXRjaFJlc3VsdCBtYXRjaFJlc3VsdDsKLSAgICBtYXRjaFVBUnVsZXMobWF0Y2hSZXN1
bHQpOworICAgIEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBzdGF0ZSk7Cisg
ICAgY29sbGVjdG9yLnNldFBzZXVkb1N0eWxlUmVxdWVzdChwc2V1ZG9TdHlsZVJlcXVlc3QpOwor
ICAgIGNvbGxlY3Rvci5zZXRNZWRpdW0obV9tZWRpdW0uZ2V0KCkpOworICAgIGNvbGxlY3Rvci5t
YXRjaFVBUnVsZXMoKTsKIAogICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykgewot
ICAgICAgICBtYXRjaFVzZXJSdWxlcyhtYXRjaFJlc3VsdCwgZmFsc2UpOwotICAgICAgICBtYXRj
aEF1dGhvclJ1bGVzKG1hdGNoUmVzdWx0LCBmYWxzZSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRj
aFVzZXJSdWxlcyhmYWxzZSk7CisgICAgICAgIGNvbGxlY3Rvci5tYXRjaEF1dGhvclJ1bGVzKGZh
bHNlKTsKICAgICB9CiAKLSAgICBpZiAobWF0Y2hSZXN1bHQubWF0Y2hlZFByb3BlcnRpZXMuaXNF
bXB0eSgpKQorICAgIGlmIChjb2xsZWN0b3IubWF0Y2hlZFJlc3VsdCgpLm1hdGNoZWRQcm9wZXJ0
aWVzLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBzdGF0ZS5zdHlsZSgpLT5z
ZXRTdHlsZVR5cGUocHNldWRvU3R5bGVSZXF1ZXN0LnBzZXVkb0lkKTsKIAotICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXMobWF0Y2hSZXN1bHQsIGUpOworICAgIGFwcGx5TWF0Y2hlZFByb3BlcnRp
ZXMoY29sbGVjdG9yLm1hdGNoZWRSZXN1bHQoKSwgZSk7CiAKICAgICAvLyBDbGVhbiB1cCBvdXIg
c3R5bGUgb2JqZWN0J3MgZGlzcGxheSBhbmQgdGV4dCBkZWNvcmF0aW9ucyAoYW1vbmcgb3RoZXIg
Zml4dXBzKS4KICAgICBhZGp1c3RSZW5kZXJTdHlsZShzdGF0ZS5zdHlsZSgpLCBtX3N0YXRlLnBh
cmVudFN0eWxlKCksIDApOwpAQCAtMTYyNiwxNyArMTIxOSwxMiBAQCBQYXNzUmVmUHRyPFJlbmRl
clN0eWxlPiBTdHlsZVJlc29sdmVyOjpzCiAgICAgbV9zdGF0ZS5zZXRTdHlsZShSZW5kZXJTdHls
ZTo6Y3JlYXRlKCkpOwogICAgIG1fc3RhdGUuc3R5bGUoKS0+aW5oZXJpdEZyb20obV9zdGF0ZS5y
b290RWxlbWVudFN0eWxlKCkpOwogCi0gICAgY29uc3QgYm9vbCBpc0xlZnQgPSBpc0xlZnRQYWdl
KHBhZ2VJbmRleCk7Ci0gICAgY29uc3QgYm9vbCBpc0ZpcnN0ID0gaXNGaXJzdFBhZ2UocGFnZUlu
ZGV4KTsKLSAgICBjb25zdCBTdHJpbmcgcGFnZSA9IHBhZ2VOYW1lKHBhZ2VJbmRleCk7Ci0gICAg
Ci0gICAgTWF0Y2hSZXN1bHQgcmVzdWx0OwotICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgQ1NT
RGVmYXVsdFN0eWxlU2hlZXRzOjpkZWZhdWx0UHJpbnRTdHlsZSwgaXNMZWZ0LCBpc0ZpcnN0LCBw
YWdlKTsKLSAgICBtYXRjaFBhZ2VSdWxlcyhyZXN1bHQsIG1fcnVsZVNldHMudXNlclN0eWxlKCks
IGlzTGVmdCwgaXNGaXJzdCwgcGFnZSk7Ci0gICAgLy8gT25seSBjb25zaWRlciB0aGUgZ2xvYmFs
IGF1dGhvciBSdWxlU2V0IGZvciBAcGFnZSBydWxlcywgYXMgcGVyIHRoZSBIVE1MNSBzcGVjLgot
ICAgIG1hdGNoUGFnZVJ1bGVzKHJlc3VsdCwgbV9ydWxlU2V0cy5hdXRob3JTdHlsZSgpLCBpc0xl
ZnQsIGlzRmlyc3QsIHBhZ2UpOworICAgIFBhZ2VSdWxlQ29sbGVjdG9yIGNvbGxlY3RvcihtX3N0
YXRlLCBtX3J1bGVTZXRzKTsKKyAgICBjb2xsZWN0b3IubWF0Y2hBbGxQYWdlUnVsZXMocGFnZUlu
ZGV4KTsKICAgICBtX3N0YXRlLnNldExpbmVIZWlnaHRWYWx1ZSgwKTsKICAgICBib29sIGluaGVy
aXRlZE9ubHkgPSBmYWxzZTsKKworICAgIE1hdGNoUmVzdWx0JiByZXN1bHQgPSBjb2xsZWN0b3Iu
bWF0Y2hlZFJlc3VsdCgpOwogI2lmIEVOQUJMRShDU1NfVkFSSUFCTEVTKQogICAgIGFwcGx5TWF0
Y2hlZFByb3BlcnRpZXM8VmFyaWFibGVEZWZpbml0aW9ucz4ocmVzdWx0LCBmYWxzZSwgMCwgcmVz
dWx0Lm1hdGNoZWRQcm9wZXJ0aWVzLnNpemUoKSAtIDEsIGluaGVyaXRlZE9ubHkpOwogI2VuZGlm
CkBAIC0yMDYyLDg5ICsxNjUwLDMxIEBAIFBhc3NSZWZQdHI8Q1NTUnVsZUxpc3Q+IFN0eWxlUmVz
b2x2ZXI6OnAKICAgICBpZiAoIWUgfHwgIWUtPmRvY3VtZW50KCktPmhhdmVTdHlsZXNoZWV0c0xv
YWRlZCgpKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIG1fc3RhdGUuc2V0TW9kZShTZWxlY3Rv
ckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7Ci0KICAgICBpbml0RWxlbWVudChlKTsKLSAgICBt
X3N0YXRlLmluaXRGb3JTdHlsZVJlc29sdmUoZG9jdW1lbnQoKSwgZSwgMCwgcHNldWRvSWQpOwor
ICAgIG1fc3RhdGUuaW5pdEZvclN0eWxlUmVzb2x2ZShkb2N1bWVudCgpLCBlLCAwKTsKKworICAg
IEVsZW1lbnRSdWxlQ29sbGVjdG9yIGNvbGxlY3Rvcih0aGlzLCBtX3N0YXRlKTsKKyAgICBjb2xs
ZWN0b3Iuc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OkNvbGxlY3RpbmdSdWxlcyk7CisgICAgY29s
bGVjdG9yLnNldFBzZXVkb1N0eWxlUmVxdWVzdChQc2V1ZG9TdHlsZVJlcXVlc3QocHNldWRvSWQp
KTsKKyAgICBjb2xsZWN0b3Iuc2V0TWVkaXVtKG1fbWVkaXVtLmdldCgpKTsKIAotICAgIE1hdGNo
UmVzdWx0IGR1bW15OwogICAgIGlmIChydWxlc1RvSW5jbHVkZSAmIFVBQW5kVXNlckNTU1J1bGVz
KSB7CiAgICAgICAgIC8vIEZpcnN0IHdlIG1hdGNoIHJ1bGVzIGZyb20gdGhlIHVzZXIgYWdlbnQg
c2hlZXQuCi0gICAgICAgIG1hdGNoVUFSdWxlcyhkdW1teSk7Ci0KKyAgICAgICAgY29sbGVjdG9y
Lm1hdGNoVUFSdWxlcygpOworICAgICAgICAKICAgICAgICAgLy8gTm93IHdlIGNoZWNrIHVzZXIg
c2hlZXQgcnVsZXMuCiAgICAgICAgIGlmIChtX21hdGNoQXV0aG9yQW5kVXNlclN0eWxlcykKLSAg
ICAgICAgICAgIG1hdGNoVXNlclJ1bGVzKGR1bW15LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NT
UnVsZXMpOworICAgICAgICAgICAgY29sbGVjdG9yLm1hdGNoVXNlclJ1bGVzKHJ1bGVzVG9JbmNs
dWRlICYgRW1wdHlDU1NSdWxlcyk7CiAgICAgfQogCiAgICAgaWYgKG1fbWF0Y2hBdXRob3JBbmRV
c2VyU3R5bGVzICYmIChydWxlc1RvSW5jbHVkZSAmIEF1dGhvckNTU1J1bGVzKSkgewotICAgICAg
ICBtX3N0YXRlLnNldFNhbWVPcmlnaW5Pbmx5KCEocnVsZXNUb0luY2x1ZGUgJiBDcm9zc09yaWdp
bkNTU1J1bGVzKSk7CisgICAgICAgIGNvbGxlY3Rvci5zZXRTYW1lT3JpZ2luT25seSghKHJ1bGVz
VG9JbmNsdWRlICYgQ3Jvc3NPcmlnaW5DU1NSdWxlcykpOwogCiAgICAgICAgIC8vIENoZWNrIHRo
ZSBydWxlcyBpbiBhdXRob3Igc2hlZXRzLgotICAgICAgICBtYXRjaEF1dGhvclJ1bGVzKGR1bW15
LCBydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwotCi0gICAgICAgIG1fc3RhdGUuc2V0
U2FtZU9yaWdpbk9ubHkoZmFsc2UpOworICAgICAgICBjb2xsZWN0b3IubWF0Y2hBdXRob3JSdWxl
cyhydWxlc1RvSW5jbHVkZSAmIEVtcHR5Q1NTUnVsZXMpOwogICAgIH0KIAotICAgIG1fc3RhdGUu
c2V0TW9kZShTZWxlY3RvckNoZWNrZXI6OlJlc29sdmluZ1N0eWxlKTsKLQotICAgIHJldHVybiBt
X3N0YXRlLnRha2VSdWxlTGlzdCgpOwotfQotCi1pbmxpbmUgYm9vbCBTdHlsZVJlc29sdmVyOjpy
dWxlTWF0Y2hlcyhjb25zdCBSdWxlRGF0YSYgcnVsZURhdGEsIGNvbnN0IENvbnRhaW5lck5vZGUq
IHNjb3BlLCBQc2V1ZG9JZCYgZHluYW1pY1BzZXVkbywgU2VsZWN0b3JDaGVja2VyOjpCZWhhdmlv
ckF0Qm91bmRhcnkgYmVoYXZpb3JBdEJvdW5kYXJ5KQotewotICAgIFN0YXRlJiBzdGF0ZSA9IG1f
c3RhdGU7Ci0KLSAgICBpZiAocnVsZURhdGEuaGFzRmFzdENoZWNrYWJsZVNlbGVjdG9yKCkpIHsK
LSAgICAgICAgLy8gV2Uga25vdyB0aGlzIHNlbGVjdG9yIGRvZXMgbm90IGluY2x1ZGUgYW55IHBz
ZXVkbyBlbGVtZW50cy4KLSAgICAgICAgaWYgKHN0YXRlLnBzZXVkb1N0eWxlUmVxdWVzdCgpLnBz
ZXVkb0lkICE9IE5PUFNFVURPKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAv
LyBXZSBrbm93IGEgc3VmZmljaWVudGx5IHNpbXBsZSBzaW5nbGUgcGFydCBzZWxlY3RvciBtYXRj
aGVzIHNpbXBseSBiZWNhdXNlIHdlIGZvdW5kIGl0IGZyb20gdGhlIHJ1bGUgaGFzaC4KLSAgICAg
ICAgLy8gVGhpcyBpcyBsaW1pdGVkIHRvIEhUTUwgb25seSBzbyB3ZSBkb24ndCBuZWVkIHRvIGNo
ZWNrIHRoZSBuYW1lc3BhY2UuCi0gICAgICAgIGlmIChydWxlRGF0YS5oYXNSaWdodG1vc3RTZWxl
Y3Rvck1hdGNoaW5nSFRNTEJhc2VkT25SdWxlSGFzaCgpICYmIHN0YXRlLmVsZW1lbnQoKS0+aXNI
VE1MRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXJ1bGVEYXRhLmhhc011bHRpcGFydFNl
bGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKHJ1bGVEYXRhLnNlbGVjdG9yKCktPm1fbWF0Y2ggPT0gQ1NTU2VsZWN0b3I6OlRhZyAm
JiAhU2VsZWN0b3JDaGVja2VyOjp0YWdNYXRjaGVzKHN0YXRlLmVsZW1lbnQoKSwgcnVsZURhdGEu
c2VsZWN0b3IoKS0+dGFnUU5hbWUoKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIFNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoIHNlbGVjdG9yQ2hlY2tlckZhc3RQYXRoKHJ1bGVE
YXRhLnNlbGVjdG9yKCksIHN0YXRlLmVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICghc2VsZWN0b3JD
aGVja2VyRmFzdFBhdGgubWF0Y2hlc1JpZ2h0bW9zdEF0dHJpYnV0ZVNlbGVjdG9yKCkpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIHNlbGVjdG9yQ2hlY2tlckZh
c3RQYXRoLm1hdGNoZXMoKTsKLSAgICB9Ci0KLSAgICAvLyBTbG93IHBhdGguCi0gICAgU2VsZWN0
b3JDaGVja2VyIHNlbGVjdG9yQ2hlY2tlcihkb2N1bWVudCgpLCBzdGF0ZS5tb2RlKCkpOwotICAg
IFNlbGVjdG9yQ2hlY2tlcjo6U2VsZWN0b3JDaGVja2luZ0NvbnRleHQgY29udGV4dChydWxlRGF0
YS5zZWxlY3RvcigpLCBzdGF0ZS5lbGVtZW50KCksIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1h
dGNoRW5hYmxlZCk7Ci0gICAgY29udGV4dC5lbGVtZW50U3R5bGUgPSBzdGF0ZS5zdHlsZSgpOwot
ICAgIGNvbnRleHQuc2NvcGUgPSBzY29wZTsKLSAgICBjb250ZXh0LnBzZXVkb0lkID0gc3RhdGUu
cHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQ7Ci0gICAgY29udGV4dC5zY3JvbGxiYXIgPSBz
dGF0ZS5wc2V1ZG9TdHlsZVJlcXVlc3QoKS5zY3JvbGxiYXI7Ci0gICAgY29udGV4dC5zY3JvbGxi
YXJQYXJ0ID0gc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkuc2Nyb2xsYmFyUGFydDsKLSAgICBj
b250ZXh0LmJlaGF2aW9yQXRCb3VuZGFyeSA9IGJlaGF2aW9yQXRCb3VuZGFyeTsKLSAgICBTZWxl
Y3RvckNoZWNrZXI6Ok1hdGNoIG1hdGNoID0gc2VsZWN0b3JDaGVja2VyLm1hdGNoKGNvbnRleHQs
IGR5bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKTsKLSAgICBpZiAo
bWF0Y2ggIT0gU2VsZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICBpZiAoc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0g
Tk9QU0VVRE8gJiYgc3RhdGUucHNldWRvU3R5bGVSZXF1ZXN0KCkucHNldWRvSWQgIT0gZHluYW1p
Y1BzZXVkbykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1i
b29sIFN0eWxlUmVzb2x2ZXI6OmNoZWNrUmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3Iq
IHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50KiByZWdpb25FbGVtZW50KQotewotICAgIGlmICghcmVn
aW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVsZW1lbnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxlY3RvckNoZWNrZXIoZG9jdW1lbnQoKSwgbV9zdGF0ZS5t
b2RlKCkpOwotICAgIGZvciAoY29uc3QgQ1NTU2VsZWN0b3IqIHMgPSByZWdpb25TZWxlY3Rvcjsg
czsgcyA9IENTU1NlbGVjdG9yTGlzdDo6bmV4dChzKSkgewotICAgICAgICBTZWxlY3RvckNoZWNr
ZXI6OlNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0IHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0KHMsIHJl
Z2lvbkVsZW1lbnQsIFNlbGVjdG9yQ2hlY2tlcjo6VmlzaXRlZE1hdGNoRGlzYWJsZWQpOwotICAg
ICAgICBQc2V1ZG9JZCBpZ25vcmVEeW5hbWljUHNldWRvID0gTk9QU0VVRE87Ci0gICAgICAgIGlm
IChzZWxlY3RvckNoZWNrZXIubWF0Y2goc2VsZWN0b3JDaGVja2luZ0NvbnRleHQsIGlnbm9yZUR5
bmFtaWNQc2V1ZG8sIERPTVNpYmxpbmdUcmF2ZXJzYWxTdHJhdGVneSgpKSA9PSBTZWxlY3RvckNo
ZWNrZXI6OlNlbGVjdG9yTWF0Y2hlcykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY29sbGVjdG9yLm1hdGNoZWRSdWxlTGlz
dCgpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNDIzLDg2ICsx
OTUzLDYgQEAgdm9pZCBTdHlsZVJlc29sdmVyOjphcHBseU1hdGNoZWRQcm9wZXJ0aQogICAgIGFk
ZFRvTWF0Y2hlZFByb3BlcnRpZXNDYWNoZShzdGF0ZS5zdHlsZSgpLCBzdGF0ZS5wYXJlbnRTdHls
ZSgpLCBjYWNoZUhhc2gsIG1hdGNoUmVzdWx0KTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGNv
bXBhcmVQYWdlUnVsZXMoY29uc3QgU3R5bGVSdWxlUGFnZSogcjEsIGNvbnN0IFN0eWxlUnVsZVBh
Z2UqIHIyKQotewotICAgIHJldHVybiByMS0+c2VsZWN0b3IoKS0+c3BlY2lmaWNpdHkoKSA8IHIy
LT5zZWxlY3RvcigpLT5zcGVjaWZpY2l0eSgpOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1h
dGNoUGFnZVJ1bGVzKE1hdGNoUmVzdWx0JiByZXN1bHQsIFJ1bGVTZXQqIHJ1bGVzLCBib29sIGlz
TGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0g
ICAgaWYgKCFydWxlcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPFN0eWxlUnVsZVBh
Z2UqPiBtYXRjaGVkUGFnZVJ1bGVzOwotICAgIG1hdGNoUGFnZVJ1bGVzRm9yTGlzdChtYXRjaGVk
UGFnZVJ1bGVzLCBydWxlcy0+cGFnZVJ1bGVzKCksIGlzTGVmdFBhZ2UsIGlzRmlyc3RQYWdlLCBw
YWdlTmFtZSk7Ci0gICAgaWYgKG1hdGNoZWRQYWdlUnVsZXMuaXNFbXB0eSgpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KG1hdGNoZWRQYWdlUnVsZXMuYmVnaW4oKSwg
bWF0Y2hlZFBhZ2VSdWxlcy5lbmQoKSwgY29tcGFyZVBhZ2VSdWxlcyk7Ci0KLSAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgbWF0Y2hlZFBhZ2VSdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAg
YWRkTWF0Y2hlZFByb3BlcnRpZXMocmVzdWx0LCBtYXRjaGVkUGFnZVJ1bGVzW2ldLT5wcm9wZXJ0
aWVzKCkpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1BhZ2VTZWxlY3RvckNvbXBvbmVudHMoY29u
c3QgQ1NTU2VsZWN0b3IqIHNlbGVjdG9yLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBh
Z2UsIGNvbnN0IFN0cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yIChjb25zdCBDU1NTZWxlY3Rv
ciogY29tcG9uZW50ID0gc2VsZWN0b3I7IGNvbXBvbmVudDsgY29tcG9uZW50ID0gY29tcG9uZW50
LT50YWdIaXN0b3J5KCkpIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC0+bV9tYXRjaCA9PSBDU1NT
ZWxlY3Rvcjo6VGFnKSB7Ci0gICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsTmFt
ZSA9IGNvbXBvbmVudC0+dGFnUU5hbWUoKS5sb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChs
b2NhbE5hbWUgIT0gc3RhckF0b20gJiYgbG9jYWxOYW1lICE9IHBhZ2VOYW1lKQotICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENTU1NlbGVjdG9yOjpQ
c2V1ZG9UeXBlIHBzZXVkb1R5cGUgPSBjb21wb25lbnQtPnBzZXVkb1R5cGUoKTsKLSAgICAgICAg
aWYgKChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9MZWZ0UGFnZSAmJiAhaXNMZWZ0
UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENTU1NlbGVjdG9yOjpQc2V1ZG9S
aWdodFBhZ2UgJiYgaXNMZWZ0UGFnZSkKLSAgICAgICAgICAgIHx8IChwc2V1ZG9UeXBlID09IENT
U1NlbGVjdG9yOjpQc2V1ZG9GaXJzdFBhZ2UgJiYgIWlzRmlyc3RQYWdlKSkKLSAgICAgICAgewot
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0
cnVlOwotfQotCi12b2lkIFN0eWxlUmVzb2x2ZXI6Om1hdGNoUGFnZVJ1bGVzRm9yTGlzdChWZWN0
b3I8U3R5bGVSdWxlUGFnZSo+JiBtYXRjaGVkUnVsZXMsIGNvbnN0IFZlY3RvcjxTdHlsZVJ1bGVQ
YWdlKj4mIHJ1bGVzLCBib29sIGlzTGVmdFBhZ2UsIGJvb2wgaXNGaXJzdFBhZ2UsIGNvbnN0IFN0
cmluZyYgcGFnZU5hbWUpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJ1bGVzLnNp
emUoKTsgKytpKSB7Ci0gICAgICAgIFN0eWxlUnVsZVBhZ2UqIHJ1bGUgPSBydWxlc1tpXTsKLQot
ICAgICAgICBpZiAoIWNoZWNrUGFnZVNlbGVjdG9yQ29tcG9uZW50cyhydWxlLT5zZWxlY3Rvcigp
LCBpc0xlZnRQYWdlLCBpc0ZpcnN0UGFnZSwgcGFnZU5hbWUpKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHJ1bGUgaGFzIG5vIHByb3BlcnRpZXMgdG8gYXBwbHks
IHRoZW4gaWdub3JlIGl0LgotICAgICAgICBjb25zdCBTdHlsZVByb3BlcnR5U2V0KiBwcm9wZXJ0
aWVzID0gcnVsZS0+cHJvcGVydGllcygpOwotICAgICAgICBpZiAoIXByb3BlcnRpZXMgfHwgcHJv
cGVydGllcy0+aXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8g
QWRkIHRoaXMgcnVsZSB0byBvdXIgbGlzdCBvZiBtYXRjaGVkIHJ1bGVzLgotICAgICAgICBtYXRj
aGVkUnVsZXMuYXBwZW5kKHJ1bGUpOwotICAgIH0KLX0KLQotYm9vbCBTdHlsZVJlc29sdmVyOjpp
c0xlZnRQYWdlKGludCBwYWdlSW5kZXgpIGNvbnN0Ci17Ci0gICAgYm9vbCBpc0ZpcnN0UGFnZUxl
ZnQgPSBmYWxzZTsKLSAgICBpZiAoIW1fc3RhdGUucm9vdEVsZW1lbnRTdHlsZSgpLT5pc0xlZnRU
b1JpZ2h0RGlyZWN0aW9uKCkpCi0gICAgICAgIGlzRmlyc3RQYWdlTGVmdCA9IHRydWU7Ci0KLSAg
ICByZXR1cm4gKHBhZ2VJbmRleCArIChpc0ZpcnN0UGFnZUxlZnQgPyAxIDogMCkpICUgMjsKLX0K
LQotYm9vbCBTdHlsZVJlc29sdmVyOjppc0ZpcnN0UGFnZShpbnQgcGFnZUluZGV4KSBjb25zdAot
ewotICAgIC8vIEZJWE1FOiBJbiBjYXNlIG9mIGZvcmNlZCBsZWZ0L3JpZ2h0IHBhZ2UsIHBhZ2Ug
YXQgaW5kZXggMSAobm90IDApIGNhbiBiZSB0aGUgZmlyc3QgcGFnZS4KLSAgICByZXR1cm4gKCFw
YWdlSW5kZXgpOwotfQotCi1TdHJpbmcgU3R5bGVSZXNvbHZlcjo6cGFnZU5hbWUoaW50IC8qIHBh
Z2VJbmRleCAqLykgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50IHBhZ2UgaW5kZXgg
dG8gcGFnZSBuYW1lIG1hcHBpbmcuCi0gICAgcmV0dXJuICIiOwotfQotCiB2b2lkIFN0eWxlUmVz
b2x2ZXI6OmFwcGx5UHJvcGVydHlUb1N0eWxlKENTU1Byb3BlcnR5SUQgaWQsIENTU1ZhbHVlKiB2
YWx1ZSwgUmVuZGVyU3R5bGUqIHN0eWxlKQogewogICAgIGluaXRFbGVtZW50KDApOwpJbmRleDog
U291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUmVzb2x2ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCShyZXZpc2lvbiAxNDUzMzgpCisrKyBTb3VyY2Uv
V2ViQ29yZS9jc3MvU3R5bGVSZXNvbHZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3
IEBACiAjaW5jbHVkZSAiU2Nyb2xsVHlwZXMuaCIKICNpbmNsdWRlICJTZWxlY3RvckNoZWNrZXIu
aCIKICNpbmNsdWRlICJTZWxlY3RvckZpbHRlci5oIgorI2luY2x1ZGUgIlNpYmxpbmdUcmF2ZXJz
YWxTdHJhdGVnaWVzLmgiCiAjaW5jbHVkZSAiU3R5bGVJbmhlcml0ZWREYXRhLmgiCiAjaW5jbHVk
ZSAiU3R5bGVTY29wZVJlc29sdmVyLmgiCiAjaW5jbHVkZSAiVmlld3BvcnRTdHlsZVJlc29sdmVy
LmgiCkBAIC0xNTMsMTUgKzE1NCwxMyBAQCBwdWJsaWM6CiAKIGNsYXNzIE1hdGNoUmVxdWVzdCB7
CiBwdWJsaWM6Ci0gICAgTWF0Y2hSZXF1ZXN0KFJ1bGVTZXQqIHJ1bGVTZXQsIGJvb2wgaW5jbHVk
ZUVtcHR5UnVsZXMgPSBmYWxzZSwgY29uc3QgQ29udGFpbmVyTm9kZSogc2NvcGUgPSAwLCBTZWxl
Y3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3VuZGFyeSBiZWhhdmlvckF0Qm91bmRhcnkgPSBTZWxl
Y3RvckNoZWNrZXI6OkRvZXNOb3RDcm9zc0JvdW5kYXJ5KQorICAgIE1hdGNoUmVxdWVzdChSdWxl
U2V0KiBydWxlU2V0LCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzID0gZmFsc2UsIGNvbnN0IENvbnRh
aW5lck5vZGUqIHNjb3BlID0gMCkKICAgICAgICAgOiBydWxlU2V0KHJ1bGVTZXQpCiAgICAgICAg
ICwgaW5jbHVkZUVtcHR5UnVsZXMoaW5jbHVkZUVtcHR5UnVsZXMpCi0gICAgICAgICwgc2NvcGUo
c2NvcGUpCi0gICAgICAgICwgYmVoYXZpb3JBdEJvdW5kYXJ5KGJlaGF2aW9yQXRCb3VuZGFyeSkg
eyB9CisgICAgICAgICwgc2NvcGUoc2NvcGUpIHsgfQogICAgIGNvbnN0IFJ1bGVTZXQqIHJ1bGVT
ZXQ7CiAgICAgY29uc3QgYm9vbCBpbmNsdWRlRW1wdHlSdWxlczsKICAgICBjb25zdCBDb250YWlu
ZXJOb2RlKiBzY29wZTsKLSAgICBjb25zdCBTZWxlY3RvckNoZWNrZXI6OkJlaGF2aW9yQXRCb3Vu
ZGFyeSBiZWhhdmlvckF0Qm91bmRhcnk7CiB9OwogCiAvLyBUaGlzIGNsYXNzIHNlbGVjdHMgYSBS
ZW5kZXJTdHlsZSBmb3IgYSBnaXZlbiBlbGVtZW50IGJhc2VkIG9uIGEgY29sbGVjdGlvbiBvZiBz
dHlsZXNoZWV0cy4KQEAgLTIwNyw2ICsyMDYsNyBAQCBwdWJsaWM6CiAKICAgICBEb2N1bWVudFJ1
bGVTZXRzJiBydWxlU2V0cygpIHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KICAgICBjb25zdCBEb2N1
bWVudFJ1bGVTZXRzJiBydWxlU2V0cygpIGNvbnN0IHsgcmV0dXJuIG1fcnVsZVNldHM7IH0KKyAg
ICBTZWxlY3RvckZpbHRlciYgc2VsZWN0b3JGaWx0ZXIoKSB7IHJldHVybiBtX3NlbGVjdG9yRmls
dGVyOyB9CiAKICNpZiBFTkFCTEUoU1RZTEVfU0NPUEVEKSB8fCBFTkFCTEUoU0hBRE9XX0RPTSkK
ICAgICBTdHlsZVNjb3BlUmVzb2x2ZXIqIGVuc3VyZVNjb3BlUmVzb2x2ZXIoKQpAQCAtMzI1LDEz
ICszMjUsNiBAQCBwdWJsaWM6CiAKICAgICB2b2lkIGxvYWRQZW5kaW5nUmVzb3VyY2VzKCk7CiAK
LXByaXZhdGU6Ci0gICAgLy8gVGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgZGVmYXVsdCBmb250
IHNpemUgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSBjdXJyZW50IGdlbmVyaWMgZm9udCBmYW1pbHkg
aGFzIGNoYW5nZWQuIC1kd2gKLSAgICB2b2lkIGNoZWNrRm9yR2VuZXJpY0ZhbWlseUNoYW5nZShS
ZW5kZXJTdHlsZSosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSk7Ci0gICAgdm9pZCBjaGVja0Zv
clpvb21DaGFuZ2UoUmVuZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOwotCi0g
ICAgdm9pZCBhZGp1c3RSZW5kZXJTdHlsZShSZW5kZXJTdHlsZSogc3R5bGVUb0FkanVzdCwgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlLCBFbGVtZW50Kik7Ci0KICAgICBzdHJ1Y3QgUnVsZVJhbmdl
IHsKICAgICAgICAgUnVsZVJhbmdlKGludCYgZmlyc3RSdWxlSW5kZXgsIGludCYgbGFzdFJ1bGVJ
bmRleCk6IGZpcnN0UnVsZUluZGV4KGZpcnN0UnVsZUluZGV4KSwgbGFzdFJ1bGVJbmRleChsYXN0
UnVsZUluZGV4KSB7IH0KICAgICAgICAgaW50JiBmaXJzdFJ1bGVJbmRleDsKQEAgLTM3MywzMCAr
MzY2LDIxIEBAIHByaXZhdGU6CiAgICAgICAgIFZlY3RvcjxTdHlsZVJ1bGUqLCA2ND4gbWF0Y2hl
ZFJ1bGVzOwogICAgICAgICBNYXRjaFJhbmdlcyByYW5nZXM7CiAgICAgICAgIGJvb2wgaXNDYWNo
ZWFibGU7CisKKyAgICAgICAgdm9pZCBhZGRNYXRjaGVkUHJvcGVydGllcyhjb25zdCBTdHlsZVBy
b3BlcnR5U2V0KiBwcm9wZXJ0aWVzLCBTdHlsZVJ1bGUqID0gMCwgdW5zaWduZWQgbGlua01hdGNo
VHlwZSA9IFNlbGVjdG9yQ2hlY2tlcjo6TWF0Y2hBbGwsIFByb3BlcnR5V2hpdGVsaXN0VHlwZSA9
IFByb3BlcnR5V2hpdGVsaXN0Tm9uZSk7CiAgICAgfTsKIAotICAgIHN0YXRpYyB2b2lkIGFkZE1h
dGNoZWRQcm9wZXJ0aWVzKE1hdGNoUmVzdWx0JiwgY29uc3QgU3R5bGVQcm9wZXJ0eVNldCogcHJv
cGVydGllcywgU3R5bGVSdWxlKiA9IDAsIHVuc2lnbmVkIGxpbmtNYXRjaFR5cGUgPSBTZWxlY3Rv
ckNoZWNrZXI6Ok1hdGNoQWxsLCBQcm9wZXJ0eVdoaXRlbGlzdFR5cGUgPSBQcm9wZXJ0eVdoaXRl
bGlzdE5vbmUpOwotICAgIHZvaWQgYWRkRWxlbWVudFN0eWxlUHJvcGVydGllcyhNYXRjaFJlc3Vs
dCYsIGNvbnN0IFN0eWxlUHJvcGVydHlTZXQqLCBib29sIGlzQ2FjaGVhYmxlID0gdHJ1ZSk7Citw
cml2YXRlOgorICAgIC8vIFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIGRlZmF1bHQgZm9udCBz
aXplIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgY3VycmVudCBnZW5lcmljIGZvbnQgZmFtaWx5IGhh
cyBjaGFuZ2VkLiAtZHdoCisgICAgdm9pZCBjaGVja0ZvckdlbmVyaWNGYW1pbHlDaGFuZ2UoUmVu
ZGVyU3R5bGUqLCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUpOworICAgIHZvaWQgY2hlY2tGb3Ja
b29tQ2hhbmdlKFJlbmRlclN0eWxlKiwgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKTsKIAotICAg
IHZvaWQgbWF0Y2hBbGxSdWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZVNNSUxQcm9wZXJ0
aWVzKTsKLSAgICB2b2lkIG1hdGNoVUFSdWxlcyhNYXRjaFJlc3VsdCYpOwotICAgIHZvaWQgbWF0
Y2hVQVJ1bGVzKE1hdGNoUmVzdWx0JiwgUnVsZVNldCopOwotICAgIHZvaWQgbWF0Y2hBdXRob3JS
dWxlcyhNYXRjaFJlc3VsdCYsIGJvb2wgaW5jbHVkZUVtcHR5UnVsZXMpOwotICAgIHZvaWQgbWF0
Y2hVc2VyUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0eVJ1bGVzKTsKLSAgICB2
b2lkIG1hdGNoU2NvcGVkQXV0aG9yUnVsZXMoTWF0Y2hSZXN1bHQmLCBib29sIGluY2x1ZGVFbXB0
eVJ1bGVzKTsKLSAgICB2b2lkIG1hdGNoSG9zdFJ1bGVzKE1hdGNoUmVzdWx0JiwgYm9vbCBpbmNs
dWRlRW1wdHlSdWxlcyk7Ci0KLSAgICB2b2lkIGNvbGxlY3RNYXRjaGluZ1J1bGVzKGNvbnN0IE1h
dGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOwotICAgIHZvaWQgY29sbGVjdE1hdGNoaW5nUnVsZXNG
b3JSZWdpb24oY29uc3QgTWF0Y2hSZXF1ZXN0JiwgUnVsZVJhbmdlJik7Ci0gICAgdm9pZCBjb2xs
ZWN0TWF0Y2hpbmdSdWxlc0Zvckxpc3QoY29uc3QgVmVjdG9yPFJ1bGVEYXRhPiosIGNvbnN0IE1h
dGNoUmVxdWVzdCYsIFJ1bGVSYW5nZSYpOworICAgIHZvaWQgYWRqdXN0UmVuZGVyU3R5bGUoUmVu
ZGVyU3R5bGUqIHN0eWxlVG9BZGp1c3QsIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSwgRWxlbWVu
dCopOwogCiAgICAgYm9vbCBmYXN0UmVqZWN0U2VsZWN0b3IoY29uc3QgUnVsZURhdGEmKSBjb25z
dDsKLSAgICB2b2lkIHNvcnRNYXRjaGVkUnVsZXMoKTsKLSAgICB2b2lkIHNvcnRBbmRUcmFuc2Zl
ck1hdGNoZWRSdWxlcyhNYXRjaFJlc3VsdCYpOwogCi0gICAgYm9vbCBydWxlTWF0Y2hlcyhjb25z
dCBSdWxlRGF0YSYsIGNvbnN0IENvbnRhaW5lck5vZGUqIHNjb3BlLCBQc2V1ZG9JZCYsIFNlbGVj
dG9yQ2hlY2tlcjo6QmVoYXZpb3JBdEJvdW5kYXJ5ID0gU2VsZWN0b3JDaGVja2VyOjpEb2VzTm90
Q3Jvc3NCb3VuZGFyeSk7Ci0gICAgYm9vbCBjaGVja1JlZ2lvblNlbGVjdG9yKGNvbnN0IENTU1Nl
bGVjdG9yKiByZWdpb25TZWxlY3RvciwgRWxlbWVudCogcmVnaW9uRWxlbWVudCk7CiAgICAgdm9p
ZCBhcHBseU1hdGNoZWRQcm9wZXJ0aWVzKGNvbnN0IE1hdGNoUmVzdWx0JiwgY29uc3QgRWxlbWVu
dCopOworCiAgICAgZW51bSBTdHlsZUFwcGxpY2F0aW9uUGFzcyB7CiAjaWYgRU5BQkxFKENTU19W
QVJJQUJMRVMpCiAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbnMsCkBAIC00NDUsMTIgKzQyOSw5
IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX3BhcmVudFN0eWxlKDApCiAgICAgICAgICwgbV9yb290
RWxlbWVudFN0eWxlKDApCiAgICAgICAgICwgbV9yZWdpb25Gb3JTdHlsaW5nKDApCi0gICAgICAg
ICwgbV9zYW1lT3JpZ2luT25seShmYWxzZSkKLSAgICAgICAgLCBtX3BzZXVkb1N0eWxlUmVxdWVz
dChOT1BTRVVETykKICAgICAgICAgLCBtX2VsZW1lbnRMaW5rU3RhdGUoTm90SW5zaWRlTGluaykK
ICAgICAgICAgLCBtX2Rpc3RyaWJ1dGVkVG9JbnNlcnRpb25Qb2ludChmYWxzZSkKICAgICAgICAg
LCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcyhmYWxzZSkKLSAgICAgICAgLCBtX21vZGUo
U2VsZWN0b3JDaGVja2VyOjpSZXNvbHZpbmdTdHlsZSkKICAgICAgICAgLCBtX2FwcGx5UHJvcGVy
dHlUb1JlZ3VsYXJTdHlsZSh0cnVlKQogICAgICAgICAsIG1fYXBwbHlQcm9wZXJ0eVRvVmlzaXRl
ZExpbmtTdHlsZShmYWxzZSkKICNpZiBFTkFCTEUoQ1NTX1NIQURFUlMpCkBAIC00NjMsNyArNDQ0
LDcgQEAgcHVibGljOgogCiAgICAgcHVibGljOgogICAgICAgICB2b2lkIGluaXRFbGVtZW50KEVs
ZW1lbnQqKTsKLSAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3VtZW50KiwgRWxl
bWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIGNvbnN0IFBzZXVkb1N0eWxlUmVx
dWVzdCYgPSBQc2V1ZG9TdHlsZVJlcXVlc3QoTk9QU0VVRE8pLCBSZW5kZXJSZWdpb24qIHJlZ2lv
bkZvclN0eWxpbmcgPSAwKTsKKyAgICAgICAgdm9pZCBpbml0Rm9yU3R5bGVSZXNvbHZlKERvY3Vt
ZW50KiwgRWxlbWVudCosIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IDAsIFJlbmRlclJlZ2lv
biogcmVnaW9uRm9yU3R5bGluZyA9IDApOwogICAgICAgICB2b2lkIGNsZWFyKCk7CiAKICAgICAg
ICAgRG9jdW1lbnQqIGRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50LT5kb2N1bWVu
dCgpOyB9CkBAIC00NzMsMjUgKzQ1NCwxNyBAQCBwdWJsaWM6CiAgICAgICAgIFJlbmRlclN0eWxl
KiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KICAgICAgICAgUGFzc1Jl
ZlB0cjxSZW5kZXJTdHlsZT4gdGFrZVN0eWxlKCkgeyByZXR1cm4gbV9zdHlsZS5yZWxlYXNlKCk7
IH0KIAotICAgICAgICBTdGF0aWNDU1NSdWxlTGlzdCogZW5zdXJlUnVsZUxpc3QoKTsKLSAgICAg
ICAgUGFzc1JlZlB0cjxDU1NSdWxlTGlzdD4gdGFrZVJ1bGVMaXN0KCkgeyByZXR1cm4gbV9ydWxl
TGlzdC5yZWxlYXNlKCk7IH0KLQogICAgICAgICBjb25zdCBDb250YWluZXJOb2RlKiBwYXJlbnRO
b2RlKCkgY29uc3QgeyByZXR1cm4gbV9wYXJlbnROb2RlOyB9CiAgICAgICAgIHZvaWQgc2V0UGFy
ZW50U3R5bGUoUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlKSB7IG1fcGFyZW50U3R5bGUgPSBwYXJl
bnRTdHlsZTsgfQogICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUoKSBjb25zdCB7IHJl
dHVybiBtX3BhcmVudFN0eWxlOyB9CiAgICAgICAgIFJlbmRlclN0eWxlKiByb290RWxlbWVudFN0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9yb290RWxlbWVudFN0eWxlOyB9CiAKICAgICAgICAgY29u
c3QgUmVuZGVyUmVnaW9uKiByZWdpb25Gb3JTdHlsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZWdp
b25Gb3JTdHlsaW5nOyB9Ci0gICAgICAgIHZvaWQgc2V0U2FtZU9yaWdpbk9ubHkoYm9vbCBpc1Nh
bWVPcmlnaW5Pbmx5KSB7IG1fc2FtZU9yaWdpbk9ubHkgPSBpc1NhbWVPcmlnaW5Pbmx5OyB9Ci0g
ICAgICAgIGJvb2wgaXNTYW1lT3JpZ2luT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fc2FtZU9yaWdp
bk9ubHk7IH0KLSAgICAgICAgY29uc3QgUHNldWRvU3R5bGVSZXF1ZXN0JiBwc2V1ZG9TdHlsZVJl
cXVlc3QoKSBjb25zdCB7IHJldHVybiBtX3BzZXVkb1N0eWxlUmVxdWVzdDsgfQogICAgICAgICBF
SW5zaWRlTGluayBlbGVtZW50TGlua1N0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TGlu
a1N0YXRlOyB9CiAgICAgICAgIGJvb2wgZGlzdHJpYnV0ZWRUb0luc2VydGlvblBvaW50KCkgY29u
c3QgeyByZXR1cm4gbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7IH0KICAgICAgICAgdm9p
ZCBzZXRFbGVtZW50QWZmZWN0ZWRCeUNsYXNzUnVsZXMoYm9vbCBpc0FmZmVjdGVkKSB7IG1fZWxl
bWVudEFmZmVjdGVkQnlDbGFzc1J1bGVzID0gaXNBZmZlY3RlZDsgfQogICAgICAgICBib29sIGVs
ZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudEFmZmVj
dGVkQnlDbGFzc1J1bGVzOyB9Ci0gICAgICAgIHZvaWQgc2V0TW9kZShTZWxlY3RvckNoZWNrZXI6
Ok1vZGUgbW9kZSkgeyBtX21vZGUgPSBtb2RlOyB9Ci0gICAgICAgIFNlbGVjdG9yQ2hlY2tlcjo6
TW9kZSBtb2RlKCkgY29uc3QgeyByZXR1cm4gbV9tb2RlOyB9Ci0gICAgICAgIAorCiAgICAgICAg
IHZvaWQgc2V0QXBwbHlQcm9wZXJ0eVRvUmVndWxhclN0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2Fw
cGx5UHJvcGVydHlUb1JlZ3VsYXJTdHlsZSA9IGlzQXBwbHk7IH0KICAgICAgICAgdm9pZCBzZXRB
cHBseVByb3BlcnR5VG9WaXNpdGVkTGlua1N0eWxlKGJvb2wgaXNBcHBseSkgeyBtX2FwcGx5UHJv
cGVydHlUb1Zpc2l0ZWRMaW5rU3R5bGUgPSBpc0FwcGx5OyB9CiAgICAgICAgIGJvb2wgYXBwbHlQ
cm9wZXJ0eVRvUmVndWxhclN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9hcHBseVByb3BlcnR5VG9S
ZWd1bGFyU3R5bGU7IH0KQEAgLTUyNCw5ICs0OTcsOCBAQCBwdWJsaWM6CiAgICAgICAgIHZvaWQg
c2V0V3JpdGluZ01vZGUoV3JpdGluZ01vZGUgd3JpdGluZ01vZGUpIHsgbV9mb250RGlydHkgfD0g
bV9zdHlsZS0+c2V0V3JpdGluZ01vZGUod3JpdGluZ01vZGUpOyB9CiAgICAgICAgIHZvaWQgc2V0
VGV4dE9yaWVudGF0aW9uKFRleHRPcmllbnRhdGlvbiB0ZXh0T3JpZW50YXRpb24pIHsgbV9mb250
RGlydHkgfD0gbV9zdHlsZS0+c2V0VGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbik7IH0K
IAotICAgICAgICBWZWN0b3I8Y29uc3QgUnVsZURhdGEqLCAzMj4mIG1hdGNoZWRSdWxlcygpIHsg
cmV0dXJuIG1fbWF0Y2hlZFJ1bGVzOyB9Ci0gICAgICAgIHZvaWQgYWRkTWF0Y2hlZFJ1bGUoY29u
c3QgUnVsZURhdGEqIHJ1bGUpIHsgbV9tYXRjaGVkUnVsZXMuYXBwZW5kKHJ1bGUpOyB9Ci0gICAg
ICAgIAorICAgICAgICBib29sIHVzZVNWR1pvb21SdWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZWxl
bWVudCAmJiBtX2VsZW1lbnQtPmlzU1ZHRWxlbWVudCgpOyB9CisKICAgICBwcml2YXRlOgogICAg
ICAgICAvLyBGSVhNRShidWcgMTA4NTYzKTogdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmV2aWV3LCB0
aGVzZSBtZW1iZXIKICAgICAgICAgLy8gdmFyaWFibGVzIGFyZSBwdWJsaWMuIEhvd2V2ZXIgd2Ug
c2hvdWxkIGFkZCBtZXRob2RzIHRvIGFjY2VzcwpAQCAtNTM3LDI0ICs1MDksMTYgQEAgcHVibGlj
OgogICAgICAgICBDb250YWluZXJOb2RlKiBtX3BhcmVudE5vZGU7CiAgICAgICAgIFJlbmRlclN0
eWxlKiBtX3BhcmVudFN0eWxlOwogICAgICAgICBSZW5kZXJTdHlsZSogbV9yb290RWxlbWVudFN0
eWxlOwotICAgICAgICAKLSAgICAgICAgUmVuZGVyUmVnaW9uKiBtX3JlZ2lvbkZvclN0eWxpbmc7
Ci0gICAgICAgIGJvb2wgbV9zYW1lT3JpZ2luT25seTsKLSAgICAgICAgUHNldWRvU3R5bGVSZXF1
ZXN0IG1fcHNldWRvU3R5bGVSZXF1ZXN0OwogCisgICAgICAgIC8vIFJlcXVpcmVkIHRvIEFTU0VS
VCBpbiBhcHBseVByb3BlcnRpZXMuCisgICAgICAgIFJlbmRlclJlZ2lvbiogbV9yZWdpb25Gb3JT
dHlsaW5nOworICAgICAgICAKICAgICAgICAgRUluc2lkZUxpbmsgbV9lbGVtZW50TGlua1N0YXRl
OwogCiAgICAgICAgIGJvb2wgbV9kaXN0cmlidXRlZFRvSW5zZXJ0aW9uUG9pbnQ7CiAKICAgICAg
ICAgYm9vbCBtX2VsZW1lbnRBZmZlY3RlZEJ5Q2xhc3NSdWxlczsKIAotICAgICAgICBTZWxlY3Rv
ckNoZWNrZXI6Ok1vZGUgbV9tb2RlOwotCi0gICAgICAgIC8vIEEgYnVmZmVyIHVzZWQgdG8gaG9s
ZCB0aGUgc2V0IG9mIG1hdGNoZWQgcnVsZXMgZm9yIGFuIGVsZW1lbnQsCi0gICAgICAgIC8vIGFu
ZCBhIHRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgbWVyZ2Ugc29ydGluZy4KLSAgICAgICAgVmVj
dG9yPGNvbnN0IFJ1bGVEYXRhKiwgMzI+IG1fbWF0Y2hlZFJ1bGVzOwotICAgICAgICBSZWZQdHI8
U3RhdGljQ1NTUnVsZUxpc3Q+IG1fcnVsZUxpc3Q7Ci0KICAgICAgICAgYm9vbCBtX2FwcGx5UHJv
cGVydHlUb1JlZ3VsYXJTdHlsZTsKICAgICAgICAgYm9vbCBtX2FwcGx5UHJvcGVydHlUb1Zpc2l0
ZWRMaW5rU3R5bGU7CiAKQEAgLTY5Miw2ICs2NTYsMjEgQEAgaW5saW5lIGJvb2wgU3R5bGVSZXNv
bHZlcjo6aGFzU2VsZWN0b3JGbwogICAgIHJldHVybiBtX3J1bGVTZXRzLmZlYXR1cmVzKCkuaWRz
SW5SdWxlcy5jb250YWlucyhpZFZhbHVlLmltcGwoKSk7CiB9CiAKK2lubGluZSBib29sIGNoZWNr
UmVnaW9uU2VsZWN0b3IoY29uc3QgQ1NTU2VsZWN0b3IqIHJlZ2lvblNlbGVjdG9yLCBFbGVtZW50
KiByZWdpb25FbGVtZW50KQoreworICAgIGlmICghcmVnaW9uU2VsZWN0b3IgfHwgIXJlZ2lvbkVs
ZW1lbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNlbGVjdG9yQ2hlY2tlciBzZWxl
Y3RvckNoZWNrZXIocmVnaW9uRWxlbWVudC0+ZG9jdW1lbnQoKSwgU2VsZWN0b3JDaGVja2VyOjpR
dWVyeWluZ1J1bGVzKTsKKyAgICBmb3IgKGNvbnN0IENTU1NlbGVjdG9yKiBzID0gcmVnaW9uU2Vs
ZWN0b3I7IHM7IHMgPSBDU1NTZWxlY3Rvckxpc3Q6Om5leHQocykpIHsKKyAgICAgICAgU2VsZWN0
b3JDaGVja2VyOjpTZWxlY3RvckNoZWNraW5nQ29udGV4dCBzZWxlY3RvckNoZWNraW5nQ29udGV4
dChzLCByZWdpb25FbGVtZW50LCBTZWxlY3RvckNoZWNrZXI6OlZpc2l0ZWRNYXRjaERpc2FibGVk
KTsKKyAgICAgICAgUHNldWRvSWQgaWdub3JlRHluYW1pY1BzZXVkbyA9IE5PUFNFVURPOworICAg
ICAgICBpZiAoc2VsZWN0b3JDaGVja2VyLm1hdGNoKHNlbGVjdG9yQ2hlY2tpbmdDb250ZXh0LCBp
Z25vcmVEeW5hbWljUHNldWRvLCBET01TaWJsaW5nVHJhdmVyc2FsU3RyYXRlZ3koKSkgPT0gU2Vs
ZWN0b3JDaGVja2VyOjpTZWxlY3Rvck1hdGNoZXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAK
ICNlbmRpZiAvLyBTdHlsZVJlc29sdmVyX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rv
ci9JbnNwZWN0b3JDU1NBZ2VudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAkocmV2aXNpb24gMTQ1MzM4KQorKysgU291cmNl
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtOTU4LDExICs5NTgsMTEgQEAgUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3Rv
clBybwogICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOwogfQogCi12b2lkIEluc3BlY3RvckNT
U0FnZW50Ojp3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSogcnVsZSwgU3R5bGVSZXNvbHZlciogc3R5
bGVSZXNvbHZlcikKK3ZvaWQgSW5zcGVjdG9yQ1NTQWdlbnQ6OndpbGxNYXRjaFJ1bGUoU3R5bGVS
dWxlKiBydWxlLCBJbnNwZWN0b3JDU1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJz
LCBEb2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbikKIHsK
IC8vICAgIHByaW50ZigiSW5zcGVjdG9yQ1NTQWdlbnQ6OndpbGxNYXRjaFJ1bGUgJXNcbiIsIHJ1
bGUtPnNlbGVjdG9yTGlzdCgpLnNlbGVjdG9yc1RleHQoKS51dGY4KCkuZGF0YSgpKTsKICAgICBp
ZiAobV9jdXJyZW50U2VsZWN0b3JQcm9maWxlKQotICAgICAgICBtX2N1cnJlbnRTZWxlY3RvclBy
b2ZpbGUtPnN0YXJ0U2VsZWN0b3Ioc3R5bGVSZXNvbHZlci0+aW5zcGVjdG9yQ1NTT01XcmFwcGVy
cygpLmdldFdyYXBwZXJGb3JSdWxlSW5TaGVldHMocnVsZSwgc3R5bGVSZXNvbHZlci0+ZG9jdW1l
bnQoKS0+c3R5bGVTaGVldENvbGxlY3Rpb24oKSkpOworICAgICAgICBtX2N1cnJlbnRTZWxlY3Rv
clByb2ZpbGUtPnN0YXJ0U2VsZWN0b3IoaW5zcGVjdG9yQ1NTT01XcmFwcGVycy5nZXRXcmFwcGVy
Rm9yUnVsZUluU2hlZXRzKHJ1bGUsIHN0eWxlU2hlZXRDb2xsZWN0aW9uKSk7CiB9CiAKIHZvaWQg
SW5zcGVjdG9yQ1NTQWdlbnQ6OmRpZE1hdGNoUnVsZShib29sIG1hdGNoZWQpCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ1NTQWdlbnQuaAkocmV2aXNpb24gMTQ1
MzM4KQorKysgU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNTU0FnZW50LmgJKHdv
cmtpbmcgY29weSkKQEAgLTQ3LDcgKzQ3LDkgQEAgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbjsK
IGNsYXNzIENTU1N0eWxlUnVsZTsKIGNsYXNzIENTU1N0eWxlU2hlZXQ7CiBjbGFzcyBEb2N1bWVu
dDsKK2NsYXNzIERvY3VtZW50U3R5bGVTaGVldENvbGxlY3Rpb247CiBjbGFzcyBFbGVtZW50Owor
Y2xhc3MgSW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKIGNsYXNzIEluc3BlY3RvckZyb250ZW5kOwog
Y2xhc3MgSW5zdHJ1bWVudGluZ0FnZW50czsKIGNsYXNzIE5hbWVOb2RlTWFwOwpAQCAtMTI1LDcg
KzEyNyw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgc3RvcFNlbGVjdG9yUHJvZmlsZXIo
RXJyb3JTdHJpbmcqLCBSZWZQdHI8VHlwZUJ1aWxkZXI6OkNTUzo6U2VsZWN0b3JQcm9maWxlPiYp
OwogCiAgICAgUGFzc1JlZlB0cjxUeXBlQnVpbGRlcjo6Q1NTOjpTZWxlY3RvclByb2ZpbGU+IHN0
b3BTZWxlY3RvclByb2ZpbGVySW1wbChFcnJvclN0cmluZyosIGJvb2wgbmVlZFByb2ZpbGUpOwot
ICAgIHZvaWQgd2lsbE1hdGNoUnVsZShTdHlsZVJ1bGUqLCBTdHlsZVJlc29sdmVyKik7CisgICAg
dm9pZCB3aWxsTWF0Y2hSdWxlKFN0eWxlUnVsZSosIEluc3BlY3RvckNTU09NV3JhcHBlcnMmLCBE
b2N1bWVudFN0eWxlU2hlZXRDb2xsZWN0aW9uKik7CiAgICAgdm9pZCBkaWRNYXRjaFJ1bGUoYm9v
bCk7CiAgICAgdm9pZCB3aWxsUHJvY2Vzc1J1bGUoU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciop
OwogICAgIHZvaWQgZGlkUHJvY2Vzc1J1bGUoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JJbnN0cnVtZW50YXRpb24uY3BwCShyZXZpc2lvbiAx
NDUzMzgpCisrKyBTb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9ySW5zdHJ1bWVudGF0
aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTkwLDExICs1OTAsMTEgQEAgdm9pZCBJbnNwZWN0
b3JJbnN0cnVtZW50YXRpb246OmRpZFNjaGVkdQogICAgICAgICByZXNvdXJjZUFnZW50LT5kaWRT
Y2hlZHVsZVN0eWxlUmVjYWxjdWxhdGlvbihkb2N1bWVudCk7CiB9CiAKLUluc3BlY3Rvckluc3Ry
dW1lbnRhdGlvbkNvb2tpZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJ
bXBsKEluc3RydW1lbnRpbmdBZ2VudHMqIGluc3RydW1lbnRpbmdBZ2VudHMsIFN0eWxlUnVsZSog
cnVsZSwgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlcikKK0luc3BlY3Rvckluc3RydW1lbnRh
dGlvbkNvb2tpZSBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxNYXRjaFJ1bGVJbXBsKElu
c3RydW1lbnRpbmdBZ2VudHMqIGluc3RydW1lbnRpbmdBZ2VudHMsIFN0eWxlUnVsZSogcnVsZSwg
SW5zcGVjdG9yQ1NTT01XcmFwcGVycyYgaW5zcGVjdG9yQ1NTT01XcmFwcGVycywgRG9jdW1lbnRT
dHlsZVNoZWV0Q29sbGVjdGlvbiogc2hlZXRDb2xsZWN0aW9uKQogewogICAgIEluc3BlY3RvckNT
U0FnZW50KiBjc3NBZ2VudCA9IGluc3RydW1lbnRpbmdBZ2VudHMtPmluc3BlY3RvckNTU0FnZW50
KCk7CiAgICAgaWYgKGNzc0FnZW50KSB7Ci0gICAgICAgIGNzc0FnZW50LT53aWxsTWF0Y2hSdWxl
KHJ1bGUsIHN0eWxlUmVzb2x2ZXIpOworICAgICAgICBjc3NBZ2VudC0+d2lsbE1hdGNoUnVsZShy
dWxlLCBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBzaGVldENvbGxlY3Rpb24pOwogICAgICAgICBy
ZXR1cm4gSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llKGluc3RydW1lbnRpbmdBZ2VudHMs
IDEpOwogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvcklu
c3RydW1lbnRhdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JJbnN0cnVtZW50YXRpb24uaAkocmV2aXNpb24gMTQ1MzM4KQorKysgU291cmNlL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rvckluc3RydW1lbnRhdGlvbi5oCSh3b3JraW5nIGNvcHkp
CkBAIC02MSwxMCArNjEsMTIgQEAgY2xhc3MgRG9jdW1lbnQ7CiBjbGFzcyBFbGVtZW50OwogY2xh
c3MgRXZlbnRDb250ZXh0OwogY2xhc3MgRG9jdW1lbnRMb2FkZXI7CitjbGFzcyBEb2N1bWVudFN0
eWxlU2hlZXRDb2xsZWN0aW9uOwogY2xhc3MgRGV2aWNlT3JpZW50YXRpb25EYXRhOwogY2xhc3Mg
R2VvbG9jYXRpb25Qb3NpdGlvbjsKIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKIGNsYXNzIEluc3Bl
Y3RvckNTU0FnZW50OworY2xhc3MgSW5zcGVjdG9yQ1NTT01XcmFwcGVyczsKIGNsYXNzIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbjsKIGNsYXNzIEluc3BlY3RvclRpbWVsaW5lQWdlbnQ7CiBjbGFz
cyBJbnN0cnVtZW50aW5nQWdlbnRzOwpAQCAtMTc0LDcgKzE3Niw3IEBAIHB1YmxpYzoKICAgICBz
dGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIHdpbGxSZWNhbGN1bGF0ZVN0eWxl
KERvY3VtZW50Kik7CiAgICAgc3RhdGljIHZvaWQgZGlkUmVjYWxjdWxhdGVTdHlsZShjb25zdCBJ
bnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmKTsKICAgICBzdGF0aWMgdm9pZCBkaWRTY2hl
ZHVsZVN0eWxlUmVjYWxjdWxhdGlvbihEb2N1bWVudCopOwotICAgIHN0YXRpYyBJbnNwZWN0b3JJ
bnN0cnVtZW50YXRpb25Db29raWUgd2lsbE1hdGNoUnVsZShEb2N1bWVudCosIFN0eWxlUnVsZSos
IFN0eWxlUmVzb2x2ZXIqKTsKKyAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llIHdpbGxNYXRjaFJ1bGUoRG9jdW1lbnQqLCBTdHlsZVJ1bGUqLCBJbnNwZWN0b3JDU1NPTVdy
YXBwZXJzJiwgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiopOwogICAgIHN0YXRpYyB2b2lk
IGRpZE1hdGNoUnVsZShjb25zdCBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUmLCBib29s
IG1hdGNoZWQpOwogICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgd2ls
bFByb2Nlc3NSdWxlKERvY3VtZW50KiwgU3R5bGVSdWxlKiwgU3R5bGVSZXNvbHZlciopOwogICAg
IHN0YXRpYyB2b2lkIGRpZFByb2Nlc3NSdWxlKGNvbnN0IEluc3BlY3Rvckluc3RydW1lbnRhdGlv
bkNvb2tpZSYpOwpAQCAtMzc1LDcgKzM3Nyw3IEBAIHByaXZhdGU6CiAgICAgc3RhdGljIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbkNvb2tpZSB3aWxsUmVjYWxjdWxhdGVTdHlsZUltcGwoSW5zdHJ1
bWVudGluZ0FnZW50cyosIEZyYW1lKik7CiAgICAgc3RhdGljIHZvaWQgZGlkUmVjYWxjdWxhdGVT
dHlsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJik7CiAgICAgc3Rh
dGljIHZvaWQgZGlkU2NoZWR1bGVTdHlsZVJlY2FsY3VsYXRpb25JbXBsKEluc3RydW1lbnRpbmdB
Z2VudHMqLCBEb2N1bWVudCopOwotICAgIHN0YXRpYyBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb25D
b29raWUgd2lsbE1hdGNoUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyosIFN0eWxlUnVsZSos
IFN0eWxlUmVzb2x2ZXIqKTsKKyAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29v
a2llIHdpbGxNYXRjaFJ1bGVJbXBsKEluc3RydW1lbnRpbmdBZ2VudHMqLCBTdHlsZVJ1bGUqLCBJ
bnNwZWN0b3JDU1NPTVdyYXBwZXJzJiwgRG9jdW1lbnRTdHlsZVNoZWV0Q29sbGVjdGlvbiopOwog
ICAgIHN0YXRpYyB2b2lkIGRpZE1hdGNoUnVsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVu
dGF0aW9uQ29va2llJiwgYm9vbCBtYXRjaGVkKTsKICAgICBzdGF0aWMgSW5zcGVjdG9ySW5zdHJ1
bWVudGF0aW9uQ29va2llIHdpbGxQcm9jZXNzUnVsZUltcGwoSW5zdHJ1bWVudGluZ0FnZW50cyos
IFN0eWxlUnVsZSosIFN0eWxlUmVzb2x2ZXIqKTsKICAgICBzdGF0aWMgdm9pZCBkaWRQcm9jZXNz
UnVsZUltcGwoY29uc3QgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llJik7CkBAIC0xMTc4
LDE2ICsxMTgwLDE3IEBAIGlubGluZSB2b2lkIEluc3BlY3Rvckluc3RydW1lbnRhdGlvbjo6ZGkK
ICNlbmRpZgogfQogCi1pbmxpbmUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uQ29va2llIEluc3Bl
Y3Rvckluc3RydW1lbnRhdGlvbjo6d2lsbE1hdGNoUnVsZShEb2N1bWVudCogZG9jdW1lbnQsIFN0
eWxlUnVsZSogcnVsZSwgU3R5bGVSZXNvbHZlciogc3R5bGVSZXNvbHZlcikKK2lubGluZSBJbnNw
ZWN0b3JJbnN0cnVtZW50YXRpb25Db29raWUgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxs
TWF0Y2hSdWxlKERvY3VtZW50KiBkb2N1bWVudCwgU3R5bGVSdWxlKiBydWxlLCBJbnNwZWN0b3JD
U1NPTVdyYXBwZXJzJiBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBEb2N1bWVudFN0eWxlU2hlZXRD
b2xsZWN0aW9uKiBzdHlsZVNoZWV0Q29sbGVjdGlvbikKIHsKICNpZiBFTkFCTEUoSU5TUEVDVE9S
KQogICAgIEZBU1RfUkVUVVJOX0lGX05PX0ZST05URU5EUyhJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUoKSk7CiAgICAgaWYgKEluc3RydW1lbnRpbmdBZ2VudHMqIGluc3RydW1lbnRpbmdB
Z2VudHMgPSBpbnN0cnVtZW50aW5nQWdlbnRzRm9yRG9jdW1lbnQoZG9jdW1lbnQpKQotICAgICAg
ICByZXR1cm4gd2lsbE1hdGNoUnVsZUltcGwoaW5zdHJ1bWVudGluZ0FnZW50cywgcnVsZSwgc3R5
bGVSZXNvbHZlcik7CisgICAgICAgIHJldHVybiB3aWxsTWF0Y2hSdWxlSW1wbChpbnN0cnVtZW50
aW5nQWdlbnRzLCBydWxlLCBpbnNwZWN0b3JDU1NPTVdyYXBwZXJzLCBzdHlsZVNoZWV0Q29sbGVj
dGlvbik7CiAjZWxzZQogICAgIFVOVVNFRF9QQVJBTShkb2N1bWVudCk7CiAgICAgVU5VU0VEX1BB
UkFNKHJ1bGUpOwotICAgIFVOVVNFRF9QQVJBTShzdHlsZVJlc29sdmVyKTsKKyAgICBVTlVTRURf
UEFSQU0oaW5zcGVjdG9yQ1NTT01XcmFwcGVycyk7CisgICAgVU5VU0VEX1BBUkFNKHN0eWxlU2hl
ZXRDb2xsZWN0aW9uKTsKICNlbmRpZgogICAgIHJldHVybiBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b25Db29raWUoKTsKIH0K
</data>

          </attachment>
      

    </bug>

</bugzilla>